From 48e51ee911d2f40f633a7679dc8a90ed9bd30715 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Wed, 27 Apr 2022 21:32:46 +0200 Subject: [PATCH 01/78] Latest changes --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 50cabd399..5e5a5e02a 100755 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ Download today, track your brews, change your recipes, to get the best tasting c - English: [Home-Barista](https://www.home-barista.com/knockbox/beanconqueror-app-t68236.html) - Dutch [tweakers](https://gathering.tweakers.net/forum/list_messages/1635607/44) [koffiepraat](https://www.koffiepraat.nl/forum/viewtopic.php?t=9842 ) - Greek: [greekespresso](https://www.greekespresso.gr/forum/viewtopic.php?f=4&t=7251&p=97854&hilit=beanconqueror#p97854) +- Turkish: [kahvekulubu](https://www.kahvekulubu.net/sosyal/threads/kahve-loglama-kayit-oneri-yontem-metodoloji.3483/) ## Rankings From a61080bf35b33ffe9bd4f5398c931de7b385c53f Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 1 May 2022 18:49:29 +0200 Subject: [PATCH 02/78] #356 - Idle timer issues (and file extension :O) --- config.xml | 2 +- src/services/uiImage.ts | 33 +++++++++++++++++++++++++++------ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/config.xml b/config.xml index 8c9b856d8..6468e49a8 100644 --- a/config.xml +++ b/config.xml @@ -1,5 +1,5 @@ - + Beanconqueror Lars Saalbach diff --git a/src/services/uiImage.ts b/src/services/uiImage.ts index b1cbd600b..6b9c35093 100755 --- a/src/services/uiImage.ts +++ b/src/services/uiImage.ts @@ -69,7 +69,7 @@ export class UIImage { (imageData) => { const imageStr: string = `data:image/jpeg;base64,${imageData}`; - this.uiFileHelper.saveBase64File('beanconqueror_image', '.png', imageStr).then((_newURL) => { + this.uiFileHelper.saveBase64File('beanconqueror_image', '.jpg', imageStr).then((_newURL) => { // const filePath = _newURL.replace(/^file:\/\//, ''); resolve(_newURL); this.__cleanupCamera(); @@ -125,14 +125,14 @@ export class UIImage { disable_popover: true, quality: this.getImageQuality() }).then(async (results) => { - this.uiAlert.showLoadingSpinner(); + await this.uiAlert.showLoadingSpinner(); for (const result of results) { if (result && result.length > 0 && result !== 0 && result !== '' && result !== 'OK' && result.length > 5) { try { const imageStr: string = `data:image/jpeg;base64,${result}`; - await this.uiFileHelper.saveBase64File('beanconqueror_image', '.png', imageStr).then((_newURL) => { + await this.uiFileHelper.saveBase64File('beanconqueror_image', '.jpg', imageStr).then((_newURL) => { fileurls.push(_newURL); }, () => { }); @@ -145,7 +145,10 @@ export class UIImage { } } - this.uiAlert.hideLoadingSpinner(); + setTimeout(() => { + this.uiAlert.hideLoadingSpinner(); + },50); + this.__cleanupCamera(); if (fileurls.length > 0) { resolve(fileurls); @@ -154,12 +157,15 @@ export class UIImage { } }, (err) => { + setTimeout(() => { + this.uiAlert.hideLoadingSpinner(); + },50); reject(err); }); } } else { chooser.getFile().then(async (_files) => { - this.uiAlert.showLoadingSpinner(); + await this.uiAlert.showLoadingSpinner(); for (const file of _files) { try { @@ -186,20 +192,32 @@ export class UIImage { } }, (_error) => { + setTimeout(() => { + this.uiAlert.hideLoadingSpinner(); + },50); reject(_error); }); } catch (ex) { + setTimeout(() => { + this.uiAlert.hideLoadingSpinner(); + },50); reject(ex); } } + setTimeout(() => { + this.uiAlert.hideLoadingSpinner(); + },50); this.__cleanupCamera(); - this.uiAlert.hideLoadingSpinner(); + if (fileurls.length > 0) { resolve(fileurls); } else { reject('We found no file urls'); } },(_err)=> { + setTimeout(() => { + this.uiAlert.hideLoadingSpinner(); + },50); reject(_err); }); @@ -207,6 +225,9 @@ export class UIImage { }); }, (_err) => { + setTimeout(() => { + this.uiAlert.hideLoadingSpinner(); + },50); reject(_err); } ); From 4283db8678b5843100bf11cbce5bb47b61cf6ae7 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Tue, 3 May 2022 22:44:28 +0200 Subject: [PATCH 03/78] #357 - Fixing filter for beans when QR-Code information are null --- src/app/beans/beans.page.html | 9 +++++---- src/app/beans/beans.page.ts | 10 +++++----- .../custom-ion-icons/beanconqueror-qr-code-button.svg | 7 +++++++ src/environments/environment.ts | 2 +- 4 files changed, 18 insertions(+), 10 deletions(-) create mode 100644 src/assets/custom-ion-icons/beanconqueror-qr-code-button.svg diff --git a/src/app/beans/beans.page.html b/src/app/beans/beans.page.html index dc41da55b..b76f3fc1a 100644 --- a/src/app/beans/beans.page.html +++ b/src/app/beans/beans.page.html @@ -4,12 +4,13 @@ - - + + - + + {{"NAV_BEANS" | translate}} diff --git a/src/app/beans/beans.page.ts b/src/app/beans/beans.page.ts index 45cd494ca..2f2069f25 100644 --- a/src/app/beans/beans.page.ts +++ b/src/app/beans/beans.page.ts @@ -378,10 +378,10 @@ export class BeansPage implements OnInit { } if (searchText) { - filterBeans = filterBeans.filter((e) => e.note.toLowerCase().includes(searchText) || - e.name.toLowerCase().includes(searchText) || - e.roaster.toLowerCase().includes(searchText) || - e.aromatics.toLowerCase().includes(searchText)); + filterBeans = filterBeans.filter((e) => e.note?.toLowerCase().includes(searchText) || + e.name?.toLowerCase().includes(searchText) || + e.roaster?.toLowerCase().includes(searchText) || + e.aromatics?.toLowerCase().includes(searchText)); } if (isOpen) { this.openBeans = filterBeans; @@ -447,7 +447,7 @@ export class BeansPage implements OnInit { },() => {}); } else { // Test sample for development - // await this.intenthandler.handleQRCodeLink('https://beanconqueror.com/?qr=f62fa1e9'); + await this.intenthandler.handleQRCodeLink('https://beanconqueror.com/?qr=7b761a95'); } this.loadBeans(); return; diff --git a/src/assets/custom-ion-icons/beanconqueror-qr-code-button.svg b/src/assets/custom-ion-icons/beanconqueror-qr-code-button.svg new file mode 100644 index 000000000..98f4186f2 --- /dev/null +++ b/src/assets/custom-ion-icons/beanconqueror-qr-code-button.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 87d817316..ab3ec9bb0 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -4,7 +4,7 @@ export const environment = { production: false, - API_URL: 'https://localhost:5001/' + API_URL: 'https://backend.beanconqueror.com/' }; /* From e9b350987483f879e9857bef415ad6b4312fd297 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 8 May 2022 21:28:10 +0200 Subject: [PATCH 04/78] #358 - Refresh data of qr-code start --- .../bean-popover-actions.component.html | 4 ++++ .../custom-ion-icons/beanconqueror-refresh-barcode.svg | 6 ++++++ src/enums/beans/beanAction.ts | 3 ++- src/services/intentHandler/intent-handler.service.ts | 2 +- 4 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 src/assets/custom-ion-icons/beanconqueror-refresh-barcode.svg diff --git a/src/app/beans/bean-popover-actions/bean-popover-actions.component.html b/src/app/beans/bean-popover-actions/bean-popover-actions.component.html index f989305d1..1c89fbccf 100644 --- a/src/app/beans/bean-popover-actions/bean-popover-actions.component.html +++ b/src/app/beans/bean-popover-actions/bean-popover-actions.component.html @@ -14,6 +14,10 @@ {{"EDIT" | translate}} + + + {{"EDIT" | translate}} + diff --git a/src/assets/custom-ion-icons/beanconqueror-refresh-barcode.svg b/src/assets/custom-ion-icons/beanconqueror-refresh-barcode.svg new file mode 100644 index 000000000..2310041d2 --- /dev/null +++ b/src/assets/custom-ion-icons/beanconqueror-refresh-barcode.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/enums/beans/beanAction.ts b/src/enums/beans/beanAction.ts index ea514de1f..1b7bb71ee 100755 --- a/src/enums/beans/beanAction.ts +++ b/src/enums/beans/beanAction.ts @@ -7,5 +7,6 @@ export enum BEAN_ACTION { BEANS_CONSUMED = 'BEANS_CONSUMED', PHOTO_GALLERY = 'PHOTO_GALLERY', TOGGLE_FAVOURITE = 'TOGGLE_FAVOURITE', - SHARE = 'SHARE' + SHARE = 'SHARE', + REFRESH_DATA = 'REFRESH_DATA' } diff --git a/src/services/intentHandler/intent-handler.service.ts b/src/services/intentHandler/intent-handler.service.ts index 330d13017..87def3e43 100644 --- a/src/services/intentHandler/intent-handler.service.ts +++ b/src/services/intentHandler/intent-handler.service.ts @@ -82,7 +82,7 @@ export class IntentHandlerService { this.uiLog.log('Handle deeplink: ' + url); if (url.indexOf('https://beanconqueror.com/?qr=') === 0 || url.indexOf('https://beanconqueror.com?qr=') === 0) { - const qrCodeId: string = String(this.findGetParameter(_matchLink.queryString,'id')); + const qrCodeId: string = String(this.findGetParameter(_matchLink.queryString,'qr')); await this.addBeanFromServer(qrCodeId); } else if (url.indexOf('beanconqueror://ADD_BEAN_ONLINE?') === 0) { const qrCodeId: string = String(this.findGetParameter(_matchLink.queryString,'id')); From 4314c6549c91573b7ff599578d0d4135e39cdb68 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 15 May 2022 20:27:19 +0200 Subject: [PATCH 05/78] Refresh information from qr code --- package.json | 2 +- .../bean-popover-actions.component.html | 4 +- src/app/beans/beans.page.ts | 2 +- src/assets/i18n/de.json | 5 +- src/assets/i18n/en.json | 5 +- src/assets/i18n/es.json | 5 +- .../bean-information.component.ts | 50 ++++++++++++++++++- src/data/tracking/qrTracking.ts | 1 + src/enums/beans/beanAction.ts | 2 +- src/services/uiImage.ts | 6 +-- 10 files changed, 70 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index edeae6a79..6d34a7cda 100644 --- a/package.json +++ b/package.json @@ -229,4 +229,4 @@ "android", "ios" ] -} \ No newline at end of file +} diff --git a/src/app/beans/bean-popover-actions/bean-popover-actions.component.html b/src/app/beans/bean-popover-actions/bean-popover-actions.component.html index 1c89fbccf..31c965c07 100644 --- a/src/app/beans/bean-popover-actions/bean-popover-actions.component.html +++ b/src/app/beans/bean-popover-actions/bean-popover-actions.component.html @@ -14,9 +14,9 @@ {{"EDIT" | translate}} - + - {{"EDIT" | translate}} + {{"POPOVER_QR_CODE_REFRESH" | translate}} diff --git a/src/app/beans/beans.page.ts b/src/app/beans/beans.page.ts index 2f2069f25..8c004d05e 100644 --- a/src/app/beans/beans.page.ts +++ b/src/app/beans/beans.page.ts @@ -447,7 +447,7 @@ export class BeansPage implements OnInit { },() => {}); } else { // Test sample for development - await this.intenthandler.handleQRCodeLink('https://beanconqueror.com/?qr=7b761a95'); + //await this.intenthandler.handleQRCodeLink('https://beanconqueror.com/?qr=7b761a95'); } this.loadBeans(); return; diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 5fa10c917..151471095 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -1103,6 +1103,7 @@ "ERROR_OCCURED": "Ein Fehler ist aufgetreten, QR-Code konnte nicht ausgelesen werden, bitte versuche es erneut." }, "BEAN_SUCCESSFULLY_SCANNED": "Bohne erfolgreich gescannt", + "BEAN_SUCCESSFULLY_REFRESHED": "Bohne erfolgreich aktualisiert", "IMAGES_GETTING_DOWNLOADED": "Bilder werden heruntergeladen" }, "RETRY_CONNECT": "Erneut verbinden", @@ -1164,5 +1165,7 @@ "PREPARATION_TYPE_RATIO_SIX_COFFEE_BREWER": "Ratio Six Coffee Brewer", "PREPARATION_TYPE_ROK": "ROK", "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo", - "PREPARATION_TYPE_TRICOLATE": "Tricolate" + "PREPARATION_TYPE_TRICOLATE": "Tricolate", + "QR_CODE_REFRESH_DATA_MESSAGE": "Alle Informationen der Bohne werden überschritten, jetzt fortfahren?", + "POPOVER_QR_CODE_REFRESH": "Daten neu laden" } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 8430a324f..4ecfedff0 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -1103,6 +1103,7 @@ "ERROR_OCCURED": "An error is occured, qr code could not be read, please try again." }, "BEAN_SUCCESSFULLY_SCANNED": "Bean successfully scanned", + "BEAN_SUCCESSFULLY_REFRESHED": "Bean successfully updated", "IMAGES_GETTING_DOWNLOADED": "Images getting downloaded" }, "RETRY_CONNECT": "Retry connection", @@ -1164,5 +1165,7 @@ "PREPARATION_TYPE_RATIO_SIX_COFFEE_BREWER": "Ratio Six Coffee Brewer", "PREPARATION_TYPE_ROK": "ROK", "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo", - "PREPARATION_TYPE_TRICOLATE": "Tricolate" + "PREPARATION_TYPE_TRICOLATE": "Tricolate", + "QR_CODE_REFRESH_DATA_MESSAGE": "All information of the bean will be overwritten, start now?", + "POPOVER_QR_CODE_REFRESH": "Reload data" } diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index 58f2802c4..53e8dbc49 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -1103,6 +1103,7 @@ "ERROR_OCCURED": "Se ha producido un error, no se pudo leer el código qr, inténtalo de nuevo." }, "BEAN_SUCCESSFULLY_SCANNED": "Grano escaneado correctamente", + "BEAN_SUCCESSFULLY_REFRESHED": "Grano actualizado con éxito", "IMAGES_GETTING_DOWNLOADED": "Se están descargando imágenes" }, "RETRY_CONNECT": "Reintentar la conexión", @@ -1164,5 +1165,7 @@ "PREPARATION_TYPE_RATIO_SIX_COFFEE_BREWER": "Ratio Six Coffee Brewer", "PREPARATION_TYPE_ROK": "ROK", "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo", - "PREPARATION_TYPE_TRICOLATE": "Tricolate" + "PREPARATION_TYPE_TRICOLATE": "Tricolate", + "QR_CODE_REFRESH_DATA_MESSAGE": "All information of the bean will be overwritten, start now?", + "POPOVER_QR_CODE_REFRESH": "Reload data" } diff --git a/src/components/bean-information/bean-information.component.ts b/src/components/bean-information/bean-information.component.ts index b7ccd8e07..4a7dee1ba 100644 --- a/src/components/bean-information/bean-information.component.ts +++ b/src/components/bean-information/bean-information.component.ts @@ -18,6 +18,10 @@ import {UIBeanStorage} from '../../services/uiBeanStorage'; import BEAN_TRACKING from '../../data/tracking/beanTracking'; import {ShareService} from '../../services/shareService/share-service.service'; import {BEAN_ROASTING_TYPE_ENUM} from '../../enums/beans/beanRoastingType'; +import {ServerBean} from '../../models/bean/serverBean'; +import QR_TRACKING from '../../data/tracking/qrTracking'; +import {BeanMapper} from '../../mapper/bean/beanMapper'; +import {ServerCommunicationService} from '../../services/serverCommunication/server-communication.service'; @Component({ selector: 'bean-information', @@ -46,7 +50,8 @@ export class BeanInformationComponent implements OnInit { private readonly uiToast: UIToast, private readonly uiBeanStorage: UIBeanStorage, private readonly uiImage: UIImage, - private readonly shareService: ShareService) { + private readonly shareService: ShareService, + private readonly serverCommunicationService: ServerCommunicationService) { } @@ -167,6 +172,9 @@ export class BeanInformationComponent implements OnInit { case BEAN_ACTION.SHARE: await this.shareBean(); break; + case BEAN_ACTION.REFRESH_DATA_FROM_QR_CODE: + await this.refreshDataFromQRCode(); + break; default: break; } @@ -228,6 +236,46 @@ export class BeanInformationComponent implements OnInit { public async shareBean() { await this.shareService.shareBean(this.bean); } + public async refreshDataFromQRCode() { + await this.uiAlert.showConfirm('QR_CODE_REFRESH_DATA_MESSAGE','CARE',true).then(async () => { + await this.uiAlert.showLoadingSpinner(); + let errorOccured: boolean = false; + try { + + const _scannedQRBean: ServerBean = await this.serverCommunicationService.getBeanInformation(this.bean.qr_code); + if (_scannedQRBean.error === null) { + + this.uiAnalytics.trackEvent(QR_TRACKING.TITLE, QR_TRACKING.ACTIONS.REFRESH_SUCCESSFULLY); + this.uiToast.showInfoToast('QR.BEAN_SUCCESSFULLY_REFRESHED'); + await this.uiAlert.showLoadingSpinner(); + // Get the new bean from server, just save the uuid, all other information will be overwritten + const newMapper = new BeanMapper(); + const newBean: Bean = await newMapper.mapServerToClientBean(_scannedQRBean); + const savedUUID = this.bean.config.uuid; + this.bean = newBean; + this.bean.config.uuid = savedUUID; + await this.uiBeanStorage.update(this.bean); + } else { + errorOccured = true; + + } + } + catch (ex) { + errorOccured = true; + } + await this.uiAlert.hideLoadingSpinner(); + if (errorOccured) { + this.uiAlert.showMessage('QR.SERVER.ERROR_OCCURED','ERROR_OCCURED',undefined,true); + } + + + + },() => { + + }); + + + } public async deleteBean(): Promise { diff --git a/src/data/tracking/qrTracking.ts b/src/data/tracking/qrTracking.ts index 4a9700edc..f52b2ecea 100644 --- a/src/data/tracking/qrTracking.ts +++ b/src/data/tracking/qrTracking.ts @@ -7,6 +7,7 @@ export default { CATEGORY: 'SCANNED_LINK', }, SCAN_SUCCESSFULLY: 'SCAN_SUCCESSFULLY', + REFRESH_SUCCESSFULLY: 'REFRESH_SUCCESSFULLY', SCAN_FAILED: 'SCAN_FAILED', } }; diff --git a/src/enums/beans/beanAction.ts b/src/enums/beans/beanAction.ts index 1b7bb71ee..4d4023d9c 100755 --- a/src/enums/beans/beanAction.ts +++ b/src/enums/beans/beanAction.ts @@ -8,5 +8,5 @@ export enum BEAN_ACTION { PHOTO_GALLERY = 'PHOTO_GALLERY', TOGGLE_FAVOURITE = 'TOGGLE_FAVOURITE', SHARE = 'SHARE', - REFRESH_DATA = 'REFRESH_DATA' + REFRESH_DATA_FROM_QR_CODE = 'REFRESH_DATA_FROM_QR_CODE' } diff --git a/src/services/uiImage.ts b/src/services/uiImage.ts index 6b9c35093..e863f5ccd 100755 --- a/src/services/uiImage.ts +++ b/src/services/uiImage.ts @@ -72,7 +72,7 @@ export class UIImage { this.uiFileHelper.saveBase64File('beanconqueror_image', '.jpg', imageStr).then((_newURL) => { // const filePath = _newURL.replace(/^file:\/\//, ''); resolve(_newURL); - this.__cleanupCamera(); + // this.__cleanupCamera(); },(_error) => { reject(_error); }); @@ -149,7 +149,7 @@ export class UIImage { this.uiAlert.hideLoadingSpinner(); },50); - this.__cleanupCamera(); + // this.__cleanupCamera(); if (fileurls.length > 0) { resolve(fileurls); } else { @@ -207,7 +207,7 @@ export class UIImage { setTimeout(() => { this.uiAlert.hideLoadingSpinner(); },50); - this.__cleanupCamera(); + // this.__cleanupCamera(); if (fileurls.length > 0) { resolve(fileurls); From 834bb285d7b3647cb01bd59d1572c55bf7c10d04 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Tue, 17 May 2022 20:51:35 +0200 Subject: [PATCH 06/78] #361 - Search beans on filter --- .../bean-modal-select.component.html | 48 +++++++++++++++++-- .../bean-modal-select.component.ts | 47 ++++++++++++++++++ 2 files changed, 91 insertions(+), 4 deletions(-) diff --git a/src/app/beans/bean-modal-select/bean-modal-select.component.html b/src/app/beans/bean-modal-select/bean-modal-select.component.html index 3b4e6297b..65dcf6fed 100644 --- a/src/app/beans/bean-modal-select/bean-modal-select.component.html +++ b/src/app/beans/bean-modal-select/bean-modal-select.component.html @@ -26,7 +26,9 @@
- + +
+
{{bean.name}}
@@ -43,11 +45,21 @@
{{bean.name}}

+
+
+ +
+
+ {{"PAGE_BEANS_LIST_YOU_GOT_NO_FRESH_BEANS" | translate}} +
+
- + +
+
{{bean.name}}
@@ -64,6 +76,14 @@
{{bean.name}}

+
+
+ +
+
+ {{"PAGE_BEANS_LIST_YOU_GOT_NO_FINISHED_BEANS" | translate}} +
+
@@ -74,7 +94,9 @@
{{bean.name}}
- + +
+
{{bean.name}}
@@ -91,11 +113,21 @@
{{bean.name}}

+
+
+ +
+
+ {{"PAGE_BEANS_LIST_YOU_GOT_NO_FRESH_BEANS" | translate}} +
+
- + +
+
{{bean.name}}
@@ -112,6 +144,14 @@
{{bean.name}}

+
+
+ +
+
+ {{"PAGE_BEANS_LIST_YOU_GOT_NO_FINISHED_BEANS" | translate}} +
+
diff --git a/src/app/beans/bean-modal-select/bean-modal-select.component.ts b/src/app/beans/bean-modal-select/bean-modal-select.component.ts index 67f685905..2e26f934a 100644 --- a/src/app/beans/bean-modal-select/bean-modal-select.component.ts +++ b/src/app/beans/bean-modal-select/bean-modal-select.component.ts @@ -21,6 +21,10 @@ export class BeanModalSelectComponent implements OnInit { @Input() public showFinished: boolean; @Input() private selectedValues: Array; public beanRoastingTypeEnum = BEAN_ROASTING_TYPE_ENUM; + public openBeansFilterText: string = ''; + public openBeans: Array = []; + public finishedBeansFilterText: string = ''; + public finishedBeans: Array = []; constructor(private readonly modalController: ModalController, private readonly uiBeanStorage: UIBeanStorage, @@ -42,6 +46,7 @@ export class BeanModalSelectComponent implements OnInit { this.radioSelection = this.selectedValues[0]; } } + this.research(); } public getUsedWeightCount(_bean: Bean): number { @@ -136,4 +141,46 @@ export class BeanModalSelectComponent implements OnInit { } return true; } + + + + public research() { + this.__initializeBeansView('open'); + this.__initializeBeansView('archiv'); + } + private __initializeBeansView(_type: string) { + const beansCopy: Array = [...this.objs]; + const isOpen: boolean = (_type === 'open'); + + let filterBeans: Array; + if (isOpen) { + filterBeans = beansCopy.filter( + (bean) => !bean.finished); + } else { + + filterBeans = beansCopy.filter( + (bean) => bean.finished); + } + + let searchText: string = ''; + if (isOpen) { + searchText = this.openBeansFilterText.toLowerCase(); + } else { + searchText = this.finishedBeansFilterText.toLowerCase(); + } + + if (searchText) { + filterBeans = filterBeans.filter((e) => e.note?.toLowerCase().includes(searchText) || + e.name?.toLowerCase().includes(searchText) || + e.roaster?.toLowerCase().includes(searchText) || + e.aromatics?.toLowerCase().includes(searchText)); + } + if (isOpen) { + this.openBeans = filterBeans; + } else { + this.finishedBeans = filterBeans; + } + + } + } From 43cc75047d72e9c56302b05ee032f371bb3061b5 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Thu, 19 May 2022 21:58:27 +0200 Subject: [PATCH 07/78] #362 - Export flowprofile realtime --- .../brew/brew-detail/brew-detail.component.ts | 23 ++++ .../brew/brew-flow/brew-flow.component.html | 2 +- src/app/brew/brew-flow/brew-flow.component.ts | 8 +- src/assets/i18n/de.json | 5 +- src/assets/i18n/en.json | 5 +- src/assets/i18n/es.json | 3 +- src/assets/js/matomo.js | 4 +- src/classes/brew/brewFlow.ts | 10 +- .../brew-brewing/brew-brewing.component.ts | 116 ++++++++++++++---- src/services/uiExcel.ts | 18 +++ src/services/uiImage.ts | 2 +- 11 files changed, 157 insertions(+), 39 deletions(-) diff --git a/src/app/brew/brew-detail/brew-detail.component.ts b/src/app/brew/brew-detail/brew-detail.component.ts index 994a9a9ac..2ca54d8fd 100644 --- a/src/app/brew/brew-detail/brew-detail.component.ts +++ b/src/app/brew/brew-detail/brew-detail.component.ts @@ -160,6 +160,16 @@ export class BrewDetailComponent implements OnInit { yAxisID: 'y1', spanGaps: true, pointRadius: 0, + }, + { + label: this.translate.instant('BREW_FLOW_WEIGHT_REALTIME'), + data: [], + borderColor: 'rgb(144,60,99)', + backgroundColor: 'rgb(191,101,143)', + yAxisID: 'y2', + spanGaps: true, + pointRadius: 0, + tension: 0, }] }; const chartOptions = { @@ -215,6 +225,16 @@ export class BrewDetailComponent implements OnInit { drawOnChartArea: false, // only want the grid lines for one axis to show up }, }, + y2: { + // Real time flow + type: 'linear', + display: false, + position: 'right', + // grid line settings + grid: { + drawOnChartArea: false, // only want the grid lines for one axis to show up + }, + }, xAxis: { ticks: { maxTicksLimit: 10 @@ -249,6 +269,9 @@ export class BrewDetailComponent implements OnInit { for (const data of this.flow_profile_raw.waterFlow) { this.flowProfileChartEl.data.datasets[1].data.push(data.value); } + for (const data of this.flow_profile_raw.realtimeFlow) { + this.flowProfileChartEl.data.datasets[2].data.push(data.flow_value); + } this.flowProfileChartEl.update(); } } diff --git a/src/app/brew/brew-flow/brew-flow.component.html b/src/app/brew/brew-flow/brew-flow.component.html index 25ae3714e..cf22d1ed1 100644 --- a/src/app/brew/brew-flow/brew-flow.component.html +++ b/src/app/brew/brew-flow/brew-flow.component.html @@ -7,7 +7,7 @@ -
+
diff --git a/src/app/brew/brew-flow/brew-flow.component.ts b/src/app/brew/brew-flow/brew-flow.component.ts index d6b9284fb..8364815f3 100644 --- a/src/app/brew/brew-flow/brew-flow.component.ts +++ b/src/app/brew/brew-flow/brew-flow.component.ts @@ -9,7 +9,6 @@ import {UIBrewHelper} from '../../../services/uiBrewHelper'; import {PREPARATION_STYLE_TYPE} from '../../../enums/preparations/preparationStyleTypes'; import {Settings} from '../../../classes/settings/settings'; import {BrewBrewingComponent} from '../../../components/brews/brew-brewing/brew-brewing.component'; -import {AgVirtualSrollComponent} from 'ag-virtual-scroll'; @Component({ @@ -65,16 +64,15 @@ export class BrewFlowComponent implements OnInit, OnDestroy { // Looks funny but we need. if we would not calculate and substract 25px, the actual time graph would not be displayed :< setTimeout(() => { const el = this.flowContent.nativeElement; - this.flowChartEl.ctx.canvas.style.height = (el.offsetHeight - 25) + 'px'; + const newHeight = document.getElementById('brewFlowContainer').offsetHeight; + this.flowChartEl.ctx.canvas.style.height = (newHeight - 1) + 'px'; resolve(undefined); - }, 25); + }, 100); }); - - if (this.isDetail===false) { this.brewFlowGraphSubscription = this.brewFlowGraphEvent.subscribe((_val) => { this.setActualScaleInformation(_val); diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 151471095..571d178bd 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -1109,7 +1109,7 @@ "RETRY_CONNECT": "Erneut verbinden", "SMART_SCALE_STAY_CONNECTED_ON_APP_MINIMIZE": "Waage verbunden lassen bei App minimierung/inaktivität", "BREW_FLOW_WEIGHT": "Gewicht", - "BREW_FLOW_WEIGHT_PER_SECOND": "Fluss", + "BREW_FLOW_WEIGHT_PER_SECOND": "Fluss (Berechnet)", "ROAST_TYPE_UNKNOWN":"Unbekannt", "ROAST_TYPE_CINNAMON_ROAST":"Cinnamon Roast", "ROAST_TYPE_AMERICAN_ROAST":"American Roast", @@ -1167,5 +1167,6 @@ "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo", "PREPARATION_TYPE_TRICOLATE": "Tricolate", "QR_CODE_REFRESH_DATA_MESSAGE": "Alle Informationen der Bohne werden überschritten, jetzt fortfahren?", - "POPOVER_QR_CODE_REFRESH": "Daten neu laden" + "POPOVER_QR_CODE_REFRESH": "Daten neu laden", + "BREW_FLOW_WEIGHT_REALTIME": "Fluss (Echtzeit)" } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 4ecfedff0..cee08350b 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -1109,7 +1109,7 @@ "RETRY_CONNECT": "Retry connection", "SMART_SCALE_STAY_CONNECTED_ON_APP_MINIMIZE": "Let scale connected even when app is minimized/inactive", "BREW_FLOW_WEIGHT": "Weight", - "BREW_FLOW_WEIGHT_PER_SECOND": "Flow", + "BREW_FLOW_WEIGHT_PER_SECOND": "Flow (Calc.)", "ROAST_TYPE_UNKNOWN":"Unknown", "ROAST_TYPE_CINNAMON_ROAST":"Cinnamon Roast", "ROAST_TYPE_AMERICAN_ROAST":"American Roast", @@ -1167,5 +1167,6 @@ "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo", "PREPARATION_TYPE_TRICOLATE": "Tricolate", "QR_CODE_REFRESH_DATA_MESSAGE": "All information of the bean will be overwritten, start now?", - "POPOVER_QR_CODE_REFRESH": "Reload data" + "POPOVER_QR_CODE_REFRESH": "Reload data", + "BREW_FLOW_WEIGHT_REALTIME": "Flow (Realtime)" } diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index 53e8dbc49..7cd49680e 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -1167,5 +1167,6 @@ "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo", "PREPARATION_TYPE_TRICOLATE": "Tricolate", "QR_CODE_REFRESH_DATA_MESSAGE": "All information of the bean will be overwritten, start now?", - "POPOVER_QR_CODE_REFRESH": "Reload data" + "POPOVER_QR_CODE_REFRESH": "Recargar datos", + "BREW_FLOW_WEIGHT_REALTIME": "Fujo (tiempo real)" } diff --git a/src/assets/js/matomo.js b/src/assets/js/matomo.js index 916870fde..e68f5c41e 100644 --- a/src/assets/js/matomo.js +++ b/src/assets/js/matomo.js @@ -11,7 +11,7 @@ ;if(typeof _paq!=="object"){_paq=[]}if(typeof window.Matomo!=="object"){window.Matomo=window.Piwik=(function(){var r,b={},z={},J=document,g=navigator,ab=screen,W=window,h=W.performance||W.mozPerformance||W.msPerformance||W.webkitPerformance,t=W.encodeURIComponent,V=W.decodeURIComponent,k=unescape,L=[],H,u,al=[],y=0,af=0,X=0,m=false;function p(at){try{return V(at)}catch(au){return unescape(at)}}function M(au){var at=typeof au;return at!=="undefined"}function C(at){return typeof at==="function"}function Z(at){return typeof at==="object"}function x(at){return typeof at==="string"||at instanceof String}function ak(at){return typeof at==="number"||at instanceof Number }function ac(at){return M(at)&&(ak(at)||(x(at)&&at.length))}function D(au){if(!au){return true}var at;var av=true;for(at in au){if(Object.prototype.hasOwnProperty.call(au,at)){av=false}}return av}function ao(at){var au=typeof console;if(au!=="undefined"&&console&&console.error){console.error(at)}}function aj(){var ay,ax,aA,au,at;for(ay=0;ay0;if(aw){az=aA.split("::");av=az[0];aA=az[1];if("object"===typeof u[av]&&"function"===typeof u[av][aA]){u[av][aA].apply(u[av],au)}else{if(at){al.push(at)}}}else{for(ax=0;ax0;if(aB){az=aA.split(".");if(av&&"object"===typeof av[az[0]]){av=av[az[0]];aA=az[1]}else{if(at){al.push(at);break}}}if(av[aA]){av[aA].apply(av,au)}else{var aC="The method '"+aA+'\' was not found in "_paq" variable. Please have a look at the Matomo tracker documentation: https://developer.matomo.org/api-reference/tracking-javascript'; ao(aC);if(!aB){throw new TypeError(aC)}}if(aA==="addTracker"){break}if(aA==="setTrackerUrl"||aA==="setSiteId"){break}}else{aA.apply(L[ax],au)}}}}}function ar(aw,av,au,at){if(aw.addEventListener){aw.addEventListener(av,au,at);return true}if(aw.attachEvent){return aw.attachEvent("on"+av,au)}aw["on"+av]=au}function n(at){if(J.readyState==="complete"){at()}else{if(W.addEventListener){W.addEventListener("load",at,false)}else{if(W.attachEvent){W.attachEvent("onload",at)}}}}function q(aw){var at=false;if(J.attachEvent){at=J.readyState==="complete"}else{at=J.readyState!=="loading"}if(at){aw();return}var av;if(J.addEventListener){ar(J,"DOMContentLoaded",function au(){J.removeEventListener("DOMContentLoaded",au,false);if(!at){at=true;aw()}})}else{if(J.attachEvent){J.attachEvent("onreadystatechange",function au(){if(J.readyState==="complete"){J.detachEvent("onreadystatechange",au);if(!at){at=true;aw()}}});if(J.documentElement.doScroll&&W===W.top){(function au(){if(!at){try{J.documentElement.doScroll("left") -}catch(ax){setTimeout(au,0);return}at=true;aw()}}())}}}ar(W,"load",function(){if(!at){at=true;aw()}},false)}function ag(au,az,aA){if(!au){return""}var at="",aw,av,ax,ay;for(aw in b){if(Object.prototype.hasOwnProperty.call(b,aw)){ay=b[aw]&&"function"===typeof b[aw][au];if(ay){av=b[aw][au];ax=av(az||{},aA);if(ax){at+=ax}}}}return at}function am(){var at;m=true;ag("unload");at=new Date();var au=at.getTimeAlias();if((r-au)>3000){r=au+3000}if(r){do{at=new Date()}while(at.getTimeAlias()3000){r=av+3000}if(r){do{at=new Date()}while(at.getTimeAlias()=0;ay--){ax=az[ay].split("=")[0];if(ax===av){az.splice(ay,1)}}var aC=az.join("&");if(aC){aA=aA+"?"+aC}if(aB){aA+="#"+aB}}return aA}function e(av,au){var at="[\\?&#]"+au+"=([^&#]*)";var ax=new RegExp(at);var aw=ax.exec(av);return aw?p(aw[1]):""}function a(at){if(at&&String(at)===at){return at.replace(/^\s+|\s+$/g,"")}return at}function F(at){return unescape(t(at))}function aq(aI){var av=function(aO,aN){return(aO<>>(32-aN))},aJ=function(aQ){var aO="",aP,aN;for(aP=7;aP>=0;aP--){aN=(aQ>>>(aP*4))&15; aO+=aN.toString(16)}return aO},ay,aL,aK,au=[],aC=1732584193,aA=4023233417,az=2562383102,ax=271733878,aw=3285377520,aH,aG,aF,aE,aD,aM,at,aB=[];aI=F(aI);at=aI.length;for(aL=0;aL>>29);aB.push((at<<3)&4294967295);for(ay=0;ay1&&au!=="addTracker"&&au!=="enableLinkTracking"){ao("The method "+au+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Matomo trackers documentation: https://developer.matomo.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}az[au]++}}}}return ay}var E=["addTracker","forgetCookieConsentGiven","requireCookieConsent","disableBrowserFeatureDetection","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setCookieNamePrefix","setCookieSameSite","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setVisitorId","setSiteId","alwaysUseSendBeacon","disableAlwaysUseSendBeacon","enableLinkTracking","setCookieConsentGiven","requireConsent","setConsentGiven","disablePerformanceTracking","setPagePerformanceTiming","setExcludedQueryParams"]; - function ah(av,au){var at=new T(av,au);L.push(at);_paq=c(_paq,E);for(H=0;H<_paq.length;H++){if(_paq[H]){aj(_paq[H])}}_paq=new K();u.trigger("TrackerAdded",[at]);return at}ar(W,"beforeunload",am,false);ar(W,"online",function(){if(M(g.serviceWorker)){g.serviceWorker.ready.then(function(at){if(at&&at.sync){return at.sync.register("matomoSync")}},function(){})}},false);ar(W,"message",function(ay){if(!ay||!ay.origin){return}var aA,aw,au;var aB=d(ay.origin);var ax=u.getAsyncTrackers();for(aw=0;aw; public waterFlow: Array; + public realtimeFlow: Array; constructor() { this.weight = []; this.waterFlow = []; - + this.realtimeFlow = []; } } @@ -18,6 +19,7 @@ export interface IBrewWeightFlow { old_weight: number; actual_smoothed_weight: number; old_smoothed_weight: number; + calculated_real_flow: number; } export interface IBrewWaterFlow { @@ -26,3 +28,9 @@ export interface IBrewWaterFlow { timestamp: string; } +export interface IBrewRealtimeWaterFlow { + flow_value: number; + brew_time: string; + timestamp: string; + smoothed_weight: number; +} diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index b488abb4e..bf433686e 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -41,7 +41,7 @@ import {BluetoothScale, SCALE_TIMER_COMMAND} from '../../../classes/devices'; import {Chart} from 'chart.js'; import {UIHelper} from '../../../services/uiHelper'; import {UIExcel} from '../../../services/uiExcel'; -import {BrewFlow, IBrewWaterFlow, IBrewWeightFlow} from '../../../classes/brew/brewFlow'; +import {BrewFlow, IBrewRealtimeWaterFlow, IBrewWaterFlow, IBrewWeightFlow} from '../../../classes/brew/brewFlow'; import {UIFileHelper} from '../../../services/uiFileHelper'; import {BrewFlowComponent} from '../../../app/brew/brew-flow/brew-flow.component'; import {ScreenOrientation} from '@ionic-native/screen-orientation/ngx'; @@ -208,13 +208,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { // Trigger change rating this.changedRating(); }); - /* let b =0; - setInterval(() => { - b = b+1; - this.flowProfileChartEl.data.datasets[0].data.push(b); - this.flowProfileChartEl.data.labels.push(b); - this.flowProfileChartEl.update('none'); - },1000);*/ + } @@ -485,6 +479,16 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { spanGaps: true, pointRadius: 0, tension: 0, + }, + { + label: this.translate.instant('BREW_FLOW_WEIGHT_REALTIME'), + data: [], + borderColor: 'rgb(144,60,99)', + backgroundColor: 'rgb(191,101,143)', + yAxisID: 'y2', + spanGaps: true, + pointRadius: 0, + tension: 0, }] }; @@ -512,15 +516,21 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { const suggestedMinFlow: number = 0; - let suggestedMaxFlow: number = 30 ; + let suggestedMaxFlow: number = 20; const suggestedMinWeight: number = 0; let suggestedMaxWeight: number = 300; if (this.data.getPreparation().style_type === PREPARATION_STYLE_TYPE.ESPRESSO) { - suggestedMaxFlow = 10; - suggestedMaxWeight = 100; + suggestedMaxFlow = 2.5; + suggestedMaxWeight = 30; } const chartOptions = { + legend: { + position: 'top', + onClick: (event, elem)=> { + console.log("legend click @ x: " + event.clientX + ", y:" + event.clientY); + } + }, animation: false, // disa scales: { x: { @@ -571,6 +581,18 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { }, suggestedMin: suggestedMinFlow, suggestedMax: suggestedMaxFlow, + }, + y2: { + // Real time flow + type: 'linear', + display: false, + position: 'right', + // grid line settings + grid: { + drawOnChartArea: false, // only want the grid lines for one axis to show up + }, + suggestedMin: suggestedMinFlow, + suggestedMax: suggestedMaxFlow, } }, interaction: { @@ -578,8 +600,13 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } }; + + + + + if (pressureEnabled) { - chartOptions.scales['y2'] = { + chartOptions.scales['y3'] = { type: 'linear', display: true, position: 'right', @@ -611,6 +638,11 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.flowProfileChartEl.data.datasets[1].data.push({x:dataDay.toDate().getTime(), y:data.value}); } + for (const data of this.flow_profile_raw.realtimeFlow) { + const dataDay = moment(new Date()).startOf('day'); + dataDay.add('seconds',data.brew_time); + this.flowProfileChartEl.data.datasets[2].data.push({x:dataDay.toDate().getTime(), y:data.flow_value}); + } } this.flowProfileChartEl.update('quite'); @@ -714,32 +746,42 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { public async timerStarted(_event) { const scale: BluetoothScale = this.bleManager.getScale(); - - /* let weight=0; - let pressure = 0; +/*** + let weight=0; + let realtime_flow = 0; let flow = 0; + this.startingFlowTime = Date.now(); + this.flowProfileChartEl.options.scales.x.realtime.pause = false; + const startingDay = moment(new Date()).startOf('day'); + //IF brewtime has some seconds, we add this to the delay directly. + if (this.data.brew_time > 0) { + startingDay.add('seconds',this.data.brew_time); + } + const delay = Date.now() - startingDay.toDate().getTime(); + this.flowProfileChartEl.options.scales.x.realtime.delay = delay; + this.flowProfileChartEl.update('quiet'); setInterval(() => { flow = Math.floor(Math.random() * 11); - pressure = Math.floor(Math.random() * 11); + realtime_flow = Math.floor(Math.random() * 11); weight = weight + Math.floor(Math.random() * 11); const flowObj= { unixTime: moment(new Date()).startOf('day').add('milliseconds',Date.now() - this.startingFlowTime).toDate().getTime(), weight: weight, - pressure: pressure, + realtime_flow: realtime_flow, flow: flow }; this.flowProfileChartEl.data.datasets[0].data.push( {x: flowObj.unixTime, y: flowObj.weight} ); this.flowProfileChartEl.data.datasets[1].data.push( - {x: flowObj.unixTime, y: flowObj.pressure} + {x: flowObj.unixTime, y: flowObj.flow} ); this.flowProfileChartEl.data.datasets[2].data.push( - {x: flowObj.unixTime, y: flowObj.flow} + {x: flowObj.unixTime, y: flowObj.realtime_flow} ); this.flowProfileChartEl.update('quite'); - },100);*/ - + },100); +*/ if (scale) { if (this.settings.bluetooth_scale_tare_on_start_timer === true) { await scale.tare(); @@ -1245,10 +1287,39 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.flowProfileArrObjs.push(flowObj); this.flowProfileArrCalculated.push(weight - oldWeight); + + /* Realtime flow start**/ + let lastRealtimeFlow = null; + if ( this.flow_profile_raw.realtimeFlow.length > 0) { + lastRealtimeFlow = this.flow_profile_raw.realtimeFlow[ this.flow_profile_raw.realtimeFlow.length - 1]; + } + + let oldRealtimeSmoothedValue = 0; + if (lastRealtimeFlow != null) { + oldRealtimeSmoothedValue = lastRealtimeFlow.smoothed_weight; + } + const newSmoothedWeight = (oldRealtimeSmoothedValue * 0.9) + (weight * 0.1); + + + const realtimeWaterFlow: IBrewRealtimeWaterFlow = { + + } as IBrewRealtimeWaterFlow; + + realtimeWaterFlow.brew_time = flowObj.flowTimeSecond; + realtimeWaterFlow.timestamp = this.uiHelper.getActualTimeWithMilliseconds(); + realtimeWaterFlow.smoothed_weight = newSmoothedWeight; + realtimeWaterFlow.flow_value = (newSmoothedWeight - oldRealtimeSmoothedValue)*10; + + + this.flowProfileChartEl.data.datasets[2].data.push({x: flowObj.unixTime, y: realtimeWaterFlow.flow_value}); + this.flow_profile_raw.realtimeFlow.push(realtimeWaterFlow); + /* Realtime flow End **/ + if (this.settings.bluetooth_ignore_anomaly_values === false && this.settings.bluetooth_ignore_negative_values === false) { this.flowProfileChartEl.data.datasets[0].data.push({x: flowObj.unixTime, y: flowObj.weight}); + this.pushFlowProfile(flowObj.flowTimeSecond, flowObj.weight, flowObj.oldWeight, flowObj.smoothedWeight, flowObj.oldSmoothedWeight); this.flowProfileChartEl.update('quiet'); } @@ -1274,9 +1345,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { brewFlow.old_smoothed_weight = _oldSmoothedWeight; this.flow_profile_raw.weight.push(brewFlow); } - private overwriteFlowProfile(_index: number, _weight:number){ - - } public setActualSmartInformation() { try { diff --git a/src/services/uiExcel.ts b/src/services/uiExcel.ts index 4e5b2a99d..e929871e3 100755 --- a/src/services/uiExcel.ts +++ b/src/services/uiExcel.ts @@ -102,6 +102,24 @@ export class UIExcel { const wsFlow: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(wsDataFlow); XLSX.utils.book_append_sheet(wb, wsFlow, this.translate.instant('Flow profile calculated')); + const header_flow_realtime: Array = []; + header.push('Timestamp'); + header.push('Time'); + header.push('Flow value'); + header.push('Smoothed weight'); + + const wsDataFlowRealtime: any[][] = [header_flow_realtime]; + for (const entry of _flow.realtimeFlow) { + const wbEntry: Array = [ + entry.timestamp, + entry.brew_time, + entry.flow_value, + entry.smoothed_weight]; + wsDataFlowRealtime.push(wbEntry); + } + const wsFlowRealtime: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(wsDataFlowRealtime); + XLSX.utils.book_append_sheet(wb, wsFlowRealtime, this.translate.instant('Flow profile realtime')); + return wb; } diff --git a/src/services/uiImage.ts b/src/services/uiImage.ts index e863f5ccd..8e6352445 100755 --- a/src/services/uiImage.ts +++ b/src/services/uiImage.ts @@ -107,7 +107,7 @@ export class UIImage { } - public async choosePhoto (): Promise { + public async choosePhoto(): Promise { const promise = new Promise(async (resolve, reject) => { this.__checkPermission(async () => { From 3eb41aff825b9a5a86e8a1c87cccafe648b7419c Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Thu, 19 May 2022 22:06:28 +0200 Subject: [PATCH 08/78] #362 - Export flowprofile realtime --- src/components/brews/brew-brewing/brew-brewing.component.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index bf433686e..8430afea1 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -525,12 +525,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { suggestedMaxWeight = 30; } const chartOptions = { - legend: { - position: 'top', - onClick: (event, elem)=> { - console.log("legend click @ x: " + event.clientX + ", y:" + event.clientY); - } - }, animation: false, // disa scales: { x: { From 96453c9a67c1915a5f34d51bb1130e54b393641e Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Thu, 19 May 2022 22:11:34 +0200 Subject: [PATCH 09/78] #362 - Export flowprofile realtime --- src/components/brews/brew-brewing/brew-brewing.component.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index 8430afea1..46c80a25d 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -594,11 +594,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } }; - - - - - if (pressureEnabled) { chartOptions.scales['y3'] = { type: 'linear', From c019e3db0d92bfde57d0cab375b76daad767bb7e Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Fri, 20 May 2022 20:46:42 +0200 Subject: [PATCH 10/78] Backup fixings woop woop --- config.xml | 2 +- src/assets/i18n/de.json | 21 ++++++++ src/assets/i18n/en.json | 21 ++++++++ src/assets/i18n/es.json | 23 +++++++- src/classes/version/iVersion.ts | 2 +- .../android-platform.service.ts | 54 ++++++++++++------- .../iosPlatform/ios-platform.service.ts | 25 +++++++-- 7 files changed, 124 insertions(+), 24 deletions(-) diff --git a/config.xml b/config.xml index 6468e49a8..5c103c612 100644 --- a/config.xml +++ b/config.xml @@ -1,5 +1,5 @@ - + Beanconqueror Lars Saalbach diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 571d178bd..289de73c9 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -718,6 +718,27 @@ "Falls die App leer gestartet wurde, bitte geh in die Einstellungen, und importiere unter 'Download/Beanconqueror_export/Beanconqueror_automatic_export_*.json' * steht für den letzten Zeitstempel das Backup.", "Alle Daten sollten dann wie gewohnt wieder vorhanden sein, falls nicht schreib mir bitte eine E-Mail: info@beanconqueror.com." ] + }, + "6.1.5": { + "TITLE": "Version 6.1.5: Das ist neu", + "DESCRIPTION": [ + "Android - Achtung", + "Falls die App leer gestartet wurde und du vorher Daten hattest, bitte geh in die Einstellungen, und importiere unter 'Download/Beanconqueror_export/Beanconqueror_automatic_export_*.json' * steht für den letzten Zeitstempel das Backup.", + "Alle Daten sollten dann wie gewohnt wieder vorhanden sein, falls nicht schreib mir bitte eine E-Mail: info@beanconqueror.com.", + "", + "QR Codes", + "Lade die QR-Code Daten der Rösterei nun erneut", + "", + "Brühgraph", + "Wasserfluss wird nun in Echtzeit berechnet", + "", + "Bohnen", + "Suchfeld bei der Auswahl der Bohnen", + "", + "Fehlerbehebungen:", + "Nach Aufnahme eines Bildes war der Ladebalken nicht verschwunden", + "Kleinere Fehlerbehebungen" + ] } }, "CUSTOM_PARAMETERS": "Parameter individualisieren", diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index cee08350b..e67148841 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -718,6 +718,27 @@ "If your app started blank, please go into settings and import the file below 'Download/Beanconqueror_export/Beanconqueror_automatic_export_*.json' * stands for the latest timestamp, the backup.", "All datas should then be back as normal, if not please write me an e-mail: info@beanconqueror.com." ] + }, + "6.1.5": { + "TITLE": "Version 6.1.5: Thats new!", + "DESCRIPTION": [ + "Android - Attention", + "If your app started blank and you had data the last time you used the app, please go into settings and import the file below 'Download/Beanconqueror_export/Beanconqueror_automatic_export_*.json' * stands for the latest timestamp, the backup.", + "All datas should then be back as normal, if not please write me an e-mail: info@beanconqueror.com.", + "", + "QR Codes", + "Reload beans which where scanned via qr-codes", + "", + "Brew graph", + "Water flow is calculated now in realtime", + "", + "Beans", + "Search beans now in selection", + "", + "Bug fixes", + "After taking a picture, the loading spinner didn't disappear", + "Smaller bugfixes" + ] } }, "CUSTOM_PARAMETERS": "Customize parameter", diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index 7cd49680e..180486d8d 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -718,6 +718,27 @@ "If your app started blank, please go into settings and import the file below 'Download/Beanconqueror_export/Beanconqueror_automatic_export_*.json' * stands for the latest timestamp, the backup.", "All datas should then be back as normal, if not please write me an e-mail: info@beanconqueror.com." ] + }, + "6.1.5": { + "TITLE": "Versión 6.1.5: Ésto es lo nuevo!", + "DESCRIPTION": [ + "Android - Attention", + "Si su aplicación comenzó en blanco y tenía datos la última vez que usó la aplicación, ingrese a la configuración e importe el archivo a continuación 'Descargar/Beanconqueror_export/Beanconqueror_automatic_export_*.json' * representa la última marca de tiempo, la copia de seguridad.", + "Todos los datos deberían volver a la normalidad, si no es así, escríbame un correo electrónico: info@beanconqueror.com.", + "", + "Códigos QR", + "Recargue beans que fueron escaneados a través de códigos qr", + "", + "Gráfico de preparación", + "El flujo de agua se calcula ahora en tiempo real", + "", + "Granos", + "Buscar frijoles ahora en la selección", + "", + "Corrección de errores/b>", + "Después de tomar una foto, la rueda giratoria de carga no desapareció.", + "Pequeñas correcciones de errores" + ] } }, "CUSTOM_PARAMETERS": "Personalizar parámetros", @@ -1166,7 +1187,7 @@ "PREPARATION_TYPE_ROK": "ROK", "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo", "PREPARATION_TYPE_TRICOLATE": "Tricolate", - "QR_CODE_REFRESH_DATA_MESSAGE": "All information of the bean will be overwritten, start now?", + "QR_CODE_REFRESH_DATA_MESSAGE": "Toda la información del bean se sobrescribirá, ¿empezar ahora?", "POPOVER_QR_CODE_REFRESH": "Recargar datos", "BREW_FLOW_WEIGHT_REALTIME": "Fujo (tiempo real)" } diff --git a/src/classes/version/iVersion.ts b/src/classes/version/iVersion.ts index e924dd1f5..64fd7a100 100755 --- a/src/classes/version/iVersion.ts +++ b/src/classes/version/iVersion.ts @@ -57,7 +57,7 @@ export class Version implements IVersion { * We dont set this to a variable, else it would be stored in DB and wrongly overwritten */ private getUpdatedVersions() { - return ['5.0.0','5.1.0','5.2.0','5.3.1','5.4.0','6.0.0','6.1.0','6.1.3']; + return ['5.0.0','5.1.0','5.2.0','5.3.1','5.4.0','6.0.0','6.1.0','6.1.3','6.1.5']; } private versionCompare(_actualAppVersion, _updateVersion) { diff --git a/src/services/androidPlatform/android-platform.service.ts b/src/services/androidPlatform/android-platform.service.ts index 9386b131d..932a4c599 100644 --- a/src/services/androidPlatform/android-platform.service.ts +++ b/src/services/androidPlatform/android-platform.service.ts @@ -123,26 +123,44 @@ export class AndroidPlatformService { public async checkAndroidBackup() { try { - if (this.platform.is('cordova') && this.platform.is('android')) { - - this.uiLog.log('android-Platform - Check Android Backup'); - const hasData = await this.uiStorage.hasData(); - this.uiLog.log('android-Platform - Check Android Backup - Has data ' + hasData); - if (!hasData) { - this.uiLog.log('android-Platform - Check Android Backup - No data are stored yet inside the app, so we try to find a backup file'); - // If we don't got any data, we check now if there is a Beanconqueror.json saved. - this.uiFileHelper.getJSONFile('Beanconqueror.json').then((_json) => { - this.uiLog.log('android-Platform - We found a backup, try to import'); - this.uiStorage.import(_json).then(() => { - this.uiLog.log('android-Platform sucessfully imported Backup'); - },() => { - this.uiLog.error('android-Platform could not import Backup'); + const promise = new Promise(async(resolve, reject) => { + if (this.platform.is('cordova') && this.platform.is('android')) { + + this.uiLog.log('android-Platform - Check Android Backup'); + const hasData = await this.uiStorage.hasData(); + this.uiLog.log('android-Platform - Check Android Backup - Has data ' + hasData); + if (!hasData) { + this.uiLog.log('android-Platform - Check Android Backup - No data are stored yet inside the app, so we try to find a backup file'); + // If we don't got any data, we check now if there is a Beanconqueror.json saved. + this.uiFileHelper.getJSONFile('Beanconqueror.json').then(async (_json) => { + await this.uiAlert.showLoadingSpinner(); + this.uiLog.log('android-Platform - We found a backup, try to import'); + this.uiStorage.import(_json).then(async () => { + this.uiLog.log('android-Platform sucessfully imported Backup'); + setTimeout(() => { + this.uiAlert.hideLoadingSpinner(); + },150); + resolve(null); + },() => { + this.uiLog.error('android-Platform could not import Backup'); + setTimeout(() => { + this.uiAlert.hideLoadingSpinner(); + },150); + resolve(null); + + }); + }, () => { + this.uiLog.log('android-Platform - Check Android Backup - We couldnt retrieve any file'); + resolve(null); }); - }, () => { - this.uiLog.log('android-Platform - Check Android Backup - We couldnt retrieve any file'); - }); + } else { + resolve(null); + } + } else { + resolve(null); } - } + }); + return promise; }catch(ex) { } diff --git a/src/services/iosPlatform/ios-platform.service.ts b/src/services/iosPlatform/ios-platform.service.ts index 7b7274628..6c7d943a9 100644 --- a/src/services/iosPlatform/ios-platform.service.ts +++ b/src/services/iosPlatform/ios-platform.service.ts @@ -12,6 +12,7 @@ import {FileEntry} from '@ionic-native/file'; import {UIHelper} from '../uiHelper'; import {UIBrewStorage} from '../uiBrewStorage'; import {UISettingsStorage} from '../uiSettingsStorage'; +import {UIAlert} from '../uiAlert'; @Injectable({ providedIn: 'root' @@ -25,7 +26,8 @@ export class IosPlatformService { private readonly platform: Platform, private readonly uiHelper: UIHelper, private readonly uiSettingsStorage: UISettingsStorage, - private readonly uiBrewStorage: UIBrewStorage) { + private readonly uiBrewStorage: UIBrewStorage, + private readonly uiAlert: UIAlert) { if (this.platform.is('cordova') && this.platform.is('ios')) { this.uiHelper.isBeanconqurorAppReady().then(() => { @@ -80,6 +82,7 @@ export class IosPlatformService { } public async checkIOSBackup() { try { + const promise = new Promise(async(resolve, reject) => { if (this.platform.is('cordova') && this.platform.is('ios')) { this.uiLog.log('iOS-Platform - Check IOS Backup'); @@ -88,18 +91,34 @@ export class IosPlatformService { if (!hasData) { this.uiLog.log('iOS-Platform - Check IOS Backup - No data are stored yet inside the app, so we try to find a backup file - maybe its an iCloud installation'); // If we don't got any data, we check now if there is a Beanconqueror.json saved. - this.uiFileHelper.getJSONFile('Beanconqueror.json').then((_json) => { + this.uiFileHelper.getJSONFile('Beanconqueror.json').then(async (_json) => { + await this.uiAlert.showLoadingSpinner(); this.uiLog.log('iOS-Platform - We found an iCloud backup, try to import'); - this.uiStorage.import(_json).then(() => { + this.uiStorage.import(_json).then(async () => { this.uiLog.log('iOS-Platform sucessfully imported iCloud Backup'); + setTimeout(() => { + this.uiAlert.hideLoadingSpinner(); + },150); + resolve(null); },() => { this.uiLog.error('iOS-Platform could not import iCloud Backup'); + setTimeout(() => { + this.uiAlert.hideLoadingSpinner(); + },150); + resolve(null); }); }, () => { this.uiLog.log('iOS-Platform - Check IOS Backup - We couldnt retrieve any file'); + resolve(null); }); + } else { + resolve(null); } + } else { + resolve(null); } + }); + return promise; }catch(ex) { } From ab593717f26ca847af3fa036b5c5fd2316fb3610 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Tue, 31 May 2022 21:40:06 +0200 Subject: [PATCH 11/78] Backup fixings woop woop --- src/assets/i18n/de.json | 4 ---- src/assets/i18n/en.json | 4 ---- src/assets/i18n/es.json | 4 ---- src/classes/version/iVersion.ts | 2 +- 4 files changed, 1 insertion(+), 13 deletions(-) diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 289de73c9..9186af3eb 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -722,10 +722,6 @@ "6.1.5": { "TITLE": "Version 6.1.5: Das ist neu", "DESCRIPTION": [ - "Android - Achtung", - "Falls die App leer gestartet wurde und du vorher Daten hattest, bitte geh in die Einstellungen, und importiere unter 'Download/Beanconqueror_export/Beanconqueror_automatic_export_*.json' * steht für den letzten Zeitstempel das Backup.", - "Alle Daten sollten dann wie gewohnt wieder vorhanden sein, falls nicht schreib mir bitte eine E-Mail: info@beanconqueror.com.", - "", "QR Codes", "Lade die QR-Code Daten der Rösterei nun erneut", "", diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index e67148841..c7f84090f 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -722,10 +722,6 @@ "6.1.5": { "TITLE": "Version 6.1.5: Thats new!", "DESCRIPTION": [ - "Android - Attention", - "If your app started blank and you had data the last time you used the app, please go into settings and import the file below 'Download/Beanconqueror_export/Beanconqueror_automatic_export_*.json' * stands for the latest timestamp, the backup.", - "All datas should then be back as normal, if not please write me an e-mail: info@beanconqueror.com.", - "", "QR Codes", "Reload beans which where scanned via qr-codes", "", diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index 180486d8d..04f2688cb 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -722,10 +722,6 @@ "6.1.5": { "TITLE": "Versión 6.1.5: Ésto es lo nuevo!", "DESCRIPTION": [ - "Android - Attention", - "Si su aplicación comenzó en blanco y tenía datos la última vez que usó la aplicación, ingrese a la configuración e importe el archivo a continuación 'Descargar/Beanconqueror_export/Beanconqueror_automatic_export_*.json' * representa la última marca de tiempo, la copia de seguridad.", - "Todos los datos deberían volver a la normalidad, si no es así, escríbame un correo electrónico: info@beanconqueror.com.", - "", "Códigos QR", "Recargue beans que fueron escaneados a través de códigos qr", "", diff --git a/src/classes/version/iVersion.ts b/src/classes/version/iVersion.ts index 64fd7a100..c8d058f28 100755 --- a/src/classes/version/iVersion.ts +++ b/src/classes/version/iVersion.ts @@ -57,7 +57,7 @@ export class Version implements IVersion { * We dont set this to a variable, else it would be stored in DB and wrongly overwritten */ private getUpdatedVersions() { - return ['5.0.0','5.1.0','5.2.0','5.3.1','5.4.0','6.0.0','6.1.0','6.1.3','6.1.5']; + return ['5.0.0','5.1.0','5.2.0','5.3.1','5.4.0','6.0.0','6.1.0','6.1.5']; } private versionCompare(_actualAppVersion, _updateVersion) { From ba5817dc48ae068fc7f83aa3636dc1c1b3151286 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Fri, 3 Jun 2022 20:44:44 +0200 Subject: [PATCH 12/78] #365 - Hacky implementation for the first pressure popsicle --- src/app/app.component.ts | 17 +- src/app/settings/settings.page.html | 40 ++++ src/app/settings/settings.page.ts | 77 +++++++ src/classes/devices/index.ts | 16 ++ src/classes/devices/popsiclePressure.ts | 87 ++++++++ .../devices/pressureBluetoothDevice.ts | 63 ++++++ src/classes/settings/settings.ts | 11 +- .../brew-brewing/brew-brewing.component.ts | 61 +++++- src/enums/appEvent/appEvent.ts | 3 +- src/interfaces/settings/iSettings.ts | 7 +- .../bleManager/ble-manager.service.ts | 194 ++++++++++++++++-- 11 files changed, 546 insertions(+), 30 deletions(-) create mode 100644 src/classes/devices/popsiclePressure.ts create mode 100644 src/classes/devices/pressureBluetoothDevice.ts diff --git a/src/app/app.component.ts b/src/app/app.component.ts index f92671bfe..88f460bde 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -11,7 +11,7 @@ import { TranslateService } from '@ngx-translate/core'; import { Chart, registerables } from 'chart.js'; /** Third party */ import moment from 'moment'; -import { ScaleType } from 'src/classes/devices'; +import {PressureType, ScaleType} from 'src/classes/devices'; import { Settings } from '../classes/settings/settings'; import LINK_TRACKING from '../data/tracking/linkTracking'; import STARTUP_TRACKING from '../data/tracking/startupTracking'; @@ -471,6 +471,7 @@ export class AppComponent implements AfterViewInit { //#281 - Connect smartscale before checking the startup view this.__connectSmartScale(); + this.__connectPressureDevice(); await this.__checkStartupView(); this.__instanceAppRating(); @@ -493,6 +494,20 @@ export class AppComponent implements AfterViewInit { } + + private __connectPressureDevice() { + const settings = this.uiSettingsStorage.getSettings(); + const pressure_id: string = settings.pressure_id; + const pressure_type: PressureType = settings.pressure_type; + this.uiLog.log(`Connect pressure device? ${pressure_id}`); + if (pressure_id !== undefined && pressure_id !== '') { + this.bleManager.autoConnectPressureDevice(pressure_type, pressure_id, true); + } else { + this.uiLog.log('Pressure device not connected, dont try to connect'); + } + + } + private __attachOnDevicePause() { this.platform.pause.subscribe(async () => { const settings: Settings = this.uiSettingsStorage.getSettings(); diff --git a/src/app/settings/settings.page.html b/src/app/settings/settings.page.html index 7146d8c88..ace19725b 100644 --- a/src/app/settings/settings.page.html +++ b/src/app/settings/settings.page.html @@ -18,6 +18,10 @@ {{"PAGE_SETTINGS_TAB_BLUETOOTH_SCALE" | translate }} + + {{"PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE" | translate }} + +
@@ -282,6 +286,42 @@

{{"IGNORE_ANOMALY_VALUES" | translate}}

+
+ + + + {{"PAGE_SETTINGS_TAB_BLUETOOTH_Pressure" | translate }} + + + +

{{"CONNECT" | translate}}

+ +
+ +

{{"RETRY_CONNECT" | translate}}

+ +
+ +

{{"DISCONNECT" | translate}}

+ +
+ + + +

{{"PRESSURE_LOG" | translate}}

+ +
+ +
+ + +

{{"SCALE.INFORMATION_DESCRIPTION" | translate}}

+
+
+ +
+
diff --git a/src/app/settings/settings.page.ts b/src/app/settings/settings.page.ts index ec4164894..a0b0d9b14 100644 --- a/src/app/settings/settings.page.ts +++ b/src/app/settings/settings.page.ts @@ -167,6 +167,54 @@ export class SettingsPage implements OnInit { } + public async findAndConnectPressureDevice(_retry: boolean = false) { + const hasLocationPermission: boolean = await this.bleManager.hasLocationPermission(); + if (!hasLocationPermission) { + await this.uiAlert.showMessage('SCALE.REQUEST_PERMISSION.LOCATION', undefined, undefined, true); + await this.bleManager.requestLocationPermissions(); + } + + const hasBluetoothPermission: boolean = await this.bleManager.hasBluetoothPermission(); + if (!hasBluetoothPermission) { + await this.uiAlert.showMessage('SCALE.REQUEST_PERMISSION.BLUETOOTH', undefined, undefined, true); + await this.bleManager.requestBluetoothPermissions(); + } + + + const bleEnabled: boolean = await this.bleManager.isBleEnabled(); + if (bleEnabled === false) { + await this.uiAlert.showMessage('SCALE.BLUETOOTH_NOT_ENABLED', undefined, undefined, true); + return; + } + + + await this.uiAlert.showLoadingSpinner(); + this.uiAlert.setLoadingSpinnerMessage('SCALE.BLUETOOTH_SCAN_RUNNING', true); + const pressureDevice = await this.bleManager.tryToFindPressureDevice(); + if (pressureDevice) { + await this.uiAlert.hideLoadingSpinner(); + try { + // We don't need to retry for iOS, because we just did scan before. + + // NEVER!!! Await here, else the bluetooth logic will get broken. + this.bleManager.autoConnectPressureDevice(pressureDevice.type, pressureDevice.id, false); + } catch(ex) { + + } + + this.settings.pressure_id = pressureDevice.id; + this.settings.pressure_type = pressureDevice.type; + + //this.uiAnalytics.trackEvent(SETTINGS_TRACKING.TITLE, SETTINGS_TRACKING.ACTIONS.SCALE.CATEGORY,scale.type); + + await this.saveSettings(); + + } else { + await this.uiAlert.hideLoadingSpinner(); + this.uiAlert.showMessage('SCALE.CONNECTION_NOT_ESTABLISHED', undefined, undefined, true); + } + } + public async findAndConnectScale(_retry: boolean = false) { const hasLocationPermission: boolean = await this.bleManager.hasLocationPermission(); if (!hasLocationPermission) { @@ -234,6 +282,29 @@ export class SettingsPage implements OnInit { } } + + public async disconnectPressureDevice() { + this.eventQueue.dispatch(new AppEvent(AppEventType.BLUETOOTH_PRESSURE_DEVICE_DISCONNECT, undefined)); + let disconnected: boolean = true; + + //if scale is connected, we try to disconnect, if scale is not connected, we just forget scale :) + if (this.settings.pressure_id !== '' && this.bleManager.getPressureDevice()) { + disconnected = await this.bleManager.disconnectPressureDevice(this.settings.pressure_id); + } + + if (disconnected) { + this.settings.pressure_id = ''; + this.settings.pressure_type = null; + await this.saveSettings(); + } + } + + + + + public async retryConnectPressureDevice() { + await this.findAndConnectPressureDevice(true); + } public async retryConnectScale() { await this.findAndConnectScale(true); } @@ -242,6 +313,12 @@ export class SettingsPage implements OnInit { return this.bleManager.getScale() !== null; } + public isPressureDeviceConnected(): boolean { + return this.bleManager.pressureDevice !== null; + } + + + public async checkWaterSection() { if (this.settings.show_water_section === false) { diff --git a/src/classes/devices/index.ts b/src/classes/devices/index.ts index 77e006573..6dd832016 100644 --- a/src/classes/devices/index.ts +++ b/src/classes/devices/index.ts @@ -5,6 +5,8 @@ import DecentScale from './decentScale'; import FelicitaScale from './felicitaScale'; import JimmyScale from './jimmyScale'; import LunarScale from './lunarScale'; +import {PressureDevice} from './pressureBluetoothDevice'; +import PopsiclePressure from './popsiclePressure'; export { BluetoothScale, SCALE_TIMER_COMMAND } from './bluetoothDevice'; export { default as DecentScale } from './decentScale'; @@ -18,6 +20,10 @@ export enum ScaleType { FELICITA = 'FELICITA', } +export enum PressureType { + POPSICLE = 'POPSICLE' +} + export function makeDevice(type: ScaleType, data: PeripheralData, platforms: Platforms[]): BluetoothScale { switch (type) { case ScaleType.DECENT: @@ -32,3 +38,13 @@ export function makeDevice(type: ScaleType, data: PeripheralData, platforms: Pla return null; } } + +export function makePressureDevice(type: PressureType, data: PeripheralData, platforms: Platforms[]): PressureDevice { + switch (type) { + case PressureType.POPSICLE: + return new PopsiclePressure(data, platforms); + default: + return null; + } +} + diff --git a/src/classes/devices/popsiclePressure.ts b/src/classes/devices/popsiclePressure.ts new file mode 100644 index 000000000..54c24431f --- /dev/null +++ b/src/classes/devices/popsiclePressure.ts @@ -0,0 +1,87 @@ +import { Platforms } from '@ionic/core'; +import {PeripheralData} from './ble.types'; + +import {PressureDevice, Pressure} from './pressureBluetoothDevice'; + +declare var ble; +export default class PopsiclePressure extends PressureDevice { + public static WRITE_SERVICE_UUID = 'fff0'; + public static WRITE_CHAR_UUID = '36f5'; + + public static READ_SERVICE_UUID = 'fff0'; + public static READ_CHAR_UUID = 'fff4'; + + + public static HEADER = 0x03; + + + private buffer: Uint8Array; + + protected Pressure: Pressure = { + actual: 0, + old: 0, + }; + + public static notification_callback(event, scale) { + + } + + public static test(device) { + return device && device.name && device.name.toLowerCase().startsWith('popsicle'); + } + + constructor(data: PeripheralData, platforms: Platforms[]) { + super(data, platforms); + this.buffer = new Uint8Array(); + this.connect(); + } + + private getXOR(_bytes) { + return _bytes[0] ^ _bytes[1] ^ _bytes[2] ^ _bytes[3] ^ _bytes[4] ^ _bytes[5]; + } + + + + public async connect() { + + await this.attachNotification(); + } + + + + + public getPressure() { + return this.pressure.actual; + } + + + public getOldPressure() { + return this.pressure.old; + } + + private async attachNotification() { + ble.startNotification(this.device_id, PopsiclePressure.READ_SERVICE_UUID, PopsiclePressure.READ_CHAR_UUID, + async (_data) => { + const scaleData = new Int8Array(_data); + const uScaleData = new Uint8Array(_data); + + //You need to do the magic here to get the pressure information + this.setPressure(1); + + + }, (_data) => { + + } + ); + } + + private async deattachNotification() { + ble.stopNotification(this.device_id, PopsiclePressure.READ_SERVICE_UUID, PopsiclePressure.READ_CHAR_UUID, + (e) => { + + }, + (e) => { + + }); + } +} diff --git a/src/classes/devices/pressureBluetoothDevice.ts b/src/classes/devices/pressureBluetoothDevice.ts new file mode 100644 index 000000000..2a4199936 --- /dev/null +++ b/src/classes/devices/pressureBluetoothDevice.ts @@ -0,0 +1,63 @@ +import { Platforms } from '@ionic/core'; +import { PeripheralData } from './ble.types'; + +declare var ble; + +import { EventEmitter } from '@angular/core'; + +export interface Pressure { + actual: number; + old: number; +} +export interface PressureChangeEvent extends Pressure { + date: Date; +} +export class PressureDevice { + public device_id: string; + protected pressure: Pressure; + protected platforms: Platforms[]; + public batteryLevel: number; + + public pressureChange: EventEmitter = new EventEmitter(); + + constructor(data: PeripheralData, platforms: Platforms[]) { + this.device_id = data.id; + this.platforms = platforms; + } + + public async connect() { + } + + + + public getPressure(): number { + return null; + } + + + public getOldPressure(): number { + return 0; + } + + /** + * Disconnect is triggered because the bluetooth was turned off, battery shutdown, or something went broken. + */ + public disconnectTriggered(): void { + + } + + protected setPressure(_newPressure: number) { + + this.pressure.actual = _newPressure; + const actualDate = new Date(); + this.pressureChange.emit({ + actual: this.pressure.actual, + old: this.pressure.old, + date: actualDate, + }); + + this.pressure.old = _newPressure; + } + + +} diff --git a/src/classes/settings/settings.ts b/src/classes/settings/settings.ts index 6051b0721..1bb06daab 100755 --- a/src/classes/settings/settings.ts +++ b/src/classes/settings/settings.ts @@ -1,4 +1,4 @@ -import { ScaleType } from './../devices'; +import {PressureType, ScaleType} from './../devices'; /** Interfaces */ /** Enums */ import {BREW_VIEW_ENUM} from '../../enums/settings/brewView'; @@ -79,13 +79,16 @@ export class Settings implements ISettings { public scale_id: string; public scale_type: ScaleType; public scale_log: boolean; + public bluetooth_scale_stay_connected: boolean; public bluetooth_scale_tare_on_brew: boolean; public bluetooth_scale_tare_on_start_timer: boolean; public bluetooth_ignore_negative_values: boolean; public bluetooth_ignore_anomaly_values: boolean; - + public pressure_id: string; + public pressure_type: PressureType; + public pressure_log: boolean; public currency: string; @@ -200,6 +203,10 @@ export class Settings implements ISettings { this.scale_log = false; + this.pressure_id = ''; + this.pressure_type = null; + this.pressure_log = false; + this.currency = 'EUR'; } diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index 46c80a25d..b0e3b1eac 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -46,6 +46,7 @@ import {UIFileHelper} from '../../../services/uiFileHelper'; import {BrewFlowComponent} from '../../../app/brew/brew-flow/brew-flow.component'; import {ScreenOrientation} from '@ionic-native/screen-orientation/ngx'; import {PreparationTool} from '../../../classes/preparation/preparationTool'; +import {PressureDevice} from '../../../classes/devices/pressureBluetoothDevice'; declare var cordova; @@ -110,6 +111,8 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { private startingFlowTime: number = undefined; private brewFlowGraphSubject: EventEmitter = new EventEmitter(); + public pressureDeviceSubscription: Subscription = undefined; + constructor(private readonly platform: Platform, private readonly uiSettingsStorage: UISettingsStorage, private readonly uiPreparationStorage: UIPreparationStorage, @@ -192,6 +195,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.__connectSmartScale(false); } else { this.deattachToWeightChange(); + this.deattachToPressureChange(); this.deattachToScaleEvents(); this.flowProfileChartEl.options.scales.x.realtime.pause = true; @@ -217,6 +221,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { if (this.smartScaleConnected()) { this.deattachToWeightChange(); + this.deattachToPressureChange(); this.deattachToScaleEvents(); this.initializeFlowChart(); const scale: BluetoothScale = this.bleManager.getScale(); @@ -283,6 +288,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } if (this.timer.isTimerRunning() === true && _firstStart === false) { this.attachToScaleWeightChange(); + this.attachToPressureChange(); } if (this.scaleFlowChangeSubscription) { this.scaleFlowChangeSubscription.unsubscribe(); @@ -379,6 +385,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.flowProfileChartEl = undefined; } this.deattachToWeightChange(); + this.deattachToPressureChange(); this.deattachToScaleEvents(); } @@ -414,6 +421,16 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { }); } } + public attachToPressureChange() { + const pressureDevice: PressureDevice = this.bleManager.getPressureDevice(); + if (pressureDevice) { + this.deattachToPressureChange(); + + this.pressureDeviceSubscription = pressureDevice.pressureChange.subscribe((_val) => { + this.__setPressureFlow(_val); + }); + } + } private getActualBluetoothWeight() { try { @@ -493,14 +510,15 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { }; const pressureEnabled: boolean = false; - if (pressureEnabled) { + const pressureDevice = this.bleManager.getPressureDevice(); + if (pressureDevice!= null || !this.platform.is('cordova')) { drinkingData.datasets.push( { - label: this.translate.instant('BREW_FLOW_WEIGHT_PER_SECOND'), + label: this.translate.instant('PRESSURE'), data: [], borderColor: 'rgb(132,42,37)', backgroundColor: 'rgb(189,61,53)', - yAxisID: 'y2', + yAxisID: 'y3', spanGaps: true, pointRadius: 0, tension: 0, @@ -594,7 +612,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } }; - if (pressureEnabled) { + if (pressureDevice != null || !this.platform.is('cordova')) { chartOptions.scales['y3'] = { type: 'linear', display: true, @@ -648,6 +666,14 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } } + public deattachToPressureChange() { + if (this.pressureDeviceSubscription) { + this.pressureDeviceSubscription.unsubscribe(); + this.pressureDeviceSubscription = undefined; + } + + } + public shallFlowProfileBeHidden(): boolean { if (this.smartScaleConnected() === true) { @@ -735,10 +761,11 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { public async timerStarted(_event) { const scale: BluetoothScale = this.bleManager.getScale(); -/*** +/** let weight=0; let realtime_flow = 0; let flow = 0; + let pressure = 0; this.startingFlowTime = Date.now(); this.flowProfileChartEl.options.scales.x.realtime.pause = false; const startingDay = moment(new Date()).startOf('day'); @@ -753,6 +780,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { flow = Math.floor(Math.random() * 11); realtime_flow = Math.floor(Math.random() * 11); weight = weight + Math.floor(Math.random() * 11); + pressure = Math.floor(Math.random() * 11); const flowObj= { unixTime: moment(new Date()).startOf('day').add('milliseconds',Date.now() - this.startingFlowTime).toDate().getTime(), weight: weight, @@ -768,9 +796,12 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.flowProfileChartEl.data.datasets[2].data.push( {x: flowObj.unixTime, y: flowObj.realtime_flow} ); + this.flowProfileChartEl.data.datasets[3].data.push( + {x: flowObj.unixTime, y: pressure} + ); this.flowProfileChartEl.update('quite'); },100); -*/ +**/ if (scale) { if (this.settings.bluetooth_scale_tare_on_start_timer === true) { await scale.tare(); @@ -790,6 +821,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.attachToScaleWeightChange(); + this.attachToPressureChange(); } } @@ -818,6 +850,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.flowProfileChartEl.update('quiet'); this.attachToScaleWeightChange(); + this.attachToPressureChange(); } } @@ -829,6 +862,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { await scale.setTimer(SCALE_TIMER_COMMAND.STOP); this.deattachToWeightChange(); + this.deattachToPressureChange(); this.flowProfileChartEl.options.scales.x.realtime.pause = true; this.flowProfileChartEl.update('quiet'); @@ -863,6 +897,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { }); this.deattachToWeightChange(); + this.deattachToPressureChange(); if (this.isEdit) { @@ -1046,6 +1081,20 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } + private __setPressureFlow(_pressure: any) { + //Nothing for storing etc. is done here actually + const actual: number = _pressure.actual; + const old: number =_pressure.old; + const actualUnixTime: number = moment(new Date()).startOf('day').add('milliseconds',Date.now() - this.startingFlowTime).toDate().getTime(); + const pressureObj= { + unixTime:actualUnixTime, + actual: actual, + old: old, + flowTime: this.flowTime, + flowTimeSecond: this.flowTime + '.' + this.flowSecondTick, + }; + this.flowProfileChartEl.data.datasets[3].data.push({x: pressureObj.unixTime, y: pressureObj.actual}); + } private __setFlowProfile(_scaleChange: any) { diff --git a/src/enums/appEvent/appEvent.ts b/src/enums/appEvent/appEvent.ts index 638ed7ee4..e5d0dbd82 100644 --- a/src/enums/appEvent/appEvent.ts +++ b/src/enums/appEvent/appEvent.ts @@ -1,4 +1,5 @@ export enum AppEventType { STORAGE_CHANGED = 'STORAGE_CHANGED', - BLUETOOTH_SCALE_DISCONNECT = 'BLUETOOTH_SCALE_DISCONNECT' + BLUETOOTH_SCALE_DISCONNECT = 'BLUETOOTH_SCALE_DISCONNECT', + BLUETOOTH_PRESSURE_DEVICE_DISCONNECT = 'BLUETOOTH_PRESSURE_DEVICE_DISCONNECT' } diff --git a/src/interfaces/settings/iSettings.ts b/src/interfaces/settings/iSettings.ts index 557d7374e..35aa504c4 100755 --- a/src/interfaces/settings/iSettings.ts +++ b/src/interfaces/settings/iSettings.ts @@ -1,4 +1,4 @@ -import { ScaleType } from './../../classes/devices'; +import {PressureType, ScaleType} from './../../classes/devices'; /** Interfaces */ /** Enums */ import {BREW_VIEW_ENUM} from '../../enums/settings/brewView'; @@ -79,5 +79,10 @@ export interface ISettings { bluetooth_ignore_negative_values: boolean; bluetooth_ignore_anomaly_values: boolean; + + pressure_id: string; + pressure_type: PressureType; + pressure_log: boolean; + currency: string; } diff --git a/src/services/bleManager/ble-manager.service.ts b/src/services/bleManager/ble-manager.service.ts index db5abc721..0115e983a 100644 --- a/src/services/bleManager/ble-manager.service.ts +++ b/src/services/bleManager/ble-manager.service.ts @@ -1,7 +1,15 @@ import { Platforms } from '@ionic/core'; import {PeripheralData} from '../../classes/devices/ble.types'; import {Injectable} from '@angular/core'; -import {BluetoothScale, ScaleType, makeDevice, LunarScale, DecentScale, JimmyScale} from '../../classes/devices'; +import { + BluetoothScale, + ScaleType, + makeDevice, + LunarScale, + DecentScale, + JimmyScale, + PressureType, makePressureDevice +} from '../../classes/devices'; import {Platform} from '@ionic/angular'; import {UILog} from '../uiLog'; import {UIToast} from '../uiToast'; @@ -9,6 +17,8 @@ import {AndroidPermissions} from '@ionic-native/android-permissions/ngx'; import {Observable, Subject} from 'rxjs'; import {UIHelper} from '../uiHelper'; import FelicitaScale from '../../classes/devices/felicitaScale'; +import PopsiclePressure from '../../classes/devices/popsiclePressure'; +import {PressureDevice} from '../../classes/devices/pressureBluetoothDevice'; declare var ble; @@ -19,7 +29,7 @@ declare var window; }) export class BleManagerService { public scale: BluetoothScale = null; - public scales; + public pressureDevice: PressureDevice = null; public failed: boolean; public ready: boolean; @@ -30,8 +40,6 @@ export class BleManagerService { private readonly uiToast: UIToast, private androidPermissions: AndroidPermissions, private readonly uiHelper: UIHelper) { - - this.scales = []; this.failed = false; this.ready = true; } @@ -117,14 +125,6 @@ export class BleManagerService { } public async scanDevices(): Promise> { - if (this.platform.is('android')) { - /** await this.bluetoothle.requestPermission().then(() => { - }).catch(() => { - }); - await this.bluetoothle.requestLocation().then(() => { - }).catch(() => { - });**/ - } return new Promise>((resolve, reject) => { const devices: Array = []; @@ -162,6 +162,43 @@ export class BleManagerService { }); } + public async scanPressureDevices(): Promise> { + + return new Promise>((resolve, reject) => { + const devices: Array = []; + + let timeoutVar: any = null; + const stopScanningAndResolve = async () => { + try { + await this.stopScanning(); + } catch(ex) { + // Grab error. + } + + this.uiLog.log('Pressure devices found ' + JSON.stringify(devices)); + resolve(devices); + }; + + + ble.startScan([], async (device) => { + this.uiLog.log('Pressure devices found ' + JSON.stringify(device)); + if (PopsiclePressure.test(device)) { + // We found all needed devices. + devices.push(device); + + this.uiLog.log('Supported pressure devices found ' + JSON.stringify(device)); + clearTimeout(timeoutVar); + timeoutVar = null; + await stopScanningAndResolve(); + } + }, () => { + resolve(devices); + }); + timeoutVar = setTimeout(async () => { + await stopScanningAndResolve(); + }, 60000); + }); + } public disconnect(deviceId: string, show_toast: boolean = true): Promise { return new Promise((resolve, reject) => { ble.disconnect(deviceId, () => { @@ -175,6 +212,19 @@ export class BleManagerService { }); }); } + public disconnectPressureDevice(deviceId: string, show_toast: boolean = true): Promise { + return new Promise((resolve, reject) => { + ble.disconnect(deviceId, () => { + this.pressureDevice = null; + if (show_toast) { + this.uiToast.showInfoToast('SCALE.DISCONNECTED_SUCCESSFULLY'); + } + resolve(true); + }, () => { + resolve(false); + }); + }); + } public isBleEnabled(): Promise { return new Promise((resolve, reject) => { @@ -193,6 +243,22 @@ export class BleManagerService { return this.scale; } + public getPressureDevice() { + return this.pressureDevice; + } + + public getPressure() { + try { + if (this.pressureDevice) { + return this.uiHelper.toFixedIfNecessary(this.pressureDevice.getPressure(),2); + } + return 0; + + }catch(ex) { + return 0; + } + } + public getScaleWeight() { try { if (this.scale) { @@ -234,6 +300,36 @@ export class BleManagerService { }); } + private async __scanAutoConnectPressureDeviceIOS() { + return new Promise(async (resolve, reject) => { + if (this.platform.is('ios')) { + // We just need to scan, then we can auto connect for iOS (lol) + this.uiLog.log('Try to find pressure on iOS'); + const device = await this.tryToFindPressureDevice(); + if (device === undefined) { + this.uiLog.log('Pressure device not found, retry'); + // Try every 61 seconds, because the search algorythm goes 60 seconds at all. + const intV = setInterval(async () => { + const pressureStub = await this.tryToFindPressureDevice(); + if (pressureStub !== undefined) { + resolve(true); + clearInterval(intV); + } else { + this.uiLog.log('Pressure device not found, retry'); + } + }, 61000); + } else { + resolve(true); + } + + } else { + resolve(true); + } + }); + + } + + public async tryToFindScale() { return new Promise<{ id: string, type: ScaleType }>(async (resolve, reject) => { @@ -265,28 +361,49 @@ export class BleManagerService { }); } - private async __iOSAccessBleStackAndAutoConnect() { + public async tryToFindPressureDevice() { + return new Promise<{ id: string, type: PressureType }>(async (resolve, reject) => { + const devices: Array = await this.scanPressureDevices(); + this.uiLog.log('BleManager - Loop through pressure devices'); + for (const device of devices) { + if (PopsiclePressure.test(device)) { + this.uiLog.log('BleManager - We found a popsicle pressure device '); + resolve({id: device.id, type: PressureType.POPSICLE}); + return; + } + } + resolve(undefined); + }); + } + private async __iOSAccessBleStackAndAutoConnect(_findPressureDevice: boolean=false) { return await new Promise((resolve) => { let counter: number = 1; const iOSScanInterval = setInterval(async() => { try { - this.uiLog.log('AutoConnectScale - Try to get bluetooth state'); + this.uiLog.log('__iOSAccessBleStackAndAutoConnect - Try to get bluetooth state'); const enabled: boolean = await this.isBleEnabled(); if (enabled === true) { clearInterval(iOSScanInterval); - await this.__scanAutoConnectScaleIOS(); - this.uiLog.log('AutoConnectScale - Scale for iOS found, resolve now'); + if (_findPressureDevice === false){ + await this.__scanAutoConnectScaleIOS(); + this.uiLog.log('__iOSAccessBleStackAndAutoConnect - Scale for iOS found, resolve now'); + } else { + await this.__scanAutoConnectPressureDeviceIOS(); + this.uiLog.log('__iOSAccessBleStackAndAutoConnect - Pressure devices for iOS found, resolve now'); + } + + resolve(null); } else { - this.uiLog.log('AutoConnectScale - Bluetooth not enabled, try again'); + this.uiLog.log('__iOSAccessBleStackAndAutoConnect - Bluetooth not enabled, try again'); } } catch (ex) { - this.uiLog.log('AutoConnectScale - Bluetooth error occured ' + JSON.stringify(ex)); + this.uiLog.log('__iOSAccessBleStackAndAutoConnect - Bluetooth error occured ' + JSON.stringify(ex)); } counter ++; if (counter > 10) { - this.uiLog.log('AutoConnectScale - iOS - Stop after 10 tries'); + this.uiLog.log('__iOSAccessBleStackAndAutoConnect - iOS - Stop after 10 tries'); clearInterval(iOSScanInterval); resolve(null); } @@ -309,6 +426,20 @@ export class BleManagerService { }); } + public async autoConnectPressureDevice(pressureType: PressureType, deviceId: string, _retryScanForIOS: boolean = false) { + if (_retryScanForIOS) { + // iOS needs to know the scale, before auto connect can be done + await this.__iOSAccessBleStackAndAutoConnect(true); + } + + this.uiLog.log('AutoConnectPressureDevice - We can start or we waited for iOS'); + + return new Promise((resolve, reject) => { + this.uiLog.log('AutoConnectPressureDevice - We created our promise, and try to autoconnect to device now.'); + ble.autoConnect(deviceId, this.connectPressureCallback.bind(this, resolve, pressureType), this.disconnectPressureCallback.bind(this, reject)); + }); + } + private connectCallback(callback, deviceType: ScaleType, data: PeripheralData) { // wait for full data if (!this.scale || 'characteristics' in data) { @@ -333,4 +464,29 @@ export class BleManagerService { //Send disconnect callback, even if scale is already null/not existing anymore this.__sendEvent('DISCONNECT'); } + + private connectPressureCallback(callback, pressureTaype: PressureType, data: PeripheralData) { + // wait for full data + if (!this.pressureDevice || 'characteristics' in data) { + this.pressureDevice = makePressureDevice(pressureTaype, data, this.platform.platforms() as Platforms[]); + this.uiLog.log('Pressure Connected successfully'); + this.uiToast.showInfoToast('PRESSURE.CONNECTED_SUCCESSFULLY'); + callback(); + this.__sendEvent('CONNECT'); + } + } + + + private disconnectPressureCallback(callback) { + if (this.scale) { + this.pressureDevice.disconnectTriggered(); + this.pressureDevice = null; + this.uiToast.showInfoToast('PRESSURE.DISCONNECTED_UNPLANNED'); + this.uiLog.log('Disconnected successfully'); + callback(); + + } + //Send disconnect callback, even if scale is already null/not existing anymore + this.__sendEvent('DISCONNECT'); + } } From 60b5ea5c0f7a6dc861ffb3f776e268eb27f2dce1 Mon Sep 17 00:00:00 2001 From: Mikael Manukyan Date: Thu, 16 Jun 2022 05:05:24 -0700 Subject: [PATCH 13/78] Add initial implementation for Popsicle (#373) --- package.json | 7 +- src/classes/devices/popsiclePressure.ts | 98 +- .../devices/pressureBluetoothDevice.ts | 31 +- .../brew-brewing/brew-brewing.component.ts | 1036 ++++++++++------- 4 files changed, 669 insertions(+), 503 deletions(-) diff --git a/package.json b/package.json index 6d34a7cda..d5f53c671 100644 --- a/package.json +++ b/package.json @@ -131,6 +131,7 @@ "karma-coverage-istanbul-reporter": "~3.0.2", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.5.0", + "prettier": "^2.6.2", "protractor": "~7.0.0", "skwas-cordova-plugin-datetimepicker": "^2.1.2", "stylelint": "^13.12.0", @@ -228,5 +229,9 @@ "platforms": [ "android", "ios" - ] + ], + "prettier": { + "singleQuote": true, + "semi": true + } } diff --git a/src/classes/devices/popsiclePressure.ts b/src/classes/devices/popsiclePressure.ts index 54c24431f..83b64c233 100644 --- a/src/classes/devices/popsiclePressure.ts +++ b/src/classes/devices/popsiclePressure.ts @@ -1,87 +1,83 @@ import { Platforms } from '@ionic/core'; -import {PeripheralData} from './ble.types'; +import { PeripheralData } from './ble.types'; -import {PressureDevice, Pressure} from './pressureBluetoothDevice'; +import { Pressure, PressureDevice } from './pressureBluetoothDevice'; declare var ble; export default class PopsiclePressure extends PressureDevice { - public static WRITE_SERVICE_UUID = 'fff0'; - public static WRITE_CHAR_UUID = '36f5'; + public static PRESSURE_SERVICE_UUID = ''; + public static PRESSURE_CHAR_UUID = ''; - public static READ_SERVICE_UUID = 'fff0'; - public static READ_CHAR_UUID = 'fff4'; - - - public static HEADER = 0x03; - - - private buffer: Uint8Array; + public static ZERO_SERVICE_UUID = ''; + public static ZERO_CHAR_UUID = ''; protected Pressure: Pressure = { actual: 0, old: 0, }; - public static notification_callback(event, scale) { - - } + public static notification_callback(event, scale) {} public static test(device) { - return device && device.name && device.name.toLowerCase().startsWith('popsicle'); + return ( + device && device.name && device.name.toLowerCase().startsWith('popsicle') + ); } constructor(data: PeripheralData, platforms: Platforms[]) { super(data, platforms); - this.buffer = new Uint8Array(); this.connect(); } - private getXOR(_bytes) { - return _bytes[0] ^ _bytes[1] ^ _bytes[2] ^ _bytes[3] ^ _bytes[4] ^ _bytes[5]; - } - - - public async connect() { - + this.updateZero(); await this.attachNotification(); } - - - - public getPressure() { - return this.pressure.actual; - } - - - public getOldPressure() { - return this.pressure.old; + public async updateZero(): Promise { + const data = new Uint8Array(1); + + return new Promise((resolve, reject) => { + ble.writeWithoutResponse( + this.device_id, + PopsiclePressure.ZERO_SERVICE_UUID, + PopsiclePressure.ZERO_CHAR_UUID, + data.buffer, + resolve, + reject + ); + }); } private async attachNotification() { - ble.startNotification(this.device_id, PopsiclePressure.READ_SERVICE_UUID, PopsiclePressure.READ_CHAR_UUID, + ble.startNotification( + this.device_id, + PopsiclePressure.PRESSURE_SERVICE_UUID, + PopsiclePressure.PRESSURE_CHAR_UUID, async (_data) => { - const scaleData = new Int8Array(_data); - const uScaleData = new Uint8Array(_data); - - //You need to do the magic here to get the pressure information - this.setPressure(1); - - - }, (_data) => { - - } + const v = new Uint16Array(_data); + const psi = swap16(v[0]) / 10; + this.setPressure(psiToBar(psi)); + }, + (_data) => {} ); } private async deattachNotification() { - ble.stopNotification(this.device_id, PopsiclePressure.READ_SERVICE_UUID, PopsiclePressure.READ_CHAR_UUID, - (e) => { + ble.stopNotification( + this.device_id, + PopsiclePressure.PRESSURE_SERVICE_UUID, + PopsiclePressure.PRESSURE_CHAR_UUID, + (e) => {}, + (e) => {} + ); + } +} - }, - (e) => { +function psiToBar(v: number) { + return v * 0.0689476; +} - }); - } +function swap16(val) { + return ((val & 0xff) << 8) | ((val >> 8) & 0xff); } diff --git a/src/classes/devices/pressureBluetoothDevice.ts b/src/classes/devices/pressureBluetoothDevice.ts index 2a4199936..99bac2e64 100644 --- a/src/classes/devices/pressureBluetoothDevice.ts +++ b/src/classes/devices/pressureBluetoothDevice.ts @@ -1,17 +1,18 @@ import { Platforms } from '@ionic/core'; import { PeripheralData } from './ble.types'; +import { EventEmitter } from '@angular/core'; declare var ble; -import { EventEmitter } from '@angular/core'; - export interface Pressure { actual: number; old: number; } + export interface PressureChangeEvent extends Pressure { date: Date; } + export class PressureDevice { public device_id: string; protected pressure: Pressure; @@ -23,33 +24,33 @@ export class PressureDevice { constructor(data: PeripheralData, platforms: Platforms[]) { this.device_id = data.id; this.platforms = platforms; + this.pressure = { + actual: 0, + old: 0, + }; } - public async connect() { - } - + public async connect() {} + public async updateZero() {} - public getPressure(): number { - return null; + public getPressure() { + return this.pressure.actual; } - - public getOldPressure(): number { - return 0; + public getOldPressure() { + return this.pressure.old; } /** * Disconnect is triggered because the bluetooth was turned off, battery shutdown, or something went broken. */ - public disconnectTriggered(): void { - - } + public disconnectTriggered(): void {} protected setPressure(_newPressure: number) { - this.pressure.actual = _newPressure; const actualDate = new Date(); + this.pressureChange.emit({ actual: this.pressure.actual, old: this.pressure.old, @@ -58,6 +59,4 @@ export class PressureDevice { this.pressure.old = _newPressure; } - - } diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index b0e3b1eac..26e07eb95 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -7,47 +7,49 @@ import { Input, OnInit, Output, - ViewChild + ViewChild, } from '@angular/core'; -import {NgxStarsComponent} from 'ngx-stars'; -import {Brew} from '../../../classes/brew/brew'; -import {Preparation} from '../../../classes/preparation/preparation'; +import { NgxStarsComponent } from 'ngx-stars'; +import { Brew } from '../../../classes/brew/brew'; +import { Preparation } from '../../../classes/preparation/preparation'; import moment from 'moment'; -import {Settings} from '../../../classes/settings/settings'; -import {ModalController, Platform} from '@ionic/angular'; -import {DatetimePopoverComponent} from '../../../popover/datetime-popover/datetime-popover.component'; -import {PREPARATION_STYLE_TYPE} from '../../../enums/preparations/preparationStyleTypes'; -import {BREW_QUANTITY_TYPES_ENUM} from '../../../enums/brews/brewQuantityTypes'; -import {UISettingsStorage} from '../../../services/uiSettingsStorage'; -import {UIPreparationStorage} from '../../../services/uiPreparationStorage'; -import {TranslateService} from '@ngx-translate/core'; -import {UIBrewHelper} from '../../../services/uiBrewHelper'; -import {BrewTimerComponent} from '../../brew-timer/brew-timer.component'; -import {TimerComponent} from '../../timer/timer.component'; -import {IPreparation} from '../../../interfaces/preparation/iPreparation'; -import {IBean} from '../../../interfaces/bean/iBean'; -import {IMill} from '../../../interfaces/mill/iMill'; -import {UIBrewStorage} from '../../../services/uiBrewStorage'; -import {UIMillStorage} from '../../../services/uiMillStorage'; -import {UIBeanStorage} from '../../../services/uiBeanStorage'; -import {UIWaterStorage} from '../../../services/uiWaterStorage'; -import {BrewBrixCalculatorComponent} from '../../../app/brew/brew-brix-calculator/brew-brix-calculator.component'; +import { Settings } from '../../../classes/settings/settings'; +import { ModalController, Platform } from '@ionic/angular'; +import { DatetimePopoverComponent } from '../../../popover/datetime-popover/datetime-popover.component'; +import { PREPARATION_STYLE_TYPE } from '../../../enums/preparations/preparationStyleTypes'; +import { BREW_QUANTITY_TYPES_ENUM } from '../../../enums/brews/brewQuantityTypes'; +import { UISettingsStorage } from '../../../services/uiSettingsStorage'; +import { UIPreparationStorage } from '../../../services/uiPreparationStorage'; +import { TranslateService } from '@ngx-translate/core'; +import { UIBrewHelper } from '../../../services/uiBrewHelper'; +import { BrewTimerComponent } from '../../brew-timer/brew-timer.component'; +import { TimerComponent } from '../../timer/timer.component'; +import { IPreparation } from '../../../interfaces/preparation/iPreparation'; +import { IBean } from '../../../interfaces/bean/iBean'; +import { IMill } from '../../../interfaces/mill/iMill'; +import { UIBrewStorage } from '../../../services/uiBrewStorage'; +import { UIMillStorage } from '../../../services/uiMillStorage'; +import { UIBeanStorage } from '../../../services/uiBeanStorage'; +import { UIWaterStorage } from '../../../services/uiWaterStorage'; +import { BrewBrixCalculatorComponent } from '../../../app/brew/brew-brix-calculator/brew-brix-calculator.component'; +import { BrewBeverageQuantityCalculatorComponent } from '../../../app/brew/brew-beverage-quantity-calculator/brew-beverage-quantity-calculator.component'; +import { BleManagerService } from '../../../services/bleManager/ble-manager.service'; +import { Subscription } from 'rxjs'; +import { BluetoothScale, SCALE_TIMER_COMMAND } from '../../../classes/devices'; +import { Chart } from 'chart.js'; +import { UIHelper } from '../../../services/uiHelper'; +import { UIExcel } from '../../../services/uiExcel'; import { - BrewBeverageQuantityCalculatorComponent -} from '../../../app/brew/brew-beverage-quantity-calculator/brew-beverage-quantity-calculator.component'; -import {BleManagerService} from '../../../services/bleManager/ble-manager.service'; -import {Subscription} from 'rxjs'; -import {BluetoothScale, SCALE_TIMER_COMMAND} from '../../../classes/devices'; -import {Chart} from 'chart.js'; -import {UIHelper} from '../../../services/uiHelper'; -import {UIExcel} from '../../../services/uiExcel'; -import {BrewFlow, IBrewRealtimeWaterFlow, IBrewWaterFlow, IBrewWeightFlow} from '../../../classes/brew/brewFlow'; -import {UIFileHelper} from '../../../services/uiFileHelper'; -import {BrewFlowComponent} from '../../../app/brew/brew-flow/brew-flow.component'; -import {ScreenOrientation} from '@ionic-native/screen-orientation/ngx'; -import {PreparationTool} from '../../../classes/preparation/preparationTool'; -import {PressureDevice} from '../../../classes/devices/pressureBluetoothDevice'; - + BrewFlow, + IBrewRealtimeWaterFlow, + IBrewWaterFlow, + IBrewWeightFlow, +} from '../../../classes/brew/brewFlow'; +import { UIFileHelper } from '../../../services/uiFileHelper'; +import { BrewFlowComponent } from '../../../app/brew/brew-flow/brew-flow.component'; +import { ScreenOrientation } from '@ionic-native/screen-orientation/ngx'; +import { PreparationTool } from '../../../classes/preparation/preparationTool'; +import { PressureDevice } from '../../../classes/devices/pressureBluetoothDevice'; declare var cordova; @@ -58,14 +60,17 @@ declare var cordova; }) export class BrewBrewingComponent implements OnInit, AfterViewInit { @ViewChild('timer', { static: false }) public timer: BrewTimerComponent; - @ViewChild('brewTemperatureTime', { static: false }) public brewTemperatureTime: TimerComponent; - @ViewChild('brewStars', { read: NgxStarsComponent, static: false }) public brewStars: NgxStarsComponent; - - @ViewChild('smartScaleWeight', { read: ElementRef }) public smartScaleWeightEl: ElementRef; - @ViewChild('smartScaleWeightPerSecond', { read: ElementRef }) public smartScaleWeightPerSecondEl: ElementRef; - @ViewChild('smartScaleAvgFlowPerSecond', { read: ElementRef }) public smartScaleAvgFlowPerSecondEl: ElementRef; - - + @ViewChild('brewTemperatureTime', { static: false }) + public brewTemperatureTime: TimerComponent; + @ViewChild('brewStars', { read: NgxStarsComponent, static: false }) + public brewStars: NgxStarsComponent; + + @ViewChild('smartScaleWeight', { read: ElementRef }) + public smartScaleWeightEl: ElementRef; + @ViewChild('smartScaleWeightPerSecond', { read: ElementRef }) + public smartScaleWeightPerSecondEl: ElementRef; + @ViewChild('smartScaleAvgFlowPerSecond', { read: ElementRef }) + public smartScaleAvgFlowPerSecondEl: ElementRef; @Input() public data: Brew; @Input() public brewTemplate: Brew; @@ -81,7 +86,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { public maxBrewRating: number = 5; - public preparationMethodHasBeenFocused: boolean = false; public profileResultsAvailable: boolean = false; @@ -92,7 +96,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { public vesselResults: Array = []; public vesselFocused: boolean = false; - public scaleTimerSubscription: Subscription = undefined; public scaleTareSubscription: Subscription = undefined; public scaleFlowSubscription: Subscription = undefined; @@ -113,7 +116,8 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { public pressureDeviceSubscription: Subscription = undefined; - constructor(private readonly platform: Platform, + constructor( + private readonly platform: Platform, private readonly uiSettingsStorage: UISettingsStorage, private readonly uiPreparationStorage: UIPreparationStorage, private readonly translate: TranslateService, @@ -128,21 +132,21 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { private readonly uiHelper: UIHelper, private readonly uiExcel: UIExcel, private readonly uiFileHelper: UIFileHelper, - private readonly screenOrientation: ScreenOrientation) { - - } + private readonly screenOrientation: ScreenOrientation + ) {} public getActivePreparationTools() { - return this.data.getPreparation().tools.filter((e)=>e.archived === false); + return this.data.getPreparation().tools.filter((e) => e.archived === false); } public getChoosenPreparationToolsWhichAreArchived() { const toolIds = this.data.method_of_preparation_tools; const tools: Array = []; for (const id of toolIds) { - - const tool = this.data.getPreparation().tools.find((e) => e.config.uuid === id); - if (tool.archived === true){ + const tool = this.data + .getPreparation() + .tools.find((e) => e.config.uuid === id); + if (tool.archived === true) { tools.push(tool); } } @@ -150,7 +154,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } public async ngAfterViewInit() { - setTimeout(async () => { // If we wouldn't wait in the timeout, the components wouldnt be existing if (this.isEdit === false) { @@ -159,8 +162,15 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { if (this.brewTemplate) { this.__loadBrew(this.brewTemplate, true); } else if (this.loadSpecificLastPreparation) { - - const foundBrews: Array = UIBrewHelper.sortBrews(this.uiBrewStorage.getAllEntries().filter((e) => e.method_of_preparation === this.loadSpecificLastPreparation.config.uuid)); + const foundBrews: Array = UIBrewHelper.sortBrews( + this.uiBrewStorage + .getAllEntries() + .filter( + (e) => + e.method_of_preparation === + this.loadSpecificLastPreparation.config.uuid + ) + ); if (foundBrews.length > 0) { this.__loadBrew(foundBrews[0], false); } else { @@ -170,12 +180,14 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } else { this.__loadLastBrew(); } - } else { if (this.timer) { this.timer.setTime(this.data.brew_time); } - if (this.brewTemperatureTime && this.settings.manage_parameters.brew_temperature_time) { + if ( + this.brewTemperatureTime && + this.settings.manage_parameters.brew_temperature_time + ) { this.brewTemperatureTime.setTime(this.data.brew_temperature_time); } if (this.data.flow_profile !== '') { @@ -189,44 +201,37 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.__connectSmartScale(true); } + this.bluetoothSubscription = this.bleManager + .attachOnEvent() + .subscribe((_type) => { + if (_type && _type.type === 'CONNECT') { + this.__connectSmartScale(false); + } else { + this.deattachToWeightChange(); + this.deattachToPressureChange(); + this.deattachToScaleEvents(); - this.bluetoothSubscription = this.bleManager.attachOnEvent().subscribe((_type) => { - if (_type && _type.type === 'CONNECT') { - this.__connectSmartScale(false); - } else { - this.deattachToWeightChange(); - this.deattachToPressureChange(); - this.deattachToScaleEvents(); - - this.flowProfileChartEl.options.scales.x.realtime.pause = true; - this.flowProfileChartEl.update('quiet'); - - // If scale disconnected, sometimes the timer run but the screen was not refreshed, so maybe it helpes to detect the change. - this.checkChanges(); - - } - }); - + this.flowProfileChartEl.options.scales.x.realtime.pause = true; + this.flowProfileChartEl.update('quiet'); + // If scale disconnected, sometimes the timer run but the screen was not refreshed, so maybe it helpes to detect the change. + this.checkChanges(); + } + }); // Trigger change rating this.changedRating(); }); - } - private async __connectSmartScale(_firstStart: boolean) { - if (this.smartScaleConnected()) { - this.deattachToWeightChange(); this.deattachToPressureChange(); this.deattachToScaleEvents(); this.initializeFlowChart(); const scale: BluetoothScale = this.bleManager.getScale(); if (!this.scaleTimerSubscription) { - this.scaleTimerSubscription = scale.timerEvent.subscribe((event) => { // Timer pressed if (event) { @@ -249,20 +254,21 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } } this.checkChanges(); - }); } if (!this.scaleTareSubscription) { this.scaleTareSubscription = scale.tareEvent.subscribe(() => { // Timer pressed - if (this.data.getPreparation().style_type !== PREPARATION_STYLE_TYPE.ESPRESSO) { + if ( + this.data.getPreparation().style_type !== + PREPARATION_STYLE_TYPE.ESPRESSO + ) { this.data.brew_quantity = 0; } else { this.data.brew_beverage_quantity = 0; } this.checkChanges(); - }); } @@ -284,7 +290,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { resolve(undefined); }, 50); }); - } if (this.timer.isTimerRunning() === true && _firstStart === false) { this.attachToScaleWeightChange(); @@ -295,33 +300,42 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.scaleFlowChangeSubscription = undefined; } this.scaleFlowChangeSubscription = scale.flowChange.subscribe((_val) => { - this.setActualSmartInformation(); }); this.checkChanges(); - - } } public async maximizeFlowGraph() { let actualOrientation; if (this.platform.is('cordova')) { - actualOrientation = this.screenOrientation.type; + actualOrientation = this.screenOrientation.type; } await new Promise(async (resolve) => { this.flowProfileChartEl.update(); if (this.platform.is('cordova')) { - await this.screenOrientation.lock(this.screenOrientation.ORIENTATIONS.LANDSCAPE); + await this.screenOrientation.lock( + this.screenOrientation.ORIENTATIONS.LANDSCAPE + ); } resolve(undefined); }); - const oldCanvasHeight = document.getElementById('canvasContainerBrew').offsetHeight; - const modal = await this.modalController.create({component: BrewFlowComponent, - breakpoints: [0,1], - initialBreakpoint:1, id:BrewFlowComponent.COMPONENT_ID, + const oldCanvasHeight = document.getElementById( + 'canvasContainerBrew' + ).offsetHeight; + const modal = await this.modalController.create({ + component: BrewFlowComponent, + breakpoints: [0, 1], + initialBreakpoint: 1, + id: BrewFlowComponent.COMPONENT_ID, cssClass: 'popover-actions', - componentProps: {brewComponent: this, brew: this.data,flowChartEl: this.flowProfileChartEl,brewFlowGraphEvent: this.brewFlowGraphSubject}}); + componentProps: { + brewComponent: this, + brew: this.data, + flowChartEl: this.flowProfileChartEl, + brewFlowGraphEvent: this.brewFlowGraphSubject, + }, + }); await modal.present(); await modal.onWillDismiss().then(async () => { // If responsive would be true, the add of the container would result into 0 width 0 height, therefore the hack @@ -329,26 +343,34 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.flowProfileChartEl.update(); if (this.platform.is('cordova')) { - if (this.screenOrientation.type === this.screenOrientation.ORIENTATIONS.LANDSCAPE) { - if (this.screenOrientation.ORIENTATIONS.LANDSCAPE === actualOrientation) { + if ( + this.screenOrientation.type === + this.screenOrientation.ORIENTATIONS.LANDSCAPE + ) { + if ( + this.screenOrientation.ORIENTATIONS.LANDSCAPE === actualOrientation + ) { // Get back to portrait await new Promise((resolve) => { setTimeout(async () => { - await this.screenOrientation.lock(this.screenOrientation.ORIENTATIONS.PORTRAIT_PRIMARY); + await this.screenOrientation.lock( + this.screenOrientation.ORIENTATIONS.PORTRAIT_PRIMARY + ); resolve(undefined); }, 50); }); } - } - setTimeout( () => { + setTimeout(() => { this.screenOrientation.unlock(); - },150); + }, 150); } await new Promise((resolve) => { setTimeout(async () => { - document.getElementById('canvasContainerBrew').append(this.flowProfileChartEl.ctx.canvas); + document + .getElementById('canvasContainerBrew') + .append(this.flowProfileChartEl.ctx.canvas); resolve(undefined); }, 50); }); @@ -356,7 +378,8 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { await new Promise((resolve) => { setTimeout(async () => { // If we would not set the old height, the graph would explode to big. - document.getElementById('canvasContainerBrew').style.height = oldCanvasHeight + 'px'; + document.getElementById('canvasContainerBrew').style.height = + oldCanvasHeight + 'px'; this.flowProfileChartEl.options.responsive = true; this.flowProfileChartEl.update(); resolve(undefined); @@ -369,6 +392,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.changeDetectorRef.detectChanges(); window.getComputedStyle(window.document.getElementsByTagName('body')[0]); } + public ngOnDestroy() { // We don't deattach the timer subscription in the deattach toscale events, else we couldn't start anymore. @@ -399,7 +423,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.data.method_of_preparation_tools = []; this.preparationMethodHasBeenFocused = false; } - } public smartScaleConnected() { @@ -421,25 +444,27 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { }); } } + public attachToPressureChange() { const pressureDevice: PressureDevice = this.bleManager.getPressureDevice(); if (pressureDevice) { this.deattachToPressureChange(); - this.pressureDeviceSubscription = pressureDevice.pressureChange.subscribe((_val) => { - this.__setPressureFlow(_val); - }); + this.pressureDeviceSubscription = pressureDevice.pressureChange.subscribe( + (_val) => { + this.__setPressureFlow(_val); + } + ); } } private getActualBluetoothWeight() { try { const scale: BluetoothScale = this.bleManager.getScale(); - return this.uiHelper.toFixedIfNecessary(scale.getWeight(),1); - }catch(ex) { + return this.uiHelper.toFixedIfNecessary(scale.getWeight(), 1); + } catch (ex) { return 0; } - } public bluetoothScaleSetGrindWeight() { @@ -459,12 +484,13 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { if (this.data.vessel_weight > 0) { vesselWeight = this.data.vessel_weight; } - this.data.brew_beverage_quantity = this.uiHelper.toFixedIfNecessary(this.getActualBluetoothWeight() - vesselWeight,2); + this.data.brew_beverage_quantity = this.uiHelper.toFixedIfNecessary( + this.getActualBluetoothWeight() - vesselWeight, + 2 + ); } - private initializeFlowChart(): void { - setTimeout(() => { if (this.flowProfileChartEl) { this.flowProfileChartEl.destroy(); @@ -472,78 +498,80 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.flowTime = undefined; this.flowSecondTick = 0; this.flowProfileArr = []; - this.flowProfileArrObjs= []; + this.flowProfileArrObjs = []; } if (this.flowProfileChartEl === undefined) { - const drinkingData = { labels: [], - datasets: [{ - label: this.translate.instant('BREW_FLOW_WEIGHT'), - data: [], - borderColor: 'rgb(159,140,111)', - backgroundColor: 'rgb(205,194,172)', - yAxisID: 'y', - pointRadius: 0, - tension: 0, - }, - { - label: this.translate.instant('BREW_FLOW_WEIGHT_PER_SECOND'), - data: [], - borderColor: 'rgb(96,125,139)', - backgroundColor: 'rgb(127,151,162)', - yAxisID: 'y1', - spanGaps: true, - pointRadius: 0, - tension: 0, - }, - { - label: this.translate.instant('BREW_FLOW_WEIGHT_REALTIME'), - data: [], - borderColor: 'rgb(144,60,99)', - backgroundColor: 'rgb(191,101,143)', - yAxisID: 'y2', - spanGaps: true, - pointRadius: 0, - tension: 0, - }] - }; - - const pressureEnabled: boolean = false; - const pressureDevice = this.bleManager.getPressureDevice(); - if (pressureDevice!= null || !this.platform.is('cordova')) { - drinkingData.datasets.push( + datasets: [ { - label: this.translate.instant('PRESSURE'), + label: this.translate.instant('BREW_FLOW_WEIGHT'), data: [], - borderColor: 'rgb(132,42,37)', - backgroundColor: 'rgb(189,61,53)', - yAxisID: 'y3', + borderColor: 'rgb(159,140,111)', + backgroundColor: 'rgb(205,194,172)', + yAxisID: 'y', + pointRadius: 0, + tension: 0, + }, + { + label: this.translate.instant('BREW_FLOW_WEIGHT_PER_SECOND'), + data: [], + borderColor: 'rgb(96,125,139)', + backgroundColor: 'rgb(127,151,162)', + yAxisID: 'y1', spanGaps: true, pointRadius: 0, tension: 0, - }); + }, + { + label: this.translate.instant('BREW_FLOW_WEIGHT_REALTIME'), + data: [], + borderColor: 'rgb(144,60,99)', + backgroundColor: 'rgb(191,101,143)', + yAxisID: 'y2', + spanGaps: true, + pointRadius: 0, + tension: 0, + }, + ], + }; + + const pressureEnabled: boolean = false; + const pressureDevice = this.bleManager.getPressureDevice(); + if (pressureDevice != null || !this.platform.is('cordova')) { + drinkingData.datasets.push({ + label: this.translate.instant('PRESSURE'), + data: [], + borderColor: 'rgb(132,42,37)', + backgroundColor: 'rgb(189,61,53)', + yAxisID: 'y3', + spanGaps: true, + pointRadius: 0, + tension: 0, + }); } const startingDay = moment(new Date()).startOf('day'); - //IF brewtime has some seconds, we add this to the delay directly. + // IF brewtime has some seconds, we add this to the delay directly. if (this.data.brew_time > 0) { - startingDay.add('seconds',this.data.brew_time); + startingDay.add('seconds', this.data.brew_time); } const delay = Date.now() - startingDay.toDate().getTime(); - const suggestedMinFlow: number = 0; let suggestedMaxFlow: number = 20; const suggestedMinWeight: number = 0; let suggestedMaxWeight: number = 300; - if (this.data.getPreparation().style_type === PREPARATION_STYLE_TYPE.ESPRESSO) { + if ( + this.data.getPreparation().style_type === + PREPARATION_STYLE_TYPE.ESPRESSO + ) { suggestedMaxFlow = 2.5; suggestedMaxWeight = 30; } const chartOptions = { - animation: false, // disa + animation: false, // disa scales: { x: { type: 'realtime', @@ -556,24 +584,21 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { // data will be automatically deleted as it disappears off the chart ttl: undefined, pause: true, - onRefresh: (chart) => { - - } - + onRefresh: (chart) => {}, }, time: { displayFormats: { - 'millisecond': 'mm:ss', - 'second': 'mm:ss', - 'minute': 'mm:ss', - 'hour': 'mm:ss', - 'day': 'mm:ss', - 'week': 'mm:ss', - 'month': 'mm:ss', - 'quarter': 'mm:ss', - 'year': 'mm:ss', - } - } + millisecond: 'mm:ss', + second: 'mm:ss', + minute: 'mm:ss', + hour: 'mm:ss', + day: 'mm:ss', + week: 'mm:ss', + month: 'mm:ss', + quarter: 'mm:ss', + year: 'mm:ss', + }, + }, }, y: { @@ -605,15 +630,15 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { }, suggestedMin: suggestedMinFlow, suggestedMax: suggestedMaxFlow, - } + }, }, interaction: { - intersect: false - } + intersect: false, + }, }; if (pressureDevice != null || !this.platform.is('cordova')) { - chartOptions.scales['y3'] = { + chartOptions.scales['y3'] = { type: 'linear', display: true, position: 'right', @@ -625,32 +650,42 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { suggestedMin: 0, suggestedMax: 12, }; - } - this.flowProfileChartEl = new Chart(this.flowProfileChart.nativeElement, { - type: 'line', - data: drinkingData, - options: chartOptions - } as any); + this.flowProfileChartEl = new Chart( + this.flowProfileChart.nativeElement, + { + type: 'line', + data: drinkingData, + options: chartOptions, + } as any + ); if (this.flow_profile_raw.weight.length > 0) { for (const data of this.flow_profile_raw.weight) { const dataDay = moment(new Date()).startOf('day'); - dataDay.add('seconds',data.brew_time); - this.flowProfileChartEl.data.datasets[0].data.push({x:dataDay.toDate().getTime(), y:data.actual_weight}); + dataDay.add('seconds', data.brew_time); + this.flowProfileChartEl.data.datasets[0].data.push({ + x: dataDay.toDate().getTime(), + y: data.actual_weight, + }); } for (const data of this.flow_profile_raw.waterFlow) { const dataDay = moment(new Date()).startOf('day'); - dataDay.add('seconds',data.brew_time); + dataDay.add('seconds', data.brew_time); - this.flowProfileChartEl.data.datasets[1].data.push({x:dataDay.toDate().getTime(), y:data.value}); + this.flowProfileChartEl.data.datasets[1].data.push({ + x: dataDay.toDate().getTime(), + y: data.value, + }); } for (const data of this.flow_profile_raw.realtimeFlow) { const dataDay = moment(new Date()).startOf('day'); - dataDay.add('seconds',data.brew_time); - this.flowProfileChartEl.data.datasets[2].data.push({x:dataDay.toDate().getTime(), y:data.flow_value}); + dataDay.add('seconds', data.brew_time); + this.flowProfileChartEl.data.datasets[2].data.push({ + x: dataDay.toDate().getTime(), + y: data.flow_value, + }); } - } this.flowProfileChartEl.update('quite'); } @@ -664,25 +699,30 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.scaleFlowSubscription.unsubscribe(); this.scaleFlowSubscription = undefined; } - } + public deattachToPressureChange() { if (this.pressureDeviceSubscription) { this.pressureDeviceSubscription.unsubscribe(); this.pressureDeviceSubscription = undefined; } - } - public shallFlowProfileBeHidden(): boolean { if (this.smartScaleConnected() === true) { return false; } - if (this.smartScaleConnected() === false && this.isEdit === true && this.data.flow_profile !== '') { + if ( + this.smartScaleConnected() === false && + this.isEdit === true && + this.data.flow_profile !== '' + ) { return false; } - if (this.smartScaleConnected() === false && this.flow_profile_raw.weight.length > 0) { + if ( + this.smartScaleConnected() === false && + this.flow_profile_raw.weight.length > 0 + ) { return false; } @@ -690,14 +730,13 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } public getAvgFlow(): number { - const waterFlows: Array = this.flow_profile_raw.waterFlow; let calculatedFlow: number = 0; let foundEntries: number = 0; for (const water of waterFlows) { if (water.value > 0) { - calculatedFlow +=water.value; - foundEntries +=1; + calculatedFlow += water.value; + foundEntries += 1; } } if (calculatedFlow > 0) { @@ -707,7 +746,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } public deattachToScaleEvents() { - if (this.scaleTimerSubscription) { this.scaleTimerSubscription.unsubscribe(); this.scaleTimerSubscription = undefined; @@ -716,25 +754,25 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.scaleTareSubscription.unsubscribe(); this.scaleTareSubscription = undefined; } - - } - public ngOnInit(): void { this.settings = this.uiSettingsStorage.getSettings(); if (!this.data.config.uuid) { this.customCreationDate = moment().toISOString(); } else { - this.customCreationDate = moment.unix(this.data.config.unix_timestamp).toISOString(); - this.displayingBrewTime = moment().startOf('day').add('seconds', this.data.brew_time).toISOString(); + this.customCreationDate = moment + .unix(this.data.config.unix_timestamp) + .toISOString(); + this.displayingBrewTime = moment() + .startOf('day') + .add('seconds', this.data.brew_time) + .toISOString(); } this.maxBrewRating = this.settings.brew_rating; - } - public getTime(): number { if (this.timer) { return this.timer.getSeconds(); @@ -761,22 +799,22 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { public async timerStarted(_event) { const scale: BluetoothScale = this.bleManager.getScale(); -/** - let weight=0; - let realtime_flow = 0; - let flow = 0; - let pressure = 0; - this.startingFlowTime = Date.now(); - this.flowProfileChartEl.options.scales.x.realtime.pause = false; - const startingDay = moment(new Date()).startOf('day'); - //IF brewtime has some seconds, we add this to the delay directly. - if (this.data.brew_time > 0) { + /** + let weight=0; + let realtime_flow = 0; + let flow = 0; + let pressure = 0; + this.startingFlowTime = Date.now(); + this.flowProfileChartEl.options.scales.x.realtime.pause = false; + const startingDay = moment(new Date()).startOf('day'); + //IF brewtime has some seconds, we add this to the delay directly. + if (this.data.brew_time > 0) { startingDay.add('seconds',this.data.brew_time); } - const delay = Date.now() - startingDay.toDate().getTime(); - this.flowProfileChartEl.options.scales.x.realtime.delay = delay; - this.flowProfileChartEl.update('quiet'); - setInterval(() => { + const delay = Date.now() - startingDay.toDate().getTime(); + this.flowProfileChartEl.options.scales.x.realtime.delay = delay; + this.flowProfileChartEl.update('quiet'); + setInterval(() => { flow = Math.floor(Math.random() * 11); realtime_flow = Math.floor(Math.random() * 11); weight = weight + Math.floor(Math.random() * 11); @@ -801,7 +839,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { ); this.flowProfileChartEl.update('quite'); },100); -**/ + **/ if (scale) { if (this.settings.bluetooth_scale_tare_on_start_timer === true) { await scale.tare(); @@ -811,18 +849,16 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.startingFlowTime = Date.now(); this.flowProfileChartEl.options.scales.x.realtime.pause = false; const startingDay = moment(new Date()).startOf('day'); - //IF brewtime has some seconds, we add this to the delay directly. + // IF brewtime has some seconds, we add this to the delay directly. if (this.data.brew_time > 0) { - startingDay.add('seconds',this.data.brew_time); + startingDay.add('seconds', this.data.brew_time); } const delay = Date.now() - startingDay.toDate().getTime(); this.flowProfileChartEl.options.scales.x.realtime.delay = delay; this.flowProfileChartEl.update('quiet'); - this.attachToScaleWeightChange(); this.attachToPressureChange(); - } } @@ -834,16 +870,16 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.startingFlowTime = Date.now(); - - - this.flowProfileChartEl.options.scales.x.realtime.pause = false; const startingDay = moment(new Date()).startOf('day'); - //IF brewtime has some seconds, we add this to the delay directly. + // IF brewtime has some seconds, we add this to the delay directly. if (this.data.brew_time > 0) { - startingDay.add('seconds',this.data.brew_time); + startingDay.add('seconds', this.data.brew_time); - this.startingFlowTime = moment().subtract('seconds',this.data.brew_time).toDate().getTime(); + this.startingFlowTime = moment() + .subtract('seconds', this.data.brew_time) + .toDate() + .getTime(); } const delay = Date.now() - startingDay.toDate().getTime(); this.flowProfileChartEl.options.scales.x.realtime.delay = delay; @@ -851,7 +887,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.attachToScaleWeightChange(); this.attachToPressureChange(); - } } @@ -865,8 +900,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.deattachToPressureChange(); this.flowProfileChartEl.options.scales.x.realtime.pause = true; this.flowProfileChartEl.update('quiet'); - - } } @@ -899,7 +932,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.deattachToWeightChange(); this.deattachToPressureChange(); - if (this.isEdit) { await this.deleteFlowProfile(); this.data.flow_profile = ''; @@ -946,21 +978,16 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.data.config.unix_timestamp = newUnix; } this.checkChanges(); - - }, error: () => { - - } + }, + error: () => {}, }); - } } - public showSectionAfterBrew(): boolean { return this.uiBrewHelper.showSectionAfterBrew(this.getPreparation()); } - public showSectionWhileBrew(): boolean { return this.uiBrewHelper.showSectionWhileBrew(this.getPreparation()); } @@ -970,7 +997,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } public changedRating() { - if (typeof (this.brewStars) !== 'undefined') { + if (typeof this.brewStars !== 'undefined') { this.brewStars.setRating(this.data.rating); } } @@ -986,19 +1013,31 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { showBackdrop: true, backdropDismiss: true, swipeToClose: true, - componentProps: { displayingTime: this.displayingBrewTime } + componentProps: { displayingTime: this.displayingBrewTime }, }); await modal.present(); const modalData = await modal.onWillDismiss(); - if (modalData !== undefined && modalData.data.displayingTime !== undefined) { + if ( + modalData !== undefined && + modalData.data.displayingTime !== undefined + ) { this.displayingBrewTime = modalData.data.displayingTime; - this.data.brew_time = moment.duration(moment(modalData.data.displayingTime).diff(moment(modalData.data.displayingTime).startOf('day'))).asSeconds(); + this.data.brew_time = moment + .duration( + moment(modalData.data.displayingTime).diff( + moment(modalData.data.displayingTime).startOf('day') + ) + ) + .asSeconds(); } } // tslint:disable-next-line private __loadLastBrew(): void { - if (this.settings.manage_parameters.set_last_coffee_brew || this.data.getPreparation().manage_parameters.set_last_coffee_brew) { + if ( + this.settings.manage_parameters.set_last_coffee_brew || + this.data.getPreparation().manage_parameters.set_last_coffee_brew + ) { const brews: Array = this.uiBrewStorage.getAllEntries(); if (brews.length > 0) { const lastBrew: Brew = brews[brews.length - 1]; @@ -1008,31 +1047,54 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } } - private __setScaleWeight(_weight: number, _wrongFlow: boolean, _weightDidntChange: boolean) { + private __setScaleWeight( + _weight: number, + _wrongFlow: boolean, + _weightDidntChange: boolean + ) { if (_wrongFlow === false || _weightDidntChange === true) { - if (this.data.getPreparation().style_type !== PREPARATION_STYLE_TYPE.ESPRESSO) { + if ( + this.data.getPreparation().style_type !== + PREPARATION_STYLE_TYPE.ESPRESSO + ) { if (_weight > 0) { - this.data.brew_quantity = this.uiHelper.toFixedIfNecessary(_weight, 1); + this.data.brew_quantity = this.uiHelper.toFixedIfNecessary( + _weight, + 1 + ); } } else { if (_weight > 0) { // If the drip timer is showing, we can set the first drip and not doing a reference to the normal weight. - this.data.brew_beverage_quantity = this.uiHelper.toFixedIfNecessary(_weight, 1); + this.data.brew_beverage_quantity = this.uiHelper.toFixedIfNecessary( + _weight, + 1 + ); } - } this.checkChanges(); } else { // Pah. Shit here. } - if (this.data.getPreparation().style_type === PREPARATION_STYLE_TYPE.ESPRESSO && _weight > 0) { + if ( + this.data.getPreparation().style_type === + PREPARATION_STYLE_TYPE.ESPRESSO && + _weight > 0 + ) { // If the drip timer is showing, we can set the first drip and not doing a reference to the normal weight. - if (this.timer.showDripTimer === true && this.data.coffee_first_drip_time <= 0) { + if ( + this.timer.showDripTimer === true && + this.data.coffee_first_drip_time <= 0 + ) { // First drip is incoming - if (this.uiBrewHelper.fieldVisible(this.settings.manage_parameters.coffee_first_drip_time, - this.data.getPreparation().manage_parameters.coffee_first_drip_time, - this.data.getPreparation().use_custom_parameters)) { + if ( + this.uiBrewHelper.fieldVisible( + this.settings.manage_parameters.coffee_first_drip_time, + this.data.getPreparation().manage_parameters.coffee_first_drip_time, + this.data.getPreparation().use_custom_parameters + ) + ) { // The first time we set the weight, we have one sec delay, because of this do it -1 second this.data.coffee_first_drip_time = this.getTime() - 1; this.checkChanges(); @@ -1053,64 +1115,82 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { t.push(i); } const savingPath = 'brews/' + _uuid + '_flow_profile.json'; - this.uiFileHelper.saveJSONFile(savingPath, JSON.stringify(this.flow_profile_raw)); + this.uiFileHelper.saveJSONFile( + savingPath, + JSON.stringify(this.flow_profile_raw) + ); return savingPath; } private async readFlowProfile() { - const flowProfilePath = 'brews/' + this.data.config.uuid + '_flow_profile.json'; + const flowProfilePath = + 'brews/' + this.data.config.uuid + '_flow_profile.json'; try { const jsonParsed = await this.uiFileHelper.getJSONFile(flowProfilePath); this.flow_profile_raw = jsonParsed; - - } catch(ex) { - - } - + } catch (ex) {} } + private async deleteFlowProfile() { try { if (this.data.flow_profile !== '') { - const flowProfilePath = 'brews/' + this.data.config.uuid + '_flow_profile.json'; + const flowProfilePath = + 'brews/' + this.data.config.uuid + '_flow_profile.json'; await this.uiFileHelper.deleteFile(flowProfilePath); } - } catch (ex) { - - } - + } catch (ex) {} } - private __setPressureFlow(_pressure: any) { - //Nothing for storing etc. is done here actually + // Nothing for storing etc. is done here actually const actual: number = _pressure.actual; - const old: number =_pressure.old; - const actualUnixTime: number = moment(new Date()).startOf('day').add('milliseconds',Date.now() - this.startingFlowTime).toDate().getTime(); - const pressureObj= { - unixTime:actualUnixTime, + const old: number = _pressure.old; + const actualUnixTime: number = moment(new Date()) + .startOf('day') + .add('milliseconds', Date.now() - this.startingFlowTime) + .toDate() + .getTime(); + const pressureObj = { + unixTime: actualUnixTime, actual: actual, old: old, flowTime: this.flowTime, flowTimeSecond: this.flowTime + '.' + this.flowSecondTick, }; - this.flowProfileChartEl.data.datasets[3].data.push({x: pressureObj.unixTime, y: pressureObj.actual}); + this.flowProfileChartEl.data.datasets[3].data.push({ + x: pressureObj.unixTime, + y: pressureObj.actual, + }); } - private __setFlowProfile(_scaleChange: any) { - - const weight: number = this.uiHelper.toFixedIfNecessary(_scaleChange.actual,1); - const oldWeight: number = this.uiHelper.toFixedIfNecessary(_scaleChange.old,1); - const smoothedWeight: number = this.uiHelper.toFixedIfNecessary(_scaleChange.smoothed,1); - const oldSmoothedWeight: number = this.uiHelper.toFixedIfNecessary(_scaleChange.oldSmoothed,1); + private __setFlowProfile(_scaleChange: any) { + const weight: number = this.uiHelper.toFixedIfNecessary( + _scaleChange.actual, + 1 + ); + const oldWeight: number = this.uiHelper.toFixedIfNecessary( + _scaleChange.old, + 1 + ); + const smoothedWeight: number = this.uiHelper.toFixedIfNecessary( + _scaleChange.smoothed, + 1 + ); + const oldSmoothedWeight: number = this.uiHelper.toFixedIfNecessary( + _scaleChange.oldSmoothed, + 1 + ); if (this.flowTime === undefined) { this.flowTime = this.getTime(); } - - - const flowObj= { - unixTime: moment(new Date()).startOf('day').add('milliseconds',Date.now() - this.startingFlowTime).toDate().getTime(), + const flowObj = { + unixTime: moment(new Date()) + .startOf('day') + .add('milliseconds', Date.now() - this.startingFlowTime) + .toDate() + .getTime(), weight: weight, oldWeight: oldWeight, smoothedWeight: smoothedWeight, @@ -1141,7 +1221,10 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { break; } - if ( this.data.getPreparation().style_type !== PREPARATION_STYLE_TYPE.ESPRESSO) { + if ( + this.data.getPreparation().style_type !== + PREPARATION_STYLE_TYPE.ESPRESSO + ) { // Treat this as same level as other if and not else if. // We just check this when we're not on espresso, cause sometimes we just get 0.1 or 0.2g changes in 1 second if (val === nextVal) { @@ -1151,12 +1234,9 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { wrongFlow = true; weightDidntChange = true; // We don't get out of the loop here, why? because the next value could be negative, and we then need to say that the weight changed, else we would maybe set wrong data. - } } } - - } else { // This is the latest value of this time if (val < 0) { @@ -1179,18 +1259,27 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { // If the first anomalie check is done, we check the second anomalie if (wrongFlow === false) { const firstVal: number = this.flowProfileArr[0]; - const lastVal: number = this.flowProfileArr[this.flowProfileArr.length - 1]; + const lastVal: number = + this.flowProfileArr[this.flowProfileArr.length - 1]; - if (this.data.getPreparation().style_type !== PREPARATION_STYLE_TYPE.ESPRESSO) { + if ( + this.data.getPreparation().style_type !== + PREPARATION_STYLE_TYPE.ESPRESSO + ) { // We do some calculations on filter - if ((lastVal - firstVal) > 100) { + if (lastVal - firstVal > 100) { // Threshhold reached, more then 100g in on esecond is to much wrongFlow = true; } else if (firstVal === lastVal) { // Weight didn't change at all. weightDidntChange = true; wrongFlow = true; - } else if ((lastVal - firstVal) < 0.5 || (this.flowProfileArr.length > 2 && (this.flowProfileArr[this.flowProfileArr.length - 2] - firstVal) < 0.5)) { + } else if ( + lastVal - firstVal < 0.5 || + (this.flowProfileArr.length > 2 && + this.flowProfileArr[this.flowProfileArr.length - 2] - firstVal < + 0.5) + ) { // Threshold for filter is bigger, 0.5g // Threshshold, weight changes because of strange thing happening. // Sometimes the weight changes so strange, that the last two preVal's came above @@ -1198,24 +1287,22 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { weightDidntChange = true; } } else { - if ((lastVal - firstVal) > 100) { + if (lastVal - firstVal > 100) { // Threshhold reached, more then 100g in on esecond is to much wrongFlow = true; } else if (firstVal === lastVal) { // Weight didn't change at all. weightDidntChange = true; wrongFlow = true; - } else if ((lastVal - firstVal) < 0.1) { + } else if (lastVal - firstVal < 0.1) { // Threshshold, weight changes because of strange thing happening. // Sometimes the weight changes so strange, that the last two preVal's came above wrongFlow = true; weightDidntChange = true; } } - } - let actualFlowValue: number = 0; if (wrongFlow === false) { @@ -1224,9 +1311,10 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { let calculatedFlowWeight = 0; for (const flowWeight of this.flowProfileArrCalculated) { - calculatedFlowWeight+=flowWeight; + calculatedFlowWeight += flowWeight; } - calculatedFlowWeight = (calculatedFlowWeight / this.flowProfileArrCalculated.length) * 10; + calculatedFlowWeight = + (calculatedFlowWeight / this.flowProfileArrCalculated.length) * 10; // Ignore flowing weight when we're below zero if (calculatedFlowWeight < 0) { @@ -1240,16 +1328,18 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { actualFlowValue = 0; } - - - - - let lastFoundRightValue = 0; - for (let i = this.flowProfileChartEl.data.datasets[0].data.length - 1; i >= 0; i--) { - const dataVal = this.flowProfileChartEl.data.datasets[0].data[i]; - if (dataVal !== null){ - if (this.settings.bluetooth_ignore_negative_values === true && dataVal.y > 0) { + for ( + let i = this.flowProfileChartEl.data.datasets[0].data.length - 1; + i >= 0; + i-- + ) { + const dataVal = this.flowProfileChartEl.data.datasets[0].data[i]; + if (dataVal !== null) { + if ( + this.settings.bluetooth_ignore_negative_values === true && + dataVal.y > 0 + ) { lastFoundRightValue = dataVal.y; } else { lastFoundRightValue = dataVal.y; @@ -1259,122 +1349,137 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } } - - if (this.settings.bluetooth_ignore_anomaly_values === true || - this.settings.bluetooth_ignore_negative_values === true) - { - - + if ( + this.settings.bluetooth_ignore_anomaly_values === true || + this.settings.bluetooth_ignore_negative_values === true + ) { for (const item of this.flowProfileArrObjs) { // tslint:disable-next-line:no-shadowed-variable - let weightToAdd = item.weight; + let weightToAdd = item.weight; - if (this.settings.bluetooth_ignore_anomaly_values === true) { - if (wrongFlow === true) { - weightToAdd = null; - } - } - if (flowHasSomeMinusValueInIt === true && this.settings.bluetooth_ignore_negative_values === true) { + if (this.settings.bluetooth_ignore_anomaly_values === true) { + if (wrongFlow === true) { weightToAdd = null; } + } + if ( + flowHasSomeMinusValueInIt === true && + this.settings.bluetooth_ignore_negative_values === true + ) { + weightToAdd = null; + } - if (weightToAdd === null) { - // Set the last right weight value - weightToAdd = lastFoundRightValue; - } - - this.flowProfileChartEl.data.datasets[0].data.push( - {x: item.unixTime, y: weightToAdd} - ); - this.pushFlowProfile(item.flowTimeSecond, weightToAdd, item.oldWeight, item.smoothedWeight, item.oldSmoothedWeight); + if (weightToAdd === null) { + // Set the last right weight value + weightToAdd = lastFoundRightValue; + } + this.flowProfileChartEl.data.datasets[0].data.push({ + x: item.unixTime, + y: weightToAdd, + }); + this.pushFlowProfile( + item.flowTimeSecond, + weightToAdd, + item.oldWeight, + item.smoothedWeight, + item.oldSmoothedWeight + ); } } - const timestamp = this.uiHelper.getActualTimeWithMilliseconds(); for (const item of this.flowProfileArrObjs) { - const waterFlow: IBrewWaterFlow = { - - } as IBrewWaterFlow; + const waterFlow: IBrewWaterFlow = {} as IBrewWaterFlow; waterFlow.brew_time = this.flowTime.toString(); waterFlow.timestamp = timestamp; waterFlow.value = actualFlowValue; - this.flowProfileChartEl.data.datasets[1].data.push({x: item.unixTime, y: actualFlowValue}); + this.flowProfileChartEl.data.datasets[1].data.push({ + x: item.unixTime, + y: actualFlowValue, + }); this.flow_profile_raw.waterFlow.push(waterFlow); } - this.__setScaleWeight(weight, wrongFlow, weightDidntChange); // Reset this.flowTime = this.getTime(); this.flowSecondTick = 0; - this.flowProfileArr = []; - this.flowProfileArrObjs= []; + this.flowProfileArrObjs = []; this.flowProfileArrCalculated = []; this.flowProfileChartEl.update('quiet'); } - this.flowProfileArr.push(weight); this.flowProfileArrObjs.push(flowObj); this.flowProfileArrCalculated.push(weight - oldWeight); - /* Realtime flow start**/ let lastRealtimeFlow = null; - if ( this.flow_profile_raw.realtimeFlow.length > 0) { - lastRealtimeFlow = this.flow_profile_raw.realtimeFlow[ this.flow_profile_raw.realtimeFlow.length - 1]; + if (this.flow_profile_raw.realtimeFlow.length > 0) { + lastRealtimeFlow = + this.flow_profile_raw.realtimeFlow[ + this.flow_profile_raw.realtimeFlow.length - 1 + ]; } let oldRealtimeSmoothedValue = 0; if (lastRealtimeFlow != null) { oldRealtimeSmoothedValue = lastRealtimeFlow.smoothed_weight; } - const newSmoothedWeight = (oldRealtimeSmoothedValue * 0.9) + (weight * 0.1); - + const newSmoothedWeight = oldRealtimeSmoothedValue * 0.9 + weight * 0.1; - const realtimeWaterFlow: IBrewRealtimeWaterFlow = { - - } as IBrewRealtimeWaterFlow; + const realtimeWaterFlow: IBrewRealtimeWaterFlow = + {} as IBrewRealtimeWaterFlow; realtimeWaterFlow.brew_time = flowObj.flowTimeSecond; realtimeWaterFlow.timestamp = this.uiHelper.getActualTimeWithMilliseconds(); realtimeWaterFlow.smoothed_weight = newSmoothedWeight; - realtimeWaterFlow.flow_value = (newSmoothedWeight - oldRealtimeSmoothedValue)*10; - + realtimeWaterFlow.flow_value = + (newSmoothedWeight - oldRealtimeSmoothedValue) * 10; - this.flowProfileChartEl.data.datasets[2].data.push({x: flowObj.unixTime, y: realtimeWaterFlow.flow_value}); + this.flowProfileChartEl.data.datasets[2].data.push({ + x: flowObj.unixTime, + y: realtimeWaterFlow.flow_value, + }); this.flow_profile_raw.realtimeFlow.push(realtimeWaterFlow); /* Realtime flow End **/ - if (this.settings.bluetooth_ignore_anomaly_values === false && - this.settings.bluetooth_ignore_negative_values === false) - { - this.flowProfileChartEl.data.datasets[0].data.push({x: flowObj.unixTime, y: flowObj.weight}); + if ( + this.settings.bluetooth_ignore_anomaly_values === false && + this.settings.bluetooth_ignore_negative_values === false + ) { + this.flowProfileChartEl.data.datasets[0].data.push({ + x: flowObj.unixTime, + y: flowObj.weight, + }); - this.pushFlowProfile(flowObj.flowTimeSecond, flowObj.weight, flowObj.oldWeight, flowObj.smoothedWeight, flowObj.oldSmoothedWeight); + this.pushFlowProfile( + flowObj.flowTimeSecond, + flowObj.weight, + flowObj.oldWeight, + flowObj.smoothedWeight, + flowObj.oldSmoothedWeight + ); this.flowProfileChartEl.update('quiet'); } - this.flowSecondTick++; - } - private pushFlowProfile(_brewTime: string, + private pushFlowProfile( + _brewTime: string, _actualWeight: number, _oldWeight: number, _actualSmoothedWeight: number, - _oldSmoothedWeight: number) { - const brewFlow: IBrewWeightFlow = { - - } as IBrewWeightFlow; + _oldSmoothedWeight: number + ) { + const brewFlow: IBrewWeightFlow = {} as IBrewWeightFlow; brewFlow.timestamp = this.uiHelper.getActualTimeWithMilliseconds(); brewFlow.brew_time = _brewTime; brewFlow.actual_weight = _actualWeight; @@ -1391,24 +1496,27 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { const avgFlowEl = this.smartScaleAvgFlowPerSecondEl.nativeElement; const actualScaleWeight = this.getActualScaleWeight(); - const actualSmoothedWeightPerSecond = this.getActualSmoothedWeightPerSecond(); - const avgFlow = this.uiHelper.toFixedIfNecessary(this.getAvgFlow(),2); + const actualSmoothedWeightPerSecond = + this.getActualSmoothedWeightPerSecond(); + const avgFlow = this.uiHelper.toFixedIfNecessary(this.getAvgFlow(), 2); weightEl.textContent = actualScaleWeight + ' g'; flowEl.textContent = actualSmoothedWeightPerSecond + ' g/s'; avgFlowEl.textContent = 'Ø ' + avgFlow + ' g/s'; - - this.brewFlowGraphSubject.next({scaleWeight:actualScaleWeight + ' g', - smoothedWeight: actualSmoothedWeightPerSecond+ ' g/s', - avgFlow: 'Ø ' + avgFlow + ' g/s' }); - } catch (ex) { - - } + this.brewFlowGraphSubject.next({ + scaleWeight: actualScaleWeight + ' g', + smoothedWeight: actualSmoothedWeightPerSecond + ' g/s', + avgFlow: 'Ø ' + avgFlow + ' g/s', + }); + } catch (ex) {} } public getActualScaleWeight() { try { - return this.uiHelper.toFixedIfNecessary(this.bleManager.getScale().getWeight(),1); + return this.uiHelper.toFixedIfNecessary( + this.bleManager.getScale().getWeight(), + 1 + ); } catch (ex) { return 0; } @@ -1416,7 +1524,8 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { public getActualSmoothedWeightPerSecond(): number { try { - const lastflow = this.flow_profile_raw.weight[this.flow_profile_raw.weight.length - 1]; + const lastflow = + this.flow_profile_raw.weight[this.flow_profile_raw.weight.length - 1]; const smoothedWeight = lastflow.actual_smoothed_weight; const oldSmoothedWeight = lastflow.old_smoothed_weight; const flowValue: number = (smoothedWeight - oldSmoothedWeight) * 10; @@ -1424,7 +1533,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } catch (ex) { return 0; } - } public async downloadFlowProfile() { @@ -1432,31 +1540,47 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } private __loadBrew(brew: Brew, _template: boolean) { - - if (this.settings.default_last_coffee_parameters.method_of_preparation || _template === true) { - const brewPreparation: IPreparation = this.uiPreparationStorage.getByUUID(brew.method_of_preparation); + if ( + this.settings.default_last_coffee_parameters.method_of_preparation || + _template === true + ) { + const brewPreparation: IPreparation = this.uiPreparationStorage.getByUUID( + brew.method_of_preparation + ); if (!brewPreparation.finished) { this.data.method_of_preparation = brewPreparation.config.uuid; } } let checkData: Settings | Preparation; - if (this.getPreparation().use_custom_parameters === true && this.getPreparation().manage_parameters.set_last_coffee_brew === true) { + if ( + this.getPreparation().use_custom_parameters === true && + this.getPreparation().manage_parameters.set_last_coffee_brew === true + ) { checkData = this.getPreparation(); } else { checkData = this.settings; } - if (checkData.default_last_coffee_parameters.bean_type || _template === true) { + if ( + checkData.default_last_coffee_parameters.bean_type || + _template === true + ) { const brewBean: IBean = this.uiBeanStorage.getByUUID(brew.bean); if (!brewBean.finished) { this.data.bean = brewBean.config.uuid; } } - if (checkData.default_last_coffee_parameters.grind_size || _template === true) { + if ( + checkData.default_last_coffee_parameters.grind_size || + _template === true + ) { this.data.grind_size = brew.grind_size; } - if (checkData.default_last_coffee_parameters.grind_weight || _template === true) { + if ( + checkData.default_last_coffee_parameters.grind_weight || + _template === true + ) { this.data.grind_weight = brew.grind_weight; } @@ -1465,49 +1589,81 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { if (!brewMill.finished) { this.data.mill = brewMill.config.uuid; } - } - if (checkData.default_last_coffee_parameters.mill_timer || _template === true) { + if ( + checkData.default_last_coffee_parameters.mill_timer || + _template === true + ) { this.data.mill_timer = brew.mill_timer; } - if (checkData.default_last_coffee_parameters.mill_speed || _template === true) { + if ( + checkData.default_last_coffee_parameters.mill_speed || + _template === true + ) { this.data.mill_speed = brew.mill_speed; } - if (checkData.default_last_coffee_parameters.pressure_profile || _template === true) { + if ( + checkData.default_last_coffee_parameters.pressure_profile || + _template === true + ) { this.data.pressure_profile = brew.pressure_profile; } - if (checkData.default_last_coffee_parameters.brew_temperature || _template === true) { + if ( + checkData.default_last_coffee_parameters.brew_temperature || + _template === true + ) { this.data.brew_temperature = brew.brew_temperature; } if (this.brewTemperatureTime) { - if (checkData.default_last_coffee_parameters.brew_temperature_time || _template === true) { + if ( + checkData.default_last_coffee_parameters.brew_temperature_time || + _template === true + ) { this.data.brew_temperature_time = brew.brew_temperature_time; this.brewTemperatureTime.setTime(this.data.brew_temperature_time); } } if (this.timer) { - if (checkData.default_last_coffee_parameters.brew_time || _template === true) { + if ( + checkData.default_last_coffee_parameters.brew_time || + _template === true + ) { this.data.brew_time = brew.brew_time; this.timer.setTime(this.data.brew_time); } } - if (checkData.default_last_coffee_parameters.brew_quantity || _template === true) { + if ( + checkData.default_last_coffee_parameters.brew_quantity || + _template === true + ) { this.data.brew_quantity = brew.brew_quantity; this.data.brew_quantity_type = brew.brew_quantity_type; } - if (checkData.default_last_coffee_parameters.coffee_type || _template === true) { + if ( + checkData.default_last_coffee_parameters.coffee_type || + _template === true + ) { this.data.coffee_type = brew.coffee_type; } - if (checkData.default_last_coffee_parameters.coffee_concentration || _template === true) { + if ( + checkData.default_last_coffee_parameters.coffee_concentration || + _template === true + ) { this.data.coffee_concentration = brew.coffee_concentration; } - if (checkData.default_last_coffee_parameters.coffee_first_drip_time || _template === true) { + if ( + checkData.default_last_coffee_parameters.coffee_first_drip_time || + _template === true + ) { this.data.coffee_first_drip_time = brew.coffee_first_drip_time; } - if (checkData.default_last_coffee_parameters.coffee_blooming_time || _template === true) { + if ( + checkData.default_last_coffee_parameters.coffee_blooming_time || + _template === true + ) { this.data.coffee_blooming_time = brew.coffee_blooming_time; } @@ -1520,19 +1676,26 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { if (checkData.default_last_coffee_parameters.tds || _template === true) { this.data.tds = brew.tds; } - if (checkData.default_last_coffee_parameters.brew_beverage_quantity || _template === true) { + if ( + checkData.default_last_coffee_parameters.brew_beverage_quantity || + _template === true + ) { this.data.brew_beverage_quantity = brew.brew_beverage_quantity; this.data.brew_beverage_quantity_type = brew.brew_beverage_quantity_type; } - if (checkData.default_last_coffee_parameters.method_of_preparation_tool || _template === true) { + if ( + checkData.default_last_coffee_parameters.method_of_preparation_tool || + _template === true + ) { const repeatTools = brew.method_of_preparation_tools; this.data.method_of_preparation_tools = []; for (const id of repeatTools) { - const tool = this.data.getPreparation().tools.find((e) => e.config.uuid === id); - if (tool.archived === false){ - this.data.method_of_preparation_tools.push(tool.config.uuid); - } - + const tool = this.data + .getPreparation() + .tools.find((e) => e.config.uuid === id); + if (tool.archived === false) { + this.data.method_of_preparation_tools.push(tool.config.uuid); + } } } if (checkData.default_last_coffee_parameters.water || _template === true) { @@ -1543,15 +1706,16 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.data.vessel_name = brew.vessel_name; this.data.vessel_weight = brew.vessel_weight; } - if (checkData.default_last_coffee_parameters.bean_weight_in || _template === true) { + if ( + checkData.default_last_coffee_parameters.bean_weight_in || + _template === true + ) { this.data.bean_weight_in = brew.bean_weight_in; } this.data.flow_profile = ''; - } - public onProfileSearchChange(event: any) { if (!this.profileFocused) { return; @@ -1563,22 +1727,26 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { return; } - actualSearchValue = actualSearchValue.toLowerCase(); - const filteredEntries = this.uiBrewStorage.getAllEntries().filter((e) => e.pressure_profile.toLowerCase().includes(actualSearchValue)); + const filteredEntries = this.uiBrewStorage + .getAllEntries() + .filter((e) => + e.pressure_profile.toLowerCase().includes(actualSearchValue) + ); for (const entry of filteredEntries) { this.profileResults.push(entry.pressure_profile); } // Distinct values - this.profileResults = Array.from(new Set(this.profileResults.map((e) => e))); + this.profileResults = Array.from( + new Set(this.profileResults.map((e) => e)) + ); if (this.profileResults.length > 0) { this.profileResultsAvailable = true; } else { this.profileResultsAvailable = false; } - } public onProfileSearchLeave($event) { @@ -1587,7 +1755,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.profileResults = []; this.profileFocused = false; }, 150); - } public onProfileSearchFocus($event) { @@ -1601,7 +1768,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.profileFocused = false; } - public onVesselSearchChange(event: any) { if (!this.vesselFocused) { return; @@ -1613,19 +1779,27 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { return; } - actualSearchValue = actualSearchValue.toLowerCase(); - const filteredEntries = this.uiBrewStorage.getAllEntries().filter((e) => e.vessel_name !== '' && e.vessel_name.toLowerCase().includes(actualSearchValue)); + const filteredEntries = this.uiBrewStorage + .getAllEntries() + .filter( + (e) => + e.vessel_name !== '' && + e.vessel_name.toLowerCase().includes(actualSearchValue) + ); for (const entry of filteredEntries) { - if (this.vesselResults.filter((e) => e.name === entry.vessel_name && e.weight === entry.vessel_weight).length <= 0) { + if ( + this.vesselResults.filter( + (e) => + e.name === entry.vessel_name && e.weight === entry.vessel_weight + ).length <= 0 + ) { this.vesselResults.push({ name: entry.vessel_name, - weight: entry.vessel_weight - } - ); + weight: entry.vessel_weight, + }); } - } // Distinct values if (this.vesselResults.length > 0) { @@ -1633,7 +1807,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } else { this.vesselResultsAvailable = false; } - } public onVesselSearchLeave($event) { @@ -1642,7 +1815,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.vesselResultsAvailable = false; this.vesselFocused = false; }, 150); - } public onVesselSearchFocus($event) { @@ -1657,24 +1829,23 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.vesselFocused = false; } - public hasWaterEntries(): boolean { if (this.isEdit) { // When its edit, it doesn't matter when we don't have any active water return this.uiWaterStorage.getAllEntries().length > 0; } - return this.uiWaterStorage.getAllEntries().filter((e) => !e.finished).length > 0; - + return ( + this.uiWaterStorage.getAllEntries().filter((e) => !e.finished).length > 0 + ); } public async calculateBrixToTds() { - const modal = await this.modalController.create({ component: BrewBrixCalculatorComponent, cssClass: 'popover-actions', breakpoints: [0, 0.25], initialBreakpoint: 0.25, - id: BrewBrixCalculatorComponent.COMPONENT_ID + id: BrewBrixCalculatorComponent.COMPONENT_ID, }); await modal.present(); @@ -1682,11 +1853,9 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { if (data !== undefined) { this.data.tds = data.tds; } - } public async calculateBrewBeverageQuantity() { - let vesselWeight: number = 0; if (this.data.vessel_weight > 0) { vesselWeight = this.data.vessel_weight; @@ -1697,9 +1866,9 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { breakpoints: [0, 0.5], initialBreakpoint: 0.5, componentProps: { - vesselWeight: vesselWeight + vesselWeight: vesselWeight, }, - id: BrewBeverageQuantityCalculatorComponent.COMPONENT_ID + id: BrewBeverageQuantityCalculatorComponent.COMPONENT_ID, }); await modal.present(); @@ -1707,8 +1876,5 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { if (data !== undefined && data.brew_beverage_quantity > 0) { this.data.brew_beverage_quantity = data.brew_beverage_quantity; } - } - - } From 8529fee4cbcea62c87772608d5f417def4f8f407 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Fri, 17 Jun 2022 20:01:58 +0200 Subject: [PATCH 14/78] Added a round logo --- resources/logo_round.svg | 75 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 resources/logo_round.svg diff --git a/resources/logo_round.svg b/resources/logo_round.svg new file mode 100644 index 000000000..5d9eb1742 --- /dev/null +++ b/resources/logo_round.svg @@ -0,0 +1,75 @@ + + + + + + + + + + From 3fa55f292a04305dbc86db724f498bc87e852b9d Mon Sep 17 00:00:00 2001 From: Lars Saalbach Date: Fri, 17 Jun 2022 20:58:54 +0200 Subject: [PATCH 15/78] Revert 372 chinese translation (#381) * Add simplified Chiese translation. (#372) * Create zh,json * Rename zh,json to zh.json * Rename zh.json to zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update README.md * Update zh-hans.json * Update README.md * Update README.md * Update zh-hans.json * Update README.md * Update README.md * Update zh-hans.json * Create old-en.json * Update zh-hans.json * Update zh-hans.json * Update old-en.json * Delete old-en.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * update Chinese tranlation * update Chinese tranlation * change some spellings in en.json Co-authored-by: DC <34479243+DC1024@users.noreply.github.com> * Revert "Add simplified Chiese translation. (#372)" This reverts commit da558eb989f1629e207847a3841b91e8a640009e. Co-authored-by: Jiageng Ding Co-authored-by: DC <34479243+DC1024@users.noreply.github.com> From b99b9b4dbd8b76f4c521b092c9002056934f1473 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Fri, 17 Jun 2022 21:00:56 +0200 Subject: [PATCH 16/78] Added chinese, after I corrupted the pullrequest :D --- src/assets/i18n/en.json | 4 +- src/assets/i18n/zh-cn.json | 1169 ++++++++++++++++++++++++++++++++++++ 2 files changed, 1171 insertions(+), 2 deletions(-) create mode 100644 src/assets/i18n/zh-cn.json diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index c7f84090f..dec467b5e 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -969,8 +969,8 @@ "CUPPING_65": "Pecan", "CUPPING_66": "Hazelnut", "CUPPING_67": "Almond", - "CUPPING_68": "Grain & Creal", - "CUPPING_69": "Sweet bread pastery", + "CUPPING_68": "Grain & Cereal", + "CUPPING_69": "Sweet bread pastry", "CUPPING_70": "Granola", "CUPPING_71": "Graham cracker", "CUPPING_72": "Rye", diff --git a/src/assets/i18n/zh-cn.json b/src/assets/i18n/zh-cn.json new file mode 100644 index 000000000..40d3d6843 --- /dev/null +++ b/src/assets/i18n/zh-cn.json @@ -0,0 +1,1169 @@ +{ + "NAV_MENU": "菜单", + "NAV_HOME": "主页", + "NAV_SETTINGS": "设置", + "NAV_BREWS": "冲泡", + "NAV_BEANS": "咖啡豆", + "NAV_PREPARATION": "冲泡方法", + "NAV_MILL": "磨豆机", + "NAV_ABOUT_US": "关于我们", + "NAV_CONTACT": "联系方式", + "NAV_PRIVACY": "隐私", + "NAV_CREDITS": "Credits", + "NAV_TERMS": "团队和贡献者", + "NAV_THANKS": "谢谢!", + "NAV_LICENCES": "开源许可证", + "NAV_STATISTICS": "数据统计", + "NAV_IMPRESSUM": "公司信息", + "NAV_COOKIE": "缓存文件", + "NAV_LOGS": "日志", + "NAV_BREW_PARAMS": "冲泡参数", + "NAV_INFORMATION_TO_APP": "关于软件", + "NAV_WATER_SECTION": "水质", + "NAV_HELPER": "计算", + "POPOVER_BREWS_OPTION_REPEAT": "复制", + "POPOVER_BREWS_OPTION_DETAIL": "详情", + "DETAIL": "详情", + "POPOVER_BREWS_OPTION_EDIT": "编辑", + "POPOVER_BREWS_OPTION_DELETE": "删除", + "POPOVER_BREWS_OPTION_PHOTO_GALLERY": "图库", + "POPOVER_BREWS_OPTION_CUPPING": "品尝", + "POPOVER_BREWS_OPTION_MAP_COORDINATES": "在地图上展示", + "POPOVER_BREWS_OPTION_FAST_REPEAT": "快速复制", + "PAGE_BREWS_NO_ENTRIES": "目前还没有添加冲泡方式", + "PAGE_BREWS_NO_ARCHIVED_ENTRIES": "目前还没有完成过一次冲泡", + "CANT_START_NEW_BREW_TITLE": "这儿少了点什么 ...", + "CANT_START_NEW_BREW_DESCRIPTION": "使用软件前,请至少添加一种咖啡豆、一种冲泡方式和一个研磨机。 你可以使用菜单跳转到不同的类别以添加上述信息。", + "PAGE_HOME_WELCOME_GREETINGS": "终于等到你来了!", + "PAGE_HOME_TOTAL_BREW": "冲泡", + "PAGE_HOME_TOTAL_BREWS": "冲泡次数", + "PAGE_HOME_BEAN_EXPLORED": "款咖啡豆", + "PAGE_HOME_BEANS_EXPLORED": "款咖啡豆", + "PAGE_HOME_LAST_BREWS": "冲泡记录", + "PAGE_HOME_LAST_BREW": "上一次冲泡", + "PAGE_HOME_DIFFERENT_PREPARATION_METHODS": "不同的冲泡方式", + "PAGE_HOME_DIFFERENT_MILLS": "不同的磨豆机", + "PAGE_HOME_SUPPORTER": "软件支持", + "PAGE_HOME_START_BREW": "开始冲泡", + "PAGE_BEANS_LIST_OBTAINABLE": "可用", + "PAGE_BEANS_LIST_YOU_GOT_NO_FRESH_BEANS": "咖啡豆没货啦,快买一点新的吧!", + "PAGE_BEANS_LIST_YOU_GOT_NO_FINISHED_BEANS": "目前还没有一包已经喝完的咖啡。", + "PAGE_MILL_LIST_NO_MILL_EXISTING": "你还没有添加任何一个磨豆机", + "PAGE_PREPARATION_LIST_NO_PREPARATION_EXISTING": "你还没有添加任何一个冲泡方式", + "PAGE_CONTACT_SUGGESTIONS_QUESTIONS_WISHES": "建议、问题或请求?", + "PAGE_THANKS_THANKS_FOR_YOUR_SUPPORT": "感谢你的支持", + "PAGE_SETTINGS_LANGUAGE": "语言偏好", + "PAGE_SETTINGS_LANGUAGE_GERMAN": "German", + "PAGE_SETTINGS_LANGUAGE_ENGLISH": "English", + "PAGE_SETTINGS_LANGUAGE_SPANISH": "Spanish", + "PAGE_SETTINGS_LANGUAGE_CHINESE": "Chinese", + "PAGE_SETTINGS_GENERAL_SETTINGS": "常规设置", + "PAGE_SETTINGS_TRANSFER": "数据转移", + "PAGE_SETTINGS_PRESET_LAST_BREW": "使用预设值?", + "PAGE_SETTINGS_DISPLAY": "显示方式", + "PAGE_SETTINGS_DISPLAY_SINGLE_PAGE": "单页", + "PAGE_SETTINGS_DISPLAY_PAGING": "连续页面", + "PAGE_SETTINGS_STARTUP_VIEW": "起始页", + "PAGE_SETTINGS_ANALYTICS_INFORMATION": "分析", + "PAGE_SETTINGS_ANALYTICS_INFORMATION_TOOLTIP": "按 i 了解更多信息", + "PAGE_SETTINGS_TRACK_BREW_COORDINATES": "保存冲泡经纬度", + "PAGE_SETTINGS_FAST_REPEAT": "快速复制", + "PAGE_SETTINGS_TRACK_CAFFEINE_CONSUMPTION": "保存咖啡因信息", + "PAGE_SETTINGS_WAKE_LOCK": "冲泡时屏幕保持常亮", + "PAGE_SETTINGS_CURRENCY": "货币单位", + "PAGE_STATISTICS_DIFFERENT_PREPARATION_METHOD": "冲泡器具", + "PAGE_STATISTICS_TOTAL_GROUND_BEANS": "研磨的咖啡豆总计", + "PAGE_STATISTICS_MONEY_SPENT_FOR_COFFEE": "购买咖啡豆总费用", + "PAGE_STATISTICS_DRUNKEN_BREWS": "冲泡总数", + "PAGE_STATISTICS_BREW_PROCESSES": "总冲泡次数", + "PAGE_STATISTICS_DRUNKEN_QUANTITY": "咖啡豆消耗量", + "PAGE_STATISTICS_BEAN_WEIGHT_USED": "咖啡豆研磨总量", + "PAGE_BREW_TEXT_INFORMATION_FROM_ROASTER": "烘焙信息", + "PAGE_ABOUT_NO_VERSION_AVAILABLE": "没有可用的版本", + "PAGE_ABOUT_APP_VERSION": "软件版本", + "PAGE_LICENCES_WEBSITE": "网站", + "BEAN_DATA_ROAST_NAME": "烘焙程度", + "BEAN_DATA_CUSTOM_ROAST_NAME": "自定义烘焙温度", + "BEAN_DATA_ROASTING_DATE": "烘焙日期", + "BEAN_DATA_ROASTER": "烘焙者", + "BEAN_DATA_VARIETY": "品种", + "BEAN_DATA_PROCESSING": "处理法", + "BEAN_DATA_COUNTRY": "国家", + "BEAN_DATA_MIX": "单一产地/拼配", + "BEAN_DATA_AROMATICS": "风味味谱", + "BEAN_DATA_WEIGHT": "重量", + "BEAN_DATA_COST": "花销", + "BEAN_DATA_NAME": "咖啡豆名称", + "BEAN_DATA_REGION": "地区", + "BEAN_DATA_FARM": "庄园", + "BEAN_DATA_FARMER": "农场主", + "BEAN_DATA_ELEVATION": "海拔", + "BEAN_DATA_HARVEST_TIME": "收获日期", + "BEAN_DATA_PERCENTAGE": "百分比", + "BEAN_DATA_CERTIFICATION": "咖啡豆认证", + "BEAN_DATA_ROASTING_TYPE": "烘焙用于", + "BEAN_DATA_DECAFFEINATED": "无咖啡因", + "BEAN_DATA_URL": "网站", + "BEAN_DATA_EAN": "条形码", + "BEAN_DATA_PURCHASING_PRICE": "购买价格", + "BEAN_DATA_FOB_PRICE": "离岸价", + "BEAN_DATA_CUPPING_POINTS": "杯测分数", + "BREW_DATA_CUSTOM_BREW_TIME": "自定义冲泡时间", + "BREW_CREATION_DATE": "创建日期", + "REPEAT": "重复", + "EDIT": "编辑", + "DELETE": "删除", + "FINISHED": "归档", + "NOTES": "笔记", + "ADD_PHOTO": "添加照片", + "CANCEL": "取消", + "GENERATE": "生成", + "SAVE": "保存", + "ADD_SOMETHING": "添加", + "CONTACT": "联系", + "NAME": "名称", + "IMPORT": "导入", + "EXPORT": "导出", + "VIEW": "查看", + "ARCHIVE": "归档", + "CURRENT": "当前", + "BACK": "返回", + "CLOSE": "关闭", + "DAY": "日", + "BREW_DATA_TEMPERATURE_TIME": "温度时间", + "BREW_DATA_SURF_TIME": "冲泡时间", + "BREW_DATA_TIME": "时间", + "BREW_DATA_GRIND_SIZE": "研磨设置", + "BREW_DATA_GRIND_WEIGHT": "咖啡粉 (gr)", + "BREW_DATA_IN_OUT_BR": "入/出 (BR)", + "BREW_DATA_NOTES": "笔记", + "BREW_DATA_PREPARATION_METHOD": "冲泡器具", + "BREW_DATA_MILL": "磨豆机", + "BREW_DATA_MILL_SPEED": "研磨速度 (rpm)", + "BREW_DATA_MILL_TIMER": "研磨时间", + "BREW_DATA_BREW_QUANTITY": "水量", + "BREW_DATA_BEAN_TYPE": "咖啡豆类型", + "BREW_DATA_BREW_TEMPERATURE": "冲泡温度", + "BREW_DATA_PRESSURE_PROFILE": "冲泡参数", + "BREW_DATA_COFFEE_TYPE": "咖啡类型", + "BREW_DATA_COFFEE_CONCENTRATION": "咖啡浓度", + "BREW_DATA_COFFEE_FIRST_DRIP_TIME": "第一滴咖啡落下", + "BREW_DATA_COFFEE_BLOOMING_TIME": "闷蒸/预浸泡时间", + "BREW_DATA_ATTACHMENTS": "附件/照片", + "BREW_DATA_RATING": "评分", + "BREW_DATA_CALCULATED_COFFEE_BREW_TIME": "萃取时间", + "BREW_DATA_TDS": "总溶解固体", + "BREW_DATA_CALCULATED_EXTRACTION_YIELD": "萃取率 %", + "BREW_INFORMATION_BREW_RATIO": "冲泡率", + "BREW_INFORMATION_BEAN_AGE": "豆龄", + "BREW_INFORMATION_BREW_QUANTITY_TYPE_NAME": "计数类型", + "BREW_DATA_TDS_EY": "TDS / %EY", + "BREW_DATA_BREW_BEVERAGE_QUANTITY": "冲泡出的咖啡", + "BREW_DATA_PREPARATION_METHOD_TOOL": "冲泡器具", + "BREW_DATA_WATER": "水质", + "BREW_DATA_BEAN_WEIGHT_IN": "咖啡豆数量 (gr)", + "BREW_DATA_VESSEL": "Server", + "BREW_DATA_VESSEL_WEIGHT": "Server weight", + "BREW_DATA_VESSEL_NAME": "Server name", + "BREW_DATA_FLAVOR": "风味", + "BREW_DATA_FLOW_PROFILE": "Flow", + "ONE_DAY": "天", + "DAYS": "天", + "ONE_HOUR": "小时", + "HOURS": "小时", + "ONE_MINUTE": "分钟", + "MINUTES": "分钟", + "WITHOUT_COFFEE": "没冲咖啡", + "NOT_FOUND": "未找到", + "INVALID_FILE_FORMAT": "文件格式无效", + "FILE_NOT_FOUND_INFORMATION": "文件未找到", + "ERROR_ON_FILE_READING": "读取文件数据时出错", + "IMPORT_SUCCESSFULLY": "导入成功", + "IMPORT_UNSUCCESSFULLY_DATA_NOT_CHANGED": "导入不成功,没有数据被更改", + "INVALID_FILE_DATA": "无效的文件内容", + "DOWNLOADED": "下载", + "FILE_DOWNLOADED_SUCCESSFULLY": "文件 '{{fileName}}' 已成功下载到您的下载文件夹!", + "NO": "不", + "YES": "是", + "SURE_QUESTION": "确定吗?", + "DELETE_BREW_QUESTION": "删除本次冲泡?", + "DELETE_BEAN_QUESTION": "确定要删除这款咖啡豆吗? 所有相关的冲泡数据也将被删除!", + "DELETE_GREEN_BEAN_QUESTION": "确定要删除这款生豆吗? 所有相关的咖啡豆以及冲泡数据都将被删除!", + "DELETE_MILL_QUESTION": "确定要删除这个研磨机吗? 所有相关的冲泡数据也将被删除!", + "DELETE_PREPARATION_METHOD_QUESTION": "确定要删除这个器具吗? 所有相关的冲泡数据也将被删除!", + "DELETE_PREPARATION_TOOL_QUESTION": "确定要删除这个工具吗? 所有相关的冲泡数据也将被删除。", + "APP_COULD_NOT_STARTED_CORRECTLY_BECAUSE_MISSING_FILESYSTEM": "由于缺少文件系统,应用程序无法正确启动", + "CARE": "关心", + "ERROR_OCCURED": "出现错误", + "CSV_FILE_NOT_DOWNLOADED": "CSV 文件无法下载!", + "CSV_FILE_DOWNLOADED_SUCCESSFULLY": "CSV 文件 '{{fileName}}' 已成功下载到您的下载文件夹!", + "ADD_BREW": "添加冲泡", + "CHOOSE": "选择", + "CHOOSE_PHOTO_OR_LIBRARY": "拍摄照片或从相册选择", + "RECORD": "拍摄", + "PAGE_BEAN_INFORMATION": "咖啡豆信息", + "PAGE_BEAN_INFORMATION_GOOD_BREWS": "好的", + "PAGE_BEAN_INFORMATION_BAD_BREWS": "差的", + "PAGE_BEAN_INFORMATION_COUNT_BREWS": "总冲泡次数", + "INFORMATION": "信息", + "PAGE_BEAN_BREW_CHART_TITLE": "该款咖啡豆的冲泡概述", + "PAGE_BEAN_INFORMATION_AWESOME_BREWS": "令人惊叹", + "PAGE_BEAN_INFORMATION_NORMAL_BREWS": "感觉普通", + "PAGE_BEAN_INFORMATION_NOT_RATED_BREWS": "不做评价", + "PAGE_PREPARATION_INFORMATION_BREWS_DONE": "用这种器具冲泡", + "PAGE_PREPARATION_INFORMATION_BREWED_QUANTITY": "冲泡数量", + "PAGE_PREPARATION_INFORMATION_GRIND_WEIGHT": "消耗的豆子重量", + "PAGE_PREPARATION_INFORMATION_TIME_SPENT_BREWING": "总冲泡时间", + "PAGE_PREPARATION_INFORMATION": "器具信息", + "SECONDS": "秒", + "PAGE_MILL_INFORMATION": "磨豆机信息", + "PAGE_MILL_INFORMATION_BREWS_DONE": "使用这个磨豆机", + "PAGE_MILL_INFORMATION_GRIND_WEIGHT": "消耗的豆子重量", + "PAGE_HELPER_WATER_HARDNESS": "水的硬度", + "PAGE_HELPER_WATER_HARDNESS_CA_CONTENTS": "钙含量 mg/l", + "PAGE_HELPER_WATER_HARDNESS_MG_CONTENTS": "镁含量 mg/l", + "PAGE_HELPER_WATER_HARDNESS_GERMAN_HARDNESS": "°dH", + "PAGE_HELPER_WATER_HARDNESS_TOTAL_HARDNESS": "总硬度", + "PAGE_HELPER_BREW_RATIO": "粉液比", + "PAGE_HELPER_BREW_RATIO_GROUND_COFFEE": "咖啡粉重 (gr)", + "PAGE_HELPER_BREW_RATIO_WATER": "液体 (gr/ml)", + "PAGE_HELPER_BREW_RATIO_CALCULATED": "计算出的粉液比", + "PAGE_SETTINGS_SHOW_ARCHIVED_BREWS": "显示已经归档的冲泡", + "PAGE_SETTINGS_SHOW_ARCHIVED_BEANS": "显示已经归档的咖啡豆", + "PAGE_SETTINGS_SHOW_ARCHIVED_GREEN_BEANS": "显示已经归档的生豆", + "CUPPING_SCORE": "分数", + "CUPPING_SCORE_DRY_FRAGRANCE": "干香", + "CUPPING_SCORE_WET_AROMA": "湿香", + "CUPPING_SCORE_BRIGHTNESS": "明亮度", + "CUPPING_SCORE_FLAVOR": "风味", + "CUPPING_SCORE_BODY": "醇厚度", + "CUPPING_SCORE_FINISH": "尾韵", + "CUPPING_SCORE_SWEETNESS": "甜度", + "CUPPING_SCORE_CLEAN_CUP": "干净度", + "CUPPING_SCORE_COMPLEXITY": "复杂度", + "CUPPING_SCORE_UNIFORMITY": "一致性", + "CUPPING_SCORE_CUPPERS_CORRECTION": "杯测矫正", + "CUPPING_SCORE_DRY_FRAGRANCE_TOOLTIP": "指加入热水前,干磨咖啡的气味", + "CUPPING_SCORE_WET_AROMA_TOOLTIP": "指加入热水后,湿咖啡研磨的气味。", + "CUPPING_SCORE_BRIGHTNESS_TOOLTIP": "酸度是由一组绿原酸、柠檬酸、奎宁酸、乙酸等引起的咖啡中尖锐的高调味道,主要在口腔和舌头的前部感觉到。 (质量很好;与咖啡的苦味无关,也不会直接导致胃部不适)。 酸度受到许多杯测者的重视,并且直接关系到杯子的质量,因为酸度是高海拔种植的产物。", + "CUPPING_SCORE_FLAVOR_TOOLTIP": "这是口中的整体印象,包括所有其他评级。 有 4 种“主要味道”组(酸、甜、咸、苦)和许多“次要味道”。", + "CUPPING_SCORE_BODY_TOOLTIP": "通常被称为“口感”,主体是冲泡咖啡的重量和厚度感,由杯子中可溶性固体的百分比引起,包括提取的所有有机化合物(冲泡方法和使用的磨碎咖啡量会影响这一点 大大)。 我们对 Body 的评分较低,因为清淡的咖啡肯定不错,而且在某些原产地,较轻的酒体最适合整体杯子的特性。", + "CUPPING_SCORE_FINISH_TOOLTIP": "口腔清洁后的挥之不去的或新出现的味道。 这包括咖啡从嘴里流出到几分钟后的时间……这就是为什么你会发现很多杯测者在一两分钟后仍然体验到积极的味道时会修改回味分数的原因。", + "CUPPING_SCORE_SWEETNESS_TOOLTIP": "甜味几乎总是咖啡的理想品质,即使它被委婉地描述为“质朴的甜味”或“苦乐参半”。你可能会注意到精致的甜味(想想欧洲糕点、精美的糖果、白糖、 纯甜味)得分高,以及来自水果糖(果糖)的复杂甜味。 麦芽甜味(麦芽糖)不太传统,但非常令人向往,蜂蜜的范围从非常纯净干净到复杂、质朴的几乎是酵母味。 基本上,如果甜度是杯子的关键,它会被评为很好。", + "CUPPING_SCORE_CLEAN_CUP_TOOLTIP": "请注意,“干净的杯子”并不意味着咖啡上没有污垢。 它只是关于风味和“不干净”的原始、时髦的咖啡,而且风味也可能非常理想,例如来自苏门答腊的湿法去壳印度尼西亚咖啡,或干加工的埃塞俄比亚和也门类型。", + "CUPPING_SCORE_COMPLEXITY_TOOLTIP": "复杂性与“风味”和“完成”分数相得益彰,以传达多种风味的多样性或层次感。 这意味着在杯子里有很多发现。 再说一次,简单的咖啡可以在过度暴露于许多强大的、强烈的、复杂的咖啡后得到解脱。", + "CUPPING_SCORE_UNIFORMITY_TOOLTIP": "均匀度是指杯与杯之间的差异。 干法咖啡在本质上可能不如湿法咖啡均匀。 如果偶尔放弃的话,我们永远不会避免很多味道很好的东西。 这是在杯测方案中进行评分的,其中每个被审查的批次都制作了多个杯子。", + "CUPPING_SCORE_CUPPERS_CORRECTION_TOOLTIP": "这改编自 SCAA 系统和卓越杯评分(他们有时称其为“总分”)。 它允许杯测者确保总分正确传达杯子的整体印象。 你可能会批评这种方法,并认为它是“捏造”的。 在某种程度上,你是对的......但是改变类别分数以达到所需的总分(当你知道它是 7 时,给咖啡的酸度为 9)会更糟糕,或者相反,有一个 绝对值得 90 分的咖啡最终以 84 分结束。具体的 Cupper 校正数无关紧要,无论是 5 还是 8 ......这个想法是总分给出了咖啡质量的正确印象。", + "CUPPING_SCORE_TOOLTIP": "100-95 = 令人震惊,90-94 = 杰出,85-89 = 非常好,80-84 = 好,75-79 = 一般,70-74 = 差", + "DETAIL_BREW": "冲泡详情", + "DETAIL_BEAN": "咖啡豆详情", + "DETAIL_MILL": "研磨机详情", + "DETAIL_PREPARATION": "准备冲泡", + "EDIT_BREW": "编辑冲泡", + "ADD_BEAN": "添加咖啡豆", + "EDIT_BEAN": "编辑咖啡豆", + "ADD_PREPARATION": "添加冲泡器具", + "EDIT_PREPARATION": "编辑冲泡器具", + "ADD_MILL": "新增研磨机", + "EDIT_MILL": "编辑研磨机", + "USE_FILTER": "应用筛选", + "RESET_FILTER": "重置筛选", + "COFFEE_GRAMS_GRINDED": "研磨咖啡豆总克数", + "BEANS_USED": "研磨咖啡豆种类", + "BREW_HEADER_BEFORE_BREW": "冲泡前", + "BREW_HEADER_WHILE_BREW": "冲泡时", + "BREW_HEADER_AFTER_BREW": "冲泡后", + "BREW_HEADER_CUPPING": "品尝", + "BEANS_CONSUMED": "归档", + "NAV_MANAGE_PARAMETERS": "管理参数", + "NAV_SORT_PARAMETERS": "参数排序", + "NAV_DEFAULT_PARAMETERS": "定义默认参数", + "PAGE_SORT_PARAMETERS_DESCRIPTION": "拖放参数以定义它们将显示的顺序", + "PAGE_MANAGE_PARAMETERS_DESCRIPTION": "编辑冲泡信息时要显示的数据", + "PAGE_DEFAULT_PARAMETERS_DESCRIPTION": "标记哪些参数应默认为最后使用的值", + "SORT_PARAMETERS_BEFORE": "冲泡前", + "SORT_PARAMETERS_MEANWHILE": "冲泡时", + "SORT_PARAMETERS_AFTER": "冲泡后", + "MORE_INFORMATION": "更多信息", + "UNDERSTOOD": "了解", + "WELCOME_PAGE_ACTIVATE_ANALYTICS_TITLE": "分析和跟踪", + "WELCOME_PAGE_ACTIVATE_ANALYTICS_DESCRIPTION": "我们希望不断改进应用程序、网站和我们未来为您提供的服务。 为此,我们需要跟踪您如何使用该应用程序及其功能的一些数据。 但我们承诺,我们永远不会追踪任何个人数据。 为了确保这些承诺,我们使用 Matomo,一个以数据安全和隐私为中心的开源服务,该服务托管在我们自己的服务器上 - 这确保只有我们拥有数据所有权。 我们的网站提供有关我们跟踪的参数的所有信息,此外,您可以查看 100% 开源的源代码。 如果你有任何问题,请随时与我们联系。", + "ANALYTICS_INFORMATION_TITLE": "分析和跟踪", + "ANALYTICS_INFORMATION_DESCRIPTION": "如您所知,您的数据和隐私的安全是我们的首要任务。

因此,我们已从 Google Analytics 切换到以数据安全和隐私为重点的开源服务 Matomo,该服务由托管 在我们自己的服务器上 - 这意味着我们拥有完整的数据所有权。

跟踪的参数没有改变,我们仍然承诺永远不会跟踪任何个人数据。
我们的网站提供了我们跟踪的参数的所有信息,此外您可以查看100%开源的源代码。

您有问题吗?

联系我们。", + "ACTIVATE": "分析", + "DO_NOT_ACTIVE": "停止分析", + "WELCOME_PAGE_BEAN_TITLE": "咖啡豆", + "WELCOME_PAGE_BEAN_DESCRIPTION": "用咖啡豆来冲泡咖啡有点复杂。 请添加您的第一种咖啡豆以开始使用!", + "WELCOME_PAGE_BEAN_ADD": "添加咖啡豆", + "SKIP": "跳过", + "WELCOME_PAGE_PREPARATION_TITLE": "冲泡器具", + "WELCOME_PAGE_PREPARATION_DESCRIPTION": "V60滤杯, 爱乐压, 手冲式 - 冲泡咖啡的方式有很多种。请添加至少一个冲泡器具", + "WELCOME_PAGE_PREPARATION_ADD": "添加冲泡器具", + "WELCOME_PAGE_MILL_TITLE": "研磨机", + "WELCOME_PAGE_MILL_DESCRIPTION": "就快要完成了,但你需要一些东西来研磨咖啡豆!请添加至少一台研磨机", + "WELCOME_PAGE_MILL_ADD": "新增研磨机", + "WELCOME_PAGE_TITLE": "欢迎!", + "WELCOME_PAGE_BEAN_HEADLINE": "第一款咖啡豆", + "WELCOME_PAGE_PREPARATION_HEADLINE": "添加冲泡器具", + "WELCOME_PAGE_MILL_HEADLINE": "第一个研磨机", + "WELCOME_PAGE_LETS_START_HEADLINE": "现在我们开始吧!", + "WELCOME_PAGE_LETS_START_TITLE": "现在我们开始吧!", + "WELCOME_PAGE_LETS_START_DESCRIPTION": "恭喜,你已经准备好做你一生中最好的咖啡了。玩得开心,传播对好咖啡的热爱!", + "PREPARATION_TYPE": "制作类型", + "PREPARATION_TYPE_NAME": "名称", + "ARCHIVED": "归档", + "PAGE_SETTINGS_SHOW_ARCHIVED_PREPARATIONS": "显示归档的冲泡器具", + "PAGE_SETTINGS_SHOW_ARCHIVED_MILLS": "显示归档的冲泡研磨机", + "PAGE_MILL_LIST_NO_ARCHIVED_MILL_EXISTING": "你还没有归档任何一个研磨机", + "PAGE_PREPARATION_LIST_NO_ARCHIVED_PREPARATION_EXISTING": "你还没有归档任何一种器具", + "TOAST_BREW_ADDED_SUCCESSFULLY": "冲泡添加成功", + "TOAST_BREW_REPEATED_SUCCESSFULLY": "冲泡复制成功", + "TOAST_BEAN_ADDED_SUCCESSFULLY": "咖啡豆添加成功", + "TOAST_MILL_ADDED_SUCCESSFULLY": "新的研磨机已添加成功", + "TOAST_PREPARATION_ADDED_SUCCESSFULLY": "冲泡器具添加成功", + "TOAST_WATER_ADDED_SUCCESSFULLY": "水质添加成功", + "TOAST_BREW_DELETED_SUCCESSFULLY": "冲泡记录已被删除", + "TOAST_BEAN_DELETED_SUCCESSFULLY": "咖啡豆已被删除", + "TOAST_GREEN_BEAN_DELETED_SUCCESSFULLY": "生豆已被删除", + "TOAST_MILL_DELETED_SUCCESSFULLY": "研磨机已被删除", + "TOAST_WATER_DELETED_SUCCESSFULLY": "水质已被删除", + "TOAST_PREPARATION_DELETED_SUCCESSFULLY": "冲泡器具已被删除", + "TOAST_BREW_EDITED_SUCCESSFULLY": "冲泡记录已被编辑", + "TOAST_BEAN_EDITED_SUCCESSFULLY": "咖啡豆已被编辑", + "TOAST_MILL_EDITED_SUCCESSFULLY": "研磨机已被编辑", + "TOAST_PREPARATION_EDITED_SUCCESSFULLY": "器具已被编辑", + "TOAST_WATER_EDITED_SUCCESSFULLY": "水质已被编辑", + "TOAST_BEAN_ARCHIVED_SUCCESSFULLY": "咖啡豆已经归档", + "TOAST_MILL_ARCHIVED_SUCCESSFULLY": "研磨机已经归档", + "TOAST_PREPARATION_ARCHIVED_SUCCESSFULLY": "冲泡器具已经归档", + "TOAST_WATER_ARCHIVED_SUCCESSFULLY": "水质已被编辑", + "BEAN_WEIGHT_ALREADY_USED": "{{gramUsed}}g of {{gramTotal}}g", + "PREPARATION_TYPE_CUSTOM_PREPARATION": "自定义冲泡器具", + "PREPARATION_TYPE_AEROPRESS": "爱乐压", + "PREPARATION_TYPE_V60": "V60滤杯", + "PREPARATION_TYPE_CHEMEX": "Chemex", + "PREPARATION_TYPE_BIALETTI": "比乐蒂/摩卡壶", + "PREPARATION_TYPE_PORTAFILTER": "过滤手柄", + "PREPARATION_TYPE_KALITA_WAVE": "蛋糕杯", + "PREPARATION_TYPE_FRENCH_PRESS": "法压壶", + "PREPARATION_TYPE_SWANNECK": "Swanneck", + "PREPARATION_TYPE_DRIPPER": "聪明杯", + "PREPARATION_TYPE_DELTER_PRESS": "D特压(Delder Press)", + "PREPARATION_TYPE_COLD_BREW": "冷萃", + "PREPARATION_TYPE_AEROPRESS_INVERTED": "爱乐压倒压法", + "PREPARATION_TYPE_TURKISH": "极细研磨", + "PREPARATION_TYPE_BLUE_DRIPPER": "蓝瓶子滤杯", + "PREPARATION_TYPE_ADD_CUSTOM": "添加自定义器具", + "PREPARATION_TYPE_GINA": "Gina智能咖啡机", + "PREPARATION_TYPE_KONO": "KONO滤杯", + "PREPARATION_TYPE_ORIGAMI": "折纸滤杯", + "PREPARATION_TYPE_CAFELAT": "Cafelat拉杆咖啡机", + "PREPARATION_TYPE_OREA": "Orea滤杯", + "PREPARATION_TYPE_COLD_DRIP": "冰滴", + "PREPARATION_TYPE_HAND_LEVER": "手压式", + "PREPARATION_TYPE_FLAIR": "Flair手压意式咖啡机", + "PREPARATION_TYPE_APRIL_BREWER": "April Brewer滤杯", + "PREPARATION_TYPE_ESPRO_BLOOM": "Espro Bloom滤杯", + "PREPARATION_TYPE_FELLOW_STAGG": "Fellow Stagg温控咖啡壶", + "PREPARATION_TYPE_HSIAO_50": "Hsiao 50滤杯", + "PREPARATION_TYPE_KARLSBADER_KANNE": "Karlsbader", + "PREPARATION_TYPE_MOCCA_MASTER": "Mocca Master滴漏式咖啡机", + "PREPARATION_TYPE_SIPHON": "虹吸式", + "CHOOSE_BEANS": "选择咖啡豆", + "CHOOSE_BEAN": "选择咖啡豆", + "CHOOSE_WATERS": "选择水质", + "CHOOSE_WATER": "选择水质", + "CHOOSE_PREPARATIONS": "选择冲泡器具", + "CHOOSE_PREPARATION": "选择冲泡器具", + "CHOOSE_MILLS": "选择研磨机", + "CHOOSE_MILL": "选择研磨机", + "BEAN": { + "PLACE_HOLDER": { + "BEAN_DATA_NAME": "添加咖啡豆的名称", + "BEAN_DATA_ROAST_NAME": "添加烘焙温度", + "BEAN_DATA_ROASTING_DATE": "请输入咖啡豆的烘焙日期", + "BEAN_DATA_ROASTER": "请输入烘焙者的名称", + "BEAN_DATA_VARIETY": "添加咖啡品种", + "BEAN_DATA_PROCESSING": "请输入咖啡豆的处理方法,如:水洗", + "BEAN_DATA_COUNTRY": "它起源于哪儿?", + "BEAN_DATA_MIX": "什么是混合比例?", + "BEAN_DATA_AROMATICS": "描述它的风味吧", + "BEAN_DATA_WEIGHT": "咖啡豆的总重量", + "BEAN_DATA_COST": "购入这款咖啡豆花费了多少钱?", + "BEAN_DATA_REGION": "添加它的产区", + "BEAN_DATA_FARM": "添加它的庄园/农场", + "BEAN_DATA_FARMER": "添加它的种植者名称", + "BEAN_DATA_ELEVATION": "请输入咖啡豆的生长海拔", + "BEAN_DATA_HARVEST_TIME": "请输入咖啡豆的收获日期", + "BEAN_DATA_BUY_DATE": "请输入咖啡豆的购买日期", + "BEAN_DATA_PERCENTAGE": "添加该款咖啡豆在此包装中的占比(主要用于拼配包装填写)", + "BEAN_DATA_CERTIFICATION": "添加豆类认证 (例如:fair trade, bio)", + "BEAN_DATA_ROASTING_TYPE": "添加烘焙类型", + "BEAN_DATA_DECAFFEINATED": "这款咖啡不含咖啡因", + "BEAN_DATA_URL": "添加网站链接", + "BEAN_DATA_EAN": "添加条形码", + "BEAN_DATA_CUPPING_POINTS": "添加它的杯测分数", + "BEAN_DATA_PURCHASING_PRICE": "添加购买价格", + "BEAN_DATA_FOB_PRICE": "添加离岸价格", + "NOTES": "为咖啡豆添加注释", + "CHOOSE_DATA_ROASTER": "添加烘焙机", + "CHOOSE_DATA_ROASTING_TYPE": "选择烘焙类型" + } + }, + "PREPARATION": { + "PLACE_HOLDER": { + "PREPARATION_TYPE_NAME": "添加名称", + "NOTES": "为冲泡器具添加注释" + } + }, + "MILL": { + "PLACE_HOLDER": { + "NAME": "添加名称", + "NOTES": "为研磨机添加注释" + } + }, + "BREW": { + "PLACE_HOLDER": { + "BREW_DATA_GRIND_SIZE": "输入研磨设置,如:5", + "BREW_DATA_GRIND_WEIGHT": "输入此次冲泡咖啡的咖啡粉克数 (gr)", + "BREW_DATA_BREW_TEMPERATURE": "输入冲泡温度", + "BREW_DATA_PREPARATION_METHOD": "选择冲泡器具", + "BREW_DATA_BEAN_TYPE": "选择咖啡豆", + "BREW_DATA_MILL": "选择一个研磨机", + "BREW_DATA_MILL_SPEED": "输入研磨机的研磨速度", + "BREW_DATA_MILL_TIMER": "输入研磨所花费的时间", + "BREW_DATA_PRESSURE_PROFILE": "压力/流量曲线,冲泡建议等", + "BREW_DATA_TEMPERATURE_TIME": "请输入加热器具的时间", + "BREW_DATA_COFFEE_BLOOMING_TIME": "请输入闷蒸/预浸泡所花费的时间", + "BREW_DATA_COFFEE_FIRST_DRIP_TIME": "咖啡的第一滴水是什么时候出现的?", + "BREW_DATA_BREW_QUANTITY": "冲泡时用了多少水?", + "BREW_DATA_COFFEE_TYPE": "输入咖啡类型 (e.g. ristretto)", + "BREW_DATA_COFFEE_CONCENTRATION": "输入咖啡浓度", + "BREW_DATA_TDS": "总共溶解了多少固体?", + "BREW_DATA_NOTES": "为这次冲泡添加注释", + "BREW_DATA_BREW_BEVERAGE_QUANTITY": "冲泡完成以后,得到了多少的咖啡液?", + "BREW_DATA_PREPARATION_METHOD_TOOL": "请选择你的冲泡器具", + "BREW_DATA_WATER": "选择此次使用的水质", + "BREW_DATA_BEAN_WEIGHT_IN": "你使用了多少咖啡豆?(gr)" + } + }, + "ROASTED_BEFORE": "烘焙在", + "DAY_OLD": "天前", + "DAYS_OLD": "天前", + "BEANS_AMOUNT_USED": "已使用", + "CUPPING_BREW": "品尝", + "COFFEE_DRUNKEN_QUANTITY": "咖啡液", + "IMAGE_DELETED": "图片已删除", + "IMAGE_NOT_DELETED": "图片无法删除", + "EXTERNAL_STORAGE_NOT_SUPPORTED": "抱歉,不支持外部故事", + "BEANS_ARCHIVED": "已归档", + "TAB_ARCHIVE": "归档", + "TODAY": "今日", + "PLEASE_WAIT": "请稍等...", + "PREPARATION_STYLE_POUR_OVER": "手冲咖啡", + "PREPARATION_STYLE_ESPRESSO": "意式浓缩", + "PREPARATION_STYLE_FULL_IMMERSION": "全浸泡", + "PREPARATION_STYLE_PERCOLATION": "渗滤式", + "PREPARATION_TYPE_STYLE": "冲泡方式", + "PAGE_SETTINGS_FAST_REPEAT_DESCRIPTION": "开启一个新的菜单条目 - 使用它您可以直接复制冲泡。", + "PAGE_SETTINGS_TRACK_BREW_COORDINATES_DESCRIPTION": "保存每次冲泡时的经纬度", + "PAGE_SETTINGS_TRACK_CAFFEINE_CONSUMPTION_DESCRIPTION": "节省消耗的咖啡因量", + "UPDATE_TITLE": "有什么新玩意儿?", + "NEXT": "下一个", + "UPDATE_TEXT_TITLE_TITLE": { + "5.0.0": { + "TITLE": "版本 5.0: 新玩意儿!", + "DESCRIPTION": [ + "新布局,新图标,新颜色,新标志", + "新的冲泡器具", + "现在可以对冲泡进行分类(渗透、浓缩咖啡、全浸)", + "冲泡工作现在可以继承工具(例如不同的过滤器)", + "现在可以自定义冲泡参数,为每个冲泡定义自己的冲泡流程", + "添加了更多可编辑的咖啡豆信息,现在可以添加不同的排序", + "水量可渗透/全浸", + "你在哪里冲泡最好的咖啡? 主动设置经纬度保存", + "启用快速复制以立即添加冲泡", + "添加了更新屏幕以显示最新更改", + "在25次使用后向用户请求评分", + "为豆类添加了排序", + "添加了冲泡、咖啡豆的搜索面板", + "冲泡详细信息中添加了杯测图", + "在主页上显示剩余的豆子重量", + "为烘焙机添加了预输入", + "评级改为星级而不是图标" + ] + }, + "5.1.0": { + "TITLE": "版本 5.1: 新玩意儿!", + "DESCRIPTION": [ + "新的冲泡时间选择器", + "现在可以在 iOS 上再次选择烘焙日期", + "可以在 iPad 上再次选择图像", + "TDS 计算现在再次显示在饮料量上", + "为 iOS 设备添加了安全区域" + ] + }, + "5.2.0": { + "TITLE": "版本 5.2: 新玩意儿!", + "DESCRIPTION": [ + "冲泡:", + "冲泡计时器将在后台继续计时", + "可以将冲泡设为喜爱", + "添加和编辑咖啡豆的界面现在看起来几乎完全相同了", + "屏幕在冲泡期间可以保持亮屏(可以在设置菜单中启用)", + "最近的冲泡列表现在还能显示归档的冲泡", + "", + "咖啡豆:", + "咖啡豆照片显示在概览中", + "咖啡豆可以评级", + "", + "互动:", + "长按卡片会进入编辑视图", + "可以通过点击卡片访问详细视图", + "Github / Facebook / Instagram 帐户已关联", + "", + "修复:", + "咖啡豆信息复制不正确", + "新用户默认启用冲泡量", + "", + "其它:", + "Apple Healthkit 集成(可在设置菜单中启用)", + "清理", + "布局更改", + "统计扩展", + "启动检查已修改", + "支持冲泡和咖啡豆的不同卡片大小" + ] + }, + "5.3.1": { + "TITLE": "Version 5.3: Thats new!", + "DESCRIPTION": [ + "Brew methods:", + "Changes to the card view", + "Custom images can be attached in the edit screen", + "Brew tools will be saved in edit screen, even when '+' is not pressed", + "", + "Grinders:", + "Custom images can be attached in the edit screen", + "", + "Brews:", + "Parameter 'Attachments' renamed in 'Attachments / Photos'", + "", + "Dashboard:", + "If bean amount is less then 1000g, the number will be written as a whole", + "", + "Bug fixes:", + "Editing via a long-press, does not change information any more", + "Information on the dashboard are updated after made changes", + "Multiple variety information with blends can be saved again", + "Added startup error message if app-data is missing" + ] + }, + "5.4.0": { + "TITLE": "Version 5.4: Thats new!", + "DESCRIPTION": [ + "烘焙选项:", + "Manage all of your green beans and roasters (can be activated in the settings menu)", + "Save all of your green beans and transfer them into roasted onces", + "Add your roaster and connect them with your different kind of roasted beans", + "", + "Website:", + "Go live of our new website! -> https://beanconqueror.com", + "", + "Support us:", + "You've always wanted to support Beanconqueror? We've added a new 'Buy me a coffee' connection", + "", + "iOS - iCloud:", + "The first step into iCloud support was made. At the very first start all of your existing app data will be moved into the support iCloud directory.", + "You have to activate this option in the iCloud Settings first in order to save Beanconqueror on iCloud", + "", + "Android/iOS - Automated file-export:", + "Automated Beanconqueror.json-File is saved for a maximum of 7 days, after that they will be automated deleted again", + "Android: Download/Beanconqueror_export/Beanconqueror_automatic_export_DAY.json", + "iOS: Files/Download/Beanconqueror_export/Beanconqueror_automatic_export_FILE.json", + "", + "Settings:", + "Excel - Export all of your data to excel to work with it even further", + "Define your own image quality between 50% to 100% (default 100%)", + "Brew rating - Define how much stars/points you'd like to set for each brew. Minimum 5, maximum 100", + "", + "New tracking:", + "We've changed to our open source service Matomo, which will be hosted on our own server", + "Removed Google Analytics / Firebase", + "", + "Bug fixes:", + "Apple Healthkit - Settings were not saved", + "Sometimes brew rating stars weren't filled (Brew add/edit)", + "Edit via long tap, screen wasn't scrollable", + "Import of bigger files on iOS led to misconduct", + "Delete procedure of beans / preparations or mills were not consistent and lead to graphical issues", + "Wrong calculation of beverage quantity in statistics and list views", + "", + "分享:", + "与所有咖啡爱好者分享您的咖啡和咖啡豆!", + "", + "Other:", + "Clean ups", + "Layout changes", + "Extension of statistics", + "Startup check revised, added please wait window", + "Some label changes", + "Changed data access / order inside app to reduce problems" + ] + }, + "6.0.0": { + "TITLE": "Version 6.0: Thats new!", + "DESCRIPTION": [ + "蓝牙电子秤", + "Support of the first bluetooth scale - Decent-Scale - Big thanks to Decent Espresso", + "Support of Acaia Lunar", + "", + "Aroma cupping", + "Cup each brew with the different aromatics and flavors", + "", + "Water section", + "Add your own water, activate this section in the settings", + "", + "Support of more languages", + "Support for spanish - Big thanks to Frank!", + "", + "Improvements", + "Support of long press '+' on brews", + "Added new brew parameters", + "Support of different currencies", + "Edit brew while in detail view", + "Choose multiple images at once", + "Support of brix to TDS conversion", + "If bean package is empty, you'll be asked if you want to archive the package on the last brew", + "Reset of roastdate supported", + "Support of detail views on beans, grinders and preparation methods", + "Added brew ratio (g/l)", + "", + "iOS", + "Support of safe areas", + "", + "Bug fixes", + "Apple Healthkit - Decaffeinated coffee was saved", + "Copy of beans led to misconduct", + "Added brew time to excel export", + "Small bug fixes", + "", + "Others", + "Beans, grinders and preparation methods are now sorted alphabetic in dropdowns" + ] + }, + "6.1.0": { + "TITLE": "版本 6.1: 这些是新东西!", + "DESCRIPTION": [ + "二维码", + "扫描你的咖啡包装! 所有咖啡信息都将从烘焙店中插入。", + "", + "蓝牙电子秤", + "支持 Acaia Pearl 2021 - 感谢 Micah 和 Mike", + "支持 Acaia Lunar 2021 - 感谢 Micah 和 Mike", + "支持 Acaia Pyxis - 感谢 Micah 和 Mike", + "支持Hiroia Jimmy - 感谢 Silas", + "支持 Felicita Arc - 感谢 Herman", + "注意:目前不支持 Acaia Pearl 2021 以下的电子秤", + "咖啡豆页面现在可以使用蓝牙电子秤获得的重量信息", + "现在无需通过计时器开始冲泡即可看到重量变化", + "", + "冲泡概述", + "自定义概览中的可见冲煮参数或针对每种冲泡方法", + "准备图像现在在列表视图中可见", + "", + "冲泡视图", + "重制了冲泡视图,相比以往更加平滑", + "冲泡视图现在可以最大化", + "冲泡视图现在可以在冲泡细节视图中放大以及导出", + "现在显示平均流量", + "", + "咖啡豆", + "添加字段:购买日期、离岸价格、采购价格", + "现在可以收藏和筛选咖啡豆", + "如果咖啡豆被归档,您现在也可以对它进行评分", + "按+,您现在可以选择添加或扫描新的咖啡豆包装", + "长按+,直接添加新的咖啡豆", + "", + "预处理方法", + "预处理方法现在可以重复所有设置", + "支持更多的预处理方法 - 感谢 Nicola", + "选择一个预处理方法并展示图片", + "", + "设置", + "评级现在可以阶梯式进行(1、0.75、0.5、0.25、0.1)", + "蓝牙电子秤 - 定义在开始新的冲泡或启动计时器时是否应将秤设置为零重量", + "蓝牙电子秤 - 定义是否要忽略异常或负值 - 如果是,则无法生成实时图表", + "现在选择, 如果您想在主页上查看存档的咖啡豆", + "导出现在还导出保存的蓝牙值的原始数据", + "", + "改进", + "删除冲泡方法和工具时,不会再删除与其相关的咖啡豆", + "制备方法工具现在可以编辑和存档", + "", + "Bug修复:", + "发现更多可能导致数据丢失的问题", + "小错误修复", + "", + "其它:", + "更新到 Ionic-Framework 6,因此发生了一些小的视觉变化" + ] + }, + "6.1.3": { + "TITLE": "版本 6.1.3: 这些是新东西!", + "DESCRIPTION": [ + "Android - 注意", + "首先:对不起!", + "遗憾的是,数据库在 Android Play 商店中从 APK 格式重置为 AAB 格式,您的应用程序可能会在没有数据的情况下启动。", + "我无法调试或控制这种情况,虽然开发工作都按预期进行。", + "如果您的应用显示空白,请进入设置并导入下面的文件 'Download/Beanconqueror_export/Beanconqueror_automatic_export_*.json' * 代表最新的数据备份。", + "然后所有数据都应该恢复正常,如果没有,请给我写一封电子邮件:info@beanconqueror.com。" + ] + } + }, + "CUSTOM_PARAMETERS": "自定义参数", + "CUSTOM_DEFAULT_PARAMETERS": "默认", + "CUSTOM_MANAGE_PARAMETERS": "管理", + "CUSTOM_SORT_PARAMETERS": "种类", + "BREW_PARAMETER_CUSTOMIZE_TITLE": "自定义每种冲泡器具的参数", + "BREW_PARAMETER_CUSTOMIZE_DESCRIPTION": "您想为每种冲泡器具选择自定义参数吗?跳转到“器具”,打开具体冲泡器具的选项,选择“自定义参数”。现在您可以选择将用于此准备的参数!", + "BREW_DATA_BREW_QUANTITY_TOOLTIP": "不能用于意式浓缩咖啡的水量", + "BREW_DATA_COFFEE_FIRST_DRIP_TIME_TOOLTIP": "第一个可用于意式浓缩咖啡的滴漏咖啡o", + "BREW_DATA_PREPARATION_METHOD_TOOLTIP": "冲泡活动时可自定义", + "PAGE_SETTINGS_GENERAL": "常规设置", + "EDIT_PREPARATION_CUSTOM_PARAMETERS": "自定义参数", + "ENABLE_PREPARATION_CUSTOM_PARAMETERS": "使用个人参数", + "BEAN_ADD_ANOTHER_SORT": "添加另一种类", + "BEAN_SORT": "种类", + "BEAN_SORT_INFORMATION": "变化信息", + "BEAN_SORT_MORE_INFORMATION": "更多信息", + "NAVIGATE_TO_PREPARATION_METHODS": "跳转到冲泡页面", + "PREPARATION_TOOLS": "冲泡器具", + "PREPARATION_TOOLS_INFORMATION": "为您的过滤器添加不同的容器. 对于 V60 滤杯 或 123 添加例如 布、纸或网状过滤器", + "PREPARATION_TOOLS_PLACEHOLDER": "纸或布过滤器、VST-20g、14g-Basket等。", + "PREPARATION_PARAMETERS_CUSTOMIZED": "参数自定义", + "BEANS_WEIGHT_AVAILABLE": "可用的咖啡豆", + "SORT_ORDER": "改变顺序", + "ASCENDING": "升序", + "DESCENDING": "倒序", + "SORT_AFTER": "排序", + "BEAN_SORT_NAME_OF_BEAN": "咖啡豆名称", + "BEAN_SORT_ROASTER": "烘焙机", + "BEAN_SORT_ROASTING_DATE": "烘焙日期", + "BEAN_TAB_ROAST_INFORMATION": "烘焙信息", + "BEAN_TAB_GENERAL_INFORMATION": "常规", + "BEAN_TAB_SORT_INFORMATION": "品种信息", + "PAGE_SETTINGS_MANAGE_ARCHIVE": "管理归档", + "LAST_USE": "上一次使用在", + "SEARCH": "搜索", + "OVERVIEW": "概览", + "BEAN_HEADER_ADDITIONALE_INFORMATION": "附加信息", + "THREE_DEE_TOUCH_ACTION_BREW": "冲泡", + "THREE_DEE_TOUCH_ACTION_BEAN": "咖啡豆", + "THREE_DEE_TOUCH_ACTION_PREPARATION": "冲泡器具", + "THREE_DEE_TOUCH_ACTION_MILL": "研磨机", + "PAGE_CREDITS_NOT_EXISTING": "无内容", + "TIMER_HOUR": "小时", + "TIMER_MINUTES": "分钟", + "TIMER_SECONDS": "秒", + "EXCEL": { + "BEAN": { + "CREATION_DATE": "创建日期", + "ID": "咖啡豆编号" + }, + "PREPARATION": { + "CREATION_DATE": "创建日期", + "ID": "器具编号" + }, + "GRINDER": { + "CREATION_DATE": "创建日期", + "ID": "工厂编号" + } + }, + "EXCEL_EXPORT": "导出为Excel", + "HEALTH_KIT_QUESTION_TITLE": "节省咖啡因消耗", + "HEALTH_KIT_QUESTION_MESSAGE": "通过启用,每次冲泡中占用的咖啡因将自动保存在 Apple Health 中", + "NAV_ROASTING_SECTION": "烘焙", + "ROASTING_SECTION": { + "NAV_GREEN_BEANS": "生豆", + "NAV_ROASTING_MACHINE": "烘焙机", + "ROASTING_MACHINE": { + "TOTAL_ROAST_QUANTITY": "烘焙出的咖啡豆", + "TOTAL_ROAST_COUNT": "烘焙次数" + }, + "GREEN_BEAN": { + "ADD": "添加", + "EDIT": "编辑", + "DETAIL": "生豆详情", + "ROASTABLE": "待烘焙", + "NO_ROASTS_YET": "目前还没有烘焙" + }, + "BEAN": { + "DROP_TEMPERATURE": "烘焙的最终温度", + "ROAST_LENGTH": "烘焙时长", + "ROASTER_MACHINE": "烘焙机", + "GREEN_BEAN_WEIGHT": "生豆重量", + "OUTSIDE_TEMPERATURE": "气温", + "HUMIDITY": "湿度", + "FIRST_CRACK_MINUTE": "一爆分钟", + "FIRST_CRACK_TEMPERATURE": "一爆温度", + "SECOND_CRACK_MINUTE": "二爆分钟", + "SECOND_CRACK_TEMPERATURE": "二爆温度", + "PLACE_HOLDER": { + "DROP_TEMPERATURE": "烘焙的最终温度", + "ROAST_LENGTH": "烘焙时长", + "ROASTER_MACHINE": "烘焙机", + "GREEN_BEAN_WEIGHT": "生豆重量", + "OUTSIDE_TEMPERATURE": "气温", + "HUMIDITY": "湿度", + "FIRST_CRACK_MINUTE": "一爆分钟", + "FIRST_CRACK_TEMPERATURE": "一爆温度", + "SECOND_CRACK_TEMPERATURE": "二爆温度", + "SECOND_CRACK_MINUTE": "二爆分钟" + } + } + }, + "PAGE_SETTINGS_MANAGE_SECTIONS": "更多选项卡", + "PAGE_SETTINGS_SHOW_ROASTING_SECTION": "启用烘焙选项卡", + "PAGE_SETTINGS_SHOW_WATER_SECTION": "启用水质选项卡", + "PAGE_SETTINGS_SHOW_CUPPING_SECTION": "启用杯测选项", + "BEAN_DATA_BUY_DATE": "购买日期", + "BEAN_SORT_CREATION_DATE": "创建日期", + "BEAN_SORT_PURCHASE_DATE": "购买日期", + "BEAN_ROAST_COUNT": "烘焙度", + "TRANSFER_ROAST": "烘焙", + "BEAN_TAB_LINKED_ROASTS": "烘焙", + "BEAN_DATA_WEIGHT_AFTER_ROASTING": "烘焙后的重量", + "TOAST_GREEN_BEAN_ADDED_SUCCESSFULLY": "生豆已添加成功", + "TOAST_GREEN_BEAN_EDITED_SUCCESSFULLY": "生豆已编辑成功", + "TOAST_GREEN_BEAN_ARCHIVED_SUCCESSFULLY": "生豆已归档成功", + "TOAST_ROASTING_MACHINE_ADDED_SUCCESSFULLY": "烘焙机已添加成功", + "TOAST_ROASTING_MACHINE_EDITED_SUCCESSFULLY": "烘焙机已编辑成功", + "TOAST_ROASTING_MACHINE_ARCHIVED_SUCCESSFULLY": "烘焙机已归档成功", + "DELETE_ROASTING_MACHINE_QUESTION": "删除烘焙机?所有相关已经烘焙后的咖啡豆都将更新,不会被删除", + "TOAST_ROASTING_MACHINE_DELETED_SUCCESSFULLY": "烘焙机已删除成功", + "EDIT_ROASTING_MACHINE": "编辑", + "DETAIL_ROASTING_MACHINE": "烘焙详情", + "DELETE_WATER_QUESTION": "删除水质?所有相关已经烘焙后的咖啡豆都将更新,不会被删除", + "ROASTING_MACHINE": { + "PLACE_HOLDER": { + "NAME": "添加名称", + "NOTES": "为烘焙机添加注释" + } + }, + "NAV_ROASTING_MACHINE": "烘焙机", + "PAGE_ROASTING_MACHINE_LIST_NO_MACHINES_EXISTING": "您没有添加任何烘焙机", + "PAGE_ROASTING_MACHINE_LIST_NO_ARCHIVED_MACHINES_EXISTING": "您没有归档任何烘焙机", + "CHOOSE_ROASTING_MACHINES": "选择烘焙机", + "CHOOSE_ROASTING_MACHINE": "选择烘焙机", + "POPOVER_BREWS_OPTION_TOGGLE_FAVOURITE": "喜爱", + "TOAST_BREW_FAVOURITE_ADDED": "已添加为喜爱", + "TOAST_BREW_FAVOURITE_REMOVED": "已从喜爱中删除", + "BREW_FILTER_JUST_FAVOURITE": "喜爱", + "STATISTICS_PREPARATION_USAGES": "器具用途", + "STATISTICS_PREPARATION_TIMELINE_USAGES": "器具的使用历史", + "STATISTICS_GRINDER_TIMELINE_USAGES": "研磨机的使用历史", + "ACCEPT": "接受", + "STATISTIC_TAB_GENERAL": "常规", + "STATISTIC_TAB_BREWS": "冲泡", + "STATISTIC_TAB_BEANS": "咖啡豆", + "STATISTIC_TAB_PREPARATIONS": "冲泡器具", + "STATISTIC_TAB_GRINDERS": "研磨机", + "PAGE_STATISTICS_BREW_PER_DAYPROCESSES": "每天冲泡", + "PAGE_STATISTICS_BREW_TIME": "冲泡时间", + "PAGE_STATISTICS_PHOTOS_TAKEN": "拍摄的照片", + "PAGE_SETTINGS_IMAGE_QUALITY": "图像质量", + "PAGE_SETTINGS_IMAGE_QUALITY_TOOLTIP": "定义图像加载质量,这可以降低您的数据使用量。", + "PAGE_SETTINGS_BREW_RATING": "冲泡评分", + "PAGE_SETTINGS_BREW_RATING_TOOLTIP": "对冲泡进行-1到5分的评分太少了吗?你最高可以设置到100的评分区间", + "UPDATE_ENTRY_OF": "Update entry {{index}} of {{count}}", + "WEBSITE": "网站", + "SHARE": "分享", + "ANDROID_FILE_ACCESS_NEEDED_TITLE": "需要授权文件访问权限", + "ANDROID_FILE_ACCESS_NEEDED_DESCRIPTION": "为了让应用程序充分发挥作用,我们需要您授权文件访问。 否则应用程序内会有部分功能受限。 这是自动备份功能所需要的权限。", + "COULD_NOT_ACCESS_FILE": "我们无法访问所选文件", + "WRONG_FILE_FORMAT": "您选择了不受支持的文件格式", + "SCAN_BEAN": "扫描包", + "CLEAR": "清除", + "BEAN_LOOKS_LIKE_CONSUMED": "这包咖啡豆看起来已经完全消耗了,要将它归档吗?", + "CUPPING_1": "水果(Fruit)", + "CUPPING_2": "柑橘类(Citrus)", + "CUPPING_3": "柠檬和柠檬水(Lemo)", + "CUPPING_4": "酸橙(Lime)", + "CUPPING_5": "西柚(Grapefruit)", + "CUPPING_6": "小柑橘(Clementine)", + "CUPPING_7": "柑橘(Tangerine)", + "CUPPING_8": "砂糖橘(Mandarin orange)", + "CUPPING_9": "橙子(Orange)", + "CUPPING_10": "苹果/梨(Apple/pear)", + "CUPPING_11": "绿苹果(Green apple)", + "CUPPING_12": "红苹果(Red apple)", + "CUPPING_13": "瓜(Melon)", + "CUPPING_14": "西瓜(Watermelon)", + "CUPPING_15": "甜瓜(Honeydew)", + "CUPPING_16": "哈密瓜(Cantaloupe)", + "CUPPING_17": "葡萄(Grape)", + "CUPPING_18": "白葡萄(White grape)", + "CUPPING_19": "绿葡萄(Green grape)", + "CUPPING_20": "红葡萄(Red grape)", + "CUPPING_21": "康科德葡萄(Concord grape)", + "CUPPING_22": "热带水果(Tropical fruit)", + "CUPPING_23": "荔枝(Lychee)", + "CUPPING_24": "杨桃(Star fruit)", + "CUPPING_25": "酸角(Tamarind)", + "CUPPING_26": "百香果(Passion fruit)", + "CUPPING_27": "菠萝(Pineapple)", + "CUPPING_28": "芒果(Mango)", + "CUPPING_29": "木瓜(Papaya)", + "CUPPING_30": "猕猴桃(Kiwi)", + "CUPPING_31": "香蕉(Banana)", + "CUPPING_32": "椰子(Coconut)", + "CUPPING_33": "核果(Stone fruit)", + "CUPPING_34": "桃子(Peach)", + "CUPPING_35": "油桃(Nectarine)", + "CUPPING_36": "杏(Apricot)", + "CUPPING_37": "李子(Plum)", + "CUPPING_38": "樱桃(Cherry)", + "CUPPING_39": "黑樱桃(Black cherry)", + "CUPPING_40": "浆果类(Berry)", + "CUPPING_41": "蔓越莓(Cranberry)", + "CUPPING_42": "覆盆子(Raspberry)", + "CUPPING_43": "草莓(Strawberry)", + "CUPPING_44": "蓝莓(Blueberry)", + "CUPPING_45": "红加仑(Red currant)", + "CUPPING_46": "黑加仑(Black currant)", + "CUPPING_47": "干果类(Dried fruit)", + "CUPPING_48": "红葡萄干(Golden raisin)", + "CUPPING_49": "葡萄干(Raisin)", + "CUPPING_50": "无花果干(Dried fig)", + "CUPPING_51": "枣干(ried dates)", + "CUPPING_52": "梅干(Prune)", + "CUPPING_53": "甜味和烘培(Sweet & Roasting Notes)", + "CUPPING_54": "巧克力(Chocolate)", + "CUPPING_55": "可可碎(Cacao nibs)", + "CUPPING_56": "黑巧(Dark chocolate)", + "CUPPING_57": "贝克巧克力(Bakers chocolate)", + "CUPPING_58": "Bittersweet chocolate", + "CUPPING_59": "可可粉(Cocoa powder)", + "CUPPING_60": "牛奶巧克力(Milk chocolate)", + "CUPPING_61": "坚果类(Nut)", + "CUPPING_62": "核桃(Walnut)", + "CUPPING_63": "花生(Peanut)", + "CUPPING_64": "腰果(Cashew)", + "CUPPING_65": "山核桃(Pecan)", + "CUPPING_66": "榛子(Hazelnut)", + "CUPPING_67": "杏仁(Almond)", + "CUPPING_68": "谷物(Grain & Cereal)", + "CUPPING_69": "Sweet bread pastry", + "CUPPING_70": "格兰诺拉麦片(Granola)", + "CUPPING_71": "全麦饼干(Graham cracker)", + "CUPPING_72": "黑麦(Rye)", + "CUPPING_73": "小麦(Wheat)", + "CUPPING_74": "大麦(Barley)", + "CUPPING_75": "新鲜面包(Fresh bread)", + "CUPPING_76": "甜味和糖类(Sweet & Sugary)", + "CUPPING_77": "香草(Vanila)", + "CUPPING_78": "牛轧糖(Nougat)", + "CUPPING_79": "蜂蜜(Honey)", + "CUPPING_80": "黄油(Butter)", + "CUPPING_81": "奶油(Cream)", + "CUPPING_82": "棉花糖(Marshmallow)", + "CUPPING_83": "甘蔗(Sugarcane)", + "CUPPING_84": "红糖(Brown sugar)", + "CUPPING_85": "焦糖(Caramel)", + "CUPPING_86": "枫糖浆(Maple syrup)", + "CUPPING_87": "糖浆(Molasses)", + "CUPPING_88": "可乐(Cola)", + "CUPPING_89": "烘焙(Roast)", + "CUPPING_90": "吐司(Toast)", + "CUPPING_91": "焦糖(Burnt sugar)", + "CUPPING_92": "烟熏(Smokey)", + "CUPPING_93": "木炭(Carbon)", + "CUPPING_94": "植物、咸味食物和香料(Vegetal, Savory & Spices)", + "CUPPING_95": "香料(Spice)", + "CUPPING_96": "黑胡椒(Black pepper)", + "CUPPING_97": "白胡椒(White pepper)", + "CUPPING_98": "肉桂(Cinnamon)", + "CUPPING_99": "芫荽、香菜(Coriander)", + "CUPPING_100": "生姜(Ginger)", + "CUPPING_101": "肉豆蔻(Nutmeg)", + "CUPPING_102": "咖喱(Curry)", + "CUPPING_103": "甘草-茴香Licorice-anise", + "CUPPING_104": "丁香(Clove)", + "CUPPING_105": "咸味食物(Savory)", + "CUPPING_106": "Leathery", + "CUPPING_107": "Meat-like", + "CUPPING_108": "酱油(Soy sauce)", + "CUPPING_109": "番茄干(Sundried tomato)", + "CUPPING_110": "番茄(Tomato)", + "CUPPING_111": "植物泥土草药(Vegetal Earthy Herb)", + "CUPPING_112": "土壤(Soil)", + "CUPPING_113": "新鲜木材(Fresh wood)", + "CUPPING_114": "雪松(Cedar)", + "CUPPING_115": "烟草(Tobacco)", + "CUPPING_116": "干草/稻草(Hay / straw)", + "CUPPING_117": "绿叶蔬菜(Leafy greens)", + "CUPPING_118": "橄榄(Olive)", + "CUPPING_119": "青椒(Green pepper)", + "CUPPING_120": "南瓜(Squash)", + "CUPPING_121": "蘑菇(Mushroom)", + "CUPPING_122": "甜豌豆(Sweet pea)", + "CUPPING_123": "荷兰豆(Snow pea)", + "CUPPING_124": "草(Grassy)", + "CUPPING_125": "茴香(Dill)", + "CUPPING_126": "鼠尾草(Sage)", + "CUPPING_127": "薄荷(Mint)", + "CUPPING_128": "绿茶(Green tea)", + "CUPPING_129": "红茶(Black tea)", + "CUPPING_130": "啤酒花(Hops)", + "CUPPING_131": "佛手柑(Bergamot)", + "CUPPING_132": "花类(Flowery)", + "CUPPING_133": "花(Floral)", + "CUPPING_134": "木槿花(Hibiscus)", + "CUPPING_135": "蔷薇果(Rose hips)", + "CUPPING_136": "薰衣草(Lavender)", + "CUPPING_137": "木兰花(Magnolia)", + "CUPPING_138": "茉莉、金银花(Jasmine honeysuckle)", + "CUPPING_139": "橙花(Orange blossom)", + "CUPPING_140": "香茅(Lemongrass)", + "WATER_SECTION": { + "NAV_WATER": "水质", + "YOU_GOT_NO_ARCHIVED_WATER": "你还没有归档任何水质", + "YOU_GOT_NO_WATER": "你还没有添加任何水质", + "CATEGORY_INFORMATION": "水质信息", + "CATEGORY_GENERAL": "常规", + "WATER_BOTTLE_EXPLANATION": "水质通常以 ppm = mg/L 为单位表示浓度", + "USED_TIMES": "使用次数", + "AMOUNT": "使用量", + "WATER": { + "GENERAL_HARDNESS": "一般硬度 (GH)", + "TOTAL_ALKALINITY": "总碱度 (KH)", + "CALCIUM": "钙 (Ca)", + "MAGNESIUM": "镁 (Mg)", + "SODIUM": "钠 (Na)", + "TDS": "总溶解固体 (TDS)", + "UNITS": "单位", + "PLACE_HOLDER": { + "GENERAL_HARDNESS": "一般硬度", + "TOTAL_ALKALINITY": "总碱度", + "CALCIUM": "钙 (Ca)", + "MAGNESIUM": "镁 (Mg)", + "SODIUM": "钠 (Na)", + "TDS": "总溶解固体 (TDS)", + "NAME": "添加水的名称", + "NOTES": "为水质添加注释" + }, + "WATER_UNIT": { + "UNKNOWN": "不清楚", + "PPM": "以CaCO3计量ppm", + "MG_L": "mg/L", + "MMOL_L": "mmol/L", + "DH": "°dH" + } + } + }, + "BREW_BRIX_CALCULATION": "白利糖度", + "SET_TDS": "设置 tds", + "TOTAL_WEIGHT": "总重量", + "CALCULATED_WEIGHT": "计算重量", + "SET_WEIGHT": "设置重量", + "ADD_FLAVORS_AROMAS_TITLE": "香气/风味", + "CUSTOM_FLAVORS_AROMAS": "自定义香气", + "CUSTOM_FLAVORS_AROMAS_PLACEHOLDER": "以自己的语言描述它的香气", + "PREDEFINED_FLAVORS_AROMAS": "常见的香气", + "ADD_AROMA_FLAVOR": "添加香气/风味", + "BEAN_WEIGHT_IN_PLACEHOLDER": "从咖啡包装中取出的咖啡豆", + "VESSEL_PLACEHOLDER": "容器名和净重", + "GRIND_WEIGHT_PLACEHOLDER": "用于冲泡的咖啡粉的重量", + "PRESET_BREW_TITLE": "使用最后一次冲泡作为预设", + "CUPPING_BREW_TAB_AROMA": "香气", + "CUPPING_BREW_TAB_TASTING": "评分", + "WATER_PLACEHOLDER": "如需完整功能,请在设置菜单中激活水质部分", + "PAGE_SETTINGS_SCALES": "电子秤", + "CONNECT": "连接", + "DISCONNECT": "断开连接", + "SCALE": { + "BLUETOOTH_SCAN_RUNNING": "正在搜索附件的电子秤,请稍等60秒", + "BLUETOOTH_NOT_ENABLED": "未开启蓝牙,请开启蓝牙以进行搜索", + "CONNECTION_NOT_ESTABLISHED": "附近找不到电子秤或是无法建立连接", + "CONNECTED_SUCCESSFULLY": "电子秤已连接", + "DISCONNECTED_SUCCESSFULLY": "电子秤已断开连接", + "DISCONNECTED_UNPLANNED": "电子秤意外断开", + "REQUEST_PERMISSION": { + "LOCATION": "软件需要位置权限来搜索电子秤", + "BLUETOOTH": "软件需要蓝牙权限来搜索电子秤" + }, + "INFORMATION_DESCRIPTION": "支持的电子秤: Decent 电子秤, Acaia 电子秤, Felicita 电子秤以及 Hiroia Jimmy" + }, + "QR": { + "WRONG_QRCODE_DESCRIPTION": "错误的二维码或错误的内容", + "WRONG_QRCODE_TITLE": "错误", + "WRONG_LINK_DESCRIPTION": "错误的应用链接", + "WRONG_LINK_TITLE": "错误", + "SERVER": { + "ERROR_OCCURED": "出现错误,无法读取二维码,请重试。" + }, + "BEAN_SUCCESSFULLY_SCANNED": "咖啡豆扫描成功", + "IMAGES_GETTING_DOWNLOADED": "正在下载的图像" + }, + "RETRY_CONNECT": "重试连接", + "SMART_SCALE_STAY_CONNECTED_ON_APP_MINIMIZE": "即使应用程序被最小化/非活动状态,也让电子秤连接", + "BREW_FLOW_WEIGHT": "重量", + "BREW_FLOW_WEIGHT_PER_SECOND": "流速", + "ROAST_TYPE_UNKNOWN": "不清楚", + "ROAST_TYPE_CINNAMON_ROAST": "浅烘焙(Cimon Roast)", + "ROAST_TYPE_AMERICAN_ROAST": "美式烘焙(American Roast)", + "ROAST_TYPE_NEW_ENGLAND_ROAST": "新英格兰烘焙(New England Roast)", + "ROAST_TYPE_HALF_CITY_ROAST": "半城市烘焙(Half City Roast)", + "ROAST_TYPE_MODERATE_LIGHT_ROAST": "Moderate-Light Roast", + "ROAST_TYPE_CITY_ROAST": "中深度烘焙(City Roast)", + "ROAST_TYPE_CITY_PLUS_ROAST": "City+ Roast", + "ROAST_TYPE_FULL_CITY_ROAST": "微深度烘焙(Full City Roast)", + "ROAST_TYPE_FULL_CITY_PLUS_ROAST": "深度烘焙(Full City + Roast)", + "ROAST_TYPE_ITALIAN_ROAST": "极深度烘焙(Italian Roast)", + "ROAST_TYPE_VIEANNA_ROAST": "维也纳烘焙(Vienna Roast)", + "ROAST_TYPE_FRENCH_ROAST": "法式烘焙(French Roast)", + "ROAST_TYPE_CUSTOM_ROAST": "自定义", + "BEAN_MIX_UNKNOWN": "不清楚", + "BEAN_MIX_SINGLE_ORIGIN": "单一产地", + "BEAN_MIX_BLEND": "拼配", + "BEAN_ROASTING_TYPE_FILTER": "滴滤式/Filter", + "BEAN_ROASTING_TYPE_ESPRESSO": "意式浓缩/Espresso", + "BEAN_ROASTING_TYPE_OMNI": "均可/Omni", + "BEAN_ROASTING_TYPE_UNKNOWN": "不清楚", + "SMART_SCALE_LOG": "为智能电子秤激活日志文件(仅用于发送日志进行调试)", + "TOAST_PREPARATION_TOOL_EDITED_SUCCESSFULLY": "杯测工具编辑", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE": "蓝牙电子秤", + "PAGE_SETTINGS_TAB_GENERAL": "常规", + "SMART_SCALE_TARE_ON_BREW": "在开始新的冲泡时去皮", + "SMART_SCALE_TARE_ON_START_TIMER": "当定时器启动时去皮", + "PAGE_SETTINGS_BREW_RATING_STEPS": "评级步骤", + "BREW_AVG_FLOW_WEIGHT_PER_SECOND": "Ø 流速", + "CUSTOM_LIST_VIEW_PARAMETERS": "列表视图参数", + "NAV_LIST_VIEW_CUSTOM_PARAMETERS": "列表视图参数", + "PAGE_LIST_VIEW_CUSTOM_PARAMETERS_DESCRIPTION": "决定你的咖啡冲泡的哪个参数,应该显示在列表视图上", + "BREW_DATA_VESSEL_NAME_WEIGHT": "容器 名称/重量", + "IGNORE_NEGATIVE_VALUES": "忽略负重量值", + "IGNORE_ANOMALY_VALUES": "忽略异常值", + "IGNORE_ANOMALY_VALUES_TOOLTIP": "例如:在秤上旋转杯子", + "TOAST_BEAN_FAVOURITE_ADDED": "喜爱已添加", + "TOAST_BEAN_FAVOURITE_REMOVED": "喜爱已移除", + "QR_CODE_SCANNER_INFORMATION_TITLE": "二维码", + "QR_CODE_SCANNER_INFORMATION_DESCRIPTION": "所有扫描的咖啡豆信息都直接来自烘焙店。
如果您发现错误或误导性信息,请通过电子邮件通知我: info@beanconqueror.com.", + "DONT_SHOW_AGAIN": "不再显示", + "ARCHIVED_TOOLS": "归档工具", + "UNARCHIVE": "取消归档", + "PAGE_SETTINGS_HIDE_ARCHIVED_BREWS_DASHBOARD": "在仪表盘上显示已归档的冲泡", + "PAGE_SETTINGS_HIDE_ARCHIVED_BREWS_DASHBOARD_DESCRIPTION": "已归档的冲泡应该显示在主页上吗?", + "COPY": "复制", + "TOAST_PREPARATION_METHOD_REPEATED_SUCCESSFULLY": "杯测方法复制成功", + "PREPARATION_TYPE_CAFEC_FLOWER": "Cafec 花辦滤杯(Cafec Flower)", + "PREPARATION_TYPE_DECEMBER_DRIPPER": "December 可调咖啡滤杯(December Dripper)", + "PREPARATION_TYPE_DECENT_ESPRESSO": "Decent Espresso", + "PREPARATION_TYPE_HARIO_SWITCH": "Hario Switch 聪明杯", + "PREPARATION_TYPE_HARIO_WOODNECK": "Hario Woodneck 滤布", + "PREPARATION_TYPE_RATIO_SIX_COFFEE_BREWER": "Ratio Six Coffee Brewer", + "PREPARATION_TYPE_ROK": "ROK 手压咖啡机", + "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo", + "PREPARATION_TYPE_TRICOLATE": "Tricolate 聪明杯" +} From 7703745813c893dc04e2e5f0e8f58ae61a140f31 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Fri, 17 Jun 2022 21:14:00 +0200 Subject: [PATCH 17/78] #382 - Support turkish/chinese --- src/app/app.component.ts | 6 + src/app/settings/settings.page.html | 2 + src/assets/i18n/de.json | 2 + src/assets/i18n/en.json | 2 + src/assets/i18n/es.json | 2 + src/assets/i18n/tr.json | 1191 +++++++++++++++++++++++ src/assets/i18n/{zh-cn.json => zh.json} | 25 +- 7 files changed, 1228 insertions(+), 2 deletions(-) create mode 100644 src/assets/i18n/tr.json rename src/assets/i18n/{zh-cn.json => zh.json} (98%) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 88f460bde..df51bff45 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -367,6 +367,12 @@ export class AppComponent implements AfterViewInit { } else if (systemLanguage === 'es') { settingLanguage = 'es'; } + else if (systemLanguage === 'tr') { + settingLanguage = 'tr'; + } + else if (systemLanguage === 'zh') { + settingLanguage = 'zh'; + } else { settingLanguage = 'en'; } diff --git a/src/app/settings/settings.page.html b/src/app/settings/settings.page.html index ace19725b..130ed77d3 100644 --- a/src/app/settings/settings.page.html +++ b/src/app/settings/settings.page.html @@ -56,6 +56,8 @@ {{"PAGE_SETTINGS_LANGUAGE_GERMAN" | translate}} {{"PAGE_SETTINGS_LANGUAGE_ENGLISH" | translate}} {{"PAGE_SETTINGS_LANGUAGE_SPANISH" | translate}} + {{"PAGE_SETTINGS_LANGUAGE_TURKISH" | translate}} + {{"PAGE_SETTINGS_LANGUAGE_CHINESE" | translate}} diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 9186af3eb..fdc4a07d6 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -56,6 +56,8 @@ "PAGE_SETTINGS_LANGUAGE_GERMAN": "Deutsch", "PAGE_SETTINGS_LANGUAGE_ENGLISH": "Englisch", "PAGE_SETTINGS_LANGUAGE_SPANISH": "Spanisch", + "PAGE_SETTINGS_LANGUAGE_TURKISH": "Türkisch", + "PAGE_SETTINGS_LANGUAGE_CHINESE": "Chinesisch (Vereinfacht)", "PAGE_SETTINGS_GENERAL_SETTINGS": "Allgemeine Einstellungen", "PAGE_SETTINGS_TRANSFER": "Datenübertragung", "PAGE_SETTINGS_PRESET_LAST_BREW": "Letzen Bezug vorbelegen?", diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index dec467b5e..0a7c94fea 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -56,6 +56,8 @@ "PAGE_SETTINGS_LANGUAGE_GERMAN": "German", "PAGE_SETTINGS_LANGUAGE_ENGLISH": "English", "PAGE_SETTINGS_LANGUAGE_SPANISH": "Spanish", + "PAGE_SETTINGS_LANGUAGE_TURKISH": "Turkish", + "PAGE_SETTINGS_LANGUAGE_CHINESE": "Basitleştirilmiş Çince", "PAGE_SETTINGS_GENERAL_SETTINGS": "General Settings", "PAGE_SETTINGS_TRANSFER": "Data Transfer", "PAGE_SETTINGS_PRESET_LAST_BREW": "Preset Values?", diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index 04f2688cb..cc3fd8242 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -56,6 +56,8 @@ "PAGE_SETTINGS_LANGUAGE_GERMAN": "Deutsch", "PAGE_SETTINGS_LANGUAGE_ENGLISH": "Englisch", "PAGE_SETTINGS_LANGUAGE_SPANISH": "Español", + "PAGE_SETTINGS_LANGUAGE_TURKISH": "Turco", + "PAGE_SETTINGS_LANGUAGE_CHINESE": "Chino (simplificado)", "PAGE_SETTINGS_GENERAL_SETTINGS": "Configuraciones generales", "PAGE_SETTINGS_TRANSFER": "Transferencia de datos", "PAGE_SETTINGS_PRESET_LAST_BREW": "¿Guardar ultima preparación como plantilla?", diff --git a/src/assets/i18n/tr.json b/src/assets/i18n/tr.json new file mode 100644 index 000000000..e6e9b0165 --- /dev/null +++ b/src/assets/i18n/tr.json @@ -0,0 +1,1191 @@ +{ + "NAV_MENU": "Menü", + "NAV_HOME": "Ana Sayfa", + "NAV_SETTINGS": "Ayarlar", + "NAV_BREWS": "Demlemeler", + "NAV_BEANS": "Çekirdekler", + "NAV_PREPARATION": "Yöntemler", + "NAV_MILL": "Öğütücüler", + "NAV_ABOUT_US": "Hakkımızda", + "NAV_CONTACT": "İletişim", + "NAV_PRIVACY": "Gizlilik", + "NAV_CREDITS": "Katkıda Bulunanlar", + "NAV_TERMS": "Şartlar ve Koşullar", + "NAV_THANKS": "Teşekkürler!", + "NAV_LICENCES": "Açık Kaynak Lisansları", + "NAV_STATISTICS": "İstatistikler", + "NAV_IMPRESSUM": "Künye", + "NAV_COOKIE": "Çerez", + "NAV_LOGS": "Günlükler", + "NAV_BREW_PARAMS": "Demleme Paremetreleri", + "NAV_INFORMATION_TO_APP": "Beanconqueror Hakkında", + "NAV_WATER_SECTION": "Su", + "NAV_HELPER": "Hesaplamalar", + "POPOVER_BREWS_OPTION_REPEAT": "Tekrar et", + "POPOVER_BREWS_OPTION_DETAIL": "Ayrıntılar", + "DETAIL": "Ayrıntılar", + "POPOVER_BREWS_OPTION_EDIT": "Düzenle", + "POPOVER_BREWS_OPTION_DELETE": "Sil", + "POPOVER_BREWS_OPTION_PHOTO_GALLERY": "Fotoğraf Galerisi", + "POPOVER_BREWS_OPTION_CUPPING": "Tadım", + "POPOVER_BREWS_OPTION_MAP_COORDINATES": "Haritada göster", + "POPOVER_BREWS_OPTION_FAST_REPEAT": "Hızlı demleme tekrarı", + "PAGE_BREWS_NO_ENTRIES": "Henüz demleme eklenmedi", + "PAGE_BREWS_NO_ARCHIVED_ENTRIES": "Henüz bir demleme arşivlemediniz", + "CANT_START_NEW_BREW_TITLE": "Burada bir şeyler eksik ...", + "CANT_START_NEW_BREW_DESCRIPTION": "Başlamak için lütfen bir çeşit çekirdek, bir demleme yöntemi ve bir öğütücü için açıklama oluşturun. Bu bilgiyi eklemek üzere farklı kategorilere gitmek için menüyü kullanın.", + "PAGE_HOME_WELCOME_GREETINGS": "Burada olmana sevindim!", + "PAGE_HOME_TOTAL_BREW": "Demleme", + "PAGE_HOME_TOTAL_BREWS": "Demlemeler", + "PAGE_HOME_BEAN_EXPLORED": "Çekirdek keşfedildi", + "PAGE_HOME_BEANS_EXPLORED": "Çekirdekler keşfedildi", + "PAGE_HOME_LAST_BREWS": "Son demlemeler", + "PAGE_HOME_LAST_BREW": "Son demleme", + "PAGE_HOME_DIFFERENT_PREPARATION_METHODS": "Farklı hazırlama yöntemleri", + "PAGE_HOME_DIFFERENT_MILLS": "Farklı öğütücüler", + "PAGE_HOME_SUPPORTER": "Uygulama Destekçisi", + "PAGE_HOME_START_BREW": "Demlemeye Başla", + "PAGE_BEANS_LIST_OBTAINABLE": "Mevcut", + "PAGE_BEANS_LIST_YOU_GOT_NO_FRESH_BEANS": "Taze çekirdeğiniz bitti!", + "PAGE_BEANS_LIST_YOU_GOT_NO_FINISHED_BEANS": "Arşivlenmiş çekirdeğiniz yok.", + "PAGE_MILL_LIST_NO_MILL_EXISTING": "Henüz öğütücü eklemediniz.", + "PAGE_PREPARATION_LIST_NO_PREPARATION_EXISTING": "Henüz herhangi bir demleme yöntemi eklemediniz.", + "PAGE_CONTACT_SUGGESTIONS_QUESTIONS_WISHES": "Öneri, soru veya istekleriniz?", + "PAGE_THANKS_THANKS_FOR_YOUR_SUPPORT": "Desteğiniz için teşekkürler", + "PAGE_SETTINGS_LANGUAGE": " Dil Ayarları", + "PAGE_SETTINGS_LANGUAGE_GERMAN": "Almanca", + "PAGE_SETTINGS_LANGUAGE_ENGLISH": "İngilizce", + "PAGE_SETTINGS_LANGUAGE_SPANISH": "İspanyolca", + "PAGE_SETTINGS_LANGUAGE_TURKISH": "Türk", + "PAGE_SETTINGS_LANGUAGE_CHINESE": "Chino (simplificado)", + "PAGE_SETTINGS_GENERAL_SETTINGS": "Genel Ayarlar", + "PAGE_SETTINGS_TRANSFER": "Veri Aktarımı", + "PAGE_SETTINGS_PRESET_LAST_BREW": "Ön Ayar Değerleri?", + "PAGE_SETTINGS_DISPLAY": "Görüntüle", + "PAGE_SETTINGS_DISPLAY_SINGLE_PAGE": "Tek Sayfa", + "PAGE_SETTINGS_DISPLAY_PAGING": "Sayfalara Ayır", + "PAGE_SETTINGS_STARTUP_VIEW": "Başlangıç ​​Sayfası", + "PAGE_SETTINGS_ANALYTICS_INFORMATION": "Analizler", + "PAGE_SETTINGS_ANALYTICS_INFORMATION_TOOLTIP": "Daha fazla bilgi için i tuşuna basın", + "PAGE_SETTINGS_TRACK_BREW_COORDINATES": "Demleme koordinatlarını kaydet", + "PAGE_SETTINGS_FAST_REPEAT": "Hızlı demleme tekrarı", + "PAGE_SETTINGS_TRACK_CAFFEINE_CONSUMPTION": "Kafein tüketimini kaydedin", + "PAGE_SETTINGS_WAKE_LOCK": "Demleme sırasında ekranı etkin tut", + "PAGE_SETTINGS_CURRENCY": "Para Birimi", + "PAGE_STATISTICS_DIFFERENT_PREPARATION_METHOD": "Hazırlama Yöntemleri", + "PAGE_STATISTICS_TOTAL_GROUND_BEANS": "Toplam öğütülmüş çekirdek miktarı", + "PAGE_STATISTICS_MONEY_SPENT_FOR_COFFEE": "Çekirdekler için harcanan para", + "PAGE_STATISTICS_DRUNKEN_BREWS": "Toplam demleme sayısı ", + "PAGE_STATISTICS_BREW_PROCESSES": "Toplam demleme", + "PAGE_STATISTICS_DRUNKEN_QUANTITY": "Tüketilen miktar", + "PAGE_STATISTICS_BEAN_WEIGHT_USED": "Kullanılan çekirdek toplamı", + "PAGE_BREW_TEXT_INFORMATION_FROM_ROASTER": "Kavurucu bilgisi", + "PAGE_ABOUT_NO_VERSION_AVAILABLE": "Sürüm Mevcut Değil", + "PAGE_ABOUT_APP_VERSION": "Uygulama Sürümü", + "PAGE_LICENCES_WEBSITE": "İnternet Sitesi", + "BEAN_DATA_ROAST_NAME": "Kavrulma derecesi", + "BEAN_DATA_CUSTOM_ROAST_NAME": "Özel Kavrulma Derecesi", + "BEAN_DATA_ROASTING_DATE": "Kavurma tarihi", + "BEAN_DATA_ROASTER": "Kavurucu", + "BEAN_DATA_VARIETY": "Varyete", + "BEAN_DATA_PROCESSING": "İşleme Yöntemi", + "BEAN_DATA_COUNTRY": "Ülke", + "BEAN_DATA_MIX": "Hasat", + "BEAN_DATA_AROMATICS": "Tat profili", + "BEAN_DATA_WEIGHT": "Ağırlık", + "BEAN_DATA_COST": "Fiyat", + "BEAN_DATA_NAME": "İsim", + "BEAN_DATA_REGION": "Bölge", + "BEAN_DATA_FARM": "Çiftlik", + "BEAN_DATA_FARMER": "Çiftçi", + "BEAN_DATA_ELEVATION": "Yükseklik", + "BEAN_DATA_HARVEST_TIME": "Hasat tarihi", + "BEAN_DATA_PERCENTAGE": "Yüzdesi", + "BEAN_DATA_CERTIFICATION": "Çekirdek Sertifikası", + "BEAN_DATA_ROASTING_TYPE": "Kavurma Tipi", + "BEAN_DATA_DECAFFEINATED": "Kafeinsiz", + "BEAN_DATA_URL": "İnternet Sitesi", + "BEAN_DATA_EAN": "EAN / Makale numarası", + "BEAN_DATA_PURCHASING_PRICE": "Satın alma fiyatı", + "BEAN_DATA_FOB_PRICE": "FOB fiyatı", + "BEAN_DATA_CUPPING_POINTS": "Tadım puanı", + "BREW_DATA_CUSTOM_BREW_TIME": "Özel demleme süresi", + "BREW_CREATION_DATE": "Oluşturulma Tarihi", + "REPEAT": "Tekrarla", + "EDIT": "Düzenle", + "DELETE": "Sil", + "FINISHED": "Arşivlenmiş", + "NOTES": "Notlar", + "ADD_PHOTO": "Fotoğraf Ekle", + "CANCEL": "İptal", + "GENERATE": "Oluştur", + "SAVE": "Kaydet", + "ADD_SOMETHING": "Ekle", + "CONTACT": "İletişim", + "NAME": "İsim", + "IMPORT": "İçe Aktar", + "EXPORT": "Dışa Aktar", + "VIEW": "Görüntüle", + "ARCHIVE": "Arşiv", + "CURRENT": "Güncel", + "BACK": "Geri", + "CLOSE": "Kapat", + "DAY": "Gün", + "BREW_DATA_TEMPERATURE_TIME": "Sıcaklık Süresi", + "BREW_DATA_SURF_TIME": "Gezinme Zamanı", + "BREW_DATA_TIME": "Zaman", + "BREW_DATA_GRIND_SIZE": "Öğütme Ayarı", + "BREW_DATA_GRIND_WEIGHT": "Öğütülmüş Kahve (gr)", + "BREW_DATA_IN_OUT_BR": "Giriş/Çıkış (BR)", + "BREW_DATA_NOTES": "Notlar", + "BREW_DATA_PREPARATION_METHOD": "Hazırlama Yöntemi", + "BREW_DATA_MILL": "Öğütücü", + "BREW_DATA_MILL_SPEED": "Öğütme Hızı (rpm)", + "BREW_DATA_MILL_TIMER": "Öğütme Süresi", + "BREW_DATA_BREW_QUANTITY": "Su miktarı", + "BREW_DATA_BEAN_TYPE": "Çekirdek Türü", + "BREW_DATA_BREW_TEMPERATURE": "Demleme Sıcaklığı", + "BREW_DATA_PRESSURE_PROFILE": "Profil", + "BREW_DATA_COFFEE_TYPE": "Kahve Türü", + "BREW_DATA_COFFEE_CONCENTRATION": "Kahve Konsantrasyonu", + "BREW_DATA_COFFEE_FIRST_DRIP_TIME": "İlk kahve damlası", + "BREW_DATA_COFFEE_BLOOMING_TIME": "Çiçeklenme Süresi / Ön İnfüzyon", + "BREW_DATA_ATTACHMENTS": "Ekler / Fotoğraflar", + "BREW_DATA_RATING": "Derecelendirme", + "BREW_DATA_CALCULATED_COFFEE_BREW_TIME": "Kahve Demleme Süresi", + "BREW_DATA_TDS": "Toplam çözünmüş katılar", + "BREW_DATA_CALCULATED_EXTRACTION_YIELD": "Çözünme Miktarı %", + "BREW_INFORMATION_BREW_RATIO": "Demleme Oranı", + "BREW_INFORMATION_BEAN_AGE": "Çekirdek Yaşı", + "BREW_INFORMATION_BREW_QUANTITY_TYPE_NAME": "Miktar Türü", + "BREW_DATA_TDS_EY": "TDS / %EY", + "BREW_DATA_BREW_BEVERAGE_QUANTITY": "İçecek miktarı", + "BREW_DATA_PREPARATION_METHOD_TOOL": "Hazırlık araçları", + "BREW_DATA_WATER": "Su", + "BREW_DATA_BEAN_WEIGHT_IN": "Çekirdek miktarı (gr)", + "BREW_DATA_VESSEL": "Sürahi (Karaf)", + "BREW_DATA_VESSEL_WEIGHT": "Sürahi (Karaf) ağırlığı", + "BREW_DATA_VESSEL_NAME": "Sürahi (Karaf) ismi", + "BREW_DATA_FLAVOR": "Aroma", + "BREW_DATA_FLOW_PROFILE": "Akış", + "ONE_DAY": "Gün", + "DAYS": "Günler", + "ONE_HOUR": "saat", + "HOURS": "saatler", + "ONE_MINUTE": "dakika", + "MINUTES": "dakikalar", + "WITHOUT_COFFEE": "Kahve olmadan", + "NOT_FOUND": "Bulunamadı", + "INVALID_FILE_FORMAT": "Geçersiz dosya formatı", + "FILE_NOT_FOUND_INFORMATION": "Dosya bulunamadı", + "ERROR_ON_FILE_READING": "Dosya verileri okunurken hata oluştu", + "IMPORT_SUCCESSFULLY": "İçe aktarma başarılı", + "IMPORT_UNSUCCESSFULLY_DATA_NOT_CHANGED": "İçe aktarma başarısız, hiçbir veri değiştirilmedi", + "INVALID_FILE_DATA": "Geçersiz dosya içeriği", + "DOWNLOADED": "İndirildi", + "FILE_DOWNLOADED_SUCCESSFULLY": "Dosya '{{fileName}}' indirme klasörünüze başarıyla indirildi!", + "NO": "Hayır", + "YES": "Evet", + "SURE_QUESTION": "Emin misin?", + "DELETE_BREW_QUESTION": "Demleme silinsin mi?", + "DELETE_BEAN_QUESTION": "Çekirdeği sil? Bu çekirdeği içeren tüm demlemeler de silinecek!", + "DELETE_GREEN_BEAN_QUESTION": "Yeşil çekirdeği sil? İlgili tüm kavrulmuş çekirdekler ve demlemeler silinecek!", + "DELETE_MILL_QUESTION": "Öğütücüyü sil? İlgili tüm demlemeler silinecek!", + "DELETE_PREPARATION_METHOD_QUESTION": "Hazırlama yöntemini sil? İlgili tüm demlemeler silinecek!", + "DELETE_PREPARATION_TOOL_QUESTION": "Hazırlık aracını sil? Bu araçla ilişkili tüm demlemeler güncellenecek.", + "APP_COULD_NOT_STARTED_CORRECTLY_BECAUSE_MISSING_FILESYSTEM": "Eksik dosya sistemi nedeniyle uygulama düzgün başlatılamadı", + "CARE": "Bakım", + "ERROR_OCCURED": "Bir hata oluştu", + "CSV_FILE_NOT_DOWNLOADED": "CSV dosyası indirilemedi!", + "CSV_FILE_DOWNLOADED_SUCCESSFULLY": "CSV dosyası '{{fileName}}' indirme klasörünüze başarıyla indirildi!", + "ADD_BREW": "Demleme ekle", + "CHOOSE": "Seç", + "CHOOSE_PHOTO_OR_LIBRARY": "Fotoğrafı kaydedin veya fotoğraf galerisinden seçin.", + "RECORD": "Kaydet", + "PAGE_BEAN_INFORMATION": "Çekirdek bilgisi", + "PAGE_BEAN_INFORMATION_GOOD_BREWS": "İyi", + "PAGE_BEAN_INFORMATION_BAD_BREWS": "Kötü", + "PAGE_BEAN_INFORMATION_COUNT_BREWS": "Toplam demleme sayısı", + "INFORMATION": "Bilgi", + "PAGE_BEAN_BREW_CHART_TITLE": "Bu çekirdek için demlemeye genel bakış", + "PAGE_BEAN_INFORMATION_AWESOME_BREWS": "Müthiş", + "PAGE_BEAN_INFORMATION_NORMAL_BREWS": "Normal", + "PAGE_BEAN_INFORMATION_NOT_RATED_BREWS": "Derecelendirilmemiş", + "PAGE_PREPARATION_INFORMATION_BREWS_DONE": "Bu hazırlama yöntemiyle demlendi", + "PAGE_PREPARATION_INFORMATION_BREWED_QUANTITY": "Demlenmiş miktar", + "PAGE_PREPARATION_INFORMATION_GRIND_WEIGHT": "Kullanılan çekirdek ağırlığı", + "PAGE_PREPARATION_INFORMATION_TIME_SPENT_BREWING": "Toplam demleme süresi", + "PAGE_PREPARATION_INFORMATION": "Hazırlık bilgileri", + "SECONDS": "Saniye", + "PAGE_MILL_INFORMATION": "Öğütücü bilgisi", + "PAGE_MILL_INFORMATION_BREWS_DONE": "Bu öğütücüyle demlendi", + "PAGE_MILL_INFORMATION_GRIND_WEIGHT": "Kullanılan çekirdek ağırlığı", + "PAGE_HELPER_WATER_HARDNESS": "Su Sertliği", + "PAGE_HELPER_WATER_HARDNESS_CA_CONTENTS": "Kalsiyum içeriği mg/l", + "PAGE_HELPER_WATER_HARDNESS_MG_CONTENTS": "Magnezyum içeriği mg/l", + "PAGE_HELPER_WATER_HARDNESS_GERMAN_HARDNESS": "Alman Sertlik Derecesi", + "PAGE_HELPER_WATER_HARDNESS_TOTAL_HARDNESS": "Toplam Sertlik", + "PAGE_HELPER_BREW_RATIO": "Demleme Oranı", + "PAGE_HELPER_BREW_RATIO_GROUND_COFFEE": "Öğütülmüş Kahve (gr)", + "PAGE_HELPER_BREW_RATIO_WATER": "Sıvı (gr/ml)", + "PAGE_HELPER_BREW_RATIO_CALCULATED": "Hesaplanan Demleme Oranı", + "PAGE_SETTINGS_SHOW_ARCHIVED_BREWS": "Arşivlenmiş demlemeleri göster", + "PAGE_SETTINGS_SHOW_ARCHIVED_BEANS": "Arşivlenmiş çekirdekleri göster", + "PAGE_SETTINGS_SHOW_ARCHIVED_GREEN_BEANS": "Arşivlenmiş yeşil çekirdekleri göster", + "CUPPING_SCORE": "Skor", + "CUPPING_SCORE_DRY_FRAGRANCE": "Kuru Koku", + "CUPPING_SCORE_WET_AROMA": "Islak Aroma", + "CUPPING_SCORE_BRIGHTNESS": "Canlılık", + "CUPPING_SCORE_FLAVOR": "Lezzet", + "CUPPING_SCORE_BODY": "Gövde", + "CUPPING_SCORE_FINISH": "Bitiş", + "CUPPING_SCORE_SWEETNESS": "Tatlılık", + "CUPPING_SCORE_CLEAN_CUP": "Temiz Bardak", + "CUPPING_SCORE_COMPLEXITY": "Komplekslik", + "CUPPING_SCORE_UNIFORMITY": "İstikrar", + "CUPPING_SCORE_CUPPERS_CORRECTION": "Puan düzeltmesi", + "CUPPING_SCORE_DRY_FRAGRANCE_TOOLTIP": "Sıcak su eklenmeden önce kuru öğütülmüş kahvenin aromasını ifade eder.", + "CUPPING_SCORE_WET_AROMA_TOOLTIP": "Sıcak su eklendikten sonra ıslak kahve öğütümünün kokusu.", + "CUPPING_SCORE_BRIGHTNESS_TOOLTIP": "Asitlik, kahvede klorojenik, sitrik, kinik, asetik asitler ve diğerlerinin neden olduğu, çoğunlukla ağız ve dilin ön kısmında hissedilen keskin yüksek notaların tadıdır. (İyi bir kalitedir; kahvedeki acılıkla ilgili değildir ve mide rahatsızlığından doğrudan sorumlu değildir. Asitlik, birçok kahve tadımcısı tarafından değerlidir ve asitlik, yüksek rakımlı dikimlerin ürünü olduğu için, doğrudan fincanın kalitesiyle ilgilidir.", + "CUPPING_SCORE_FLAVOR_TOOLTIP": " Bu, diğer tüm derecelendirmeler dahil olmak üzere ağızdaki genel izlenimdir. 4 \" birincil tat \" grubu (ekşi, tatlı, tuzlu, acı) ve birçok \" ikincil tat \" vardır .", + "CUPPING_SCORE_BODY_TOOLTIP": "Genellikle \" ağız hissi \" olarak adlandırılan gövde, özütlenen tüm organik bileşikler dahil olmak üzere fincandaki çözünür katıların yüzdesinin neden olduğu demlenmiş kahvenin ağırlık ve kalınlık duygusudur (demleme yöntemi ve miktarı kullanılan öğütülmüş kahve bunu büyük ölçüde etkiler. Gövdeyi daha düşük bir ölçekte değerlendiriyoruz çünkü hafif gövdeli kahveler kesinlikle kötü değil ve bazı kökenlerde daha hafif gövde, genel fincan karakterine en iyi şekilde uyuyor.", + "CUPPING_SCORE_FINISH_TOOLTIP": "Ağız temizlendikten sonra gelen kalıcı veya ortaya çıkan tatlar. Buna kahvenin ağzınızdan dakikalar sonrasına kadar geçen süre de dahildir... bir veya iki dakika sonra hala olumlu bir tat yaşıyorum.", + "CUPPING_SCORE_SWEETNESS_TOOLTIP": "Tatlılık, \" rustik tatlılık \" veya \" acı tatlılık gibi üstü kapalı şekillerde tanımlansa bile, kahvede hemen hemen her zaman arzu edilen bir kalitedir . \" Rafine tatlılığın (Avrupa hamur işleri, ince şeker, beyaz şeker, saf tatlılık gibi) meyve şekerlerinden (fruktoz) gelen karmaşık tatlılığın yanı sıra yüksek puanlar aldığını fark edebilirsiniz. Malt tatlılığı (maltoz) daha az geleneksel ama oldukça arzu edilir ve bal çok saf ve temiz tatlardan karmaşık, rustik neredeyse mayalı tatlara kadar değişebilir. Temel olarak, tatlılık bir fincan için bir anahtarsa, iyi derecelendirilecektir.", + "CUPPING_SCORE_CLEAN_CUP_TOOLTIP": "\"Temiz fincan\" ifadesi kelimenin tam anlamıyla kahvenin üzerinde kir olmadığı anlamına gelmez. Burada \"kirli\" lezzette ham ve garip tatları olan kahvelerle ilgilidir ve aroması da oldukça arzu edilebilir, örneğin: Sumatra'dan ıslak kabuklu Endonezya kahveleri veya kuru işlenmiş Etiyopya ve Yemen türleri.", + "CUPPING_SCORE_COMPLEXITY_TOOLTIP": "Karmaşıklık (Komplekslik), birçok lezzetin çokluğunu veya katmanlanmasını iletmek için \"lezzet \" ve \"bitiş \" puanlarını tamamlar. Bu, fincanda keşfedilecek çok şey olduğu anlamına geliyor. Öte yandan, basit kahveler, birçok güçlü, yoğun, karmaşık kahveye aşırı maruz kaldıktan sonra bir damak rahatlamasına neden olabilir.", + "CUPPING_SCORE_UNIFORMITY_TOOLTIP": "Tekdüzelik, fincandan fincana farklılıkları ifade eder. Kuru işleme kahveler, doğası gereği ıslak işleme kahvelerinden daha az homojen olabilir. Ara sıra feragat edilse de harika tatlara sahip birçok şeyden asla kaçınmayız. Bu, incelenen her lottan birden fazla bardağın yapıldığı tadım protokolü sırasında puanlanır. ", + "CUPPING_SCORE_CUPPERS_CORRECTION_TOOLTIP": "Bu, SCAA sisteminden ve Cup of Excellence puanlamasından uyarlanmıştır (bazen buna \"Genel Puanlar\" derler). Bu, tadım yapanın toplam puanı ve fincanın genel izlenimini doğru bir şekilde iletmesini sağlar. Bu yaklaşımı eleştirebilir ve toplamı \"etkilediğini\" düşünebilirsiniz. Bir bakıma haklı olabilirsin... ancak, istenen toplamı elde etmek için kategori puanlarını değiştirmek (7 olduğunu bildiğiniz bir kahveye asidite için 9 vermek) veya tam tersi kesinlikle 90 hak eden bir kahveye 83 vermek çok daha kötü olurdu. Düzeltme numarasının pek bir önemi yok ister 5 olsun, ister 8 olsun... buradaki fikir, toplam puanın kahve kalitesi hakkında doğru bir izlenim vermesidir.", + "CUPPING_SCORE_TOOLTIP": "100-95 = Şaşırtıcı, 90-94 = Olağanüstü, 85-89 = Çok İyi, 80-84 = İyi, 75-79 = Orta, 70-74 = Zayıf ", + "DETAIL_BREW": "Demleme ayrıntıları", + "DETAIL_BEAN": "Çekirdek detayları", + "DETAIL_MILL": "Öğütücü ayrıntıları", + "DETAIL_PREPARATION": "Hazırlık detayları", + "EDIT_BREW": "Demlemeyi düzenle", + "ADD_BEAN": "Çekirdek ekle", + "EDIT_BEAN": "Çekirdeği düzenle", + "ADD_PREPARATION": "Hazırlama yöntemi ekle", + "EDIT_PREPARATION": "Hazırlama yöntemini düzenle", + "ADD_MILL": "Öğütücü ekle", + "EDIT_MILL": "Öğütücüyü düzenle", + "USE_FILTER": "Filtre uygula", + "RESET_FILTER": "Filtreyi sıfırla", + "COFFEE_GRAMS_GRINDED": "Gram öğütüldü", + "BEANS_USED": "Çekirdek tüketildi", + "BREW_HEADER_BEFORE_BREW": "Demlemeden önce", + "BREW_HEADER_WHILE_BREW": "Demleme sırasında", + "BREW_HEADER_AFTER_BREW": "Demlendikten sonra", + "BREW_HEADER_CUPPING": "Tadım", + "BEANS_CONSUMED": "Arşivlendi", + "NAV_MANAGE_PARAMETERS": "Parametreleri yönet", + "NAV_SORT_PARAMETERS": "Parametreleri sırala", + "NAV_DEFAULT_PARAMETERS": "Varsayılan parametreleri tanımlayın", + "PAGE_SORT_PARAMETERS_DESCRIPTION": "Hangi sırayla gösterileceğini belirlemek için parametreleri sürükleyip bırakın.", + "PAGE_MANAGE_PARAMETERS_DESCRIPTION": "Demleme bilgilerini düzenlerken gösterilecek parametreleri işaretleyin.", + "PAGE_DEFAULT_PARAMETERS_DESCRIPTION": "Hangi parametrelerin varsayılan olarak son kullanılan değere getirilmesi gerektiğini işaretleyin.", + "SORT_PARAMETERS_BEFORE": "Demlemeden önce", + "SORT_PARAMETERS_MEANWHILE": "Demlenirken", + "SORT_PARAMETERS_AFTER": "Demlendikten sonra", + "MORE_INFORMATION": "Daha fazla bilgi", + "UNDERSTOOD": "Anlaşıldı", + "WELCOME_PAGE_ACTIVATE_ANALYTICS_TITLE": "Analitik ve İzleme", + "WELCOME_PAGE_ACTIVATE_ANALYTICS_DESCRIPTION": "Uygulamayı, web sitesini ve gelecekteki hizmetlerimizi sizin için sürekli olarak geliştirmek istiyoruz. Bunu yapmak için, uygulamayı ve özelliklerini nasıl kullandığınızı bazı verileri izlememiz gerekiyor. Ama söz veriyoruz, hiçbir kişisel veriyi asla takip etmeyeceğiz. Bu vaatleri sağlamak için, kendi sunucumuzda barındırılan veri güvenliği ve gizlilik odaklı bir açık kaynak hizmeti olan Matomo'yu kullanıyoruz - bu, veri sahipliğinin yalnızca bizde olmasını sağlar. Web sitemiz, izlediğimiz parametrelerle ilgili tüm bilgileri sağlar ve ayrıca %100 açık kaynak kodlu olan kaynak kodunu kontrol edebilirsiniz. Sorularınız mı var? O zaman bizimle iletişime geçmekten çekinmeyin.", + "ANALYTICS_INFORMATION_TITLE": "Analitik ve İzleme", + "ANALYTICS_INFORMATION_DESCRIPTION": "Bildiğiniz gibi verilerinizin güvenliği ve gizliliğiniz en büyük önceliğimizdir.

Bu nedenle Google Analytics'ten barındırılan veri güvenliği ve gizlilik odaklı açık kaynak hizmeti Matomo'ya geçiş yaptık. kendi sunucumuzda - bu, tam veri sahipliğine sahip olduğumuz anlamına gelir.

İzlenen parametreler değişmedi ve yine de hiçbir kişisel veriyi asla takip etmeyeceğimize söz veriyoruz.
< br/>Web sitemiz, izlediğimiz parametrelerle ilgili tüm bilgileri sağlar ve ayrıca %100 açık kaynak kodlu olan kaynak kodunu kontrol edebilirsiniz.

Sorularınız mı var?

Öyleyse hissedin. bizimle iletişime geçmekte özgürsünüz.", + "ACTIVATE": "Etkinleştir", + "DO_NOT_ACTIVE": "Etkinleştirme", + "WELCOME_PAGE_BEAN_TITLE": "Çekirdek", + "WELCOME_PAGE_BEAN_DESCRIPTION": "Çekirdeklerle kahve yapmak biraz zor. Başlamak için lütfen ilk çekirdeğinizi ekleyin!", + "WELCOME_PAGE_BEAN_ADD": "Çekirdek ekle", + "SKIP": "Atla", + "WELCOME_PAGE_PREPARATION_TITLE": "Hazırlama yöntemi", + "WELCOME_PAGE_PREPARATION_DESCRIPTION": "V60, Aeropress, Porta Filter - kahve hazırlamanın birçok yolu vardır. Lütfen en az bir tane ekleyin.", + "WELCOME_PAGE_PREPARATION_ADD": "Hazırlama yöntemi ekle", + "WELCOME_PAGE_MILL_TITLE": "Öğütücü", + "WELCOME_PAGE_MILL_DESCRIPTION": "Neredeyse bitti, ancak çekirdeklerinizi öğütmek için bir şeye ihtiyacınız var! Lütfen en az bir öğütücü ekleyin.", + "WELCOME_PAGE_MILL_ADD": "Öğütücü ekle", + "WELCOME_PAGE_TITLE": "Hoş geldiniz!", + "WELCOME_PAGE_BEAN_HEADLINE": "İlk çekirdek", + "WELCOME_PAGE_PREPARATION_HEADLINE": "Hazırlama yöntemi ekle", + "WELCOME_PAGE_MILL_HEADLINE": "İlk Öğütücü", + "WELCOME_PAGE_LETS_START_HEADLINE": "Şimdi başlıyoruz!", + "WELCOME_PAGE_LETS_START_TITLE": "Şimdi başlıyoruz!", + "WELCOME_PAGE_LETS_START_DESCRIPTION": "Tebrikler, hayatınızın en iyi kahvesini yapmaya hazırsınız. İyi eğlenceler ve iyi kahve sevgisini herkese yayın!", + "PREPARATION_TYPE": "Hazırlık türü", + "PREPARATION_TYPE_NAME": "İsim", + "ARCHIVED": "Arşivlendi", + "PAGE_SETTINGS_SHOW_ARCHIVED_PREPARATIONS": "Arşivlenmiş hazırlama yöntemlerini göster", + "PAGE_SETTINGS_SHOW_ARCHIVED_MILLS": "Arşivlenmiş öğütücüleri göster", + "PAGE_MILL_LIST_NO_ARCHIVED_MILL_EXISTING": "Henüz öğütücü arşivlenmedi!", + "PAGE_PREPARATION_LIST_NO_ARCHIVED_PREPARATION_EXISTING": "Henüz herhangi bir hazırlığı arşivlemediniz.", + "TOAST_BREW_ADDED_SUCCESSFULLY": "Demleme başarıyla eklendi", + "TOAST_BREW_REPEATED_SUCCESSFULLY": "Demleme başarıyla tekrarlandı", + "TOAST_BEAN_ADDED_SUCCESSFULLY": "Çekirdek başarıyla eklendi", + "TOAST_MILL_ADDED_SUCCESSFULLY": "Öğütücü başarıyla eklendi", + "TOAST_PREPARATION_ADDED_SUCCESSFULLY": "Hazırlama yöntemi başarıyla eklendi", + "TOAST_WATER_ADDED_SUCCESSFULLY": "Su başarıyla eklendi", + "TOAST_BREW_DELETED_SUCCESSFULLY": "Demleme silindi", + "TOAST_BEAN_DELETED_SUCCESSFULLY": "Çekirdek silindi", + "TOAST_GREEN_BEAN_DELETED_SUCCESSFULLY": "Yeşil çekirdek silindi", + "TOAST_MILL_DELETED_SUCCESSFULLY": "Öğütücü silindi", + "TOAST_WATER_DELETED_SUCCESSFULLY": "Su silindi", + "TOAST_PREPARATION_DELETED_SUCCESSFULLY": "Hazırlama yöntemi silindi", + "TOAST_BREW_EDITED_SUCCESSFULLY": "Demleme düzenlendi", + "TOAST_BEAN_EDITED_SUCCESSFULLY": "Çekirdek düzenlendi", + "TOAST_MILL_EDITED_SUCCESSFULLY": "Öğütücü düzenlendi", + "TOAST_PREPARATION_EDITED_SUCCESSFULLY": "Hazırlık düzenlendi", + "TOAST_WATER_EDITED_SUCCESSFULLY": "Su düzenlendi", + "TOAST_BEAN_ARCHIVED_SUCCESSFULLY": "Çekirdek arşivlendi", + "TOAST_MILL_ARCHIVED_SUCCESSFULLY": "Öğütücü arşivlendi", + "TOAST_PREPARATION_ARCHIVED_SUCCESSFULLY": "Hazırlama metodu arşivlendi", + "TOAST_WATER_ARCHIVED_SUCCESSFULLY": "Su arşivlendi", + "BEAN_WEIGHT_ALREADY_USED": "{{gramUsed}}g of {{gramTotal}}g", + "PREPARATION_TYPE_CUSTOM_PREPARATION": "Özel hazırlama yöntemi", + "PREPARATION_TYPE_AEROPRESS": "Aeropress", + "PREPARATION_TYPE_V60": "V60", + "PREPARATION_TYPE_CHEMEX": "Chemex", + "PREPARATION_TYPE_BIALETTI": "Bialetti", + "PREPARATION_TYPE_PORTAFILTER": "Portafilter", + "PREPARATION_TYPE_KALITA_WAVE": "Kalita Wave", + "PREPARATION_TYPE_FRENCH_PRESS": "French Press", + "PREPARATION_TYPE_SWANNECK": "Swanneck", + "PREPARATION_TYPE_DRIPPER": "Dripper", + "PREPARATION_TYPE_DELTER_PRESS": "Delter Press", + "PREPARATION_TYPE_COLD_BREW": "Cold Brew", + "PREPARATION_TYPE_AEROPRESS_INVERTED": "Aeropress - Ters", + "PREPARATION_TYPE_TURKISH": "İbrik", + "PREPARATION_TYPE_BLUE_DRIPPER": "Blue Dripper", + "PREPARATION_TYPE_ADD_CUSTOM": "Özel yöntem ekle", + "PREPARATION_TYPE_GINA": "Gina", + "PREPARATION_TYPE_KONO": "Kono", + "PREPARATION_TYPE_ORIGAMI": "Origami", + "PREPARATION_TYPE_CAFELAT": "Cafelat", + "PREPARATION_TYPE_OREA": "Orea", + "PREPARATION_TYPE_COLD_DRIP": "Cold drip", + "PREPARATION_TYPE_HAND_LEVER": "Hand lever", + "PREPARATION_TYPE_FLAIR": "Flair", + "PREPARATION_TYPE_APRIL_BREWER": "April Brewer", + "PREPARATION_TYPE_ESPRO_BLOOM": "Espro Bloom", + "PREPARATION_TYPE_FELLOW_STAGG": "Fellow Stagg", + "PREPARATION_TYPE_HSIAO_50": "Hsiao 50", + "PREPARATION_TYPE_KARLSBADER_KANNE": "Karlsbader", + "PREPARATION_TYPE_MOCCA_MASTER": "Mocca Master", + "PREPARATION_TYPE_SIPHON": "Syphon", + "CHOOSE_BEANS": "Çekirdekleri seç", + "CHOOSE_BEAN": "Çekirdek seç", + "CHOOSE_WATERS": "Suları seç", + "CHOOSE_WATER": "Su seç", + "CHOOSE_PREPARATIONS": "Hazırlama yöntemlerini seçin", + "CHOOSE_PREPARATION": "Hazırlama yöntemini seçin", + "CHOOSE_MILLS": "Öğütücüleri seçin", + "CHOOSE_MILL": "Öğütücü seçin", + "BEAN": { + "PLACE_HOLDER": { + "BEAN_DATA_NAME": "İsim ekle", + "BEAN_DATA_ROAST_NAME": "Kavurma derecesi ekle", + "BEAN_DATA_ROASTING_DATE": "Çekirdekler ne zaman kavruldu?", + "BEAN_DATA_ROASTER": "Çekirdekleri kim kavurdu?", + "BEAN_DATA_VARIETY": "Kahve varyetesini ekleyin", + "BEAN_DATA_PROCESSING": "Kahvenin işlenmesi, örneğin; yıkanmış", + "BEAN_DATA_COUNTRY": "Kahvenin yetiştiği ülke nedir?", + "BEAN_DATA_MIX": "Karıştırma oranı nedir?", + "BEAN_DATA_AROMATICS": "Aromayı ekle", + "BEAN_DATA_WEIGHT": "Çekirdeklerin ağırlığı", + "BEAN_DATA_COST": "Çekirdeğin fiyatı nedir?", + "BEAN_DATA_REGION": "Bölgeyi ekle", + "BEAN_DATA_FARM": "Çiftliği ekle", + "BEAN_DATA_FARMER": "Çiftçiyi ekle", + "BEAN_DATA_ELEVATION": "Çekirdek hangi yükseklikte yetişti? ", + "BEAN_DATA_HARVEST_TIME": "Çekirdek ne zaman hasat edildi?", + "BEAN_DATA_BUY_DATE": "Çekirdek ne zaman alındı?", + "BEAN_DATA_PERCENTAGE": "Sıralama yüzdesini ekle", + "BEAN_DATA_CERTIFICATION": "Çekirdek sertifikasını ekleyin (örneğn; fair trade, bio)", + "BEAN_DATA_ROASTING_TYPE": "Kavurma tipini ekleyin", + "BEAN_DATA_DECAFFEINATED": "Bu kahve kafeinsiz mi?", + "BEAN_DATA_URL": "İnternet sitesi bağlantısını ekleyin", + "BEAN_DATA_EAN": "Ean veya makale numarasını ekleyin", + "BEAN_DATA_CUPPING_POINTS": "Tadım puanını ekleyin", + "BEAN_DATA_PURCHASING_PRICE": "Satın alma fiyatını ekleyin", + "BEAN_DATA_FOB_PRICE": "FOB fiyatını ekleyin", + "NOTES": "Bu çekirdek hakkında notlar ekleyin", + "CHOOSE_DATA_ROASTER": "Kavurucu seçin", + "CHOOSE_DATA_ROASTING_TYPE": "Kavurma tipini seçin" + } + }, + "PREPARATION": { + "PLACE_HOLDER": { + "PREPARATION_TYPE_NAME": "Bir isim ekleyin", + "NOTES": "Bu hazırlama yöntemi hakkında notlar ekleyin" + } + }, + "MILL": { + "PLACE_HOLDER": { + "NAME": "Bir isim ekleyin", + "NOTES": "Bu öğütücü hakkında notlar ekleyin" + } + }, + "BREW": { + "PLACE_HOLDER": { + "BREW_DATA_GRIND_SIZE": "Öğütme ayarlarını girin", + "BREW_DATA_GRIND_WEIGHT": "Kahve miktarını (gr) girin", + "BREW_DATA_BREW_TEMPERATURE": "Demleme sıcaklığını girin", + "BREW_DATA_PREPARATION_METHOD": "Hazırlama yöntemini seçin", + "BREW_DATA_BEAN_TYPE": "Çekirdeği seçin", + "BREW_DATA_MILL": "Bir öğütücü seçin", + "BREW_DATA_MILL_SPEED": "Öğütme hızını girin", + "BREW_DATA_MILL_TIMER": "Öğütme süresini girin", + "BREW_DATA_PRESSURE_PROFILE": "Basınç/akış profili, demleme tavsiyeleri", + "BREW_DATA_TEMPERATURE_TIME": "Makinenin ısınmasından itibaren geçen süreyi girin", + "BREW_DATA_COFFEE_BLOOMING_TIME": "Çiçeklenme süresi ne kadardır?", + "BREW_DATA_COFFEE_FIRST_DRIP_TIME": "İlk damlama ne zaman ortaya çıktı?", + "BREW_DATA_BREW_QUANTITY": "Demlemek için ne kadar su kullandınız?", + "BREW_DATA_COFFEE_TYPE": "Kahve türünü girin (örn. ristretto)", + "BREW_DATA_COFFEE_CONCENTRATION": "Kahve konsantrasyonunu girin", + "BREW_DATA_TDS": "Toplam çözünmüş katı sayısı ne kadar?", + "BREW_DATA_NOTES": "Bu demleme hakkında notlar ekleyin", + "BREW_DATA_BREW_BEVERAGE_QUANTITY": "İçecek miktarının sonucunu ekle", + "BREW_DATA_PREPARATION_METHOD_TOOL": "Lütfen hazırlık araçlarınızı seçin", + "BREW_DATA_WATER": "Kullanılan suyu seçin", + "BREW_DATA_BEAN_WEIGHT_IN": "Toplam ne kadar çekirdek kullandınız?" + } + }, + "ROASTED_BEFORE": "Kavrulmadan önce", + "DAY_OLD": "günlük", + "DAYS_OLD": "eski günler", + "BEANS_AMOUNT_USED": "Tüketildi", + "CUPPING_BREW": "Tadım", + "COFFEE_DRUNKEN_QUANTITY": "Kahve sarhoşu", + "IMAGE_DELETED": "Görüntü silindi", + "IMAGE_NOT_DELETED": "Görüntü silinemedi", + "EXTERNAL_STORAGE_NOT_SUPPORTED": "Maalesef harici hikaye desteklenmiyor", + "BEANS_ARCHIVED": "Arşivlendi", + "TAB_ARCHIVE": "Arşiv", + "TODAY": "Bugün", + "PLEASE_WAIT": "Lütfen bekleyin...", + "PREPARATION_STYLE_POUR_OVER": "Pour Over", + "PREPARATION_STYLE_ESPRESSO": "Espresso", + "PREPARATION_STYLE_FULL_IMMERSION": "Full Immersion", + "PREPARATION_STYLE_PERCOLATION": "Percolation", + "PREPARATION_TYPE_STYLE": "Hazırlama stili", + "PAGE_SETTINGS_FAST_REPEAT_DESCRIPTION": "Yeni bir menü girişini etkinleştirin - bununla demlemeyi doğrudan tekrarlayabilirsiniz.", + "PAGE_SETTINGS_TRACK_BREW_COORDINATES_DESCRIPTION": "Her demleme için koordinatları kaydedin.", + "PAGE_SETTINGS_TRACK_CAFFEINE_CONSUMPTION_DESCRIPTION": "Tüketilen kafein miktarını kaydedin", + "UPDATE_TITLE": "Yeni ne var?", + "NEXT": "Sonraki", + "UPDATE_TEXT_TITLE_TITLE": { + "5.0.0": { + "TITLE": "Version 5.0: Thats new!", + "DESCRIPTION": [ + "New layout, new icons, new colors, new logo", + "New preparation methods", + "Preparations now can be categorized (percolation, espresso, full immersion)", + "Preparation can now inherit tools (e.g. different filters)", + "Preparation parameter can now be customized, define your own workflow for each preparation", + "Added more editable bean information, different sorts can now be added", + "Amount of water field is available for percolation/full immersion", + "Where did you brew your best coffee? Active coordinate saving in settings", + "Activate fast repeat to add brews instant", + "Added update screen to show the latest changes", + "Question added to rate the app after 25 uses", + "Added sorting for beans", + "Added search panel for brews/beans", + "Cupping chart is added to brew details", + "Left over beans weight added on homescreen", + "Added typeahead for roasters", + "Rating moved to stars instead of icons" + ] + }, + "5.1.0": { + "TITLE": "Version 5.1: Thats new!", + "DESCRIPTION": [ + "New timepicker for brews", + "Roasting date can now be again selected on iOS", + "Images can be choosen again on iPad", + "TDS calculation is now again visible on beverage quantity", + "Safe zones added for iOS-devices" + ] + }, + "5.2.0": { + "TITLE": "Version 5.2: Thats new!", + "DESCRIPTION": [ + "Brews:", + "Brew timer continues in the background", + "Brews can be favored", + "Screen for adding and editing a brew looks identical", + "Display can stay active during brewing (can be activated in the settings menu)", + "List of recent brews now also shows archived brews", + "", + "Beans:", + "Bean photos are shown in the overview", + "Beans can be rated", + "", + "Interactions:", + "Long press on a card leads to the edit view", + "Detail view can be accessed via click on the card", + "Github / Facebook / Instagram accounts linked", + "", + "Bugfixes:", + "Bean information have been copied incorrect", + "Brew amount was activated by default for new users", + "", + "Other:", + "Apple Healthkit integration (can be activated in the settings menu)", + "Cleanups", + "Layout changes", + "Extension of statistics", + "Startup check revised", + "Support for different card sized for brews and beans" + ] + }, + "5.3.1": { + "TITLE": "Version 5.3: Thats new!", + "DESCRIPTION": [ + "Brew methods:", + "Changes to the card view", + "Custom images can be attached in the edit screen", + "Brew tools will be saved in edit screen, even when '+' is not pressed", + "", + "Grinders:", + "Custom images can be attached in the edit screen", + "", + "Brews:", + "Parameter 'Attachments' renamed in 'Attachments / Photos'", + "", + "Dashboard:", + "If bean amount is less then 1000g, the number will be written as a whole", + "", + "Bug fixes:", + "Editing via a long-press, does not change information any more", + "Information on the dashboard are updated after made changes", + "Multiple variety information with blends can be saved again", + "Added startup error message if app-data is missing" + ] + }, + "5.4.0": { + "TITLE": "Version 5.4: Thats new!", + "DESCRIPTION": [ + "Roasting section:", + "Manage all of your green beans and roasters (can be activated in the settings menu)", + "Save all of your green beans and transfer them into roasted onces", + "Add your roaster and connect them with your different kind of roasted beans", + "", + "Website:", + "Go live of our new website! -> https://beanconqueror.com", + "", + "Support us:", + "You've always wanted to support Beanconqueror? We've added a new 'Buy me a coffee' connection", + "", + "iOS - iCloud:", + "The first step into iCloud support was made. At the very first start all of your existing app data will be moved into the support iCloud directory.", + "You have to activate this option in the iCloud Settings first in order to save Beanconqueror on iCloud", + "", + "Android/iOS - Automated file-export:", + "Automated Beanconqueror.json-File is saved for a maximum of 7 days, after that they will be automated deleted again", + "Android: Download/Beanconqueror_export/Beanconqueror_automatic_export_DAY.json", + "iOS: Files/Download/Beanconqueror_export/Beanconqueror_automatic_export_FILE.json", + "", + "Settings:", + "Excel - Export all of your data to excel to work with it even further", + "Define your own image quality between 50% to 100% (default 100%)", + "Brew rating - Define how much stars/points you'd like to set for each brew. Minimum 5, maximum 100", + "", + "New tracking:", + "We've changed to our open source service Matomo, which will be hosted on our own server", + "Removed Google Analytics / Firebase", + "", + "Bug fixes:", + "Apple Healthkit - Settings were not saved", + "Sometimes brew rating stars weren't filled (Brew add/edit)", + "Edit via long tap, screen wasn't scrollable", + "Import of bigger files on iOS led to misconduct", + "Delete procedure of beans / preparations or mills were not consistent and lead to graphical issues", + "Wrong calculation of beverage quantity in statistics and list views", + "", + "Share:", + "Share your brews and beans with all coffee lovers!", + "", + "Other:", + "Clean ups", + "Layout changes", + "Extension of statistics", + "Startup check revised, added please wait window", + "Some label changes", + "Changed data access / order inside app to reduce problems" + ] + }, + "6.0.0": { + "TITLE": "Version 6.0: Thats new!", + "DESCRIPTION": [ + "Bluetooth scales", + "Support of the first bluetooth scale - Decent-Scale - Big thanks to Decent Espresso", + "Support of Acaia Lunar", + "", + "Aroma cupping", + "Cup each brew with the different aromatics and flavors", + "", + "Water section", + "Add your own water, activate this section in the settings", + "", + "Support of more languages", + "Support for spanish - Big thanks to Frank!", + "", + "Improvements", + "Support of long press '+' on brews", + "Added new brew parameters", + "Support of different currencies", + "Edit brew while in detail view", + "Choose multiple images at once", + "Support of brix to TDS conversion", + "If bean package is empty, you'll be asked if you want to archive the package on the last brew", + "Reset of roastdate supported", + "Support of detail views on beans, grinders and preparation methods", + "Added brew ratio (g/l)", + "", + "iOS", + "Support of safe areas", + "", + "Bug fixes", + "Apple Healthkit - Decaffeinated coffee was saved", + "Copy of beans led to misconduct", + "Added brew time to excel export", + "Small bug fixes", + "", + "Others", + "Beans, grinders and preparation methods are now sorted alphabetic in dropdowns" + ] + }, + "6.1.0": { + "TITLE": "Version 6.1: Thats new!", + "DESCRIPTION": [ + "QR Codes", + "Scan your coffee bags! All coffee information are directly inserted from the roastery.", + "", + "Bluetooth scales", + "Support of Acaia Pearl 2021 - Thanks to Micah and Mike", + "Support of Acaia Lunar 2021 - Thanks to Micah and Mike", + "Support of Acaia Pyxis - Thanks to Micah and Mike", + "Support of Hiroia Jimmy - Thanks to Silas", + "Support of Felicita Arc - Thanks to Herman", + "Care: Acaia Pearl < 2021 is not supported right now", + "Weightinformation of bluetooth scale can now be used on the beans page", + "Weight changes are now visible without starting a brew via timer", + "", + "Brew overview", + "Customize your visible brew parameters in the overview in general or for each preparation method", + "Preparation images are now visible in the listview", + "", + "Brew graph", + "Rework of brew graph to a more smoother solution", + "Brew graph now can be maximized", + "Brew graph can now be zoomed in the brew-detail view aswell as exported", + "Average flow quantity is now displayed", + "", + "Beans", + "Added fields: Buy date, FOB-Price, Purchasing price", + "Beans can now be favorited and filtered", + "If a bean gets archived, you can now rate the package aswell", + "Pressing '+' you can now choose to add or scan a new package", + "Long press '+' to directly add a new bean", + "", + "Preparation methods", + "Preparation methods can now be repeated with all settings", + "More preparation methods are available - Thanks to Nicola", + "Selecting a preparation method also displays the image", + "", + "Settings", + "Ratings can now be stepped (1, 0.75, 0.5, 0.25, 0.1)", + "Bluetooth scale - Define if the scale should be set to weight zero when starting a new brew, or starting the timer", + "Bluetooth scale - Define if you want to ignore anomalies or negative values - if yes, a live graph won't be possible", + "Choose now, if you want to see archived brews on the home page", + "Export also now exports the raw data of the saved bluetooth values", + "", + "Improvements", + "Delete of preparation method tools now won't delete brews anymore", + "Preparation method tools now can be edited and archived", + "", + "Bug fixes:", + "Found more issues which could lead to a data loss", + "Small bug fixes", + "", + "Others:", + "Updating to Ionic-Framework 6, therefore some small visual changes takes place" + ] + }, + "6.1.3": { + "TITLE": "Version 6.1.3: Thats new!", + "DESCRIPTION": [ + "Android - Attention", + "In first please: Sorry!", + "Sadly the database was resetted from going form APK to AAB format on Android Play Store, and your app will propably start without data.", + "I could not debug or control this situation, while development everything worked as expected", + "If your app started blank, please go into settings and import the file below 'Download/Beanconqueror_export/Beanconqueror_automatic_export_*.json' * stands for the latest timestamp, the backup.", + "All datas should then be back as normal, if not please write me an e-mail: info@beanconqueror.com." + ] + }, + "6.1.5": { + "TITLE": "Version 6.1.5: Das ist neu", + "DESCRIPTION": [ + "QR Codes", + "Lade die QR-Code Daten der Rösterei nun erneut", + "", + "Brühgraph", + "Wasserfluss wird nun in Echtzeit berechnet", + "", + "Bohnen", + "Suchfeld bei der Auswahl der Bohnen", + "", + "Fehlerbehebungen:", + "Nach Aufnahme eines Bildes war der Ladebalken nicht verschwunden", + "Kleinere Fehlerbehebungen" + ] + } + }, + "CUSTOM_PARAMETERS": "Parametreyi özelleştir", + "CUSTOM_DEFAULT_PARAMETERS": "Varsayılan", + "CUSTOM_MANAGE_PARAMETERS": "Yönet", + "CUSTOM_SORT_PARAMETERS": "Sırala", + "BREW_PARAMETER_CUSTOMIZE_TITLE": "Her hazırlama yöntemi için özel parametreler", + "BREW_PARAMETER_CUSTOMIZE_DESCRIPTION": "Her hazırlama yöntemi için özel parametreler seçmek mi istiyorsunuz? \" Yöntemler \" seçeneğine gidin , belirli hazırlama yönteminin menüsünü açın ve \" Parametreleri özelleştir \" öğesini seçin. Artık hangi parametrelerin kullanılacağını seçebilirsiniz. bu hazırlık için!", + "BREW_DATA_BREW_QUANTITY_TOOLTIP": "Espresso için kullanılamayan su miktarı", + "BREW_DATA_COFFEE_FIRST_DRIP_TIME_TOOLTIP": "İlk kahve damlası sadece espresso için kullanılabilir", + "BREW_DATA_PREPARATION_METHOD_TOOLTIP": "Hazırlık sadece aktifken özelleştirilebilir", + "PAGE_SETTINGS_GENERAL": "Genel ayarlar", + "EDIT_PREPARATION_CUSTOM_PARAMETERS": "Parametreleri özelleştir", + "ENABLE_PREPARATION_CUSTOM_PARAMETERS": "Bireysel parametre kullan", + "BEAN_ADD_ANOTHER_SORT": "Başka bir sıralama ekle", + "BEAN_SORT": "Sırala", + "BEAN_SORT_INFORMATION": "Varyete bilgisi", + "BEAN_SORT_MORE_INFORMATION": "Daha fazla bilgi", + "NAVIGATE_TO_PREPARATION_METHODS": "Hazırlıklara gidin", + "PREPARATION_TOOLS": "Hazırlama araçları", + "PREPARATION_TOOLS_INFORMATION": "Portafiltreniz için farklı sepetler ekleyin. V60 veya Aeropress için örneğin bez, kağıt veya ağ filtreleri ekleyin", + "PREPARATION_TOOLS_PLACEHOLDER": "Kağıt veya kumaş filtre, VST-20g, 14g-Sepet, vb.", + "PREPARATION_PARAMETERS_CUSTOMIZED": "Parametre özelleştirilmiş", + "BEANS_WEIGHT_AVAILABLE": "Çekirdek mevcut", + "SORT_ORDER": "Sırayı değiştir", + "ASCENDING": "artan", + "DESCENDING": "azalan", + "SORT_AFTER": "Sırala", + "BEAN_SORT_NAME_OF_BEAN": "Çekirdek ismi", + "BEAN_SORT_ROASTER": "Kavurucu", + "BEAN_SORT_ROASTING_DATE": "Kavurma tarihi", + "BEAN_TAB_ROAST_INFORMATION": "Kavurma bilgisi", + "BEAN_TAB_GENERAL_INFORMATION": "Genel", + "BEAN_TAB_SORT_INFORMATION": "Varyete bilgisi", + "PAGE_SETTINGS_MANAGE_ARCHIVE": "Arşivi yönet", + "LAST_USE": "Son kullanılan", + "SEARCH": "Ara", + "OVERVIEW": "Genel Bakış", + "BEAN_HEADER_ADDITIONALE_INFORMATION": "Ek bilgi", + "THREE_DEE_TOUCH_ACTION_BREW":"Demlemek", + "THREE_DEE_TOUCH_ACTION_BEAN":"Çekirdek", + "THREE_DEE_TOUCH_ACTION_PREPARATION":"Hazırlama yöntemi", + "THREE_DEE_TOUCH_ACTION_MILL":"Öğütücü", + "PAGE_CREDITS_NOT_EXISTING": "İçerik yok", + "TIMER_HOUR": "Saatler", + "TIMER_MINUTES": "Dakikalar", + "TIMER_SECONDS": "Saniyeler", + "EXCEL": { + "BEAN" : { + "CREATION_DATE": "Oluşturma tarihi", + "ID": "Çekirdek Kimliği" + }, + "PREPARATION": { + "CREATION_DATE": "Oluşturma tarihi", + "ID": "Hazırlık Kimliği" + }, + "GRINDER": { + "CREATION_DATE": "Oluşturma tarihi", + "ID": "Öğütücü Kimliği" + } + }, + "EXCEL_EXPORT": "Excel dışa aktarma", + "HEALTH_KIT_QUESTION_TITLE": "Kafein tüketimini kaydedin", + "HEALTH_KIT_QUESTION_MESSAGE": "Aktivasyon yoluyla, her bir demlemeden alınan kafein otomatik olarak Apple sağlığa kaydedilecektir.", + "NAV_ROASTING_SECTION": "Kavurma", + "ROASTING_SECTION" : { + "NAV_GREEN_BEANS": "Yeşil Çekirdek", + "NAV_ROASTING_MACHINE": "Kavurma makinesi", + "ROASTING_MACHINE": { + "TOTAL_ROAST_QUANTITY": "Kavurma miktarı", + "TOTAL_ROAST_COUNT": "Kavurma sayısı" + }, + "GREEN_BEAN": { + "ADD": "Ekle", + "EDIT": "Düzenle", + "DETAIL": "Yeşil Çekirdek Ayrıntıları", + "ROASTABLE": "Kavrulabilir", + "NO_ROASTS_YET": "Henüz kavurma yok" + }, + "BEAN": { + "DROP_TEMPERATURE": "Kavurma son sıcaklığı", + "ROAST_LENGTH": "Kavurma uzunluğu", + "ROASTER_MACHINE": "Kavurma makinesi", + "GREEN_BEAN_WEIGHT": "Yeşil çekirdek ağırlığı", + "OUTSIDE_TEMPERATURE": "Hava sıcaklığı", + "HUMIDITY": "Nem", + "FIRST_CRACK_MINUTE": "İlk çıtlama dakikası", + "FIRST_CRACK_TEMPERATURE": "İlk çıtlama sıcaklığı", + "SECOND_CRACK_MINUTE": "İkinci çıtlama sıcaklığı", + "SECOND_CRACK_TEMPERATURE": "İkinci çıtlama sıcaklığı", + "PLACE_HOLDER": { + "DROP_TEMPERATURE": "Kavurma son sıcaklığı", + "ROAST_LENGTH": "Kavurma uzunluğu", + "ROASTER_MACHINE": "Kavurma makinesi", + "GREEN_BEAN_WEIGHT": "Yeşil çekirdek ağırlığı", + "OUTSIDE_TEMPERATURE": "Hava sıcaklığı", + "HUMIDITY": "Nem", + "FIRST_CRACK_MINUTE": "İlk çıtlama dakikası", + "FIRST_CRACK_TEMPERATURE": "İlk çıtlama sıcaklığı", + "SECOND_CRACK_TEMPERATURE": "İkinci çıtlama sıcaklığı", + "SECOND_CRACK_MINUTE": "İkinci çıtlama sıcaklığı" + } + } + }, + "PAGE_SETTINGS_MANAGE_SECTIONS": "Daha fazla bölüm", + "PAGE_SETTINGS_SHOW_ROASTING_SECTION": "Kavurma bölümünü etkinleştir", + "PAGE_SETTINGS_SHOW_WATER_SECTION": "Su bölümünü etkinleştir", + "PAGE_SETTINGS_SHOW_CUPPING_SECTION": "Tadım bölümünü etkinleştir", + "BEAN_DATA_BUY_DATE": "Satın alma tarihi", + "BEAN_SORT_CREATION_DATE": "Oluşturma tarihi", + "BEAN_SORT_PURCHASE_DATE": "Satın alma tarihi", + "BEAN_ROAST_COUNT": "Kavurma sayısı", + "TRANSFER_ROAST": "Kavurma", + "BEAN_TAB_LINKED_ROASTS": "Kavurma", + "BEAN_DATA_WEIGHT_AFTER_ROASTING": "Kavurma sonrası ağırlık", + "TOAST_GREEN_BEAN_ADDED_SUCCESSFULLY": "Yeşil çekirdek eklendi", + "TOAST_GREEN_BEAN_EDITED_SUCCESSFULLY": "Yeşil çekirdek düzenlendi", + "TOAST_GREEN_BEAN_ARCHIVED_SUCCESSFULLY": "Yeşil çekirdek arşivlendi", + "TOAST_ROASTING_MACHINE_ADDED_SUCCESSFULLY": "Kavurma makinesi eklendi", + "TOAST_ROASTING_MACHINE_EDITED_SUCCESSFULLY": "Kavurma makinesi düzenlendi", + "TOAST_ROASTING_MACHINE_ARCHIVED_SUCCESSFULLY": "Kavurma arşivlendi", + "DELETE_ROASTING_MACHINE_QUESTION": "Kavurma makinesi silinsin mi? Referans verilen tüm kavrulmuş çekirdekler güncellenecek ve silinmeyecek", + "TOAST_ROASTING_MACHINE_DELETED_SUCCESSFULLY": "Kavurma silindi", + "EDIT_ROASTING_MACHINE": "Düzenle", + "DETAIL_ROASTING_MACHINE":"Kavurma detayları", + "DELETE_WATER_QUESTION": "Suyu sil? Referans alınan tüm demlemeler güncellenecek ve silinmeyecek", + "ROASTING_MACHINE": { + "PLACE_HOLDER": { + "NAME": "İsim ekle", + "NOTES": "Bu kavurma makinesi için not ekle" + } + }, + "NAV_ROASTING_MACHINE": "Kavurma makinesi", + "PAGE_ROASTING_MACHINE_LIST_NO_MACHINES_EXISTING":"Hiç kavurma makinesi eklemediniz", + "PAGE_ROASTING_MACHINE_LIST_NO_ARCHIVED_MACHINES_EXISTING": "Herhangi bir kavurma makinesini arşivlemediniz", + "CHOOSE_ROASTING_MACHINES": "Kavurma makinelerini seçin", + "CHOOSE_ROASTING_MACHINE": "Kavurma makinesini seçin", + "POPOVER_BREWS_OPTION_TOGGLE_FAVOURITE": "Favori", + "TOAST_BREW_FAVOURITE_ADDED":"Favori eklendi", + "TOAST_BREW_FAVOURITE_REMOVED":"Favori silindi", + "BREW_FILTER_JUST_FAVOURITE": "Favoriler", + "STATISTICS_PREPARATION_USAGES": "Hazırlık kullanımları", + "STATISTICS_PREPARATION_TIMELINE_USAGES": "Hazırlıkların kullanım geçmişi", + "STATISTICS_GRINDER_TIMELINE_USAGES": "Öğütücü kullanım geçmişi", + "ACCEPT": "Kabul et", + "STATISTIC_TAB_GENERAL": "Genel", + "STATISTIC_TAB_BREWS": "Demlemeler", + "STATISTIC_TAB_BEANS": "Çekirdekler", + "STATISTIC_TAB_PREPARATIONS": "Hazırlıklar", + "STATISTIC_TAB_GRINDERS": "Öğütücüler", + "PAGE_STATISTICS_BREW_PER_DAYPROCESSES": "Günlük demleme sayısı", + "PAGE_STATISTICS_BREW_TIME": "Demleme zamanı", + "PAGE_STATISTICS_PHOTOS_TAKEN": "Çekilen fotoğraflar", + "PAGE_SETTINGS_IMAGE_QUALITY": "Görüntü kalitesi", + "PAGE_SETTINGS_IMAGE_QUALITY_TOOLTIP": "Görüntülerinizin hangi kalitede olması gerektiğini tanımlayın. Bu, veri kullanımınızı düşürmenizi sağlar.", + "PAGE_SETTINGS_BREW_RATING": "Brew rating", + "PAGE_SETTINGS_BREW_RATING_TOOLTIP": "Demlemenizi derecelendirmek için -1 ila 5 arası az mı? 100'e kadar 'puan' ayarlayabilirsiniz.", + "UPDATE_ENTRY_OF": "Girişi güncelle {{index}} of {{count}}", + "WEBSITE": "İnternet Sitesi", + "SHARE": "Paylaş", + "ANDROID_FILE_ACCESS_NEEDED_TITLE": "Paylaşım dosyası erişimi gerekli", + "ANDROID_FILE_ACCESS_NEEDED_DESCRIPTION": "Uygulamanın tam olarak çalışabilmesi için dosya erişimine yetki vermenizi rica ediyoruz. Aksi takdirde uygulama içerisinde eksiklikler olacaktır. Bu, otomatik yedekleme sistemi için özel olarak gereklidir.", + "COULD_NOT_ACCESS_FILE": "Seçilen dosyaya erişemedik", + "WRONG_FILE_FORMAT": "Desteklenmeyen bir dosya biçimi seçtiniz", + "SCAN_BEAN": "Paketi tara", + "CLEAR":"Temizle", + "BEAN_LOOKS_LIKE_CONSUMED": "Çekirdek paketi bitmiş gibi görünüyor, şimdi arşivlemek ister misiniz?", + "CUPPING_1": "Meyve", + "CUPPING_2": "Narenciye", + "CUPPING_3": "Limon & limonata", + "CUPPING_4": "Misket limon", + "CUPPING_5": "Greyfurt", + "CUPPING_6": "Clementine", + "CUPPING_7": "Mandalina", + "CUPPING_8": "Mandalina", + "CUPPING_9": "Portakal", + "CUPPING_10": "Elma/armut", + "CUPPING_11": "Yeşil elma", + "CUPPING_12": "Kırmızı elma", + "CUPPING_13": "Kavun", + "CUPPING_14": "Karpuz", + "CUPPING_15": "Şeker kavunu", + "CUPPING_16": "Kavun", + "CUPPING_17": "Üzüm", + "CUPPING_18": "Beyaz üzüm", + "CUPPING_19": "Yeşil üzüm", + "CUPPING_20": "Kırmızı üzüm", + "CUPPING_21": "Concord üzümü", + "CUPPING_22": "Tropikal meyve", + "CUPPING_23": "Liçi", + "CUPPING_24": "Yıldız meyvesi", + "CUPPING_25": "Demirhindi", + "CUPPING_26": "Tutku meyvesi", + "CUPPING_27": "Ananas", + "CUPPING_28": "Mango", + "CUPPING_29": "Papaya", + "CUPPING_30": "Kivi", + "CUPPING_31": "Muz", + "CUPPING_32": "Hindistan Cevizi", + "CUPPING_33": "Çekirdekli meyve", + "CUPPING_34": "Şeftali", + "CUPPING_35": "Nektarin", + "CUPPING_36": "Kayısı", + "CUPPING_37": "Erik", + "CUPPING_38": "Kiraz", + "CUPPING_39": "Vişne", + "CUPPING_40": "Dut", + "CUPPING_41": "Kızılcık", + "CUPPING_42": "Ahududu", + "CUPPING_43": "Çilek", + "CUPPING_44": "Yaban mersini", + "CUPPING_45": "Frenk üzümü", + "CUPPING_46": "Siyah frenk üzümü", + "CUPPING_47": "Kurutulmuş meyve", + "CUPPING_48": "Altın kuru üzüm", + "CUPPING_49": "Kuru üzüm", + "CUPPING_50": "Kuru incir", + "CUPPING_51": "Hurma kurusu", + "CUPPING_52": "Kuru erik", + "CUPPING_53": "Tatlı ve Kavurma Notaları", + "CUPPING_54": "Çikolata", + "CUPPING_55": "Kakao nibi", + "CUPPING_56": "Bitter çikolata", + "CUPPING_57": "Erimiş çikolata", + "CUPPING_58": "Acı tatlı çikolata", + "CUPPING_59": "Kakao tozu", + "CUPPING_60": "Sütlü çikolata", + "CUPPING_61": "Fındık", + "CUPPING_62": "Ceviz", + "CUPPING_63": "Fıstık", + "CUPPING_64": "Kaju", + "CUPPING_65": "Pekan cevizi", + "CUPPING_66": "Fındık", + "CUPPING_67": "Badem", + "CUPPING_68": "Tahıl ve Kremalı", + "CUPPING_69": "Tatlı ekmek pasta", + "CUPPING_70": "Tahıl karışımından oluşan tatlı", + "CUPPING_71": "Graham krakeri", + "CUPPING_72": "Çavdar", + "CUPPING_73": "Buğday", + "CUPPING_74": "Arpa", + "CUPPING_75": "Taze ekmek", + "CUPPING_76": "Tatlı ve Şekerli", + "CUPPING_77": "VanilYa", + "CUPPING_78": "Nuga", + "CUPPING_79": "Bal", + "CUPPING_80": "Tereyağı", + "CUPPING_81": "Krema", + "CUPPING_82": "Marşmelov", + "CUPPING_83": "Şeker kamışı", + "CUPPING_84": "Esmer şeker", + "CUPPING_85": "Karamel", + "CUPPING_86": "Akçaağaç şurubu", + "CUPPING_87": "Şeker tortusu", + "CUPPING_88": "Kola", + "CUPPING_89": "Kavrulmuş", + "CUPPING_90": "Yanmış", + "CUPPING_91": "Yanık şeker", + "CUPPING_92": "İsli", + "CUPPING_93": "Karbon", + "CUPPING_94": "Bitkisel, Tuzlu ve Baharatlar", + "CUPPING_95": "Acı", + "CUPPING_96": "Karabiber", + "CUPPING_97": "Beyaz biber", + "CUPPING_98": "Tarçın", + "CUPPING_99": "Kişniş", + "CUPPING_100": "Zencefil", + "CUPPING_101": "Küçük hindistan cevizi", + "CUPPING_102": "Köri", + "CUPPING_103": "Meyan-Anason", + "CUPPING_104": "Karanfil", + "CUPPING_105": "Tuzlu", + "CUPPING_106": "Kösele", + "CUPPING_107": "Et gibi", + "CUPPING_108": "Soya sosu", + "CUPPING_109": "Güneşte kurutulmuş domates", + "CUPPING_110": "Domates", + "CUPPING_111": "Bitkisel Dünyevi Bitki", + "CUPPING_112": "Toprak", + "CUPPING_113": "Taze odun", + "CUPPING_114": "Sedir", + "CUPPING_115": "Tütün", + "CUPPING_116": "Saman / Kuru ot", + "CUPPING_117": "Yeşil yapraklı sebzeler", + "CUPPING_118": "Zeytin", + "CUPPING_119": "Yeşil biber", + "CUPPING_120": "Kabak", + "CUPPING_121": "Mantar", + "CUPPING_122": "Bezelye", + "CUPPING_123": "Kar bezelyesi", + "CUPPING_124": "Çimenli", + "CUPPING_125": "Dereotu", + "CUPPING_126": "Adaçayı", + "CUPPING_127": "Nane", + "CUPPING_128": "Yeşil çay", + "CUPPING_129": "Siyah çay", + "CUPPING_130": "Şerbetçiotu", + "CUPPING_131": "Bergamot", + "CUPPING_132": "Çiçeksi", + "CUPPING_133": "Çiçeksi", + "CUPPING_134": "Ebegümeci", + "CUPPING_135": "Kuşburnu", + "CUPPING_136": "Lavanta", + "CUPPING_137": "Manolya", + "CUPPING_138": "Yasemin hanımeli", + "CUPPING_139": "Portakal Çiçeği", + "CUPPING_140": "Limon otu", + "WATER_SECTION" : { + "NAV_WATER": "Su", + "YOU_GOT_NO_ARCHIVED_WATER": "Henüz hiç su arşivlemediniz", + "YOU_GOT_NO_WATER": "Henüz su eklemediniz", + "CATEGORY_INFORMATION": "Su bilgisi", + "CATEGORY_GENERAL": "Genel", + "WATER_BOTTLE_EXPLANATION": "Su şişelerinin konsantrasyonu genellikle ppm = mg/L biriminde gösterilir", + "USED_TIMES": "Harcanan zaman", + "AMOUNT": "Kullanılan miktar", + "WATER": { + "GENERAL_HARDNESS":"Genel sertlik (GH)", + "TOTAL_ALKALINITY":" Toplam alkalinite (KH)", + "CALCIUM": "Kalsiyum (Ca)", + "MAGNESIUM":"Magnezyum (Mg)", + "SODIUM": "Sodyum (Na)", + "TDS":"Toplam çözünmüş katı madde (TDS)", + "UNITS": "Birimler", + "PLACE_HOLDER": { + "GENERAL_HARDNESS":"Genel sertlik", + "TOTAL_ALKALINITY":"Toplam alkalinite", + "CALCIUM": "Kalsiyum (Ca)", + "MAGNESIUM":"Magnezyum (Mg)", + "SODIUM": "Sodyum (Na)", + "TDS":"Toplam çözünmüş katı madde (TDS)", + "NAME": "Su ismi ekle", + "NOTES": "Suyunuza bazı notlar ekleyin" + }, + "WATER_UNIT": { + "UNKNOWN": "Bilinmeyen", + "PPM": "ppm CaCO3 olarak", + "MG_L": "mg/L", + "MMOL_L": "mmol/L", + "DH": "°dH" + } + } + }, + "BREW_BRIX_CALCULATION": "Brix Derecesi", + "SET_TDS": "TDS ayarla", + "TOTAL_WEIGHT": "Toplam ağırlık", + "CALCULATED_WEIGHT": "Hesaplanan ağırlık", + "SET_WEIGHT": "Ağırlığı ayarla", + "ADD_FLAVORS_AROMAS_TITLE": "Aromalar / Tatlar", + "CUSTOM_FLAVORS_AROMAS":"Kişisel aroma", + "CUSTOM_FLAVORS_AROMAS_PLACEHOLDER":"Kişisel aromanızı ekleyin", + "PREDEFINED_FLAVORS_AROMAS":"Ortak aromalar", + "ADD_AROMA_FLAVOR": "Aroma ve tat ekleyin", + "BEAN_WEIGHT_IN_PLACEHOLDER":"Paketten çıkarılan çekirdekler", + "VESSEL_PLACEHOLDER": "Sürahi (Karaf) ismi ve boş ağırlığı", + "GRIND_WEIGHT_PLACEHOLDER": "Demlemek için kullanılan öğütülmüş çekirdeğin ağırlığı", + "PRESET_BREW_TITLE": "Son demlemeyi ön ayar olarak kullan", + "CUPPING_BREW_TAB_AROMA": "Aroma", + "CUPPING_BREW_TAB_TASTING": "Sistematik tadım", + "WATER_PLACEHOLDER": "Tam işlev için lütfen ayarlar menüsündeki su bölümünü etkinleştirin", + "PAGE_SETTINGS_SCALES": "Tartılar", + "CONNECT": "Bağlan", + "DISCONNECT": "Bağlantıyı kes", + "SCALE": { + "BLUETOOTH_SCAN_RUNNING": "Tartı 60 saniye aranacak, lütfen bekleyin", + "BLUETOOTH_NOT_ENABLED": "Bluetooth etkinleştirilmedi, lütfen düzgün çalışması için etkinleştirin", + "CONNECTION_NOT_ESTABLISHED": "Tartı bulunamadı veya bağlantı kurulamadı", + "CONNECTED_SUCCESSFULLY": "Tartı bağlandı", + "DISCONNECTED_SUCCESSFULLY": "Tartı bağlantısı kesildi", + "DISCONNECTED_UNPLANNED": "Tartının bağlantısı planlanmamış şekilde kesildi", + "REQUEST_PERMISSION": { + "LOCATION": "Bluetooth ile terazisiyi bulmak için uygulamanın konuma erişmesi gerekiyor.", + "BLUETOOTH": "Bluetooth ile terazisiyi bulmak için uygulamanın bluetooth erişimi gerekiyor." + }, + "INFORMATION_DESCRIPTION": "Desteklenen tartılar: Decent Tartı, Acaia Tartı, Felicita Tartı and Hiroia Jimmy" + }, + "QR":{ + "WRONG_QRCODE_DESCRIPTION": "Yanlış qr kodu veya yanlış içerik", + "WRONG_QRCODE_TITLE": "Hata", + "WRONG_LINK_DESCRIPTION": "Yanlış uygulama bağlantısı", + "WRONG_LINK_TITLE": "Hata", + "SERVER": { + "ERROR_OCCURED": "Bir hata oluştu, qr kodu okunamadı, lütfen tekrar deneyin." + }, + "BEAN_SUCCESSFULLY_SCANNED": "Çekirdek başarıyla tarandı", + "BEAN_SUCCESSFULLY_REFRESHED": "Çekirdek başarıyla güncellendi", + "IMAGES_GETTING_DOWNLOADED": "Görüntü ayarları indirildi" + }, + "RETRY_CONNECT": "Bağlantıyı yeniden dene", + "SMART_SCALE_STAY_CONNECTED_ON_APP_MINIMIZE": "Uygulama simge durumuna küçültülmüş/etkin değilken bile tartının bağlanmasına izin ver", + "BREW_FLOW_WEIGHT": "Ağırlık", + "BREW_FLOW_WEIGHT_PER_SECOND": "Akış", + "ROAST_TYPE_UNKNOWN":"Bilinmiyor", + "ROAST_TYPE_CINNAMON_ROAST":"Tarçın Renk (Çok Açık) Kavrum", + "ROAST_TYPE_AMERICAN_ROAST":"Amerikan (Açık) Kavrum", + "ROAST_TYPE_NEW_ENGLAND_ROAST":"İngiltere (Az açık) Kavrum", + "ROAST_TYPE_HALF_CITY_ROAST":"Orta - Alt Kavrum", + "ROAST_TYPE_MODERATE_LIGHT_ROAST":"Orta-Hafif Kavrum", + "ROAST_TYPE_CITY_ROAST":"Orta Kavrum", + "ROAST_TYPE_CITY_PLUS_ROAST":"Orta+ Kavrum", + "ROAST_TYPE_FULL_CITY_ROAST":"Orta - Üst Kavrum", + "ROAST_TYPE_FULL_CITY_PLUS_ROAST":"Orta - Üst+ Kavrum", + "ROAST_TYPE_ITALIAN_ROAST":"İtalyan (Çok Koyu) Kavrum", + "ROAST_TYPE_VIEANNA_ROAST":"Viyana (Az Koyu) Kavrum", + "ROAST_TYPE_FRENCH_ROAST":"Fransız (Koyu) Kavrum", + "ROAST_TYPE_CUSTOM_ROAST":"Özel", + "BEAN_MIX_UNKNOWN":"Bilinmiyor", + "BEAN_MIX_SINGLE_ORIGIN":"Tek Köken", + "BEAN_MIX_BLEND":"Harman", + "BEAN_ROASTING_TYPE_FILTER":"Filtre", + "BEAN_ROASTING_TYPE_ESPRESSO":"Espresso", + "BEAN_ROASTING_TYPE_OMNI":"Omni", + "BEAN_ROASTING_TYPE_UNKNOWN":"Bilinmiyor", + "SMART_SCALE_LOG": "Akıllı tartı için günlük dosyalarını etkinleştir (sadece hata ayıklamak için günlükleri göndermek için kullanın)", + "TOAST_PREPARATION_TOOL_EDITED_SUCCESSFULLY": "Hazırlık aracı düzenlendi", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE": "Bluetooth tartı", + "PAGE_SETTINGS_TAB_GENERAL": "Genel", + "SMART_SCALE_TARE_ON_BREW": "Yeni demlemede tartı darası", + "SMART_SCALE_TARE_ON_START_TIMER": "Zamanlayıcıyı başlatırken tartı darası", + "PAGE_SETTINGS_BREW_RATING_STEPS": "Derecelendirme adımları", + "BREW_AVG_FLOW_WEIGHT_PER_SECOND": "Ø Akış", + "CUSTOM_LIST_VIEW_PARAMETERS": "Liste görünümde parametreler", + "NAV_LIST_VIEW_CUSTOM_PARAMETERS": "Liste görünümde parametreler", + "PAGE_LIST_VIEW_CUSTOM_PARAMETERS_DESCRIPTION": " Kahve demlemenizin hangi parametresinin liste görünümü karolarında görüntüleneceğine karar verin", + "BREW_DATA_VESSEL_NAME_WEIGHT": "Sürahi (Karaf) İsmi/Ağırlığı", + "IGNORE_NEGATIVE_VALUES": "Negatif ağırlık değerlerini yoksay", + "IGNORE_ANOMALY_VALUES": "Anormallik değerlerini yoksay", + "IGNORE_ANOMALY_VALUES_TOOLTIP": "Örneğin: Bir bardağı terazide döndürün", + "TOAST_BEAN_FAVOURITE_ADDED":"Favori eklendi", + "TOAST_BEAN_FAVOURITE_REMOVED":"Favori kaldırıldı", + "QR_CODE_SCANNER_INFORMATION_TITLE": "QR Kodu", + "QR_CODE_SCANNER_INFORMATION_DESCRIPTION": "Taranan tüm fasulye bilgileri doğrudan kavurucudan alınmıştır.
Yanlış veya yanıltıcı bilgi bulursanız lütfen bana e-posta ile bildirin: info@beanconqueror.com.", + "DONT_SHOW_AGAIN": "Bir daha gösterme", + "ARCHIVED_TOOLS": "Arşivlenmiş araçlar", + "UNARCHIVE": "Geri Yükle", + "PAGE_SETTINGS_HIDE_ARCHIVED_BREWS_DASHBOARD": "Arşivlenmiş demlemeleri kontrol panelinde göster", + "PAGE_SETTINGS_HIDE_ARCHIVED_BREWS_DASHBOARD_DESCRIPTION": "Arşivlenmiş demlemeler ana sayfada gösterilmeli mi?", + "COPY": "Kopyala", + "TOAST_PREPARATION_METHOD_REPEATED_SUCCESSFULLY": "Hazırlama yöntemi başarıyla kopyalandı", + "PREPARATION_TYPE_CAFEC_FLOWER": "Cafec Flower", + "PREPARATION_TYPE_DECEMBER_DRIPPER": "December Dripper", + "PREPARATION_TYPE_DECENT_ESPRESSO": "Decent Espresso", + "PREPARATION_TYPE_HARIO_SWITCH": "Hario Switch", + "PREPARATION_TYPE_HARIO_WOODNECK": "Hario Woodneck", + "PREPARATION_TYPE_RATIO_SIX_COFFEE_BREWER": "Ratio Six Coffee Brewer", + "PREPARATION_TYPE_ROK": "ROK", + "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo", + "PREPARATION_TYPE_TRICOLATE": "Tricolate", + "QR_CODE_REFRESH_DATA_MESSAGE": "Çekirdeğin tüm bilgilerinin üzerine yazılacak, şimdi başlasın mı?", + "POPOVER_QR_CODE_REFRESH": "Verileri yeniden yükle", + "BREW_FLOW_WEIGHT_REALTIME": "Fluss (Echtzeit)" +} diff --git a/src/assets/i18n/zh-cn.json b/src/assets/i18n/zh.json similarity index 98% rename from src/assets/i18n/zh-cn.json rename to src/assets/i18n/zh.json index 40d3d6843..47d1ca715 100644 --- a/src/assets/i18n/zh-cn.json +++ b/src/assets/i18n/zh.json @@ -56,7 +56,8 @@ "PAGE_SETTINGS_LANGUAGE_GERMAN": "German", "PAGE_SETTINGS_LANGUAGE_ENGLISH": "English", "PAGE_SETTINGS_LANGUAGE_SPANISH": "Spanish", - "PAGE_SETTINGS_LANGUAGE_CHINESE": "Chinese", + "PAGE_SETTINGS_LANGUAGE_TURKISH": "土耳其", + "PAGE_SETTINGS_LANGUAGE_CHINESE": "中国人", "PAGE_SETTINGS_GENERAL_SETTINGS": "常规设置", "PAGE_SETTINGS_TRANSFER": "数据转移", "PAGE_SETTINGS_PRESET_LAST_BREW": "使用预设值?", @@ -719,6 +720,23 @@ "如果您的应用显示空白,请进入设置并导入下面的文件 'Download/Beanconqueror_export/Beanconqueror_automatic_export_*.json' * 代表最新的数据备份。", "然后所有数据都应该恢复正常,如果没有,请给我写一封电子邮件:info@beanconqueror.com。" ] + }, + "6.1.5": { + "TITLE": "Version 6.1.5: Das ist neu", + "DESCRIPTION": [ + "QR Codes", + "Lade die QR-Code Daten der Rösterei nun erneut", + "", + "Brühgraph", + "Wasserfluss wird nun in Echtzeit berechnet", + "", + "Bohnen", + "Suchfeld bei der Auswahl der Bohnen", + "", + "Fehlerbehebungen:", + "Nach Aufnahme eines Bildes war der Ladebalken nicht verschwunden", + "Kleinere Fehlerbehebungen" + ] } }, "CUSTOM_PARAMETERS": "自定义参数", @@ -1165,5 +1183,8 @@ "PREPARATION_TYPE_RATIO_SIX_COFFEE_BREWER": "Ratio Six Coffee Brewer", "PREPARATION_TYPE_ROK": "ROK 手压咖啡机", "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo", - "PREPARATION_TYPE_TRICOLATE": "Tricolate 聪明杯" + "PREPARATION_TYPE_TRICOLATE": "Tricolate 聪明杯", + "QR_CODE_REFRESH_DATA_MESSAGE": "Alle Informationen der Bohne werden überschritten, jetzt fortfahren?", + "POPOVER_QR_CODE_REFRESH": "Daten neu laden", + "BREW_FLOW_WEIGHT_REALTIME": "Fluss (Echtzeit)" } From 8d14510c270d3934ec405654073ea1749ccc3492 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Fri, 17 Jun 2022 21:16:38 +0200 Subject: [PATCH 18/78] Added thanks for translation --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 5e5a5e02a..b71acb4b5 100755 --- a/README.md +++ b/README.md @@ -70,6 +70,9 @@ Different features are supported by this app, a brief overview you'll find here. - Nicola for giving the app a whole new design. - Frank for translating the app into spanish. +- [Halil Portakal](https://www.kahvekulubu.net/sosyal/members/portakalhalil.3158/) for Turkish translation +- [Jiageng Ding](https://github.com/JiagengDing) for Chinese translation + ## Getting the App The App is a cross platform application, running on the ionic framework. From 26c3d8c492ef80be8cb391055b2751aac0fc3918 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Fri, 17 Jun 2022 21:40:17 +0200 Subject: [PATCH 19/78] npm install changes --- package-lock.json | 28964 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 28898 insertions(+), 66 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ab7dab01..9021a8955 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,28810 @@ { "name": "beanconqueror", "version": "2.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "beanconqueror", + "version": "2.0.0", + "dependencies": { + "@angular/common": "^13.1.0", + "@angular/core": "^13.1.0", + "@angular/forms": "^13.1.0", + "@angular/platform-browser": "^13.1.0", + "@angular/platform-browser-dynamic": "^13.1.0", + "@angular/router": "^13.1.0", + "@ionic-native/android-permissions": "^5.33.1", + "@ionic-native/app-minimize": "^5.33.1", + "@ionic-native/app-version": "^5.33.1", + "@ionic-native/camera": "^5.33.1", + "@ionic-native/core": "^5.33.1", + "@ionic-native/deeplinks": "^5.33.1", + "@ionic-native/device": "^5.33.1", + "@ionic-native/file": "^5.33.1", + "@ionic-native/file-chooser": "^5.33.1", + "@ionic-native/file-path": "^5.33.1", + "@ionic-native/file-picker": "^5.33.1", + "@ionic-native/file-transfer": "^5.34.0", + "@ionic-native/geolocation": "^5.33.1", + "@ionic-native/globalization": "^5.33.1", + "@ionic-native/image-picker": "^5.33.1", + "@ionic-native/in-app-browser": "^5.33.1", + "@ionic-native/insomnia": "^5.33.1", + "@ionic-native/keyboard": "^5.33.1", + "@ionic-native/screen-orientation": "^5.36.0", + "@ionic-native/social-sharing": "^5.33.1", + "@ionic-native/splash-screen": "^5.33.1", + "@ionic-native/status-bar": "^5.33.1", + "@ionic-native/three-dee-touch": "^5.33.1", + "@ionic/angular": "^6.0.14", + "@ionic/cli": "^6.18.1", + "@ionic/storage": "^2.3.1", + "@ngx-translate/core": "^11.0.1", + "@ngx-translate/http-loader": "^4.0.0", + "ag-virtual-scroll": "^1.3.0", + "chart.js": "^3.6.0", + "chartjs-adapter-luxon": "^1.1.0", + "chartjs-plugin-annotation": "^1.3.0", + "chartjs-plugin-streaming": "^2.0.0", + "chartjs-plugin-zoom": "^1.2.0", + "cordova-android-support-gradle-release": "^3.0.1", + "cordova-plugin-3dtouch": "^1.3.8", + "cordova-plugin-android-permissions": "1.1.2", + "cordova-plugin-appminimize": "^1.0.1", + "cordova-plugin-device": "^2.0.3", + "cordova-plugin-enable-multidex": "^0.2.0", + "cordova-plugin-file": "^6.0.2", + "cordova-plugin-filechooser": "^1.2.0", + "cordova-plugin-filepicker": "^1.1.6", + "cordova-plugin-globalization": "^1.11.0", + "cordova-plugin-ionic-keyboard": "^2.2.0", + "cordova-plugin-statusbar": "^2.4.3", + "core-js": "^3.19.3", + "currency-symbol-map": "^5.0.1", + "javascript-color-gradient": "^1.3.2", + "lodash": "^4.17.21", + "luxon": "^2.3.0", + "moment": "^2.29.1", + "ngx-stars": "^1.4.3", + "postcss": "^8.3.5", + "rxjs": "^6.6.6", + "tslib": "^2.0.0", + "xlsx": "^0.17.4", + "zone.js": "~0.11.4" + }, + "devDependencies": { + "@angular-devkit/architect": "^0.1301.0", + "@angular-devkit/build-angular": "^13.1.1", + "@angular-devkit/core": "^13.1.0", + "@angular-devkit/schematics": "^13.1.0", + "@angular/cli": "^13.1.0", + "@angular/compiler": "^13.1.0", + "@angular/compiler-cli": "^13.1.0", + "@angular/language-service": "^13.1.0", + "@ionic/angular-toolkit": "^5.0.3", + "@types/cordova-plugin-ble-central": "^1.3.1", + "@types/jasmine": "~3.6.0", + "@types/jasminewd2": "~2.0.8", + "@types/lodash": "^4.14.178", + "@types/node": "^12.20.5", + "@wisdomgarden/cordova-plugin-filepath": "git+https://github.com/wisdom-garden/cordova-plugin-filepath.git", + "cordova-android": "^10.1.2", + "cordova-ios": "^6.2.0", + "cordova-plugin-add-swift-support": "^2.0.2", + "cordova-plugin-androidx": "^3.0.0", + "cordova-plugin-androidx-adapter": "^1.1.3", + "cordova-plugin-app-version": "^0.1.12", + "cordova-plugin-apprate": "^1.7.2", + "cordova-plugin-ble-central": "^1.4.4", + "cordova-plugin-camera": "^6.0.0", + "cordova-plugin-customurlscheme-ng": "^10.0.0", + "cordova-plugin-dialogs": "^2.0.2", + "cordova-plugin-file-transfer": "github:dpa99c/cordova-plugin-file-transfer", + "cordova-plugin-geolocation": "^4.1.0", + "cordova-plugin-health": "^2.0.0", + "cordova-plugin-inappbrowser": "^5.0.0", + "cordova-plugin-insomnia": "^4.3.0", + "cordova-plugin-ionic-webview": "^5.0.0", + "cordova-plugin-nativestorage": "^2.3.2", + "cordova-plugin-screen-orientation": "^3.0.2", + "cordova-plugin-simple-file-chooser": "^2.2.1", + "cordova-plugin-splashscreen": "^6.0.0", + "cordova-plugin-telerik-imagepicker": "^2.3.3", + "cordova-plugin-x-socialsharing": "^6.0.3", + "cordova-sqlite-storage": "^5.1.0", + "elliptic": ">=6.5.4", + "es6-promise-plugin": "^4.2.2", + "fttx-phonegap-plugin-barcodescanner": "github:fttx/phonegap-plugin-barcodescanner", + "ionic-plugin-deeplinks": "^1.0.22", + "jasmine-core": "~3.6.0", + "jasmine-spec-reporter": "~5.0.0", + "karma": "^6.3.9", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage-istanbul-reporter": "~3.0.2", + "karma-jasmine": "~4.0.0", + "karma-jasmine-html-reporter": "^1.5.0", + "prettier": "^2.6.2", + "protractor": "~7.0.0", + "skwas-cordova-plugin-datetimepicker": "^2.1.2", + "stylelint": "^13.12.0", + "stylelint-config-standard": "^20.0.0", + "ts-node": "~8.3.0", + "tslint": "~6.1.0", + "typescript": "~4.5.4", + "webpack-subresource-integrity": "^1.5.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.0.2.tgz", + "integrity": "sha512-SncaVxs+E3EdoA9xJgHfWPxZfowAgeIsd71VpqCKP6KNKm6s7zSqqvUc70UpKUFsrV3dAmy6qxHoIj5NG+3DiA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "1.0.0", + "sourcemap-codec": "1.4.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ampproject/remapping/node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1301.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1301.1.tgz", + "integrity": "sha512-3g1wlqihVEOhClsuSzyJYm8Sr4qc4IUDuOa45m8439bz9iQy2wZ3JUGTwX1NcpeLxmCDrgewuphIsW096HxYlg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "13.1.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/architect/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/@angular-devkit/architect/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.1.1.tgz", + "integrity": "sha512-9+Ql4+rIt5CFfxLCZntCUdcVGl7mOi43/jpmYd31DKEUt4OPrqLoR5LsYepy3UR0+B0kNP6/PEOvaRiCb4t2GQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "1.0.2", + "@angular-devkit/architect": "0.1301.1", + "@angular-devkit/build-webpack": "0.1301.1", + "@angular-devkit/core": "13.1.1", + "@babel/core": "7.16.0", + "@babel/generator": "7.16.0", + "@babel/helper-annotate-as-pure": "7.16.0", + "@babel/plugin-proposal-async-generator-functions": "7.16.4", + "@babel/plugin-transform-async-to-generator": "7.16.0", + "@babel/plugin-transform-runtime": "7.16.4", + "@babel/preset-env": "7.16.4", + "@babel/runtime": "7.16.3", + "@babel/template": "7.16.0", + "@discoveryjs/json-ext": "0.5.6", + "@ngtools/webpack": "13.1.1", + "ansi-colors": "4.1.1", + "babel-loader": "8.2.3", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "^4.9.1", + "cacache": "15.3.0", + "circular-dependency-plugin": "5.2.2", + "copy-webpack-plugin": "10.0.0", + "core-js": "3.19.3", + "critters": "0.0.15", + "css-loader": "6.5.1", + "esbuild-wasm": "0.14.2", + "glob": "7.2.0", + "https-proxy-agent": "5.0.0", + "inquirer": "8.2.0", + "jsonc-parser": "3.0.0", + "karma-source-map-support": "1.4.0", + "less": "4.1.2", + "less-loader": "10.2.0", + "license-webpack-plugin": "4.0.0", + "loader-utils": "3.2.0", + "mini-css-extract-plugin": "2.4.5", + "minimatch": "3.0.4", + "open": "8.4.0", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "6.0.1", + "piscina": "3.1.0", + "postcss": "8.4.4", + "postcss-import": "14.0.2", + "postcss-loader": "6.2.1", + "postcss-preset-env": "6.7.0", + "regenerator-runtime": "0.13.9", + "resolve-url-loader": "4.0.0", + "rxjs": "6.6.7", + "sass": "1.44.0", + "sass-loader": "12.4.0", + "semver": "7.3.5", + "source-map-loader": "3.0.0", + "source-map-support": "0.5.21", + "stylus": "0.55.0", + "stylus-loader": "6.2.0", + "terser": "5.10.0", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.3.1", + "webpack": "5.65.0", + "webpack-dev-middleware": "5.2.2", + "webpack-dev-server": "4.6.0", + "webpack-merge": "5.8.0", + "webpack-subresource-integrity": "5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.14.2" + }, + "peerDependencies": { + "@angular/compiler-cli": "^13.0.0 || ^13.1.0-next", + "@angular/localize": "^13.0.0 || ^13.1.0-next", + "@angular/service-worker": "^13.0.0 || ^13.1.0-next", + "karma": "^6.3.0", + "ng-packagr": "^13.0.0 || ^13.1.0-next", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0", + "typescript": ">=4.4.3 <4.6" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { + "version": "0.1301.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1301.1.tgz", + "integrity": "sha512-3g1wlqihVEOhClsuSzyJYm8Sr4qc4IUDuOa45m8439bz9iQy2wZ3JUGTwX1NcpeLxmCDrgewuphIsW096HxYlg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "13.1.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.1.1.tgz", + "integrity": "sha512-tpOOzdrbrXG+BiJ/iKUX5VU5vBXN/n+H1EMThTwjgT11mqw2uvMj4sSRPvHUrrfxbLE9deuCDQEzmci71enn2w==", + "dev": true, + "dependencies": { + "ajv": "8.8.2", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/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/@angular-devkit/build-angular/node_modules/@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/helper-module-transforms": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", + "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/helpers": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.5.tgz", + "integrity": "sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/ajv": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular-devkit/build-angular/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/@angular-devkit/build-angular/node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/esbuild": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.2.tgz", + "integrity": "sha512-l076A6o/PIgcyM24s0dWmDI/b8RQf41uWoJu9I0M71CtW/YSw5T5NUeXxs5lo2tFQD+O4CW4nBHJXx3OY5NpXg==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "optionalDependencies": { + "esbuild-android-arm64": "0.14.2", + "esbuild-darwin-64": "0.14.2", + "esbuild-darwin-arm64": "0.14.2", + "esbuild-freebsd-64": "0.14.2", + "esbuild-freebsd-arm64": "0.14.2", + "esbuild-linux-32": "0.14.2", + "esbuild-linux-64": "0.14.2", + "esbuild-linux-arm": "0.14.2", + "esbuild-linux-arm64": "0.14.2", + "esbuild-linux-mips64le": "0.14.2", + "esbuild-linux-ppc64le": "0.14.2", + "esbuild-netbsd-64": "0.14.2", + "esbuild-openbsd-64": "0.14.2", + "esbuild-sunos-64": "0.14.2", + "esbuild-windows-32": "0.14.2", + "esbuild-windows-64": "0.14.2", + "esbuild-windows-arm64": "0.14.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/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/@angular-devkit/build-angular/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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/@angular-devkit/build-angular/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/@angular-devkit/build-angular/node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/inquirer": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", + "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.2.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/inquirer/node_modules/rxjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "dev": true, + "dependencies": { + "tslib": "~2.1.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/inquirer/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-devkit/build-angular/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/@angular-devkit/build-angular/node_modules/nanoid": { + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss": { + "version": "8.4.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.4.tgz", + "integrity": "sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q==", + "dev": true, + "dependencies": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@angular-devkit/build-angular/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/@angular-devkit/build-angular/node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@angular-devkit/build-angular/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/@angular-devkit/build-angular/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular-devkit/build-angular/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/@angular-devkit/build-angular/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/webpack-subresource-integrity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.0.0.tgz", + "integrity": "sha512-x9514FpLRydO+UAQ8DY4aLtCjxmdLkuQVcDFN1kGzuusREYJ1B0rzk/iIlWiL6dnvrhEGFj2+UsdxDkP8Z4UKg==", + "dev": true, + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-optimizer": { + "version": "0.1202.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1202.14.tgz", + "integrity": "sha512-I9dtwE5g4ZM2zJF3oveYhk6yFY2zYakONHyuG6YWz6oMBT0n5czggWZ2di7oggciVVdoyrTlHiApZnttQJyaWw==", + "dev": true, + "dependencies": { + "source-map": "0.7.3", + "tslib": "2.3.0", + "typescript": "4.3.5" + }, + "bin": { + "build-optimizer": "src/build-optimizer/cli.js" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-optimizer/node_modules/typescript": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1301.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1301.1.tgz", + "integrity": "sha512-drXKdqsM3uB4nII0pU8FtAI6cd96sza3r1mWl8mqJEkzgkYIGVK/2CekKdVe1AXAvEeQFVRDRMYXraMNpli/QQ==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1301.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^4.0.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { + "version": "0.1301.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1301.1.tgz", + "integrity": "sha512-3g1wlqihVEOhClsuSzyJYm8Sr4qc4IUDuOa45m8439bz9iQy2wZ3JUGTwX1NcpeLxmCDrgewuphIsW096HxYlg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "13.1.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.1.1.tgz", + "integrity": "sha512-tpOOzdrbrXG+BiJ/iKUX5VU5vBXN/n+H1EMThTwjgT11mqw2uvMj4sSRPvHUrrfxbLE9deuCDQEzmci71enn2w==", + "dev": true, + "dependencies": { + "ajv": "8.8.2", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/ajv": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/@angular-devkit/build-webpack/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@angular-devkit/build-webpack/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/@angular-devkit/build-webpack/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/core": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.1.1.tgz", + "integrity": "sha512-tpOOzdrbrXG+BiJ/iKUX5VU5vBXN/n+H1EMThTwjgT11mqw2uvMj4sSRPvHUrrfxbLE9deuCDQEzmci71enn2w==", + "dev": true, + "dependencies": { + "ajv": "8.8.2", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/core/node_modules/ajv": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/core/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/core/node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/@angular-devkit/core/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@angular-devkit/core/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/@angular-devkit/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/schematics": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.1.1.tgz", + "integrity": "sha512-uDE0vzjx7MyiJOul91MYMVpRPnAW5/o+pHcINx85wR6t4/RDQSH3UdBCCFxxwv1W9YZSR4kMiwi/sUYqPqbQMw==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "13.1.1", + "jsonc-parser": "3.0.0", + "magic-string": "0.25.7", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics/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/@angular-devkit/schematics/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular/cli": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.1.1.tgz", + "integrity": "sha512-cdcl3UAhA2oQK8klDl9zt5SwScSg2F4VQDUQ8XsdApKIRlEfee1Xf7WXKsGpgAuojrFHMzDVWjAg/bOyIpioLg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@angular-devkit/architect": "0.1301.1", + "@angular-devkit/core": "13.1.1", + "@angular-devkit/schematics": "13.1.1", + "@schematics/angular": "13.1.1", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "4.3.3", + "ini": "2.0.0", + "inquirer": "8.2.0", + "jsonc-parser": "3.0.0", + "npm-package-arg": "8.1.5", + "npm-pick-manifest": "6.1.1", + "open": "8.4.0", + "ora": "5.4.1", + "pacote": "12.0.2", + "resolve": "1.20.0", + "semver": "7.3.5", + "symbol-observable": "4.0.0", + "uuid": "8.3.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/@schematics/angular": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.1.1.tgz", + "integrity": "sha512-GY49qumsQ+w1aDsCa796iPL/GcokCVKr2OMLss3avwciBFciMOVsLxZ04lprPCivCQRcKNqbSDDx4+xH5qkrAg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "13.1.1", + "@angular-devkit/schematics": "13.1.1", + "jsonc-parser": "3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/cli/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/@angular/cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@angular/cli/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@angular/cli/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/@angular/cli/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular/cli/node_modules/inquirer": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", + "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.2.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@angular/cli/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/cli/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/@angular/cli/node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/cli/node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@angular/cli/node_modules/rxjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "dev": true, + "dependencies": { + "tslib": "~2.1.0" + } + }, + "node_modules/@angular/cli/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular/cli/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/cli/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/@angular/cli/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "node_modules/@angular/cli/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@angular/common": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.1.0.tgz", + "integrity": "sha512-bDuxl9N2fsaDrkNNuyNEdXMLwCCkjT9ru03QzP+b9RxmCBoUGeHD0uN61N5PMrsKq2RxB6jv4MJQJjT+jQqTsA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/core": "13.1.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.1.0.tgz", + "integrity": "sha512-l5qE3e+I/ogjVtXVHK0VoBOTE7N71dUcshI7Cvh5J7dFLKqbkYIr9xAP1D1tEVR6h9mzOVP5qD/M5ylR51rrOA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + } + }, + "node_modules/@angular/compiler-cli": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.1.0.tgz", + "integrity": "sha512-AUfRF3+hqy2M1TFvi70OiC13Ew9IzzTAbZppGF+N7f5ZbhyuZyGNy/gs3BxlZC0Up5ZQo7GcMHwPxovLNvgFMA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.8.6", + "canonical-path": "1.0.0", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.11.0", + "magic-string": "^0.25.0", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "sourcemap-codec": "^1.4.8", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/main-ngcc.js" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/compiler": "13.1.0", + "typescript": ">=4.4.2 <4.6" + } + }, + "node_modules/@angular/compiler-cli/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/compiler-cli/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/@angular/compiler-cli/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/@angular/compiler-cli/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular/compiler-cli/node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/@angular/compiler-cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/compiler-cli/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/compiler-cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@angular/compiler-cli/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular/compiler-cli/node_modules/yargs": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.0.tgz", + "integrity": "sha512-GQl1pWyDoGptFPJx9b9L6kmR33TGusZvXIZUT+BOz9f7X2L94oeAskFYLEg/FkhV06zZPBYLvLZRWeYId29lew==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/compiler-cli/node_modules/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/core": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.1.0.tgz", + "integrity": "sha512-eW+8dqGUqVbuzmFdyjhwizzH1FF9Mey5tvRZqzDSG1nTzlMgzQfrF/R0NEuqJdxUyjDFXiO4NyhUivFQ65CsdA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.11.4" + } + }, + "node_modules/@angular/forms": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.1.0.tgz", + "integrity": "sha512-sf9I8wftUk2+bTbdaVH2ioTXw5UfKNl0P4XFUoFxDuAzUxxlxN/ocY/VzevIEtQfoAwUp8eawnN9BkIXy+EMww==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/common": "13.1.0", + "@angular/core": "13.1.0", + "@angular/platform-browser": "13.1.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/language-service": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-13.1.0.tgz", + "integrity": "sha512-tpK/0CljInRJNP/nizQ8Bj0yFsLLmbcqAJ5yUp4uDM9nVpgmHxzJIIpR/Sk+8KKMlED5eGRXjZKPY4zhlJTmqw==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.1.0.tgz", + "integrity": "sha512-2c1OdOefpGVuIgFD0bojtEzPttXMC+iC8h/4fMpmW4v9JyRvTgPV2OPIpgfT25fTnGLQAJ19C8VG/S1J/JlXMw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/animations": "13.1.0", + "@angular/common": "13.1.0", + "@angular/core": "13.1.0" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.1.0.tgz", + "integrity": "sha512-rLFOHejw3ifJZapze0q/tHopFUZw+u/2biLFNffo+Z3UFsKI/PrBq9F+NVXnLdWzJNRY+NiI8ZFctJ9u4H39GQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/common": "13.1.0", + "@angular/compiler": "13.1.0", + "@angular/core": "13.1.0", + "@angular/platform-browser": "13.1.0" + } + }, + "node_modules/@angular/router": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.1.0.tgz", + "integrity": "sha512-A/8O0GGLKENg5wxP7TFTPWmDtyMOL9qq65uxYQCyv46/2ra76FKteFg9UzcuuXPBiCAxD1wbL5kRF2MZlfrQ3Q==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/common": "13.1.0", + "@angular/core": "13.1.0", + "@angular/platform-browser": "13.1.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", + "dev": true + }, + "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.16.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "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.10.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", + "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.5", + "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-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "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.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", + "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.10.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", + "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/types": "^7.10.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/core/node_modules/@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "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/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/@babel/core/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/@babel/core/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/@babel/core/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/@babel/generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/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/@babel/helper-annotate-as-pure": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", + "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.5.tgz", + "integrity": "sha512-3JEA9G5dmmnIWdzaT9d0NmFRgYnWUThLsDaL7982H0XqqWr56lRrsmwheXFMjR+TMl7QMBb6mzy9kvgr1lRLUA==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.5.tgz", + "integrity": "sha512-NEohnYA7mkB8L5JhU7BLwcBdU3j83IziR9aseMueWGeAjblbul3zzb8UvJ3a1zuBiqCMObzCJHFqKIQE6hTVmg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-member-expression-to-functions": "^7.16.5", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.5", + "@babel/helper-split-export-declaration": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz", + "integrity": "sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-replace-supers": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz", + "integrity": "sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-member-expression-to-functions": "^7.16.5", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz", + "integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "regexpu-core": "^4.7.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz", + "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/helper-define-polyfill-provider/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/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz", + "integrity": "sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz", + "integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz", + "integrity": "sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.5" + } + }, + "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "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.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "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.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.5.tgz", + "integrity": "sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.5", + "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/helper-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "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.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", + "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/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "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.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "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.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.5.tgz", + "integrity": "sha512-X+aAJldyxrOmN9v3FKp+Hu1NO69VWgYgDGq6YDykwRPzxs5f2N+X988CBXS7EQahDU+Vpet5QYMqLk+nsp+Qxw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-wrap-function": "^7.16.5", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "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.10.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", + "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.5", + "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.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "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.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", + "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.10.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", + "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/types": "^7.10.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "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/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/@babel/helper-replace-supers/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/@babel/helper-replace-supers/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/@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-simple-access/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-simple-access/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-simple-access/node_modules/@babel/parser": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-simple-access/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-simple-access/node_modules/@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "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.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.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.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.5.tgz", + "integrity": "sha512-2J2pmLBqUqVdJw78U0KPNdeE2qeuIyKoG4mKV7wAq3mc4jJG282UgjZw4ZYDnqiWQuS3Y3IYdF/AQ6CpyBV3VA==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "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.10.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", + "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.5", + "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.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "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.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", + "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.10.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", + "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/types": "^7.10.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helpers/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/@babel/helpers/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/@babel/helpers/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/@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/highlight/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/@babel/parser": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.5.tgz", + "integrity": "sha512-+Ce7T5iPNWzfu9C1aB5tN3Lyafs5xb3Ic7vBWyZL2KXT3QSdD1dD3CvgOzPmQKoNNRt6uauc0XwNJTQtXC2/Mw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz", + "integrity": "sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz", + "integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", + "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.16.4", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.5.tgz", + "integrity": "sha512-pJD3HjgRv83s5dv1sTnDbZOaTjghKEz8KUn1Kbh2eAIRhGuyQ1XSeI4xVXU3UlIEVA3DAyIdxqT1eRn7Wcn55A==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.5.tgz", + "integrity": "sha512-EEFzuLZcm/rNJ8Q5krK+FRKdVkd6FjfzT9tuSZql9sQn64K0hHA2KLJ0DqVot9/iV6+SsuadC5yI39zWnm+nmQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.5.tgz", + "integrity": "sha512-P05/SJZTTvHz79LNYTF8ff5xXge0kk5sIIWAypcWgX4BTRUgyHc8wRxJ/Hk+mU0KXldgOOslKaeqnhthcDJCJQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.5.tgz", + "integrity": "sha512-i+sltzEShH1vsVydvNaTRsgvq2vZsfyrd7K7vPLUU/KgS0D5yZMe6uipM0+izminnkKrEfdUnz7CxMRb6oHZWw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.5.tgz", + "integrity": "sha512-QQJueTFa0y9E4qHANqIvMsuxM/qcLQmKttBACtPCQzGUEizsXDACGonlPiSwynHfOa3vNw0FPMVvQzbuXwh4SQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.5.tgz", + "integrity": "sha512-xqibl7ISO2vjuQM+MzR3rkd0zfNWltk7n9QhaD8ghMmMceVguYrNDt7MikRyj4J4v3QehpnrU8RYLnC7z/gZLA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.5.tgz", + "integrity": "sha512-YwMsTp/oOviSBhrjwi0vzCUycseCYwoXnLiXIL3YNjHSMBHicGTz7GjVU/IGgz4DtOEXBdCNG72pvCX22ehfqg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.5.tgz", + "integrity": "sha512-DvB9l/TcsCRvsIV9v4jxR/jVP45cslTVC0PMVHvaJhhNuhn2Y1SOhCSFlPK777qLB5wb8rVDaNoqMTyOqtY5Iw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.5.tgz", + "integrity": "sha512-UEd6KpChoyPhCoE840KRHOlGhEZFutdPDMGj+0I56yuTTOaT51GzmnEl/0uT41fB/vD2nT+Pci2KjezyE3HmUw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.5.tgz", + "integrity": "sha512-ihCMxY1Iljmx4bWy/PIMJGXN4NS4oUj1MKynwO07kiKms23pNvIn1DMB92DNB2R0EA882sw0VXIelYGdtF7xEQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.5.tgz", + "integrity": "sha512-kzdHgnaXRonttiTfKYnSVafbWngPPr2qKw9BWYBESl91W54e+9R5pP70LtWxV56g0f05f/SQrwHYkfvbwcdQ/A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.5.tgz", + "integrity": "sha512-+yFMO4BGT3sgzXo+lrq7orX5mAZt57DwUK6seqII6AcJnJOIhBJ8pzKH47/ql/d426uQ7YhN8DpUFirQzqYSUA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.5.tgz", + "integrity": "sha512-+YGh5Wbw0NH3y/E5YMu6ci5qTDmAEVNoZ3I54aB6nVEOZ5BQ7QJlwKq5pYVucQilMByGn/bvX0af+uNaPRCabA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.5.tgz", + "integrity": "sha512-s5sKtlKQyFSatt781HQwv1hoM5BQ9qRH30r+dK56OLDsHmV74mzwJNX7R1yMuE7VZKG5O6q/gmOGSAO6ikTudg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5" + }, + "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.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.5.tgz", + "integrity": "sha512-8bTHiiZyMOyfZFULjsCnYOWG059FVMes0iljEHSfARhNgFfpsqE92OrCffv3veSw9rwMkYcFe9bj0ZoXU2IGtQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", + "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.5.tgz", + "integrity": "sha512-BxmIyKLjUGksJ99+hJyL/HIxLIGnLKtw772zYDER7UuycDZ+Xvzs98ZQw6NGgM2ss4/hlFAaGiZmMNKvValEjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.5.tgz", + "integrity": "sha512-JxjSPNZSiOtmxjX7PBRBeRJTUKTyJ607YUYeT0QJCNdsedOe+/rXITjP08eG8xUpsLfPirgzdCFN+h0w6RI+pQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.5.tgz", + "integrity": "sha512-DzJ1vYf/7TaCYy57J3SJ9rV+JEuvmlnvvyvYKFbk5u46oQbBvuB9/0w+YsVsxkOv8zVWKpDmUoj4T5ILHoXevA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-replace-supers": "^7.16.5", + "@babel/helper-split-export-declaration": "^7.16.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz", + "integrity": "sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-replace-supers": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz", + "integrity": "sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-member-expression-to-functions": "^7.16.5", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.5.tgz", + "integrity": "sha512-n1+O7xtU5lSLraRzX88CNcpl7vtGdPakKzww74bVwpAIRgz9JVLJJpOLb0uYqcOaXVM0TL6X0RVeIJGD2CnCkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.5.tgz", + "integrity": "sha512-GuRVAsjq+c9YPK6NeTkRLWyQskDC099XkBSVO+6QzbnOnH2d/4mBVXYStaPrZD3dFRfg00I6BFJ9Atsjfs8mlg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.5.tgz", + "integrity": "sha512-iQiEMt8Q4/5aRGHpGVK2Zc7a6mx7qEAO7qehgSug3SDImnuMzgmm/wtJALXaz25zUj1PmnNHtShjFgk4PDx4nw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.5.tgz", + "integrity": "sha512-81tijpDg2a6I1Yhj4aWY1l3O1J4Cg/Pd7LfvuaH2VVInAkXtzibz9+zSPdUM1WvuUi128ksstAP0hM5w48vQgg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.5.tgz", + "integrity": "sha512-12rba2HwemQPa7BLIKCzm1pT2/RuQHtSFHdNl41cFiC6oi4tcrp7gjB07pxQvFpcADojQywSjblQth6gJyE6CA==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.5.tgz", + "integrity": "sha512-+DpCAJFPAvViR17PIMi9x2AE34dll5wNlXO43wagAX2YcRGgEVHCNFC4azG85b4YyyFarvkc/iD5NPrz4Oneqw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.5.tgz", + "integrity": "sha512-Fuec/KPSpVLbGo6z1RPw4EE1X+z9gZk1uQmnYy7v4xr4TO9p41v1AoUuXEtyqAI7H+xNJYSICzRqZBhDEkd3kQ==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.5.tgz", + "integrity": "sha512-B1j9C/IfvshnPcklsc93AVLTrNVa69iSqztylZH6qnmiAsDDOmmjEYqOm3Ts2lGSgTSywnBNiqC949VdD0/gfw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.5.tgz", + "integrity": "sha512-d57i3vPHWgIde/9Y8W/xSFUndhvhZN5Wu2TjRrN1MVz5KzdUihKnfDVlfP1U7mS5DNj/WHHhaE4/tTi4hIyHwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.5.tgz", + "integrity": "sha512-oHI15S/hdJuSCfnwIz+4lm6wu/wBn7oJ8+QrkzPPwSFGXk8kgdI/AIKcbR/XnD1nQVMg/i6eNaXpszbGuwYDRQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-module-transforms": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", + "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.5.tgz", + "integrity": "sha512-ABhUkxvoQyqhCWyb8xXtfwqNMJD7tx+irIRnUh6lmyFud7Jln1WzONXKlax1fg/ey178EXbs4bSGNd6PngO+SQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-simple-access": "^7.16.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-module-transforms": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", + "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.5.tgz", + "integrity": "sha512-53gmLdScNN28XpjEVIm7LbWnD/b/TpbwKbLk6KV4KqC9WyU6rq1jnNmVG6UgAdQZVVGZVoik3DqHNxk4/EvrjA==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-validator-identifier": "^7.15.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-module-transforms": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", + "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.5.tgz", + "integrity": "sha512-qTFnpxHMoenNHkS3VoWRdwrcJ3FhX567GvDA3hRZKF0Dj8Fmg0UzySZp3AP2mShl/bzcywb/UWAMQIjA1bhXvw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-module-transforms": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", + "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.5.tgz", + "integrity": "sha512-/wqGDgvFUeKELW6ex6QB7dLVRkd5ehjw34tpXu1nhKC0sFfmaLabIswnpf8JgDyV2NeDmZiwoOb0rAmxciNfjA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.5.tgz", + "integrity": "sha512-ZaIrnXF08ZC8jnKR4/5g7YakGVL6go6V9ql6Jl3ecO8PQaQqFE74CuM384kezju7Z9nGCCA20BqZaR1tJ/WvHg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.5.tgz", + "integrity": "sha512-tded+yZEXuxt9Jdtkc1RraW1zMF/GalVxaVVxh41IYwirdRgyAxxxCKZ9XB7LxZqmsjfjALxupNE1MIz9KH+Zg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-replace-supers": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz", + "integrity": "sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-replace-supers": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz", + "integrity": "sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-member-expression-to-functions": "^7.16.5", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.5.tgz", + "integrity": "sha512-B3O6AL5oPop1jAVg8CV+haeUte9oFuY85zu0jwnRNZZi3tVAbJriu5tag/oaO2kGaQM/7q7aGPBlTI5/sr9enA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.5.tgz", + "integrity": "sha512-+IRcVW71VdF9pEH/2R/Apab4a19LVvdVsr/gEeotH00vSDVlKD+XgfSIw+cgGWsjDB/ziqGv/pGoQZBIiQVXHg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.5.tgz", + "integrity": "sha512-2z+it2eVWU8TtQQRauvGUqZwLy4+7rTfo6wO4npr+fvvN1SW30ZF3O/ZRCNmTuu4F5MIP8OJhXAhRV5QMJOuYg==", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.5.tgz", + "integrity": "sha512-aIB16u8lNcf7drkhXJRoggOxSTUAuihTSTfAcpynowGJOZiGf+Yvi7RuTwFzVYSYPmWyARsPqUGoZWWWxLiknw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz", + "integrity": "sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.5.tgz", + "integrity": "sha512-ZbuWVcY+MAXJuuW7qDoCwoxDUNClfZxoo7/4swVbOW1s/qYLOMHlm9YRWMsxMFuLs44eXsv4op1vAaBaBaDMVg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.5.tgz", + "integrity": "sha512-5d6l/cnG7Lw4tGHEoga4xSkYp1euP7LAtrah1h1PgJ3JY7yNsjybsxQAnVK4JbtReZ/8z6ASVmd3QhYYKLaKZw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.5.tgz", + "integrity": "sha512-usYsuO1ID2LXxzuUxifgWtJemP7wL2uZtyrTVM4PKqsmJycdS4U4mGovL5xXkfUheds10Dd2PjoQLXw6zCsCbg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.5.tgz", + "integrity": "sha512-gnyKy9RyFhkovex4BjKWL3BVYzUDG6zC0gba7VMLbQoDuqMfJ1SDXs8k/XK41Mmt1Hyp4qNAvGFb9hKzdCqBRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.5.tgz", + "integrity": "sha512-ldxCkW180qbrvyCVDzAUZqB0TAeF8W/vGJoRcaf75awm6By+PxfJKvuqVAnq8N9wz5Xa6mSpM19OfVKKVmGHSQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.5.tgz", + "integrity": "sha512-shiCBHTIIChGLdyojsKQjoAyB8MBwat25lKM7MJjbe1hE0bgIppD+LX9afr41lLHOhqceqeWl4FkLp+Bgn9o1Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.5.tgz", + "integrity": "sha512-GTJ4IW012tiPEMMubd7sD07iU9O/LOo8Q/oU4xNhcaq0Xn8+6TcUQaHtC8YxySo1T+ErQ8RaWogIEeFhKGNPzw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", + "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-async-generator-functions": "^7.16.4", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-class-static-block": "^7.16.0", + "@babel/plugin-proposal-dynamic-import": "^7.16.0", + "@babel/plugin-proposal-export-namespace-from": "^7.16.0", + "@babel/plugin-proposal-json-strings": "^7.16.0", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-object-rest-spread": "^7.16.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.0", + "@babel/plugin-transform-async-to-generator": "^7.16.0", + "@babel/plugin-transform-block-scoped-functions": "^7.16.0", + "@babel/plugin-transform-block-scoping": "^7.16.0", + "@babel/plugin-transform-classes": "^7.16.0", + "@babel/plugin-transform-computed-properties": "^7.16.0", + "@babel/plugin-transform-destructuring": "^7.16.0", + "@babel/plugin-transform-dotall-regex": "^7.16.0", + "@babel/plugin-transform-duplicate-keys": "^7.16.0", + "@babel/plugin-transform-exponentiation-operator": "^7.16.0", + "@babel/plugin-transform-for-of": "^7.16.0", + "@babel/plugin-transform-function-name": "^7.16.0", + "@babel/plugin-transform-literals": "^7.16.0", + "@babel/plugin-transform-member-expression-literals": "^7.16.0", + "@babel/plugin-transform-modules-amd": "^7.16.0", + "@babel/plugin-transform-modules-commonjs": "^7.16.0", + "@babel/plugin-transform-modules-systemjs": "^7.16.0", + "@babel/plugin-transform-modules-umd": "^7.16.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", + "@babel/plugin-transform-new-target": "^7.16.0", + "@babel/plugin-transform-object-super": "^7.16.0", + "@babel/plugin-transform-parameters": "^7.16.3", + "@babel/plugin-transform-property-literals": "^7.16.0", + "@babel/plugin-transform-regenerator": "^7.16.0", + "@babel/plugin-transform-reserved-words": "^7.16.0", + "@babel/plugin-transform-shorthand-properties": "^7.16.0", + "@babel/plugin-transform-spread": "^7.16.0", + "@babel/plugin-transform-sticky-regex": "^7.16.0", + "@babel/plugin-transform-template-literals": "^7.16.0", + "@babel/plugin-transform-typeof-symbol": "^7.16.0", + "@babel/plugin-transform-unicode-escapes": "^7.16.0", + "@babel/plugin-transform-unicode-regex": "^7.16.0", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.0", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.19.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "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.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", + "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", + "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.5", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", + "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/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/@babel/traverse/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/@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types/node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", + "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", + "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==", + "dev": true + }, + "node_modules/@ionic-native/android-permissions": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/android-permissions/-/android-permissions-5.33.1.tgz", + "integrity": "sha512-IlyvC8KTwjKNZvVWYI6/sPPgFxgQscJPTBhv90qFH5QOt7DZQLoGviiQC6wXSvybEnbP3YvDdXTGKKrFbS9k4w==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/android-permissions/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/app-minimize": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/app-minimize/-/app-minimize-5.33.1.tgz", + "integrity": "sha512-RvMUP85BfZKQGwxz7uVJVb5BHbgkIy4U7mSsJRX3b7QzQDfxGZ2Ud9YY4rcpSUA3fGujJqHgtkvoaGknxugx1g==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/app-minimize/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/app-version": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/app-version/-/app-version-5.33.1.tgz", + "integrity": "sha512-Mx4zBq1RpMOrazPaN/B4ToJBxmOtzFVG5wGjeTSovVaOzFiz8Dct7H6hwVScifIABOEA0i2gtqtwuSylJzTGWA==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/app-version/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/camera": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/camera/-/camera-5.33.1.tgz", + "integrity": "sha512-mu234nKCjVziPUFD4EYfz4XbCZqV4uKLQf1IEd4YtPAe9ooYt/1HLcvftK8+BNVfWm8JrDtWSmvvmHZalHxXuA==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/camera/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/core": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/core/-/core-5.33.1.tgz", + "integrity": "sha512-BmjQqMzm6JE2V9Kj07cTA27frm516KMAViSpRNi4MQxPm9lHp9mxBGFDa4pqS/C0G8lA2kVh40fEZA0nOH9w+g==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/core/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/deeplinks": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/deeplinks/-/deeplinks-5.33.1.tgz", + "integrity": "sha512-NMO1iT89+42I2ryeMJSpDN8mrISj6NikCr9/iPxA5oBQzxv4eYtJqK1Ns5p28B1d3WZuB107WKYWqe9Z/jyHRw==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/deeplinks/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/device": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/device/-/device-5.33.1.tgz", + "integrity": "sha512-TupgwI9ys7baznAMVl75/giPSN/tgaC/AKzB6gOObEMWr9tzdmYxywstmsyVPCFy8MvXRO7KKfdmxG/Lg5FrWg==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/file": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/file/-/file-5.33.1.tgz", + "integrity": "sha512-N6tvCmLBYnY+fDeEhI+7kYHuIVcZ/JtrhRIepJ9qpF82DTvMg0fXy5XToKZ5hqthbKAwci8//A8Etp0oBzjx+w==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/file-chooser": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/file-chooser/-/file-chooser-5.33.1.tgz", + "integrity": "sha512-I5BfFkRnVlUs/EFFhaP2ou854gih+wSHNbDxa6X2rx0KEgoqSSl0KtAHkUwpKcpvss1ZlsQ65kcs5bR93yZuvA==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/file-chooser/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/file-path": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/file-path/-/file-path-5.33.1.tgz", + "integrity": "sha512-hFnvWsou1XRtt/OlxzpJos6Xii54oxCpnF6/pM2zQGBVMGaNoBgRnBsL+GtlycJmQqp/tZJAy4JDcanflHaTtg==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/file-path/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/file-picker": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/file-picker/-/file-picker-5.33.1.tgz", + "integrity": "sha512-2xVzncPUMsEludy9olGp7Z2a3nLmIiY7PvAaWQvEO4/hbwPZRezJUpFZoNbQm1rrnic915oM+FxokUKI611Xzw==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/file-picker/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/file-transfer": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@ionic-native/file-transfer/-/file-transfer-5.34.0.tgz", + "integrity": "sha512-6jmT7tlh3A+H9OW+wpWbCNK+AOuVBUF+74NSrbmbqYg5py/VzMROCJtU84pb0OnBsqnxVvXqwPmodLwYMNFXBg==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/file-transfer/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/file/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/geolocation": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/geolocation/-/geolocation-5.33.1.tgz", + "integrity": "sha512-eQhFxeefK3fjwVyLs94jThc2y9s5qfk7QKX6BGfJTkGf3IOyZyBmFSepHF4kAQ8x1E4pa9KhhH35bZc+5NjkZA==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/geolocation/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/globalization": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/globalization/-/globalization-5.33.1.tgz", + "integrity": "sha512-DNY1UP8VAEIDYeJjz1rvMEJoeO+GvpPwdO/YlODlASVi/H7s7ZwOMO5giFPz49KG6fw1VAvqqyWxHTngm8mG1w==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/globalization/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/image-picker": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/image-picker/-/image-picker-5.33.1.tgz", + "integrity": "sha512-18b5XYf6l0xu0AGGqsib1qgcMkxwssFMK5rz3Ih+DvLH0M9g+gPocofIpSko689KsBmAy/UDxJv8Nr81egPTJQ==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/image-picker/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/in-app-browser": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/in-app-browser/-/in-app-browser-5.33.1.tgz", + "integrity": "sha512-WDy4ogZdPPjM8WoE6cOx+odIMhW9Pupv2eIIW1KdSsNWCwV/WL+oqFquxDvvUoaNGWosyVvziYdPU4dk6pZN/A==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/in-app-browser/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/insomnia": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/insomnia/-/insomnia-5.33.1.tgz", + "integrity": "sha512-6qgNdEg78/k3fHaEdHDxB4ftNBSCRKPjfXiOFlaj2YwODuYCP+AXtSTRxSBNO1lU6Aid/NuPLdTp98lKq4qTVg==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/insomnia/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/keyboard": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/keyboard/-/keyboard-5.33.1.tgz", + "integrity": "sha512-IDNcF2iJ+ze2qPyPgWJ5TkwP5txS6uv9gan8LkxK3zTBKznQvRhznZHbx5fXluehYa1gQZp43BOoXc/PwpT7UA==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/keyboard/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/screen-orientation": { + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/@ionic-native/screen-orientation/-/screen-orientation-5.36.0.tgz", + "integrity": "sha512-+VILGrCJO76Ta6Mudd6IKc66xDek1uw5OEovFWjGCqkg0OYHFIiJFZNx4NLhF5hA1UKN2fWE6qDJaSXR+1w1Rg==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/screen-orientation/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/social-sharing": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/social-sharing/-/social-sharing-5.33.1.tgz", + "integrity": "sha512-tlBNgqESB0dxKoYY61DhTx+4oP25yAGpLynS8JZ3St0vD2VjfQ//2+uVxpo8G3E2A4mEcv7+TWQ1++STphXlRw==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/social-sharing/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/splash-screen": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/splash-screen/-/splash-screen-5.33.1.tgz", + "integrity": "sha512-tSrWkm+hIgc049bRHbUDRIxxNi201LFMxD9CL78h8XzJGb+FJkkxxfA6dsCI60zm2tPOeC42ronBqss99mxeEQ==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/splash-screen/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/status-bar": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/status-bar/-/status-bar-5.33.1.tgz", + "integrity": "sha512-fdmLSsPnZCZERjoxzeRTB1quxf7ntqD6xdt1zB0A9FaZ7zFgEq0+RibasWXqEi/oYzqNgN35rV0FvMyGXPzw3g==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/status-bar/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic-native/three-dee-touch": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@ionic-native/three-dee-touch/-/three-dee-touch-5.33.1.tgz", + "integrity": "sha512-Ujh+kbCebCSIdAOmbEOdBCjVoRryjjYWsC1cG6Wj4j6KVZJcmO9BlENN8qskkWiLKwT2rbXrod0cfgAal8QGXA==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/three-dee-touch/node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@ionic/angular": { + "version": "6.0.14", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.0.14.tgz", + "integrity": "sha512-6x8vFYUjjNJm1dRZvpxAZNaGere4XIs4McAYirn+3DpgBMDUitEbxI1T3pXvFFDCTc+JuoVn7lf1ZgazVUazVA==", + "dependencies": { + "@ionic/core": "^6.0.14", + "jsonc-parser": "^3.0.0", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/core": ">=12.0.0", + "@angular/forms": ">=12.0.0", + "@angular/router": ">=12.0.0", + "rxjs": ">=6.6.0", + "zone.js": ">=0.11.0" + } + }, + "node_modules/@ionic/angular-toolkit": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@ionic/angular-toolkit/-/angular-toolkit-5.0.3.tgz", + "integrity": "sha512-xHVvB0FPkvzQ52B74EN8g0IhMj+rPl7oAMAd89P0ajlV3bvRfFyDimgx7HJDhl99qf9a7EhxjB65Yf6M/b1tnw==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": ">=0.1200.0 <0.1300", + "@angular-devkit/build-angular": "^12.0.0", + "@angular-devkit/core": "^12.1.1", + "@angular-devkit/schematics": "^12.0.0", + "@schematics/angular": "^12.0.0", + "cheerio": "1.0.0-rc.10", + "colorette": "1.1.0", + "copy-webpack-plugin": "^9.0.1", + "tapable": "^2.2.0", + "tslib": "^2.0.3", + "ws": "^7.0.1" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@ampproject/remapping": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.0.1.tgz", + "integrity": "sha512-Ta9bMA3EtUHDaZJXqUoT5cn/EecwOp+SXpKJqxDbDuMbLvEMu6YTyDDuvTWeStODfdmXyfMo7LymQyPkN3BicA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "1.0.0", + "sourcemap-codec": "1.4.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/architect": { + "version": "0.1202.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.14.tgz", + "integrity": "sha512-n+0tDLKtCK9VHZEmwiPixvlwC5JAraFIfT7p/srVGVxzYckixrnBWeqcz5zcUyh2CFBzh+fAKoZlNXlDJ1XKnA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "12.2.14", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/build-angular": { + "version": "12.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.2.14.tgz", + "integrity": "sha512-oN/Rw+hL3T9EuzRauILJLiLgyyxgG4hjSO+W0EO9uYL3Q08+XmcmOKQgm0c3LAJFyk+REeOy6y4Gb3P7ZcfJ0Q==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "1.0.1", + "@angular-devkit/architect": "0.1202.14", + "@angular-devkit/build-optimizer": "0.1202.14", + "@angular-devkit/build-webpack": "0.1202.14", + "@angular-devkit/core": "12.2.14", + "@babel/core": "7.14.8", + "@babel/generator": "7.14.8", + "@babel/helper-annotate-as-pure": "7.14.5", + "@babel/plugin-proposal-async-generator-functions": "7.14.7", + "@babel/plugin-transform-async-to-generator": "7.14.5", + "@babel/plugin-transform-runtime": "7.14.5", + "@babel/preset-env": "7.14.8", + "@babel/runtime": "7.14.8", + "@babel/template": "7.14.5", + "@discoveryjs/json-ext": "0.5.3", + "@jsdevtools/coverage-istanbul-loader": "3.0.5", + "@ngtools/webpack": "12.2.14", + "ansi-colors": "4.1.1", + "babel-loader": "8.2.2", + "browserslist": "^4.9.1", + "cacache": "15.2.0", + "caniuse-lite": "^1.0.30001032", + "circular-dependency-plugin": "5.2.2", + "copy-webpack-plugin": "9.0.1", + "core-js": "3.16.0", + "critters": "0.0.12", + "css-loader": "6.2.0", + "css-minimizer-webpack-plugin": "3.0.2", + "esbuild-wasm": "0.13.8", + "find-cache-dir": "3.3.1", + "glob": "7.1.7", + "https-proxy-agent": "5.0.0", + "inquirer": "8.1.2", + "karma-source-map-support": "1.4.0", + "less": "4.1.1", + "less-loader": "10.0.1", + "license-webpack-plugin": "2.3.20", + "loader-utils": "2.0.0", + "mini-css-extract-plugin": "2.4.2", + "minimatch": "3.0.4", + "open": "8.2.1", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "6.0.1", + "piscina": "3.1.0", + "postcss": "8.3.6", + "postcss-import": "14.0.2", + "postcss-loader": "6.1.1", + "postcss-preset-env": "6.7.0", + "regenerator-runtime": "0.13.9", + "resolve-url-loader": "4.0.0", + "rxjs": "6.6.7", + "sass": "1.36.0", + "sass-loader": "12.1.0", + "semver": "7.3.5", + "source-map-loader": "3.0.0", + "source-map-support": "0.5.19", + "style-loader": "3.2.1", + "stylus": "0.54.8", + "stylus-loader": "6.1.0", + "terser": "5.7.1", + "terser-webpack-plugin": "5.1.4", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.3.0", + "webpack": "5.50.0", + "webpack-dev-middleware": "5.0.0", + "webpack-dev-server": "3.11.2", + "webpack-merge": "5.8.0", + "webpack-subresource-integrity": "1.5.2" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.13.8" + }, + "peerDependencies": { + "@angular/compiler-cli": "^12.0.0", + "@angular/localize": "^12.0.0", + "@angular/service-worker": "^12.0.0", + "karma": "^6.3.0", + "ng-packagr": "^12.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0", + "tslint": "^6.1.0", + "typescript": "~4.2.3 || ~4.3.2" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + }, + "tslint": { + "optional": true + } + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { + "version": "0.1202.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.14.tgz", + "integrity": "sha512-n+0tDLKtCK9VHZEmwiPixvlwC5JAraFIfT7p/srVGVxzYckixrnBWeqcz5zcUyh2CFBzh+fAKoZlNXlDJ1XKnA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "12.2.14", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/build-angular/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/@ionic/angular-toolkit/node_modules/@angular-devkit/build-angular/node_modules/copy-webpack-plugin": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.0.1.tgz", + "integrity": "sha512-14gHKKdYIxF84jCEgPgYXCPpldbwpxxLbCmA7LReY7gvbaT555DgeBWBgBZM116tv/fO6RRJrsivBqRyRlukhw==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.5", + "glob-parent": "^6.0.0", + "globby": "^11.0.3", + "normalize-path": "^3.0.0", + "p-limit": "^3.1.0", + "schema-utils": "^3.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/build-angular/node_modules/esbuild": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.8.tgz", + "integrity": "sha512-A4af7G7YZLfG5OnARJRMtlpEsCkq/zHZQXewgPA864l9D6VjjbH1SuFYK/OSV6BtHwDGkdwyRrX0qQFLnMfUcw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "optionalDependencies": { + "esbuild-android-arm64": "0.13.8", + "esbuild-darwin-64": "0.13.8", + "esbuild-darwin-arm64": "0.13.8", + "esbuild-freebsd-64": "0.13.8", + "esbuild-freebsd-arm64": "0.13.8", + "esbuild-linux-32": "0.13.8", + "esbuild-linux-64": "0.13.8", + "esbuild-linux-arm": "0.13.8", + "esbuild-linux-arm64": "0.13.8", + "esbuild-linux-mips64le": "0.13.8", + "esbuild-linux-ppc64le": "0.13.8", + "esbuild-netbsd-64": "0.13.8", + "esbuild-openbsd-64": "0.13.8", + "esbuild-sunos-64": "0.13.8", + "esbuild-windows-32": "0.13.8", + "esbuild-windows-64": "0.13.8", + "esbuild-windows-arm64": "0.13.8" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/build-angular/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/@ionic/angular-toolkit/node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/build-webpack": { + "version": "0.1202.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1202.14.tgz", + "integrity": "sha512-95pw4tXAaqUZqHS8cMQQbfPyzviPmMyqt4/kywLGmo3Fow8DeHn90SzVmANlDo2DQ1J+LaKeQD2alclbtAQP5A==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1202.14", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^3.1.4" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { + "version": "0.1202.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.14.tgz", + "integrity": "sha512-n+0tDLKtCK9VHZEmwiPixvlwC5JAraFIfT7p/srVGVxzYckixrnBWeqcz5zcUyh2CFBzh+fAKoZlNXlDJ1XKnA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "12.2.14", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/core": { + "version": "12.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.14.tgz", + "integrity": "sha512-C2pVuvZGULzaIu44ixQ4prJIBn/QLY/bjlyProXM8NOw5/92iNuGus11qZ4+xeiQgzfZxXN1eYyL2Mpo7PG5ug==", + "dev": true, + "dependencies": { + "ajv": "8.6.2", + "ajv-formats": "2.1.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/schematics": { + "version": "12.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.14.tgz", + "integrity": "sha512-QS2IdV3c51CFpHlj1x7xEOQuoYJS2W1bDYLbZUcgfp7u/6M8pA1gz96F0zy4dO5775+MSakpl9314H9956irKw==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "12.2.14", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/core": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.8.tgz", + "integrity": "sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.8", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.8", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.14.8", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/core/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/@ionic/angular-toolkit/node_modules/@babel/generator": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", + "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.8", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/generator/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/@ionic/angular-toolkit/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", + "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz", + "integrity": "sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/helper-module-transforms": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", + "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/helper-module-transforms/node_modules/@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/helpers": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.5.tgz", + "integrity": "sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/helpers/node_modules/@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", + "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/plugin-transform-runtime": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz", + "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/preset-env": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.8.tgz", + "integrity": "sha512-a9aOppDU93oArQ51H+B8M1vH+tayZbuBqzjOhntGetZVa+4tTu5jp+XTwqHGG2lxslqomPYVSjIxQkFwXzgnxg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.7", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.8", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.15.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/runtime": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", + "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@discoveryjs/json-ext": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz", + "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@ngtools/webpack": { + "version": "12.2.14", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.14.tgz", + "integrity": "sha512-dla6JgLWKAo7k4K3O+ouo104wO3BFs+MIOCXoGF4Lp/1pKPSt0orYmvZFBkDZPmyBFYRw9wpL2WHnAAyip40Cw==", + "dev": true, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^12.0.0", + "typescript": "~4.2.3 || ~4.3.2", + "webpack": "^5.30.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/babel-loader/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/@ionic/angular-toolkit/node_modules/babel-loader/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/@ionic/angular-toolkit/node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz", + "integrity": "sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.4", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", + "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz", + "integrity": "sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/colorette": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.1.0.tgz", + "integrity": "sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==", + "dev": true + }, + "node_modules/@ionic/angular-toolkit/node_modules/copy-webpack-plugin": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", + "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^11.0.3", + "normalize-path": "^3.0.0", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/copy-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/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/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/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/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/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/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/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/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/@ionic/angular-toolkit/node_modules/core-js": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.0.tgz", + "integrity": "sha512-5+5VxRFmSf97nM8Jr2wzOwLqRo6zphH2aX+7KsAUONObyzakDNq2G/bgbhinxB4PoV9L3aXQYhiDKyIKWd2c8g==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/critters": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.12.tgz", + "integrity": "sha512-ujxKtKc/mWpjrOKeaACTaQ1aP0O31M0ZPWhfl85jZF1smPU4Ivb9va5Ox2poif4zVJQQo0LCFlzGtEZAsCAPcw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "css-select": "^4.1.3", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", + "pretty-bytes": "^5.3.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/critters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@ionic/angular-toolkit/node_modules/critters/node_modules/postcss": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", + "dev": true, + "dependencies": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/css-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.2.0.tgz", + "integrity": "sha512-/rvHfYRjIpymZblf49w8jYcRo2y9gj6rV8UroHGmBxKrIyGLokpycyKzp9OkitvqT29ZSpzJ0Ic7SpnJX3sC8g==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/del/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/del/node_modules/globby/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/@ionic/angular-toolkit/node_modules/es-module-lexer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", + "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", + "dev": true + }, + "node_modules/@ionic/angular-toolkit/node_modules/esbuild-android-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.8.tgz", + "integrity": "sha512-AilbChndywpk7CdKkNSZ9klxl+9MboLctXd9LwLo3b0dawmOF/i/t2U5d8LM6SbT1Xw36F8yngSUPrd8yPs2RA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@ionic/angular-toolkit/node_modules/esbuild-darwin-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.8.tgz", + "integrity": "sha512-b6sdiT84zV5LVaoF+UoMVGJzR/iE2vNUfUDfFQGrm4LBwM/PWXweKpuu6RD9mcyCq18cLxkP6w/LD/w9DtX3ng==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@ionic/angular-toolkit/node_modules/esbuild-darwin-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.8.tgz", + "integrity": "sha512-R8YuPiiJayuJJRUBG4H0VwkEKo6AvhJs2m7Tl0JaIer3u1FHHXwGhMxjJDmK+kXwTFPriSysPvcobXC/UrrZCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@ionic/angular-toolkit/node_modules/esbuild-freebsd-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.8.tgz", + "integrity": "sha512-zBn6urrn8FnKC+YSgDxdof9jhPCeU8kR/qaamlV4gI8R3KUaUK162WYM7UyFVAlj9N0MyD3AtB+hltzu4cysTw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@ionic/angular-toolkit/node_modules/esbuild-freebsd-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.8.tgz", + "integrity": "sha512-pWW2slN7lGlkx0MOEBoUGwRX5UgSCLq3dy2c8RIOpiHtA87xAUpDBvZK10MykbT+aMfXc0NI2lu1X+6kI34xng==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@ionic/angular-toolkit/node_modules/esbuild-linux-32": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.8.tgz", + "integrity": "sha512-T0I0ueeKVO/Is0CAeSEOG9s2jeNNb8jrrMwG9QBIm3UU18MRB60ERgkS2uV3fZ1vP2F8i3Z2e3Zju4lg9dhVmw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ionic/angular-toolkit/node_modules/esbuild-linux-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.8.tgz", + "integrity": "sha512-Bm8SYmFtvfDCIu9sjKppFXzRXn2BVpuCinU1ChTuMtdKI/7aPpXIrkqBNOgPTOQO9AylJJc1Zw6EvtKORhn64w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ionic/angular-toolkit/node_modules/esbuild-linux-arm": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.8.tgz", + "integrity": "sha512-4/HfcC40LJ4GPyboHA+db0jpFarTB628D1ifU+/5bunIgY+t6mHkJWyxWxAAE8wl/ZIuRYB9RJFdYpu1AXGPdg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ionic/angular-toolkit/node_modules/esbuild-linux-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.8.tgz", + "integrity": "sha512-X4pWZ+SL+FJ09chWFgRNO3F+YtvAQRcWh0uxKqZSWKiWodAB20flsW/OWFYLXBKiVCTeoGMvENZS/GeVac7+tQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ionic/angular-toolkit/node_modules/esbuild-linux-mips64le": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.8.tgz", + "integrity": "sha512-o7e0D+sqHKT31v+mwFircJFjwSKVd2nbkHEn4l9xQ1hLR+Bv8rnt3HqlblY3+sBdlrOTGSwz0ReROlKUMJyldA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ionic/angular-toolkit/node_modules/esbuild-linux-ppc64le": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.8.tgz", + "integrity": "sha512-eZSQ0ERsWkukJp2px/UWJHVNuy0lMoz/HZcRWAbB6reoaBw7S9vMzYNUnflfL3XA6WDs+dZn3ekHE4Y2uWLGig==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ionic/angular-toolkit/node_modules/esbuild-netbsd-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.8.tgz", + "integrity": "sha512-gZX4kP7gVvOrvX0ZwgHmbuHczQUwqYppxqtoyC7VNd80t5nBHOFXVhWo2Ad/Lms0E8b+wwgI/WjZFTCpUHOg9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ] + }, + "node_modules/@ionic/angular-toolkit/node_modules/esbuild-openbsd-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.8.tgz", + "integrity": "sha512-afzza308X4WmcebexbTzAgfEWt9MUkdTvwIa8xOu4CM2qGbl2LanqEl8/LUs8jh6Gqw6WsicEK52GPrS9wvkcw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@ionic/angular-toolkit/node_modules/esbuild-sunos-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.8.tgz", + "integrity": "sha512-mWPZibmBbuMKD+LDN23LGcOZ2EawMYBONMXXHmbuxeT0XxCNwadbCVwUQ/2p5Dp5Kvf6mhrlIffcnWOiCBpiVw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ] + }, + "node_modules/@ionic/angular-toolkit/node_modules/esbuild-wasm": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.13.8.tgz", + "integrity": "sha512-UbD+3nloiSpJWXTCInZQrqPe8Y+RLfDkY/5kEHiXsw/lmaEvibe69qTzQu16m5R9je/0bF7VYQ5jaEOq0z9lLA==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/esbuild-windows-32": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.8.tgz", + "integrity": "sha512-QsZ1HnWIcnIEApETZWw8HlOhDSWqdZX2SylU7IzGxOYyVcX7QI06ety/aDcn437mwyO7Ph4RrbhB+2ntM8kX8A==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@ionic/angular-toolkit/node_modules/esbuild-windows-64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.8.tgz", + "integrity": "sha512-76Fb57B9eE/JmJi1QmUW0tRLQZfGo0it+JeYoCDTSlbTn7LV44ecOHIMJSSgZADUtRMWT9z0Kz186bnaB3amSg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@ionic/angular-toolkit/node_modules/esbuild-windows-arm64": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.8.tgz", + "integrity": "sha512-HW6Mtq5eTudllxY2YgT62MrVcn7oq2o8TAoAvDUhyiEmRmDY8tPwAhb1vxw5/cdkbukM3KdMYtksnUhF/ekWeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@ionic/angular-toolkit/node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/@ionic/angular-toolkit/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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/@ionic/angular-toolkit/node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "node_modules/@ionic/angular-toolkit/node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/inquirer": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.2.tgz", + "integrity": "sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.3.0", + "run-async": "^2.4.0", + "rxjs": "^7.2.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/inquirer/node_modules/rxjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "dev": true, + "dependencies": { + "tslib": "~2.1.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/inquirer/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "node_modules/@ionic/angular-toolkit/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@ionic/angular-toolkit/node_modules/less": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.1.tgz", + "integrity": "sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^1.10.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^2.5.2", + "source-map": "~0.6.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/less-loader": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.0.1.tgz", + "integrity": "sha512-Crln//HpW9M5CbtdfWm3IO66Cvx1WhZQvNybXgfB2dD/6Sav9ppw+IWqs/FQKPBFO4B6X0X28Z0WNznshgwUzA==", + "dev": true, + "dependencies": { + "klona": "^2.0.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/less/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/less/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@ionic/angular-toolkit/node_modules/license-webpack-plugin": { + "version": "2.3.20", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.20.tgz", + "integrity": "sha512-AHVueg9clOKACSHkhmEI+PCC9x8+qsQVuKECZD3ETxETK5h/PCv5/MUzyG1gm8OMcip/s1tcNxqo9Qb7WhjGsg==", + "dev": true, + "dependencies": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/mini-css-extract-plugin": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.2.tgz", + "integrity": "sha512-ZmqShkn79D36uerdED+9qdo1ZYG8C1YsWvXu0UMJxurZnSdgz7gQKO2EGv8T55MhDqG3DYmGtizZNpM/UbTlcA==", + "dev": true, + "dependencies": { + "schema-utils": "^3.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/mini-css-extract-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/@ionic/angular-toolkit/node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@ionic/angular-toolkit/node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/nanoid": { + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/postcss": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", + "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==", + "dev": true, + "dependencies": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/postcss-loader": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.1.1.tgz", + "integrity": "sha512-lBmJMvRh1D40dqpWKr9Rpygwxn8M74U9uaCSeYGNKLGInbk9mXBt1ultHf2dH9Ghk6Ue4UXlXWwGMH9QdUJ5ug==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/postcss/node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, + "node_modules/@ionic/angular-toolkit/node_modules/postcss/node_modules/source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@ionic/angular-toolkit/node_modules/sass": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.36.0.tgz", + "integrity": "sha512-fQzEjipfOv5kh930nu3Imzq3ie/sGDc/4KtQMJlt7RRdrkQSfe37Bwi/Rf/gfuYHsIuE1fIlDMvpyMcEwjnPvg==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/sass-loader": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.1.0.tgz", + "integrity": "sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg==", + "dev": true, + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0", + "sass": "^1.3.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/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/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/@ionic/angular-toolkit/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/stylus": { + "version": "0.54.8", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", + "dev": true, + "dependencies": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/stylus-loader": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.1.0.tgz", + "integrity": "sha512-qKO34QCsOtSJrXxQQmXsPeaVHh6hMumBAFIoJTcsSr2VzrA6o/CW9HCGR8spCjzJhN8oKQHdj/Ytx0wwXyElkw==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.5", + "klona": "^2.0.4", + "normalize-path": "^3.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "stylus": ">=0.52.4", + "webpack": "^5.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/stylus/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/stylus/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/@ionic/angular-toolkit/node_modules/stylus/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/terser": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.1.tgz", + "integrity": "sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg==", + "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/@ionic/angular-toolkit/node_modules/terser-webpack-plugin": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz", + "integrity": "sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA==", + "dev": true, + "dependencies": { + "jest-worker": "^27.0.2", + "p-limit": "^3.1.0", + "schema-utils": "^3.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@ionic/angular-toolkit/node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.50.0.tgz", + "integrity": "sha512-hqxI7t/KVygs0WRv/kTgUW8Kl3YC81uyWQSo/7WUs5LsuRw0htH/fCwbVBGCuiX/t4s7qzjXFcf41O8Reiypag==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.8.0", + "es-module-lexer": "^0.7.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.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.2.0", + "webpack-sources": "^3.2.0" + }, + "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/@ionic/angular-toolkit/node_modules/webpack-dev-middleware": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz", + "integrity": "sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw==", + "dev": true, + "dependencies": { + "colorette": "^1.2.2", + "mem": "^8.1.1", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/webpack-dev-middleware/node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-middleware/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/@ionic/angular-toolkit/node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "dev": true, + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/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/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/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/@ionic/angular-toolkit/node_modules/webpack-dev-server/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/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/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/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/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/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/webpack/node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack/node_modules/webpack-sources": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz", + "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/ws": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", + "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@ionic/cli": { + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@ionic/cli/-/cli-6.18.1.tgz", + "integrity": "sha512-EIV4zln0xpI2O4kADXZCBkLsX/NIkbqjTAJOlsH7BrsPLo20e3LULQiX9rxiX20YK7ssz/0Sae1s70XTsHnTaQ==", + "dependencies": { + "@ionic/cli-framework": "5.1.0", + "@ionic/cli-framework-output": "2.2.2", + "@ionic/cli-framework-prompts": "2.1.8", + "@ionic/utils-array": "2.1.5", + "@ionic/utils-fs": "3.1.5", + "@ionic/utils-network": "2.1.5", + "@ionic/utils-process": "2.1.8", + "@ionic/utils-stream": "3.1.5", + "@ionic/utils-subprocess": "2.1.8", + "@ionic/utils-terminal": "2.3.1", + "chalk": "^4.0.0", + "debug": "^4.0.0", + "diff": "^4.0.1", + "elementtree": "^0.1.7", + "leek": "0.0.24", + "lodash": "^4.17.5", + "open": "^7.0.4", + "os-name": "^4.0.0", + "semver": "^7.1.1", + "split2": "^3.0.0", + "ssh-config": "^1.1.1", + "stream-combiner2": "^1.1.1", + "superagent": "^5.2.1", + "superagent-proxy": "^3.0.0", + "tar": "^6.0.1", + "tslib": "^2.0.1" + }, + "bin": { + "ionic": "bin/ionic" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/cli-framework": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework/-/cli-framework-5.1.0.tgz", + "integrity": "sha512-Hb/P2zuHB3zQZN0qG7Lxda8IlP2mHisfb0KR+wc9cw2BSiH+rtXRd/A4JxndPznjWs00PHbWiEm0Ehas2pA/nw==", + "dependencies": { + "@ionic/cli-framework-output": "2.2.2", + "@ionic/utils-array": "2.1.5", + "@ionic/utils-fs": "3.1.5", + "@ionic/utils-object": "2.1.5", + "@ionic/utils-process": "2.1.8", + "@ionic/utils-stream": "3.1.5", + "@ionic/utils-subprocess": "2.1.8", + "@ionic/utils-terminal": "2.3.1", + "chalk": "^4.0.0", + "debug": "^4.0.0", + "lodash": "^4.17.5", + "minimist": "^1.2.0", + "rimraf": "^3.0.0", + "tslib": "^2.0.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/cli-framework-output": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.2.tgz", + "integrity": "sha512-eQYkqIW1/tCwSC6Bd0gjse96U11lDX/ikf3jvsjX7a8z/zwSmGzCHRizb7xogV65Ey+1/zyAZR71cpDRQuFLBQ==", + "dependencies": { + "@ionic/utils-terminal": "2.3.1", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/cli-framework-output/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/cli-framework-output/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@ionic/cli-framework-prompts": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-prompts/-/cli-framework-prompts-2.1.8.tgz", + "integrity": "sha512-DjO4lQsmvficsZbPmpGqSSx+F1BfgSTQBwRqL5bl9Dkh9rIZ/ckcJcKqCciVOw9kIY7WTeNFOTwj2vWrkFn7+Q==", + "dependencies": { + "@ionic/utils-terminal": "2.3.1", + "debug": "^4.0.0", + "inquirer": "^7.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@ionic/cli-framework/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@ionic/cli-framework/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@ionic/cli-framework/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/cli-framework/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/cli-framework/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@ionic/cli-framework/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@ionic/cli-framework/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@ionic/cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@ionic/cli/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/cli/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@ionic/cli/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ionic/cli/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@ionic/cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/core": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.0.16.tgz", + "integrity": "sha512-rY9FTKupu6FAeTpbdkaMCPEeV/2ZPCviWSzi6X5RX1OiUP4EdNKj39KvUI++TPA2g8gYmmGsWR0BY3u8j7U/hA==", + "dependencies": { + "@stencil/core": "^2.14.2", + "ionicons": "^6.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@ionic/storage": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@ionic/storage/-/storage-2.3.1.tgz", + "integrity": "sha512-IdYKr6xRatumkhceVbjmySCrA20KKcojQN0MyS857D4OgvcDtQhG9mvTXtfX/tU2hxaFlN6WkUaQOy3oPFcJvA==", + "dependencies": { + "localforage": "1.7.1", + "localforage-cordovasqlitedriver": "1.7.0", + "tslib": "^1.10.0" + }, + "peerDependencies": { + "@angular/core": "*", + "rxjs": "*" + } + }, + "node_modules/@ionic/storage/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@ionic/utils-array": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.5.tgz", + "integrity": "sha512-HD72a71IQVBmQckDwmA8RxNVMTbxnaLbgFOl+dO5tbvW9CkkSFCv41h6fUuNsSEVgngfkn0i98HDuZC8mk+lTA==", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-array/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/utils-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@ionic/utils-fs": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.5.tgz", + "integrity": "sha512-a41bY2dHqWSEQQ/80CpbXSs8McyiCFf2DnIWWLukrhYWf46h4qi6M/8dxcMKrofRiqI/3F+cL3S2mOm9Zz/o2Q==", + "dependencies": { + "debug": "^4.0.0", + "fs-extra": "^9.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-fs/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/utils-fs/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@ionic/utils-fs/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@ionic/utils-fs/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@ionic/utils-fs/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@ionic/utils-network": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-network/-/utils-network-2.1.5.tgz", + "integrity": "sha512-HUQ1Ec4Mh2MXzzKdbbbDS6xYKwpFJ2XRY7SYXbaZT8+jiNahfHbsOfe62/p8bk41Yil7E9EagzGC2JvIFJh01w==", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-network/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/utils-network/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@ionic/utils-object": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.5.tgz", + "integrity": "sha512-XnYNSwfewUqxq+yjER1hxTKggftpNjFLJH0s37jcrNDwbzmbpFTQTVAp4ikNK4rd9DOebX/jbeZb8jfD86IYxw==", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-object/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/utils-object/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@ionic/utils-process": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.8.tgz", + "integrity": "sha512-VBBoyTzi+m6tgKAItl+jiTQneGwTOsctcrTG4CsEgmVOVOEhUYkPhddXqzD+oC54hPDU9ROsd3I014P5CWEuhQ==", + "dependencies": { + "@ionic/utils-object": "2.1.5", + "@ionic/utils-terminal": "2.3.1", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "tree-kill": "^1.2.2", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-process/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/utils-process/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@ionic/utils-process/node_modules/signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" + }, + "node_modules/@ionic/utils-stream": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.5.tgz", + "integrity": "sha512-hkm46uHvEC05X/8PHgdJi4l4zv9VQDELZTM+Kz69odtO9zZYfnt8DkfXHJqJ+PxmtiE5mk/ehJWLnn/XAczTUw==", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-stream/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/utils-stream/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@ionic/utils-subprocess": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.8.tgz", + "integrity": "sha512-pkmtf1LtXcEMPn6/cctREL2aZtZoy0+0Sl+nT0NIkOHIoBUcqrcfMWdctCSM4Mp6+2/hLWtgpHE3TOIibkWfIg==", + "dependencies": { + "@ionic/utils-array": "2.1.5", + "@ionic/utils-fs": "3.1.5", + "@ionic/utils-process": "2.1.8", + "@ionic/utils-stream": "3.1.5", + "@ionic/utils-terminal": "2.3.1", + "cross-spawn": "^7.0.0", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/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==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@ionic/utils-subprocess/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/utils-subprocess/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==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/utils-subprocess/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@ionic/utils-terminal": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.1.tgz", + "integrity": "sha512-cglsSd2AckI3Ldtdfczeq64vIIDjtPspV5QJtky8f8uIdxkeOIGeRV7bCj1+BEf1hyo+ZuggQxLviHnbMZhiRw==", + "dependencies": { + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-terminal/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/utils-terminal/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@ionic/utils-terminal/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/utils-terminal/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@ionic/utils-terminal/node_modules/signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" + }, + "node_modules/@ionic/utils-terminal/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/utils-terminal/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-1.0.0.tgz", + "integrity": "sha512-9oLAnygRMi8Q5QkYEU4XWK04B+nuoXoxjRvRxgjuChkLZFBja0YPSgdZ7dZtwhncLBcQe/I/E+fLuk5qxcYVJA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jsdevtools/coverage-istanbul-loader": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", + "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==", + "dev": true, + "dependencies": { + "convert-source-map": "^1.7.0", + "istanbul-lib-instrument": "^4.0.3", + "loader-utils": "^2.0.0", + "merge-source-map": "^1.1.0", + "schema-utils": "^2.7.0" + } + }, + "node_modules/@jsdevtools/coverage-istanbul-loader/node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jsdevtools/coverage-istanbul-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/@jsdevtools/coverage-istanbul-loader/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@netflix/nerror": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@netflix/nerror/-/nerror-1.1.3.tgz", + "integrity": "sha512-b+MGNyP9/LXkapreJzNUzcvuzZslj/RGgdVVJ16P2wSlYatfLycPObImqVJSmNAdyeShvNeM/pl3sVZsObFueg==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "extsprintf": "^1.4.0", + "lodash": "^4.17.15" + } + }, + "node_modules/@netflix/nerror/node_modules/extsprintf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz", + "integrity": "sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/@ngtools/webpack": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.1.1.tgz", + "integrity": "sha512-TGCuscGFNHPoXScswuj9UxNv8E+A/PXs5XH8cyTtbkmlpBec1EShnaUTdDP5nhykjjaWzd3TLChlp9DinE+Ctg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^13.0.0 || ^13.1.0-next", + "typescript": ">=4.4.3 <4.6", + "webpack": "^5.30.0" + } + }, + "node_modules/@ngx-translate/core": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-11.0.1.tgz", + "integrity": "sha512-nBCa1ZD9fAUY/3eskP3Lql2fNg8OMrYIej1/5GRsfcutx9tG/5fZLCv9m6UCw1aS+u4uK/vXjv1ctG/FdMvaWg==", + "dependencies": { + "tslib": "^1.9.0" + }, + "peerDependencies": { + "@angular/core": ">=7.0.0", + "rxjs": ">=6.3.0" + } + }, + "node_modules/@ngx-translate/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@ngx-translate/http-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-4.0.0.tgz", + "integrity": "sha512-x8LumqydWD7eX9yQTAVeoCM9gFUIGVTUjZqbxdAUavAA3qVnk9wCQux7iHLPXpydl8vyQmLoPQR+fFU+DUDOMA==", + "dependencies": { + "tslib": "^1.9.0" + }, + "peerDependencies": { + "@angular/common": ">=7.0.0", + "@ngx-translate/core": ">=11.0.0", + "rxjs": ">=6.3.0" + } + }, + "node_modules/@ngx-translate/http-loader/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.0.tgz", + "integrity": "sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA==", + "deprecated": "this version had an improper engines field added, update to 1.1.1", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", + "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^1.3.2", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^6.1.1", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + } + }, + "node_modules/@npmcli/git/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git/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/@npmcli/installed-package-contents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "dev": true, + "dependencies": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "installed-package-contents": "index.js" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", + "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", + "dev": true + }, + "node_modules/@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", + "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "dev": true, + "dependencies": { + "infer-owner": "^1.0.4" + } + }, + "node_modules/@npmcli/run-script": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-2.0.0.tgz", + "integrity": "sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^1.0.2", + "@npmcli/promise-spawn": "^1.3.2", + "node-gyp": "^8.2.0", + "read-package-json-fast": "^2.0.1" + } + }, + "node_modules/@schematics/angular": { + "version": "12.2.14", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.14.tgz", + "integrity": "sha512-TpcVNTKoo44eat4lpIfl7jyd/eBuvVgI8bBIGh621QWYfkfRZFuXF6QSB4hh44aoX8lqxxRNlmIsp/P4goiMFg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "12.2.14", + "@angular-devkit/schematics": "12.2.14", + "jsonc-parser": "3.0.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { + "version": "12.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.14.tgz", + "integrity": "sha512-C2pVuvZGULzaIu44ixQ4prJIBn/QLY/bjlyProXM8NOw5/92iNuGus11qZ4+xeiQgzfZxXN1eYyL2Mpo7PG5ug==", + "dev": true, + "dependencies": { + "ajv": "8.6.2", + "ajv-formats": "2.1.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@schematics/angular/node_modules/@angular-devkit/schematics": { + "version": "12.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.14.tgz", + "integrity": "sha512-QS2IdV3c51CFpHlj1x7xEOQuoYJS2W1bDYLbZUcgfp7u/6M8pA1gz96F0zy4dO5775+MSakpl9314H9956irKw==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "12.2.14", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@schematics/angular/node_modules/ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@schematics/angular/node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/@schematics/angular/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@schematics/angular/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/@schematics/angular/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@stencil/core": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.15.0.tgz", + "integrity": "sha512-58+FPFpJCJScd5nmqVsZN+qk7aui57wFcMHWzySr1SQzoY8Efst9OPG7XRf27UsNj1DNeEdYWTtdrTfJyn3mZg==", + "bin": { + "stencil": "bin/stencil" + }, + "engines": { + "node": ">=12.10.0", + "npm": ">=6.0.0" + } + }, + "node_modules/@stylelint/postcss-css-in-js": { + "version": "0.37.2", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz", + "integrity": "sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==", + "dev": true, + "dependencies": { + "@babel/core": ">=7.9.0" + }, + "peerDependencies": { + "postcss": ">=7.0.0", + "postcss-syntax": ">=0.36.2" + } + }, + "node_modules/@stylelint/postcss-markdown": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz", + "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==", + "deprecated": "Use the original unforked package instead: postcss-markdown", + "dev": true, + "dependencies": { + "remark": "^13.0.0", + "unist-util-find-all-after": "^3.0.2" + }, + "peerDependencies": { + "postcss": ">=7.0.0", + "postcss-syntax": ">=0.36.2" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "node_modules/@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", + "dev": true + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@types/cordova-plugin-ble-central": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/cordova-plugin-ble-central/-/cordova-plugin-ble-central-1.3.1.tgz", + "integrity": "sha512-zhn/2hVV/LIOyQr0sUptafphRCO3QxMpp3A1vKmRmJCyPbzC+9GLZvAFJ0/MUkgPf63dySTBL7c/MldMEnF+hw==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "node_modules/@types/eslint": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.1.tgz", + "integrity": "sha512-UP9rzNn/XyGwb5RQ2fok+DzcIRIYwc16qTXse5+Smsy8MOIccCChT15KAwnsgQx4PzJkaMq4myFyZ4CL5TjhIQ==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/http-proxy": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", + "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/jasmine": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.6.tgz", + "integrity": "sha512-kgl+oYOLCBt41iba8cetp+QPOqDAaTJnHtVPCE7JzYmda4juglRBLX35opVcANc7TLA/Lp0DEnajbUNnyxGC+Q==", + "dev": true + }, + "node_modules/@types/jasminewd2": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", + "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", + "dev": true, + "dependencies": { + "@types/jasmine": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.14.178", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", + "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", + "dev": true + }, + "node_modules/@types/mdast": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", + "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", + "dev": true + }, + "node_modules/@types/node": { + "version": "12.20.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.5.tgz", + "integrity": "sha512-5Oy7tYZnu3a4pnJ//d4yVvOImExl4Vtwf0D40iKUlU+XlUsyV9iyFWyCFlwy489b72FMAik/EFwRkNLjjOdSPg==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", + "dev": true + }, + "node_modules/@types/selenium-webdriver": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", + "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", + "dev": true + }, + "node_modules/@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "node_modules/@types/unist": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", + "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==", + "dev": true + }, + "node_modules/@types/webpack-sources": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.9.tgz", + "integrity": "sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + } + }, + "node_modules/@types/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/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@wisdomgarden/cordova-plugin-filepath": { + "version": "1.6.0-4", + "resolved": "git+ssh://git@github.com/wisdom-garden/cordova-plugin-filepath.git#50d756e125eb4c95a357bd11137b3eafbee199b0", + "integrity": "sha512-b9Op8wYpLnGddOMLAbChRlJYM7jz9AWEbWy8CWxIeIOgJflydZSIzsjBbqe9TQGTq+v9UoUOJsEP/jx5tmQvQg==", + "dev": true, + "license": "Apache 2.0" + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "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": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/adler-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz", + "integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=", + "dependencies": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + }, + "bin": { + "adler32": "bin/adler32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "dev": true, + "engines": { + "node": ">=0.3.0" + } + }, + "node_modules/ag-virtual-scroll": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ag-virtual-scroll/-/ag-virtual-scroll-1.3.0.tgz", + "integrity": "sha512-xaydiezPggIH+ukZ6mXGhPsQuDQkTQdQrPekfuSI+iE2Yst/mlk+2FvzsgyS2StWGSYgHm+SyRYZrNi7zVRY4A==", + "peerDependencies": { + "@angular/animations": "^9.0.4", + "@angular/common": "^9.0.4", + "@angular/compiler": "^9.0.4", + "@angular/core": "^9.0.4" + } + }, + "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/agentkeepalive": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.4.tgz", + "integrity": "sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/agentkeepalive/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agentkeepalive/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/aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "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/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", + "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/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/ajv/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/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "node_modules/android-versions": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-1.7.0.tgz", + "integrity": "sha512-TCy4b8Dk8YS6A23ZPfhSKqK66JHFq0D8avGYiwvYpjno6HrrcI0DRgHx9+jtkvWYmrsE2vQWgbHJhvGGhhOb0g==", + "dev": true, + "dependencies": { + "semver": "^5.7.1" + } + }, + "node_modules/android-versions/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/ansi": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=", + "dev": true + }, + "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/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==", + "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==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/ansi-styles/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/ansi-styles/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/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/arg": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.1.tgz", + "integrity": "sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw==", + "dev": true + }, + "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/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "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/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dev": true, + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/autoprefixer/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/autoprefixer/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/autoprefixer/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/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", + "dev": true + }, + "node_modules/babel-loader": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", + "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/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/babel-loader/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/babel-loader/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.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/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", + "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.0", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", + "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.0", + "core-js-compat": "^3.18.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz", + "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz", + "integrity": "sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/big-integer": { + "version": "1.6.45", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.45.tgz", + "integrity": "sha512-nmb9E7oEtVJ7SmSCH/DeJobXyuRmaofkpoQSimMFu3HKJ5MADtM825SPLhDuWhZ6TElLAQtgJbQmBZuHIRlZoA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "blocking-proxy": "built/lib/bin.js" + }, + "engines": { + "node": ">=6.9.x" + } + }, + "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/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/body-parser/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/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "node_modules/bplist-creator": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.7.tgz", + "integrity": "sha1-N98VNgkoJLh8QvlXsBNEEXNyrkU=", + "dependencies": { + "stream-buffers": "~2.2.0" + } + }, + "node_modules/bplist-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz", + "integrity": "sha1-1g1dzCDLptx+HymbNdPh+V2vuuY=", + "dependencies": { + "big-integer": "^1.6.7" + } + }, + "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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + }, + "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.30001286", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz", + "integrity": "sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/browserslist/node_modules/electron-to-chromium": { + "version": "1.4.17", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.17.tgz", + "integrity": "sha512-zhk1MravPtq/KBhmGB7TLBILmXTgRG9TFSI3qS3DbgyfHzIl72iiTE37r/BHIbPCJJlWIo5rySyxiH4vWhu2ZA==", + "dev": true + }, + "node_modules/browserslist/node_modules/node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "node_modules/browserstack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.0.tgz", + "integrity": "sha512-HJDJ0TSlmkwnt9RZ+v5gFpa1XZTBYTj0ywvLwJ3241J7vMw2jAsGNVhKHtmCOyg+VxeLZyaibO9UL71AsUeDIw==", + "dev": true, + "dependencies": { + "https-proxy-agent": "^2.2.1" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.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/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", + "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", + "dev": true, + "dependencies": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001286", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz", + "integrity": "sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/cfb": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.1.tgz", + "integrity": "sha512-wT2ScPAFGSVy7CY+aauMezZBnNrfnaLSrxHUHdea+Td/86vrk6ZquggV+ssBR88zNs0OnBkL2+lf9q0K+zVGzQ==", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0", + "printj": "~1.3.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cfb/node_modules/adler-32": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.0.tgz", + "integrity": "sha512-f5nltvjl+PRUh6YNfUstRaXwJxtfnKEWhAWWlmKvh+Y3J2+98a0KKVYDEhz6NdKGqswLhjNGznxfSsZGOvOd9g==", + "dependencies": { + "printj": "~1.2.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cfb/node_modules/adler-32/node_modules/printj": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.2.3.tgz", + "integrity": "sha512-sanczS6xOJOg7IKDvi4sGOUOe7c1tsEzjwlLFH/zgwx/uyImVM9/rgBkc8AfiQa/Vg54nRd8mkm9yI7WV/O+WA==", + "bin": { + "printj": "bin/printj.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cfb/node_modules/printj": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.3.0.tgz", + "integrity": "sha512-017o8YIaz8gLhaNxRB9eBv2mWXI2CtzhPJALnQTP+OPpuUfP0RMWqr/mHCzqVeu1AQxfzSfAtAq66vKB8y7Lzg==", + "bin": { + "printj": "bin/printj.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "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/chalk/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/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/chart.js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.6.0.tgz", + "integrity": "sha512-iOzzDKePL+bj+ccIsVAgWQehCXv8xOKGbaU2fO/myivH736zcx535PGJzQGanvcSGVOqX6yuLZsN3ygcQ35UgQ==" + }, + "node_modules/chartjs-adapter-luxon": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/chartjs-adapter-luxon/-/chartjs-adapter-luxon-1.1.0.tgz", + "integrity": "sha512-CS+xBWEyXYVLBZ3dSY/MwlSXhz8er4JjkApazY84ft/++oOLsmkt6TaXBCsUFudum7QdoYmpxiL/gSp20+emkw==", + "peerDependencies": { + "chart.js": "^3.0.0", + "luxon": "^1.0.0 || ^2.0.0" + } + }, + "node_modules/chartjs-plugin-annotation": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/chartjs-plugin-annotation/-/chartjs-plugin-annotation-1.3.0.tgz", + "integrity": "sha512-TF2Y+ZYnz5TdSmyU1WIeWqXXcIS+3GfWkJOrdovd/JgdLzKxw7/paj01FVeAtTzfRPdc6dy/zQERoBdYSstYsw==", + "peerDependencies": { + "chart.js": "^3.1.0" + } + }, + "node_modules/chartjs-plugin-streaming": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chartjs-plugin-streaming/-/chartjs-plugin-streaming-2.0.0.tgz", + "integrity": "sha512-oBwHRmovGbPDS1h8PhpttnlKjI6eiJO13v4h+xz+mfbHhIc+iNF9xuMobCIFMKFH7rlVWi5TJAOIxoXyGElYYg==", + "peerDependencies": { + "chart.js": "^3.0.0" + } + }, + "node_modules/chartjs-plugin-zoom": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/chartjs-plugin-zoom/-/chartjs-plugin-zoom-1.2.0.tgz", + "integrity": "sha512-cLYKUHHx4bevuZQDpEKdjpvZ6HGu6NF8laTThgA0I9af+PV1N4qVTRZmyDNh0SAzsHZPtDOhuO3I7B4CF1lstw==", + "dependencies": { + "hammerjs": "^2.0.8" + }, + "peerDependencies": { + "chart.js": "^3.2.0" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "dev": true, + "dependencies": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", + "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "css-what": "^5.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0", + "domutils": "^2.7.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio-select/node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/cheerio-select/node_modules/domhandler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/cheerio/node_modules/domhandler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/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/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/circular-dependency-plugin": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", + "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "webpack": ">=4.0.1" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "engines": { + "node": ">= 10" + } + }, + "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/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/cliui/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/cliui/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/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/cliui/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/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-regexp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", + "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==", + "dev": true, + "dependencies": { + "is-regexp": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colord": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.1.tgz", + "integrity": "sha512-4LBMSt09vR0uLnPVkOUBnmxgoaeN4ewRbx801wY/bXcltXfpR/G46OdWn96XpYmCWuYvO46aBZP4NgX8HpNAcw==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "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/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/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/cookiejar": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" + }, + "node_modules/copy-anything": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz", + "integrity": "sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ==", + "dev": true, + "dependencies": { + "is-what": "^3.12.0" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.0.0.tgz", + "integrity": "sha512-tuCVuFMBbRsb7IH0q1CUb50/Skv+7a6c7DJ+xi4fAbOzNLTYVMUTPnf8uGvKPtmqTvzYBrfEFo7YgP4TsUWmtg==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^12.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 12.20.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/copy-webpack-plugin/node_modules/array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/copy-webpack-plugin/node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.0.2.tgz", + "integrity": "sha512-lAsmb/5Lww4r7MM9nCCliDZVIKbZTavrsunAsHLr9oHthrZP1qi7/gAnHOsUs9bLvEt2vKVJhHmxuL7QbDuPdQ==", + "dev": true, + "dependencies": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.8", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/copy-webpack-plugin/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cordova-android": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-10.1.2.tgz", + "integrity": "sha512-F28+NvgKO4ZhKFkqctCOh62mhVoNyUuRQh/F/nqp+Sti4ODv2rUa6UeW18khhdYTjlDeihHQsPqxvB7mI6fVYA==", + "dev": true, + "dependencies": { + "android-versions": "^1.7.0", + "cordova-common": "^4.0.2", + "execa": "^5.1.1", + "fast-glob": "^3.2.7", + "fs-extra": "^10.0.0", + "is-path-inside": "^3.0.3", + "nopt": "^5.0.0", + "properties-parser": "^0.3.1", + "semver": "^7.3.5", + "untildify": "^4.0.0", + "which": "^2.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/cordova-android-support-gradle-release": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cordova-android-support-gradle-release/-/cordova-android-support-gradle-release-3.0.1.tgz", + "integrity": "sha512-RSW55DkSckmqhX/kjj+a1YeVdy7s/AtlZn6Qa5XMQmmA4Iogq+IF2jvInZqzCF19DbI5YE95AP7VDbRk+DdDRw==", + "dependencies": { + "q": "^1.4.1", + "semver": "5.6.0" + } + }, + "node_modules/cordova-android/node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/cordova-android/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cordova-android/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/cordova-android/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/cordova-android/node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/cordova-android/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cordova-android/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/cordova-android/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cordova-android/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/cordova-android/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/cordova-common": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-4.0.2.tgz", + "integrity": "sha512-od7aNShyuBajzPY83mUEO8tERwwWdFklXETHiXP5Ft87CWeo/tSuwNPFztyTy8XYc74yXdogXKPTJeUHuVzB8Q==", + "dev": true, + "dependencies": { + "@netflix/nerror": "^1.1.3", + "ansi": "^0.3.1", + "bplist-parser": "^0.2.0", + "cross-spawn": "^7.0.1", + "elementtree": "^0.1.7", + "endent": "^1.4.1", + "fast-glob": "^3.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "plist": "^3.0.1", + "q": "^1.5.1", + "read-chunk": "^3.2.0", + "strip-bom": "^4.0.0", + "underscore": "^1.9.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/cordova-common/node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/cordova-common/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/cordova-common/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cordova-common/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/cordova-common/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/cordova-common/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/cordova-common/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/cordova-common/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/cordova-common/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/cordova-ios": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cordova-ios/-/cordova-ios-6.2.0.tgz", + "integrity": "sha512-sLjZg2QBI1SpQVwfe0MSn89YNVkBGLW9Q1vcFJBsqKBrhvoEOJ5Ytq0gwqdhgTOGzlwJUfxC6OHM3jcsRjtYrw==", + "dev": true, + "dependencies": { + "cordova-common": "^4.0.2", + "fs-extra": "^9.1.0", + "ios-sim": "^8.0.2", + "nopt": "^5.0.0", + "plist": "^3.0.1", + "semver": "^7.3.4", + "unorm": "^1.6.0", + "which": "^2.0.2", + "xcode": "^3.0.1", + "xml-escape": "^1.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cordova-ios/node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/cordova-ios/node_modules/bplist-creator": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", + "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", + "dev": true, + "dependencies": { + "stream-buffers": "2.2.x" + } + }, + "node_modules/cordova-ios/node_modules/bplist-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "dev": true, + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/cordova-ios/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cordova-ios/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/cordova-ios/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cordova-ios/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cordova-ios/node_modules/simple-plist": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", + "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", + "dev": true, + "dependencies": { + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" + } + }, + "node_modules/cordova-ios/node_modules/simple-plist/node_modules/plist": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==", + "dev": true, + "dependencies": { + "base64-js": "^1.5.1", + "xmlbuilder": "^9.0.7" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cordova-ios/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/cordova-ios/node_modules/uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/cordova-ios/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/cordova-ios/node_modules/xcode": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", + "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", + "dev": true, + "dependencies": { + "simple-plist": "^1.1.0", + "uuid": "^7.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/cordova-plugin-3dtouch": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/cordova-plugin-3dtouch/-/cordova-plugin-3dtouch-1.3.8.tgz", + "integrity": "sha512-xX19yf3L8aT+Qx/0tvPpZl0A6PLSzaUbqA8ODoMJSIErin6nXvgdtM1L9ldvgqdNtXX7eIZA7iYeBlC9fcd3pQ==", + "engines": [ + { + "name": "cordova", + "version": ">=3.5.0" + } + ] + }, + "node_modules/cordova-plugin-add-swift-support": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-add-swift-support/-/cordova-plugin-add-swift-support-2.0.2.tgz", + "integrity": "sha512-K03WDnsD3GT+n7Od3BnS17D8rYnAFZbZjjQJa2r7qW8QLq8+h7hGbFaiF+w5+nUtyAqUNq+HT/d/MdqBGLNzxA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3", + "semver": "^6.0.0", + "xcode": "^2.0.0" + } + }, + "node_modules/cordova-plugin-add-swift-support/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/cordova-plugin-android-permissions": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-android-permissions/-/cordova-plugin-android-permissions-1.1.2.tgz", + "integrity": "sha512-vJd56gLaSgQnB/4+uUjyVwVAii5TszBPAgjVkGvM8658cP5rjiNFAWmoOYkjeSe1I6dJk+MGrh/GbPkn0a+2OA==", + "engines": [ + { + "name": "cordova", + "version": ">=5.0.0" + } + ] + }, + "node_modules/cordova-plugin-androidx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-androidx/-/cordova-plugin-androidx-3.0.0.tgz", + "integrity": "sha512-niMnhcxKsu4/oKTUbL0jRAnh6/cdoIVxRxJqj3uEyv8CVOlAj1sWhX+9b1XiAo9+bejAM9BbA21YK0mChfbVTA==", + "dev": true + }, + "node_modules/cordova-plugin-androidx-adapter": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cordova-plugin-androidx-adapter/-/cordova-plugin-androidx-adapter-1.1.3.tgz", + "integrity": "sha512-W1SImn0cCCvOSTSfWWp5TnanIQrSuh2Bch+dcZXIzEn0km3Qb7VryeAqHhgBQYwwzC5Ollk1DtUAk/AJSojuZA==", + "dev": true, + "dependencies": { + "q": "^1.5.1", + "recursive-readdir": "^2.2.2" + } + }, + "node_modules/cordova-plugin-app-version": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/cordova-plugin-app-version/-/cordova-plugin-app-version-0.1.12.tgz", + "integrity": "sha512-P+0d9+h9HasanKuMd8tcEpuJJlsVmClie3Mbq16v3TV/VroDrgYB6Ea8Imkc/WjjMVSBCjWB+pji1LoupWlddA==", + "dev": true + }, + "node_modules/cordova-plugin-appminimize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cordova-plugin-appminimize/-/cordova-plugin-appminimize-1.0.1.tgz", + "integrity": "sha512-UJZ5g8iFBP42EplS0gKwAQhwr9cUfur95o6w+2NW21pjbgioj1RVZddngy7dO++ABDpkd4HMPYnJw7DqMp5rww==" + }, + "node_modules/cordova-plugin-apprate": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-apprate/-/cordova-plugin-apprate-1.7.2.tgz", + "integrity": "sha512-kW92o//7EVr+heGRp3J6BUPE1w5zQaJdh3ZEdE5EBrr95yVarhJ8W9NN4CoMM+YlgF8flUqWD+vN+reBv+RZrg==", + "dev": true + }, + "node_modules/cordova-plugin-ble-central": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/cordova-plugin-ble-central/-/cordova-plugin-ble-central-1.4.4.tgz", + "integrity": "sha512-zE2eRsGGJSSKSuIWIhVB7JkGkwbPaAO0NZytUhn7loay6nM4NMvSxhvJkucYea79V5iYoODuZdjiRlSTzfRcew==", + "dev": true + }, + "node_modules/cordova-plugin-camera": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-camera/-/cordova-plugin-camera-6.0.0.tgz", + "integrity": "sha512-FTFKep8HZI/2HkX+Gc/dUACfZGV9+k9waXlgoEOKXOiPPR/1zBw29Mw+adcz4FQUpdWyAgYDxNiaPUnP0P+H2Q==", + "dev": true, + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova-android": ">=6.3.0" + }, + "4.1.0": { + "cordova": ">=7.1.0", + "cordova-android": ">=6.3.0" + }, + "5.0.0": { + "cordova": ">=9.0.0", + "cordova-android": ">=9.0.0", + "cordova-ios": ">=5.1.0" + }, + "5.0.4-dev": { + "cordova": ">=9.0.0", + "cordova-android": "<10.0.0", + "cordova-ios": ">=5.1.0" + }, + "6.0.0": { + "cordova": ">=9.0.0", + "cordova-android": ">=10.0.0", + "cordova-ios": ">=5.1.0" + }, + "7.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-customurlscheme-ng": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-customurlscheme-ng/-/cordova-plugin-customurlscheme-ng-10.0.0.tgz", + "integrity": "sha512-XGoUioiF23HNk8BY/I1AQ1j9jsVTtjIqZFxmZGyXzLH+hEvagi2vixXvJB2GLh737jb1rhiJn+F02EJDgtTlvQ==", + "dev": true, + "engines": [ + { + "name": "cordova", + "version": ">=7.1.0" + } + ] + }, + "node_modules/cordova-plugin-device": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cordova-plugin-device/-/cordova-plugin-device-2.0.3.tgz", + "integrity": "sha512-Jb3V72btxf3XHpkPQsGdyc8N6tVBYn1vsxSFj43fIz9vonJDUThYPCJJHqk6PX6N4dJw6I4FjxkpfCR4LDYMlw==", + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-dialogs": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-dialogs/-/cordova-plugin-dialogs-2.0.2.tgz", + "integrity": "sha512-FUHI6eEVeoz2VkxbF0P56QlUQLGzXcvw3i4xuXyM9gEct6Y+FA3Xzgl2pJTZcTg5wRqLWzN08kgNoHPkom15pw==", + "dev": true, + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-enable-multidex": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-enable-multidex/-/cordova-plugin-enable-multidex-0.2.0.tgz", + "integrity": "sha512-W/s8FpRdi3kTLtePdvauqKj1qqoxZDJWmEphvAmSmPwNTtfv3CxgnwFYc9aNmR9iDiJk3E0ME+9BRkbyz/4rXw==" + }, + "node_modules/cordova-plugin-file": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-file/-/cordova-plugin-file-6.0.2.tgz", + "integrity": "sha512-m7cughw327CjONN/qjzsTpSesLaeybksQh420/gRuSXJX5Zt9NfgsSbqqKDon6jnQ9Mm7h7imgyO2uJ34XMBtA==", + "engines": { + "cordovaDependencies": { + "5.0.0": { + "cordova-android": ">=6.3.0" + }, + "7.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-file-transfer": { + "version": "2.0.0-dev", + "resolved": "git+ssh://git@github.com/dpa99c/cordova-plugin-file-transfer.git#2cdb0403a81821e144998c8d9a00d338d6ece3ee", + "integrity": "sha512-nOOCSablnogiNuLYpMN+p5+D0km8xAGfzrh5+znfLLSKAwGTOiy/zB7nCgigVAGPW8JIeBsaR0zKMt0msClqzw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-filechooser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-filechooser/-/cordova-plugin-filechooser-1.2.0.tgz", + "integrity": "sha512-ycL9ML3wlRQ8wfK7vCG8gobv1f3VIdO52m0LA9mPSzLblbu0AXJs89yCRxZB87+08/V96qBxrmkxMsMmVYu5wA==" + }, + "node_modules/cordova-plugin-filepicker": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cordova-plugin-filepicker/-/cordova-plugin-filepicker-1.1.6.tgz", + "integrity": "sha512-nUlnFj22HImuF/sjB61qdNyzg/9wFbx1808ADly7QN6jDK1DoN18qg8POOroPCNG355v7mbh/nohxnEYz57tHg==", + "engines": [ + { + "name": "cordova", + "version": ">=3.0.0" + } + ], + "dependencies": { + "q": "^1.5.1", + "xcode": "^2.0.0" + } + }, + "node_modules/cordova-plugin-geolocation": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-geolocation/-/cordova-plugin-geolocation-4.1.0.tgz", + "integrity": "sha512-y5io/P10xGMxSn2KEqfv/fExK47eA1pmSonJdmDqDsaSADV9JpgdPx0mUSA08+5pzma/OS9R0LoODeDPx7Jvjg==", + "dev": true, + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova-android": ">=6.3.0" + }, + "5.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-globalization": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-globalization/-/cordova-plugin-globalization-1.11.0.tgz", + "integrity": "sha1-6sMVgQAphJOvowvolA5pj2HvvP4=", + "engines": { + "cordovaDependencies": { + "2.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-health": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-health/-/cordova-plugin-health-2.0.0.tgz", + "integrity": "sha512-KIehXuSoDMiCxzrQzV/duON1EBNOlszcuzOZqjq67c1ScgvHMSzbRI9GSQ7w55AFTSZBMfeob7AuqGOJCGozbQ==", + "dev": true, + "engines": [ + { + "name": "cordova", + "version": ">=6.0.0" + } + ] + }, + "node_modules/cordova-plugin-inappbrowser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-inappbrowser/-/cordova-plugin-inappbrowser-5.0.0.tgz", + "integrity": "sha512-MqnpmUQ/iy6hxtIGDdlIhy8aNi1pNanLATpbnkk7uCqW9YQ4rH/dGK9zESbZ50pUi2A2D2QMjBXNV175TJK5OQ==", + "dev": true, + "engines": { + "cordovaDependencies": { + "0.2.3": { + "cordova": ">=3.1.0" + }, + "4.0.0": { + "cordova": ">=3.1.0", + "cordova-ios": ">=4.0.0" + }, + "5.0.0": { + "cordova": ">=9.0.0", + "cordova-android": ">=9.0.0", + "cordova-ios": ">=6.0.0" + }, + "6.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-insomnia": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-insomnia/-/cordova-plugin-insomnia-4.3.0.tgz", + "integrity": "sha1-gyoz9tdj8LgCc733YbNbZ4xDuVc=", + "dev": true, + "engines": [ + { + "name": "cordova", + "version": ">=3.0.0" + } + ] + }, + "node_modules/cordova-plugin-ionic-keyboard": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-ionic-keyboard/-/cordova-plugin-ionic-keyboard-2.2.0.tgz", + "integrity": "sha512-yDUG+9ieKVRitq5mGlNxjaZh/MgEhFFIgTIPhqSbUaQ8UuZbawy5mhJAVClqY97q8/rcQtL6dCDa7x2sEtCLcA==" + }, + "node_modules/cordova-plugin-ionic-webview": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-ionic-webview/-/cordova-plugin-ionic-webview-5.0.0.tgz", + "integrity": "sha512-Wq0kCanxubK/JroTW4Mp5soayScnRyiY1eCkbwiz1Dyt1xHOiOW/v+1miqtBHtnZhcXw25TulCKAVJzkNBdmyg==", + "dev": true, + "engines": { + "cordovaDependencies": { + "2.0.0": { + "cordova-android": ">=6.4.0", + "cordova-ios": ">=4.0.0-dev" + }, + "3.1.0": { + "cordova": ">=7.1.0", + "cordova-android": ">=6.4.0", + "cordova-ios": ">=4.0.0-dev" + } + } + } + }, + "node_modules/cordova-plugin-nativestorage": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-nativestorage/-/cordova-plugin-nativestorage-2.3.2.tgz", + "integrity": "sha512-olg/BzYRk0NGbKQ5f7rf21RYQEyJI19CCZn6RpVMO9/kbRRFqae/6ixjDNy81dXSu2TQ42brjBddGe1Qpn5ViA==", + "dev": true + }, + "node_modules/cordova-plugin-screen-orientation": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-screen-orientation/-/cordova-plugin-screen-orientation-3.0.2.tgz", + "integrity": "sha512-2w6CMC+HGvbhogJetalwGurL2Fx8DQCCPy3wlSZHN1/W7WoQ5n9ujVozcoKrY4VaagK6bxrPFih+ElkO8Uqfzg==", + "dev": true, + "engines": { + "cordovaDependencies": { + "4.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-simple-file-chooser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cordova-plugin-simple-file-chooser/-/cordova-plugin-simple-file-chooser-2.2.1.tgz", + "integrity": "sha512-uiDt8ynX6s/GInaZg4mi/gDgk0OLK//5lT/gunP5LHi898LOH0c5y6qnD0IS5ued5AYuETFRs63X2be3+3d5Wg==", + "dev": true + }, + "node_modules/cordova-plugin-splashscreen": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-splashscreen/-/cordova-plugin-splashscreen-6.0.0.tgz", + "integrity": "sha512-pm4ZtJKQY4bCGXVeIInbGrXilryTevYSKgfvoQJpW9UClOWKAxSsYf2/4G2u1vcn492svOSL42OSa2MhujBWEQ==", + "dev": true, + "engines": { + "cordovaDependencies": { + ">=4.0.0": { + "cordova-android": ">=3.6.0", + "cordova-windows": ">=4.4.0" + }, + "2.0.0": { + "cordova-android": ">=3.6.0" + }, + "7.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-statusbar": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/cordova-plugin-statusbar/-/cordova-plugin-statusbar-2.4.3.tgz", + "integrity": "sha512-ThmXzl6QIKWFXf4wWw7Q/zpB+VKkz3VM958+5A0sXD4jmR++u7KnGttLksXshVwWr6lvGwUebLYtIyXwS4Ovcg==", + "engines": { + "cordovaDependencies": { + "0.1.0": { + "cordova": ">=3.0.0" + }, + "3.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-telerik-imagepicker": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/cordova-plugin-telerik-imagepicker/-/cordova-plugin-telerik-imagepicker-2.3.3.tgz", + "integrity": "sha512-eL16EIxDueDo+dky5lNuzC+bDbKHPLPDfd/mtNpaCTNoT6iZqFd9/qJwSMnidXqCeExJZkN4ACsEHmtUA+vQ7Q==", + "dev": true, + "engines": { + "name": "cordova", + "version": ">=3.5.0" + } + }, + "node_modules/cordova-plugin-x-socialsharing": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/cordova-plugin-x-socialsharing/-/cordova-plugin-x-socialsharing-6.0.3.tgz", + "integrity": "sha512-pnrE2CXsz4G0n0WoFDAasLS1VT3nIsNpddvXgfpiqX3wyOlSjO2NdF+sjYaTvs1B+f7z8EWbYCHpCrgBQiMLIg==", + "dev": true, + "engines": [ + { + "name": "cordova", + "version": ">=3.0.0" + } + ] + }, + "node_modules/cordova-sqlite-storage": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cordova-sqlite-storage/-/cordova-sqlite-storage-5.1.0.tgz", + "integrity": "sha512-UmHe9yQiYblDBToh3z91WHuD6ZgmCm3VX+1QFseYQs4WVQ3+ndj22qyGby/NV0uyCgok91gB1obLjLM+9vYJEw==", + "dev": true, + "dependencies": { + "cordova-sqlite-storage-dependencies": "3.0.0" + } + }, + "node_modules/cordova-sqlite-storage-dependencies": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cordova-sqlite-storage-dependencies/-/cordova-sqlite-storage-dependencies-3.0.0.tgz", + "integrity": "sha512-A7gV5lQZc0oPrJ/a+lsZmMZr7vYou4MXyQFOY+b/dwuCMsagLT0EsL7oY54tqzpvjtzLfh0aZGGm9i8DMAIFSA==", + "dev": true + }, + "node_modules/core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.3.tgz", + "integrity": "sha512-59tYzuWgEEVU9r+SRgceIGXSSUn47JknoiXW6Oq7RW8QHjXWz3/vp8pa7dbtuVu40sewz3OP3JmQEcDdztrLhA==", + "dev": true, + "dependencies": { + "browserslist": "^4.18.1", + "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=" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "dependencies": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + }, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/critters": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.15.tgz", + "integrity": "sha512-AE7hkXb3eZUbEvS1SKZa+OU4o2kUOXtzVeE/2E/mjU/0mV1wpBT1HfUCWVRS4zwvkBNJ0AQYsVjAoFm+kIhfdw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "css-select": "^4.1.3", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", + "pretty-bytes": "^5.3.0" + } + }, + "node_modules/critters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/critters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/critters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/critters/node_modules/nanoid": { + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/critters/node_modules/postcss": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", + "dev": true, + "dependencies": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/critters/node_modules/source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/critters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, + "node_modules/css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "dev": true, + "dependencies": { + "postcss": "^7.0.5" + }, + "bin": { + "css-blank-pseudo": "cli.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/css-blank-pseudo/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/css-blank-pseudo/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-blank-pseudo/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/css-declaration-sorter": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.3.tgz", + "integrity": "sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA==", + "dev": true, + "dependencies": { + "timsort": "^0.3.0" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "bin": { + "css-has-pseudo": "cli.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-has-pseudo/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/css-has-pseudo/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-has-pseudo/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/css-loader": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", + "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-B3I5e17RwvKPJwsxjjWcdgpU/zqylzK1bPVghcmpFHRL48DXiBgrtqz1BJsn68+t/zzaLp9kYAaEDvQ7GyanFQ==", + "dev": true, + "dependencies": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "p-limit": "^3.0.2", + "postcss": "^8.3.5", + "schema-utils": "^3.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + } + } + }, + "node_modules/css-minimizer-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/css-minimizer-webpack-plugin/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-minimizer-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/css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dev": true, + "dependencies": { + "css": "^2.0.0" + } + }, + "node_modules/css-parse/node_modules/css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "node_modules/css-parse/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/css-parse/node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.5" + }, + "bin": { + "css-prefers-color-scheme": "cli.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/css-prefers-color-scheme/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/css-prefers-color-scheme/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-prefers-color-scheme/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/css-select": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.0.tgz", + "integrity": "sha512-6YVG6hsH9yIb/si3Th/is8Pex7qnVHO6t7q7U6TIUnkQASGbS8tnUDBftnPynLNnuUl/r2+PTd0ekiiq7R0zJw==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/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/css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css/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/cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.12.tgz", + "integrity": "sha512-U38V4x2iJ3ijPdeWqUrEr4eKBB5PbEKsNP5T8xcik2Au3LeMtiMHX0i2Hu9k51FcKofNZumbrcdC6+a521IUHg==", + "dev": true, + "dependencies": { + "cssnano-preset-default": "^5.1.8", + "is-resolvable": "^1.1.0", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.8.tgz", + "integrity": "sha512-zWMlP0+AMPBVE852SqTrP0DnhTcTA2C1wAF92TKZ3Va+aUVqLIhkqKlnJIXXdqXD7RN+S1ujuWmNpvrJBiM/vg==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^6.0.3", + "cssnano-utils": "^2.0.1", + "postcss-calc": "^8.0.0", + "postcss-colormin": "^5.2.1", + "postcss-convert-values": "^5.0.2", + "postcss-discard-comments": "^5.0.1", + "postcss-discard-duplicates": "^5.0.1", + "postcss-discard-empty": "^5.0.1", + "postcss-discard-overridden": "^5.0.1", + "postcss-merge-longhand": "^5.0.4", + "postcss-merge-rules": "^5.0.3", + "postcss-minify-font-values": "^5.0.1", + "postcss-minify-gradients": "^5.0.3", + "postcss-minify-params": "^5.0.2", + "postcss-minify-selectors": "^5.1.0", + "postcss-normalize-charset": "^5.0.1", + "postcss-normalize-display-values": "^5.0.1", + "postcss-normalize-positions": "^5.0.1", + "postcss-normalize-repeat-style": "^5.0.1", + "postcss-normalize-string": "^5.0.1", + "postcss-normalize-timing-functions": "^5.0.1", + "postcss-normalize-unicode": "^5.0.1", + "postcss-normalize-url": "^5.0.3", + "postcss-normalize-whitespace": "^5.0.1", + "postcss-ordered-values": "^5.0.2", + "postcss-reduce-initial": "^5.0.2", + "postcss-reduce-transforms": "^5.0.1", + "postcss-svgo": "^5.0.3", + "postcss-unique-selectors": "^5.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-2.0.1.tgz", + "integrity": "sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/currency-symbol-map": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/currency-symbol-map/-/currency-symbol-map-5.0.1.tgz", + "integrity": "sha512-2yHvoVBPIS9Dx7fjritu9l7UHWo4Z3D2oQnQj8AYwUee2j/PAcoHB4issCqwabfbipISZ/iG6vVYsfrAoks2eA==" + }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/date-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/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/decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/defaults/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/degenerator": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.1.tgz", + "integrity": "sha512-LFsIFEeLPlKvAKXu7j3ssIG6RT0TbI7/GhsqrI0DnHASEQjXQ0LUSYcjJteGgRGmZbl1TnMSxpNQIAiJ7Du5TQ==", + "dependencies": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/del/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "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/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "node_modules/diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.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/elementtree": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha1-mskb5uUvtuYkTE5UpKw+2K6OKcA=", + "dependencies": { + "sax": "1.1.4" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/elementtree/node_modules/sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha1-dLbTPJrh4AFRDxeakRaFiPGu2qk=" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/endent": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/endent/-/endent-1.4.1.tgz", + "integrity": "sha512-buHTb5c8AC9NshtP6dgmNLYkiT+olskbq1z6cEGvfGCF3Qphbu/1zz5Xu+yjTDln8RbxNhPoUyJ5H8MSrp1olQ==", + "dev": true, + "dependencies": { + "dedent": "^0.7.0", + "fast-json-parse": "^1.0.3", + "objectorarray": "^1.0.4" + } + }, + "node_modules/engine.io": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.0.tgz", + "integrity": "sha512-ErhZOVu2xweCjEfYcTdkCnEYUiZgkAcBBAhW4jbIvNG8SLU3orAqoJCiytZjYF7eTpVmmCrLDjLIEaPlUAs1uw==", + "dev": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.0", + "ws": "~8.2.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.2.tgz", + "integrity": "sha512-wuiO7qO/OEkPJSFueuATIXtrxF7/6GTbAO9QLv7nnbjwZ5tYhLm9zxvLwxstRs0dcT0KUlWTjtIOs1T86jt12g==", + "dev": true, + "dependencies": { + "base64-arraybuffer": "~1.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/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/engine.io/node_modules/ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/enhanced-resolve": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enhanced-resolve/node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "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-promise-plugin": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/es6-promise-plugin/-/es6-promise-plugin-4.2.2.tgz", + "integrity": "sha512-uoA4aVplXI9oqUYJFBAVRwAqIN9/n9JgrTAUGX3qPbnSZVE5yY1+6/MsoN5f4xsaPO62WjPHOdtts6okMN6tNA==", + "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/esbuild-android-arm64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.2.tgz", + "integrity": "sha512-hEixaKMN3XXCkoe+0WcexO4CcBVU5DCSUT+7P8JZiWZCbAjSkc9b6Yz2X5DSfQmRCtI/cQRU6TfMYrMQ5NBfdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.2.tgz", + "integrity": "sha512-Uq8t0cbJQkxkQdbUfOl2wZqZ/AtLZjvJulR1HHnc96UgyzG9YlCLSDMiqjM+NANEy7/zzvwKJsy3iNC9wwqLJA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.2.tgz", + "integrity": "sha512-619MSa17sr7YCIrUj88KzQu2ESA4jKYtIYfLU/smX6qNgxQt3Y/gzM4s6sgJ4fPQzirvmXgcHv1ZNQAs/Xh48A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.2.tgz", + "integrity": "sha512-aP6FE/ZsChZpUV6F3HE3x1Pz0paoYXycJ7oLt06g0G9dhJKknPawXCqQg/WMyD+ldCEZfo7F1kavenPdIT/SGQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.2.tgz", + "integrity": "sha512-LSm98WTb1QIhyS83+Po0KTpZNdd2XpVpI9ua5rLWqKWbKeNRFwOsjeiuwBaRNc+O32s9oC2ZMefETxHBV6VNkQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.2.tgz", + "integrity": "sha512-8VxnNEyeUbiGflTKcuVc5JEPTqXfsx2O6ABwUbfS1Hp26lYPRPC7pKQK5Dxa0MBejGc50jy7YZae3EGQUQ8EkQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.2.tgz", + "integrity": "sha512-4bzMS2dNxOJoFIiHId4w+tqQzdnsch71JJV1qZnbnErSFWcR9lRgpSqWnTTFtv6XM+MvltRzSXC5wQ7AEBY6Hg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.2.tgz", + "integrity": "sha512-PaylahvMHhH8YMfJPMKEqi64qA0Su+d4FNfHKvlKes/2dUe4QxgbwXT9oLVgy8iJdcFMrO7By4R8fS8S0p8aVQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.2.tgz", + "integrity": "sha512-RlIVp0RwJrdtasDF1vTFueLYZ8WuFzxoQ1OoRFZOTyJHCGCNgh7xJIC34gd7B7+RT0CzLBB4LcM5n0LS+hIoww==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.2.tgz", + "integrity": "sha512-Fdwrq2roFnO5oetIiUQQueZ3+5soCxBSJswg3MvYaXDomj47BN6oAWMZgLrFh1oVrtWrxSDLCJBenYdbm2s+qQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.2.tgz", + "integrity": "sha512-vxptskw8JfCDD9QqpRO0XnsM1osuWeRjPaXX1TwdveLogYsbdFtcuiuK/4FxGiNMUr1ojtnCS2rMPbY8puc5NA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.2.tgz", + "integrity": "sha512-I8+LzYK5iSNpspS9eCV9sW67Rj8FgMHimGri4mKiGAmN0pNfx+hFX146rYtzGtewuxKtTsPywWteHx+hPRLDsw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ] + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.2.tgz", + "integrity": "sha512-120HgMe9elidWUvM2E6mMf0csrGwx8sYDqUIJugyMy1oHm+/nT08bTAVXuwYG/rkMIqsEO9AlMxuYnwR6En/3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.2.tgz", + "integrity": "sha512-Q3xcf9Uyfra9UuCFxoLixVvdigo0daZaKJ97TL2KNA4bxRUPK18wwGUk3AxvgDQZpRmg82w9PnkaNYo7a+24ow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ] + }, + "node_modules/esbuild-wasm": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.2.tgz", + "integrity": "sha512-Rs8NjWoo1UdsVjhxT2o6kLCX9Sh65pyd3/h4XeJ3jjQNM6NgL+/CSowuJgvOIjDAXMLXpc6fdGnyZQDil9IUJA==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.2.tgz", + "integrity": "sha512-TW7O49tPsrq+N1sW8mb3m24j/iDGa4xzAZH4wHWwoIzgtZAYPKC0hpIhufRRG/LA30bdMChO9pjJZ5mtcybtBQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.2.tgz", + "integrity": "sha512-Rym6ViMNmi1E2QuQMWy0AFAfdY0wGwZD73BnzlsQBX5hZBuy/L+Speh7ucUZ16gwsrMM9v86icZUDrSN/lNBKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.2.tgz", + "integrity": "sha512-ZrLbhr0vX5Em/P1faMnHucjVVWPS+m3tktAtz93WkMZLmbRJevhiW1y4CbulBd2z0MEdXZ6emDa1zFHq5O5bSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "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=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/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==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "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==", + "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/eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", + "dev": true + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "dev": true, + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/execa/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/execa/node_modules/signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "dev": true + }, + "node_modules/execall": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", + "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==", + "dev": true, + "dependencies": { + "clone-regexp": "^2.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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/express/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/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-parse": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", + "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==", + "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=" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/figures": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "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/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/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/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/flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash.", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz", + "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/formidable": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", + "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "dependencies": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ftp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/ftp/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/ftp/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/fttx-phonegap-plugin-barcodescanner": { + "version": "8.2.10", + "resolved": "git+ssh://git@github.com/fttx/phonegap-plugin-barcodescanner.git#92d7e25631760f2db02e9fb42769d30b5ccc325f", + "integrity": "sha512-6HpLlhDsv/fxLqji84VQjkGyUXJ2GMlKTIRh3CKe7j+x6vNq2Hflu/MDX9gXmNDJkHD/cILhyVaG92cxdme+3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "nopt": "^4.0.1", + "shelljs": "^0.8.3" + }, + "engines": { + "cordovaDependencies": { + "<7.0.0": { + "cordova-android": "<6.3.0" + }, + "7.0.0": { + "cordova-android": ">=6.3.0" + }, + "7.1.0": { + "cordova": ">=7.1.0", + "cordova-android": ">=6.3.0" + }, + "8.0.0": { + "cordova": ">=7.1.0", + "cordova-android": ">=6.3.0" + } + } + } + }, + "node_modules/fttx-phonegap-plugin-barcodescanner/node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gauge": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.0.tgz", + "integrity": "sha512-F8sU45yQpjQjxKkm1UOAhf0U/O0aFt//Fl7hsrNVto+patMHjs7dPI9mFOGUKbhrgKm0S3EjW3scMFuQmWSROw==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "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-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "dependencies": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/get-uri/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/get-uri/node_modules/file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/get-uri/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "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/globby": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", + "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", + "dev": true + }, + "node_modules/gonzales-pe": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", + "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "gonzales": "bin/gonzales.js" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "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==" + }, + "node_modules/hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.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.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag/node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hdr-histogram-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.1.tgz", + "integrity": "sha512-uPZxl1dAFnjUFHWLZmt93vUUvtHeaBay9nVNHu38SdOjMSF/4KqJUqa1Seuj08ptU1rEb6AHvB41X8n/zFZ74Q==", + "dev": true, + "dependencies": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + } + }, + "node_modules/hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", + "dev": true + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", + "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/htmlparser2/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "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==", + "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=" + }, + "node_modules/http-parser-js": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", + "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", + "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "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/https-proxy-agent/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/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz", + "integrity": "sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "node_modules/immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/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/import-local/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/import-local/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/import-local/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/import-local/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/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.6.tgz", + "integrity": "sha512-IZUoxEjNjubzrmvzZU4lKP7OnYmX72XRl3sqkfJhBKweKi5rnGi5+IUdlj/H1M+Ip5JQ1WzaDMOBRY90Ajc5jg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-ip/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/internal-ip/node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-ip/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-ip/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-ip/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/internal-ip/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/internal-ip/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/internal-ip/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/internal-ip/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/internal-ip/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/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ionic-plugin-deeplinks": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/ionic-plugin-deeplinks/-/ionic-plugin-deeplinks-1.0.22.tgz", + "integrity": "sha512-tdRMp9OIoXn3W2YG83TfvT048DwY+PkwUNKHqcDymBrC/Pk1+5ZYrrKKYFVD2x75x5zaZN+JBIaBrabXt8bC4w==", + "dev": true, + "dependencies": { + "mkpath": ">=1.0.0", + "node-version-compare": ">=1.0.1", + "plist": ">=1.2.0", + "xml2js": ">=0.4" + } + }, + "node_modules/ionicons": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-6.0.1.tgz", + "integrity": "sha512-xQekOJsxH82O7oB+3F60zeRggCdND9pJ/k0E6IJDVUGGlCj5mlyFqNgxUimytKgstPGv3S+3EmCxjefvtGgWUg==", + "dependencies": { + "@stencil/core": "~2.12.0" + } + }, + "node_modules/ionicons/node_modules/@stencil/core": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.12.1.tgz", + "integrity": "sha512-u24TZ+FEvjnZt5ZgIkLjLpUNsO6Ml3mUZqwmqk81w6RWWz75hgB5p4RFI5rvuErFeh2xvMIGo+pNdG24XUBz1A==", + "bin": { + "stencil": "bin/stencil" + }, + "engines": { + "node": ">=12.10.0", + "npm": ">=6.0.0" + } + }, + "node_modules/ios-sim": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/ios-sim/-/ios-sim-8.0.2.tgz", + "integrity": "sha512-P7nEG771bfd+JoMRjnis1gpZOkjTUUxu+4Ek1Z+eoaEEoT9byllU9pxfQ8Df7hL3gSkIQxNwTSLhos2I8tWUQA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.0.6", + "nopt": "1.0.9", + "plist": "^3.0.1", + "simctl": "^2" + }, + "bin": { + "ios-sim": "bin/ios-sim" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ios-sim/node_modules/bplist-parser": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.0.6.tgz", + "integrity": "sha1-ONo0cYF9+dRKs4kuJ3B7u9daEbk=", + "dev": true + }, + "node_modules/ios-sim/node_modules/nopt": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.9.tgz", + "integrity": "sha1-O8DXy6e/sNWmdtvtfA6+SKT9RU4=", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dev": true, + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-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/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.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-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd/node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz", + "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isbinaryfile": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/@babel/core": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.5.tgz", + "integrity": "sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helpers": "^7.16.5", + "@babel/parser": "^7.16.5", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/@babel/generator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", + "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/@babel/helper-module-transforms": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", + "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/@babel/helpers": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.5.tgz", + "integrity": "sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/istanbul-lib-instrument/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/istanbul-lib-instrument/node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/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/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-instrument/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/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/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/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "dependencies": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "bin": { + "jasmine": "bin/jasmine.js" + } + }, + "node_modules/jasmine-core": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.6.0.tgz", + "integrity": "sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw==", + "dev": true + }, + "node_modules/jasmine-spec-reporter": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz", + "integrity": "sha512-6gP1LbVgJ+d7PKksQBc2H0oDGNRQI3gKUsWlswKaQ2fif9X5gzhQcgM5+kiJGCQVurOG09jqNhk7payggyp5+g==", + "dev": true, + "dependencies": { + "colors": "1.4.0" + } + }, + "node_modules/jasmine/node_modules/jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + }, + "node_modules/jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true, + "engines": { + "node": ">= 6.9.x" + } + }, + "node_modules/javascript-color-gradient": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/javascript-color-gradient/-/javascript-color-gradient-1.3.2.tgz", + "integrity": "sha512-P/VjoTPdfRmMOkfR65m1BQTlX/hYphZIj5u1Ntvpxf+9011uXjazbEOQ63g3EhlgzHYa2uwVU3RVgy3gJuLdlQ==" + }, + "node_modules/jest-worker": { + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", + "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/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/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "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-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/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-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/jsprim/node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/jszip": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", + "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/karma": { + "version": "6.3.9", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.9.tgz", + "integrity": "sha512-E/MqdLM9uVIhfuyVnrhlGBu4miafBdXEAEqCmwdEMh3n17C7UWC/8Kvm3AYKr91gc7scutekZ0xv6rxRaUCtnw==", + "dev": true, + "dependencies": { + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "colors": "^1.4.0", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.3.0", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.2.0", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "dev": true, + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-coverage-istanbul-reporter": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", + "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^3.0.2", + "minimatch": "^3.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/mattlewis92" + } + }, + "node_modules/karma-jasmine": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.1.tgz", + "integrity": "sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw==", + "dev": true, + "dependencies": { + "jasmine-core": "^3.6.0" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "karma": "*" + } + }, + "node_modules/karma-jasmine-html-reporter": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", + "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", + "dev": true, + "peerDependencies": { + "jasmine-core": ">=3.5", + "karma": ">=0.9", + "karma-jasmine": ">=1.1" + } + }, + "node_modules/karma-jasmine/node_modules/jasmine-core": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.7.1.tgz", + "integrity": "sha512-DH3oYDS/AUvvr22+xUBW62m1Xoy7tUlY1tsxKEJvl5JeJ7q8zd1K5bUwiOxdH+erj6l2vAMM3hV25Xs9/WrmuQ==", + "dev": true + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/karma/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/karma/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/karma/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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/karma/node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/karma/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/karma/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/karma/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/karma/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/karma/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/karma/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/known-css-properties": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz", + "integrity": "sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==", + "dev": true + }, + "node_modules/leek": { + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/leek/-/leek-0.0.24.tgz", + "integrity": "sha1-5ADlfw5g2O8r1NBo3EKKVDRdvNo=", + "dependencies": { + "debug": "^2.1.0", + "lodash.assign": "^3.2.0", + "rsvp": "^3.0.21" + } + }, + "node_modules/less": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz", + "integrity": "sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^2.5.2", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.2.0.tgz", + "integrity": "sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==", + "dev": true, + "dependencies": { + "klona": "^2.0.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-b9iMrROrw2fTOJBZ57h0xJfT5/1Cxg4ucYbtpWoukv4Awb2TFPfDDFVHNM8w6SYQpVfB13a5tQJxgGamqwrsyw==", + "dev": true, + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/license-webpack-plugin/node_modules/webpack-sources": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz", + "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lilconfig": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", + "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", + "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/localforage": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.7.1.tgz", + "integrity": "sha1-5JJ+BCMCuGTbMPMhHxO1xvDell0=", + "dependencies": { + "lie": "3.1.1" + } + }, + "node_modules/localforage-cordovasqlitedriver": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/localforage-cordovasqlitedriver/-/localforage-cordovasqlitedriver-1.7.0.tgz", + "integrity": "sha1-i5OVd1nuaI06WNW6fAR39sy1ODg=", + "dependencies": { + "localforage": ">=1.5.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dependencies": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "node_modules/lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" + }, + "node_modules/lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" + }, + "node_modules/lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "dependencies": { + "lodash._bindcallback": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash.restparam": "^3.0.0" + } + }, + "node_modules/lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "node_modules/lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" + }, + "node_modules/lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", + "dependencies": { + "lodash._baseassign": "^3.0.0", + "lodash._createassigner": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "node_modules/lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "node_modules/lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dependencies": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "node_modules/lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log4js": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", + "dev": true, + "dependencies": { + "date-format": "^3.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.1", + "rfdc": "^1.1.4", + "streamroller": "^2.2.4" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/log4js/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/log4js/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/loglevel": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/luxon": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.3.0.tgz", + "integrity": "sha512-gv6jZCV+gGIrVKhO90yrsn8qXPKD8HYZJtrUDSfEbow8Tkw84T9OnCyJhWvnJIaIF/tBuiAjZuQHUt1LddX2mg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/macos-release": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", + "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "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-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-fetch-happen/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-fetch-happen/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/make-fetch-happen/node_modules/socks": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz", + "integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==", + "dev": true, + "dependencies": { + "ip": "^1.1.5", + "smart-buffer": "^4.1.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/socks-proxy-agent": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", + "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.1", + "socks": "^2.6.1" + }, + "engines": { + "node": ">= 10" + } + }, + "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/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.0.tgz", + "integrity": "sha512-NAq0fCmZYGz9UFEQyndp7sisrow4GroyGeKluyKC/chuITZsPyOyC1UJZPJlVFImhXdROIP5xqouRLThT3BbpQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.4.tgz", + "integrity": "sha512-jj891B5pV2r63n2kBTFh8cRI2uR9LQHsXG1zSDqfhXkIlDzrTcIlbB5+5aaYEkl8vOPIOPLf8VT7Ere1wWTMdw==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.1.tgz", + "integrity": "sha512-4qJtZ0qdyYeexAXoOZiU0uHIFVncJAmCkHkSluAsvDaVWODtPyNEo9I1ns0T4ulxu2EHRH5u/bt1cV0pdHCX+A==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", + "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", + "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.4.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.0.tgz", + "integrity": "sha512-o/RfP0J1d03YwsAxyHxAYs2kyJp55AFkMazlFAZFR2I2IXkxiUTXRabJ6RmNNCQ83LAD2jy52Khj0m3OffpNdA==", + "dev": true, + "dependencies": { + "fs-monkey": "1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/normalize-package-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.1.tgz", + "integrity": "sha512-D/ttLdxo71msR4FF3VgSwK4blHfE3/vGByz1NCeE7/Dh8reQOKNJJjk5L10mLq9jxa+ZHzT1/HLgxljzbXE7Fw==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.0", + "resolve": "^1.17.0", + "semver": "^7.3.2", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/merge-source-map/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/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==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.2.tgz", + "integrity": "sha512-IXuP76p2uj8uMg4FQc1cRE7lPCLsfAXuEfdjtdO55VRiFO1asrCSQ5g43NmPqFtRwzEnEhafRVzn2jg0UiKArQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/micromark/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/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "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/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==", + "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==", + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.5.tgz", + "integrity": "sha512-oEIhRucyn1JbT/1tU2BhnwO6ft1jjH1iCX9Gc59WFMg0n5773rQU0oyQ0zzeYFFuBfONaRbQJyGoPtuNseMxjA==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "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==" + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz", + "integrity": "sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/mkpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-1.0.0.tgz", + "integrity": "sha1-67Opd+evHGg65v2hK1Raa6bFhT0=", + "dev": true + }, + "node_modules/moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node_modules/nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "dev": true, + "optional": true + }, + "node_modules/nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "dev": true, + "optional": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/needle/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "optional": 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/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/ngx-stars": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ngx-stars/-/ngx-stars-1.4.3.tgz", + "integrity": "sha512-aTdCCK+eXTADDQY2HQYgYdt0cg1Vtcxd3pV8t1uze0nnmhp5L+giLGJyehio7IWU08zl2578j7C0JGKIXagNwA==", + "dependencies": { + "tslib": "^1.9.0" + }, + "peerDependencies": { + "@angular/common": ">=2.0.0 < 9.0.0", + "@angular/core": ">=2.0.0 < 9.0.0" + } + }, + "node_modules/ngx-stars/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node_modules/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-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "optional": true + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", + "dev": true, + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/node-gyp/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/node-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/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/node-version-compare": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/node-version-compare/-/node-version-compare-1.0.3.tgz", + "integrity": "sha512-unO5GpBAh5YqeGULMLpmDT94oanSDMwtZB8KHTKCH/qrGv8bHN0mlDj9xQDAicCYXv2OLnzdi67lidCrcVotVw==", + "dev": true + }, + "node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "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/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/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/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-selector": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", + "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", + "dev": true + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-install-checks/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "node_modules/npm-package-arg": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", + "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-packlist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz", + "integrity": "sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==", + "dev": true, + "dependencies": { + "glob": "^7.1.6", + "ignore-walk": "^4.0.1", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-pick-manifest": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", + "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", + "dev": true, + "dependencies": { + "npm-install-checks": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" + } + }, + "node_modules/npm-pick-manifest/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-registry-fetch": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", + "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^9.0.1", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/npmlog": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.0.tgz", + "integrity": "sha512-03ppFRGlsyUaQFbGC2C8QWJN/C/K7PsfyD9aQdhVKAQIH4sQBc8WASqFBP7O+Ut4d2oo5LoeoboB3cGdBZSp6Q==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.0", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.1.tgz", + "integrity": "sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/objectorarray": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.4.tgz", + "integrity": "sha512-91k8bjcldstRz1bG6zJo8lWD7c6QXcB4nTDUqiEvIL1xAsLoZlOOZZG+nd6YPz+V7zY1580J4Xxh1vZtyv4i/w==", + "dev": true + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.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/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/open": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", + "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/cli-spinners": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", + "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/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/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-name": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", + "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", + "dependencies": { + "macos-release": "^2.5.0", + "windows-release": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.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-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "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-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", + "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "dev": true, + "dependencies": { + "@types/retry": "^0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/pac-proxy-agent/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pac-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/pac-resolver": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.0.tgz", + "integrity": "sha512-H+/A6KitiHNNW+bxBKREk2MCGSxljfqRX76NjummWEYIat7ldVXRU3dhRIE3iXZ0nvGBk6smv3nntxKkzRL8NA==", + "dependencies": { + "degenerator": "^3.0.1", + "ip": "^1.1.5", + "netmask": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pacote": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.2.tgz", + "integrity": "sha512-Ar3mhjcxhMzk+OVZ8pbnXdb0l8+pimvlsqBGRNkble2NVgyqOGE3yrCGi/lAYq7E7NRDMz89R1Wx5HIMCGgeYg==", + "dev": true, + "dependencies": { + "@npmcli/git": "^2.1.0", + "@npmcli/installed-package-contents": "^1.0.6", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^2.0.0", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^3.0.0", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^11.0.0", + "promise-retry": "^2.0.1", + "read-package-json-fast": "^2.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.0" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/pacote/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pacote/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "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/parent-module/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/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dev": true, + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", + "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1", + "parse5-sax-parser": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", + "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "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/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-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": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "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/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/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/piscina": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.1.0.tgz", + "integrity": "sha512-KTW4sjsCD34MHrUbx9eAAbuUSpVj407hQSgk/6Epkg0pbRBmv4a3UX7Sr8wxm9xYqQLnsN4mFOjqGDzHAdgKQg==", + "dev": true, + "dependencies": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0" + }, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "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/plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "dependencies": { + "base64-js": "^1.2.3", + "xmlbuilder": "^9.0.7", + "xmldom": "0.1.x" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/portfinder/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", + "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", + "dependencies": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-attribute-case-insensitive/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/postcss-calc": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.0.0.tgz", + "integrity": "sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-functional-notation/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-color-functional-notation/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-color-functional-notation/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/postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "dev": true, + "dependencies": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-gray/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-color-gray/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-color-gray/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/postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-hex-alpha/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-color-hex-alpha/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-color-hex-alpha/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/postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "dev": true, + "dependencies": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-mod-function/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-color-mod-function/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-color-mod-function/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/postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-rebeccapurple/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-color-rebeccapurple/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-color-rebeccapurple/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/postcss-colormin": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.1.tgz", + "integrity": "sha512-VVwMrEYLcHYePUYV99Ymuoi7WhKrMGy/V9/kTS0DkCoJYmmjdOMneyhzYUxcNgteKDVbrewOkSM7Wje/MFwxzA==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.2.tgz", + "integrity": "sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-custom-media/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-custom-media/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-custom-media/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/postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-custom-properties/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-custom-properties/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-custom-properties/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/postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-custom-selectors/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-custom-selectors/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-custom-selectors/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/postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class/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/postcss-discard-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz", + "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz", + "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz", + "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz", + "integrity": "sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-double-position-gradients/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-double-position-gradients/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-double-position-gradients/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/postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-env-function/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-env-function/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-env-function/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/postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-focus-visible/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-focus-visible/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-focus-visible/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/postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-focus-within/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-focus-within/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-focus-within/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/postcss-font-variant": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", + "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-font-variant/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-font-variant/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-font-variant/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/postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-gap-properties/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-gap-properties/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-gap-properties/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/postcss-html": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz", + "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==", + "dev": true, + "dependencies": { + "htmlparser2": "^3.10.0" + }, + "peerDependencies": { + "postcss": ">=5.0.0", + "postcss-syntax": ">=0.36.0" + } + }, + "node_modules/postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-image-set-function/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-image-set-function/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-image-set-function/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/postcss-import": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz", + "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-initial": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", + "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-initial/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-initial/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-initial/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/postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "dev": true, + "dependencies": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-lab-function/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-lab-function/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-lab-function/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/postcss-less": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", + "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">=6.14.4" + } + }, + "node_modules/postcss-less/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-logical/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-logical/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-logical/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/postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-media-minmax/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-media-minmax/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-media-minmax/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/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", + "dev": true + }, + "node_modules/postcss-merge-longhand": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.4.tgz", + "integrity": "sha512-2lZrOVD+d81aoYkZDpWu6+3dTAAGkCKbV5DoRhnIR7KOULVrI/R7bcMjhrH9KTRy6iiHKqmtG+n/MMj1WmqHFw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0", + "stylehacks": "^5.0.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.3.tgz", + "integrity": "sha512-cEKTMEbWazVa5NXd8deLdCnXl+6cYG7m2am+1HzqH0EnTdy8fRysatkaXb2dEnR+fdaDxTvuZ5zoBdv6efF6hg==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^2.0.1", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz", + "integrity": "sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.3.tgz", + "integrity": "sha512-Z91Ol22nB6XJW+5oe31+YxRsYooxOdFKcbOqY/V8Fxse1Y3vqlNRpi1cxCqoACZTQEhl+xvt4hsbWiV5R+XI9Q==", + "dev": true, + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.2.tgz", + "integrity": "sha512-qJAPuBzxO1yhLad7h2Dzk/F7n1vPyfHfCCh5grjGfjhi1ttCnq4ZXGIW77GSrEbh9Hus9Lc/e/+tB4vh3/GpDg==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.2", + "browserslist": "^4.16.6", + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz", + "integrity": "sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-nesting/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-nesting/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/postcss-normalize-charset": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz", + "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz", + "integrity": "sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz", + "integrity": "sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz", + "integrity": "sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz", + "integrity": "sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz", + "integrity": "sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz", + "integrity": "sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.3.tgz", + "integrity": "sha512-qWiUMbvkRx3kc1Dp5opzUwc7MBWZcSDK2yofCmdvFBCpx+zFPkxBC1FASQ59Pt+flYfj/nTZSkmF56+XG5elSg==", + "dev": true, + "dependencies": { + "is-absolute-url": "^3.0.3", + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz", + "integrity": "sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz", + "integrity": "sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-overflow-shorthand/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-overflow-shorthand/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-overflow-shorthand/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/postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-page-break/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-page-break/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-page-break/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/postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-place/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-place/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-place/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/postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "dev": true, + "dependencies": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-preset-env/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-preset-env/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-preset-env/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/postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-pseudo-class-any-link/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/postcss-reduce-initial": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.2.tgz", + "integrity": "sha512-v/kbAAQ+S1V5v9TJvbGkV98V2ERPdU6XvMcKMjqAlYiJ2NtsHGlKYLPjWWcXlaTKNxooId7BGxeraK8qXvzKtw==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz", + "integrity": "sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-replace-overflow-wrap/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-replace-overflow-wrap/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-replace-overflow-wrap/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/postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", + "dev": true + }, + "node_modules/postcss-safe-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.26" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-safe-parser/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-safe-parser/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/postcss-sass": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz", + "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==", + "dev": true, + "dependencies": { + "gonzales-pe": "^4.3.0", + "postcss": "^7.0.21" + } + }, + "node_modules/postcss-sass/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-sass/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/postcss-scss": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz", + "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-scss/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-scss/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/postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-selector-matches/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-selector-matches/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-selector-matches/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/postcss-selector-not": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", + "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-selector-not/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/postcss-selector-not/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-selector-not/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/postcss-selector-parser": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.7.tgz", + "integrity": "sha512-U+b/Deoi4I/UmE6KOVPpnhS7I7AYdKbhGcat+qTQ27gycvaACvNEw11ba6RrkwVmDVRW7sigWgLj4/KbbJjeDA==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.3.tgz", + "integrity": "sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-syntax": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", + "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", + "dev": true, + "peerDependencies": { + "postcss": ">=5.0.0" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.2.tgz", + "integrity": "sha512-w3zBVlrtZm7loQWRPVC0yjUwwpty7OM6DnEHkxcSQXO1bMS3RJ+JUS5LFMSDZHJcvGsRwhZinCWVqn8Kej4EDA==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "node_modules/postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "dev": true, + "dependencies": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=6.14.4" + } + }, + "node_modules/postcss/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==" + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", + "bin": { + "printj": "bin/printj.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "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==" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/properties-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/properties-parser/-/properties-parser-0.3.1.tgz", + "integrity": "sha1-ExbpU5/7/ZOEXjabIRAiq9R4dxo=", + "dev": true, + "dependencies": { + "string.prototype.codepointat": "^0.2.0" + }, + "engines": { + "node": ">= 0.3.1" + } + }, + "node_modules/protractor": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", + "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==", + "dev": true, + "dependencies": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.1.7", + "yargs": "^15.3.1" + }, + "bin": { + "protractor": "bin/protractor", + "webdriver-manager": "bin/webdriver-manager" + }, + "engines": { + "node": ">=10.13.x" + } + }, + "node_modules/protractor/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/protractor/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/protractor/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/protractor/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/protractor/node_modules/cliui/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/protractor/node_modules/del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "dependencies": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/protractor/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/protractor/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/protractor/node_modules/globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/protractor/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/protractor/node_modules/is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/protractor/node_modules/is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/protractor/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/protractor/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/protractor/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/protractor/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/protractor/node_modules/q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/protractor/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/protractor/node_modules/source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "dependencies": { + "source-map": "^0.5.6" + } + }, + "node_modules/protractor/node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/string-width/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/protractor/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/protractor/node_modules/webdriver-manager": { + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", + "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", + "dev": true, + "dependencies": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + }, + "bin": { + "webdriver-manager": "bin/webdriver-manager" + }, + "engines": { + "node": ">=6.9.x" + } + }, + "node_modules/protractor/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/protractor/node_modules/wrap-ansi/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/protractor/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", + "dependencies": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/proxy-agent/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/proxy-agent/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "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==", + "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/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "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/raw-body/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/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/read-chunk": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz", + "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "with-open-file": "^0.1.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-package-json-fast": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/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/read-pkg-up/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/read-pkg-up/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/read-pkg-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/read-pkg-up/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/read-pkg/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dev": true, + "dependencies": { + "minimatch": "3.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "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": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "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/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.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.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "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/remark": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", + "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", + "dev": true, + "dependencies": { + "remark-parse": "^9.0.0", + "remark-stringify": "^9.0.0", + "unified": "^9.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "dev": true, + "dependencies": { + "mdast-util-from-markdown": "^0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", + "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", + "dev": true, + "dependencies": { + "mdast-util-to-markdown": "^0.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "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-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=8.9" + }, + "peerDependencies": { + "rework": "1.0.1", + "rework-visit": "1.0.0" + }, + "peerDependenciesMeta": { + "rework": { + "optional": true + }, + "rework-visit": { + "optional": true + } + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "engines": { + "node": "0.12.* || 4.* || 6.* || >= 7.*" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, + "node_modules/rxjs": { + "version": "6.6.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.6.tgz", + "integrity": "sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "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==" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.44.0.tgz", + "integrity": "sha512-0hLREbHFXGQqls/K8X+koeP+ogFRPF4ZqetVB19b7Cst9Er8cOR0rc6RU7MaI4W1JmUShd1BPgPoeqmmgMMYFw==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/sass-loader": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", + "integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==", + "dev": true, + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "dev": true, + "dependencies": { + "https-proxy-agent": "^2.2.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/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/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "node_modules/selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "dependencies": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "engines": { + "node": ">= 6.9.0" + } + }, + "node_modules/selenium-webdriver/node_modules/tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dev": true, + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "bin": { + "semver": "bin/semver" + } + }, + "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/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": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-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/set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "node_modules/simctl": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/simctl/-/simctl-2.0.3.tgz", + "integrity": "sha512-kKCak0yszxHae5eVWcmrjV3ouUGac3sjlhjdLWpyPu4eiQcWoHsCrqS34kkgzHN8Ystqkh/LFjzrldk/g3BYJg==", + "dev": true, + "dependencies": { + "shelljs": "^0.8.5", + "tail": "^0.4.0" + } + }, + "node_modules/simple-plist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.0.0.tgz", + "integrity": "sha512-043L2rO80LVF7zfZ+fqhsEkoJFvW8o59rt/l4ctx1TJWoTx7/jkiS1R5TatD15Z1oYnuLJytzE7gcnnBuIPL2g==", + "dependencies": { + "bplist-creator": "0.0.7", + "bplist-parser": "0.1.1", + "plist": "^3.0.1" + } + }, + "node_modules/skwas-cordova-plugin-datetimepicker": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/skwas-cordova-plugin-datetimepicker/-/skwas-cordova-plugin-datetimepicker-2.1.2.tgz", + "integrity": "sha512-0j/tDjheurvNIg26MVFFbi4RMK2jipYmX6nUq3AOcNtENY1hhLaLUsUM633bJgQmCJGM//gbQWmQX2eaCHK34A==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/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/snapdragon/node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/socket.io": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.0.tgz", + "integrity": "sha512-bnpJxswR9ov0Bw6ilhCvO38/1WPtE3eA2dtxi2Iq4/sFebiDJQzgKNYA7AuVVdGW09nrESXd90NbZqtDd9dzRQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.1.0", + "socket.io-adapter": "~2.3.3", + "socket.io-parser": "~4.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", + "dev": true + }, + "node_modules/socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dev": true, + "dependencies": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/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/socket.io/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/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/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", + "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", + "dev": true, + "dependencies": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.3" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs-client/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "dependencies": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + }, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socks-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/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.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/source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.0.tgz", + "integrity": "sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.2", + "source-map-js": "^0.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "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/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/sourcemap-codec": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", + "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.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/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/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/spdy-transport/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/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/specificity": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", + "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", + "dev": true, + "bin": { + "specificity": "bin/specificity" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/split2/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ssh-config": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/ssh-config/-/ssh-config-1.1.6.tgz", + "integrity": "sha512-ZPO9rECxzs5JIQ6G/2EfL1I9ho/BVZkx9HRKn8+0af7QgwAmumQ7XBFP1ggMyPMo+/tUbmv0HFdv4qifdO/9JA==" + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/streamroller": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", + "dev": true, + "dependencies": { + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/streamroller/node_modules/date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/streamroller/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/streamroller/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/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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/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==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.codepointat": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", + "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==", + "dev": true + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/style-loader": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.2.1.tgz", + "integrity": "sha512-1k9ZosJCRFaRbY6hH49JFlRB0fVSbmnyq1iTPjNxUmGVjBNEmwrrHPenhlp+Lgo51BojHSf6pl2FcqYaN3PfVg==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", + "dev": true + }, + "node_modules/stylehacks": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", + "integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.0", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/stylelint": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.12.0.tgz", + "integrity": "sha512-P8O1xDy41B7O7iXaSlW+UuFbE5+ZWQDb61ndGDxKIt36fMH50DtlQTbwLpFLf8DikceTAb3r6nPrRv30wBlzXw==", + "dev": true, + "dependencies": { + "@stylelint/postcss-css-in-js": "^0.37.2", + "@stylelint/postcss-markdown": "^0.36.2", + "autoprefixer": "^9.8.6", + "balanced-match": "^1.0.0", + "chalk": "^4.1.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "execall": "^2.0.0", + "fast-glob": "^3.2.5", + "fastest-levenshtein": "^1.0.12", + "file-entry-cache": "^6.0.1", + "get-stdin": "^8.0.0", + "global-modules": "^2.0.0", + "globby": "^11.0.2", + "globjoin": "^0.1.4", + "html-tags": "^3.1.0", + "ignore": "^5.1.8", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "known-css-properties": "^0.21.0", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "mathml-tag-names": "^2.1.3", + "meow": "^9.0.0", + "micromatch": "^4.0.2", + "normalize-selector": "^0.2.0", + "postcss": "^7.0.35", + "postcss-html": "^0.36.0", + "postcss-less": "^3.1.4", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^4.0.2", + "postcss-sass": "^0.4.4", + "postcss-scss": "^2.1.1", + "postcss-selector-parser": "^6.0.4", + "postcss-syntax": "^0.36.2", + "postcss-value-parser": "^4.1.0", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "specificity": "^0.4.1", + "string-width": "^4.2.2", + "strip-ansi": "^6.0.0", + "style-search": "^0.1.0", + "sugarss": "^2.0.0", + "svg-tags": "^1.0.0", + "table": "^6.0.7", + "v8-compile-cache": "^2.2.0", + "write-file-atomic": "^3.0.3" + }, + "bin": { + "stylelint": "bin/stylelint.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz", + "integrity": "sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==", + "dev": true, + "peerDependencies": { + "stylelint": ">=10.1.0" + } + }, + "node_modules/stylelint-config-standard": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-20.0.0.tgz", + "integrity": "sha512-IB2iFdzOTA/zS4jSVav6z+wGtin08qfj+YyExHB3LF9lnouQht//YyB0KZq9gGz5HNPkddHOzcY8HsUey6ZUlA==", + "dev": true, + "dependencies": { + "stylelint-config-recommended": "^3.0.0" + }, + "peerDependencies": { + "stylelint": ">=10.1.0" + } + }, + "node_modules/stylelint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "dev": true, + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/stylelint/node_modules/caniuse-lite": { + "version": "1.0.30001165", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz", + "integrity": "sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA==", + "dev": true + }, + "node_modules/stylelint/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/stylelint/node_modules/chalk/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/stylelint/node_modules/chalk/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/stylelint/node_modules/chalk/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/stylelint/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/stylelint/node_modules/cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stylelint/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/stylelint/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/stylelint/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/stylelint/node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylelint/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/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/stylelint/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/stylelint/node_modules/parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/stylelint/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/stylelint/node_modules/postcss-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylelint/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/stylelint/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/stylelint/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/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/stylus": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.55.0.tgz", + "integrity": "sha512-MuzIIVRSbc8XxHH7FjkvWqkIcr1BvoMZoR/oFuAJDlh7VSaNJzrB4uJ38GRQa+mWjLXODAMzeDe0xi9GYbGwnw==", + "dev": true, + "dependencies": { + "css": "^3.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stylus-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.2.0.tgz", + "integrity": "sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.7", + "klona": "^2.0.4", + "normalize-path": "^3.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "stylus": ">=0.52.4", + "webpack": "^5.0.0" + } + }, + "node_modules/stylus-loader/node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylus-loader/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/stylus-loader/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/stylus-loader/node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/stylus/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/stylus/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stylus/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/sugarss": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", + "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/sugarss/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/sugarss/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/superagent": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.3.1.tgz", + "integrity": "sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==", + "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 7.0.0" + } + }, + "node_modules/superagent-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-3.0.0.tgz", + "integrity": "sha512-wAlRInOeDFyd9pyonrkJspdRAxdLrcsZ6aSnS+8+nu4x1aXbz6FWSTT9M6Ibze+eG60szlL7JA8wEIV7bPWuyQ==", + "dependencies": { + "debug": "^4.3.2", + "proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "superagent": ">= 0.15.4 || 1 || 2 || 3" + } + }, + "node_modules/superagent-proxy/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent-proxy/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/superagent/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/superagent/node_modules/qs": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.2.tgz", + "integrity": "sha512-mSIdjzqznWgfd4pMii7sHtaYF8rx8861hBO80SraY5GT0XQibWZWJSid0avzHGkDIZLImux2S5mXO0Hfct2QCw==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/superagent/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/superagent/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/table": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", + "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "dev": true, + "dependencies": { + "ajv": "^7.0.2", + "lodash": "^4.17.20", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.1.tgz", + "integrity": "sha512-+nu0HDv7kNSOua9apAVc979qd932rrZeb3WOvoiD31A/p1mIE5/9bN2027pE2rOPYEdS3UHzsvof4hY+lM9/WQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/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/table/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/table/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/table/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/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/tail": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/tail/-/tail-0.4.0.tgz", + "integrity": "sha1-0p3nJ1DMmdseBTr/E8NZ7PtxMAI=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "acorn": "^8.5.0" + }, + "peerDependenciesMeta": { + "acorn": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz", + "integrity": "sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g==", + "dev": true, + "dependencies": { + "jest-worker": "^27.0.6", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/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-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/terser/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/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-node": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", + "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==", + "dev": true, + "dependencies": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + }, + "bin": { + "ts-node": "dist/bin.js" + }, + "engines": { + "node": ">=4.2.0" + }, + "peerDependencies": { + "typescript": ">=2.0" + } + }, + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/tslint": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" + } + }, + "node_modules/tslint/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-assert": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.8.tgz", + "integrity": "sha512-5NkbXZUlmCE73Fs7gvkp1XXJWHYetPkg60QnQ2NXQmBYNFxbBr2zA8GCtaH4K2s2WhOmSlgiSTmrjrcm5tnM5g==", + "dev": true + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dev": true, + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/unified/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/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unist-util-find-all-after": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz", + "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==", + "dev": true, + "dependencies": { + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.4.tgz", + "integrity": "sha512-3dF39j/u423v4BBQrk1AQ2Ve1FxY5W3JKwXxVFzBODQ6WEvccguhgp802qQLKSnxPODE6WuRZtV+ohlUg4meBA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "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/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.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=" + }, + "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/uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "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/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "dependencies": { + "builtins": "^1.0.3" + } + }, + "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/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/vm2": { + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.5.tgz", + "integrity": "sha512-LuCAHZN75H9tdrAiLFf030oW7nJV5xwNMuk1ymOZwopmuK3d2H4L1Kv4+GFHgarKiLfXXLFU+7LDABHnwOkWng==", + "bin": { + "vm2": "bin/vm2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "dev": true, + "dependencies": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + }, + "engines": { + "node": ">=6.9.x" + } + }, + "node_modules/webpack": { + "version": "5.65.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.65.0.tgz", + "integrity": "sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.8.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.2" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.2.2.tgz", + "integrity": "sha512-DjZyYrsHhkikAFNvSNKrpnziXukU1EChFAh9j4LAm6ndPLPW8cN0KhM7T+RAiOqsQ6ABfQ8hoKIs9IWMTjov+w==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.6.0.tgz", + "integrity": "sha512-oojcBIKvx3Ya7qs1/AVWHDgmP1Xml8rGsEBnSobxU/UJSX1xP1GPM3MwsAnDzvqcVmVki8tV7lbcsjEjk0PtYg==", + "dev": true, + "dependencies": { + "ansi-html-community": "^0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^3.5.2", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "default-gateway": "^6.0.3", + "del": "^6.0.0", + "express": "^4.17.1", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.0", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "portfinder": "^1.0.28", + "schema-utils": "^4.0.0", + "selfsigned": "^1.10.11", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "spdy": "^4.0.2", + "strip-ansi": "^7.0.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^5.2.1", + "ws": "^8.1.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/webpack-dev-server/node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-log/node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "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-subresource-integrity": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.2.tgz", + "integrity": "sha512-GBWYBoyalbo5YClwWop9qe6Zclp8CIXYGIz12OPclJhIrSplDxs1Ls1JDMH8xBPPrg1T6ISaTW9Y6zOrwEiAzw==", + "dev": true, + "dependencies": { + "webpack-sources": "^1.3.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 2.21.0 < 5", + "webpack": ">= 1.12.11 < 6" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack/node_modules/webpack-sources": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz", + "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/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.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/windows-release": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", + "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", + "dependencies": { + "execa": "^4.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/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==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/windows-release/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/windows-release/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==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/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==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/windows-release/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/windows-release/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==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/windows-release/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/windows-release/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/with-open-file": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz", + "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==", + "dev": true, + "dependencies": { + "p-finally": "^1.0.0", + "p-try": "^2.1.0", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "engines": { + "node": ">=0.8" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "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/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/wrap-ansi/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/wrap-ansi/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/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/wrap-ansi/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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz", + "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xcode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-2.0.0.tgz", + "integrity": "sha512-5xF6RCjAdDEiEsbbZaS/gBRt3jZ/177otZcpoLCjGN/u1LrfgH7/Sgeeavpr/jELpyDqN2im3AKosl2G2W8hfw==", + "dependencies": { + "simple-plist": "^1.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/xlsx": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.17.4.tgz", + "integrity": "sha512-9aKt8g9ZLP0CUdBX8L5xnoMDFwSiLI997eQnDThCaqQMYB9AEBIRzblSSNN/ICMGLYIHUO3VKaItcedZJ3ijIg==", + "dependencies": { + "adler-32": "~1.2.0", + "cfb": "^1.1.4", + "codepage": "~1.15.0", + "crc-32": "~1.2.0", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xml-escape": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xml-escape/-/xml-escape-1.1.0.tgz", + "integrity": "sha1-OQTBQ/qOs6ADDsZG0pAqLxtwbEQ=", + "dev": true + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "deprecated": "Deprecated due to CVE-2021-21366 resolved in 0.5.0", + "engines": { + "node": ">=0.1" + } + }, + "node_modules/xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "engines": { + "node": "*" + } + }, + "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/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "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/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/yargs/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/yargs/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/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/yargs/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/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/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/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/yargs/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/yargs/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/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zone.js": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz", + "integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==", + "dependencies": { + "tslib": "^2.0.0" + } + }, + "node_modules/zone.js/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + }, "dependencies": { "@ampproject/remapping": { "version": "1.0.2", @@ -1001,7 +29803,6 @@ "version": "13.1.0", "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.1.0.tgz", "integrity": "sha512-l5qE3e+I/ogjVtXVHK0VoBOTE7N71dUcshI7Cvh5J7dFLKqbkYIr9xAP1D1tEVR6h9mzOVP5qD/M5ylR51rrOA==", - "dev": true, "requires": { "tslib": "^2.3.0" } @@ -3291,7 +32092,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/android-permissions/-/android-permissions-5.33.1.tgz", "integrity": "sha512-IlyvC8KTwjKNZvVWYI6/sPPgFxgQscJPTBhv90qFH5QOt7DZQLoGviiQC6wXSvybEnbP3YvDdXTGKKrFbS9k4w==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3306,7 +32107,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/app-minimize/-/app-minimize-5.33.1.tgz", "integrity": "sha512-RvMUP85BfZKQGwxz7uVJVb5BHbgkIy4U7mSsJRX3b7QzQDfxGZ2Ud9YY4rcpSUA3fGujJqHgtkvoaGknxugx1g==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3321,7 +32122,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/app-version/-/app-version-5.33.1.tgz", "integrity": "sha512-Mx4zBq1RpMOrazPaN/B4ToJBxmOtzFVG5wGjeTSovVaOzFiz8Dct7H6hwVScifIABOEA0i2gtqtwuSylJzTGWA==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3336,7 +32137,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/camera/-/camera-5.33.1.tgz", "integrity": "sha512-mu234nKCjVziPUFD4EYfz4XbCZqV4uKLQf1IEd4YtPAe9ooYt/1HLcvftK8+BNVfWm8JrDtWSmvvmHZalHxXuA==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3351,7 +32152,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/core/-/core-5.33.1.tgz", "integrity": "sha512-BmjQqMzm6JE2V9Kj07cTA27frm516KMAViSpRNi4MQxPm9lHp9mxBGFDa4pqS/C0G8lA2kVh40fEZA0nOH9w+g==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3366,7 +32167,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/deeplinks/-/deeplinks-5.33.1.tgz", "integrity": "sha512-NMO1iT89+42I2ryeMJSpDN8mrISj6NikCr9/iPxA5oBQzxv4eYtJqK1Ns5p28B1d3WZuB107WKYWqe9Z/jyHRw==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3381,7 +32182,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/device/-/device-5.33.1.tgz", "integrity": "sha512-TupgwI9ys7baznAMVl75/giPSN/tgaC/AKzB6gOObEMWr9tzdmYxywstmsyVPCFy8MvXRO7KKfdmxG/Lg5FrWg==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" } }, "@ionic-native/file": { @@ -3389,7 +32190,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/file/-/file-5.33.1.tgz", "integrity": "sha512-N6tvCmLBYnY+fDeEhI+7kYHuIVcZ/JtrhRIepJ9qpF82DTvMg0fXy5XToKZ5hqthbKAwci8//A8Etp0oBzjx+w==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3404,7 +32205,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/file-chooser/-/file-chooser-5.33.1.tgz", "integrity": "sha512-I5BfFkRnVlUs/EFFhaP2ou854gih+wSHNbDxa6X2rx0KEgoqSSl0KtAHkUwpKcpvss1ZlsQ65kcs5bR93yZuvA==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3419,7 +32220,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/file-path/-/file-path-5.33.1.tgz", "integrity": "sha512-hFnvWsou1XRtt/OlxzpJos6Xii54oxCpnF6/pM2zQGBVMGaNoBgRnBsL+GtlycJmQqp/tZJAy4JDcanflHaTtg==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3434,7 +32235,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/file-picker/-/file-picker-5.33.1.tgz", "integrity": "sha512-2xVzncPUMsEludy9olGp7Z2a3nLmIiY7PvAaWQvEO4/hbwPZRezJUpFZoNbQm1rrnic915oM+FxokUKI611Xzw==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3449,7 +32250,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/file-transfer/-/file-transfer-5.34.0.tgz", "integrity": "sha512-6jmT7tlh3A+H9OW+wpWbCNK+AOuVBUF+74NSrbmbqYg5py/VzMROCJtU84pb0OnBsqnxVvXqwPmodLwYMNFXBg==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3464,7 +32265,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/geolocation/-/geolocation-5.33.1.tgz", "integrity": "sha512-eQhFxeefK3fjwVyLs94jThc2y9s5qfk7QKX6BGfJTkGf3IOyZyBmFSepHF4kAQ8x1E4pa9KhhH35bZc+5NjkZA==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3479,7 +32280,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/globalization/-/globalization-5.33.1.tgz", "integrity": "sha512-DNY1UP8VAEIDYeJjz1rvMEJoeO+GvpPwdO/YlODlASVi/H7s7ZwOMO5giFPz49KG6fw1VAvqqyWxHTngm8mG1w==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3494,7 +32295,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/image-picker/-/image-picker-5.33.1.tgz", "integrity": "sha512-18b5XYf6l0xu0AGGqsib1qgcMkxwssFMK5rz3Ih+DvLH0M9g+gPocofIpSko689KsBmAy/UDxJv8Nr81egPTJQ==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3509,7 +32310,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/in-app-browser/-/in-app-browser-5.33.1.tgz", "integrity": "sha512-WDy4ogZdPPjM8WoE6cOx+odIMhW9Pupv2eIIW1KdSsNWCwV/WL+oqFquxDvvUoaNGWosyVvziYdPU4dk6pZN/A==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3524,7 +32325,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/insomnia/-/insomnia-5.33.1.tgz", "integrity": "sha512-6qgNdEg78/k3fHaEdHDxB4ftNBSCRKPjfXiOFlaj2YwODuYCP+AXtSTRxSBNO1lU6Aid/NuPLdTp98lKq4qTVg==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3539,7 +32340,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/keyboard/-/keyboard-5.33.1.tgz", "integrity": "sha512-IDNcF2iJ+ze2qPyPgWJ5TkwP5txS6uv9gan8LkxK3zTBKznQvRhznZHbx5fXluehYa1gQZp43BOoXc/PwpT7UA==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3554,7 +32355,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/screen-orientation/-/screen-orientation-5.36.0.tgz", "integrity": "sha512-+VILGrCJO76Ta6Mudd6IKc66xDek1uw5OEovFWjGCqkg0OYHFIiJFZNx4NLhF5hA1UKN2fWE6qDJaSXR+1w1Rg==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3569,7 +32370,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/social-sharing/-/social-sharing-5.33.1.tgz", "integrity": "sha512-tlBNgqESB0dxKoYY61DhTx+4oP25yAGpLynS8JZ3St0vD2VjfQ//2+uVxpo8G3E2A4mEcv7+TWQ1++STphXlRw==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3584,7 +32385,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/splash-screen/-/splash-screen-5.33.1.tgz", "integrity": "sha512-tSrWkm+hIgc049bRHbUDRIxxNi201LFMxD9CL78h8XzJGb+FJkkxxfA6dsCI60zm2tPOeC42ronBqss99mxeEQ==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3599,7 +32400,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/status-bar/-/status-bar-5.33.1.tgz", "integrity": "sha512-fdmLSsPnZCZERjoxzeRTB1quxf7ntqD6xdt1zB0A9FaZ7zFgEq0+RibasWXqEi/oYzqNgN35rV0FvMyGXPzw3g==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -3614,7 +32415,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/three-dee-touch/-/three-dee-touch-5.33.1.tgz", "integrity": "sha512-Ujh+kbCebCSIdAOmbEOdBCjVoRryjjYWsC1cG6Wj4j6KVZJcmO9BlENN8qskkWiLKwT2rbXrod0cfgAal8QGXA==", "requires": { - "@types/cordova": "^0.0.34" + "@types/cordova": "latest" }, "dependencies": { "@types/cordova": { @@ -4229,7 +33030,8 @@ "version": "12.2.14", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.14.tgz", "integrity": "sha512-dla6JgLWKAo7k4K3O+ouo104wO3BFs+MIOCXoGF4Lp/1pKPSt0orYmvZFBkDZPmyBFYRw9wpL2WHnAAyip40Cw==", - "dev": true + "dev": true, + "requires": {} }, "agent-base": { "version": "6.0.2", @@ -5774,7 +34576,8 @@ "version": "7.5.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -6429,7 +35232,8 @@ "version": "13.1.1", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.1.1.tgz", "integrity": "sha512-TGCuscGFNHPoXScswuj9UxNv8E+A/PXs5XH8cyTtbkmlpBec1EShnaUTdDP5nhykjjaWzd3TLChlp9DinE+Ctg==", - "dev": true + "dev": true, + "requires": {} }, "@ngx-translate/core": { "version": "11.0.1", @@ -7058,9 +35862,9 @@ } }, "@wisdomgarden/cordova-plugin-filepath": { - "version": "git+https://github.com/wisdom-garden/cordova-plugin-filepath.git#50d756e125eb4c95a357bd11137b3eafbee199b0", - "from": "git+https://github.com/wisdom-garden/cordova-plugin-filepath.git", - "dev": true + "version": "git+ssh://git@github.com/wisdom-garden/cordova-plugin-filepath.git#50d756e125eb4c95a357bd11137b3eafbee199b0", + "dev": true, + "from": "@wisdomgarden/cordova-plugin-filepath@git+https://github.com/wisdom-garden/cordova-plugin-filepath.git" }, "@xtuc/ieee754": { "version": "1.2.0", @@ -7112,7 +35916,8 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true + "dev": true, + "requires": {} }, "adjust-sourcemap-loader": { "version": "4.0.0", @@ -7155,7 +35960,8 @@ "ag-virtual-scroll": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ag-virtual-scroll/-/ag-virtual-scroll-1.3.0.tgz", - "integrity": "sha512-xaydiezPggIH+ukZ6mXGhPsQuDQkTQdQrPekfuSI+iE2Yst/mlk+2FvzsgyS2StWGSYgHm+SyRYZrNi7zVRY4A==" + "integrity": "sha512-xaydiezPggIH+ukZ6mXGhPsQuDQkTQdQrPekfuSI+iE2Yst/mlk+2FvzsgyS2StWGSYgHm+SyRYZrNi7zVRY4A==", + "requires": {} }, "agent-base": { "version": "4.3.0", @@ -7228,7 +36034,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true + "dev": true, + "requires": {} }, "ajv-formats": { "version": "2.1.0", @@ -7263,7 +36070,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "alphanum-sort": { "version": "1.0.2", @@ -8230,17 +37038,20 @@ "chartjs-adapter-luxon": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/chartjs-adapter-luxon/-/chartjs-adapter-luxon-1.1.0.tgz", - "integrity": "sha512-CS+xBWEyXYVLBZ3dSY/MwlSXhz8er4JjkApazY84ft/++oOLsmkt6TaXBCsUFudum7QdoYmpxiL/gSp20+emkw==" + "integrity": "sha512-CS+xBWEyXYVLBZ3dSY/MwlSXhz8er4JjkApazY84ft/++oOLsmkt6TaXBCsUFudum7QdoYmpxiL/gSp20+emkw==", + "requires": {} }, "chartjs-plugin-annotation": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/chartjs-plugin-annotation/-/chartjs-plugin-annotation-1.3.0.tgz", - "integrity": "sha512-TF2Y+ZYnz5TdSmyU1WIeWqXXcIS+3GfWkJOrdovd/JgdLzKxw7/paj01FVeAtTzfRPdc6dy/zQERoBdYSstYsw==" + "integrity": "sha512-TF2Y+ZYnz5TdSmyU1WIeWqXXcIS+3GfWkJOrdovd/JgdLzKxw7/paj01FVeAtTzfRPdc6dy/zQERoBdYSstYsw==", + "requires": {} }, "chartjs-plugin-streaming": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chartjs-plugin-streaming/-/chartjs-plugin-streaming-2.0.0.tgz", - "integrity": "sha512-oBwHRmovGbPDS1h8PhpttnlKjI6eiJO13v4h+xz+mfbHhIc+iNF9xuMobCIFMKFH7rlVWi5TJAOIxoXyGElYYg==" + "integrity": "sha512-oBwHRmovGbPDS1h8PhpttnlKjI6eiJO13v4h+xz+mfbHhIc+iNF9xuMobCIFMKFH7rlVWi5TJAOIxoXyGElYYg==", + "requires": {} }, "chartjs-plugin-zoom": { "version": "1.2.0", @@ -8422,7 +37233,8 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", - "dev": true + "dev": true, + "requires": {} }, "class-utils": { "version": "0.3.6", @@ -9325,9 +38137,9 @@ "integrity": "sha512-m7cughw327CjONN/qjzsTpSesLaeybksQh420/gRuSXJX5Zt9NfgsSbqqKDon6jnQ9Mm7h7imgyO2uJ34XMBtA==" }, "cordova-plugin-file-transfer": { - "version": "github:dpa99c/cordova-plugin-file-transfer#2cdb0403a81821e144998c8d9a00d338d6ece3ee", - "from": "github:dpa99c/cordova-plugin-file-transfer", - "dev": true + "version": "git+ssh://git@github.com/dpa99c/cordova-plugin-file-transfer.git#2cdb0403a81821e144998c8d9a00d338d6ece3ee", + "dev": true, + "from": "cordova-plugin-file-transfer@github:dpa99c/cordova-plugin-file-transfer" }, "cordova-plugin-filechooser": { "version": "1.2.0", @@ -10018,7 +38830,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-2.0.1.tgz", "integrity": "sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==", - "dev": true + "dev": true, + "requires": {} }, "csso": { "version": "4.2.0", @@ -10538,7 +39351,8 @@ "version": "8.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -11461,9 +40275,9 @@ } }, "fttx-phonegap-plugin-barcodescanner": { - "version": "github:fttx/phonegap-plugin-barcodescanner#92d7e25631760f2db02e9fb42769d30b5ccc325f", - "from": "github:fttx/phonegap-plugin-barcodescanner", + "version": "git+ssh://git@github.com/fttx/phonegap-plugin-barcodescanner.git#92d7e25631760f2db02e9fb42769d30b5ccc325f", "dev": true, + "from": "fttx-phonegap-plugin-barcodescanner@github:fttx/phonegap-plugin-barcodescanner", "requires": { "nopt": "^4.0.1", "shelljs": "^0.8.3" @@ -12133,7 +40947,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true + "dev": true, + "requires": {} }, "ieee754": { "version": "1.2.1", @@ -13527,7 +42342,8 @@ "version": "1.5.4", "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", - "dev": true + "dev": true, + "requires": {} }, "karma-source-map-support": { "version": "1.4.0", @@ -16108,25 +44924,29 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz", "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==", - "dev": true + "dev": true, + "requires": {} }, "postcss-discard-duplicates": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz", "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==", - "dev": true + "dev": true, + "requires": {} }, "postcss-discard-empty": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz", "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==", - "dev": true + "dev": true, + "requires": {} }, "postcss-discard-overridden": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz", "integrity": "sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==", - "dev": true + "dev": true, + "requires": {} }, "postcss-double-position-gradients": { "version": "1.0.0", @@ -16640,7 +45460,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true + "dev": true, + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -16708,7 +45529,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz", "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==", - "dev": true + "dev": true, + "requires": {} }, "postcss-normalize-display-values": { "version": "5.0.1", @@ -17254,7 +46076,8 @@ "version": "0.36.2", "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", - "dev": true + "dev": true, + "requires": {} }, "postcss-unique-selectors": { "version": "5.0.2", @@ -17288,6 +46111,12 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true + }, "pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -19345,6 +48174,14 @@ } } }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", @@ -19376,14 +48213,6 @@ "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==", "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==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -19423,7 +48252,8 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.2.1.tgz", "integrity": "sha512-1k9ZosJCRFaRbY6hH49JFlRB0fVSbmnyq1iTPjNxUmGVjBNEmwrrHPenhlp+Lgo51BojHSf6pl2FcqYaN3PfVg==", - "dev": true + "dev": true, + "requires": {} }, "style-search": { "version": "0.1.0", @@ -19711,7 +48541,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz", "integrity": "sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==", - "dev": true + "dev": true, + "requires": {} }, "stylelint-config-standard": { "version": "20.0.0", @@ -21338,7 +50169,8 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz", "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==", - "dev": true + "dev": true, + "requires": {} }, "xcode": { "version": "2.0.0", From a7b287d7ad05d73bcb2fb9add0ec3ace44728eba Mon Sep 17 00:00:00 2001 From: Mikael Manukyan Date: Fri, 17 Jun 2022 13:10:48 -0700 Subject: [PATCH 20/78] Add support for Transducer Direct and update Popsicle (#380) * Add support for Transducer Direct and update Popsicle * clean up * fix parsing advertising data --- src/classes/devices/acaia/acaia.ts | 212 ++++---- src/classes/devices/ble.types.ts | 10 +- src/classes/devices/common/util.ts | 48 ++ src/classes/devices/index.ts | 21 +- src/classes/devices/popsiclePressure.ts | 58 +-- .../devices/pressureBluetoothDevice.ts | 21 +- .../devices/transducerDirectPressure.ts | 82 +++ .../bleManager/ble-manager.service.ts | 481 +++++++++++------- 8 files changed, 610 insertions(+), 323 deletions(-) create mode 100644 src/classes/devices/common/util.ts create mode 100644 src/classes/devices/transducerDirectPressure.ts diff --git a/src/classes/devices/acaia/acaia.ts b/src/classes/devices/acaia/acaia.ts index 8e50444de..4fe782b6d 100644 --- a/src/classes/devices/acaia/acaia.ts +++ b/src/classes/devices/acaia/acaia.ts @@ -1,13 +1,28 @@ import { Platforms } from '@ionic/core'; // Converted to TypeScript from Python from https://github.com/lucapinello/pyacaia - import { Characteristic } from '../ble.types'; -import { MAGIC1, MAGIC2, SCALE_CHARACTERISTIC_UUID, PYXIS_RX_CHARACTERISTIC_UUID, PYXIS_TX_CHARACTERISTIC_UUID } from './constants'; -import { Button, ParsedMessage, MessageType, ScaleMessageType, Units, WorkerResult, DecoderResultType } from './common'; +import { + MAGIC1, + MAGIC2, + PYXIS_RX_CHARACTERISTIC_UUID, + PYXIS_TX_CHARACTERISTIC_UUID, + SCALE_CHARACTERISTIC_UUID, +} from './constants'; +import { + Button, + DecoderResultType, + MessageType, + ParsedMessage, + ScaleMessageType, + Units, + WorkerResult, +} from './common'; import { memoize } from 'lodash'; import { UILog } from '../../../services/uiLog'; import { Logger } from '../common/logger'; import { DEBUG } from '../common/constants'; +import { to128bitUUID } from '../common/util'; + declare var ble; export enum EventType { @@ -23,7 +38,7 @@ const log = (...args) => { if (DEBUG) { try { UILog.getInstance().log(`ACAIA: ${JSON.stringify(args)}`); - } catch(e) {} + } catch (e) {} } }; @@ -34,7 +49,6 @@ class DecoderWorker { private loading: Promise; private logger: Logger; - constructor(callback: (msgs: ParsedMessage[]) => any) { this.decodeCallback = callback; this.logger = new Logger('ACAIA DecodeWorker container'); @@ -80,8 +94,12 @@ class DecoderWorker { } private handleMessage({ data }) { - this.logger.debug("Decoder sent a message", data); - if (data instanceof Object && data.hasOwnProperty('type') && data.hasOwnProperty('data')) { + this.logger.debug('Decoder sent a message', data); + if ( + data instanceof Object && + data.hasOwnProperty('type') && + data.hasOwnProperty('data') + ) { switch ((data as WorkerResult).type) { case DecoderResultType.LOG: this.logger.debug(...data.data); @@ -128,7 +146,11 @@ export class AcaiaScale { private set_interval_thread: ReturnType; private callback: (eventType: EventType, data?: any) => any; - constructor(device_id: string, platforms: Platforms[], characteristics: Characteristic[]) { + constructor( + device_id: string, + platforms: Platforms[], + characteristics: Characteristic[] + ) { /*For Pyxis-style devices, the UUIDs can be overridden. char_uuid is the command UUID, and weight_uuid is where the notify comes from. Old-style scales only specify char_uuid @@ -140,12 +162,17 @@ export class AcaiaScale { this.logger = new Logger(); // TODO(mike1808): make it to work with new Lunar and Pyxis by auto-detecting service and char uuid - this.logger.info("received charactersitics: ", JSON.stringify(characteristics)); + this.logger.info( + 'received charactersitics: ', + JSON.stringify(characteristics) + ); this.characteristics = characteristics; this.isPyxisStyle = false; if (!this.findBLEUUIDs()) { - throw new Error("Cannot find weight service and characterstics on the scale"); + throw new Error( + 'Cannot find weight service and characterstics on the scale' + ); } // this.char_uuid = SCALE_CHARACTERISTIC_UUID; @@ -164,8 +191,6 @@ export class AcaiaScale { this.auto_off = null; this.beep_on = null; this.timer_running = false; - - } public getElapsedTime(): number { @@ -194,24 +219,33 @@ export class AcaiaScale { } this.worker = new DecoderWorker(this.messageParseCallback.bind(this)); - this.logger.log("Subscribing to notifications", { device_id: this.device_id, weight_uuid: this.weight_uuid, char_uuid: this.rx_char_uuid }); + this.logger.log('Subscribing to notifications', { + device_id: this.device_id, + weight_uuid: this.weight_uuid, + char_uuid: this.rx_char_uuid, + }); //We moved this line from notifications ready to here. this.connected = true; - ble.startNotification(this.device_id, this.weight_uuid, this.rx_char_uuid, this.handleNotification.bind(this), (err) => { - this.logger.error("failed to subscribe to notifications " + JSON.stringify(err)); - this.disconnect() - .catch(this.logger.error.bind(this.logger)); - }); + ble.startNotification( + this.device_id, + this.weight_uuid, + this.rx_char_uuid, + this.handleNotification.bind(this), + (err) => { + this.logger.error( + 'failed to subscribe to notifications ' + JSON.stringify(err) + ); + this.disconnect().catch(this.logger.error.bind(this.logger)); + } + ); await this.write(new Uint8Array([0, 1]).buffer); - this.notificationsReady(); } - public disconnectTriggered() { this.logger.debug('Scale disconnect triggered'); // Class is still existing, therefore we should do something good maybe? @@ -220,18 +254,23 @@ export class AcaiaScale { public async disconnect() { this.logger.debug('Scale disconnected'); if (this.connected) { - if (this.device_id && this.weight_uuid && this.tx_char_uuid) { - this.logger.debug('Disconnect the device with its characteristics'); - // Lars - I don't know if we need this, but the problem is when the scale is disconnected via settings, or shutdown, it will crash everything. - // Try catch won't help here, because the device is already deattached. - //await promisify(ble.stopNotification)((this.device_id, this.weight_uuid, this.tx_char_uuid)); - } else { - this.logger.debug('We cant disconnect because one of the characteristics is missing' + JSON.stringify({device_id: this.device_id, weight: this.weight_uuid, char_uuid: this.tx_char_uuid})); - } - this.connected = false; - } - - + if (this.device_id && this.weight_uuid && this.tx_char_uuid) { + this.logger.debug('Disconnect the device with its characteristics'); + // Lars - I don't know if we need this, but the problem is when the scale is disconnected via settings, or shutdown, it will crash everything. + // Try catch won't help here, because the device is already deattached. + //await promisify(ble.stopNotification)((this.device_id, this.weight_uuid, this.tx_char_uuid)); + } else { + this.logger.debug( + 'We cant disconnect because one of the characteristics is missing' + + JSON.stringify({ + device_id: this.device_id, + weight: this.weight_uuid, + char_uuid: this.tx_char_uuid, + }) + ); + } + this.connected = false; + } } public tare() { @@ -280,17 +319,26 @@ export class AcaiaScale { let foundRx = false; let foundTx = false; for (const char of this.characteristics) { - if (to128bitUUID(char.characteristic) === to128bitUUID(SCALE_CHARACTERISTIC_UUID)) { + if ( + to128bitUUID(char.characteristic) === + to128bitUUID(SCALE_CHARACTERISTIC_UUID) + ) { this.rx_char_uuid = char.characteristic; this.tx_char_uuid = char.characteristic; this.weight_uuid = char.service; this.isPyxisStyle = false; foundRx = true; foundTx = true; - } else if (to128bitUUID(char.characteristic) === to128bitUUID(PYXIS_RX_CHARACTERISTIC_UUID)) { + } else if ( + to128bitUUID(char.characteristic) === + to128bitUUID(PYXIS_RX_CHARACTERISTIC_UUID) + ) { this.rx_char_uuid = char.characteristic; foundRx = true; - } else if (to128bitUUID(char.characteristic) === to128bitUUID(PYXIS_TX_CHARACTERISTIC_UUID)) { + } else if ( + to128bitUUID(char.characteristic) === + to128bitUUID(PYXIS_TX_CHARACTERISTIC_UUID) + ) { this.tx_char_uuid = char.characteristic; this.weight_uuid = char.service; this.isPyxisStyle = true; @@ -308,7 +356,6 @@ export class AcaiaScale { this.worker.addBuffer(value); this.heartbeat(); } - } private messageParseCallback(messages: ParsedMessage[]) { @@ -326,7 +373,7 @@ export class AcaiaScale { this.callback(EventType.WEIGHT, this.weight); this.logger.debug('weight: ' + msg.weight + ' ' + Date.now()); } else if (msg.msgType === ScaleMessageType.TARE_START_STOP_RESET) { - if (msg.button === "unknown") { + if (msg.button === 'unknown') { if (this.timer_running) { msg.button = Button.STOP; } else if (this.paused_time > 0) { @@ -371,29 +418,38 @@ export class AcaiaScale { } private write(data: ArrayBuffer, withoutResponse = false) { - this.logger.debug("trying to write: ", new Uint8Array(data)); + this.logger.debug('trying to write: ', new Uint8Array(data)); return new Promise((resolve) => { if (this.connected) { - ble[withoutResponse ? 'writeWithoutResponse' : 'write'](this.device_id, this.weight_uuid, this.tx_char_uuid, data, - resolve, (err) => { - this.logger.error("failed to write to characteristic, but we are ignoring it", err, withoutResponse); + ble[withoutResponse ? 'writeWithoutResponse' : 'write']( + this.device_id, + this.weight_uuid, + this.tx_char_uuid, + data, + resolve, + (err) => { + this.logger.error( + 'failed to write to characteristic, but we are ignoring it', + err, + withoutResponse + ); resolve(false); // resolve for both cases because sometimes write says it's an error but in reality it's fine } ); } else { - this.logger.debug("We didn't write, because scale wasn't connected anymore ", new Uint8Array(data)); + this.logger.debug( + "We didn't write, because scale wasn't connected anymore ", + new Uint8Array(data) + ); } - }); } private ident() { - return Promise.all( - [ - this.write(encodeId(this.isPyxisStyle), true), - this.write(encodeNotificationRequest(), true), - ] - ); + return Promise.all([ + this.write(encodeId(this.isPyxisStyle), true), + this.write(encodeNotificationRequest(), true), + ]); } private heartbeat() { @@ -407,8 +463,7 @@ export class AcaiaScale { } while (this.command_queue.length) { const packet = this.command_queue.shift(); - this.write(packet, true) - .catch(this.logger.error.bind(this.logger)); + this.write(packet, true).catch(this.logger.error.bind(this.logger)); } if (Date.now() >= this.last_heartbeat + 1000) { @@ -445,74 +500,76 @@ const encodeEventData = memoize((payload: number[]): ArrayBuffer => { }); const encodeNotificationRequest = memoize((): ArrayBuffer => { - log("encodeNotificationRequest"); + log('encodeNotificationRequest'); const payload = [ - 0, // weight - 1, // weight argument - 1, // battery - 2, // battery argument - 2, // timer - 5, // timer argument (number heartbeats between timer messages) - 3, // key - 4 // setting + 0, // weight + 1, // weight argument + 1, // battery + 2, // battery argument + 2, // timer + 5, // timer argument (number heartbeats between timer messages) + 3, // key + 4, // setting ]; return encodeEventData(payload); }); const encodeId = memoize((isPyxisStyle = false): ArrayBuffer => { - log("encodeId"); + log('encodeId'); let payload: number[]; if (isPyxisStyle) { payload = [ - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34 + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, + 0x32, 0x33, 0x34, ]; } else { payload = [ - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, ]; } return encode(11, payload); }); const encodeHeartbeat = memoize((): ArrayBuffer => { - log("encodeHeartbeat"); + log('encodeHeartbeat'); const payload = [2, 0]; return encode(0, payload); }); const encodeTare = memoize((): ArrayBuffer => { - log("encodeTare"); + log('encodeTare'); const payload = [0]; return encode(4, payload); }); const encodeGetSettings = memoize((): ArrayBuffer => { - log("encodeSettings"); + log('encodeSettings'); /* Settings are returned as a notification */ const payload = new Array(16).fill(0); return encode(6, payload); }); const encodeStartTimer = memoize((): ArrayBuffer => { - log("encodeStartTimer"); + log('encodeStartTimer'); const payload = [0, 0]; return encode(13, payload); }); const encodeStopTimer = memoize((): ArrayBuffer => { - log("encodeStopTimer"); + log('encodeStopTimer'); const payload = [0, 2]; return encode(13, payload); }); const encodeResetTimer = memoize((): ArrayBuffer => { - log("encodeResetTimer"); + log('encodeResetTimer'); const payload = [0, 1]; return encode(13, payload); }); function encode(msgType: number, payload: number[]): ArrayBuffer { - log("encode", { msgType, payload }); + log('encode', { msgType, payload }); let cksum1, cksum2, val; const bytes = new Uint8Array(5 + payload.length); bytes[0] = MAGIC1; @@ -542,18 +599,3 @@ function promisify(fn) { }); }; } - - -function to128bitUUID(uuid: string) { - // nothing to do - switch (uuid.length) { - case 4: - return `0000${uuid.toUpperCase()}-0000-1000-8000-00805F9B34FB`; - case 8: - return `${uuid.toUpperCase()}-0000-1000-8000-00805F9B34FB`; - case 36: - return uuid.toUpperCase(); - default: - throw new Error("invalid uuid: " + uuid); - } -} diff --git a/src/classes/devices/ble.types.ts b/src/classes/devices/ble.types.ts index 3f93a1e59..48f986b20 100644 --- a/src/classes/devices/ble.types.ts +++ b/src/classes/devices/ble.types.ts @@ -1,9 +1,17 @@ export type UUID = string; +export interface IOSAdvertisingData { + kCBAdvDataLocalName?: string; + kCBAdvDataManufacturerData?: ArrayBuffer; + kCBAdvDataServiceUUIDs?: string[]; + kCBAdvDataIsConnectable?: boolean; + kCBAdvDataServiceData?: { [k: string]: ArrayBuffer }; +} + export interface LimitedPeripheralData { name: string; id: string; - advertising: number[]; + advertising: ArrayBuffer | IOSAdvertisingData; rssi: number; } diff --git a/src/classes/devices/common/util.ts b/src/classes/devices/common/util.ts new file mode 100644 index 000000000..167f0b4b2 --- /dev/null +++ b/src/classes/devices/common/util.ts @@ -0,0 +1,48 @@ +import { IOSAdvertisingData } from '../ble.types'; + +export function to128bitUUID(uuid: string) { + // nothing to do + switch (uuid.length) { + case 4: + return `0000${uuid.toUpperCase()}-0000-1000-8000-00805F9B34FB`; + case 8: + return `${uuid.toUpperCase()}-0000-1000-8000-00805F9B34FB`; + case 36: + return uuid.toUpperCase(); + default: + throw new Error('invalid uuid: ' + uuid); + } +} + +export function parseAdvertisingManufacturerData( + adv: ArrayBuffer | IOSAdvertisingData +): Uint8Array | null { + if ( + adv && + 'kCBAdvDataManufacturerData' in adv && + adv.kCBAdvDataManufacturerData instanceof ArrayBuffer + ) { + return new Uint8Array(adv.kCBAdvDataManufacturerData); + } + + if (adv instanceof ArrayBuffer) { + const view = new Uint8Array(adv); + if (!view.length) { + return null; + } + + for (let i = 0; i < view.length - 1; ) { + const packetLength = view[i++]; // first byte is length + const packetType = view[i++]; // second byte is type + const dataLength = packetLength - 1; // -1 for type + + if (packetType === 0xff) { + // 0xff is manufacturer's data + return new Uint8Array(view.slice(i, i + dataLength)); + } + i += dataLength; + } + } + + return null; +} diff --git a/src/classes/devices/index.ts b/src/classes/devices/index.ts index 6dd832016..34b124afc 100644 --- a/src/classes/devices/index.ts +++ b/src/classes/devices/index.ts @@ -5,8 +5,9 @@ import DecentScale from './decentScale'; import FelicitaScale from './felicitaScale'; import JimmyScale from './jimmyScale'; import LunarScale from './lunarScale'; -import {PressureDevice} from './pressureBluetoothDevice'; +import { PressureDevice } from './pressureBluetoothDevice'; import PopsiclePressure from './popsiclePressure'; +import TransducerDirectPressure from './transducerDirectPressure'; export { BluetoothScale, SCALE_TIMER_COMMAND } from './bluetoothDevice'; export { default as DecentScale } from './decentScale'; @@ -21,10 +22,15 @@ export enum ScaleType { } export enum PressureType { - POPSICLE = 'POPSICLE' + POPSICLE = 'POPSICLE', + DIRECT = 'DIRECT', } -export function makeDevice(type: ScaleType, data: PeripheralData, platforms: Platforms[]): BluetoothScale { +export function makeDevice( + type: ScaleType, + data: PeripheralData, + platforms: Platforms[] +): BluetoothScale { switch (type) { case ScaleType.DECENT: return new DecentScale(data, platforms); @@ -39,12 +45,17 @@ export function makeDevice(type: ScaleType, data: PeripheralData, platforms: Pla } } -export function makePressureDevice(type: PressureType, data: PeripheralData, platforms: Platforms[]): PressureDevice { +export function makePressureDevice( + type: PressureType, + data: PeripheralData, + platforms: Platforms[] +): PressureDevice { switch (type) { case PressureType.POPSICLE: return new PopsiclePressure(data, platforms); + case PressureType.DIRECT: + return new TransducerDirectPressure(data, platforms); default: return null; } } - diff --git a/src/classes/devices/popsiclePressure.ts b/src/classes/devices/popsiclePressure.ts index 83b64c233..edd0b2ce0 100644 --- a/src/classes/devices/popsiclePressure.ts +++ b/src/classes/devices/popsiclePressure.ts @@ -1,27 +1,23 @@ import { Platforms } from '@ionic/core'; -import { PeripheralData } from './ble.types'; +import { LimitedPeripheralData, PeripheralData } from './ble.types'; -import { Pressure, PressureDevice } from './pressureBluetoothDevice'; +import { Pressure, PressureDevice, psiToBar } from './pressureBluetoothDevice'; +import { parseAdvertisingManufacturerData, to128bitUUID } from './common/util'; declare var ble; export default class PopsiclePressure extends PressureDevice { - public static PRESSURE_SERVICE_UUID = ''; - public static PRESSURE_CHAR_UUID = ''; + public static PRESSURE_SERVICE_UUID = '1c47e896-4922-4030-957c-32a5be64d3ba'; + public static PRESSURE_CHAR_UUID = to128bitUUID('2A6D'); - public static ZERO_SERVICE_UUID = ''; - public static ZERO_CHAR_UUID = ''; + public static ZERO_SERVICE_UUID = '1c47e896-4922-4030-957c-32a5be64d3ba'; + public static ZERO_CHAR_UUID = 'ad029632-366d-4a52-ad6b-2a52fb369d3d'; - protected Pressure: Pressure = { - actual: 0, - old: 0, - }; - - public static notification_callback(event, scale) {} - - public static test(device) { - return ( - device && device.name && device.name.toLowerCase().startsWith('popsicle') - ); + public static test(device: LimitedPeripheralData) { + const adv = + device && + device.advertising && + parseAdvertisingManufacturerData(device.advertising); + return adv && adv.length >= 2 && adv[0] === 0xea && adv[1] === 0xf0; } constructor(data: PeripheralData, platforms: Platforms[]) { @@ -29,12 +25,12 @@ export default class PopsiclePressure extends PressureDevice { this.connect(); } - public async connect() { - this.updateZero(); - await this.attachNotification(); + public connect() { + this.attachNotification(); + return this.updateZero().catch(() => {}); } - public async updateZero(): Promise { + public updateZero(): Promise { const data = new Uint8Array(1); return new Promise((resolve, reject) => { @@ -49,21 +45,25 @@ export default class PopsiclePressure extends PressureDevice { }); } - private async attachNotification() { + public disconnect() { + this.deattachNotification(); + } + + private attachNotification() { ble.startNotification( this.device_id, PopsiclePressure.PRESSURE_SERVICE_UUID, PopsiclePressure.PRESSURE_CHAR_UUID, async (_data) => { - const v = new Uint16Array(_data); - const psi = swap16(v[0]) / 10; + const v = new Float32Array(_data); + const psi = v[0]; this.setPressure(psiToBar(psi)); }, (_data) => {} ); } - private async deattachNotification() { + private deattachNotification() { ble.stopNotification( this.device_id, PopsiclePressure.PRESSURE_SERVICE_UUID, @@ -73,11 +73,3 @@ export default class PopsiclePressure extends PressureDevice { ); } } - -function psiToBar(v: number) { - return v * 0.0689476; -} - -function swap16(val) { - return ((val & 0xff) << 8) | ((val >> 8) & 0xff); -} diff --git a/src/classes/devices/pressureBluetoothDevice.ts b/src/classes/devices/pressureBluetoothDevice.ts index 99bac2e64..575db93d7 100644 --- a/src/classes/devices/pressureBluetoothDevice.ts +++ b/src/classes/devices/pressureBluetoothDevice.ts @@ -2,8 +2,6 @@ import { Platforms } from '@ionic/core'; import { PeripheralData } from './ble.types'; import { EventEmitter } from '@angular/core'; -declare var ble; - export interface Pressure { actual: number; old: number; @@ -13,7 +11,7 @@ export interface PressureChangeEvent extends Pressure { date: Date; } -export class PressureDevice { +export abstract class PressureDevice { public device_id: string; protected pressure: Pressure; protected platforms: Platforms[]; @@ -21,7 +19,7 @@ export class PressureDevice { public pressureChange: EventEmitter = new EventEmitter(); - constructor(data: PeripheralData, platforms: Platforms[]) { + protected constructor(data: PeripheralData, platforms: Platforms[]) { this.device_id = data.id; this.platforms = platforms; this.pressure = { @@ -30,9 +28,9 @@ export class PressureDevice { }; } - public async connect() {} - - public async updateZero() {} + public abstract connect(): Promise; + public abstract disconnect(): void; + public abstract updateZero(): Promise; public getPressure() { return this.pressure.actual; @@ -42,11 +40,6 @@ export class PressureDevice { return this.pressure.old; } - /** - * Disconnect is triggered because the bluetooth was turned off, battery shutdown, or something went broken. - */ - public disconnectTriggered(): void {} - protected setPressure(_newPressure: number) { this.pressure.actual = _newPressure; const actualDate = new Date(); @@ -60,3 +53,7 @@ export class PressureDevice { this.pressure.old = _newPressure; } } + +export function psiToBar(v: number) { + return v * 0.0689476; +} diff --git a/src/classes/devices/transducerDirectPressure.ts b/src/classes/devices/transducerDirectPressure.ts new file mode 100644 index 000000000..de09a7d81 --- /dev/null +++ b/src/classes/devices/transducerDirectPressure.ts @@ -0,0 +1,82 @@ +import { Platforms } from '@ionic/core'; +import { LimitedPeripheralData, PeripheralData } from './ble.types'; + +import { Pressure, PressureDevice, psiToBar } from './pressureBluetoothDevice'; +import { parseAdvertisingManufacturerData } from './common/util'; + +declare var ble; +export default class TransducerDirectPressure extends PressureDevice { + public static PRESSURE_SERVICE_UUID = 'CC4A6A80-51E0-11E3-B451-0002A5D5C51B'; + public static PRESSURE_CHAR_UUID = '835AB4C0-51E4-11E3-A5BD-0002A5D5C51B'; + + public static ZERO_SERVICE_UUID = 'CC4A6A80-51E0-11E3-B451-0002A5D5C51B'; + public static ZERO_CHAR_UUID = '8CD67DA0-DA9B-11E3-9087-0002A5D5C51B'; + + public static test(device: LimitedPeripheralData) { + const adv = + device && + device.advertising && + parseAdvertisingManufacturerData(device.advertising); + + console.log('ADV', adv); + return adv && adv.length >= 2 && adv[0] === 0x0c && adv[1] === 0x01; + } + + constructor(data: PeripheralData, platforms: Platforms[]) { + super(data, platforms); + this.connect(); + } + + public connect(): Promise { + this.attachNotification(); + + return this.updateZero().catch(() => {}); // ignore error + } + + public async updateZero(): Promise { + const data = new Uint8Array(1); + + return new Promise((resolve, reject) => { + ble.writeWithoutResponse( + this.device_id, + TransducerDirectPressure.ZERO_SERVICE_UUID, + TransducerDirectPressure.ZERO_CHAR_UUID, + data.buffer, + resolve, + reject + ); + }); + } + + public disconnect() { + this.deattachNotification(); + } + + private attachNotification() { + ble.startNotification( + this.device_id, + TransducerDirectPressure.PRESSURE_SERVICE_UUID, + TransducerDirectPressure.PRESSURE_CHAR_UUID, + (_data) => { + const v = new Uint16Array(_data); + const psi = swap16(v[0]) / 10; + this.setPressure(psiToBar(psi)); + }, + (_data) => {} + ); + } + + private deattachNotification() { + ble.stopNotification( + this.device_id, + TransducerDirectPressure.PRESSURE_SERVICE_UUID, + TransducerDirectPressure.PRESSURE_CHAR_UUID, + (e) => {}, + (e) => {} + ); + } +} + +function swap16(val) { + return ((val & 0xff) << 8) | ((val >> 8) & 0xff); +} diff --git a/src/services/bleManager/ble-manager.service.ts b/src/services/bleManager/ble-manager.service.ts index 0115e983a..45c261f3f 100644 --- a/src/services/bleManager/ble-manager.service.ts +++ b/src/services/bleManager/ble-manager.service.ts @@ -1,6 +1,6 @@ import { Platforms } from '@ionic/core'; -import {PeripheralData} from '../../classes/devices/ble.types'; -import {Injectable} from '@angular/core'; +import { PeripheralData } from '../../classes/devices/ble.types'; +import { Injectable } from '@angular/core'; import { BluetoothScale, ScaleType, @@ -8,24 +8,25 @@ import { LunarScale, DecentScale, JimmyScale, - PressureType, makePressureDevice + PressureType, + makePressureDevice, } from '../../classes/devices'; -import {Platform} from '@ionic/angular'; -import {UILog} from '../uiLog'; -import {UIToast} from '../uiToast'; -import {AndroidPermissions} from '@ionic-native/android-permissions/ngx'; -import {Observable, Subject} from 'rxjs'; -import {UIHelper} from '../uiHelper'; +import { Platform } from '@ionic/angular'; +import { UILog } from '../uiLog'; +import { UIToast } from '../uiToast'; +import { AndroidPermissions } from '@ionic-native/android-permissions/ngx'; +import { Observable, Subject } from 'rxjs'; +import { UIHelper } from '../uiHelper'; import FelicitaScale from '../../classes/devices/felicitaScale'; import PopsiclePressure from '../../classes/devices/popsiclePressure'; -import {PressureDevice} from '../../classes/devices/pressureBluetoothDevice'; - +import { PressureDevice } from '../../classes/devices/pressureBluetoothDevice'; +import TransducerDirectPressure from '../../classes/devices/transducerDirectPressure'; declare var ble; declare var window; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class BleManagerService { public scale: BluetoothScale = null; @@ -35,11 +36,13 @@ export class BleManagerService { private eventSubject = new Subject(); - constructor(private readonly platform: Platform, - private readonly uiLog: UILog, - private readonly uiToast: UIToast, - private androidPermissions: AndroidPermissions, - private readonly uiHelper: UIHelper) { + constructor( + private readonly platform: Platform, + private readonly uiLog: UILog, + private readonly uiToast: UIToast, + private androidPermissions: AndroidPermissions, + private readonly uiHelper: UIHelper + ) { this.failed = false; this.ready = true; } @@ -50,28 +53,33 @@ export class BleManagerService { }); } - public attachOnEvent(): Observable { return this.eventSubject.asObservable(); } private __sendEvent(_type: string) { - this.eventSubject.next({type: _type}); + this.eventSubject.next({ type: _type }); } - public async hasLocationPermission(): Promise { return new Promise((resolve, reject) => { if (this.platform.is('android')) { - this.androidPermissions.hasPermission(this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION).then((_status) => { - if (_status.hasPermission === false) { - resolve(false); - } else { - resolve(true); - } - }, () => { - resolve(false); - }); + this.androidPermissions + .hasPermission( + this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION + ) + .then( + (_status) => { + if (_status.hasPermission === false) { + resolve(false); + } else { + resolve(true); + } + }, + () => { + resolve(false); + } + ); } else { resolve(true); } @@ -81,15 +89,20 @@ export class BleManagerService { public async hasBluetoothPermission(): Promise { return new Promise((resolve, reject) => { if (this.platform.is('android')) { - this.androidPermissions.hasPermission(this.androidPermissions.PERMISSION.BLUETOOTH_ADMIN).then((_status) => { - if (_status.hasPermission === false) { - resolve(false); - } else { - resolve(true); - } - }, () => { - resolve(false); - }); + this.androidPermissions + .hasPermission(this.androidPermissions.PERMISSION.BLUETOOTH_ADMIN) + .then( + (_status) => { + if (_status.hasPermission === false) { + resolve(false); + } else { + resolve(true); + } + }, + () => { + resolve(false); + } + ); } else { resolve(true); } @@ -98,34 +111,45 @@ export class BleManagerService { public async requestBluetoothPermissions() { return new Promise((resolve, reject) => { - this.androidPermissions.requestPermission(this.androidPermissions.PERMISSION.BLUETOOTH_ADMIN).then((_status) => { - if (_status.hasPermission === false) { - resolve(false); - } else { - resolve(true); - } - }, () => { - resolve(false); - }); + this.androidPermissions + .requestPermission(this.androidPermissions.PERMISSION.BLUETOOTH_ADMIN) + .then( + (_status) => { + if (_status.hasPermission === false) { + resolve(false); + } else { + resolve(true); + } + }, + () => { + resolve(false); + } + ); }); } public async requestLocationPermissions() { return new Promise((resolve, reject) => { - this.androidPermissions.requestPermission(this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION).then((_status) => { - if (_status.hasPermission === false) { - resolve(false); - } else { - resolve(true); - } - }, () => { - resolve(false); - }); + this.androidPermissions + .requestPermission( + this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION + ) + .then( + (_status) => { + if (_status.hasPermission === false) { + resolve(false); + } else { + resolve(true); + } + }, + () => { + resolve(false); + } + ); }); } public async scanDevices(): Promise> { - return new Promise>((resolve, reject) => { const devices: Array = []; @@ -133,7 +157,7 @@ export class BleManagerService { const stopScanningAndResolve = async () => { try { await this.stopScanning(); - } catch(ex) { + } catch (ex) { // Grab error. } @@ -141,21 +165,29 @@ export class BleManagerService { resolve(devices); }; - - ble.startScan([], async (device) => { - this.uiLog.log('Device found ' + JSON.stringify(device)); - if (DecentScale.test(device) || LunarScale.test(device) || JimmyScale.test(device) || FelicitaScale.test(device)) { - // We found all needed devices. - devices.push(device); - - this.uiLog.log('Supported Scale found ' + JSON.stringify(device)); - clearTimeout(timeoutVar); - timeoutVar = null; - await stopScanningAndResolve(); + ble.startScan( + [], + async (device) => { + this.uiLog.log('Device found ' + JSON.stringify(device)); + if ( + DecentScale.test(device) || + LunarScale.test(device) || + JimmyScale.test(device) || + FelicitaScale.test(device) + ) { + // We found all needed devices. + devices.push(device); + + this.uiLog.log('Supported Scale found ' + JSON.stringify(device)); + clearTimeout(timeoutVar); + timeoutVar = null; + await stopScanningAndResolve(); + } + }, + () => { + resolve(devices); } - }, () => { - resolve(devices); - }); + ); timeoutVar = setTimeout(async () => { await stopScanningAndResolve(); }, 60000); @@ -163,7 +195,6 @@ export class BleManagerService { } public async scanPressureDevices(): Promise> { - return new Promise>((resolve, reject) => { const devices: Array = []; @@ -171,7 +202,7 @@ export class BleManagerService { const stopScanningAndResolve = async () => { try { await this.stopScanning(); - } catch(ex) { + } catch (ex) { // Grab error. } @@ -179,50 +210,74 @@ export class BleManagerService { resolve(devices); }; - - ble.startScan([], async (device) => { - this.uiLog.log('Pressure devices found ' + JSON.stringify(device)); - if (PopsiclePressure.test(device)) { - // We found all needed devices. - devices.push(device); - - this.uiLog.log('Supported pressure devices found ' + JSON.stringify(device)); - clearTimeout(timeoutVar); - timeoutVar = null; - await stopScanningAndResolve(); + ble.startScan( + [], + async (device) => { + this.uiLog.log('Pressure devices found ' + JSON.stringify(device)); + if ( + PopsiclePressure.test(device) || + TransducerDirectPressure.test(device) + ) { + // We found all needed devices. + devices.push(device); + + this.uiLog.log( + 'Supported pressure devices found ' + JSON.stringify(device) + ); + clearTimeout(timeoutVar); + timeoutVar = null; + await stopScanningAndResolve(); + } + }, + () => { + resolve(devices); } - }, () => { - resolve(devices); - }); + ); timeoutVar = setTimeout(async () => { await stopScanningAndResolve(); }, 60000); }); } - public disconnect(deviceId: string, show_toast: boolean = true): Promise { + + public disconnect( + deviceId: string, + show_toast: boolean = true + ): Promise { return new Promise((resolve, reject) => { - ble.disconnect(deviceId, () => { - this.scale = null; - if (show_toast) { - this.uiToast.showInfoToast('SCALE.DISCONNECTED_SUCCESSFULLY'); + ble.disconnect( + deviceId, + () => { + this.scale = null; + if (show_toast) { + this.uiToast.showInfoToast('SCALE.DISCONNECTED_SUCCESSFULLY'); + } + resolve(true); + }, + () => { + resolve(false); } - resolve(true); - }, () => { - resolve(false); - }); + ); }); } - public disconnectPressureDevice(deviceId: string, show_toast: boolean = true): Promise { + + public disconnectPressureDevice( + deviceId: string, + show_toast: boolean = true + ): Promise { return new Promise((resolve, reject) => { - ble.disconnect(deviceId, () => { - this.pressureDevice = null; - if (show_toast) { - this.uiToast.showInfoToast('SCALE.DISCONNECTED_SUCCESSFULLY'); + ble.disconnect( + deviceId, + () => { + this.pressureDevice = null; + if (show_toast) { + this.uiToast.showInfoToast('SCALE.DISCONNECTED_SUCCESSFULLY'); + } + resolve(true); + }, + () => { + resolve(false); } - resolve(true); - }, () => { - resolve(false); - }); + ); }); } @@ -250,11 +305,13 @@ export class BleManagerService { public getPressure() { try { if (this.pressureDevice) { - return this.uiHelper.toFixedIfNecessary(this.pressureDevice.getPressure(),2); + return this.uiHelper.toFixedIfNecessary( + this.pressureDevice.getPressure(), + 2 + ); } return 0; - - }catch(ex) { + } catch (ex) { return 0; } } @@ -262,14 +319,12 @@ export class BleManagerService { public getScaleWeight() { try { if (this.scale) { - return this.uiHelper.toFixedIfNecessary(this.scale.getWeight(),1); + return this.uiHelper.toFixedIfNecessary(this.scale.getWeight(), 1); } return 0; - - }catch(ex) { + } catch (ex) { return 0; } - } private async __scanAutoConnectScaleIOS() { @@ -293,13 +348,12 @@ export class BleManagerService { } else { resolve(true); } - } else { resolve(true); } }); - } + private async __scanAutoConnectPressureDeviceIOS() { return new Promise(async (resolve, reject) => { if (this.platform.is('ios')) { @@ -321,98 +375,121 @@ export class BleManagerService { } else { resolve(true); } - } else { resolve(true); } }); - } - - public async tryToFindScale() { - return new Promise<{ id: string, type: ScaleType }>(async (resolve, reject) => { - const devices: Array = await this.scanDevices(); - this.uiLog.log('BleManager - Loop through devices'); - for (const device of devices) { - if (DecentScale.test(device)) { - this.uiLog.log('BleManager - We found a decent scale'); - resolve({id: device.id, type: ScaleType.DECENT}); - return; - } - if (LunarScale.test(device)) { - this.uiLog.log('BleManager - We found a lunar/acaia scale'); - resolve({id: device.id, type: ScaleType.LUNAR}); - return; - } - if (JimmyScale.test(device)) { - this.uiLog.log('BleManager - We found a jimmy scale'); - resolve({id: device.id, type: ScaleType.JIMMY}); - return; - } - if (FelicitaScale.test(device)) { - this.uiLog.log('BleManager - We found a felicita scale'); - resolve({id: device.id, type: ScaleType.FELICITA}); - return; + return new Promise<{ id: string; type: ScaleType }>( + async (resolve, reject) => { + const devices: Array = await this.scanDevices(); + this.uiLog.log('BleManager - Loop through devices'); + for (const device of devices) { + if (DecentScale.test(device)) { + this.uiLog.log('BleManager - We found a decent scale'); + resolve({ id: device.id, type: ScaleType.DECENT }); + return; + } + if (LunarScale.test(device)) { + this.uiLog.log('BleManager - We found a lunar/acaia scale'); + resolve({ id: device.id, type: ScaleType.LUNAR }); + return; + } + if (JimmyScale.test(device)) { + this.uiLog.log('BleManager - We found a jimmy scale'); + resolve({ id: device.id, type: ScaleType.JIMMY }); + return; + } + if (FelicitaScale.test(device)) { + this.uiLog.log('BleManager - We found a felicita scale'); + resolve({ id: device.id, type: ScaleType.FELICITA }); + return; + } } + resolve(undefined); } - resolve(undefined); - }); + ); } public async tryToFindPressureDevice() { - return new Promise<{ id: string, type: PressureType }>(async (resolve, reject) => { - const devices: Array = await this.scanPressureDevices(); - this.uiLog.log('BleManager - Loop through pressure devices'); - for (const device of devices) { - if (PopsiclePressure.test(device)) { - this.uiLog.log('BleManager - We found a popsicle pressure device '); - resolve({id: device.id, type: PressureType.POPSICLE}); - return; + return new Promise<{ id: string; type: PressureType }>( + async (resolve, reject) => { + const devices: Array = await this.scanPressureDevices(); + this.uiLog.log('BleManager - Loop through pressure devices'); + for (const device of devices) { + if (PopsiclePressure.test(device)) { + this.uiLog.log('BleManager - We found a popsicle pressure device '); + resolve({ id: device.id, type: PressureType.POPSICLE }); + return; + } else if (TransducerDirectPressure.test(device)) { + this.uiLog.log( + 'BleManager - We found a Transducer Direct pressure device ' + ); + resolve({ id: device.id, type: PressureType.DIRECT }); + return; + } } + resolve(undefined); } - resolve(undefined); - }); + ); } - private async __iOSAccessBleStackAndAutoConnect(_findPressureDevice: boolean=false) { + + private async __iOSAccessBleStackAndAutoConnect( + _findPressureDevice: boolean = false + ) { return await new Promise((resolve) => { let counter: number = 1; - const iOSScanInterval = setInterval(async() => { + const iOSScanInterval = setInterval(async () => { try { - this.uiLog.log('__iOSAccessBleStackAndAutoConnect - Try to get bluetooth state'); + this.uiLog.log( + '__iOSAccessBleStackAndAutoConnect - Try to get bluetooth state' + ); const enabled: boolean = await this.isBleEnabled(); if (enabled === true) { clearInterval(iOSScanInterval); - if (_findPressureDevice === false){ + if (_findPressureDevice === false) { await this.__scanAutoConnectScaleIOS(); - this.uiLog.log('__iOSAccessBleStackAndAutoConnect - Scale for iOS found, resolve now'); + this.uiLog.log( + '__iOSAccessBleStackAndAutoConnect - Scale for iOS found, resolve now' + ); } else { await this.__scanAutoConnectPressureDeviceIOS(); - this.uiLog.log('__iOSAccessBleStackAndAutoConnect - Pressure devices for iOS found, resolve now'); + this.uiLog.log( + '__iOSAccessBleStackAndAutoConnect - Pressure devices for iOS found, resolve now' + ); } - resolve(null); } else { - this.uiLog.log('__iOSAccessBleStackAndAutoConnect - Bluetooth not enabled, try again'); + this.uiLog.log( + '__iOSAccessBleStackAndAutoConnect - Bluetooth not enabled, try again' + ); } + } catch (ex) { + this.uiLog.log( + '__iOSAccessBleStackAndAutoConnect - Bluetooth error occured ' + + JSON.stringify(ex) + ); } - catch (ex) { - this.uiLog.log('__iOSAccessBleStackAndAutoConnect - Bluetooth error occured ' + JSON.stringify(ex)); - } - counter ++; + counter++; if (counter > 10) { - this.uiLog.log('__iOSAccessBleStackAndAutoConnect - iOS - Stop after 10 tries'); + this.uiLog.log( + '__iOSAccessBleStackAndAutoConnect - iOS - Stop after 10 tries' + ); clearInterval(iOSScanInterval); resolve(null); } - - },1000); + }, 1000); }); } - public async autoConnectScale(deviceType: ScaleType, deviceId: string, _retryScanForIOS: boolean = false) { + public async autoConnectScale( + deviceType: ScaleType, + deviceId: string, + _retryScanForIOS: boolean = false + ) { if (_retryScanForIOS) { // iOS needs to know the scale, before auto connect can be done await this.__iOSAccessBleStackAndAutoConnect(); @@ -421,29 +498,55 @@ export class BleManagerService { this.uiLog.log('AutoConnectScale - We can start or we waited for iOS'); return new Promise((resolve, reject) => { - this.uiLog.log('AutoConnectScale - We created our promise, and try to autoconnect to device now.'); - ble.autoConnect(deviceId, this.connectCallback.bind(this, resolve, deviceType), this.disconnectCallback.bind(this, reject)); + this.uiLog.log( + 'AutoConnectScale - We created our promise, and try to autoconnect to device now.' + ); + ble.autoConnect( + deviceId, + this.connectCallback.bind(this, resolve, deviceType), + this.disconnectCallback.bind(this, reject) + ); }); } - public async autoConnectPressureDevice(pressureType: PressureType, deviceId: string, _retryScanForIOS: boolean = false) { + public async autoConnectPressureDevice( + pressureType: PressureType, + deviceId: string, + _retryScanForIOS: boolean = false + ) { if (_retryScanForIOS) { // iOS needs to know the scale, before auto connect can be done await this.__iOSAccessBleStackAndAutoConnect(true); } - this.uiLog.log('AutoConnectPressureDevice - We can start or we waited for iOS'); + this.uiLog.log( + 'AutoConnectPressureDevice - We can start or we waited for iOS' + ); return new Promise((resolve, reject) => { - this.uiLog.log('AutoConnectPressureDevice - We created our promise, and try to autoconnect to device now.'); - ble.autoConnect(deviceId, this.connectPressureCallback.bind(this, resolve, pressureType), this.disconnectPressureCallback.bind(this, reject)); + this.uiLog.log( + 'AutoConnectPressureDevice - We created our promise, and try to autoconnect to device now.' + ); + ble.autoConnect( + deviceId, + this.connectPressureCallback.bind(this, resolve, pressureType), + this.disconnectPressureCallback.bind(this, reject) + ); }); } - private connectCallback(callback, deviceType: ScaleType, data: PeripheralData) { + private connectCallback( + callback, + deviceType: ScaleType, + data: PeripheralData + ) { // wait for full data if (!this.scale || 'characteristics' in data) { - this.scale = makeDevice(deviceType, data, this.platform.platforms() as Platforms[]); + this.scale = makeDevice( + deviceType, + data, + this.platform.platforms() as Platforms[] + ); this.uiLog.log('Connected successfully'); this.uiToast.showInfoToast('SCALE.CONNECTED_SUCCESSFULLY'); callback(); @@ -451,7 +554,6 @@ export class BleManagerService { } } - private disconnectCallback(callback) { if (this.scale) { this.scale.disconnectTriggered(); @@ -459,16 +561,23 @@ export class BleManagerService { this.uiToast.showInfoToast('SCALE.DISCONNECTED_UNPLANNED'); this.uiLog.log('Disconnected successfully'); callback(); - } - //Send disconnect callback, even if scale is already null/not existing anymore + // Send disconnect callback, even if scale is already null/not existing anymore this.__sendEvent('DISCONNECT'); } - private connectPressureCallback(callback, pressureTaype: PressureType, data: PeripheralData) { + private connectPressureCallback( + callback, + pressureTaype: PressureType, + data: PeripheralData + ) { // wait for full data if (!this.pressureDevice || 'characteristics' in data) { - this.pressureDevice = makePressureDevice(pressureTaype, data, this.platform.platforms() as Platforms[]); + this.pressureDevice = makePressureDevice( + pressureTaype, + data, + this.platform.platforms() as Platforms[] + ); this.uiLog.log('Pressure Connected successfully'); this.uiToast.showInfoToast('PRESSURE.CONNECTED_SUCCESSFULLY'); callback(); @@ -476,17 +585,15 @@ export class BleManagerService { } } - private disconnectPressureCallback(callback) { if (this.scale) { - this.pressureDevice.disconnectTriggered(); + this.pressureDevice.disconnect(); this.pressureDevice = null; this.uiToast.showInfoToast('PRESSURE.DISCONNECTED_UNPLANNED'); this.uiLog.log('Disconnected successfully'); callback(); - } - //Send disconnect callback, even if scale is already null/not existing anymore + // Send disconnect callback, even if scale is already null/not existing anymore this.__sendEvent('DISCONNECT'); } } From 690bce52bbaf04090bcf51ce0385643a5473838c Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sat, 18 Jun 2022 15:28:09 +0200 Subject: [PATCH 21/78] #383 --- README.md | 4 +- config.xml | 2 +- package-lock.json | 7217 ++++++----------- package.json | 2 +- src/classes/brew/brewFlow.ts | 16 + .../brew-brewing/brew-brewing.component.ts | 246 +- .../bleManager/ble-manager.service.ts | 56 +- src/services/uiExcel.ts | 54 +- 8 files changed, 2536 insertions(+), 5061 deletions(-) diff --git a/README.md b/README.md index b71acb4b5..59f09e069 100755 --- a/README.md +++ b/README.md @@ -181,14 +181,14 @@ Don't use NPM V 7 right now, 6.14.11 works fine ### Android-Version: -`ionic cordova platform add android@10.1.1` +`ionic cordova platform add android@10.1.2` ### Github Page Hosting https://stackoverflow.com/questions/60357663/do-apple-app-site-association-files-work-with-github-pages-i-e-site-github-io ### Upgrade Ionic if needed: -`npm install @ionic/angular@6.0.14` +`npm install @ionic/angular@6.1.10` -> Or the actual active version ### Installing AAB on your android (mac) diff --git a/config.xml b/config.xml index 5c103c612..b4ed7838c 100644 --- a/config.xml +++ b/config.xml @@ -1,5 +1,5 @@ - + Beanconqueror Lars Saalbach diff --git a/package-lock.json b/package-lock.json index 9021a8955..2dff07f68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,7 +37,7 @@ "@ionic-native/splash-screen": "^5.33.1", "@ionic-native/status-bar": "^5.33.1", "@ionic-native/three-dee-touch": "^5.33.1", - "@ionic/angular": "^6.0.14", + "@ionic/angular": "^6.1.10", "@ionic/cli": "^6.18.1", "@ionic/storage": "^2.3.1", "@ngx-translate/core": "^11.0.1", @@ -297,48 +297,6 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { - "version": "0.1301.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1301.1.tgz", - "integrity": "sha512-3g1wlqihVEOhClsuSzyJYm8Sr4qc4IUDuOa45m8439bz9iQy2wZ3JUGTwX1NcpeLxmCDrgewuphIsW096HxYlg==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "13.1.1", - "rxjs": "6.6.7" - }, - "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.1.1.tgz", - "integrity": "sha512-tpOOzdrbrXG+BiJ/iKUX5VU5vBXN/n+H1EMThTwjgT11mqw2uvMj4sSRPvHUrrfxbLE9deuCDQEzmci71enn2w==", - "dev": true, - "dependencies": { - "ajv": "8.8.2", - "ajv-formats": "2.1.1", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" - }, - "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, "node_modules/@angular-devkit/build-angular/node_modules/@babel/code-frame": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", @@ -491,39 +449,6 @@ "node": ">= 6.0.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "node_modules/@angular-devkit/build-angular/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -577,17 +502,6 @@ "node": ">= 10" } }, - "node_modules/@angular-devkit/build-angular/node_modules/core-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", - "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/@angular-devkit/build-angular/node_modules/debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -635,12 +549,6 @@ "esbuild-windows-arm64": "0.14.2" } }, - "node_modules/@angular-devkit/build-angular/node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, "node_modules/@angular-devkit/build-angular/node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -763,12 +671,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/@angular-devkit/build-angular/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -787,18 +689,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@angular-devkit/build-angular/node_modules/nanoid": { - "version": "3.1.30", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/@angular-devkit/build-angular/node_modules/open": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", @@ -962,9 +852,9 @@ } }, "node_modules/@angular-devkit/build-optimizer": { - "version": "0.1202.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1202.14.tgz", - "integrity": "sha512-I9dtwE5g4ZM2zJF3oveYhk6yFY2zYakONHyuG6YWz6oMBT0n5czggWZ2di7oggciVVdoyrTlHiApZnttQJyaWw==", + "version": "0.1202.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1202.17.tgz", + "integrity": "sha512-1qWGWw7cCNADB4LZ/zjiSK0GLmr2kebYyNG0KutCE8GNVxv2h6w6dJP6t1C/BgskRuBPCAhvE+lEKN8ljSutag==", "dev": true, "dependencies": { "source-map": "0.7.3", @@ -1020,93 +910,6 @@ "webpack-dev-server": "^4.0.0" } }, - "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { - "version": "0.1301.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1301.1.tgz", - "integrity": "sha512-3g1wlqihVEOhClsuSzyJYm8Sr4qc4IUDuOa45m8439bz9iQy2wZ3JUGTwX1NcpeLxmCDrgewuphIsW096HxYlg==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "13.1.1", - "rxjs": "6.6.7" - }, - "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.1.1.tgz", - "integrity": "sha512-tpOOzdrbrXG+BiJ/iKUX5VU5vBXN/n+H1EMThTwjgT11mqw2uvMj4sSRPvHUrrfxbLE9deuCDQEzmci71enn2w==", - "dev": true, - "dependencies": { - "ajv": "8.8.2", - "ajv-formats": "2.1.1", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" - }, - "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-webpack/node_modules/ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@angular-devkit/build-webpack/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-webpack/node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/@angular-devkit/build-webpack/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -1574,41 +1377,6 @@ "typescript": ">=4.4.2 <4.6" } }, - "node_modules/@angular/compiler-cli/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@angular/compiler-cli/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/@angular/compiler-cli/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "node_modules/@angular/compiler-cli/node_modules/semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -1630,85 +1398,6 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, - "node_modules/@angular/compiler-cli/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@angular/compiler-cli/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@angular/compiler-cli/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@angular/compiler-cli/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@angular/compiler-cli/node_modules/yargs": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.0.tgz", - "integrity": "sha512-GQl1pWyDoGptFPJx9b9L6kmR33TGusZvXIZUT+BOz9f7X2L94oeAskFYLEg/FkhV06zZPBYLvLZRWeYId29lew==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/compiler-cli/node_modules/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/@angular/core": { "version": "13.1.0", "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.1.0.tgz", @@ -1869,46 +1558,6 @@ "@babel/highlight": "^7.10.4" } }, - "node_modules/@babel/core/node_modules/@babel/generator": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", - "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.5", - "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-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.4" - } - }, "node_modules/@babel/core/node_modules/@babel/highlight": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", @@ -1920,57 +1569,6 @@ "js-tokens": "^4.0.0" } }, - "node_modules/@babel/core/node_modules/@babel/parser": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", - "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", - "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.10.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", - "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.5", - "@babel/types": "^7.10.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "node_modules/@babel/core/node_modules/@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", - "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/debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -1981,21 +1579,6 @@ "ms": "^2.1.1" } }, - "node_modules/@babel/core/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/@babel/core/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -2297,17 +1880,6 @@ "@babel/types": "^7.10.5" } }, - "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", - "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.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", @@ -2317,17 +1889,6 @@ "@babel/types": "^7.10.4" } }, - "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", - "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.10.5", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.5.tgz", @@ -2343,69 +1904,6 @@ "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/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.4" - } - }, - "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.10.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", - "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", - "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/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", - "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", @@ -2415,17 +1913,6 @@ "@babel/types": "^7.10.4" } }, - "node_modules/@babel/helper-optimise-call-expression/node_modules/@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", - "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.16.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", @@ -2461,142 +1948,6 @@ "@babel/types": "^7.10.4" } }, - "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.10.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", - "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.5", - "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.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.4" - } - }, - "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.10.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", - "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", - "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.10.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", - "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.5", - "@babel/types": "^7.10.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "node_modules/@babel/helper-replace-supers/node_modules/@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", - "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/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/@babel/helper-replace-supers/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/@babel/helper-replace-supers/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/@babel/helper-simple-access": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", @@ -2607,60 +1958,6 @@ "@babel/types": "^7.10.4" } }, - "node_modules/@babel/helper-simple-access/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-simple-access/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-simple-access/node_modules/@babel/parser": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", - "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-simple-access/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-simple-access/node_modules/@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", - "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.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", @@ -2726,142 +2023,6 @@ "@babel/types": "^7.10.4" } }, - "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.10.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", - "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.5", - "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.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.4" - } - }, - "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.10.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", - "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", - "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.10.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", - "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.5", - "@babel/types": "^7.10.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helpers/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/@babel/helpers/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/@babel/helpers/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/@babel/highlight": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", @@ -2873,12 +2034,6 @@ "js-tokens": "^4.0.0" } }, - "node_modules/@babel/highlight/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/@babel/parser": { "version": "7.16.5", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.5.tgz", @@ -4492,6 +3647,15 @@ "node": ">=6.9.0" } }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@csstools/convert-colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", @@ -4528,11 +3692,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/android-permissions/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/app-minimize": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/app-minimize/-/app-minimize-5.33.1.tgz", @@ -4545,11 +3704,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/app-minimize/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/app-version": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/app-version/-/app-version-5.33.1.tgz", @@ -4562,11 +3716,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/app-version/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/camera": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/camera/-/camera-5.33.1.tgz", @@ -4579,11 +3728,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/camera/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/core": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/core/-/core-5.33.1.tgz", @@ -4595,11 +3739,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/core/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/deeplinks": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/deeplinks/-/deeplinks-5.33.1.tgz", @@ -4612,11 +3751,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/deeplinks/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/device": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/device/-/device-5.33.1.tgz", @@ -4653,11 +3787,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/file-chooser/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/file-path": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/file-path/-/file-path-5.33.1.tgz", @@ -4670,11 +3799,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/file-path/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/file-picker": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/file-picker/-/file-picker-5.33.1.tgz", @@ -4687,11 +3811,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/file-picker/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/file-transfer": { "version": "5.34.0", "resolved": "https://registry.npmjs.org/@ionic-native/file-transfer/-/file-transfer-5.34.0.tgz", @@ -4704,16 +3823,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/file-transfer/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, - "node_modules/@ionic-native/file/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/geolocation": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/geolocation/-/geolocation-5.33.1.tgz", @@ -4726,11 +3835,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/geolocation/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/globalization": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/globalization/-/globalization-5.33.1.tgz", @@ -4743,11 +3847,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/globalization/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/image-picker": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/image-picker/-/image-picker-5.33.1.tgz", @@ -4760,11 +3859,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/image-picker/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/in-app-browser": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/in-app-browser/-/in-app-browser-5.33.1.tgz", @@ -4777,11 +3871,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/in-app-browser/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/insomnia": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/insomnia/-/insomnia-5.33.1.tgz", @@ -4794,11 +3883,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/insomnia/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/keyboard": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/keyboard/-/keyboard-5.33.1.tgz", @@ -4811,11 +3895,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/keyboard/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/screen-orientation": { "version": "5.36.0", "resolved": "https://registry.npmjs.org/@ionic-native/screen-orientation/-/screen-orientation-5.36.0.tgz", @@ -4828,11 +3907,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/screen-orientation/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/social-sharing": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/social-sharing/-/social-sharing-5.33.1.tgz", @@ -4845,11 +3919,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/social-sharing/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/splash-screen": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/splash-screen/-/splash-screen-5.33.1.tgz", @@ -4862,11 +3931,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/splash-screen/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/status-bar": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/status-bar/-/status-bar-5.33.1.tgz", @@ -4879,11 +3943,6 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/status-bar/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic-native/three-dee-touch": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/three-dee-touch/-/three-dee-touch-5.33.1.tgz", @@ -4896,17 +3955,12 @@ "rxjs": "^5.5.0 || ^6.5.0" } }, - "node_modules/@ionic-native/three-dee-touch/node_modules/@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - }, "node_modules/@ionic/angular": { - "version": "6.0.14", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.0.14.tgz", - "integrity": "sha512-6x8vFYUjjNJm1dRZvpxAZNaGere4XIs4McAYirn+3DpgBMDUitEbxI1T3pXvFFDCTc+JuoVn7lf1ZgazVUazVA==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.1.10.tgz", + "integrity": "sha512-fjx70IDTGFIY8x5JSImF+cai8Z6gr5BfEp0SBP7sYPmCjWLLAJMC/uyqvvGgMURd9Rr059nSoNc6CjeYZsMVcQ==", "dependencies": { - "@ionic/core": "^6.0.14", + "@ionic/core": "^6.1.10", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" }, @@ -4951,12 +4005,12 @@ } }, "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/architect": { - "version": "0.1202.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.14.tgz", - "integrity": "sha512-n+0tDLKtCK9VHZEmwiPixvlwC5JAraFIfT7p/srVGVxzYckixrnBWeqcz5zcUyh2CFBzh+fAKoZlNXlDJ1XKnA==", + "version": "0.1202.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.17.tgz", + "integrity": "sha512-uUQcHcLbPvr9adALQSLU1MTDduVUR2kZAHi2e7SmL9ioel84pPVXBoD0WpSBeUMKwPiDs3TQDaxDB49hl0nBSQ==", "dev": true, "dependencies": { - "@angular-devkit/core": "12.2.14", + "@angular-devkit/core": "12.2.17", "rxjs": "6.6.7" }, "engines": { @@ -4965,17 +4019,36 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/architect/node_modules/@angular-devkit/core": { + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.17.tgz", + "integrity": "sha512-PyOY7LGUPPd6rakxUYbfQN6zAdOCMCouVp5tERY1WTdMdEiuULOtHsPee8kNbh75pD59KbJNU+fwozPRMuIm5g==", + "dev": true, + "dependencies": { + "ajv": "8.6.2", + "ajv-formats": "2.1.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/build-angular": { - "version": "12.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.2.14.tgz", - "integrity": "sha512-oN/Rw+hL3T9EuzRauILJLiLgyyxgG4hjSO+W0EO9uYL3Q08+XmcmOKQgm0c3LAJFyk+REeOy6y4Gb3P7ZcfJ0Q==", + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.2.17.tgz", + "integrity": "sha512-uc3HGHVQyatqQ/M53oxYBvhz0jx0hgdc7WT+L56GLHvgz7Ct2VEbpWaMfwHkFfE1F1iHkIgnTKHKWacJl1yQIg==", "dev": true, "dependencies": { "@ampproject/remapping": "1.0.1", - "@angular-devkit/architect": "0.1202.14", - "@angular-devkit/build-optimizer": "0.1202.14", - "@angular-devkit/build-webpack": "0.1202.14", - "@angular-devkit/core": "12.2.14", + "@angular-devkit/architect": "0.1202.17", + "@angular-devkit/build-optimizer": "0.1202.17", + "@angular-devkit/build-webpack": "0.1202.17", + "@angular-devkit/core": "12.2.17", "@babel/core": "7.14.8", "@babel/generator": "7.14.8", "@babel/helper-annotate-as-pure": "7.14.5", @@ -4987,7 +4060,7 @@ "@babel/template": "7.14.5", "@discoveryjs/json-ext": "0.5.3", "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@ngtools/webpack": "12.2.14", + "@ngtools/webpack": "12.2.17", "ansi-colors": "4.1.1", "babel-loader": "8.2.2", "browserslist": "^4.9.1", @@ -5037,7 +4110,7 @@ "tslib": "2.3.0", "webpack": "5.50.0", "webpack-dev-middleware": "5.0.0", - "webpack-dev-server": "3.11.2", + "webpack-dev-server": "3.11.3", "webpack-merge": "5.8.0", "webpack-subresource-integrity": "1.5.2" }, @@ -5084,14 +4157,18 @@ } } }, - "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { - "version": "0.1202.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.14.tgz", - "integrity": "sha512-n+0tDLKtCK9VHZEmwiPixvlwC5JAraFIfT7p/srVGVxzYckixrnBWeqcz5zcUyh2CFBzh+fAKoZlNXlDJ1XKnA==", + "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.17.tgz", + "integrity": "sha512-PyOY7LGUPPd6rakxUYbfQN6zAdOCMCouVp5tERY1WTdMdEiuULOtHsPee8kNbh75pD59KbJNU+fwozPRMuIm5g==", "dev": true, "dependencies": { - "@angular-devkit/core": "12.2.14", - "rxjs": "6.6.7" + "ajv": "8.6.2", + "ajv-formats": "2.1.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" }, "engines": { "node": "^12.14.1 || >=14.0.0", @@ -5099,6 +4176,28 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core/node_modules/ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/build-angular/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -5195,12 +4294,12 @@ } }, "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/build-webpack": { - "version": "0.1202.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1202.14.tgz", - "integrity": "sha512-95pw4tXAaqUZqHS8cMQQbfPyzviPmMyqt4/kywLGmo3Fow8DeHn90SzVmANlDo2DQ1J+LaKeQD2alclbtAQP5A==", + "version": "0.1202.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1202.17.tgz", + "integrity": "sha512-z7FW43DJ4p8UZwbFRmMrh2ohqhI2Wtdg3+FZiTnl4opb3zYheGiNxPlTuiyKjG21JUkGCdthkkBLCNfaUU0U/Q==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1202.14", + "@angular-devkit/architect": "0.1202.17", "rxjs": "6.6.7" }, "engines": { @@ -5213,21 +4312,6 @@ "webpack-dev-server": "^3.1.4" } }, - "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { - "version": "0.1202.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.14.tgz", - "integrity": "sha512-n+0tDLKtCK9VHZEmwiPixvlwC5JAraFIfT7p/srVGVxzYckixrnBWeqcz5zcUyh2CFBzh+fAKoZlNXlDJ1XKnA==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "12.2.14", - "rxjs": "6.6.7" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/core": { "version": "12.2.14", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.14.tgz", @@ -5263,6 +4347,65 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular/compiler": { + "version": "12.2.16", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.2.16.tgz", + "integrity": "sha512-nsYEw+yu8QyeqPf9nAmG419i1mtGM4v8+U+S3eQHQFXTgJzLymMykWHYu2ETdjUpNSLK6xcIQDBWtWnWSfJjAA==", + "dev": true, + "peer": true, + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular/compiler-cli": { + "version": "12.2.16", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.2.16.tgz", + "integrity": "sha512-tlalh8SJvdCWbUPRUR5GamaP+wSc/GuCsoUZpSbcczGKgSlbaEVXUYtVXm8/wuT6Slk2sSEbRs7tXGF2i7qxVw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/core": "^7.8.6", + "@babel/types": "^7.8.6", + "canonical-path": "1.0.0", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.11.0", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "source-map": "^0.6.1", + "sourcemap-codec": "^1.4.8", + "tslib": "^2.2.0", + "yargs": "^17.0.0" + }, + "bin": { + "ivy-ngcc": "ngcc/main-ivy-ngcc.js", + "ng-xi18n": "src/extract_i18n.js", + "ngc": "src/main.js", + "ngcc": "ngcc/main-ngcc.js" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" + }, + "peerDependencies": { + "@angular/compiler": "12.2.16", + "typescript": ">=4.2.3 <4.4" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular/compiler-cli/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, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ionic/angular-toolkit/node_modules/@babel/code-frame": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", @@ -5689,9 +4832,9 @@ } }, "node_modules/@ionic/angular-toolkit/node_modules/@ngtools/webpack": { - "version": "12.2.14", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.14.tgz", - "integrity": "sha512-dla6JgLWKAo7k4K3O+ouo104wO3BFs+MIOCXoGF4Lp/1pKPSt0orYmvZFBkDZPmyBFYRw9wpL2WHnAAyip40Cw==", + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.17.tgz", + "integrity": "sha512-uaS+2YZgPDW3VmUuwh4/yfIFV1KRVGWefc6xLWIqKRKs6mlRYs65m3ib9dX7CTS4kQMCbhxkxMbpBO2yXlzfvA==", "dev": true, "engines": { "node": "^12.14.1 || >=14.0.0", @@ -5732,18 +4875,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@ionic/angular-toolkit/node_modules/ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, "node_modules/@ionic/angular-toolkit/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -5781,7 +4912,7 @@ "node_modules/@ionic/angular-toolkit/node_modules/anymatch/node_modules/normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", "dev": true, "dependencies": { "remove-trailing-separator": "^1.0.1" @@ -5901,39 +5032,58 @@ "node": ">=0.10.0" } }, - "node_modules/@ionic/angular-toolkit/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "node_modules/@ionic/angular-toolkit/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": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@ionic/angular-toolkit/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": ">=0.10.0" + "node": ">=6" } }, - "node_modules/@ionic/angular-toolkit/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/@ionic/angular-toolkit/node_modules/cliui/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": { - "is-extendable": "^0.1.0" + "ansi-regex": "^4.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, + "node_modules/@ionic/angular-toolkit/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, "node_modules/@ionic/angular-toolkit/node_modules/colorette": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.1.0.tgz", @@ -5980,18 +5130,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/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/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/node_modules/fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", @@ -6020,27 +5158,6 @@ "node": ">= 6" } }, - "node_modules/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/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/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/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/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -6078,18 +5195,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/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/@ionic/angular-toolkit/node_modules/core-js": { "version": "3.16.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.0.tgz", @@ -6213,7 +5318,7 @@ "node_modules/@ionic/angular-toolkit/node_modules/del/node_modules/array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "dev": true, "dependencies": { "array-uniq": "^1.0.1" @@ -6225,7 +5330,7 @@ "node_modules/@ionic/angular-toolkit/node_modules/del/node_modules/globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", "dev": true, "dependencies": { "array-union": "^1.0.1", @@ -6241,12 +5346,18 @@ "node_modules/@ionic/angular-toolkit/node_modules/del/node_modules/globby/node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/es-module-lexer": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", @@ -6495,7 +5606,7 @@ "node_modules/@ionic/angular-toolkit/node_modules/fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", "dev": true, "dependencies": { "extend-shallow": "^2.0.1", @@ -6510,7 +5621,7 @@ "node_modules/@ionic/angular-toolkit/node_modules/fill-range/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "dependencies": { "is-extendable": "^0.1.0" @@ -6536,6 +5647,18 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/fsevents": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", @@ -6706,7 +5829,7 @@ "node_modules/@ionic/angular-toolkit/node_modules/is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", "dev": true, "dependencies": { "binary-extensions": "^1.0.0" @@ -6715,10 +5838,28 @@ "node": ">=0.10.0" } }, + "node_modules/@ionic/angular-toolkit/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/@ionic/angular-toolkit/node_modules/is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, "dependencies": { "kind-of": "^3.0.2" @@ -6730,7 +5871,7 @@ "node_modules/@ionic/angular-toolkit/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -6860,6 +6001,19 @@ "node": ">=8.9.0" } }, + "node_modules/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -6908,6 +6062,39 @@ "node": ">=0.10.0" } }, + "node_modules/@ionic/angular-toolkit/node_modules/micromatch/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/micromatch/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ionic/angular-toolkit/node_modules/mime-db": { "version": "1.51.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", @@ -7006,18 +6193,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@ionic/angular-toolkit/node_modules/nanoid": { - "version": "3.1.30", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/@ionic/angular-toolkit/node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -7033,6 +6208,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/p-locate/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/@ionic/angular-toolkit/node_modules/p-map": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", @@ -7054,6 +6256,15 @@ "node": ">=6" } }, + "node_modules/@ionic/angular-toolkit/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/@ionic/angular-toolkit/node_modules/picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -7436,7 +6647,7 @@ "node_modules/@ionic/angular-toolkit/node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "dependencies": { "is-number": "^3.0.0", @@ -7446,6 +6657,20 @@ "node": ">=0.10.0" } }, + "node_modules/@ionic/angular-toolkit/node_modules/typescript": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/@ionic/angular-toolkit/node_modules/webpack": { "version": "5.50.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.50.0.tgz", @@ -7564,12 +6789,12 @@ } }, "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", - "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", "dev": true, "dependencies": { - "ansi-html": "0.0.7", + "ansi-html-community": "0.0.8", "bonjour": "^3.5.0", "chokidar": "^2.1.8", "compression": "^1.7.4", @@ -7637,12 +6862,33 @@ "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -7666,10 +6912,22 @@ "fsevents": "^1.2.7" } }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, "dependencies": { "is-glob": "^3.1.0", @@ -7679,7 +6937,7 @@ "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", "dev": true, "dependencies": { "is-extglob": "^2.1.0" @@ -7691,7 +6949,7 @@ "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" @@ -7716,12 +6974,12 @@ } }, "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/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==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -7750,10 +7008,45 @@ "semver": "bin/semver.js" } }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/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/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/string-width/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/@ionic/angular-toolkit/node_modules/webpack-dev-server/node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "dependencies": { "ansi-regex": "^2.0.0" @@ -7802,6 +7095,24 @@ "async-limiter": "~1.0.0" } }, + "node_modules/@ionic/angular-toolkit/node_modules/webpack-dev-server/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/@ionic/angular-toolkit/node_modules/webpack/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -7857,6 +7168,76 @@ "node": ">=10.13.0" } }, + "node_modules/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/wrap-ansi/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/@ionic/angular-toolkit/node_modules/wrap-ansi/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/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/wrap-ansi/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/@ionic/angular-toolkit/node_modules/ws": { "version": "7.5.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", @@ -7878,6 +7259,16 @@ } } }, + "node_modules/@ionic/angular-toolkit/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/@ionic/cli": { "version": "6.18.1", "resolved": "https://registry.npmjs.org/@ionic/cli/-/cli-6.18.1.tgz", @@ -8193,12 +7584,12 @@ } }, "node_modules/@ionic/core": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.0.16.tgz", - "integrity": "sha512-rY9FTKupu6FAeTpbdkaMCPEeV/2ZPCviWSzi6X5RX1OiUP4EdNKj39KvUI++TPA2g8gYmmGsWR0BY3u8j7U/hA==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.1.10.tgz", + "integrity": "sha512-QmQvIe+IklQhNhbq438I3eCnL6XjfTxrgO1+paOdGNKk3R3o4mqJmV0YYT5r9iwnieHgDxKbo3ovs9UnTXhI7g==", "dependencies": { - "@stencil/core": "^2.14.2", - "ionicons": "^6.0.0", + "@stencil/core": "^2.16.0", + "ionicons": "^6.0.2", "tslib": "^2.1.0" } }, @@ -8480,19 +7871,6 @@ "node": ">=10.3.0" } }, - "node_modules/@ionic/utils-subprocess/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==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@ionic/utils-subprocess/node_modules/debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -8514,47 +7892,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/@ionic/utils-subprocess/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@ionic/utils-subprocess/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==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@ionic/utils-subprocess/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@ionic/utils-subprocess/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@ionic/utils-terminal": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.1.tgz", @@ -8581,20 +7918,6 @@ "node": ">=8" } }, - "node_modules/@ionic/utils-terminal/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@ionic/utils-terminal/node_modules/debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -8632,22 +7955,6 @@ "node": ">=8" } }, - "node_modules/@ionic/utils-terminal/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -9091,9 +8398,9 @@ "dev": true }, "node_modules/@stencil/core": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.15.0.tgz", - "integrity": "sha512-58+FPFpJCJScd5nmqVsZN+qk7aui57wFcMHWzySr1SQzoY8Efst9OPG7XRf27UsNj1DNeEdYWTtdrTfJyn3mZg==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.16.1.tgz", + "integrity": "sha512-s/UJp9qxExL3DyQPT70kiuWeb3AdjbUZM+5lEIXn30I2DLcLYPOPXfsoWJODieQywq+3vPiLZeIdkoqjf6jcSw==", "bin": { "stencil": "bin/stencil" }, @@ -9540,10 +8847,9 @@ } }, "node_modules/acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", - "dev": true, + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", "bin": { "acorn": "bin/acorn" }, @@ -9560,6 +8866,14 @@ "acorn": "^8" } }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", @@ -9757,12 +9071,6 @@ "ajv": "^6.9.1" } }, - "node_modules/ajv/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/alphanum-sort": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", @@ -9939,7 +9247,7 @@ "node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -9957,7 +9265,7 @@ "node_modules/arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", "dev": true, "engines": { "node": ">=0.10.0" @@ -9993,7 +9301,7 @@ "node_modules/array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -10029,7 +9337,7 @@ "node_modules/assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -10055,9 +9363,9 @@ } }, "node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "dependencies": { "lodash": "^4.17.14" @@ -10347,7 +9655,7 @@ "node_modules/base/node_modules/define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "dependencies": { "is-descriptor": "^1.0.0" @@ -10356,57 +9664,24 @@ "node": ">=0.10.0" } }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base64-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz", - "integrity": "sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/base64id": { "version": "2.0.0", @@ -10568,19 +9843,22 @@ "dev": true }, "node_modules/bplist-creator": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.7.tgz", - "integrity": "sha1-N98VNgkoJLh8QvlXsBNEEXNyrkU=", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", + "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "dependencies": { - "stream-buffers": "~2.2.0" + "stream-buffers": "2.2.x" } }, "node_modules/bplist-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz", - "integrity": "sha1-1g1dzCDLptx+HymbNdPh+V2vuuY=", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dependencies": { - "big-integer": "^1.6.7" + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" } }, "node_modules/brace-expansion": { @@ -10633,16 +9911,6 @@ "url": "https://opencollective.com/browserslist" } }, - "node_modules/browserslist/node_modules/caniuse-lite": { - "version": "1.0.30001286", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz", - "integrity": "sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, "node_modules/browserslist/node_modules/electron-to-chromium": { "version": "1.4.17", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.17.tgz", @@ -10752,18 +10020,6 @@ "node": ">= 10" } }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/cacache/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -11295,7 +10551,7 @@ "node_modules/class-utils/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "dependencies": { "is-descriptor": "^0.1.0" @@ -11304,6 +10560,77 @@ "node": ">=0.10.0" } }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -11333,64 +10660,35 @@ } }, "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, "node_modules/cliui/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/cliui/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/cliui/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/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==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/cliui/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==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/clone-deep": { @@ -11430,7 +10728,7 @@ "node_modules/collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", "dev": true, "dependencies": { "map-visit": "^1.0.0", @@ -11650,7 +10948,7 @@ "node_modules/copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -12048,20 +11346,6 @@ "node": ">= 5.10.0" } }, - "node_modules/cordova-common/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/cordova-common/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -12089,36 +11373,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/cordova-common/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/cordova-common/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/cordova-common/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/cordova-common/node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -12128,21 +11382,6 @@ "node": ">= 10.0.0" } }, - "node_modules/cordova-common/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/cordova-ios": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/cordova-ios/-/cordova-ios-6.2.0.tgz", @@ -12164,47 +11403,6 @@ "node": ">=10" } }, - "node_modules/cordova-ios/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/cordova-ios/node_modules/bplist-creator": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", - "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", - "dev": true, - "dependencies": { - "stream-buffers": "2.2.x" - } - }, - "node_modules/cordova-ios/node_modules/bplist-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", - "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", - "dev": true, - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, "node_modules/cordova-ios/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -12262,30 +11460,6 @@ "node": ">=10" } }, - "node_modules/cordova-ios/node_modules/simple-plist": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", - "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", - "dev": true, - "dependencies": { - "bplist-creator": "0.1.0", - "bplist-parser": "0.3.1", - "plist": "^3.0.5" - } - }, - "node_modules/cordova-ios/node_modules/simple-plist/node_modules/plist": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", - "integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==", - "dev": true, - "dependencies": { - "base64-js": "^1.5.1", - "xmlbuilder": "^9.0.7" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/cordova-ios/node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -12873,18 +12047,6 @@ "node": ">=8" } }, - "node_modules/critters/node_modules/nanoid": { - "version": "3.1.30", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/critters/node_modules/postcss": { "version": "8.4.5", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", @@ -12928,7 +12090,6 @@ "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", @@ -12942,7 +12103,6 @@ "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" }, @@ -13594,9 +12754,9 @@ } }, "node_modules/date-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", - "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.11.tgz", + "integrity": "sha512-VS20KRyorrbMCQmpdl2hg5KaOUsda1RbnsJg461FfrcyCUg+pkd0b40BSW4niQyTheww4DBXQnS7HwSrKkipLw==", "dev": true, "engines": { "node": ">=4.0" @@ -13742,44 +12902,6 @@ "node": ">=0.10.0" } }, - "node_modules/define-property/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/degenerator": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.1.tgz", @@ -14105,9 +13227,9 @@ } }, "node_modules/engine.io": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.0.tgz", - "integrity": "sha512-ErhZOVu2xweCjEfYcTdkCnEYUiZgkAcBBAhW4jbIvNG8SLU3orAqoJCiytZjYF7eTpVmmCrLDjLIEaPlUAs1uw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", + "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -14118,7 +13240,7 @@ "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~5.0.0", + "engine.io-parser": "~5.0.3", "ws": "~8.2.3" }, "engines": { @@ -14126,30 +13248,27 @@ } }, "node_modules/engine.io-parser": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.2.tgz", - "integrity": "sha512-wuiO7qO/OEkPJSFueuATIXtrxF7/6GTbAO9QLv7nnbjwZ5tYhLm9zxvLwxstRs0dcT0KUlWTjtIOs1T86jt12g==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", + "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", "dev": true, - "dependencies": { - "base64-arraybuffer": "~1.0.1" - }, "engines": { "node": ">=10.0.0" } }, "node_modules/engine.io/node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/engine.io/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -14663,15 +13782,12 @@ } }, "node_modules/eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", "dev": true, - "dependencies": { - "original": "^1.0.0" - }, "engines": { - "node": ">=0.12.0" + "node": ">=12.0.0" } }, "node_modules/execa": { @@ -14759,7 +13875,7 @@ "node_modules/expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", "dev": true, "dependencies": { "debug": "^2.3.3", @@ -14777,7 +13893,7 @@ "node_modules/expand-brackets/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "dependencies": { "is-descriptor": "^0.1.0" @@ -14789,7 +13905,7 @@ "node_modules/expand-brackets/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "dependencies": { "is-extendable": "^0.1.0" @@ -14798,6 +13914,86 @@ "node": ">=0.10.0" } }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -14863,7 +14059,7 @@ "node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, "dependencies": { "assign-symbols": "^1.0.0", @@ -14873,18 +14069,6 @@ "node": ">=0.10.0" } }, - "node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -14920,7 +14104,7 @@ "node_modules/extglob/node_modules/define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "dependencies": { "is-descriptor": "^1.0.0" @@ -14932,7 +14116,7 @@ "node_modules/extglob/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "dependencies": { "is-extendable": "^0.1.0" @@ -14941,40 +14125,11 @@ "node": ">=0.10.0" } }, - "node_modules/extglob/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, "engines": { "node": ">=0.10.0" } @@ -15199,12 +14354,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/flat-cache/node_modules/flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", - "dev": true - }, "node_modules/flat-cache/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -15221,9 +14370,9 @@ } }, "node_modules/flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, "node_modules/flatten": { @@ -15234,9 +14383,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz", - "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", "dev": true, "funding": [ { @@ -15256,7 +14405,7 @@ "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -15314,7 +14463,7 @@ "node_modules/fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", "dev": true, "dependencies": { "map-cache": "^0.2.2" @@ -15443,23 +14592,6 @@ } } }, - "node_modules/fttx-phonegap-plugin-barcodescanner/node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -15494,20 +14626,6 @@ "node": ">=8" } }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/gauge/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -15632,7 +14750,7 @@ "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -15911,7 +15029,7 @@ "node_modules/has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", "dev": true, "dependencies": { "get-value": "^2.0.6", @@ -15925,7 +15043,7 @@ "node_modules/has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", "dev": true, "dependencies": { "is-number": "^3.0.0", @@ -15938,7 +15056,7 @@ "node_modules/has-values/node_modules/is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, "dependencies": { "kind-of": "^3.0.2" @@ -15950,7 +15068,7 @@ "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -15962,7 +15080,7 @@ "node_modules/has-values/node_modules/kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -16446,7 +15564,7 @@ "node_modules/import-local/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=", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "engines": { "node": ">=4" @@ -16690,7 +15808,7 @@ "node_modules/internal-ip/node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -16699,7 +15817,7 @@ "node_modules/internal-ip/node_modules/npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, "dependencies": { "path-key": "^2.0.0" @@ -16711,7 +15829,7 @@ "node_modules/internal-ip/node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, "engines": { "node": ">=4" @@ -16720,7 +15838,7 @@ "node_modules/internal-ip/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=", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "dependencies": { "shebang-regex": "^1.0.0" @@ -16732,7 +15850,7 @@ "node_modules/internal-ip/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=", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -16760,23 +15878,11 @@ } }, "node_modules/ionicons": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-6.0.1.tgz", - "integrity": "sha512-xQekOJsxH82O7oB+3F60zeRggCdND9pJ/k0E6IJDVUGGlCj5mlyFqNgxUimytKgstPGv3S+3EmCxjefvtGgWUg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-6.0.2.tgz", + "integrity": "sha512-AyKfFaUKVoBz4eB8XkU7H1R5HFnVsgq5ijqSdbXC0lES9PDK/J6LUQz6XUJq0mVVQF5k9kczSPOLMW3mszG0mQ==", "dependencies": { - "@stencil/core": "~2.12.0" - } - }, - "node_modules/ionicons/node_modules/@stencil/core": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.12.1.tgz", - "integrity": "sha512-u24TZ+FEvjnZt5ZgIkLjLpUNsO6Ml3mUZqwmqk81w6RWWz75hgB5p4RFI5rvuErFeh2xvMIGo+pNdG24XUBz1A==", - "bin": { - "stencil": "bin/stencil" - }, - "engines": { - "node": ">=12.10.0", - "npm": ">=6.0.0" + "@stencil/core": "~2.16.0" } }, "node_modules/ios-sim": { @@ -16826,7 +15932,7 @@ "node_modules/ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", "dev": true, "engines": { "node": ">=4" @@ -16851,24 +15957,12 @@ } }, "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "kind-of": "^6.0.0" }, "engines": { "node": ">=0.10.0" @@ -16951,24 +16045,12 @@ } }, "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "kind-of": "^6.0.0" }, "engines": { "node": ">=0.10.0" @@ -17000,28 +16082,19 @@ } }, "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-docker": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", @@ -17031,10 +16104,13 @@ } }, "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, "engines": { "node": ">=0.10.0" } @@ -17200,7 +16276,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, "engines": { "node": ">=8" }, @@ -17785,12 +16860,6 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, - "node_modules/json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, "node_modules/json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -17871,15 +16940,15 @@ } }, "node_modules/karma": { - "version": "6.3.9", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.9.tgz", - "integrity": "sha512-E/MqdLM9uVIhfuyVnrhlGBu4miafBdXEAEqCmwdEMh3n17C7UWC/8Kvm3AYKr91gc7scutekZ0xv6rxRaUCtnw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.0.tgz", + "integrity": "sha512-s8m7z0IF5g/bS5ONT7wsOavhW4i4aFkzD4u4wgzAQWT4HGUeWI3i21cK2Yz6jndMAeHETp5XuNsRoyGJZXVd4w==", "dev": true, "dependencies": { + "@colors/colors": "1.5.0", "body-parser": "^1.19.0", "braces": "^3.0.2", "chokidar": "^3.5.1", - "colors": "^1.4.0", "connect": "^3.7.0", "di": "^0.0.1", "dom-serialize": "^2.2.1", @@ -17888,13 +16957,14 @@ "http-proxy": "^1.18.1", "isbinaryfile": "^4.0.8", "lodash": "^4.17.21", - "log4js": "^6.3.0", + "log4js": "^6.4.1", "mime": "^2.5.2", "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", - "socket.io": "^4.2.0", + "socket.io": "^4.4.1", "source-map": "^0.6.1", "tmp": "^0.2.1", "ua-parser-js": "^0.7.30", @@ -17973,41 +17043,6 @@ "source-map-support": "^0.5.5" } }, - "node_modules/karma/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/karma/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/karma/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "node_modules/karma/node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -18070,18 +17105,6 @@ "node": ">=0.10.0" } }, - "node_modules/karma/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/karma/node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -18094,23 +17117,6 @@ "node": ">=8.17.0" } }, - "node_modules/karma/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/karma/node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -18516,25 +17522,25 @@ } }, "node_modules/log4js": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", - "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.5.2.tgz", + "integrity": "sha512-DXtpNtt+KDOMT7RHUDIur/WsSA3rntlUh9Zg4XCdV42wUuMmbFkl38+LZ92Z5QvQA7mD5kAVkLiBSEH/tvUB8A==", "dev": true, "dependencies": { - "date-format": "^3.0.0", - "debug": "^4.1.1", - "flatted": "^2.0.1", - "rfdc": "^1.1.4", - "streamroller": "^2.2.4" + "date-format": "^4.0.10", + "debug": "^4.3.4", + "flatted": "^3.2.5", + "rfdc": "^1.3.0", + "streamroller": "^3.1.1" }, "engines": { "node": ">=8.0" } }, "node_modules/log4js/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -18765,7 +17771,7 @@ "node_modules/map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -18786,7 +17792,7 @@ "node_modules/map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", "dev": true, "dependencies": { "object-visit": "^1.0.0" @@ -18905,7 +17911,7 @@ "node_modules/memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", "dev": true, "dependencies": { "errno": "^0.1.3", @@ -18938,30 +17944,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/meow/node_modules/normalize-package-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.1.tgz", @@ -19264,9 +18246,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/minimist-options": { "version": "4.1.0", @@ -19305,18 +18287,6 @@ "node": ">= 8" } }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/minipass-fetch": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", @@ -19346,18 +18316,6 @@ "node": ">= 8" } }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/minipass-json-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", @@ -19380,18 +18338,6 @@ "node": ">=8" } }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/minipass-sized": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", @@ -19429,18 +18375,6 @@ "node": ">=0.10.0" } }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -19460,9 +18394,9 @@ "dev": true }, "node_modules/moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", + "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", "engines": { "node": "*" } @@ -19497,16 +18431,16 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "node_modules/nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", "dev": true, "optional": true }, "node_modules/nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -19960,7 +18894,6 @@ "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" }, @@ -20022,7 +18955,7 @@ "node_modules/object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", "dev": true, "dependencies": { "copy-descriptor": "^0.1.0", @@ -20036,7 +18969,7 @@ "node_modules/object-copy/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "dependencies": { "is-descriptor": "^0.1.0" @@ -20045,10 +18978,57 @@ "node": ">=0.10.0" } }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-copy/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -20093,7 +19073,7 @@ "node_modules/object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", "dev": true, "dependencies": { "isobject": "^3.0.0" @@ -20123,7 +19103,7 @@ "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "dev": true, "dependencies": { "isobject": "^3.0.1" @@ -20231,7 +19211,7 @@ "node_modules/opn/node_modules/is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", "dev": true, "engines": { "node": ">=4" @@ -20361,15 +19341,6 @@ "node": ">=8" } }, - "node_modules/original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "dependencies": { - "url-parse": "^1.4.3" - } - }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -20757,7 +19728,7 @@ "node_modules/pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -20766,7 +19737,7 @@ "node_modules/path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", "dev": true }, "node_modules/path-exists": { @@ -20796,7 +19767,6 @@ "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" } @@ -20903,13 +19873,12 @@ } }, "node_modules/plist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", - "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==", "dependencies": { - "base64-js": "^1.2.3", - "xmlbuilder": "^9.0.7", - "xmldom": "0.1.x" + "base64-js": "^1.5.1", + "xmlbuilder": "^9.0.7" }, "engines": { "node": ">=6" @@ -20947,7 +19916,7 @@ "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -23267,9 +22236,9 @@ } }, "node_modules/protractor/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==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { "node": ">=8" @@ -23341,25 +22310,6 @@ "node": ">=0.10.0" } }, - "node_modules/protractor/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/protractor/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/protractor/node_modules/globby": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", @@ -23377,15 +22327,6 @@ "node": ">=0.10.0" } }, - "node_modules/protractor/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/protractor/node_modules/is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -23419,39 +22360,6 @@ "node": ">=0.10.0" } }, - "node_modules/protractor/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/protractor/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/protractor/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/protractor/node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -23489,32 +22397,6 @@ "source-map": "^0.5.6" } }, - "node_modules/protractor/node_modules/string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/protractor/node_modules/string-width/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/protractor/node_modules/supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -23926,52 +22808,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/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/read-pkg-up/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/read-pkg-up/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/read-pkg-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/read-pkg-up/node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -23981,24 +22817,6 @@ "node": ">=8" } }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", @@ -24233,7 +23051,7 @@ "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", "dev": true }, "node_modules/repeat-element": { @@ -24331,7 +23149,7 @@ "node_modules/resolve-cwd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", "dev": true, "dependencies": { "resolve-from": "^3.0.0" @@ -24343,7 +23161,7 @@ "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, "engines": { "node": ">=4" @@ -24543,7 +23361,7 @@ "node_modules/safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", "dev": true, "dependencies": { "ret": "~0.1.10" @@ -24690,9 +23508,9 @@ } }, "node_modules/selfsigned": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", - "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "version": "1.10.14", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", + "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", "dev": true, "dependencies": { "node-forge": "^0.10.0" @@ -24838,7 +23656,7 @@ "node_modules/set-value/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "dependencies": { "is-extendable": "^0.1.0" @@ -24847,6 +23665,15 @@ "node": ">=0.10.0" } }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", @@ -24868,7 +23695,6 @@ "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" }, @@ -24880,7 +23706,6 @@ "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" } @@ -24931,13 +23756,13 @@ } }, "node_modules/simple-plist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.0.0.tgz", - "integrity": "sha512-043L2rO80LVF7zfZ+fqhsEkoJFvW8o59rt/l4ctx1TJWoTx7/jkiS1R5TatD15Z1oYnuLJytzE7gcnnBuIPL2g==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", + "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dependencies": { - "bplist-creator": "0.0.7", - "bplist-parser": "0.1.1", - "plist": "^3.0.1" + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" } }, "node_modules/skwas-cordova-plugin-datetimepicker": { @@ -24985,14 +23810,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, "node_modules/smart-buffer": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", @@ -25038,7 +23855,7 @@ "node_modules/snapdragon-node/node_modules/define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "dependencies": { "is-descriptor": "^1.0.0" @@ -25047,60 +23864,70 @@ "node": ">=0.10.0" } }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "dependencies": { - "kind-of": "^6.0.0" + "kind-of": "^3.2.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { - "kind-of": "^6.0.0" + "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "dependencies": { - "kind-of": "^3.2.0" + "is-extendable": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon-util/node_modules/kind-of": { + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -25109,34 +23936,66 @@ "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "dependencies": { - "is-descriptor": "^0.1.0" + "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { - "is-extendable": "^0.1.0" + "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/snapdragon/node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -25157,16 +24016,16 @@ } }, "node_modules/socket.io": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.0.tgz", - "integrity": "sha512-bnpJxswR9ov0Bw6ilhCvO38/1WPtE3eA2dtxi2Iq4/sFebiDJQzgKNYA7AuVVdGW09nrESXd90NbZqtDd9dzRQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.1.tgz", + "integrity": "sha512-0y9pnIso5a9i+lJmsCdtmTTgJFFSvNQKDnPQRz28mGNnxbmqYg2QPtJTLFxhymFZhAIn50eHAKzJeiNaKr+yUQ==", "dev": true, "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~6.1.0", - "socket.io-adapter": "~2.3.3", + "engine.io": "~6.2.0", + "socket.io-adapter": "~2.4.0", "socket.io-parser": "~4.0.4" }, "engines": { @@ -25174,9 +24033,9 @@ } }, "node_modules/socket.io-adapter": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", - "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", "dev": true }, "node_modules/socket.io-parser": { @@ -25194,9 +24053,9 @@ } }, "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -25217,9 +24076,9 @@ "dev": true }, "node_modules/socket.io/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -25251,17 +24110,22 @@ } }, "node_modules/sockjs-client": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", - "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", + "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", "dev": true, "dependencies": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", + "debug": "^3.2.7", + "eventsource": "^2.0.2", + "faye-websocket": "^0.11.4", "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.5.3" + "url-parse": "^1.5.10" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://tidelift.com/funding/github/npm/sockjs-client" } }, "node_modules/sockjs-client/node_modules/debug": { @@ -25668,18 +24532,6 @@ "node": ">= 8" } }, - "node_modules/ssri/node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -25689,7 +24541,7 @@ "node_modules/static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", "dev": true, "dependencies": { "define-property": "^0.2.5", @@ -25702,7 +24554,7 @@ "node_modules/static-extend/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "dependencies": { "is-descriptor": "^0.1.0" @@ -25711,6 +24563,77 @@ "node": ">=0.10.0" } }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -25722,7 +24645,7 @@ "node_modules/stream-buffers": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "engines": { "node": ">= 0.10.0" } @@ -25737,32 +24660,23 @@ } }, "node_modules/streamroller": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", - "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.1.tgz", + "integrity": "sha512-iPhtd9unZ6zKdWgMeYGfSBuqCngyJy1B/GPi/lTpwGpa3bajuX30GjUVd0/Tn/Xhg0mr4DOSENozz9Y06qyonQ==", "dev": true, "dependencies": { - "date-format": "^2.1.0", - "debug": "^4.1.1", - "fs-extra": "^8.1.0" + "date-format": "^4.0.10", + "debug": "^4.3.4", + "fs-extra": "^10.1.0" }, "engines": { "node": ">=8.0" } }, - "node_modules/streamroller/node_modules/date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/streamroller/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -25776,12 +24690,47 @@ } } }, + "node_modules/streamroller/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/streamroller/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/streamroller/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/streamroller/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -25791,13 +24740,13 @@ } }, "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" @@ -25812,11 +24761,11 @@ } }, "node_modules/string-width/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==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -25852,7 +24801,7 @@ "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "dev": true, "engines": { "node": ">=0.10.0" @@ -26012,34 +24961,6 @@ "node": ">=8" } }, - "node_modules/stylelint/node_modules/autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", - "dev": true, - "dependencies": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - }, - "node_modules/stylelint/node_modules/caniuse-lite": { - "version": "1.0.30001165", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz", - "integrity": "sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA==", - "dev": true - }, "node_modules/stylelint/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -26092,28 +25013,6 @@ "node": ">=8" } }, - "node_modules/stylelint/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/stylelint/node_modules/cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/stylelint/node_modules/debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", @@ -26131,79 +25030,12 @@ } } }, - "node_modules/stylelint/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/stylelint/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/stylelint/node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/stylelint/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint/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/stylelint/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/stylelint/node_modules/parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stylelint/node_modules/picocolors": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", @@ -26227,30 +25059,6 @@ "url": "https://opencollective.com/postcss/" } }, - "node_modules/stylelint/node_modules/postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/stylelint/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/stylelint/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -26260,20 +25068,6 @@ "node": ">=0.10.0" } }, - "node_modules/stylelint/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/stylelint/node_modules/strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -26681,68 +25475,12 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/table/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/table/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/table/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/table/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/table/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/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/tail": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/tail/-/tail-0.4.0.tgz", @@ -26969,7 +25707,7 @@ "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", "dev": true, "dependencies": { "kind-of": "^3.0.2" @@ -26981,7 +25719,7 @@ "node_modules/to-object-path/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -27358,6 +26096,15 @@ "node": ">=0.10.0" } }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", @@ -27446,7 +26193,7 @@ "node_modules/unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", "dev": true, "dependencies": { "has-value": "^0.3.1", @@ -27459,7 +26206,7 @@ "node_modules/unset-value/node_modules/has-value": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", "dev": true, "dependencies": { "get-value": "^2.0.3", @@ -27473,7 +26220,7 @@ "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", "dev": true, "dependencies": { "isarray": "1.0.0" @@ -27485,7 +26232,7 @@ "node_modules/unset-value/node_modules/has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -27536,9 +26283,9 @@ } }, "node_modules/url-parse": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", - "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, "dependencies": { "querystringify": "^2.1.1", @@ -27685,9 +26432,13 @@ } }, "node_modules/vm2": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.5.tgz", - "integrity": "sha512-LuCAHZN75H9tdrAiLFf030oW7nJV5xwNMuk1ymOZwopmuK3d2H4L1Kv4+GFHgarKiLfXXLFU+7LDABHnwOkWng==", + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.9.tgz", + "integrity": "sha512-xwTm7NLh/uOjARRBs8/95H0e8fT3Ukw5D/JJWhxMbhKzNh1Nu981jQKvkep9iKYNxzlVrdzD0mlBGkDKZWprlw==", + "dependencies": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, "bin": { "vm2": "bin/vm2" }, @@ -28274,19 +27025,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/windows-release/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==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/windows-release/node_modules/execa": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", @@ -28323,69 +27061,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/windows-release/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/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==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/windows-release/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/windows-release/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==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/windows-release/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/windows-release/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/with-open-file": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz", @@ -28425,67 +27100,52 @@ } }, "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, + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-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/wrap-ansi/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/wrap-ansi/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, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=4" + "node": ">=8" } }, - "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, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/wrap-ansi/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, + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/wrappy": { @@ -28576,12 +27236,6 @@ "node": ">=4.0.0" } }, - "node_modules/xml2js/node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, "node_modules/xml2js/node_modules/xmlbuilder": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", @@ -28599,15 +27253,6 @@ "node": ">=4.0" } }, - "node_modules/xmldom": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", - "deprecated": "Deprecated due to CVE-2021-21366 resolved in 0.5.0", - "engines": { - "node": ">=0.1" - } - }, "node_modules/xregexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", @@ -28637,127 +27282,39 @@ } }, "node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "dev": true, "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "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/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/yargs/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/yargs/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/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/yargs/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/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/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" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" }, "engines": { - "node": ">=6" - } - }, - "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": ">=12" } }, - "node_modules/yargs/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==", + "node_modules/yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/yargs/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==", + "node_modules/yargs/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, "engines": { - "node": ">=6" + "node": ">=10" } }, "node_modules/yn": { @@ -28789,11 +27346,6 @@ "tslib": "^2.0.0" } }, - "node_modules/zone.js/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" - }, "node_modules/zwitch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", @@ -28924,30 +27476,6 @@ "webpack-subresource-integrity": "5.0.0" }, "dependencies": { - "@angular-devkit/architect": { - "version": "0.1301.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1301.1.tgz", - "integrity": "sha512-3g1wlqihVEOhClsuSzyJYm8Sr4qc4IUDuOa45m8439bz9iQy2wZ3JUGTwX1NcpeLxmCDrgewuphIsW096HxYlg==", - "dev": true, - "requires": { - "@angular-devkit/core": "13.1.1", - "rxjs": "6.6.7" - } - }, - "@angular-devkit/core": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.1.1.tgz", - "integrity": "sha512-tpOOzdrbrXG+BiJ/iKUX5VU5vBXN/n+H1EMThTwjgT11mqw2uvMj4sSRPvHUrrfxbLE9deuCDQEzmci71enn2w==", - "dev": true, - "requires": { - "ajv": "8.8.2", - "ajv-formats": "2.1.1", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" - } - }, "@babel/code-frame": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", @@ -29065,27 +27593,6 @@ "debug": "4" } }, - "ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - } - }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -29127,12 +27634,6 @@ "unique-filename": "^1.1.1" } }, - "core-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", - "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", - "dev": true - }, "debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -29168,12 +27669,6 @@ "esbuild-windows-arm64": "0.14.2" } }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -29265,12 +27760,6 @@ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -29283,12 +27772,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "nanoid": { - "version": "3.1.30", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", - "dev": true - }, "open": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", @@ -29406,9 +27889,9 @@ } }, "@angular-devkit/build-optimizer": { - "version": "0.1202.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1202.14.tgz", - "integrity": "sha512-I9dtwE5g4ZM2zJF3oveYhk6yFY2zYakONHyuG6YWz6oMBT0n5czggWZ2di7oggciVVdoyrTlHiApZnttQJyaWw==", + "version": "0.1202.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1202.17.tgz", + "integrity": "sha512-1qWGWw7cCNADB4LZ/zjiSK0GLmr2kebYyNG0KutCE8GNVxv2h6w6dJP6t1C/BgskRuBPCAhvE+lEKN8ljSutag==", "dev": true, "requires": { "source-map": "0.7.3", @@ -29434,63 +27917,6 @@ "rxjs": "6.6.7" }, "dependencies": { - "@angular-devkit/architect": { - "version": "0.1301.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1301.1.tgz", - "integrity": "sha512-3g1wlqihVEOhClsuSzyJYm8Sr4qc4IUDuOa45m8439bz9iQy2wZ3JUGTwX1NcpeLxmCDrgewuphIsW096HxYlg==", - "dev": true, - "requires": { - "@angular-devkit/core": "13.1.1", - "rxjs": "6.6.7" - } - }, - "@angular-devkit/core": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.1.1.tgz", - "integrity": "sha512-tpOOzdrbrXG+BiJ/iKUX5VU5vBXN/n+H1EMThTwjgT11mqw2uvMj4sSRPvHUrrfxbLE9deuCDQEzmci71enn2w==", - "dev": true, - "requires": { - "ajv": "8.8.2", - "ajv-formats": "2.1.1", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" - } - }, - "ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -29826,32 +28252,6 @@ "yargs": "^17.2.1" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "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" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -29866,64 +28266,6 @@ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.0.tgz", - "integrity": "sha512-GQl1pWyDoGptFPJx9b9L6kmR33TGusZvXIZUT+BOz9f7X2L94oeAskFYLEg/FkhV06zZPBYLvLZRWeYId29lew==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - } - }, - "yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", - "dev": true } } }, @@ -30027,46 +28369,6 @@ "@babel/highlight": "^7.10.4" } }, - "@babel/generator": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", - "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", - "dev": true, - "requires": { - "@babel/types": "^7.10.5", - "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.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", - "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", @@ -30078,51 +28380,6 @@ "js-tokens": "^4.0.0" } }, - "@babel/parser": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", - "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", - "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.10.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", - "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.5", - "@babel/types": "^7.10.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -30132,15 +28389,6 @@ "ms": "^2.1.1" } }, - "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" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -30373,19 +28621,6 @@ "dev": true, "requires": { "@babel/types": "^7.10.5" - }, - "dependencies": { - "@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-module-imports": { @@ -30395,19 +28630,6 @@ "dev": true, "requires": { "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-module-transforms": { @@ -30423,65 +28645,6 @@ "@babel/template": "^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-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", - "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.10.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", - "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", - "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.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", - "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": { @@ -30491,19 +28654,6 @@ "dev": true, "requires": { "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-plugin-utils": { @@ -30533,134 +28683,6 @@ "@babel/helper-optimise-call-expression": "^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.10.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", - "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", - "dev": true, - "requires": { - "@babel/types": "^7.10.5", - "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.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", - "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.10.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", - "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", - "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.10.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", - "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.5", - "@babel/types": "^7.10.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "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" - } - }, - "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 - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } } }, "@babel/helper-simple-access": { @@ -30671,56 +28693,6 @@ "requires": { "@babel/template": "^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/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.10.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", - "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", - "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.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", - "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": { @@ -30774,134 +28746,6 @@ "@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.10.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", - "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", - "dev": true, - "requires": { - "@babel/types": "^7.10.5", - "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.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", - "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.10.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", - "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", - "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.10.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", - "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.5", - "@babel/types": "^7.10.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "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" - } - }, - "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 - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } } }, "@babel/highlight": { @@ -30913,14 +28757,6 @@ "chalk": "^2.0.0", "esutils": "^2.0.2", "js-tokens": "^4.0.0" - }, - "dependencies": { - "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 - } } }, "@babel/parser": { @@ -32069,6 +29905,12 @@ } } }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true + }, "@csstools/convert-colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", @@ -32093,13 +29935,6 @@ "integrity": "sha512-IlyvC8KTwjKNZvVWYI6/sPPgFxgQscJPTBhv90qFH5QOt7DZQLoGviiQC6wXSvybEnbP3YvDdXTGKKrFbS9k4w==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/app-minimize": { @@ -32108,13 +29943,6 @@ "integrity": "sha512-RvMUP85BfZKQGwxz7uVJVb5BHbgkIy4U7mSsJRX3b7QzQDfxGZ2Ud9YY4rcpSUA3fGujJqHgtkvoaGknxugx1g==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/app-version": { @@ -32123,13 +29951,6 @@ "integrity": "sha512-Mx4zBq1RpMOrazPaN/B4ToJBxmOtzFVG5wGjeTSovVaOzFiz8Dct7H6hwVScifIABOEA0i2gtqtwuSylJzTGWA==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/camera": { @@ -32138,13 +29959,6 @@ "integrity": "sha512-mu234nKCjVziPUFD4EYfz4XbCZqV4uKLQf1IEd4YtPAe9ooYt/1HLcvftK8+BNVfWm8JrDtWSmvvmHZalHxXuA==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/core": { @@ -32153,13 +29967,6 @@ "integrity": "sha512-BmjQqMzm6JE2V9Kj07cTA27frm516KMAViSpRNi4MQxPm9lHp9mxBGFDa4pqS/C0G8lA2kVh40fEZA0nOH9w+g==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/deeplinks": { @@ -32168,13 +29975,6 @@ "integrity": "sha512-NMO1iT89+42I2ryeMJSpDN8mrISj6NikCr9/iPxA5oBQzxv4eYtJqK1Ns5p28B1d3WZuB107WKYWqe9Z/jyHRw==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/device": { @@ -32191,13 +29991,6 @@ "integrity": "sha512-N6tvCmLBYnY+fDeEhI+7kYHuIVcZ/JtrhRIepJ9qpF82DTvMg0fXy5XToKZ5hqthbKAwci8//A8Etp0oBzjx+w==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/file-chooser": { @@ -32206,13 +29999,6 @@ "integrity": "sha512-I5BfFkRnVlUs/EFFhaP2ou854gih+wSHNbDxa6X2rx0KEgoqSSl0KtAHkUwpKcpvss1ZlsQ65kcs5bR93yZuvA==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/file-path": { @@ -32221,13 +30007,6 @@ "integrity": "sha512-hFnvWsou1XRtt/OlxzpJos6Xii54oxCpnF6/pM2zQGBVMGaNoBgRnBsL+GtlycJmQqp/tZJAy4JDcanflHaTtg==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/file-picker": { @@ -32236,13 +30015,6 @@ "integrity": "sha512-2xVzncPUMsEludy9olGp7Z2a3nLmIiY7PvAaWQvEO4/hbwPZRezJUpFZoNbQm1rrnic915oM+FxokUKI611Xzw==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/file-transfer": { @@ -32251,13 +30023,6 @@ "integrity": "sha512-6jmT7tlh3A+H9OW+wpWbCNK+AOuVBUF+74NSrbmbqYg5py/VzMROCJtU84pb0OnBsqnxVvXqwPmodLwYMNFXBg==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/geolocation": { @@ -32266,13 +30031,6 @@ "integrity": "sha512-eQhFxeefK3fjwVyLs94jThc2y9s5qfk7QKX6BGfJTkGf3IOyZyBmFSepHF4kAQ8x1E4pa9KhhH35bZc+5NjkZA==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/globalization": { @@ -32281,13 +30039,6 @@ "integrity": "sha512-DNY1UP8VAEIDYeJjz1rvMEJoeO+GvpPwdO/YlODlASVi/H7s7ZwOMO5giFPz49KG6fw1VAvqqyWxHTngm8mG1w==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/image-picker": { @@ -32296,13 +30047,6 @@ "integrity": "sha512-18b5XYf6l0xu0AGGqsib1qgcMkxwssFMK5rz3Ih+DvLH0M9g+gPocofIpSko689KsBmAy/UDxJv8Nr81egPTJQ==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/in-app-browser": { @@ -32311,13 +30055,6 @@ "integrity": "sha512-WDy4ogZdPPjM8WoE6cOx+odIMhW9Pupv2eIIW1KdSsNWCwV/WL+oqFquxDvvUoaNGWosyVvziYdPU4dk6pZN/A==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/insomnia": { @@ -32326,13 +30063,6 @@ "integrity": "sha512-6qgNdEg78/k3fHaEdHDxB4ftNBSCRKPjfXiOFlaj2YwODuYCP+AXtSTRxSBNO1lU6Aid/NuPLdTp98lKq4qTVg==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/keyboard": { @@ -32341,13 +30071,6 @@ "integrity": "sha512-IDNcF2iJ+ze2qPyPgWJ5TkwP5txS6uv9gan8LkxK3zTBKznQvRhznZHbx5fXluehYa1gQZp43BOoXc/PwpT7UA==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/screen-orientation": { @@ -32356,13 +30079,6 @@ "integrity": "sha512-+VILGrCJO76Ta6Mudd6IKc66xDek1uw5OEovFWjGCqkg0OYHFIiJFZNx4NLhF5hA1UKN2fWE6qDJaSXR+1w1Rg==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/social-sharing": { @@ -32371,13 +30087,6 @@ "integrity": "sha512-tlBNgqESB0dxKoYY61DhTx+4oP25yAGpLynS8JZ3St0vD2VjfQ//2+uVxpo8G3E2A4mEcv7+TWQ1++STphXlRw==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/splash-screen": { @@ -32386,13 +30095,6 @@ "integrity": "sha512-tSrWkm+hIgc049bRHbUDRIxxNi201LFMxD9CL78h8XzJGb+FJkkxxfA6dsCI60zm2tPOeC42ronBqss99mxeEQ==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/status-bar": { @@ -32401,13 +30103,6 @@ "integrity": "sha512-fdmLSsPnZCZERjoxzeRTB1quxf7ntqD6xdt1zB0A9FaZ7zFgEq0+RibasWXqEi/oYzqNgN35rV0FvMyGXPzw3g==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic-native/three-dee-touch": { @@ -32416,21 +30111,14 @@ "integrity": "sha512-Ujh+kbCebCSIdAOmbEOdBCjVoRryjjYWsC1cG6Wj4j6KVZJcmO9BlENN8qskkWiLKwT2rbXrod0cfgAal8QGXA==", "requires": { "@types/cordova": "latest" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } } }, "@ionic/angular": { - "version": "6.0.14", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.0.14.tgz", - "integrity": "sha512-6x8vFYUjjNJm1dRZvpxAZNaGere4XIs4McAYirn+3DpgBMDUitEbxI1T3pXvFFDCTc+JuoVn7lf1ZgazVUazVA==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.1.10.tgz", + "integrity": "sha512-fjx70IDTGFIY8x5JSImF+cai8Z6gr5BfEp0SBP7sYPmCjWLLAJMC/uyqvvGgMURd9Rr059nSoNc6CjeYZsMVcQ==", "requires": { - "@ionic/core": "^6.0.14", + "@ionic/core": "^6.1.10", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" } @@ -32465,26 +30153,42 @@ } }, "@angular-devkit/architect": { - "version": "0.1202.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.14.tgz", - "integrity": "sha512-n+0tDLKtCK9VHZEmwiPixvlwC5JAraFIfT7p/srVGVxzYckixrnBWeqcz5zcUyh2CFBzh+fAKoZlNXlDJ1XKnA==", + "version": "0.1202.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.17.tgz", + "integrity": "sha512-uUQcHcLbPvr9adALQSLU1MTDduVUR2kZAHi2e7SmL9ioel84pPVXBoD0WpSBeUMKwPiDs3TQDaxDB49hl0nBSQ==", "dev": true, "requires": { - "@angular-devkit/core": "12.2.14", + "@angular-devkit/core": "12.2.17", "rxjs": "6.6.7" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.17.tgz", + "integrity": "sha512-PyOY7LGUPPd6rakxUYbfQN6zAdOCMCouVp5tERY1WTdMdEiuULOtHsPee8kNbh75pD59KbJNU+fwozPRMuIm5g==", + "dev": true, + "requires": { + "ajv": "8.6.2", + "ajv-formats": "2.1.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + } + } } }, "@angular-devkit/build-angular": { - "version": "12.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.2.14.tgz", - "integrity": "sha512-oN/Rw+hL3T9EuzRauILJLiLgyyxgG4hjSO+W0EO9uYL3Q08+XmcmOKQgm0c3LAJFyk+REeOy6y4Gb3P7ZcfJ0Q==", + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.2.17.tgz", + "integrity": "sha512-uc3HGHVQyatqQ/M53oxYBvhz0jx0hgdc7WT+L56GLHvgz7Ct2VEbpWaMfwHkFfE1F1iHkIgnTKHKWacJl1yQIg==", "dev": true, "requires": { "@ampproject/remapping": "1.0.1", - "@angular-devkit/architect": "0.1202.14", - "@angular-devkit/build-optimizer": "0.1202.14", - "@angular-devkit/build-webpack": "0.1202.14", - "@angular-devkit/core": "12.2.14", + "@angular-devkit/architect": "0.1202.17", + "@angular-devkit/build-optimizer": "0.1202.17", + "@angular-devkit/build-webpack": "0.1202.17", + "@angular-devkit/core": "12.2.17", "@babel/core": "7.14.8", "@babel/generator": "7.14.8", "@babel/helper-annotate-as-pure": "7.14.5", @@ -32496,7 +30200,7 @@ "@babel/template": "7.14.5", "@discoveryjs/json-ext": "0.5.3", "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@ngtools/webpack": "12.2.14", + "@ngtools/webpack": "12.2.17", "ansi-colors": "4.1.1", "babel-loader": "8.2.2", "browserslist": "^4.9.1", @@ -32547,19 +30251,43 @@ "tslib": "2.3.0", "webpack": "5.50.0", "webpack-dev-middleware": "5.0.0", - "webpack-dev-server": "3.11.2", + "webpack-dev-server": "3.11.3", "webpack-merge": "5.8.0", "webpack-subresource-integrity": "1.5.2" }, "dependencies": { - "@angular-devkit/architect": { - "version": "0.1202.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.14.tgz", - "integrity": "sha512-n+0tDLKtCK9VHZEmwiPixvlwC5JAraFIfT7p/srVGVxzYckixrnBWeqcz5zcUyh2CFBzh+fAKoZlNXlDJ1XKnA==", + "@angular-devkit/core": { + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.17.tgz", + "integrity": "sha512-PyOY7LGUPPd6rakxUYbfQN6zAdOCMCouVp5tERY1WTdMdEiuULOtHsPee8kNbh75pD59KbJNU+fwozPRMuIm5g==", "dev": true, "requires": { - "@angular-devkit/core": "12.2.14", - "rxjs": "6.6.7" + "ajv": "8.6.2", + "ajv-formats": "2.1.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } } }, "ajv": { @@ -32635,25 +30363,13 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1202.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1202.14.tgz", - "integrity": "sha512-95pw4tXAaqUZqHS8cMQQbfPyzviPmMyqt4/kywLGmo3Fow8DeHn90SzVmANlDo2DQ1J+LaKeQD2alclbtAQP5A==", + "version": "0.1202.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1202.17.tgz", + "integrity": "sha512-z7FW43DJ4p8UZwbFRmMrh2ohqhI2Wtdg3+FZiTnl4opb3zYheGiNxPlTuiyKjG21JUkGCdthkkBLCNfaUU0U/Q==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1202.14", + "@angular-devkit/architect": "0.1202.17", "rxjs": "6.6.7" - }, - "dependencies": { - "@angular-devkit/architect": { - "version": "0.1202.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.14.tgz", - "integrity": "sha512-n+0tDLKtCK9VHZEmwiPixvlwC5JAraFIfT7p/srVGVxzYckixrnBWeqcz5zcUyh2CFBzh+fAKoZlNXlDJ1XKnA==", - "dev": true, - "requires": { - "@angular-devkit/core": "12.2.14", - "rxjs": "6.6.7" - } - } } }, "@angular-devkit/core": { @@ -32681,6 +30397,48 @@ "rxjs": "6.6.7" } }, + "@angular/compiler": { + "version": "12.2.16", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.2.16.tgz", + "integrity": "sha512-nsYEw+yu8QyeqPf9nAmG419i1mtGM4v8+U+S3eQHQFXTgJzLymMykWHYu2ETdjUpNSLK6xcIQDBWtWnWSfJjAA==", + "dev": true, + "peer": true, + "requires": { + "tslib": "^2.2.0" + } + }, + "@angular/compiler-cli": { + "version": "12.2.16", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.2.16.tgz", + "integrity": "sha512-tlalh8SJvdCWbUPRUR5GamaP+wSc/GuCsoUZpSbcczGKgSlbaEVXUYtVXm8/wuT6Slk2sSEbRs7tXGF2i7qxVw==", + "dev": true, + "peer": true, + "requires": { + "@babel/core": "^7.8.6", + "@babel/types": "^7.8.6", + "canonical-path": "1.0.0", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.11.0", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "source-map": "^0.6.1", + "sourcemap-codec": "^1.4.8", + "tslib": "^2.2.0", + "yargs": "^17.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "peer": true + } + } + }, "@babel/code-frame": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", @@ -33027,9 +30785,9 @@ "dev": true }, "@ngtools/webpack": { - "version": "12.2.14", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.14.tgz", - "integrity": "sha512-dla6JgLWKAo7k4K3O+ouo104wO3BFs+MIOCXoGF4Lp/1pKPSt0orYmvZFBkDZPmyBFYRw9wpL2WHnAAyip40Cw==", + "version": "12.2.17", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.17.tgz", + "integrity": "sha512-uaS+2YZgPDW3VmUuwh4/yfIFV1KRVGWefc6xLWIqKRKs6mlRYs65m3ib9dX7CTS4kQMCbhxkxMbpBO2yXlzfvA==", "dev": true, "requires": {} }, @@ -33054,12 +30812,6 @@ "uri-js": "^4.2.2" } }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -33088,7 +30840,7 @@ "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", "dev": true, "requires": { "remove-trailing-separator": "^1.0.1" @@ -33180,35 +30932,51 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "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" } } } }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, "colorette": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.1.0.tgz", @@ -33241,15 +31009,6 @@ "uri-js": "^4.2.2" } }, - "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" - } - }, "fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", @@ -33274,21 +31033,6 @@ } } }, - "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" - } - }, - "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 - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -33315,15 +31059,6 @@ "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } - }, - "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" - } } } }, @@ -33413,7 +31148,7 @@ "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "dev": true, "requires": { "array-uniq": "^1.0.1" @@ -33422,7 +31157,7 @@ "globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", "dev": true, "requires": { "array-union": "^1.0.1", @@ -33435,13 +31170,19 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "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 + }, "es-module-lexer": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", @@ -33582,7 +31323,7 @@ "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -33594,7 +31335,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -33613,6 +31354,15 @@ "pkg-dir": "^4.1.0" } }, + "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" + } + }, "fsevents": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", @@ -33744,16 +31494,28 @@ "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", "dev": true, "requires": { "binary-extensions": "^1.0.0" } }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -33762,7 +31524,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -33857,6 +31619,16 @@ "json5": "^2.1.2" } }, + "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" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -33893,6 +31665,37 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + } } }, "mime-db": { @@ -33962,12 +31765,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "nanoid": { - "version": "3.1.30", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", - "dev": true - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -33977,6 +31774,26 @@ "yocto-queue": "^0.1.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" + }, + "dependencies": { + "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-map": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", @@ -33992,6 +31809,12 @@ "retry": "^0.12.0" } }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + }, "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -34253,13 +32076,20 @@ "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" } }, + "typescript": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "dev": true, + "peer": true + }, "webpack": { "version": "5.50.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.50.0.tgz", @@ -34387,12 +32217,12 @@ } }, "webpack-dev-server": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", - "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", "dev": true, "requires": { - "ansi-html": "0.0.7", + "ansi-html-community": "0.0.8", "bonjour": "^3.5.0", "chokidar": "^2.1.8", "compression": "^1.7.4", @@ -34442,9 +32272,27 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -34465,10 +32313,19 @@ "upath": "^1.1.1" } }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, "requires": { "is-glob": "^3.1.0", @@ -34478,7 +32335,7 @@ "is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", "dev": true, "requires": { "is-extglob": "^2.1.0" @@ -34489,7 +32346,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "json-schema-traverse": { @@ -34505,12 +32362,12 @@ "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==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "schema-utils": { @@ -34530,10 +32387,38 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -34569,6 +32454,81 @@ "requires": { "async-limiter": "~1.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" + } + } + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "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" + } + }, + "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" + } + }, + "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-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" + } } } }, @@ -34578,6 +32538,16 @@ "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", "dev": true, "requires": {} + }, + "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" + } } } }, @@ -34803,12 +32773,12 @@ } }, "@ionic/core": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.0.16.tgz", - "integrity": "sha512-rY9FTKupu6FAeTpbdkaMCPEeV/2ZPCviWSzi6X5RX1OiUP4EdNKj39KvUI++TPA2g8gYmmGsWR0BY3u8j7U/hA==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.1.10.tgz", + "integrity": "sha512-QmQvIe+IklQhNhbq438I3eCnL6XjfTxrgO1+paOdGNKk3R3o4mqJmV0YYT5r9iwnieHgDxKbo3ovs9UnTXhI7g==", "requires": { - "@stencil/core": "^2.14.2", - "ionicons": "^6.0.0", + "@stencil/core": "^2.16.0", + "ionicons": "^6.0.2", "tslib": "^2.1.0" } }, @@ -35023,16 +32993,6 @@ "tslib": "^2.0.1" }, "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, "debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -35045,32 +33005,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "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==", - "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==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -35094,14 +33028,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, "debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -35127,16 +33053,6 @@ "requires": { "ansi-regex": "^5.0.1" } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } } } }, @@ -35486,9 +33402,9 @@ } }, "@stencil/core": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.15.0.tgz", - "integrity": "sha512-58+FPFpJCJScd5nmqVsZN+qk7aui57wFcMHWzySr1SQzoY8Efst9OPG7XRf27UsNj1DNeEdYWTtdrTfJyn3mZg==" + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.16.1.tgz", + "integrity": "sha512-s/UJp9qxExL3DyQPT70kiuWeb3AdjbUZM+5lEIXn30I2DLcLYPOPXfsoWJODieQywq+3vPiLZeIdkoqjf6jcSw==" }, "@stylelint/postcss-css-in-js": { "version": "0.37.2", @@ -35863,6 +33779,7 @@ }, "@wisdomgarden/cordova-plugin-filepath": { "version": "git+ssh://git@github.com/wisdom-garden/cordova-plugin-filepath.git#50d756e125eb4c95a357bd11137b3eafbee199b0", + "integrity": "sha512-b9Op8wYpLnGddOMLAbChRlJYM7jz9AWEbWy8CWxIeIOgJflydZSIzsjBbqe9TQGTq+v9UoUOJsEP/jx5tmQvQg==", "dev": true, "from": "@wisdomgarden/cordova-plugin-filepath@git+https://github.com/wisdom-garden/cordova-plugin-filepath.git" }, @@ -35907,10 +33824,9 @@ } }, "acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", - "dev": true + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" }, "acorn-import-assertions": { "version": "1.8.0", @@ -35919,6 +33835,11 @@ "dev": true, "requires": {} }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, "adjust-sourcemap-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", @@ -36020,14 +33941,6 @@ "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" - }, - "dependencies": { - "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 - } } }, "ajv-errors": { @@ -36218,7 +34131,7 @@ "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", "dev": true }, "arr-flatten": { @@ -36230,7 +34143,7 @@ "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", "dev": true }, "array-flatten": { @@ -36257,7 +34170,7 @@ "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", "dev": true }, "arrify": { @@ -36284,7 +34197,7 @@ "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", "dev": true }, "ast-types": { @@ -36301,9 +34214,9 @@ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "requires": { "lodash": "^4.17.14" @@ -36526,53 +34439,18 @@ "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "requires": { "is-descriptor": "^1.0.0" } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } } } }, - "base64-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz", - "integrity": "sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA==", - "dev": true - }, "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "base64id": { "version": "2.0.0", @@ -36708,19 +34586,19 @@ "dev": true }, "bplist-creator": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.7.tgz", - "integrity": "sha1-N98VNgkoJLh8QvlXsBNEEXNyrkU=", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", + "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "requires": { - "stream-buffers": "~2.2.0" + "stream-buffers": "2.2.x" } }, "bplist-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz", - "integrity": "sha1-1g1dzCDLptx+HymbNdPh+V2vuuY=", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "requires": { - "big-integer": "^1.6.7" + "big-integer": "1.6.x" } }, "brace-expansion": { @@ -36760,12 +34638,6 @@ "picocolors": "^1.0.0" }, "dependencies": { - "caniuse-lite": { - "version": "1.0.30001286", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz", - "integrity": "sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ==", - "dev": true - }, "electron-to-chromium": { "version": "1.4.17", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.17.tgz", @@ -36854,15 +34726,6 @@ "unique-filename": "^1.1.1" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -37251,11 +35114,68 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "requires": { "is-descriptor": "^0.1.0" } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } }, @@ -37279,52 +35199,29 @@ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "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 - }, - "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=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "string-width": { - "version": "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-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } } } @@ -37357,7 +35254,7 @@ "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", "dev": true, "requires": { "map-visit": "^1.0.0", @@ -37540,7 +35437,7 @@ "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", "dev": true }, "copy-webpack-plugin": { @@ -37826,17 +35723,6 @@ "big-integer": "^1.6.44" } }, - "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" - } - }, "fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -37859,41 +35745,11 @@ "universalify": "^2.0.0" } }, - "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 - }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "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" - } } } }, @@ -37915,30 +35771,6 @@ "xml-escape": "^1.1.0" }, "dependencies": { - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "bplist-creator": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", - "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", - "dev": true, - "requires": { - "stream-buffers": "2.2.x" - } - }, - "bplist-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", - "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", - "dev": true, - "requires": { - "big-integer": "1.6.x" - } - }, "fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -37979,29 +35811,6 @@ "lru-cache": "^6.0.0" } }, - "simple-plist": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", - "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", - "dev": true, - "requires": { - "bplist-creator": "0.1.0", - "bplist-parser": "0.3.1", - "plist": "^3.0.5" - }, - "dependencies": { - "plist": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", - "integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==", - "dev": true, - "requires": { - "base64-js": "^1.5.1", - "xmlbuilder": "^9.0.7" - } - } - } - }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -38138,6 +35947,7 @@ }, "cordova-plugin-file-transfer": { "version": "git+ssh://git@github.com/dpa99c/cordova-plugin-file-transfer.git#2cdb0403a81821e144998c8d9a00d338d6ece3ee", + "integrity": "sha512-nOOCSablnogiNuLYpMN+p5+D0km8xAGfzrh5+znfLLSKAwGTOiy/zB7nCgigVAGPW8JIeBsaR0zKMt0msClqzw==", "dev": true, "from": "cordova-plugin-file-transfer@github:dpa99c/cordova-plugin-file-transfer" }, @@ -38350,12 +36160,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "nanoid": { - "version": "3.1.30", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", - "dev": true - }, "postcss": { "version": "8.4.5", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", @@ -38388,7 +36192,6 @@ "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", @@ -38399,7 +36202,6 @@ "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" } @@ -38868,9 +36670,9 @@ "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==" }, "date-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", - "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.11.tgz", + "integrity": "sha512-VS20KRyorrbMCQmpdl2hg5KaOUsda1RbnsJg461FfrcyCUg+pkd0b40BSW4niQyTheww4DBXQnS7HwSrKkipLw==", "dev": true }, "debug": { @@ -38985,37 +36787,6 @@ "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } } }, "degenerator": { @@ -39309,9 +37080,9 @@ } }, "engine.io": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.0.tgz", - "integrity": "sha512-ErhZOVu2xweCjEfYcTdkCnEYUiZgkAcBBAhW4jbIvNG8SLU3orAqoJCiytZjYF7eTpVmmCrLDjLIEaPlUAs1uw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", + "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", "dev": true, "requires": { "@types/cookie": "^0.4.1", @@ -39322,20 +37093,20 @@ "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~5.0.0", + "engine.io-parser": "~5.0.3", "ws": "~8.2.3" }, "dependencies": { "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -39357,13 +37128,10 @@ } }, "engine.io-parser": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.2.tgz", - "integrity": "sha512-wuiO7qO/OEkPJSFueuATIXtrxF7/6GTbAO9QLv7nnbjwZ5tYhLm9zxvLwxstRs0dcT0KUlWTjtIOs1T86jt12g==", - "dev": true, - "requires": { - "base64-arraybuffer": "~1.0.1" - } + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", + "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", + "dev": true }, "enhanced-resolve": { "version": "5.8.3", @@ -39681,13 +37449,10 @@ "dev": true }, "eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", - "dev": true, - "requires": { - "original": "^1.0.0" - } + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "dev": true }, "execa": { "version": "5.1.1", @@ -39752,7 +37517,7 @@ "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", "dev": true, "requires": { "debug": "^2.3.3", @@ -39767,7 +37532,7 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "requires": { "is-descriptor": "^0.1.0" @@ -39776,11 +37541,74 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "requires": { "is-extendable": "^0.1.0" } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } }, @@ -39845,22 +37673,11 @@ "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } } }, "external-editor": { @@ -39892,7 +37709,7 @@ "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "requires": { "is-descriptor": "^1.0.0" @@ -39901,40 +37718,17 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "requires": { "is-extendable": "^0.1.0" } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true } } }, @@ -40117,12 +37911,6 @@ "rimraf": "^3.0.2" }, "dependencies": { - "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", - "dev": true - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -40135,9 +37923,9 @@ } }, "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, "flatten": { @@ -40147,15 +37935,15 @@ "dev": true }, "follow-redirects": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz", - "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", "dev": true }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", "dev": true }, "forever-agent": { @@ -40194,7 +37982,7 @@ "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", "dev": true, "requires": { "map-cache": "^0.2.2" @@ -40276,24 +38064,12 @@ }, "fttx-phonegap-plugin-barcodescanner": { "version": "git+ssh://git@github.com/fttx/phonegap-plugin-barcodescanner.git#92d7e25631760f2db02e9fb42769d30b5ccc325f", + "integrity": "sha512-6HpLlhDsv/fxLqji84VQjkGyUXJ2GMlKTIRh3CKe7j+x6vNq2Hflu/MDX9gXmNDJkHD/cILhyVaG92cxdme+3g==", "dev": true, "from": "fttx-phonegap-plugin-barcodescanner@github:fttx/phonegap-plugin-barcodescanner", "requires": { "nopt": "^4.0.1", "shelljs": "^0.8.3" - }, - "dependencies": { - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - } } }, "function-bind": { @@ -40324,17 +38100,6 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -40422,7 +38187,7 @@ "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", "dev": true }, "getpass": { @@ -40628,7 +38393,7 @@ "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", "dev": true, "requires": { "get-value": "^2.0.6", @@ -40639,7 +38404,7 @@ "has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", "dev": true, "requires": { "is-number": "^3.0.0", @@ -40649,7 +38414,7 @@ "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -40658,7 +38423,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -40669,7 +38434,7 @@ "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -41054,7 +38819,7 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true }, "pkg-dir": { @@ -41242,13 +39007,13 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, "requires": { "path-key": "^2.0.0" @@ -41257,13 +39022,13 @@ "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "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=", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "requires": { "shebang-regex": "^1.0.0" @@ -41272,7 +39037,7 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true } } @@ -41296,18 +39061,11 @@ } }, "ionicons": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-6.0.1.tgz", - "integrity": "sha512-xQekOJsxH82O7oB+3F60zeRggCdND9pJ/k0E6IJDVUGGlCj5mlyFqNgxUimytKgstPGv3S+3EmCxjefvtGgWUg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-6.0.2.tgz", + "integrity": "sha512-AyKfFaUKVoBz4eB8XkU7H1R5HFnVsgq5ijqSdbXC0lES9PDK/J6LUQz6XUJq0mVVQF5k9kczSPOLMW3mszG0mQ==", "requires": { - "@stencil/core": "~2.12.0" - }, - "dependencies": { - "@stencil/core": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.12.1.tgz", - "integrity": "sha512-u24TZ+FEvjnZt5ZgIkLjLpUNsO6Ml3mUZqwmqk81w6RWWz75hgB5p4RFI5rvuErFeh2xvMIGo+pNdG24XUBz1A==" - } + "@stencil/core": "~2.16.0" } }, "ios-sim": { @@ -41347,7 +39105,7 @@ "ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", "dev": true }, "ipaddr.js": { @@ -41363,23 +39121,12 @@ "dev": true }, "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "kind-of": "^6.0.0" } }, "is-alphabetical": { @@ -41439,23 +39186,12 @@ } }, "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "kind-of": "^6.0.0" } }, "is-date-object": { @@ -41474,22 +39210,14 @@ "dev": true }, "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-docker": { @@ -41498,10 +39226,13 @@ "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==" }, "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } }, "is-extglob": { "version": "2.1.1", @@ -41619,8 +39350,7 @@ "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, "is-typedarray": { "version": "1.0.0", @@ -42066,12 +39796,6 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, "json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -42144,15 +39868,15 @@ } }, "karma": { - "version": "6.3.9", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.9.tgz", - "integrity": "sha512-E/MqdLM9uVIhfuyVnrhlGBu4miafBdXEAEqCmwdEMh3n17C7UWC/8Kvm3AYKr91gc7scutekZ0xv6rxRaUCtnw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.0.tgz", + "integrity": "sha512-s8m7z0IF5g/bS5ONT7wsOavhW4i4aFkzD4u4wgzAQWT4HGUeWI3i21cK2Yz6jndMAeHETp5XuNsRoyGJZXVd4w==", "dev": true, "requires": { + "@colors/colors": "1.5.0", "body-parser": "^1.19.0", "braces": "^3.0.2", "chokidar": "^3.5.1", - "colors": "^1.4.0", "connect": "^3.7.0", "di": "^0.0.1", "dom-serialize": "^2.2.1", @@ -42161,45 +39885,20 @@ "http-proxy": "^1.18.1", "isbinaryfile": "^4.0.8", "lodash": "^4.17.21", - "log4js": "^6.3.0", + "log4js": "^6.4.1", "mime": "^2.5.2", "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", - "socket.io": "^4.2.0", + "socket.io": "^4.4.1", "source-map": "^0.6.1", "tmp": "^0.2.1", "ua-parser-js": "^0.7.30", "yargs": "^16.1.1" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "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" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -42241,15 +39940,6 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -42259,17 +39949,6 @@ "rimraf": "^3.0.0" } }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -42651,22 +40330,22 @@ } }, "log4js": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", - "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.5.2.tgz", + "integrity": "sha512-DXtpNtt+KDOMT7RHUDIur/WsSA3rntlUh9Zg4XCdV42wUuMmbFkl38+LZ92Z5QvQA7mD5kAVkLiBSEH/tvUB8A==", "dev": true, "requires": { - "date-format": "^3.0.0", - "debug": "^4.1.1", - "flatted": "^2.0.1", - "rfdc": "^1.1.4", - "streamroller": "^2.2.4" + "date-format": "^4.0.10", + "debug": "^4.3.4", + "flatted": "^3.2.5", + "rfdc": "^1.3.0", + "streamroller": "^3.1.1" }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -42837,7 +40516,7 @@ "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", "dev": true }, "map-obj": { @@ -42849,7 +40528,7 @@ "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", "dev": true, "requires": { "object-visit": "^1.0.0" @@ -42936,7 +40615,7 @@ "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", "dev": true, "requires": { "errno": "^0.1.3", @@ -42963,24 +40642,6 @@ "yargs-parser": "^20.2.3" }, "dependencies": { - "hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "normalize-package-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.1.tgz", @@ -43196,9 +40857,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "minimist-options": { "version": "4.1.0", @@ -43226,17 +40887,6 @@ "dev": true, "requires": { "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } } }, "minipass-fetch": { @@ -43258,17 +40908,6 @@ "dev": true, "requires": { "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } } }, "minipass-json-stream": { @@ -43288,17 +40927,6 @@ "dev": true, "requires": { "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } } }, "minipass-sized": { @@ -43327,17 +40955,6 @@ "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } } }, "mkdirp": { @@ -43356,9 +40973,9 @@ "dev": true }, "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", + "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==" }, "ms": { "version": "2.0.0", @@ -43387,16 +41004,16 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", "dev": true, "optional": true }, "nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==" + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" }, "nanomatch": { "version": "1.2.13", @@ -43749,7 +41366,6 @@ "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" } @@ -43796,7 +41412,7 @@ "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", "dev": true, "requires": { "copy-descriptor": "^0.1.0", @@ -43807,16 +41423,53 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "requires": { "is-descriptor": "^0.1.0" } }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -43848,7 +41501,7 @@ "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", "dev": true, "requires": { "isobject": "^3.0.0" @@ -43869,7 +41522,7 @@ "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "dev": true, "requires": { "isobject": "^3.0.1" @@ -43949,7 +41602,7 @@ "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", "dev": true } } @@ -44041,15 +41694,6 @@ } } }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -44343,13 +41987,13 @@ "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", "dev": true }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", "dev": true }, "path-exists": { @@ -44372,8 +42016,7 @@ "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 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { "version": "1.0.7", @@ -44454,13 +42097,12 @@ } }, "plist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", - "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==", "requires": { - "base64-js": "^1.2.3", - "xmlbuilder": "^9.0.7", - "xmldom": "0.1.x" + "base64-js": "^1.5.1", + "xmlbuilder": "^9.0.7" } }, "portfinder": { @@ -44494,7 +42136,7 @@ "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", "dev": true }, "postcss": { @@ -46182,9 +43824,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -46243,22 +43885,6 @@ "rimraf": "^2.2.8" } }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "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" - } - }, "globby": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", @@ -46273,12 +43899,6 @@ "pinkie-promise": "^2.0.0" } }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -46303,30 +43923,6 @@ "path-is-inside": "^1.0.1" } }, - "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" - } - }, - "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 - }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -46354,28 +43950,6 @@ "source-map": "^0.5.6" } }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "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": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -46691,18 +44265,6 @@ "type-fest": "^0.6.0" }, "dependencies": { - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, "type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", @@ -46722,40 +44284,6 @@ "type-fest": "^0.8.1" }, "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "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 - }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -46946,7 +44474,7 @@ "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", "dev": true }, "repeat-element": { @@ -47025,7 +44553,7 @@ "resolve-cwd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", "dev": true, "requires": { "resolve-from": "^3.0.0" @@ -47034,7 +44562,7 @@ "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true } } @@ -47180,7 +44708,7 @@ "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", "dev": true, "requires": { "ret": "~0.1.10" @@ -47281,9 +44809,9 @@ } }, "selfsigned": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", - "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "version": "1.10.14", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", + "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", "dev": true, "requires": { "node-forge": "^0.10.0" @@ -47412,11 +44940,17 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "requires": { "is-extendable": "^0.1.0" } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true } } }, @@ -47438,7 +44972,6 @@ "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" } @@ -47446,8 +44979,7 @@ "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 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "shelljs": { "version": "0.8.5", @@ -47486,13 +45018,13 @@ } }, "simple-plist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.0.0.tgz", - "integrity": "sha512-043L2rO80LVF7zfZ+fqhsEkoJFvW8o59rt/l4ctx1TJWoTx7/jkiS1R5TatD15Z1oYnuLJytzE7gcnnBuIPL2g==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", + "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "requires": { - "bplist-creator": "0.0.7", - "bplist-parser": "0.1.1", - "plist": "^3.0.1" + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" } }, "skwas-cordova-plugin-datetimepicker": { @@ -47524,11 +45056,6 @@ "requires": { "color-convert": "^2.0.1" } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" } } }, @@ -47556,7 +45083,7 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "requires": { "is-descriptor": "^0.1.0" @@ -47565,16 +45092,79 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "requires": { "is-extendable": "^0.1.0" } }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true }, "source-map-resolve": { @@ -47606,40 +45196,11 @@ "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "requires": { "is-descriptor": "^1.0.0" } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } } } }, @@ -47655,7 +45216,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -47664,23 +45225,23 @@ } }, "socket.io": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.0.tgz", - "integrity": "sha512-bnpJxswR9ov0Bw6ilhCvO38/1WPtE3eA2dtxi2Iq4/sFebiDJQzgKNYA7AuVVdGW09nrESXd90NbZqtDd9dzRQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.1.tgz", + "integrity": "sha512-0y9pnIso5a9i+lJmsCdtmTTgJFFSvNQKDnPQRz28mGNnxbmqYg2QPtJTLFxhymFZhAIn50eHAKzJeiNaKr+yUQ==", "dev": true, "requires": { "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~6.1.0", - "socket.io-adapter": "~2.3.3", + "engine.io": "~6.2.0", + "socket.io-adapter": "~2.4.0", "socket.io-parser": "~4.0.4" }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -47695,9 +45256,9 @@ } }, "socket.io-adapter": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", - "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", "dev": true }, "socket.io-parser": { @@ -47712,9 +45273,9 @@ }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -47748,17 +45309,16 @@ } }, "sockjs-client": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", - "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", + "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", "dev": true, "requires": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", + "debug": "^3.2.7", + "eventsource": "^2.0.2", + "faye-websocket": "^0.11.4", "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.5.3" + "url-parse": "^1.5.10" }, "dependencies": { "debug": { @@ -48081,17 +45641,6 @@ "dev": true, "requires": { "minipass": "^3.1.1" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } } }, "stable": { @@ -48103,7 +45652,7 @@ "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", "dev": true, "requires": { "define-property": "^0.2.5", @@ -48113,11 +45662,68 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "requires": { "is-descriptor": "^0.1.0" } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } }, @@ -48129,7 +45735,7 @@ "stream-buffers": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=" + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==" }, "stream-combiner2": { "version": "1.1.1", @@ -48141,36 +45747,57 @@ } }, "streamroller": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", - "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.1.tgz", + "integrity": "sha512-iPhtd9unZ6zKdWgMeYGfSBuqCngyJy1B/GPi/lTpwGpa3bajuX30GjUVd0/Tn/Xhg0mr4DOSENozz9Y06qyonQ==", "dev": true, "requires": { - "date-format": "^2.1.0", - "debug": "^4.1.1", - "fs-extra": "^8.1.0" + "date-format": "^4.0.10", + "debug": "^4.3.4", + "fs-extra": "^10.1.0" }, "dependencies": { - "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", - "dev": true - }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" } }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, "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 + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true } } }, @@ -48183,13 +45810,13 @@ } }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "dependencies": { "ansi-regex": { @@ -48198,11 +45825,11 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } @@ -48231,7 +45858,7 @@ "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "dev": true }, "strip-final-newline": { @@ -48333,27 +45960,6 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001165", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz", - "integrity": "sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA==", - "dev": true - }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -48390,25 +45996,6 @@ } } }, - "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", - "dev": true - }, - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", @@ -48418,63 +46005,12 @@ "ms": "2.1.2" } }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "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" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "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" - } - }, "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 }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, "picocolors": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", @@ -48491,41 +46027,12 @@ "source-map": "^0.6.1" } }, - "postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", - "util-deprecate": "^1.0.2" - } - }, - "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 - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -48837,55 +46344,11 @@ "uri-js": "^4.2.2" } }, - "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 - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "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 - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "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" - } } } }, @@ -49047,7 +46510,7 @@ "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -49056,7 +46519,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -49318,6 +46781,14 @@ "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + } } }, "uniq": { @@ -49387,7 +46858,7 @@ "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", "dev": true, "requires": { "has-value": "^0.3.1", @@ -49397,7 +46868,7 @@ "has-value": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", "dev": true, "requires": { "get-value": "^2.0.3", @@ -49408,7 +46879,7 @@ "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", "dev": true, "requires": { "isarray": "1.0.0" @@ -49419,7 +46890,7 @@ "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", "dev": true } } @@ -49469,9 +46940,9 @@ } }, "url-parse": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", - "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, "requires": { "querystringify": "^2.1.1", @@ -49573,9 +47044,13 @@ } }, "vm2": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.5.tgz", - "integrity": "sha512-LuCAHZN75H9tdrAiLFf030oW7nJV5xwNMuk1ymOZwopmuK3d2H4L1Kv4+GFHgarKiLfXXLFU+7LDABHnwOkWng==" + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.9.tgz", + "integrity": "sha512-xwTm7NLh/uOjARRBs8/95H0e8fT3Ukw5D/JJWhxMbhKzNh1Nu981jQKvkep9iKYNxzlVrdzD0mlBGkDKZWprlw==", + "requires": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + } }, "void-elements": { "version": "2.0.1", @@ -49997,16 +47472,6 @@ "execa": "^4.0.2" }, "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, "execa": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", @@ -50030,45 +47495,6 @@ "requires": { "pump": "^3.0.0" } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, - "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==", - "requires": { - "path-key": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "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==", - "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==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -50099,52 +47525,34 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "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, + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "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 - }, - "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 + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, - "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, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "color-convert": "^2.0.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, + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } } } @@ -50211,12 +47619,6 @@ "xmlbuilder": "~11.0.0" }, "dependencies": { - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, "xmlbuilder": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", @@ -50230,11 +47632,6 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, - "xmldom": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" - }, "xregexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", @@ -50258,106 +47655,33 @@ "dev": true }, "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "dev": true, "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "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" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "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 - }, - "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" - } - }, - "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 - }, - "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-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=", + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "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" - } } } }, "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" - } + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "dev": true }, "yn": { "version": "3.1.1", @@ -50377,13 +47701,6 @@ "integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==", "requires": { "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" - } } }, "zwitch": { diff --git a/package.json b/package.json index d5f53c671..5c4d04ef7 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "@ionic-native/splash-screen": "^5.33.1", "@ionic-native/status-bar": "^5.33.1", "@ionic-native/three-dee-touch": "^5.33.1", - "@ionic/angular": "^6.0.14", + "@ionic/angular": "^6.1.10", "@ionic/cli": "^6.18.1", "@ionic/storage": "^2.3.1", "@ngx-translate/core": "^11.0.1", diff --git a/src/classes/brew/brewFlow.ts b/src/classes/brew/brewFlow.ts index 1cf27a993..df0da32f2 100755 --- a/src/classes/brew/brewFlow.ts +++ b/src/classes/brew/brewFlow.ts @@ -3,12 +3,15 @@ export class BrewFlow { public weight: Array; public waterFlow: Array; public realtimeFlow: Array; + public pressureFlow: Array; constructor() { this.weight = []; this.waterFlow = []; this.realtimeFlow = []; + this.pressureFlow = []; } + } export interface IBrewWeightFlow { @@ -34,3 +37,16 @@ export interface IBrewRealtimeWaterFlow { timestamp: string; smoothed_weight: number; } + +export interface IBrewRealtimeWaterFlow { + flow_value: number; + brew_time: string; + timestamp: string; + smoothed_weight: number; +} +export interface IBrewPressureFlow { + actual_pressure: number; + old_pressure: number; + brew_time: string; + timestamp: string; +} diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index 26e07eb95..d746fd4af 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -40,7 +40,7 @@ import { Chart } from 'chart.js'; import { UIHelper } from '../../../services/uiHelper'; import { UIExcel } from '../../../services/uiExcel'; import { - BrewFlow, + BrewFlow, IBrewPressureFlow, IBrewRealtimeWaterFlow, IBrewWaterFlow, IBrewWeightFlow, @@ -197,26 +197,50 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } } + let isSomethingConnected: boolean = false; if (this.smartScaleConnected()) { - this.__connectSmartScale(true); + await this.__connectSmartScale(true); + isSomethingConnected = true; + } + if (this.pressureDeviceConnected()) { + await this.__connectPressureDevice(true); + isSomethingConnected = true; + } + if (isSomethingConnected === true) { + this.initializeFlowChart(); } this.bluetoothSubscription = this.bleManager .attachOnEvent() .subscribe((_type) => { - if (_type && _type.type === 'CONNECT') { + let disconnectTriggered: boolean = false; + + if (_type && _type.type === 'CONNECT_SCALE') { this.__connectSmartScale(false); - } else { + } else if (_type && _type.type === 'DISCONNECT_SCALE') { this.deattachToWeightChange(); - this.deattachToPressureChange(); + this.deattachToFlowChange(); this.deattachToScaleEvents(); + disconnectTriggered = true; + } + else if (_type && _type.type === 'CONNECT_PRESSURE') { + this.__connectPressureDevice(false); + } + else if (_type && _type.type === 'DISCONNECT_PRESSURE') { + this.deattachToPressureChange(); + disconnectTriggered = true; + } - this.flowProfileChartEl.options.scales.x.realtime.pause = true; - this.flowProfileChartEl.update('quiet'); + if (disconnectTriggered) { + if (!this.smartScaleConnected() && !this.pressureDeviceConnected()) { + // When one is connected we don't pause + this.flowProfileChartEl.options.scales.x.realtime.pause = true; + this.flowProfileChartEl.update('quiet'); + } - // If scale disconnected, sometimes the timer run but the screen was not refreshed, so maybe it helpes to detect the change. - this.checkChanges(); } + // If scale disconnected, sometimes the timer run but the screen was not refreshed, so maybe it helpes to detect the change. + this.checkChanges(); }); // Trigger change rating @@ -227,9 +251,8 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { private async __connectSmartScale(_firstStart: boolean) { if (this.smartScaleConnected()) { this.deattachToWeightChange(); - this.deattachToPressureChange(); this.deattachToScaleEvents(); - this.initializeFlowChart(); + const scale: BluetoothScale = this.bleManager.getScale(); if (!this.scaleTimerSubscription) { this.scaleTimerSubscription = scale.timerEvent.subscribe((event) => { @@ -293,19 +316,28 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } if (this.timer.isTimerRunning() === true && _firstStart === false) { this.attachToScaleWeightChange(); - this.attachToPressureChange(); + this.attachToFlowChange(); } - if (this.scaleFlowChangeSubscription) { - this.scaleFlowChangeSubscription.unsubscribe(); - this.scaleFlowChangeSubscription = undefined; - } - this.scaleFlowChangeSubscription = scale.flowChange.subscribe((_val) => { - this.setActualSmartInformation(); - }); + this.checkChanges(); } } + private async __connectPressureDevice(_firstStart: boolean) { + if (this.pressureDeviceConnected()) { + this.deattachToPressureChange(); + + if (_firstStart) { + const pressureDevice: PressureDevice = this.bleManager.getPressureDevice(); + await pressureDevice.updateZero(); + } + if (this.timer.isTimerRunning() === true && _firstStart === false) { + this.attachToPressureChange(); + } + + this.checkChanges(); + } + } public async maximizeFlowGraph() { let actualOrientation; if (this.platform.is('cordova')) { @@ -400,15 +432,12 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.bluetoothSubscription.unsubscribe(); this.bluetoothSubscription = undefined; } - if (this.scaleFlowChangeSubscription) { - this.scaleFlowChangeSubscription.unsubscribe(); - this.scaleFlowChangeSubscription = undefined; - } if (this.flowProfileChartEl) { this.flowProfileChartEl.destroy(); this.flowProfileChartEl = undefined; } this.deattachToWeightChange(); + this.deattachToFlowChange(); this.deattachToPressureChange(); this.deattachToScaleEvents(); } @@ -434,6 +463,16 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { return !!scale; } + public pressureDeviceConnected() { + if (!this.platform.is('cordova')) { + return true; + } + + const pressureDevice: PressureDevice = this.bleManager.getPressureDevice(); + return !!pressureDevice; + } + + public attachToScaleWeightChange() { const scale: BluetoothScale = this.bleManager.getScale(); if (scale) { @@ -445,6 +484,17 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } } + public attachToFlowChange() { + const scale: BluetoothScale = this.bleManager.getScale(); + if (scale) { + this.deattachToFlowChange(); + + this.scaleFlowChangeSubscription = scale.flowChange.subscribe((_val) => { + this.setActualSmartInformation(); + }); + } + } + public attachToPressureChange() { const pressureDevice: PressureDevice = this.bleManager.getPressureDevice(); if (pressureDevice) { @@ -536,7 +586,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { ], }; - const pressureEnabled: boolean = false; + const pressureDevice = this.bleManager.getPressureDevice(); if (pressureDevice != null || !this.platform.is('cordova')) { drinkingData.datasets.push({ @@ -701,6 +751,13 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } } + public deattachToFlowChange() { + if (this.scaleFlowChangeSubscription) { + this.scaleFlowChangeSubscription.unsubscribe(); + this.scaleFlowChangeSubscription = undefined; + } + } + public deattachToPressureChange() { if (this.pressureDeviceSubscription) { this.pressureDeviceSubscription.unsubscribe(); @@ -709,18 +766,16 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } public shallFlowProfileBeHidden(): boolean { - if (this.smartScaleConnected() === true) { + if (this.smartScaleConnected() === true || this.pressureDeviceConnected() === true) { return false; } if ( - this.smartScaleConnected() === false && this.isEdit === true && this.data.flow_profile !== '' ) { return false; } if ( - this.smartScaleConnected() === false && this.flow_profile_raw.weight.length > 0 ) { return false; @@ -799,6 +854,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { public async timerStarted(_event) { const scale: BluetoothScale = this.bleManager.getScale(); + const pressureDevice: PressureDevice = this.bleManager.getPressureDevice(); /** let weight=0; let realtime_flow = 0; @@ -840,11 +896,13 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.flowProfileChartEl.update('quite'); },100); **/ - if (scale) { - if (this.settings.bluetooth_scale_tare_on_start_timer === true) { - await scale.tare(); + if (scale || pressureDevice ) { + if (scale) { + if (this.settings.bluetooth_scale_tare_on_start_timer === true) { + await scale.tare(); + } + await scale.setTimer(SCALE_TIMER_COMMAND.START); } - await scale.setTimer(SCALE_TIMER_COMMAND.START); this.startingFlowTime = Date.now(); this.flowProfileChartEl.options.scales.x.realtime.pause = false; @@ -857,17 +915,25 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.flowProfileChartEl.options.scales.x.realtime.delay = delay; this.flowProfileChartEl.update('quiet'); - this.attachToScaleWeightChange(); - this.attachToPressureChange(); + if (scale) { + this.attachToScaleWeightChange(); + this.attachToFlowChange(); + } + if (pressureDevice) { + this.attachToPressureChange(); + } + } } public async timerResumed(_event) { const scale: BluetoothScale = this.bleManager.getScale(); + const pressureDevice: PressureDevice = this.bleManager.getPressureDevice(); - if (scale) { - await scale.setTimer(SCALE_TIMER_COMMAND.START); - + if (scale || pressureDevice) { + if (scale){ + await scale.setTimer(SCALE_TIMER_COMMAND.START); + } this.startingFlowTime = Date.now(); this.flowProfileChartEl.options.scales.x.realtime.pause = false; @@ -885,19 +951,29 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.flowProfileChartEl.options.scales.x.realtime.delay = delay; this.flowProfileChartEl.update('quiet'); - this.attachToScaleWeightChange(); - this.attachToPressureChange(); + if (scale) { + this.attachToScaleWeightChange(); + this.attachToFlowChange(); + } + if (pressureDevice) { + this.attachToPressureChange(); + } + } } public async timerPaused(_event) { const scale: BluetoothScale = this.bleManager.getScale(); - - if (scale) { - await scale.setTimer(SCALE_TIMER_COMMAND.STOP); - - this.deattachToWeightChange(); - this.deattachToPressureChange(); + const pressureDevice: PressureDevice = this.bleManager.getPressureDevice(); + if (scale || pressureDevice) { + if (scale) { + await scale.setTimer(SCALE_TIMER_COMMAND.STOP); + this.deattachToWeightChange(); + this.deattachToFlowChange(); + } + if (pressureDevice) { + this.deattachToPressureChange(); + } this.flowProfileChartEl.options.scales.x.realtime.pause = true; this.flowProfileChartEl.update('quiet'); } @@ -912,25 +988,32 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { public async timerReset(_event) { const scale: BluetoothScale = this.bleManager.getScale(); - if (scale) { - await scale.tare(); + const pressureDevice: PressureDevice = this.bleManager.getPressureDevice(); + if (scale || pressureDevice) { + if (scale) { + await scale.tare(); - await new Promise((resolve) => { - setTimeout(async () => { - await scale.setTimer(SCALE_TIMER_COMMAND.STOP); - resolve(undefined); - }, 50); - }); + await new Promise((resolve) => { + setTimeout(async () => { + await scale.setTimer(SCALE_TIMER_COMMAND.STOP); + resolve(undefined); + }, 50); + }); - await new Promise((resolve) => { - setTimeout(async () => { - await scale.setTimer(SCALE_TIMER_COMMAND.RESET); - resolve(undefined); - }, 50); - }); + await new Promise((resolve) => { + setTimeout(async () => { + await scale.setTimer(SCALE_TIMER_COMMAND.RESET); + resolve(undefined); + }, 50); + }); - this.deattachToWeightChange(); - this.deattachToPressureChange(); + this.deattachToWeightChange(); + this.deattachToFlowChange(); + } + + if (pressureDevice) { + this.deattachToPressureChange(); + } if (this.isEdit) { await this.deleteFlowProfile(); @@ -1145,11 +1228,23 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { // Nothing for storing etc. is done here actually const actual: number = _pressure.actual; const old: number = _pressure.old; + + + // If no smartscale is connected, the set pressure flow needs to be the master to set flowtime and flowtime seconds, else we just retrieve from the scale. + const isSmartScaleConnected = this.smartScaleConnected(); + if (!isSmartScaleConnected) { + if (this.flowTime === undefined) { + this.flowTime = this.getTime(); + } + } + + const actualUnixTime: number = moment(new Date()) .startOf('day') .add('milliseconds', Date.now() - this.startingFlowTime) .toDate() .getTime(); + const pressureObj = { unixTime: actualUnixTime, actual: actual, @@ -1157,10 +1252,27 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { flowTime: this.flowTime, flowTimeSecond: this.flowTime + '.' + this.flowSecondTick, }; + + if (!isSmartScaleConnected) { + if (this.flowTime !== this.getTime()) { + this.flowTime = this.getTime(); + this.flowSecondTick = 0; + } + } this.flowProfileChartEl.data.datasets[3].data.push({ x: pressureObj.unixTime, y: pressureObj.actual, }); + this.pushPressureProfile( + pressureObj.flowTimeSecond, + pressureObj.actual, + pressureObj.old + ); + + this.flowProfileChartEl.update('quiet'); + if (!isSmartScaleConnected) { + this.flowSecondTick++; + } } private __setFlowProfile(_scaleChange: any) { @@ -1489,6 +1601,20 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.flow_profile_raw.weight.push(brewFlow); } + private pushPressureProfile( + _brewTime: string, + _actualPressure: number, + _oldPressure: number, + ) { + const pressureFlow: IBrewPressureFlow = {} as IBrewPressureFlow; + pressureFlow.timestamp = this.uiHelper.getActualTimeWithMilliseconds(); + pressureFlow.brew_time = _brewTime; + pressureFlow.actual_pressure = _actualPressure; + pressureFlow.old_pressure = _oldPressure; + + this.flow_profile_raw.pressureFlow.push(pressureFlow); + } + public setActualSmartInformation() { try { const weightEl = this.smartScaleWeightEl.nativeElement; diff --git a/src/services/bleManager/ble-manager.service.ts b/src/services/bleManager/ble-manager.service.ts index 45c261f3f..a230d17e9 100644 --- a/src/services/bleManager/ble-manager.service.ts +++ b/src/services/bleManager/ble-manager.service.ts @@ -497,16 +497,16 @@ export class BleManagerService { this.uiLog.log('AutoConnectScale - We can start or we waited for iOS'); - return new Promise((resolve, reject) => { - this.uiLog.log( - 'AutoConnectScale - We created our promise, and try to autoconnect to device now.' - ); - ble.autoConnect( - deviceId, - this.connectCallback.bind(this, resolve, deviceType), - this.disconnectCallback.bind(this, reject) - ); - }); + + this.uiLog.log( + 'AutoConnectScale - We created our promise, and try to autoconnect to device now.' + ); + ble.autoConnect( + deviceId, + this.connectCallback.bind(this, deviceType), + this.disconnectCallback.bind(this) + ); + } public async autoConnectPressureDevice( @@ -523,20 +523,19 @@ export class BleManagerService { 'AutoConnectPressureDevice - We can start or we waited for iOS' ); - return new Promise((resolve, reject) => { - this.uiLog.log( - 'AutoConnectPressureDevice - We created our promise, and try to autoconnect to device now.' - ); - ble.autoConnect( - deviceId, - this.connectPressureCallback.bind(this, resolve, pressureType), - this.disconnectPressureCallback.bind(this, reject) - ); - }); + + this.uiLog.log( + 'AutoConnectPressureDevice - We created our promise, and try to autoconnect to device now.' + ); + ble.autoConnect( + deviceId, + this.connectPressureCallback.bind(this, pressureType), + this.disconnectPressureCallback.bind(this) + ); + } private connectCallback( - callback, deviceType: ScaleType, data: PeripheralData ) { @@ -549,8 +548,7 @@ export class BleManagerService { ); this.uiLog.log('Connected successfully'); this.uiToast.showInfoToast('SCALE.CONNECTED_SUCCESSFULLY'); - callback(); - this.__sendEvent('CONNECT'); + this.__sendEvent('CONNECT_SCALE'); } } @@ -560,14 +558,12 @@ export class BleManagerService { this.scale = null; this.uiToast.showInfoToast('SCALE.DISCONNECTED_UNPLANNED'); this.uiLog.log('Disconnected successfully'); - callback(); } // Send disconnect callback, even if scale is already null/not existing anymore - this.__sendEvent('DISCONNECT'); + this.__sendEvent('DISCONNECT_SCALE'); } private connectPressureCallback( - callback, pressureTaype: PressureType, data: PeripheralData ) { @@ -580,20 +576,18 @@ export class BleManagerService { ); this.uiLog.log('Pressure Connected successfully'); this.uiToast.showInfoToast('PRESSURE.CONNECTED_SUCCESSFULLY'); - callback(); - this.__sendEvent('CONNECT'); + this.__sendEvent('CONNECT_PRESSURE'); } } - private disconnectPressureCallback(callback) { + private disconnectPressureCallback() { if (this.scale) { this.pressureDevice.disconnect(); this.pressureDevice = null; this.uiToast.showInfoToast('PRESSURE.DISCONNECTED_UNPLANNED'); this.uiLog.log('Disconnected successfully'); - callback(); } // Send disconnect callback, even if scale is already null/not existing anymore - this.__sendEvent('DISCONNECT'); + this.__sendEvent('DISCONNECT_PRESSURE'); } } diff --git a/src/services/uiExcel.ts b/src/services/uiExcel.ts index e929871e3..47f8ef838 100755 --- a/src/services/uiExcel.ts +++ b/src/services/uiExcel.ts @@ -102,24 +102,46 @@ export class UIExcel { const wsFlow: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(wsDataFlow); XLSX.utils.book_append_sheet(wb, wsFlow, this.translate.instant('Flow profile calculated')); - const header_flow_realtime: Array = []; - header.push('Timestamp'); - header.push('Time'); - header.push('Flow value'); - header.push('Smoothed weight'); - - const wsDataFlowRealtime: any[][] = [header_flow_realtime]; - for (const entry of _flow.realtimeFlow) { - const wbEntry: Array = [ - entry.timestamp, - entry.brew_time, - entry.flow_value, - entry.smoothed_weight]; - wsDataFlowRealtime.push(wbEntry); + if (_flow.hasOwnProperty('realtimeFlow')) { + const header_flow_realtime: Array = []; + header.push('Timestamp'); + header.push('Time'); + header.push('Flow value'); + header.push('Smoothed weight'); + + const wsDataFlowRealtime: any[][] = [header_flow_realtime]; + for (const entry of _flow.realtimeFlow) { + const wbEntry: Array = [ + entry.timestamp, + entry.brew_time, + entry.flow_value, + entry.smoothed_weight]; + wsDataFlowRealtime.push(wbEntry); + } + const wsFlowRealtime: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(wsDataFlowRealtime); + XLSX.utils.book_append_sheet(wb, wsFlowRealtime, this.translate.instant('Flow profile realtime')); } - const wsFlowRealtime: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(wsDataFlowRealtime); - XLSX.utils.book_append_sheet(wb, wsFlowRealtime, this.translate.instant('Flow profile realtime')); + if (_flow.hasOwnProperty('pressureFlow')) { + + const header_pressure_flow: Array = []; + header.push('Timestamp'); + header.push('Time'); + header.push('Actual'); + header.push('Old'); + + const wsDataPressureFlow: any[][] = [header_pressure_flow]; + for (const entry of _flow.pressureFlow) { + const wbEntry: Array = [ + entry.timestamp, + entry.brew_time, + entry.actual_pressure, + entry.old_pressure]; + wsDataPressureFlow.push(wbEntry); + } + const wsFlowRealtime: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(wsDataPressureFlow); + XLSX.utils.book_append_sheet(wb, wsFlowRealtime, this.translate.instant('Flow pressure')); + } return wb; } From 3232e53117e24f489d9ac21e7928ca91950139d2 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sat, 18 Jun 2022 15:31:39 +0200 Subject: [PATCH 22/78] #383 --- src/app/app.component.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index df51bff45..93bccea20 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -476,8 +476,13 @@ export class AppComponent implements AfterViewInit { await this.uiUpdate.checkUpdateScreen(); //#281 - Connect smartscale before checking the startup view - this.__connectSmartScale(); - this.__connectPressureDevice(); + setTimeout(() => + { + // Just connect after 5 seconds, to get some time, and maybe handle all the connection errors + this.__connectSmartScale(); + this.__connectPressureDevice(); + },5000); + await this.__checkStartupView(); this.__instanceAppRating(); From 1484ed30e2b8788b8e6d47ed748f8c9273d4f334 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sat, 18 Jun 2022 15:49:16 +0200 Subject: [PATCH 23/78] #383 --- .../brew/brew-detail/brew-detail.component.ts | 28 +++++++++++++++++-- .../brew-brewing/brew-brewing.component.ts | 28 ++++++++++++++----- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/src/app/brew/brew-detail/brew-detail.component.ts b/src/app/brew/brew-detail/brew-detail.component.ts index 2ca54d8fd..44a0b5df8 100644 --- a/src/app/brew/brew-detail/brew-detail.component.ts +++ b/src/app/brew/brew-detail/brew-detail.component.ts @@ -243,6 +243,21 @@ export class BrewDetailComponent implements OnInit { } }; + if (this.flow_profile_raw.pressureFlow && this.flow_profile_raw.pressureFlow.length > 0) { + chartOptions.scales['y3'] = { + type: 'linear', + display: true, + position: 'right', + // grid line settings + grid: { + drawOnChartArea: false, // only want the grid lines for one axis to show up + }, + // More then 12 bar should be strange. + suggestedMin: 0, + suggestedMax: 12, + }; + } + this.flowProfileChartEl = new Chart(this.flowProfileChart.nativeElement, { type: 'line', data: drinkingData, @@ -269,9 +284,18 @@ export class BrewDetailComponent implements OnInit { for (const data of this.flow_profile_raw.waterFlow) { this.flowProfileChartEl.data.datasets[1].data.push(data.value); } - for (const data of this.flow_profile_raw.realtimeFlow) { - this.flowProfileChartEl.data.datasets[2].data.push(data.flow_value); + if (this.flow_profile_raw.realtimeFlow) { + for (const data of this.flow_profile_raw.realtimeFlow) { + this.flowProfileChartEl.data.datasets[2].data.push(data.flow_value); + } + } + + if (this.flow_profile_raw.pressureFlow) { + for (const data of this.flow_profile_raw.pressureFlow) { + this.flowProfileChartEl.data.datasets[3].data.push(data.actual_pressure); + } } + this.flowProfileChartEl.update(); } } diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index d746fd4af..69d1c52ef 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -549,6 +549,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.flowSecondTick = 0; this.flowProfileArr = []; this.flowProfileArrObjs = []; + this.flowProfileArrCalculated = []; } if (this.flowProfileChartEl === undefined) { const drinkingData = { @@ -728,14 +729,27 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { y: data.value, }); } - for (const data of this.flow_profile_raw.realtimeFlow) { - const dataDay = moment(new Date()).startOf('day'); - dataDay.add('seconds', data.brew_time); - this.flowProfileChartEl.data.datasets[2].data.push({ - x: dataDay.toDate().getTime(), - y: data.flow_value, - }); + if (this.flow_profile_raw.realtimeFlow) { + for (const data of this.flow_profile_raw.realtimeFlow) { + const dataDay = moment(new Date()).startOf('day'); + dataDay.add('seconds', data.brew_time); + this.flowProfileChartEl.data.datasets[2].data.push({ + x: dataDay.toDate().getTime(), + y: data.flow_value, + }); + } + } + if ( this.flow_profile_raw.pressureFlow) { + for (const data of this.flow_profile_raw.pressureFlow) { + const dataDay = moment(new Date()).startOf('day'); + dataDay.add('seconds', data.brew_time); + this.flowProfileChartEl.data.datasets[3].data.push({ + x: dataDay.toDate().getTime(), + y: data.actual_pressure, + }); + } } + } this.flowProfileChartEl.update('quite'); } From 39f6e193994c212d749331de59ea1b35bcbe6934 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 19 Jun 2022 13:38:36 +0200 Subject: [PATCH 24/78] #379 - Custom Rating was not correctly done --- src/app/settings/settings.page.ts | 4 +++- src/components/brew-information/brew-information.component.ts | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/app/settings/settings.page.ts b/src/app/settings/settings.page.ts index a0b0d9b14..0d7aacf14 100644 --- a/src/app/settings/settings.page.ts +++ b/src/app/settings/settings.page.ts @@ -378,8 +378,10 @@ export class SettingsPage implements OnInit { } public async changeBrewRating() { - this.settings.resetFilter(); + + // #379 - First save then reset filter ;) await this.saveSettings(); + this.settings.resetFilter(); } public async saveSettings() { diff --git a/src/components/brew-information/brew-information.component.ts b/src/components/brew-information/brew-information.component.ts index 0900b8b2a..e0fe3907b 100644 --- a/src/components/brew-information/brew-information.component.ts +++ b/src/components/brew-information/brew-information.component.ts @@ -76,7 +76,8 @@ export class BrewInformationComponent implements OnInit { public hasCustomRatingRange(): boolean { if (this.settings) { - if (this.settings.brew_rating_steps > 5) { + // #379 + if (this.settings.brew_rating !== 5) { return true; } else if (this.settings.brew_rating_steps !== 1) { return true; From 2617dbaac4189e8c9ea60f83a6be22f0f2cef019 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 19 Jun 2022 13:46:07 +0200 Subject: [PATCH 25/78] #376 Change tooltips --- src/assets/i18n/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 0a7c94fea..86597fd14 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -893,7 +893,7 @@ "PAGE_SETTINGS_IMAGE_QUALITY": "Image quality", "PAGE_SETTINGS_IMAGE_QUALITY_TOOLTIP": "Define which quality your images should have. This allows you to lower your data usage.", "PAGE_SETTINGS_BREW_RATING": "Brew rating", - "PAGE_SETTINGS_BREW_RATING_TOOLTIP": "-1 to 5 are to less for rating your brew? You can set up to 100 'points'.", + "PAGE_SETTINGS_BREW_RATING_TOOLTIP": "Is the default '-1 to 5' not the right rating for you? You can instead use a '-1 to 100' scale", "UPDATE_ENTRY_OF": "Update entry {{index}} of {{count}}", "WEBSITE": "Website", "SHARE": "Share", From 90f08295a54577515a989db6919af3f16be2484f Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 19 Jun 2022 15:36:21 +0200 Subject: [PATCH 26/78] #386 - If anomaly was activated, the timestamps where screwed up --- src/components/brews/brew-brewing/brew-brewing.component.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index 69d1c52ef..0b552ce8d 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -1323,6 +1323,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { oldSmoothedWeight: oldSmoothedWeight, flowTime: this.flowTime, flowTimeSecond: this.flowTime + '.' + this.flowSecondTick, + flowTimestamp: this.uiHelper.getActualTimeWithMilliseconds() }; if (this.flowTime !== this.getTime()) { @@ -1505,6 +1506,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { y: weightToAdd, }); this.pushFlowProfile( + item.flowTimestamp, item.flowTimeSecond, weightToAdd, item.oldWeight, @@ -1586,6 +1588,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { }); this.pushFlowProfile( + flowObj.flowTimestamp, flowObj.flowTimeSecond, flowObj.weight, flowObj.oldWeight, @@ -1599,6 +1602,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } private pushFlowProfile( + _timestamp: string, _brewTime: string, _actualWeight: number, _oldWeight: number, @@ -1606,7 +1610,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { _oldSmoothedWeight: number ) { const brewFlow: IBrewWeightFlow = {} as IBrewWeightFlow; - brewFlow.timestamp = this.uiHelper.getActualTimeWithMilliseconds(); + brewFlow.timestamp = _timestamp; brewFlow.brew_time = _brewTime; brewFlow.actual_weight = _actualWeight; brewFlow.old_weight = _oldWeight; From 50c4b2d6b5a6a956f4095ed08e4548267ffda58c Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 19 Jun 2022 16:57:21 +0200 Subject: [PATCH 27/78] #374 - Stop / Reset timer toggling for scale --- src/app/settings/settings.page.html | 11 +++++++ src/assets/i18n/de.json | 4 ++- src/assets/i18n/en.json | 4 ++- src/assets/i18n/es.json | 4 ++- src/assets/i18n/tr.json | 6 ++-- src/assets/i18n/zh.json | 8 +++-- src/classes/settings/settings.ts | 5 ++++ .../brew-brewing/brew-brewing.component.ts | 30 +++++++++++-------- src/interfaces/settings/iSettings.ts | 2 ++ 9 files changed, 54 insertions(+), 20 deletions(-) diff --git a/src/app/settings/settings.page.html b/src/app/settings/settings.page.html index 130ed77d3..ec9920868 100644 --- a/src/app/settings/settings.page.html +++ b/src/app/settings/settings.page.html @@ -251,6 +251,17 @@

{{"PAGE_SETTINGS_ANALYTICS_INFORMATION" | translate}}

+ +

{{"SMART_SCALE_STOP_TIMER_ON_BREW" | translate}}

+ +
+ +

{{"SMART_SCALE_RESET_TIMER_ON_BREW" | translate}}

+ +
+

{{"SMART_SCALE_TARE_ON_START_TIMER" | translate}}

diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index fdc4a07d6..251f4010d 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -1187,5 +1187,7 @@ "PREPARATION_TYPE_TRICOLATE": "Tricolate", "QR_CODE_REFRESH_DATA_MESSAGE": "Alle Informationen der Bohne werden überschritten, jetzt fortfahren?", "POPOVER_QR_CODE_REFRESH": "Daten neu laden", - "BREW_FLOW_WEIGHT_REALTIME": "Fluss (Echtzeit)" + "BREW_FLOW_WEIGHT_REALTIME": "Fluss (Echtzeit)", + "SMART_SCALE_STOP_TIMER_ON_BREW": "Waagenzeit bei neuer Brühung anhalten", + "SMART_SCALE_RESET_TIMER_ON_BREW": "Waagenzeit bei neuer Brühung zurücksetzten" } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 86597fd14..526afa690 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -1187,5 +1187,7 @@ "PREPARATION_TYPE_TRICOLATE": "Tricolate", "QR_CODE_REFRESH_DATA_MESSAGE": "All information of the bean will be overwritten, start now?", "POPOVER_QR_CODE_REFRESH": "Reload data", - "BREW_FLOW_WEIGHT_REALTIME": "Flow (Realtime)" + "BREW_FLOW_WEIGHT_REALTIME": "Flow (Realtime)", + "SMART_SCALE_STOP_TIMER_ON_BREW": "Stop scale timer on new brew", + "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew" } diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index cc3fd8242..6f3141348 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -1187,5 +1187,7 @@ "PREPARATION_TYPE_TRICOLATE": "Tricolate", "QR_CODE_REFRESH_DATA_MESSAGE": "Toda la información del bean se sobrescribirá, ¿empezar ahora?", "POPOVER_QR_CODE_REFRESH": "Recargar datos", - "BREW_FLOW_WEIGHT_REALTIME": "Fujo (tiempo real)" + "BREW_FLOW_WEIGHT_REALTIME": "Fujo (tiempo real)", + "SMART_SCALE_STOP_TIMER_ON_BREW": "Stop scale timer on new brew", + "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew" } diff --git a/src/assets/i18n/tr.json b/src/assets/i18n/tr.json index e6e9b0165..fb171cce7 100644 --- a/src/assets/i18n/tr.json +++ b/src/assets/i18n/tr.json @@ -1186,6 +1186,8 @@ "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo", "PREPARATION_TYPE_TRICOLATE": "Tricolate", "QR_CODE_REFRESH_DATA_MESSAGE": "Çekirdeğin tüm bilgilerinin üzerine yazılacak, şimdi başlasın mı?", - "POPOVER_QR_CODE_REFRESH": "Verileri yeniden yükle", - "BREW_FLOW_WEIGHT_REALTIME": "Fluss (Echtzeit)" + "POPOVER_QR_CODE_REFRESH": "Reload data", + "BREW_FLOW_WEIGHT_REALTIME": "Flow (Realtime)", + "SMART_SCALE_STOP_TIMER_ON_BREW": "Stop scale timer on new brew", + "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew" } diff --git a/src/assets/i18n/zh.json b/src/assets/i18n/zh.json index 47d1ca715..e79c679aa 100644 --- a/src/assets/i18n/zh.json +++ b/src/assets/i18n/zh.json @@ -1184,7 +1184,9 @@ "PREPARATION_TYPE_ROK": "ROK 手压咖啡机", "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo", "PREPARATION_TYPE_TRICOLATE": "Tricolate 聪明杯", - "QR_CODE_REFRESH_DATA_MESSAGE": "Alle Informationen der Bohne werden überschritten, jetzt fortfahren?", - "POPOVER_QR_CODE_REFRESH": "Daten neu laden", - "BREW_FLOW_WEIGHT_REALTIME": "Fluss (Echtzeit)" + "QR_CODE_REFRESH_DATA_MESSAGE": "All information of the bean will be overwritten, start now?", + "POPOVER_QR_CODE_REFRESH": "Reload data", + "BREW_FLOW_WEIGHT_REALTIME": "Flow (Realtime)", + "SMART_SCALE_STOP_TIMER_ON_BREW": "Stop scale timer on new brew", + "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew" } diff --git a/src/classes/settings/settings.ts b/src/classes/settings/settings.ts index 1bb06daab..1669cde11 100755 --- a/src/classes/settings/settings.ts +++ b/src/classes/settings/settings.ts @@ -83,9 +83,12 @@ export class Settings implements ISettings { public bluetooth_scale_stay_connected: boolean; public bluetooth_scale_tare_on_brew: boolean; public bluetooth_scale_tare_on_start_timer: boolean; + public bluetooth_scale_reset_timer_on_brew: boolean; + public bluetooth_scale_stop_timer_on_brew: boolean; public bluetooth_ignore_negative_values: boolean; public bluetooth_ignore_anomaly_values: boolean; + public pressure_id: string; public pressure_type: PressureType; public pressure_log: boolean; @@ -198,6 +201,8 @@ export class Settings implements ISettings { this.bluetooth_scale_stay_connected = false; this.bluetooth_scale_tare_on_brew = true; this.bluetooth_scale_tare_on_start_timer = true; + this.bluetooth_scale_stop_timer_on_brew = true; + this.bluetooth_scale_reset_timer_on_brew = true; this.bluetooth_ignore_negative_values = false; this.bluetooth_ignore_anomaly_values = false; diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index 0b552ce8d..ef0107f21 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -300,19 +300,25 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { await scale.tare(); } - await new Promise((resolve) => { - setTimeout(async () => { - await scale.setTimer(SCALE_TIMER_COMMAND.STOP); - resolve(undefined); - }, 50); - }); + if (this.settings.bluetooth_scale_stop_timer_on_brew === true) { + await new Promise((resolve) => { + setTimeout(async () => { + await scale.setTimer(SCALE_TIMER_COMMAND.STOP); + resolve(undefined); + }, 50); + }); + } + + if (this.settings.bluetooth_scale_reset_timer_on_brew === true) { + await new Promise((resolve) => { + setTimeout(async () => { + await scale.setTimer(SCALE_TIMER_COMMAND.RESET); + resolve(undefined); + }, 50); + }); + } + - await new Promise((resolve) => { - setTimeout(async () => { - await scale.setTimer(SCALE_TIMER_COMMAND.RESET); - resolve(undefined); - }, 50); - }); } if (this.timer.isTimerRunning() === true && _firstStart === false) { this.attachToScaleWeightChange(); diff --git a/src/interfaces/settings/iSettings.ts b/src/interfaces/settings/iSettings.ts index 35aa504c4..8761eb360 100755 --- a/src/interfaces/settings/iSettings.ts +++ b/src/interfaces/settings/iSettings.ts @@ -76,6 +76,8 @@ export interface ISettings { bluetooth_scale_stay_connected: boolean; bluetooth_scale_tare_on_brew: boolean; bluetooth_scale_tare_on_start_timer: boolean; + bluetooth_scale_reset_timer_on_brew: boolean; + bluetooth_scale_stop_timer_on_brew: boolean; bluetooth_ignore_negative_values: boolean; bluetooth_ignore_anomaly_values: boolean; From b32c395ba17ecef7793006d32fd3bc355c27b15a Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Mon, 20 Jun 2022 19:15:57 +0200 Subject: [PATCH 28/78] #383 - Remove the binding, do another function solution --- src/services/bleManager/ble-manager.service.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/services/bleManager/ble-manager.service.ts b/src/services/bleManager/ble-manager.service.ts index a230d17e9..f79ef8f69 100644 --- a/src/services/bleManager/ble-manager.service.ts +++ b/src/services/bleManager/ble-manager.service.ts @@ -503,8 +503,12 @@ export class BleManagerService { ); ble.autoConnect( deviceId, - this.connectCallback.bind(this, deviceType), - this.disconnectCallback.bind(this) + (data: PeripheralData) => { + this.connectCallback(deviceType,data); + }, + () => { + this.disconnectCallback(); + } ); } @@ -529,8 +533,12 @@ export class BleManagerService { ); ble.autoConnect( deviceId, - this.connectPressureCallback.bind(this, pressureType), - this.disconnectPressureCallback.bind(this) + (data: PeripheralData) => { + this.connectPressureCallback(pressureType,data); + }, + () => { + this.disconnectPressureCallback(); + } ); } @@ -552,7 +560,7 @@ export class BleManagerService { } } - private disconnectCallback(callback) { + private disconnectCallback() { if (this.scale) { this.scale.disconnectTriggered(); this.scale = null; From 055f3be559c024d6f53d6b11acc3b33d2a83877c Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Tue, 21 Jun 2022 21:21:13 +0200 Subject: [PATCH 29/78] #383 - Remove the binding, do another function solution --- src/assets/i18n/de.json | 3 +- src/assets/i18n/en.json | 3 +- src/assets/i18n/es.json | 3 +- src/assets/i18n/tr.json | 3 +- src/assets/i18n/zh.json | 3 +- .../brew-brewing/brew-brewing.component.ts | 28 ++++++++++++++----- 6 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 251f4010d..e0cf85a65 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -1189,5 +1189,6 @@ "POPOVER_QR_CODE_REFRESH": "Daten neu laden", "BREW_FLOW_WEIGHT_REALTIME": "Fluss (Echtzeit)", "SMART_SCALE_STOP_TIMER_ON_BREW": "Waagenzeit bei neuer Brühung anhalten", - "SMART_SCALE_RESET_TIMER_ON_BREW": "Waagenzeit bei neuer Brühung zurücksetzten" + "SMART_SCALE_RESET_TIMER_ON_BREW": "Waagenzeit bei neuer Brühung zurücksetzten", + "BREW_PRESSURE_FLOW": "Druck" } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 526afa690..4a2caffd2 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -1189,5 +1189,6 @@ "POPOVER_QR_CODE_REFRESH": "Reload data", "BREW_FLOW_WEIGHT_REALTIME": "Flow (Realtime)", "SMART_SCALE_STOP_TIMER_ON_BREW": "Stop scale timer on new brew", - "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew" + "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew", + "BREW_PRESSURE_FLOW": "Pressure" } diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index 6f3141348..29cb36287 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -1189,5 +1189,6 @@ "POPOVER_QR_CODE_REFRESH": "Recargar datos", "BREW_FLOW_WEIGHT_REALTIME": "Fujo (tiempo real)", "SMART_SCALE_STOP_TIMER_ON_BREW": "Stop scale timer on new brew", - "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew" + "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew", + "BREW_PRESSURE_FLOW": "Pressure" } diff --git a/src/assets/i18n/tr.json b/src/assets/i18n/tr.json index fb171cce7..786760a1a 100644 --- a/src/assets/i18n/tr.json +++ b/src/assets/i18n/tr.json @@ -1189,5 +1189,6 @@ "POPOVER_QR_CODE_REFRESH": "Reload data", "BREW_FLOW_WEIGHT_REALTIME": "Flow (Realtime)", "SMART_SCALE_STOP_TIMER_ON_BREW": "Stop scale timer on new brew", - "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew" + "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew", + "BREW_PRESSURE_FLOW": "Pressure" } diff --git a/src/assets/i18n/zh.json b/src/assets/i18n/zh.json index e79c679aa..9181ed006 100644 --- a/src/assets/i18n/zh.json +++ b/src/assets/i18n/zh.json @@ -1188,5 +1188,6 @@ "POPOVER_QR_CODE_REFRESH": "Reload data", "BREW_FLOW_WEIGHT_REALTIME": "Flow (Realtime)", "SMART_SCALE_STOP_TIMER_ON_BREW": "Stop scale timer on new brew", - "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew" + "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew", + "BREW_PRESSURE_FLOW": "Pressure" } diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index ef0107f21..648d3441e 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -254,7 +254,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.deattachToScaleEvents(); const scale: BluetoothScale = this.bleManager.getScale(); - if (!this.scaleTimerSubscription) { + if (scale && !this.scaleTimerSubscription) { this.scaleTimerSubscription = scale.timerEvent.subscribe((event) => { // Timer pressed if (event) { @@ -279,7 +279,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.checkChanges(); }); } - if (!this.scaleTareSubscription) { + if (scale && !this.scaleTareSubscription) { this.scaleTareSubscription = scale.tareEvent.subscribe(() => { // Timer pressed if ( @@ -297,13 +297,18 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { if (_firstStart) { if (this.settings.bluetooth_scale_tare_on_brew === true) { - await scale.tare(); + if (scale) { + await scale.tare(); + } } if (this.settings.bluetooth_scale_stop_timer_on_brew === true) { await new Promise((resolve) => { setTimeout(async () => { - await scale.setTimer(SCALE_TIMER_COMMAND.STOP); + if (scale) { + await scale.setTimer(SCALE_TIMER_COMMAND.STOP); + } + resolve(undefined); }, 50); }); @@ -312,7 +317,9 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { if (this.settings.bluetooth_scale_reset_timer_on_brew === true) { await new Promise((resolve) => { setTimeout(async () => { - await scale.setTimer(SCALE_TIMER_COMMAND.RESET); + if (scale) { + await scale.setTimer(SCALE_TIMER_COMMAND.RESET); + } resolve(undefined); }, 50); }); @@ -335,7 +342,10 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { if (_firstStart) { const pressureDevice: PressureDevice = this.bleManager.getPressureDevice(); - await pressureDevice.updateZero(); + if (pressureDevice) { + await pressureDevice.updateZero(); + } + } if (this.timer.isTimerRunning() === true && _firstStart === false) { this.attachToPressureChange(); @@ -457,6 +467,9 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { if (this.preparationMethodHasBeenFocused === true) { this.data.method_of_preparation_tools = []; this.preparationMethodHasBeenFocused = false; + if (this.timer.isTimerRunning()===false) { + this.initializeFlowChart(); + } } } @@ -548,6 +561,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { private initializeFlowChart(): void { setTimeout(() => { + if (this.flowProfileChartEl) { this.flowProfileChartEl.destroy(); this.flowProfileChartEl = undefined; @@ -597,7 +611,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { const pressureDevice = this.bleManager.getPressureDevice(); if (pressureDevice != null || !this.platform.is('cordova')) { drinkingData.datasets.push({ - label: this.translate.instant('PRESSURE'), + label: this.translate.instant('BREW_PRESSURE_FLOW'), data: [], borderColor: 'rgb(132,42,37)', backgroundColor: 'rgb(189,61,53)', From 699f220422e2603a13c7149badd2269b1504f1fc Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Fri, 24 Jun 2022 16:59:55 +0200 Subject: [PATCH 30/78] #369 - Fix number to max 1 leading digital on calculation --- .../brew-beverage-quantity-calculator.component.ts | 10 ++++++++-- .../brews/brew-brewing/brew-brewing.component.ts | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/app/brew/brew-beverage-quantity-calculator/brew-beverage-quantity-calculator.component.ts b/src/app/brew/brew-beverage-quantity-calculator/brew-beverage-quantity-calculator.component.ts index 8ba3dc70a..9ebab2fe4 100644 --- a/src/app/brew/brew-beverage-quantity-calculator/brew-beverage-quantity-calculator.component.ts +++ b/src/app/brew/brew-beverage-quantity-calculator/brew-beverage-quantity-calculator.component.ts @@ -1,5 +1,6 @@ import {Component, Input, OnInit} from '@angular/core'; import {ModalController} from '@ionic/angular'; +import {UIHelper} from '../../../services/uiHelper'; @Component({ selector: 'app-brew-beverage-quantity-calculator', @@ -15,7 +16,8 @@ export class BrewBeverageQuantityCalculatorComponent implements OnInit { @Input('vesselWeight') public vesselWeight: number = 0; public calculatedWeight: number = 0; - constructor(private readonly modalController: ModalController) { + constructor(private readonly modalController: ModalController, + private readonly uiHelper: UIHelper) { } @@ -23,7 +25,11 @@ export class BrewBeverageQuantityCalculatorComponent implements OnInit { } public calculateWeight() { - this.calculatedWeight = this.totalWeight - this.vesselWeight + this.calculatedWeight = this.totalWeight - this.vesselWeight; + if (this.calculatedWeight && this.calculatedWeight > 0) { + this.calculatedWeight = this.uiHelper.toFixedIfNecessary(this.calculatedWeight,1); + } + } public async setBrewBeverage() { diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index 648d3441e..8dd2679e1 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -2038,7 +2038,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { const { data } = await modal.onWillDismiss(); if (data !== undefined && data.brew_beverage_quantity > 0) { - this.data.brew_beverage_quantity = data.brew_beverage_quantity; + this.data.brew_beverage_quantity = this.uiHelper.toFixedIfNecessary(data.brew_beverage_quantity, 1); } } } From 0e12dbc1c9b004b5366091f4ef8f8aa405d332ff Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 26 Jun 2022 09:30:11 +0200 Subject: [PATCH 31/78] #338 - Added more loggings, to even check if we get weight and receive --- src/app/dashboard/dashboard.page.html | 2 +- src/classes/devices/bluetoothDevice.ts | 19 ++++++++++++++++++- .../devices/pressureBluetoothDevice.ts | 9 ++++++++- .../brew-timer/brew-timer.component.ts | 2 ++ 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/app/dashboard/dashboard.page.html b/src/app/dashboard/dashboard.page.html index 5e25febea..e46cf3cb7 100644 --- a/src/app/dashboard/dashboard.page.html +++ b/src/app/dashboard/dashboard.page.html @@ -14,7 +14,7 @@ - + diff --git a/src/classes/devices/bluetoothDevice.ts b/src/classes/devices/bluetoothDevice.ts index 8e3c912c4..0d195fe33 100644 --- a/src/classes/devices/bluetoothDevice.ts +++ b/src/classes/devices/bluetoothDevice.ts @@ -4,6 +4,7 @@ import { PeripheralData } from './ble.types'; declare var ble; import { EventEmitter } from '@angular/core'; +import {Logger} from './common/logger'; export enum SCALE_TIMER_COMMAND { STOP = 'STOP', @@ -37,7 +38,7 @@ export class BluetoothScale { protected weight: Weight; protected platforms: Platforms[]; public batteryLevel: number; - + private blueToothParentlogger: Logger; public weightChange: EventEmitter = new EventEmitter(); public flowChange: EventEmitter = new EventEmitter(); @@ -47,6 +48,8 @@ export class BluetoothScale { constructor(data: PeripheralData, platforms: Platforms[]) { this.device_id = data.id; this.platforms = platforms; + this.blueToothParentlogger = new Logger(); + } public async connect() { @@ -86,11 +89,19 @@ export class BluetoothScale { // (A3 * 03 + b2 * 0.7) // Actual value * 03 + smoothed value * 0.7 + this.blueToothParentlogger.log('Bluetooth Scale - New weight recieved ' + _newWeight); + this.weight.oldSmoothed = this.weight.smoothed; this.weight.smoothed = this.calculateSmoothedWeight(_newWeight, this.weight.smoothed); // We passed every shake change, seems like everything correct, set the new weight. this.weight.actual = _newWeight; + + try { + this.blueToothParentlogger.log('Bluetooth Scale - Are weight subscriptions existing? ' + this.weightChange?.observers?.length); + }catch(ex) { + + } this.weightChange.emit({ actual: this.weight.actual, smoothed: this.weight.smoothed, @@ -108,6 +119,12 @@ export class BluetoothScale { protected triggerFlow(_stableWeight: boolean = false) { const actualDate = new Date(); + this.blueToothParentlogger.log('Bluetooth Scale - Flow triggered'); + try { + this.blueToothParentlogger.log('Bluetooth Scale - Are flow subscriptions existing? ' + this.flowChange?.observers?.length); + }catch(ex) { + + } this.flowChange.emit({ actual: this.weight.actual, smoothed: this.weight.smoothed, diff --git a/src/classes/devices/pressureBluetoothDevice.ts b/src/classes/devices/pressureBluetoothDevice.ts index 575db93d7..6659818cc 100644 --- a/src/classes/devices/pressureBluetoothDevice.ts +++ b/src/classes/devices/pressureBluetoothDevice.ts @@ -1,6 +1,7 @@ import { Platforms } from '@ionic/core'; import { PeripheralData } from './ble.types'; import { EventEmitter } from '@angular/core'; +import {Logger} from './common/logger'; export interface Pressure { actual: number; @@ -16,7 +17,7 @@ export abstract class PressureDevice { protected pressure: Pressure; protected platforms: Platforms[]; public batteryLevel: number; - + private pressureParentLogger: Logger; public pressureChange: EventEmitter = new EventEmitter(); protected constructor(data: PeripheralData, platforms: Platforms[]) { @@ -26,6 +27,7 @@ export abstract class PressureDevice { actual: 0, old: 0, }; + this.pressureParentLogger = new Logger(); } public abstract connect(): Promise; @@ -41,9 +43,14 @@ export abstract class PressureDevice { } protected setPressure(_newPressure: number) { + this.pressureParentLogger.log('Bluetooth Pressure Device - New pressure recieved ' + _newPressure); this.pressure.actual = _newPressure; const actualDate = new Date(); + try { + this.pressureParentLogger.log('Bluetooth Pressure Device - Are subscriptions existing? ' + this.pressureChange?.observers?.length); + }catch(ex) { + } this.pressureChange.emit({ actual: this.pressure.actual, old: this.pressure.old, diff --git a/src/components/brew-timer/brew-timer.component.ts b/src/components/brew-timer/brew-timer.component.ts index eb7bc8379..d39b350e2 100644 --- a/src/components/brew-timer/brew-timer.component.ts +++ b/src/components/brew-timer/brew-timer.component.ts @@ -104,6 +104,8 @@ export class BrewTimerComponent implements OnInit, OnDestroy { this.timer.displayTime = this.getSecondsAsDigitalClock(this.timer.seconds); this.displayingTime = moment(this.displayingTime).startOf('day').add('seconds', this.timer.seconds).toISOString(); + + } public startTimer(_resumed: boolean = false): void { From cf0cdcf410e5b1716421868e3dea2873de165b64 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 26 Jun 2022 11:07:12 +0200 Subject: [PATCH 32/78] #383 - Change the acaia bindings, maybe this will help for hiccups, and added awaits --- src/classes/devices/acaia/acaia.ts | 30 +++++++----- src/classes/devices/felicitaScale.ts | 47 ++++++++++++------- .../brew-brewing/brew-brewing.component.ts | 6 +-- 3 files changed, 50 insertions(+), 33 deletions(-) diff --git a/src/classes/devices/acaia/acaia.ts b/src/classes/devices/acaia/acaia.ts index 4fe782b6d..a1dd87424 100644 --- a/src/classes/devices/acaia/acaia.ts +++ b/src/classes/devices/acaia/acaia.ts @@ -56,7 +56,9 @@ class DecoderWorker { if (typeof Worker !== 'undefined') { this.logger.log('Workers are supported. Creating a decode worker...'); this.worker = new Worker(new URL('./decode.worker', import.meta.url)); - this.worker.onmessage = this.handleMessage.bind(this); + this.worker.onmessage = (_result) => { + this.handleMessage({ data: _result }); + }; } else { this.logger.log('Workers are NOT supported. Import decoder...'); // fallback to running in setTimeout @@ -232,7 +234,9 @@ export class AcaiaScale { this.device_id, this.weight_uuid, this.rx_char_uuid, - this.handleNotification.bind(this), + (_arrBuffer) => { + this.handleNotification(_arrBuffer); + }, (err) => { this.logger.error( 'failed to subscribe to notifications ' + JSON.stringify(err) @@ -243,7 +247,7 @@ export class AcaiaScale { await this.write(new Uint8Array([0, 1]).buffer); - this.notificationsReady(); + await this.notificationsReady(); } public disconnectTriggered() { @@ -351,10 +355,10 @@ export class AcaiaScale { return false; } - private handleNotification(value: ArrayBuffer) { + private async handleNotification(value: ArrayBuffer) { if (this.connected) { this.worker.addBuffer(value); - this.heartbeat(); + await this.heartbeat(); } } @@ -411,8 +415,8 @@ export class AcaiaScale { return this.connected; } - private notificationsReady() { - this.ident(); + private async notificationsReady() { + await this.ident(); this.last_heartbeat = Date.now(); this.logger.info('Scale Ready!'); } @@ -426,7 +430,9 @@ export class AcaiaScale { this.weight_uuid, this.tx_char_uuid, data, - resolve, + () => { + resolve(true); + }, (err) => { this.logger.error( 'failed to write to characteristic, but we are ignoring it', @@ -452,7 +458,7 @@ export class AcaiaScale { ]); } - private heartbeat() { + private async heartbeat() { if (!this.connected) { return false; } @@ -463,16 +469,16 @@ export class AcaiaScale { } while (this.command_queue.length) { const packet = this.command_queue.shift(); - this.write(packet, true).catch(this.logger.error.bind(this.logger)); + await this.write(packet, true).catch(this.logger.error.bind(this.logger)); } if (Date.now() >= this.last_heartbeat + 1000) { this.logger.debug('Sending heartbeat...'); this.last_heartbeat = Date.now(); if (this.isPyxisStyle) { - this.write(encodeId(this.isPyxisStyle)); + await this.write(encodeId(this.isPyxisStyle)); } - this.write(encodeHeartbeat(), false); + await this.write(encodeHeartbeat(), false); this.logger.debug('Heartbeat success'); } return true; diff --git a/src/classes/devices/felicitaScale.ts b/src/classes/devices/felicitaScale.ts index 1171b154c..9e806e203 100644 --- a/src/classes/devices/felicitaScale.ts +++ b/src/classes/devices/felicitaScale.ts @@ -15,6 +15,21 @@ export default class FelicitaScale extends BluetoothScale { // Constructor + // Class Members + + private logger: Logger; + + public scaleUnit = FELICITA_GRAM_UNIT; + + public batteryLevel: number; + + protected weight: Weight = { + actual: 0, + old: 0, + smoothed: 0, + oldSmoothed: 0, + }; + constructor(data: PeripheralData, platforms: Platforms[]) { super(data, platforms); this.batteryLevel = 0; @@ -117,8 +132,14 @@ export default class FelicitaScale extends BluetoothScale { DATA_SERVICE, DATA_CHARACTERISTIC, new Uint8Array(_bytes).buffer, - (e) => { resolve(true); }, - (e) => { resolve(false); }); + (e) => { + this.logger.debug('Write successfully'); + resolve(true); + }, + (e) => { + this.logger.debug('Write unsuccessfully'); + resolve(false); + }); }); } @@ -148,15 +169,18 @@ export default class FelicitaScale extends BluetoothScale { } private async startTimer() { - this.write([CMD_START_TIMER]) + this.logger.debug('Write - Start timer'); + await this.write([CMD_START_TIMER]); } private async resetTimer() { - this.write([CMD_RESET_TIMER]) + this.logger.debug('Write - Reset timer'); + await this.write([CMD_RESET_TIMER]); } private async stopTimer() { - this.write([CMD_STOP_TIMER]) + this.logger.debug('Write - Stop timer'); + await this.write([CMD_STOP_TIMER]); } /** @@ -199,18 +223,5 @@ export default class FelicitaScale extends BluetoothScale { }); } - // Class Members - - private logger: Logger; - - public scaleUnit = FELICITA_GRAM_UNIT; - - public batteryLevel: number; - protected weight: Weight = { - actual: 0, - old: 0, - smoothed: 0, - oldSmoothed: 0, - }; } diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index 8dd2679e1..34349fe62 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -650,7 +650,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { realtime: { // How much timeseconds do we want to show duration: 20000, - delay: delay, // data will be automatically deleted as it disappears off the chart ttl: undefined, @@ -939,7 +938,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } this.startingFlowTime = Date.now(); - this.flowProfileChartEl.options.scales.x.realtime.pause = false; const startingDay = moment(new Date()).startOf('day'); // IF brewtime has some seconds, we add this to the delay directly. if (this.data.brew_time > 0) { @@ -947,6 +945,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } const delay = Date.now() - startingDay.toDate().getTime(); this.flowProfileChartEl.options.scales.x.realtime.delay = delay; + this.flowProfileChartEl.options.scales.x.realtime.pause = false; this.flowProfileChartEl.update('quiet'); if (scale) { @@ -970,7 +969,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } this.startingFlowTime = Date.now(); - this.flowProfileChartEl.options.scales.x.realtime.pause = false; + const startingDay = moment(new Date()).startOf('day'); // IF brewtime has some seconds, we add this to the delay directly. if (this.data.brew_time > 0) { @@ -983,6 +982,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } const delay = Date.now() - startingDay.toDate().getTime(); this.flowProfileChartEl.options.scales.x.realtime.delay = delay; + this.flowProfileChartEl.options.scales.x.realtime.pause = false; this.flowProfileChartEl.update('quiet'); if (scale) { From 7f51398d06d6e0b807b119c9de058bf79247eff4 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 26 Jun 2022 11:42:05 +0200 Subject: [PATCH 33/78] #383 - Added awaits, and initializing the view when user is already on brew page --- src/app/brew/brew-flow/brew-flow.component.ts | 8 ++--- .../brew-brewing/brew-brewing.component.ts | 30 +++++++++++++++++-- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/app/brew/brew-flow/brew-flow.component.ts b/src/app/brew/brew-flow/brew-flow.component.ts index 8364815f3..8e0544114 100644 --- a/src/app/brew/brew-flow/brew-flow.component.ts +++ b/src/app/brew/brew-flow/brew-flow.component.ts @@ -1,4 +1,4 @@ -import {Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, ViewChild} from '@angular/core'; +import {AfterViewInit, Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, ViewChild} from '@angular/core'; import {ModalController, Platform} from '@ionic/angular'; import {Subscription} from 'rxjs'; import {Brew} from '../../../classes/brew/brew'; @@ -16,7 +16,7 @@ import {BrewBrewingComponent} from '../../../components/brews/brew-brewing/brew- templateUrl: './brew-flow.component.html', styleUrls: ['./brew-flow.component.scss'], }) -export class BrewFlowComponent implements OnInit, OnDestroy { +export class BrewFlowComponent implements AfterViewInit, OnDestroy { public static COMPONENT_ID: string = 'brew-flow'; @ViewChild('smartScaleWeight', {read: ElementRef}) public smartScaleWeightEl: ElementRef; @ViewChild('smartScaleWeightPerSecond', {read: ElementRef}) public smartScaleWeightPerSecondEl: ElementRef; @@ -38,7 +38,7 @@ export class BrewFlowComponent implements OnInit, OnDestroy { private readonly uiBrewHelper: UIBrewHelper) { } - public async ngOnInit () { + public async ngAfterViewInit () { this.flowChartEl.options.responsive = false; @@ -133,7 +133,7 @@ export class BrewFlowComponent implements OnInit, OnDestroy { } this.flowChartEl.maintainAspectRatio = false; - this.flowChartEl.update(); + this.flowChartEl.update('quite'); } diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index 34349fe62..5a2d18b98 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -50,6 +50,7 @@ import { BrewFlowComponent } from '../../../app/brew/brew-flow/brew-flow.compone import { ScreenOrientation } from '@ionic-native/screen-orientation/ngx'; import { PreparationTool } from '../../../classes/preparation/preparationTool'; import { PressureDevice } from '../../../classes/devices/pressureBluetoothDevice'; +import {UIAlert} from '../../../services/uiAlert'; declare var cordova; @@ -132,7 +133,8 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { private readonly uiHelper: UIHelper, private readonly uiExcel: UIExcel, private readonly uiFileHelper: UIFileHelper, - private readonly screenOrientation: ScreenOrientation + private readonly screenOrientation: ScreenOrientation, + private readonly uiAlert: UIAlert, ) {} public getActivePreparationTools() { @@ -214,8 +216,10 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { .attachOnEvent() .subscribe((_type) => { let disconnectTriggered: boolean = false; + let connectTriggered: boolean = false; if (_type && _type.type === 'CONNECT_SCALE') { + connectTriggered = true; this.__connectSmartScale(false); } else if (_type && _type.type === 'DISCONNECT_SCALE') { this.deattachToWeightChange(); @@ -224,6 +228,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { disconnectTriggered = true; } else if (_type && _type.type === 'CONNECT_PRESSURE') { + connectTriggered = true; this.__connectPressureDevice(false); } else if (_type && _type.type === 'DISCONNECT_PRESSURE') { @@ -239,6 +244,11 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } } + if (connectTriggered) { + if (!this.flowProfileChartEl) { + this.initializeFlowChart(); + } + } // If scale disconnected, sometimes the timer run but the screen was not refreshed, so maybe it helpes to detect the change. this.checkChanges(); }); @@ -932,9 +942,21 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { if (scale || pressureDevice ) { if (scale) { if (this.settings.bluetooth_scale_tare_on_start_timer === true) { - await scale.tare(); + await new Promise((resolve) => { + setTimeout(async () => { + await scale.tare(); + resolve(undefined); + }, 50); + }); + } - await scale.setTimer(SCALE_TIMER_COMMAND.START); + await new Promise((resolve) => { + setTimeout(async () => { + await scale.setTimer(SCALE_TIMER_COMMAND.START); + resolve(undefined); + }, 50); + }); + } this.startingFlowTime = Date.now(); @@ -1024,6 +1046,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { const scale: BluetoothScale = this.bleManager.getScale(); const pressureDevice: PressureDevice = this.bleManager.getPressureDevice(); if (scale || pressureDevice) { + await this.uiAlert.showLoadingSpinner(); if (scale) { await scale.tare(); @@ -1057,6 +1080,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.flow_profile_raw = new BrewFlow(); this.initializeFlowChart(); + await this.uiAlert.hideLoadingSpinner(); } } From 16dad10115af0624706f21f90e234c4c27c9631b Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 26 Jun 2022 12:07:08 +0200 Subject: [PATCH 34/78] #383 - Update zero pressure --- src/app/app.component.ts | 2 +- src/components/brews/brew-brewing/brew-brewing.component.ts | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 93bccea20..556061990 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -475,7 +475,7 @@ export class AppComponent implements AfterViewInit { await this.__checkAnalyticsInformationPage(); await this.uiUpdate.checkUpdateScreen(); - //#281 - Connect smartscale before checking the startup view + // #281 - Connect smartscale before checking the startup view setTimeout(() => { // Just connect after 5 seconds, to get some time, and maybe handle all the connection errors diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index 5a2d18b98..b7895b533 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -958,6 +958,10 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { }); } + if (pressureDevice) { + await pressureDevice.updateZero(); + } + this.startingFlowTime = Date.now(); const startingDay = moment(new Date()).startOf('day'); From 58bebd809f4bad0fbaafb9679add28a621c407e9 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 26 Jun 2022 12:23:26 +0200 Subject: [PATCH 35/78] #383 --- .../brews/brew-brewing/brew-brewing.component.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index b7895b533..1ef6d2551 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -398,7 +398,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { await modal.onWillDismiss().then(async () => { // If responsive would be true, the add of the container would result into 0 width 0 height, therefore the hack this.flowProfileChartEl.options.responsive = false; - this.flowProfileChartEl.update(); + this.flowProfileChartEl.update('quite'); if (this.platform.is('cordova')) { if ( @@ -972,7 +972,8 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { const delay = Date.now() - startingDay.toDate().getTime(); this.flowProfileChartEl.options.scales.x.realtime.delay = delay; this.flowProfileChartEl.options.scales.x.realtime.pause = false; - this.flowProfileChartEl.update('quiet'); + //Don't update quietly. + this.flowProfileChartEl.update(); if (scale) { this.attachToScaleWeightChange(); @@ -1084,7 +1085,16 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.flow_profile_raw = new BrewFlow(); this.initializeFlowChart(); - await this.uiAlert.hideLoadingSpinner(); + + // Give the buttons a bit of time, 100ms won't be an issue for user flow + await new Promise((resolve) => { + setTimeout(async () => { + await this.uiAlert.hideLoadingSpinner(); + resolve(undefined); + }, 100); + }); + + } } From 6054dd7e4d3c4c27b7c4b0155d8cf248d1f21976 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 26 Jun 2022 21:29:38 +0200 Subject: [PATCH 36/78] #383 - Remove the binding, do another function solution --- src/classes/devices/transducerDirectPressure.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/classes/devices/transducerDirectPressure.ts b/src/classes/devices/transducerDirectPressure.ts index de09a7d81..ae9aa770b 100644 --- a/src/classes/devices/transducerDirectPressure.ts +++ b/src/classes/devices/transducerDirectPressure.ts @@ -11,7 +11,6 @@ export default class TransducerDirectPressure extends PressureDevice { public static ZERO_SERVICE_UUID = 'CC4A6A80-51E0-11E3-B451-0002A5D5C51B'; public static ZERO_CHAR_UUID = '8CD67DA0-DA9B-11E3-9087-0002A5D5C51B'; - public static test(device: LimitedPeripheralData) { const adv = device && @@ -42,8 +41,11 @@ export default class TransducerDirectPressure extends PressureDevice { TransducerDirectPressure.ZERO_SERVICE_UUID, TransducerDirectPressure.ZERO_CHAR_UUID, data.buffer, - resolve, - reject + () => { + resolve(); + }, () => { + reject(); + } ); }); } From a13d90335bed8c0d65ef5ead8f92cbec2780a010 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Tue, 28 Jun 2022 20:08:57 +0200 Subject: [PATCH 37/78] #377, #367, #365 --- .../brew/brew-detail/brew-detail.component.ts | 9 ++++ src/app/settings/settings.page.html | 51 +++++++++++++++++-- src/assets/i18n/de.json | 5 +- src/assets/i18n/en.json | 5 +- src/classes/settings/settings.ts | 27 ++++++++++ .../brew-brewing/brew-brewing.component.ts | 14 +++++ src/interfaces/brew/iBrewGraphs.ts | 8 +++ src/interfaces/settings/iSettings.ts | 6 +++ 8 files changed, 119 insertions(+), 6 deletions(-) create mode 100755 src/interfaces/brew/iBrewGraphs.ts diff --git a/src/app/brew/brew-detail/brew-detail.component.ts b/src/app/brew/brew-detail/brew-detail.component.ts index 44a0b5df8..45245fec7 100644 --- a/src/app/brew/brew-detail/brew-detail.component.ts +++ b/src/app/brew/brew-detail/brew-detail.component.ts @@ -142,6 +142,12 @@ export class BrewDetailComponent implements OnInit { this.flowProfileChartEl = undefined; } if (this.flowProfileChartEl === undefined) { + let graphSettings = this.settings.graph.FILTER; + if ( this.data.getPreparation().style_type === + PREPARATION_STYLE_TYPE.ESPRESSO) { + graphSettings = this.settings.graph.ESPRESSO; + } + const drinkingData = { labels: [], datasets: [{ @@ -151,6 +157,7 @@ export class BrewDetailComponent implements OnInit { backgroundColor: 'rgb(205,194,172)', yAxisID: 'y', pointRadius: 0, + hidden: !graphSettings.weight }, { label: this.translate.instant('BREW_FLOW_WEIGHT_PER_SECOND'), @@ -160,6 +167,7 @@ export class BrewDetailComponent implements OnInit { yAxisID: 'y1', spanGaps: true, pointRadius: 0, + hidden: !graphSettings.calc_flow }, { label: this.translate.instant('BREW_FLOW_WEIGHT_REALTIME'), @@ -170,6 +178,7 @@ export class BrewDetailComponent implements OnInit { spanGaps: true, pointRadius: 0, tension: 0, + hidden: !graphSettings.realtime_flow }] }; const chartOptions = { diff --git a/src/app/settings/settings.page.html b/src/app/settings/settings.page.html index ec9920868..51900eabb 100644 --- a/src/app/settings/settings.page.html +++ b/src/app/settings/settings.page.html @@ -261,8 +261,6 @@

{{"PAGE_SETTINGS_ANALYTICS_INFORMATION" | translate}}

- -

{{"SMART_SCALE_TARE_ON_START_TIMER" | translate}}

{{"IGNORE_ANOMALY_VALUES" | translate}}

{{"SCALE.INFORMATION_DESCRIPTION" | translate}}

- + + + + + {{"PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_FILTER" | translate }} + + + + {{"BREW_FLOW_WEIGHT" | translate}} + + + + {{"BREW_FLOW_WEIGHT_PER_SECOND" | translate}} + + + + {{"BREW_FLOW_WEIGHT_REALTIME" | translate}} + + + + + + + + + {{"PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_ESPRESSO" | translate }} + + + {{"BREW_FLOW_WEIGHT" | translate}} + + + + {{"BREW_FLOW_WEIGHT_PER_SECOND" | translate}} + + + + {{"BREW_FLOW_WEIGHT_REALTIME" | translate}} + + +
- {{"PAGE_SETTINGS_TAB_BLUETOOTH_Pressure" | translate }} + {{"PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE" | translate }} diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index e0cf85a65..f92e2dd9a 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -1190,5 +1190,8 @@ "BREW_FLOW_WEIGHT_REALTIME": "Fluss (Echtzeit)", "SMART_SCALE_STOP_TIMER_ON_BREW": "Waagenzeit bei neuer Brühung anhalten", "SMART_SCALE_RESET_TIMER_ON_BREW": "Waagenzeit bei neuer Brühung zurücksetzten", - "BREW_PRESSURE_FLOW": "Druck" + "BREW_PRESSURE_FLOW": "Druck", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_FILTER": "Anzeige der Graphen für Filterbrühungen", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_ESPRESSO": "Anzeige der Graphen für Espressobrühungen", + "PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE": "Druck Geräte" } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 4a2caffd2..08e0a7954 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -1190,5 +1190,8 @@ "BREW_FLOW_WEIGHT_REALTIME": "Flow (Realtime)", "SMART_SCALE_STOP_TIMER_ON_BREW": "Stop scale timer on new brew", "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew", - "BREW_PRESSURE_FLOW": "Pressure" + "BREW_PRESSURE_FLOW": "Pressure", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_FILTER": "Show graphs for filter", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_ESPRESSO": "Show graphs for espresso", + "PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE": "Pressure device" } diff --git a/src/classes/settings/settings.ts b/src/classes/settings/settings.ts index 1669cde11..879414652 100755 --- a/src/classes/settings/settings.ts +++ b/src/classes/settings/settings.ts @@ -17,6 +17,7 @@ import {BEAN_SORT_ORDER} from '../../enums/beans/beanSortOrder'; import {ListViewBrewParameter} from '../parameter/listViewBrewParameter'; import {IBeanPageFilter} from '../../interfaces/bean/iBeanPageFilter'; import {BEAN_ROASTING_TYPE_ENUM} from '../../enums/beans/beanRoastingType'; +import {IBrewGraphs} from '../../interfaces/brew/iBrewGraphs'; export class Settings implements ISettings { @@ -55,6 +56,8 @@ export class Settings implements ISettings { ARCHIVED: IBrewPageFilter }; + + public bean_filter: { OPEN: IBeanPageFilter, ARCHIVED: IBeanPageFilter @@ -70,6 +73,12 @@ export class Settings implements ISettings { ARCHIVED: IBeanPageSort }; + + public graph: { + ESPRESSO: IBrewGraphs, + FILTER: IBrewGraphs, + }; + public wake_lock: boolean; public show_roasting_section: boolean; @@ -126,6 +135,15 @@ export class Settings implements ISettings { } as IBrewPageFilter; } + public GET_BREW_GRAPHS(): IBrewGraphs { + return { + weight: true, + calc_flow: true, + realtime_flow: true, + pressure: true + } as IBrewGraphs; + } + constructor() { this.brew_view = BREW_VIEW_ENUM.SINGLE_PAGE; this.startup_view = STARTUP_VIEW_ENUM.HOME_PAGE; @@ -176,6 +194,15 @@ export class Settings implements ISettings { OPEN: {} as IBeanPageSort, ARCHIVED: {} as IBeanPageSort }; + + this.graph = { + ESPRESSO: {} as IBrewGraphs, + FILTER: {} as IBrewGraphs, + }; + + this.graph.ESPRESSO = this.GET_BREW_GRAPHS(); + this.graph.FILTER = this.GET_BREW_GRAPHS(); + this.graph.FILTER.realtime_flow = false; this.brew_rating = 5; this.brew_rating_steps = 1; diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index 1ef6d2551..a9a133dbb 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -582,6 +582,12 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.flowProfileArrCalculated = []; } if (this.flowProfileChartEl === undefined) { + let graphSettings = this.settings.graph.FILTER; + if ( this.data.getPreparation().style_type === + PREPARATION_STYLE_TYPE.ESPRESSO) { + graphSettings = this.settings.graph.ESPRESSO; + } + const drinkingData = { labels: [], datasets: [ @@ -593,6 +599,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { yAxisID: 'y', pointRadius: 0, tension: 0, + hidden: !graphSettings.weight }, { label: this.translate.instant('BREW_FLOW_WEIGHT_PER_SECOND'), @@ -603,6 +610,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { spanGaps: true, pointRadius: 0, tension: 0, + hidden: !graphSettings.calc_flow }, { label: this.translate.instant('BREW_FLOW_WEIGHT_REALTIME'), @@ -613,6 +621,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { spanGaps: true, pointRadius: 0, tension: 0, + hidden: !graphSettings.calc_flow }, ], }; @@ -629,6 +638,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { spanGaps: true, pointRadius: 0, tension: 0, + hidden: !graphSettings.pressure, }); } @@ -651,6 +661,10 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { suggestedMaxFlow = 2.5; suggestedMaxWeight = 30; } + + + + const chartOptions = { animation: false, // disa scales: { diff --git a/src/interfaces/brew/iBrewGraphs.ts b/src/interfaces/brew/iBrewGraphs.ts new file mode 100755 index 000000000..4e0a51be1 --- /dev/null +++ b/src/interfaces/brew/iBrewGraphs.ts @@ -0,0 +1,8 @@ + +export interface IBrewGraphs { + weight: boolean; + calc_flow: boolean; + realtime_flow: boolean; + pressure: boolean; + +} diff --git a/src/interfaces/settings/iSettings.ts b/src/interfaces/settings/iSettings.ts index 8761eb360..d8956f48d 100755 --- a/src/interfaces/settings/iSettings.ts +++ b/src/interfaces/settings/iSettings.ts @@ -10,6 +10,7 @@ import {IBrewPageFilter} from '../brew/iBrewPageFilter'; import {IBeanPageSort} from '../bean/iBeanPageSort'; import {ListViewBrewParameter} from '../../classes/parameter/listViewBrewParameter'; import {IBeanPageFilter} from '../bean/iBeanPageFilter'; +import {IBrewGraphs} from '../brew/iBrewGraphs'; export interface ISettings { // Properties @@ -64,6 +65,11 @@ export interface ISettings { ARCHIVED: IBeanPageSort }; + graph: { + ESPRESSO: IBrewGraphs, + FILTER: IBrewGraphs, + }; + welcome_page_showed: boolean; wake_lock: boolean; From 65ed83a0c79c4cc71d0ec696310a3bb755161a77 Mon Sep 17 00:00:00 2001 From: Mikael Manukyan Date: Tue, 28 Jun 2022 11:11:46 -0700 Subject: [PATCH 38/78] Add heartbeat monitor for Acaia (#388) * Revert awaits and fix Acaia scales * Check for heartbeat and send if needed --- src/classes/devices/acaia/acaia.ts | 75 ++++++++++++++++++++---------- 1 file changed, 51 insertions(+), 24 deletions(-) diff --git a/src/classes/devices/acaia/acaia.ts b/src/classes/devices/acaia/acaia.ts index a1dd87424..d3457bc50 100644 --- a/src/classes/devices/acaia/acaia.ts +++ b/src/classes/devices/acaia/acaia.ts @@ -44,10 +44,11 @@ const log = (...args) => { // DecodeWorkers receives array buffer from heartbeat notification and emits parsed messages if any class DecoderWorker { - private worker: Worker; + private readonly worker: Worker; private readonly decodeCallback: (msgs: ParsedMessage[]) => any; + private readonly logger: Logger; + private loading: Promise; - private logger: Logger; constructor(callback: (msgs: ParsedMessage[]) => any) { this.decodeCallback = callback; @@ -56,9 +57,7 @@ class DecoderWorker { if (typeof Worker !== 'undefined') { this.logger.log('Workers are supported. Creating a decode worker...'); this.worker = new Worker(new URL('./decode.worker', import.meta.url)); - this.worker.onmessage = (_result) => { - this.handleMessage({ data: _result }); - }; + this.worker.onmessage = this.handleMessage.bind(this); } else { this.logger.log('Workers are NOT supported. Import decoder...'); // fallback to running in setTimeout @@ -114,6 +113,8 @@ class DecoderWorker { } } +const HEARTBEAT_INTERVAL = 1000; + export class AcaiaScale { private readonly device_id: string; private rx_char_uuid: string; @@ -128,7 +129,7 @@ export class AcaiaScale { private worker: DecoderWorker; - private logger: Logger; + private readonly logger: Logger; private connected: boolean; private packet: Uint8Array; @@ -148,6 +149,8 @@ export class AcaiaScale { private set_interval_thread: ReturnType; private callback: (eventType: EventType, data?: any) => any; + private heartbeat_monitor_interval: ReturnType; + constructor( device_id: string, platforms: Platforms[], @@ -165,7 +168,7 @@ export class AcaiaScale { // TODO(mike1808): make it to work with new Lunar and Pyxis by auto-detecting service and char uuid this.logger.info( - 'received charactersitics: ', + 'received characteristics: ', JSON.stringify(characteristics) ); this.characteristics = characteristics; @@ -173,7 +176,7 @@ export class AcaiaScale { if (!this.findBLEUUIDs()) { throw new Error( - 'Cannot find weight service and characterstics on the scale' + 'Cannot find weight service and characteristics on the scale' ); } @@ -227,16 +230,14 @@ export class AcaiaScale { char_uuid: this.rx_char_uuid, }); - //We moved this line from notifications ready to here. + // We moved this line from notifications ready to here. this.connected = true; ble.startNotification( this.device_id, this.weight_uuid, this.rx_char_uuid, - (_arrBuffer) => { - this.handleNotification(_arrBuffer); - }, + this.handleNotification.bind(this), (err) => { this.logger.error( 'failed to subscribe to notifications ' + JSON.stringify(err) @@ -248,13 +249,17 @@ export class AcaiaScale { await this.write(new Uint8Array([0, 1]).buffer); await this.notificationsReady(); + + this.startHeartbeatMonitor(); } public disconnectTriggered() { this.logger.debug('Scale disconnect triggered'); // Class is still existing, therefore we should do something good maybe? this.connected = false; + this.stopHeartbeatMonitor(); } + public async disconnect() { this.logger.debug('Scale disconnected'); if (this.connected) { @@ -262,7 +267,7 @@ export class AcaiaScale { this.logger.debug('Disconnect the device with its characteristics'); // Lars - I don't know if we need this, but the problem is when the scale is disconnected via settings, or shutdown, it will crash everything. // Try catch won't help here, because the device is already deattached. - //await promisify(ble.stopNotification)((this.device_id, this.weight_uuid, this.tx_char_uuid)); + // await promisify(ble.stopNotification)((this.device_id, this.weight_uuid, this.tx_char_uuid)); } else { this.logger.debug( 'We cant disconnect because one of the characteristics is missing' + @@ -355,10 +360,26 @@ export class AcaiaScale { return false; } - private async handleNotification(value: ArrayBuffer) { + private handleNotification(value: ArrayBuffer) { if (this.connected) { this.worker.addBuffer(value); - await this.heartbeat(); + this.heartbeat(); + } + } + + private startHeartbeatMonitor() { + this.heartbeat_monitor_interval = setInterval(async () => { + if (Date.now() > this.last_heartbeat + HEARTBEAT_INTERVAL) { + await this.initScales(); + this.logger.info('Sent heartbeat reviving request.'); + } + }, HEARTBEAT_INTERVAL * 2); + } + + private stopHeartbeatMonitor() { + if (this.heartbeat_monitor_interval) { + clearInterval(this.heartbeat_monitor_interval); + this.heartbeat_monitor_interval = null; } } @@ -415,9 +436,13 @@ export class AcaiaScale { return this.connected; } - private async notificationsReady() { + private async initScales() { await this.ident(); this.last_heartbeat = Date.now(); + } + + private async notificationsReady() { + await this.initScales(); this.logger.info('Scale Ready!'); } @@ -430,9 +455,7 @@ export class AcaiaScale { this.weight_uuid, this.tx_char_uuid, data, - () => { - resolve(true); - }, + resolve, (err) => { this.logger.error( 'failed to write to characteristic, but we are ignoring it', @@ -458,7 +481,7 @@ export class AcaiaScale { ]); } - private async heartbeat() { + private heartbeat() { if (!this.connected) { return false; } @@ -469,16 +492,20 @@ export class AcaiaScale { } while (this.command_queue.length) { const packet = this.command_queue.shift(); - await this.write(packet, true).catch(this.logger.error.bind(this.logger)); + this.write(packet, true).catch(this.logger.error.bind(this.logger)); } - if (Date.now() >= this.last_heartbeat + 1000) { + if (Date.now() >= this.last_heartbeat + HEARTBEAT_INTERVAL) { this.logger.debug('Sending heartbeat...'); this.last_heartbeat = Date.now(); if (this.isPyxisStyle) { - await this.write(encodeId(this.isPyxisStyle)); + this.write(encodeId(this.isPyxisStyle)).catch( + this.logger.error.bind(this.logger) + ); } - await this.write(encodeHeartbeat(), false); + this.write(encodeHeartbeat(), false).catch( + this.logger.error.bind(this.logger) + ); this.logger.debug('Heartbeat success'); } return true; From fd30a1080c2fdf1fc206ec20e4630bd8713c2dd6 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Tue, 28 Jun 2022 20:19:44 +0200 Subject: [PATCH 39/78] fix heartbeat --- src/classes/devices/acaia/acaia.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/classes/devices/acaia/acaia.ts b/src/classes/devices/acaia/acaia.ts index d3457bc50..76cafcf11 100644 --- a/src/classes/devices/acaia/acaia.ts +++ b/src/classes/devices/acaia/acaia.ts @@ -262,6 +262,7 @@ export class AcaiaScale { public async disconnect() { this.logger.debug('Scale disconnected'); + this.stopHeartbeatMonitor(); if (this.connected) { if (this.device_id && this.weight_uuid && this.tx_char_uuid) { this.logger.debug('Disconnect the device with its characteristics'); From dbc21cb7742abde178f6b74a386ec12dc3102636 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Tue, 12 Jul 2022 08:35:16 +0200 Subject: [PATCH 40/78] Saftey checkin --- config.xml | 2 + package-lock.json | 25 +++ package.json | 2 + src/app/app.component.ts | 1 - .../beans/beans-add/beans-add.component.ts | 9 +- src/app/settings/settings.page.html | 12 +- src/app/settings/settings.page.ts | 24 ++- src/assets/i18n/de.json | 103 ++++++------ src/assets/i18n/en.json | 5 +- src/classes/bean/bean.ts | 2 + src/classes/devices/acaia/acaia.ts | 22 ++- src/classes/devices/acaia/decoder.ts | 14 +- src/classes/settings/settings.ts | 4 + .../bean-general-information.component.html | 2 +- .../brew-brewing/brew-brewing.component.ts | 10 +- src/interfaces/bean/iBean.ts | 1 + src/interfaces/settings/iSettings.ts | 2 + src/mapper/bean/beanMapper.ts | 61 +++++++ .../intentHandler/intent-handler.service.ts | 37 ++++- .../shareService/share-service.service.ts | 9 +- src/services/uiBeanHelper.ts | 149 +++++++++++------- src/services/uiHelper.ts | 11 ++ 22 files changed, 379 insertions(+), 128 deletions(-) diff --git a/config.xml b/config.xml index b4ed7838c..69a73b6fd 100644 --- a/config.xml +++ b/config.xml @@ -36,6 +36,7 @@ + @@ -286,6 +287,7 @@ + diff --git a/package-lock.json b/package-lock.json index 2dff07f68..6db2b07ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,8 +63,10 @@ "core-js": "^3.19.3", "currency-symbol-map": "^5.0.1", "javascript-color-gradient": "^1.3.2", + "jsurl": "^0.1.5", "lodash": "^4.17.21", "luxon": "^2.3.0", + "lz-string": "^1.4.4", "moment": "^2.29.1", "ngx-stars": "^1.4.3", "postcss": "^8.3.5", @@ -16918,6 +16920,11 @@ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, + "node_modules/jsurl": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/jsurl/-/jsurl-0.1.5.tgz", + "integrity": "sha512-HyrafsIRCa+VlJAsvuvxWUM0iMeZd6+2J4JngECGF0JTRi5moUFV/mLxgyYfDizGF4ofLLYRpvD/Kt1d9wlUUg==" + }, "node_modules/jszip": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", @@ -17602,6 +17609,14 @@ "node": ">=12" } }, + "node_modules/lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==", + "bin": { + "lz-string": "bin/bin.js" + } + }, "node_modules/macos-release": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", @@ -39844,6 +39859,11 @@ } } }, + "jsurl": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/jsurl/-/jsurl-0.1.5.tgz", + "integrity": "sha512-HyrafsIRCa+VlJAsvuvxWUM0iMeZd6+2J4JngECGF0JTRi5moUFV/mLxgyYfDizGF4ofLLYRpvD/Kt1d9wlUUg==" + }, "jszip": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", @@ -40384,6 +40404,11 @@ "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.3.0.tgz", "integrity": "sha512-gv6jZCV+gGIrVKhO90yrsn8qXPKD8HYZJtrUDSfEbow8Tkw84T9OnCyJhWvnJIaIF/tBuiAjZuQHUt1LddX2mg==" }, + "lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==" + }, "macos-release": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", diff --git a/package.json b/package.json index 5c4d04ef7..7b13275a9 100644 --- a/package.json +++ b/package.json @@ -70,8 +70,10 @@ "core-js": "^3.19.3", "currency-symbol-map": "^5.0.1", "javascript-color-gradient": "^1.3.2", + "jsurl": "^0.1.5", "lodash": "^4.17.21", "luxon": "^2.3.0", + "lz-string": "^1.4.4", "moment": "^2.29.1", "ngx-stars": "^1.4.3", "postcss": "^8.3.5", diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 556061990..a9312c1cf 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -174,7 +174,6 @@ export class AppComponent implements AfterViewInit { try { - // #285 - Add more device loggings this.uiLog.log(`Device-Model: ${this.device.model}`); this.uiLog.log(`Manufacturer: ${this.device.manufacturer}`); diff --git a/src/app/beans/beans-add/beans-add.component.ts b/src/app/beans/beans-add/beans-add.component.ts index 85df73d12..5c48a672b 100644 --- a/src/app/beans/beans-add/beans-add.component.ts +++ b/src/app/beans/beans-add/beans-add.component.ts @@ -26,6 +26,8 @@ export class BeansAddComponent implements OnInit { public data: Bean = new Bean(); @Input() private readonly bean_template: Bean; @Input() private readonly server_bean: ServerBean; + @Input() private readonly user_shared_bean: Bean; + @Input() private hide_toast_message: boolean; @@ -59,12 +61,12 @@ export class BeansAddComponent implements OnInit { // Download images after loading the bean, else they would be copied :O if (this.server_bean && this.platform.is('cordova')) { if (this.server_bean.attachment.length > 0) { - await this.uiAlert.showLoadingSpinner(); - this.uiAlert.setLoadingSpinnerMessage('QR.IMAGES_GETTING_DOWNLOADED'); + // await this.uiAlert.showLoadingSpinner(); + // this.uiAlert.setLoadingSpinnerMessage('QR.IMAGES_GETTING_DOWNLOADED'); // We don't support attachments yet. // const newMapper = new BeanMapper(); // await newMapper.downloadAndAttachAttachments(this.data, this.server_bean.attachment); - await this.uiAlert.hideLoadingSpinner(); + // await this.uiAlert.hideLoadingSpinner(); } } @@ -157,7 +159,6 @@ export class BeansAddComponent implements OnInit { } this.data.attachments = copyAttachments; -/// TODO SOLVE this.data.qr_code = _bean.qr_code; diff --git a/src/app/settings/settings.page.html b/src/app/settings/settings.page.html index 51900eabb..be662cd80 100644 --- a/src/app/settings/settings.page.html +++ b/src/app/settings/settings.page.html @@ -361,7 +361,17 @@

{{"IGNORE_ANOMALY_VALUES" | translate}}

{{"DISCONNECT" | translate}}

- + +

{{"PRESSURE_THRESHOLD_ACTIVE" | translate}}

+ +
+ +

{{"PRESSURE_THRESHOLD_BAR" | translate}}

+ + {{this.uiHelper.toFixedIfNecessary(settings.pressure_threshold_bar,1)}} + +

{{"PRESSURE_LOG" | translate}}

diff --git a/src/app/settings/settings.page.ts b/src/app/settings/settings.page.ts index 0d7aacf14..7db3e4137 100644 --- a/src/app/settings/settings.page.ts +++ b/src/app/settings/settings.page.ts @@ -1,7 +1,7 @@ import {AlertController, ModalController, Platform} from '@ionic/angular'; import BeanconquerorSettingsDummy from '../../assets/BeanconquerorTestData.json'; import {Bean} from '../../classes/bean/bean'; -import {BluetoothScale} from './../../classes/devices/bluetoothDevice'; +import {BluetoothScale, SCALE_TIMER_COMMAND} from './../../classes/devices/bluetoothDevice'; import {Brew} from '../../classes/brew/brew'; import {BREW_VIEW_ENUM} from '../../enums/settings/brewView'; import {ChangeDetectorRef, Component, ElementRef, OnInit, ViewChild} from '@angular/core'; @@ -240,7 +240,7 @@ export class SettingsPage implements OnInit { this.uiAlert.setLoadingSpinnerMessage('SCALE.BLUETOOTH_SCAN_RUNNING', true); const scale = await this.bleManager.tryToFindScale(); if (scale) { - await this.uiAlert.hideLoadingSpinner(); + try { // We don't need to retry for iOS, because we just did scan before. @@ -257,8 +257,24 @@ export class SettingsPage implements OnInit { await this.saveSettings(); - const connectedScale = this.bleManager.getScale(); - await connectedScale.setLed(true, true); + let skipLoop = 0; + for (let i=0;i<5;i++) { + await new Promise((resolve) => { + setTimeout(async () => { + const connectedScale = this.bleManager.getScale(); + if(connectedScale !== null && connectedScale !== undefined) { + skipLoop = 1; + await connectedScale.setLed(true, true); + } + resolve(undefined); + }, 1000); + }); + if (skipLoop === 1) { + break; + } + + } + await this.uiAlert.hideLoadingSpinner(); } else { await this.uiAlert.hideLoadingSpinner(); diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index f92e2dd9a..e55060fb9 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -776,16 +776,16 @@ "SEARCH": "Suchen", "OVERVIEW": "Übersicht", "BEAN_HEADER_ADDITIONALE_INFORMATION": "Zusätzliche Informationen", - "THREE_DEE_TOUCH_ACTION_BREW":"Brühen", - "THREE_DEE_TOUCH_ACTION_BEAN":"Bohne", - "THREE_DEE_TOUCH_ACTION_PREPARATION":"Brühmethode", - "THREE_DEE_TOUCH_ACTION_MILL":"Mühle", + "THREE_DEE_TOUCH_ACTION_BREW": "Brühen", + "THREE_DEE_TOUCH_ACTION_BEAN": "Bohne", + "THREE_DEE_TOUCH_ACTION_PREPARATION": "Brühmethode", + "THREE_DEE_TOUCH_ACTION_MILL": "Mühle", "PAGE_CREDITS_NOT_EXISTING": "Kein Inhalt", "TIMER_HOUR": "Stunden", "TIMER_MINUTES": "Minuten", "TIMER_SECONDS": "Sekunden", "EXCEL": { - "BEAN" : { + "BEAN": { "CREATION_DATE": "Erstellungsdatum", "ID": "Bohnen ID" }, @@ -802,7 +802,7 @@ "HEALTH_KIT_QUESTION_TITLE": "Speichern in HealthKit", "HEALTH_KIT_QUESTION_MESSAGE": "Durch die Aktivierung wird die eingenommene Koffeinmenge jeder Brühung automatisch in Apple Health abgespeichert", "NAV_ROASTING_SECTION": "Rösten", - "ROASTING_SECTION" : { + "ROASTING_SECTION": { "NAV_GREEN_BEANS": "Rohkaffee", "NAV_ROASTING_MACHINE": "Röster", "ROASTING_MACHINE": { @@ -862,7 +862,7 @@ "DELETE_WATER_QUESTION": "Wasser löschen? Alle referenzierten Brühungen werden abgeändert und nicht gelöscht.", "TOAST_ROASTING_MACHINE_DELETED_SUCCESSFULLY": "Röster gelöscht", "EDIT_ROASTING_MACHINE": "Editieren", - "DETAIL_ROASTING_MACHINE":"Rösterdetails", + "DETAIL_ROASTING_MACHINE": "Rösterdetails", "ROASTING_MACHINE": { "PLACE_HOLDER": { "NAME": "Füge einen Namen hinzu", @@ -870,13 +870,13 @@ } }, "NAV_ROASTING_MACHINE": "Röster", - "PAGE_ROASTING_MACHINE_LIST_NO_MACHINES_EXISTING":"Du hast noch keine Röster hinzugefügt.", + "PAGE_ROASTING_MACHINE_LIST_NO_MACHINES_EXISTING": "Du hast noch keine Röster hinzugefügt.", "PAGE_ROASTING_MACHINE_LIST_NO_ARCHIVED_MACHINES_EXISTING": "Du hast noch keine Röster archiviert.", "CHOOSE_ROASTING_MACHINES": "Röster auswählen", "CHOOSE_ROASTING_MACHINE": "Röster auswählen", "POPOVER_BREWS_OPTION_TOGGLE_FAVOURITE": "Favorit", - "TOAST_BREW_FAVOURITE_ADDED":"Favorit hinzugefügt", - "TOAST_BREW_FAVOURITE_REMOVED":"Favorit entfernt", + "TOAST_BREW_FAVOURITE_ADDED": "Favorit hinzugefügt", + "TOAST_BREW_FAVOURITE_REMOVED": "Favorit entfernt", "BREW_FILTER_JUST_FAVOURITE": "Favoriten", "STATISTICS_PREPARATION_USAGES": "Zubereitungsmethoden Verwendungen", "STATISTICS_PREPARATION_TIMELINE_USAGES": "Verwendungshistorie Zubereitungsmethoden", @@ -902,7 +902,7 @@ "COULD_NOT_ACCESS_FILE": "Auf die ausgewählte Datei konnte nicht Zugegriffen werden", "WRONG_FILE_FORMAT": "Nicht unterstütztes Dateiformat ausgewählt", "SCAN_BEAN": "Packung einlesen", - "CLEAR":"Zurücksetzten", + "CLEAR": "Zurücksetzten", "BEAN_LOOKS_LIKE_CONSUMED": "Bohnenpackung scheint aufgebraucht zu sein, möchtest du diese nun archivieren?", "CUPPING_1": "Fruchtnoten", "CUPPING_2": "Zitrone", @@ -1044,7 +1044,7 @@ "CUPPING_138": "Jasmine", "CUPPING_139": "Orangenblüte", "CUPPING_140": "Zitronengras", - "WATER_SECTION" : { + "WATER_SECTION": { "NAV_WATER": "Wasser", "YOU_GOT_NO_ARCHIVED_WATER": "Du hast noch kein Wasser archiviert", "YOU_GOT_NO_WATER": "Du hast noch kein Wasser hinzugefügt", @@ -1054,24 +1054,24 @@ "USED_TIMES": "Verwendet", "AMOUNT": "Verwendete Menge", "WATER": { - "GENERAL_HARDNESS":"Gesamthärte", - "TOTAL_ALKALINITY":"Alkalinität", + "GENERAL_HARDNESS": "Gesamthärte", + "TOTAL_ALKALINITY": "Alkalinität", "CALCIUM": "Kalzium (Ca)", - "MAGNESIUM":"Magnesium (Mg)", + "MAGNESIUM": "Magnesium (Mg)", "SODIUM": "Natrium (Na)", "TDS": "Gelöste Stoffe (TDS [%])", "UNITS": "Einheiten", "PLACE_HOLDER": { - "GENERAL_HARDNESS":"Gesamthärte", - "TOTAL_ALKALINITY":"Alkalinität", + "GENERAL_HARDNESS": "Gesamthärte", + "TOTAL_ALKALINITY": "Alkalinität", "CALCIUM": "Kalzium (Ca)", - "MAGNESIUM":"Magnesium (Mg)", + "MAGNESIUM": "Magnesium (Mg)", "SODIUM": "Natrium (Na)", - "TDS":"Gelöste Stoffe (TDS [%])", + "TDS": "Gelöste Stoffe (TDS [%])", "NAME": "Wassernamen eingeben", "NOTES": "Füge Notizen zu deinem Wasser" }, - "WATER_UNIT": { + "WATER_UNIT": { "UNKNOWN": "Unbekannt", "PPM": "ppm als CaCO3", "MG_L": "mg/L", @@ -1086,9 +1086,9 @@ "CALCULATED_WEIGHT": "Berechnetes Gewicht", "SET_WEIGHT": "Gewicht setzten", "ADD_FLAVORS_AROMAS_TITLE": "Aromen / Geschmäcker", - "CUSTOM_FLAVORS_AROMAS":"Individuelle Aromen", - "CUSTOM_FLAVORS_AROMAS_PLACEHOLDER":"Füge deine individuellen Aromen hinzu", - "PREDEFINED_FLAVORS_AROMAS":"Typische Aromen", + "CUSTOM_FLAVORS_AROMAS": "Individuelle Aromen", + "CUSTOM_FLAVORS_AROMAS_PLACEHOLDER": "Füge deine individuellen Aromen hinzu", + "PREDEFINED_FLAVORS_AROMAS": "Typische Aromen", "ADD_AROMA_FLAVOR": "Aromen hinzufügen", "BEAN_WEIGHT_IN_PLACEHOLDER": "Aus der Packung entnommene Bohnenmenge", "VESSEL_PLACEHOLDER": "Leergewicht sowie Name der Karaffe", @@ -1109,11 +1109,11 @@ "DISCONNECTED_UNPLANNED": "Waage ungeplant getrennt", "REQUEST_PERMISSION": { "LOCATION": "Um Bluetooth-Waagen zu finden, muss der Standort freigegeben werden", - "BLUETOOTH": "Um Bluetooth-Waagen zu finden, muss Bluetooth freigegeben werden" + "BLUETOOTH": "Um Bluetooth-Waagen zu finden, muss Bluetooth freigegeben werden" }, "INFORMATION_DESCRIPTION": "Unterstütze Waagen sind: Decent Scale sowie Acaia Scales, Felicita Scales und Hiroia Jimmy" }, - "QR":{ + "QR": { "WRONG_QRCODE_DESCRIPTION": "Falscher QR-Code oder falscher Inhalt", "WRONG_QRCODE_TITLE": "Fehler", "WRONG_LINK_DESCRIPTION": "Falsche App-Verlinkung", @@ -1129,33 +1129,33 @@ "SMART_SCALE_STAY_CONNECTED_ON_APP_MINIMIZE": "Waage verbunden lassen bei App minimierung/inaktivität", "BREW_FLOW_WEIGHT": "Gewicht", "BREW_FLOW_WEIGHT_PER_SECOND": "Fluss (Berechnet)", - "ROAST_TYPE_UNKNOWN":"Unbekannt", - "ROAST_TYPE_CINNAMON_ROAST":"Cinnamon Roast", - "ROAST_TYPE_AMERICAN_ROAST":"American Roast", - "ROAST_TYPE_NEW_ENGLAND_ROAST":"New England Roast", - "ROAST_TYPE_HALF_CITY_ROAST":"Half City Roast", - "ROAST_TYPE_MODERATE_LIGHT_ROAST":"Moderate-Light Roast", - "ROAST_TYPE_CITY_ROAST":"City roast", - "ROAST_TYPE_CITY_PLUS_ROAST":"City+ Roast", - "ROAST_TYPE_FULL_CITY_ROAST":"Full City Roast", - "ROAST_TYPE_FULL_CITY_PLUS_ROAST":"Full City + Roast", - "ROAST_TYPE_ITALIAN_ROAST":"Italian Roast", - "ROAST_TYPE_VIEANNA_ROAST":"Vienna Roast", - "ROAST_TYPE_FRENCH_ROAST":"French Roast", - "ROAST_TYPE_CUSTOM_ROAST":"Individuell", - "BEAN_MIX_UNKNOWN":"Unbekannt", - "BEAN_MIX_SINGLE_ORIGIN":"Single Origin", - "BEAN_MIX_BLEND":"Blend", - "BEAN_ROASTING_TYPE_FILTER":"Filter", - "BEAN_ROASTING_TYPE_ESPRESSO":"Espresso", - "BEAN_ROASTING_TYPE_OMNI":"Omni", - "BEAN_ROASTING_TYPE_UNKNOWN":"Unbekannt", + "ROAST_TYPE_UNKNOWN": "Unbekannt", + "ROAST_TYPE_CINNAMON_ROAST": "Cinnamon Roast", + "ROAST_TYPE_AMERICAN_ROAST": "American Roast", + "ROAST_TYPE_NEW_ENGLAND_ROAST": "New England Roast", + "ROAST_TYPE_HALF_CITY_ROAST": "Half City Roast", + "ROAST_TYPE_MODERATE_LIGHT_ROAST": "Moderate-Light Roast", + "ROAST_TYPE_CITY_ROAST": "City roast", + "ROAST_TYPE_CITY_PLUS_ROAST": "City+ Roast", + "ROAST_TYPE_FULL_CITY_ROAST": "Full City Roast", + "ROAST_TYPE_FULL_CITY_PLUS_ROAST": "Full City + Roast", + "ROAST_TYPE_ITALIAN_ROAST": "Italian Roast", + "ROAST_TYPE_VIEANNA_ROAST": "Vienna Roast", + "ROAST_TYPE_FRENCH_ROAST": "French Roast", + "ROAST_TYPE_CUSTOM_ROAST": "Individuell", + "BEAN_MIX_UNKNOWN": "Unbekannt", + "BEAN_MIX_SINGLE_ORIGIN": "Single Origin", + "BEAN_MIX_BLEND": "Blend", + "BEAN_ROASTING_TYPE_FILTER": "Filter", + "BEAN_ROASTING_TYPE_ESPRESSO": "Espresso", + "BEAN_ROASTING_TYPE_OMNI": "Omni", + "BEAN_ROASTING_TYPE_UNKNOWN": "Unbekannt", "SMART_SCALE_LOG": "Logfiles für Waage aktivieren", "TOAST_PREPARATION_TOOL_EDITED_SUCCESSFULLY": "Zubereitungstool editiert", "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE": "Waage", "PAGE_SETTINGS_TAB_GENERAL": "Allgemein", "SMART_SCALE_TARE_ON_BREW": "Gewicht bei neuer Brühung zurücksetzen", - "SMART_SCALE_TARE_ON_START_TIMER": "Gewicht bei starten der Brühzeit zurücksetzen", + "SMART_SCALE_TARE_ON_START_TIMER": "Gewicht bei starten der Brühzeit zurücksetzen", "PAGE_SETTINGS_BREW_RATING_STEPS": "Bewertungsschritte", "BREW_AVG_FLOW_WEIGHT_PER_SECOND": "Ø Fluss", "CUSTOM_LIST_VIEW_PARAMETERS": "Ansichtsparameter", @@ -1165,8 +1165,8 @@ "IGNORE_NEGATIVE_VALUES": "Ignoriere negative Gewichtswerte", "IGNORE_ANOMALY_VALUES": "Ignoriere Anomaliewerte", "IGNORE_ANOMALY_VALUES_TOOLTIP": "Beispiel: Schwenken einer Tasse auf der Waage", - "TOAST_BEAN_FAVOURITE_ADDED":"Favorit hinzugefügt", - "TOAST_BEAN_FAVOURITE_REMOVED":"Favorit entfernt", + "TOAST_BEAN_FAVOURITE_ADDED": "Favorit hinzugefügt", + "TOAST_BEAN_FAVOURITE_REMOVED": "Favorit entfernt", "QR_CODE_SCANNER_INFORMATION_TITLE": "QR Code", "QR_CODE_SCANNER_INFORMATION_DESCRIPTION": "Alle Informationen der eingescannten Bohnensorten stammen direkt von der jeweiligen Rösterei.
Falls Sie Fehlerhafte oder falsche Informationen finden melden Sie diese bitte über e-mail an: info@beanconqueror.com.", "DONT_SHOW_AGAIN": "Nicht erneut zeigen", @@ -1193,5 +1193,8 @@ "BREW_PRESSURE_FLOW": "Druck", "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_FILTER": "Anzeige der Graphen für Filterbrühungen", "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_ESPRESSO": "Anzeige der Graphen für Espressobrühungen", - "PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE": "Druck Geräte" + "PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE": "Druck Geräte", + "PRESSURE_LOG": "Logfiles für Druck aktivieren", + "PRESSURE_THRESHOLD_ACTIVE": "Zeit starten ab bestimmten Druck?", + "PRESSURE_THRESHOLD_BAR": "Schwellenwert Druck" } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 08e0a7954..da1a439a5 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -1193,5 +1193,8 @@ "BREW_PRESSURE_FLOW": "Pressure", "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_FILTER": "Show graphs for filter", "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_ESPRESSO": "Show graphs for espresso", - "PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE": "Pressure device" + "PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE": "Pressure device", + "PRESSURE_LOG": "Activate logfiles for pressure device", + "PRESSURE_THRESHOLD_ACTIVE": "Start timer with predefined pressure", + "PRESSURE_THRESHOLD_BAR": "Threshold pressure" } diff --git a/src/classes/bean/bean.ts b/src/classes/bean/bean.ts index 13cea21f7..4a612995b 100755 --- a/src/classes/bean/bean.ts +++ b/src/classes/bean/bean.ts @@ -50,6 +50,7 @@ export class Bean implements IBean { public qr_code: string; public favourite: boolean; + public shared:boolean; constructor() { this.name = ''; @@ -79,6 +80,7 @@ export class Bean implements IBean { this.rating = 0; this.qr_code = ''; this.favourite = false; + this.shared = false; } public getRoastName(): string { diff --git a/src/classes/devices/acaia/acaia.ts b/src/classes/devices/acaia/acaia.ts index 76cafcf11..276f86627 100644 --- a/src/classes/devices/acaia/acaia.ts +++ b/src/classes/devices/acaia/acaia.ts @@ -121,7 +121,6 @@ export class AcaiaScale { private tx_char_uuid: string; private weight_uuid: string; - // TODO(mike1808) Pyxis is not supported right now private isPyxisStyle: boolean; private readonly characteristics: Characteristic[]; @@ -333,9 +332,9 @@ export class AcaiaScale { to128bitUUID(char.characteristic) === to128bitUUID(SCALE_CHARACTERISTIC_UUID) ) { - this.rx_char_uuid = char.characteristic; - this.tx_char_uuid = char.characteristic; - this.weight_uuid = char.service; + this.rx_char_uuid = char.characteristic.toLowerCase(); + this.tx_char_uuid = char.characteristic.toLowerCase(); + this.weight_uuid = char.service.toLowerCase(); this.isPyxisStyle = false; foundRx = true; foundTx = true; @@ -343,17 +342,26 @@ export class AcaiaScale { to128bitUUID(char.characteristic) === to128bitUUID(PYXIS_RX_CHARACTERISTIC_UUID) ) { - this.rx_char_uuid = char.characteristic; + this.rx_char_uuid = char.characteristic.toLowerCase(); foundRx = true; } else if ( to128bitUUID(char.characteristic) === to128bitUUID(PYXIS_TX_CHARACTERISTIC_UUID) ) { - this.tx_char_uuid = char.characteristic; - this.weight_uuid = char.service; + this.tx_char_uuid = char.characteristic.toLowerCase(); + this.weight_uuid = char.service.toLowerCase(); this.isPyxisStyle = true; foundTx = true; } + this.logger.log('findBleeUIDS', { + device_id: this.device_id, + weight_uuid: this.weight_uuid, + char_uuid: this.rx_char_uuid, + isPyxis: this.isPyxisStyle, + foundRx: foundRx, + foundTx: foundTx, + + }); if (foundRx && foundTx) { return true; } diff --git a/src/classes/devices/acaia/decoder.ts b/src/classes/devices/acaia/decoder.ts index beebaaf2f..ee83d6044 100644 --- a/src/classes/devices/acaia/decoder.ts +++ b/src/classes/devices/acaia/decoder.ts @@ -204,7 +204,19 @@ export class Decoder { if (unit === 4) { value /= 10000.0; } else { - throw new Error(`unit value not in range ${unit}`); + try + { + + for (const v of weight_payload) { + console.log("0x" + v.toString(16)); + } + // console.log(weight_payload.map((v) => `0x${ ("" + v).toString(16)}`)); + console.error(`unit value not in range ${unit}`); + //throw new Error(`unit value not in range ${unit}`); + } + catch(ex){ + + } } } } diff --git a/src/classes/settings/settings.ts b/src/classes/settings/settings.ts index 879414652..bd70ebf13 100755 --- a/src/classes/settings/settings.ts +++ b/src/classes/settings/settings.ts @@ -101,6 +101,8 @@ export class Settings implements ISettings { public pressure_id: string; public pressure_type: PressureType; public pressure_log: boolean; + public pressure_threshold_active: boolean; + public pressure_threshold_bar: number; public currency: string; @@ -238,6 +240,8 @@ export class Settings implements ISettings { this.pressure_id = ''; this.pressure_type = null; this.pressure_log = false; + this.pressure_threshold_active = false; + this.pressure_threshold_bar = 0.5; this.currency = 'EUR'; diff --git a/src/components/beans/bean-general-information/bean-general-information.component.html b/src/components/beans/bean-general-information/bean-general-information.component.html index 6e6cbfc1f..0c222d177 100644 --- a/src/components/beans/bean-general-information/bean-general-information.component.html +++ b/src/components/beans/bean-general-information/bean-general-information.component.html @@ -66,7 +66,7 @@
- + {{"BEAN_DATA_CUSTOM_ROAST_NAME" | translate}} { - this.__setPressureFlow(_val); + if (this.timer.isTimerRunning()) { + this.__setPressureFlow(_val); + } else { + if (this.settings.pressure_threshold_active && _val.actual > this.settings.pressure_threshold_bar) { + this.timer.startTimer(); + } + } } ); } diff --git a/src/interfaces/bean/iBean.ts b/src/interfaces/bean/iBean.ts index 789ada792..5d2a0783b 100755 --- a/src/interfaces/bean/iBean.ts +++ b/src/interfaces/bean/iBean.ts @@ -46,4 +46,5 @@ export interface IBean { rating: number; qr_code: string; + shared: boolean; } diff --git a/src/interfaces/settings/iSettings.ts b/src/interfaces/settings/iSettings.ts index d8956f48d..3c16b79cb 100755 --- a/src/interfaces/settings/iSettings.ts +++ b/src/interfaces/settings/iSettings.ts @@ -91,6 +91,8 @@ export interface ISettings { pressure_id: string; pressure_type: PressureType; pressure_log: boolean; + pressure_threshold_active: boolean; + pressure_threshold_bar: number; currency: string; } diff --git a/src/mapper/bean/beanMapper.ts b/src/mapper/bean/beanMapper.ts index 387e16e87..31cfb115f 100644 --- a/src/mapper/bean/beanMapper.ts +++ b/src/mapper/bean/beanMapper.ts @@ -13,6 +13,67 @@ export class BeanMapper { } + public async mapSharedUserBean(_userSharedBean: any): Promise { + return new Promise(async (resolve, reject) => { + try { + const newBean: Bean = new Bean(); + + newBean.name = _userSharedBean.name; + newBean.roaster = _userSharedBean.roaster; + newBean.roast_range = _userSharedBean.roast_range; + newBean.aromatics = _userSharedBean.aromatics; + newBean.weight = _userSharedBean.weight; + newBean.qr_code = _userSharedBean.qr_code; + newBean.cost = _userSharedBean.cost; + newBean.cupping_points = _userSharedBean.cupping_points; + newBean.decaffeinated = _userSharedBean.decaffeinated; + newBean.ean_article_number = _userSharedBean.ean_article_number; + newBean.note = _userSharedBean.note; + if ( _userSharedBean.roastingDate !== null && _userSharedBean.roastingDate !== ''){ + newBean.roastingDate = _userSharedBean.roastingDate; + } + newBean.url = _userSharedBean.url; + + newBean.beanMix = _userSharedBean.beanMix; + newBean.roast = _userSharedBean.roast; + + if (newBean.roast === 'CUSTOM_ROAST' as ROASTS_ENUM.CUSTOM_ROAST) { + newBean.roast_custom = _userSharedBean.roast_custom; + } + + + newBean.bean_roasting_type = _userSharedBean.bean_roasting_type; + + for (const information of _userSharedBean.bean_information) { + const iInformation = {} as IBeanInformation; + iInformation.certification = information.certification; + iInformation.country = information.country; + iInformation.elevation = information.elevation; + iInformation.farm = information.farm; + iInformation.farmer = information.farmer; + iInformation.harvest_time = information.harvest_time; + iInformation.percentage = information.percentage; + iInformation.processing = information.processing; + iInformation.region = information.region; + iInformation.variety = information.variety; + iInformation.purchasing_price = information.purchasing_price; + iInformation.fob_price = information.fob_price; + newBean.bean_information.push(iInformation); + } + + newBean.shared = true; + resolve(newBean); + + } + catch(ex) { + resolve(null); + } + + }); + } + + + public async mapServerToClientBean(_serverResponse: ServerBean): Promise { return new Promise(async (resolve, reject) => { try { diff --git a/src/services/intentHandler/intent-handler.service.ts b/src/services/intentHandler/intent-handler.service.ts index 87def3e43..af89c310f 100644 --- a/src/services/intentHandler/intent-handler.service.ts +++ b/src/services/intentHandler/intent-handler.service.ts @@ -18,7 +18,8 @@ declare var IonicDeeplink; export class IntentHandlerService { public static SUPPORTED_INTENTS = { - ADD_BEAN_ONLINE: 'ADD_BEAN_ONLINE' + ADD_BEAN_ONLINE: 'ADD_BEAN_ONLINE', + ADD_USER_BEAN: 'ADD_USER_BEAN' }; constructor(private readonly uiHelper: UIHelper, private readonly deeplinks: Deeplinks, @@ -34,9 +35,12 @@ export class IntentHandlerService { '/NO_LINK_EVER_WILL_WORK_HERE/': '/NO_LINK_EVER_WILL_WORK_HERE/' }, (match) => { this.uiLog.log('Deeplink matched ' + JSON.stringify(match.$link)); + this.uiLog.log('Deeplink matched ' + JSON.stringify(match)); this.handleDeepLink(match.$link); }, (nomatch) => { this.uiLog.log('Deeplink not matched ' + JSON.stringify(nomatch.$link)); + this.uiLog.log('Deeplink not matched ' + JSON.stringify(nomatch)); + this.handleDeepLink(nomatch.$link); }); @@ -87,7 +91,22 @@ export class IntentHandlerService { } else if (url.indexOf('beanconqueror://ADD_BEAN_ONLINE?') === 0) { const qrCodeId: string = String(this.findGetParameter(_matchLink.queryString,'id')); await this.addBeanFromServer(qrCodeId); - } else { + } + else if (url.indexOf('https://beanconqueror.com/?shareUserBean=') === 0 || url.indexOf('https://beanconqueror.com?shareUserBean=') === 0) { + const userBeanJSON: string = String(this.findGetParameter(_matchLink.queryString,'shareUserBean')); + if (userBeanJSON) { + await this.addBeanFromUser(userBeanJSON); + } + + } + else if (url.indexOf('beanconqueror://ADD_USER_BEAN?') === 0) { + const userBeanJSON: string = String(this.findGetParameter(_matchLink.queryString,'json')); + if (userBeanJSON) { + await this.addBeanFromUser(userBeanJSON); + } + } + + else { this.uiAlert.showMessage('QR.WRONG_LINK_DESCRIPTION','QR.WRONG_LINK_TITLE',undefined,true); } }); @@ -115,5 +134,19 @@ export class IntentHandlerService { } + private async addBeanFromUser(_userBeanJSON: string) { + this.uiLog.log('Load bean information from shared user context: ' + _userBeanJSON); + + try { + await this.uiAlert.showLoadingSpinner(); + + await this.uiBeanHelper.addUserSharedBean(_userBeanJSON); + } catch (ex) { + this.uiAnalytics.trackEvent(QR_TRACKING.TITLE, QR_TRACKING.ACTIONS.SCAN_FAILED); + await this.uiAlert.hideLoadingSpinner(); + this.uiAlert.showMessage('QR.SERVER.ERROR_OCCURED','ERROR_OCCURED',undefined,true); + } + } + } diff --git a/src/services/shareService/share-service.service.ts b/src/services/shareService/share-service.service.ts index ac7af36b5..49a7d3541 100644 --- a/src/services/shareService/share-service.service.ts +++ b/src/services/shareService/share-service.service.ts @@ -7,7 +7,8 @@ import {Brew} from '../../classes/brew/brew'; import {UIAnalytics} from '../uiAnalytics'; import BREW_TRACKING from '../../data/tracking/brewTracking'; import BEAN_TRACKING from '../../data/tracking/beanTracking'; - +import JSURL from 'jsurl'; +import LZString from 'lz-string'; @Injectable({ providedIn: 'root' }) @@ -84,7 +85,11 @@ export class ShareService { public async shareBean(_bean: Bean) { try { - const beanMessage: string = this.generateBeanMessage(_bean); + + const stringifyBean = JSURL.stringify(_bean); + const compressedBean = LZString.compressToEncodedURIComponent(stringifyBean); + + const beanMessage: string = 'https://beanconqueror.com?shareUserBean=' + compressedBean; this.uiAnalytics.trackEvent(BEAN_TRACKING.TITLE, BEAN_TRACKING.ACTIONS.SHARE); await this.socialShare.share(beanMessage,null,null,null); } diff --git a/src/services/uiBeanHelper.ts b/src/services/uiBeanHelper.ts index 4f4fabd4c..586552296 100644 --- a/src/services/uiBeanHelper.ts +++ b/src/services/uiBeanHelper.ts @@ -21,7 +21,8 @@ import QR_TRACKING from '../data/tracking/qrTracking'; import {QrCodeScannerPopoverComponent} from '../popover/qr-code-scanner-popover/qr-code-scanner-popover.component'; import {UISettingsStorage} from './uiSettingsStorage'; - +import JSURL from 'jsurl'; +import LZString from 'lz-string'; /** @@ -36,22 +37,13 @@ export class UIBeanHelper { private allStoredBrews: Array = []; private allStoredBeans: Array = []; - public static getInstance(): UIBeanHelper { - if (UIBeanHelper.instance) { - return UIBeanHelper.instance; - } - // noinspection TsLint - - return undefined; - } - - constructor(private readonly uiBrewStorage: UIBrewStorage, - private readonly uiBeanStorage: UIBeanStorage, - private readonly uiAnalytics: UIAnalytics, - private readonly modalController: ModalController, - private readonly uiAlert: UIAlert, - private readonly uiToast: UIToast, - private readonly uiSettingsStorage: UISettingsStorage) { + constructor (private readonly uiBrewStorage: UIBrewStorage, + private readonly uiBeanStorage: UIBeanStorage, + private readonly uiAnalytics: UIAnalytics, + private readonly modalController: ModalController, + private readonly uiAlert: UIAlert, + private readonly uiToast: UIToast, + private readonly uiSettingsStorage: UISettingsStorage) { this.uiBrewStorage.attachOnEvent().subscribe((_val) => { // If an brew is deleted, we need to reset our array for the next call. this.allStoredBrews = []; @@ -68,7 +60,16 @@ export class UIBeanHelper { } } - public getAllBrewsForThisBean(_uuid: string): Array { + public static getInstance (): UIBeanHelper { + if (UIBeanHelper.instance) { + return UIBeanHelper.instance; + } + // noinspection TsLint + + return undefined; + } + + public getAllBrewsForThisBean (_uuid: string): Array { if (this.allStoredBrews.length <= 0) { // Load just if needed, performance reasons @@ -87,7 +88,7 @@ export class UIBeanHelper { } - public getAllRoastedBeansForThisGreenBean(_uuid: string): Array { + public getAllRoastedBeansForThisGreenBean (_uuid: string): Array { if (this.allStoredBeans.length <= 0) { // Load just if needed, performance reasons @@ -98,7 +99,8 @@ export class UIBeanHelper { return roastedBeans; } - public getAllRoastedBeansForRoastingMachine(_uuid: string) { + + public getAllRoastedBeansForRoastingMachine (_uuid: string) { if (this.allStoredBeans.length <= 0) { // Load just if needed, performance reasons this.allStoredBeans = this.uiBeanStorage.getAllEntries(); @@ -123,10 +125,9 @@ export class UIBeanHelper { } } - public async addScannedQRBean(_scannedQRBean: ServerBean) { + public async addScannedQRBean (_scannedQRBean: ServerBean) { - if (_scannedQRBean.error === null) - { + if (_scannedQRBean.error === null) { this.uiAnalytics.trackEvent(QR_TRACKING.TITLE, QR_TRACKING.ACTIONS.SCAN_SUCCESSFULLY); this.uiToast.showInfoToast('QR.BEAN_SUCCESSFULLY_SCANNED'); await this.uiAlert.showLoadingSpinner(); @@ -141,31 +142,36 @@ export class UIBeanHelper { if (bean !== null) { const modal = await this.modalController.create({ - component:BeansAddComponent, - id:BeansAddComponent.COMPONENT_ID, + component: BeansAddComponent, + id: BeansAddComponent.COMPONENT_ID, componentProps: {bean_template: bean, server_bean: _scannedQRBean} }); await modal.present(); await modal.onWillDismiss(); } else { - this.uiAlert.showMessage('QR.SERVER.ERROR_OCCURED','ERROR_OCCURED',undefined,true); + this.uiAlert.showMessage('QR.SERVER.ERROR_OCCURED', 'ERROR_OCCURED', undefined, true); } - } else { + } else { this.uiAnalytics.trackEvent(QR_TRACKING.TITLE, QR_TRACKING.ACTIONS.SCAN); await this.uiAlert.hideLoadingSpinner(); - this.uiAlert.showMessage('QR.SERVER.ERROR_OCCURED','ERROR_OCCURED',undefined,true); + this.uiAlert.showMessage('QR.SERVER.ERROR_OCCURED', 'ERROR_OCCURED', undefined, true); } } - public async addBean(_hideToastMessage: boolean = false) { - const modal = await this.modalController.create({component:BeansAddComponent,id: BeansAddComponent.COMPONENT_ID, componentProps: {hide_toast_message: _hideToastMessage}}); + public async addBean (_hideToastMessage: boolean = false) { + const modal = await this.modalController.create({ + component: BeansAddComponent, + id: BeansAddComponent.COMPONENT_ID, + componentProps: {hide_toast_message: _hideToastMessage} + }); await modal.present(); await modal.onWillDismiss(); } - public async repeatBean(_bean: Bean) { + + public async repeatBean (_bean: Bean) { const modal = await this.modalController.create({ component: BeansAddComponent, id: BeansAddComponent.COMPONENT_ID, @@ -175,44 +181,81 @@ export class UIBeanHelper { await modal.onWillDismiss(); } + public async addUserSharedBean (_compressedJson: string) { + try { + const decompressedString = LZString.decompressFromEncodedURIComponent(_compressedJson); + const objectedBean = JSURL.parse(decompressedString); + const newMapper = new BeanMapper(); + const bean: Bean = await newMapper.mapSharedUserBean(objectedBean); + console.log(objectedBean); + if (bean !== null) { + + const modal = await this.modalController.create({ + component: BeansAddComponent, + id: BeansAddComponent.COMPONENT_ID, + componentProps: {bean_template: bean, user_shared_bean: bean} + }); + await modal.present(); + await modal.onWillDismiss(); + } else { + this.uiAlert.showMessage('QR.SERVER.ERROR_OCCURED', 'ERROR_OCCURED', undefined, true); + } + + + console.log(bean); + } catch (ex) { + } + + } - public async addRoastedBean(_greenBean: GreenBean) { - const modal = await this.modalController.create({component:BeansAddComponent, - id:BeansAddComponent.COMPONENT_ID, componentProps: {greenBean : _greenBean}}); + public async addRoastedBean (_greenBean: GreenBean) { + const modal = await this.modalController.create({ + component: BeansAddComponent, + id: BeansAddComponent.COMPONENT_ID, componentProps: {greenBean: _greenBean} + }); await modal.present(); await modal.onWillDismiss(); } - public async editBean(_bean: Bean) { - const modal = await this.modalController.create({component:BeansEditComponent, id: BeansEditComponent.COMPONENT_ID, componentProps: {bean : _bean}}); + public async editBean (_bean: Bean) { + + const modal = await this.modalController.create({ + component: BeansEditComponent, + id: BeansEditComponent.COMPONENT_ID, + componentProps: {bean: _bean} + }); await modal.present(); await modal.onWillDismiss(); } - public async detailBean(_bean: Bean) { - const modal = await this.modalController.create({component: BeansDetailComponent, id: BeansDetailComponent.COMPONENT_ID, componentProps: {bean: _bean}}); + public async detailBean (_bean: Bean) { + const modal = await this.modalController.create({ + component: BeansDetailComponent, + id: BeansDetailComponent.COMPONENT_ID, + componentProps: {bean: _bean} + }); await modal.present(); await modal.onWillDismiss(); } - public async archiveBeanWithRatingQuestion(_bean: Bean) { + public async archiveBeanWithRatingQuestion (_bean: Bean) { - this.uiAnalytics.trackEvent(BEAN_TRACKING.TITLE, BEAN_TRACKING.ACTIONS.ARCHIVE); + this.uiAnalytics.trackEvent(BEAN_TRACKING.TITLE, BEAN_TRACKING.ACTIONS.ARCHIVE); - const modal = await this.modalController.create({ - component: BeanArchivePopoverComponent, - cssClass: 'popover-actions', - id: BeanArchivePopoverComponent.COMPONENT_ID, - backdropDismiss: false, - breakpoints: [0, 0.5, 0.75, 1], - initialBreakpoint: 0.5, - componentProps: { - bean: _bean - } - }); - await modal.present(); - await modal.onWillDismiss(); + const modal = await this.modalController.create({ + component: BeanArchivePopoverComponent, + cssClass: 'popover-actions', + id: BeanArchivePopoverComponent.COMPONENT_ID, + backdropDismiss: false, + breakpoints: [0, 0.5, 0.75, 1], + initialBreakpoint: 0.5, + componentProps: { + bean: _bean + } + }); + await modal.present(); + await modal.onWillDismiss(); } } diff --git a/src/services/uiHelper.ts b/src/services/uiHelper.ts index 24b921df6..1a1fc141d 100755 --- a/src/services/uiHelper.ts +++ b/src/services/uiHelper.ts @@ -50,6 +50,17 @@ export class UIHelper { }); } + public static jsonToArray = function(json) + { + const str = JSON.stringify(json, null, 0); + const ret = new Uint8Array(str.length); + for (let i = 0; i < str.length; i++) { + ret[i] = str.charCodeAt(i); + } + return ret + }; + + public static getUnixTimestamp(): number { return moment() .unix(); From 4da6c1a6a5594174a9b1f3c65927a46c7cc426e8 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Wed, 13 Jul 2022 08:43:55 +0200 Subject: [PATCH 41/78] Saftey checkin --- src/app/app.component.ts | 2 ++ .../intentHandler/intent-handler.service.ts | 26 +++++++++++++------ .../shareService/share-service.service.ts | 18 ++++++++++++- src/services/uiBeanHelper.ts | 6 ++--- 4 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index a9312c1cf..be4519e6e 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -233,8 +233,10 @@ export class AppComponent implements AfterViewInit { if (this.platform.is('cordova')) { // Just support deeplinks on devices. this.intentHandlerService.attachOnHandleOpenUrl(); + } + // Before we update and show messages, we need atleast to set one default language. this._translate.setDefaultLang('en'); await this._translate.use('en').toPromise(); diff --git a/src/services/intentHandler/intent-handler.service.ts b/src/services/intentHandler/intent-handler.service.ts index af89c310f..d05b63202 100644 --- a/src/services/intentHandler/intent-handler.service.ts +++ b/src/services/intentHandler/intent-handler.service.ts @@ -34,14 +34,10 @@ export class IntentHandlerService { IonicDeeplink.route({ '/NO_LINK_EVER_WILL_WORK_HERE/': '/NO_LINK_EVER_WILL_WORK_HERE/' }, (match) => { - this.uiLog.log('Deeplink matched ' + JSON.stringify(match.$link)); this.uiLog.log('Deeplink matched ' + JSON.stringify(match)); this.handleDeepLink(match.$link); }, (nomatch) => { - this.uiLog.log('Deeplink not matched ' + JSON.stringify(nomatch.$link)); this.uiLog.log('Deeplink not matched ' + JSON.stringify(nomatch)); - - this.handleDeepLink(nomatch.$link); }); } @@ -78,7 +74,7 @@ export class IntentHandlerService { }); } - private async handleDeepLink(_matchLink) { + public async handleDeepLink(_matchLink) { try { if (_matchLink && _matchLink.url) { await this.uiHelper.isBeanconqurorAppReady().then(async () => { @@ -92,15 +88,29 @@ export class IntentHandlerService { const qrCodeId: string = String(this.findGetParameter(_matchLink.queryString,'id')); await this.addBeanFromServer(qrCodeId); } - else if (url.indexOf('https://beanconqueror.com/?shareUserBean=') === 0 || url.indexOf('https://beanconqueror.com?shareUserBean=') === 0) { - const userBeanJSON: string = String(this.findGetParameter(_matchLink.queryString,'shareUserBean')); + else if (url.indexOf('https://beanconqueror.com/?shareUserBean0=') === 0 || url.indexOf('https://beanconqueror.com?shareUserBean0=') === 0) { + let userBeanJSON: string = ''; + + const regex = /((shareUserBean)[0-9]+\=)/gi; + const foundJSONParams = url.match(regex); + for (const param of foundJSONParams) { + userBeanJSON += String(this.findGetParameter(_matchLink.queryString,param)); + } + console.log(userBeanJSON); if (userBeanJSON) { await this.addBeanFromUser(userBeanJSON); } } else if (url.indexOf('beanconqueror://ADD_USER_BEAN?') === 0) { - const userBeanJSON: string = String(this.findGetParameter(_matchLink.queryString,'json')); + let userBeanJSON: string = ''; + + const regex = /((shareUserBean)[0-9]+(?=\=))/gi; + const foundJSONParams = url.match(regex); + for (const param of foundJSONParams) { + userBeanJSON += String(this.findGetParameter(_matchLink.queryString,param)); + } + console.log(userBeanJSON); if (userBeanJSON) { await this.addBeanFromUser(userBeanJSON); } diff --git a/src/services/shareService/share-service.service.ts b/src/services/shareService/share-service.service.ts index 49a7d3541..736f5e920 100644 --- a/src/services/shareService/share-service.service.ts +++ b/src/services/shareService/share-service.service.ts @@ -89,7 +89,23 @@ export class ShareService { const stringifyBean = JSURL.stringify(_bean); const compressedBean = LZString.compressToEncodedURIComponent(stringifyBean); - const beanMessage: string = 'https://beanconqueror.com?shareUserBean=' + compressedBean; + + const loops = Math.ceil(compressedBean.length / 400); + + let jsonParams = ''; + for (let i=0;i Date: Sat, 16 Jul 2022 08:44:16 +0200 Subject: [PATCH 42/78] Updated ionic package --- README.md | 2 +- package-lock.json | 61 ++++++++++++------- package.json | 2 +- .../shareService/share-service.service.ts | 6 +- src/services/uiLog.ts | 6 ++ 5 files changed, 52 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 59f09e069..d73f6d714 100755 --- a/README.md +++ b/README.md @@ -188,7 +188,7 @@ https://stackoverflow.com/questions/60357663/do-apple-app-site-association-files ### Upgrade Ionic if needed: -`npm install @ionic/angular@6.1.10` +`npm install @ionic/angular@6.1.14` -> Or the actual active version ### Installing AAB on your android (mac) diff --git a/package-lock.json b/package-lock.json index 6db2b07ba..df14d91a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,7 +37,7 @@ "@ionic-native/splash-screen": "^5.33.1", "@ionic-native/status-bar": "^5.33.1", "@ionic-native/three-dee-touch": "^5.33.1", - "@ionic/angular": "^6.1.10", + "@ionic/angular": "^6.1.14", "@ionic/cli": "^6.18.1", "@ionic/storage": "^2.3.1", "@ngx-translate/core": "^11.0.1", @@ -3958,11 +3958,11 @@ } }, "node_modules/@ionic/angular": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.1.10.tgz", - "integrity": "sha512-fjx70IDTGFIY8x5JSImF+cai8Z6gr5BfEp0SBP7sYPmCjWLLAJMC/uyqvvGgMURd9Rr059nSoNc6CjeYZsMVcQ==", + "version": "6.1.14", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.1.14.tgz", + "integrity": "sha512-npkk+/5pic2ZiAY1ev6YDy+NkelMGfjyBT3eWH4twhzX6QgQ1+C6rrJf95Lck9j7Obgb6s5GPAXojyigk/klKw==", "dependencies": { - "@ionic/core": "^6.1.10", + "@ionic/core": "^6.1.14", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" }, @@ -7586,9 +7586,9 @@ } }, "node_modules/@ionic/core": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.1.10.tgz", - "integrity": "sha512-QmQvIe+IklQhNhbq438I3eCnL6XjfTxrgO1+paOdGNKk3R3o4mqJmV0YYT5r9iwnieHgDxKbo3ovs9UnTXhI7g==", + "version": "6.1.14", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.1.14.tgz", + "integrity": "sha512-tmhumOD7VM7QV3boh8rwMNYOgqBskOtGJPSEaySEmCUy+Y0nXwb0gBqxZ/M6c0JcGwT17gIB2KiQDvZ4O/J8iA==", "dependencies": { "@stencil/core": "^2.16.0", "ionicons": "^6.0.2", @@ -8400,9 +8400,9 @@ "dev": true }, "node_modules/@stencil/core": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.16.1.tgz", - "integrity": "sha512-s/UJp9qxExL3DyQPT70kiuWeb3AdjbUZM+5lEIXn30I2DLcLYPOPXfsoWJODieQywq+3vPiLZeIdkoqjf6jcSw==", + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.17.1.tgz", + "integrity": "sha512-ErjQsNALgZQ9SYeBHhqwL1UO+Zbptwl3kwrRJC2tGlc3G/T6UvPuaKr+PGsqI+CZGia+0+R5EELQvFu74mYeIg==", "bin": { "stencil": "bin/stencil" }, @@ -15887,6 +15887,18 @@ "@stencil/core": "~2.16.0" } }, + "node_modules/ionicons/node_modules/@stencil/core": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.16.1.tgz", + "integrity": "sha512-s/UJp9qxExL3DyQPT70kiuWeb3AdjbUZM+5lEIXn30I2DLcLYPOPXfsoWJODieQywq+3vPiLZeIdkoqjf6jcSw==", + "bin": { + "stencil": "bin/stencil" + }, + "engines": { + "node": ">=12.10.0", + "npm": ">=6.0.0" + } + }, "node_modules/ios-sim": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/ios-sim/-/ios-sim-8.0.2.tgz", @@ -30129,11 +30141,11 @@ } }, "@ionic/angular": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.1.10.tgz", - "integrity": "sha512-fjx70IDTGFIY8x5JSImF+cai8Z6gr5BfEp0SBP7sYPmCjWLLAJMC/uyqvvGgMURd9Rr059nSoNc6CjeYZsMVcQ==", + "version": "6.1.14", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.1.14.tgz", + "integrity": "sha512-npkk+/5pic2ZiAY1ev6YDy+NkelMGfjyBT3eWH4twhzX6QgQ1+C6rrJf95Lck9j7Obgb6s5GPAXojyigk/klKw==", "requires": { - "@ionic/core": "^6.1.10", + "@ionic/core": "^6.1.14", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" } @@ -32788,9 +32800,9 @@ } }, "@ionic/core": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.1.10.tgz", - "integrity": "sha512-QmQvIe+IklQhNhbq438I3eCnL6XjfTxrgO1+paOdGNKk3R3o4mqJmV0YYT5r9iwnieHgDxKbo3ovs9UnTXhI7g==", + "version": "6.1.14", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.1.14.tgz", + "integrity": "sha512-tmhumOD7VM7QV3boh8rwMNYOgqBskOtGJPSEaySEmCUy+Y0nXwb0gBqxZ/M6c0JcGwT17gIB2KiQDvZ4O/J8iA==", "requires": { "@stencil/core": "^2.16.0", "ionicons": "^6.0.2", @@ -33417,9 +33429,9 @@ } }, "@stencil/core": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.16.1.tgz", - "integrity": "sha512-s/UJp9qxExL3DyQPT70kiuWeb3AdjbUZM+5lEIXn30I2DLcLYPOPXfsoWJODieQywq+3vPiLZeIdkoqjf6jcSw==" + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.17.1.tgz", + "integrity": "sha512-ErjQsNALgZQ9SYeBHhqwL1UO+Zbptwl3kwrRJC2tGlc3G/T6UvPuaKr+PGsqI+CZGia+0+R5EELQvFu74mYeIg==" }, "@stylelint/postcss-css-in-js": { "version": "0.37.2", @@ -39081,6 +39093,13 @@ "integrity": "sha512-AyKfFaUKVoBz4eB8XkU7H1R5HFnVsgq5ijqSdbXC0lES9PDK/J6LUQz6XUJq0mVVQF5k9kczSPOLMW3mszG0mQ==", "requires": { "@stencil/core": "~2.16.0" + }, + "dependencies": { + "@stencil/core": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.16.1.tgz", + "integrity": "sha512-s/UJp9qxExL3DyQPT70kiuWeb3AdjbUZM+5lEIXn30I2DLcLYPOPXfsoWJODieQywq+3vPiLZeIdkoqjf6jcSw==" + } } }, "ios-sim": { diff --git a/package.json b/package.json index 7b13275a9..0a2063726 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "@ionic-native/splash-screen": "^5.33.1", "@ionic-native/status-bar": "^5.33.1", "@ionic-native/three-dee-touch": "^5.33.1", - "@ionic/angular": "^6.1.10", + "@ionic/angular": "^6.1.14", "@ionic/cli": "^6.18.1", "@ionic/storage": "^2.3.1", "@ngx-translate/core": "^11.0.1", diff --git a/src/services/shareService/share-service.service.ts b/src/services/shareService/share-service.service.ts index 736f5e920..46679cfe3 100644 --- a/src/services/shareService/share-service.service.ts +++ b/src/services/shareService/share-service.service.ts @@ -9,6 +9,7 @@ import BREW_TRACKING from '../../data/tracking/brewTracking'; import BEAN_TRACKING from '../../data/tracking/beanTracking'; import JSURL from 'jsurl'; import LZString from 'lz-string'; +import {UILog} from '../uiLog'; @Injectable({ providedIn: 'root' }) @@ -17,7 +18,8 @@ export class ShareService { constructor(private readonly socialShare: SocialSharing, private readonly translate: TranslateService, private readonly uiHelper: UIHelper, - private readonly uiAnalytics: UIAnalytics) { + private readonly uiAnalytics: UIAnalytics, + private readonly uiLog: UILog) { } @@ -105,7 +107,7 @@ export class ShareService { const beanMessage: string = 'https://beanconqueror.com?' + jsonParams; - console.log(beanMessage); + this.uiLog.debug(beanMessage); this.uiAnalytics.trackEvent(BEAN_TRACKING.TITLE, BEAN_TRACKING.ACTIONS.SHARE); await this.socialShare.share(beanMessage,null,null,null); } diff --git a/src/services/uiLog.ts b/src/services/uiLog.ts index 504325759..4cb1a357a 100755 --- a/src/services/uiLog.ts +++ b/src/services/uiLog.ts @@ -48,6 +48,12 @@ export class UILog { return this.logs; } + public debug(_message): void { + this.generateLogMessage(LOGS_ENUM.LOG, _message); + if (!this.disabled) { + console.log(_message); + } + } public log(_message: string): void { this.generateLogMessage(LOGS_ENUM.LOG, _message); if (!this.disabled) { From d057cc93a3db2f84abd259342fde4153089b5d3c Mon Sep 17 00:00:00 2001 From: Mikael Manukyan Date: Mon, 18 Jul 2022 11:43:17 -0700 Subject: [PATCH 43/78] Add prettier to the repo (#392) --- .husky/.gitignore | 1 + .husky/pre-commit | 4 + README.md | 56 ++- package-lock.json | 1048 +++++++++++++++++++++++++++++++++++---------- package.json | 11 +- 5 files changed, 884 insertions(+), 236 deletions(-) create mode 100644 .husky/.gitignore create mode 100755 .husky/pre-commit diff --git a/.husky/.gitignore b/.husky/.gitignore new file mode 100644 index 000000000..31354ec13 --- /dev/null +++ b/.husky/.gitignore @@ -0,0 +1 @@ +_ diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 000000000..36af21989 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx lint-staged diff --git a/README.md b/README.md index d73f6d714..3d8ec4f25 100755 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ [![license](https://img.shields.io/badge/license-GPL%203.0-brightgreen.svg)](https://www.gnu.org/licenses/gpl-3.0.en.html) [![Github All Releases](https://img.shields.io/github/downloads/graphefruit/beanconqueror/total.svg)](https://github.com/graphefruit/beanconqueror/releases) [![GitHub Release Date](https://img.shields.io/github/release-date/graphefruit/beanconqueror.svg)](https://github.com/graphefruit/beanconqueror/releases) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=graphefruit_Beanconqueror&metric=alert_status)](https://sonarcloud.io/dashboard?id=graphefruit_Beanconqueror) + # Beanconqueror A cup of coffee is not the same anymore then back in the 80's, thats why I wanted to build a tool for the coffee community. @@ -18,17 +19,19 @@ Download today, track your brews, change your recipes, to get the best tasting c | [Website](#) | [Instagram](https://www.instagram.com/beanconqueror/) | [Facebook](https://www.facebook.com/Beanconqueror/) | - ## Sneak preview + ![Beanconqueror gif](demo/Beanconqueror.gif) ## Articles + - German: [iphone-ticker](https://www.iphone-ticker.de/beanconqueror-app-geheimtipp-fuer-espresso-verrueckte-168517/) [wuv](https://www.wuv.de/tech/techtaeglich_super_mario_rast_durch_berlin) ## Threads + - German: [Kaffee-Netz](https://www.kaffee-netz.de/threads/beanconqueror-app.111249) - English: [Home-Barista](https://www.home-barista.com/knockbox/beanconqueror-app-t68236.html) -- Dutch [tweakers](https://gathering.tweakers.net/forum/list_messages/1635607/44) [koffiepraat](https://www.koffiepraat.nl/forum/viewtopic.php?t=9842 ) +- Dutch [tweakers](https://gathering.tweakers.net/forum/list_messages/1635607/44) [koffiepraat](https://www.koffiepraat.nl/forum/viewtopic.php?t=9842) - Greek: [greekespresso](https://www.greekespresso.gr/forum/viewtopic.php?f=4&t=7251&p=97854&hilit=beanconqueror#p97854) - Turkish: [kahvekulubu](https://www.kahvekulubu.net/sosyal/threads/kahve-loglama-kayit-oneri-yontem-metodoloji.3483/) @@ -37,12 +40,13 @@ Download today, track your brews, change your recipes, to get the best tasting c On January 2021, the app got a bit hyped, through german featuring articles, the top rankings because of this you find below. ### Android + Top charts: Eat & Drink - Rank 5 Eat & Drink Ranking - Rank 70 ### iOS -Eat & Drink Raking - Rank 36 +Eat & Drink Raking - Rank 36 ## Features @@ -54,7 +58,7 @@ Different features are supported by this app, a brief overview you'll find here. - grind amount - brew time - first coffee drip - - images + - images - etc. - Manage your own workflow, first grind amount, then grind size? No problem - Archive old beans / grinders / preparation methods @@ -64,7 +68,6 @@ Different features are supported by this app, a brief overview you'll find here. - Own water section - Cup your brews by aromatics or flavors - Connect smart scales (Decent Scale, Acaia Lunar, Hiroia Jimmy) - ## Special thanks @@ -73,20 +76,22 @@ Different features are supported by this app, a brief overview you'll find here. - [Halil Portakal](https://www.kahvekulubu.net/sosyal/members/portakalhalil.3158/) for Turkish translation - [Jiageng Ding](https://github.com/JiagengDing) for Chinese translation - ## Getting the App -The App is a cross platform application, running on the ionic framework. +The App is a cross platform application, running on the ionic framework. ### Android + Download the latest version [here](https://play.google.com/store/apps/details?id=com.beanconqueror.app). If you don't want to download the app by playstore, just have a look on the [release page](https://github.com/graphefruit/Beanconqueror/releases). ### iOS + Download the latest version [here](https://apps.apple.com/de/app/beanconqueror/id1445297158). ## :sparkling_heart: Support the project + You want to support me, to access more people to explore the world of good coffee [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/paypalme/LarsSaalbach) - Support me once @@ -95,7 +100,6 @@ You want to support me, to access more people to explore the world of good coffe Or sponsor me via Github - Thanks! :heart: ## Contribution @@ -113,30 +117,34 @@ I welcome pull requests, but you will be required to sign the Beanconqueror CLA ## Questions ### Why is external storage not supported? + Sadly there are some issues to read/use files from external storage https://github.com/apache/cordova-plugin-file/issues/350 ### Why is image-export functionality not support on iOS? + iOS filesystem is different then on Android, because of this images cannot just be exported. Thats why just Android is support by now. ### iOS - iCloud-Backup + You can backup Beanconqueror via iCloud, with this you can transfer all data to another device without any loss. ### Analytics + All tracked data/analytics are visible here: ![Website](https://beanconqueror.com/data-tracking.html) ### Which requirements does the app needs? -The app needs access to your filesystem aswell as the camera -- *Filesytem*: Needed to save images which you took on beans/brews etc or exporting your settings. -- *Camera*: Needed to take picures or access the photo library to set images for your beans/brews -- *Internet*: NOT NEEDED! But needed if you want to send me some analytics information to make the app better :) -- *GPS*: NOT NEEDED! Activated through settings, saves the brew location -- *Apple Health*: NOT NEEDED! Activated through settings, saves caffeine amount -- *Wake look*: NOT NEEDED! Activated through settings, won't let your phone get into sleep mode while brewing -- *Bluetooth*: NOT NEEDED! Activated for smart scale use. +The app needs access to your filesystem aswell as the camera +- _Filesytem_: Needed to save images which you took on beans/brews etc or exporting your settings. +- _Camera_: Needed to take picures or access the photo library to set images for your beans/brews +- _Internet_: NOT NEEDED! But needed if you want to send me some analytics information to make the app better :) +- _GPS_: NOT NEEDED! Activated through settings, saves the brew location +- _Apple Health_: NOT NEEDED! Activated through settings, saves caffeine amount +- _Wake look_: NOT NEEDED! Activated through settings, won't let your phone get into sleep mode while brewing +- _Bluetooth_: NOT NEEDED! Activated for smart scale use. # Develop on your own @@ -145,53 +153,63 @@ The app needs access to your filesystem aswell as the camera If you're not familiar with Ionic or Cordova [read through the introduction](http://ionicframework.com/docs/intro/installation/). To get started with anything you need [Node.js](https://nodejs.org/en/download/) installed - ## Want to check the code quality? + https://sonarcloud.io/dashboard?id=graphefruit_Beanconqueror ## Get Started + npm install -g cordova@11.0.0 npm install -g @ionic/cli +npm run prepare ## Build iOS + ``` ionic cordova build ios ``` ## Build Android + ``` ionic cordova build android ``` ### Check outdated dependencies + ``` npm outdated ``` ### Check outdated plugins + ``` cordova-check-plugins ``` ### NPM-Version + Don't use NPM V 7 right now, 6.14.11 works fine ### iOS-Version: -`ionic cordova platform add ios@6.2.0` +`ionic cordova platform add ios@6.2.0` ### Android-Version: + `ionic cordova platform add android@10.1.2` ### Github Page Hosting -https://stackoverflow.com/questions/60357663/do-apple-app-site-association-files-work-with-github-pages-i-e-site-github-io +https://stackoverflow.com/questions/60357663/do-apple-app-site-association-files-work-with-github-pages-i-e-site-github-io ### Upgrade Ionic if needed: + `npm install @ionic/angular@6.1.14` -> Or the actual active version ### Installing AAB on your android (mac) + https://stackoverflow.com/questions/50419286/install-android-app-bundle-on-device brew install bundletool bundletool build-apks --bundle=./app.aab --output=./app.apks diff --git a/package-lock.json b/package-lock.json index df14d91a1..a468e28ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -118,6 +118,7 @@ "elliptic": ">=6.5.4", "es6-promise-plugin": "^4.2.2", "fttx-phonegap-plugin-barcodescanner": "github:fttx/phonegap-plugin-barcodescanner", + "husky": "^8.0.1", "ionic-plugin-deeplinks": "^1.0.22", "jasmine-core": "~3.6.0", "jasmine-spec-reporter": "~5.0.0", @@ -126,7 +127,8 @@ "karma-coverage-istanbul-reporter": "~3.0.2", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.5.0", - "prettier": "^2.6.2", + "lint-staged": "^13.0.3", + "prettier": "^2.7.1", "protractor": "~7.0.0", "skwas-cordova-plugin-datetimepicker": "^2.1.2", "stylelint": "^13.12.0", @@ -6267,18 +6269,6 @@ "node": ">=4" } }, - "node_modules/@ionic/angular-toolkit/node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@ionic/angular-toolkit/node_modules/postcss": { "version": "8.3.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", @@ -7817,11 +7807,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/@ionic/utils-process/node_modules/signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" - }, "node_modules/@ionic/utils-stream": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.5.tgz", @@ -7941,11 +7926,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/@ionic/utils-terminal/node_modules/signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" - }, "node_modules/@ionic/utils-terminal/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -10653,6 +10633,112 @@ "node": ">=8" } }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/ansi-styles": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", + "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", @@ -10772,9 +10858,9 @@ "dev": true }, "node_modules/colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, "node_modules/colors": { @@ -11091,31 +11177,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/copy-webpack-plugin/node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/copy-webpack-plugin/node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/copy-webpack-plugin/node_modules/schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -11232,19 +11293,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/cordova-android/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/cordova-android/node_modules/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -11260,18 +11308,6 @@ "node": ">=6" } }, - "node_modules/cordova-android/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/cordova-android/node_modules/semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -13110,6 +13146,12 @@ "readable-stream": "^2.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -13839,12 +13881,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, "node_modules/execall": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", @@ -15388,6 +15424,21 @@ "ms": "^2.0.0" } }, + "node_modules/husky": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.1.tgz", + "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -17315,9 +17366,9 @@ } }, "node_modules/lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", "dev": true, "engines": { "node": ">=10" @@ -17329,6 +17380,268 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, + "node_modules/lint-staged": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.0.3.tgz", + "integrity": "sha512-9hmrwSCFroTSYLjflGI8Uk+GWAwMB4OlpU4bMJEAT5d/llQwtYKoim4bLOyLCuWFAhWEupE0vkIFqtw/WIsPug==", + "dev": true, + "dependencies": { + "cli-truncate": "^3.1.0", + "colorette": "^2.0.17", + "commander": "^9.3.0", + "debug": "^4.3.4", + "execa": "^6.1.0", + "lilconfig": "2.0.5", + "listr2": "^4.0.5", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.2", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.1.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", + "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/lint-staged/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/lint-staged/node_modules/execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "dev": true, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/lint-staged/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/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/lint-staged/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/yaml": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", + "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/listr2": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", + "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.5", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/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/listr2/node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/rxjs": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", + "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/listr2/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/loader-runner": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", @@ -17540,6 +17853,74 @@ "node": ">=8" } }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update/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-update/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/log4js": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.5.2.tgz", @@ -18100,16 +18481,16 @@ "dev": true }, "node_modules/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, "node_modules/mime": { @@ -19065,9 +19446,9 @@ } }, "node_modules/object-inspect": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.1.tgz", - "integrity": "sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -19832,9 +20213,9 @@ "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==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" @@ -19843,6 +20224,18 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "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", @@ -23768,9 +24161,9 @@ } }, "node_modules/signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/simctl": { "version": "2.0.3", @@ -24766,6 +25159,15 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -25179,31 +25581,6 @@ "node": ">= 6" } }, - "node_modules/stylus-loader/node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/stylus-loader/node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/stylus/node_modules/debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -31842,12 +32219,6 @@ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, "postcss": { "version": "8.3.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", @@ -32973,11 +33344,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" } } }, @@ -33068,11 +33434,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" - }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -35220,6 +35581,72 @@ "restore-cursor": "^3.1.0" } }, + "cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "requires": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", + "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true + }, + "slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + } + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, "cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", @@ -35314,9 +35741,9 @@ "dev": true }, "colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, "colors": { @@ -35561,22 +35988,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, "schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -35659,16 +36070,6 @@ "universalify": "^2.0.0" } }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, "nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -35678,12 +36079,6 @@ "abbrev": "1" } }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, "semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -36994,6 +37389,12 @@ "readable-stream": "^2.0.2" } }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -37512,12 +37913,6 @@ "requires": { "mimic-fn": "^2.1.0" } - }, - "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true } } }, @@ -38727,6 +39122,12 @@ "ms": "^2.0.0" } }, + "husky": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.1.tgz", + "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==", + "dev": true + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -40177,9 +40578,9 @@ } }, "lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", "dev": true }, "lines-and-columns": { @@ -40188,6 +40589,178 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, + "lint-staged": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.0.3.tgz", + "integrity": "sha512-9hmrwSCFroTSYLjflGI8Uk+GWAwMB4OlpU4bMJEAT5d/llQwtYKoim4bLOyLCuWFAhWEupE0vkIFqtw/WIsPug==", + "dev": true, + "requires": { + "cli-truncate": "^3.1.0", + "colorette": "^2.0.17", + "commander": "^9.3.0", + "debug": "^4.3.4", + "execa": "^6.1.0", + "lilconfig": "2.0.5", + "listr2": "^4.0.5", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.2", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.1.1" + }, + "dependencies": { + "commander": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", + "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, + "human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "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 + }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + }, + "yaml": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", + "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", + "dev": true + } + } + }, + "listr2": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", + "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.5", + "through": "^2.3.8", + "wrap-ansi": "^7.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" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "rxjs": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", + "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, "loader-runner": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", @@ -40368,6 +40941,55 @@ } } }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "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" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, "log4js": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.5.2.tgz", @@ -40782,13 +41404,13 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime": { @@ -41522,9 +42144,9 @@ } }, "object-inspect": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.1.tgz", - "integrity": "sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA==" + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" }, "object-is": { "version": "1.1.5", @@ -42093,9 +42715,15 @@ "dev": true }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true }, "pify": { @@ -45047,9 +45675,9 @@ } }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "simctl": { "version": "2.0.3", @@ -45853,6 +46481,12 @@ "safe-buffer": "~5.1.0" } }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -46175,22 +46809,6 @@ "requires": { "is-glob": "^4.0.1" } - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true } } }, diff --git a/package.json b/package.json index 0a2063726..7581620da 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "lint": "ng lint", "e2e": "ng e2e", "sonar": "sh /Users/larssaalbach/Downloads/sonarqube-7.0/bin/macosx-universal-64/sonar.sh console", - "sonar_scan": "/Users/larssaalbach/Downloads/sonar-scanner-4.2.0.1873-macosx/bin/sonar-scanner" + "sonar_scan": "/Users/larssaalbach/Downloads/sonar-scanner-4.2.0.1873-macosx/bin/sonar-scanner", + "prepare": "husky install" }, "private": true, "dependencies": { @@ -125,6 +126,7 @@ "elliptic": ">=6.5.4", "es6-promise-plugin": "^4.2.2", "fttx-phonegap-plugin-barcodescanner": "github:fttx/phonegap-plugin-barcodescanner", + "husky": "^8.0.1", "ionic-plugin-deeplinks": "^1.0.22", "jasmine-core": "~3.6.0", "jasmine-spec-reporter": "~5.0.0", @@ -133,7 +135,8 @@ "karma-coverage-istanbul-reporter": "~3.0.2", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.5.0", - "prettier": "^2.6.2", + "lint-staged": "^13.0.3", + "prettier": "^2.7.1", "protractor": "~7.0.0", "skwas-cordova-plugin-datetimepicker": "^2.1.2", "stylelint": "^13.12.0", @@ -235,5 +238,9 @@ "prettier": { "singleQuote": true, "semi": true + }, + "lint-staged": { + "*.css": "stylelint --fix", + "*.{ts,js,css,md}": "prettier --write" } } From a2d0c00ddd210d796fd880e79c9255288b1ab8e0 Mon Sep 17 00:00:00 2001 From: Mikael Manukyan Date: Mon, 18 Jul 2022 11:44:01 -0700 Subject: [PATCH 44/78] Add method to pressure device (#391) --- .../devices/pressureBluetoothDevice.ts | 46 ++++++++++++++++--- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/src/classes/devices/pressureBluetoothDevice.ts b/src/classes/devices/pressureBluetoothDevice.ts index 6659818cc..ee9256b51 100644 --- a/src/classes/devices/pressureBluetoothDevice.ts +++ b/src/classes/devices/pressureBluetoothDevice.ts @@ -1,7 +1,10 @@ import { Platforms } from '@ionic/core'; import { PeripheralData } from './ble.types'; import { EventEmitter } from '@angular/core'; -import {Logger} from './common/logger'; +import { Logger } from './common/logger'; +import { to128bitUUID } from './common/util'; + +declare var ble; export interface Pressure { actual: number; @@ -13,6 +16,9 @@ export interface PressureChangeEvent extends Pressure { } export abstract class PressureDevice { + public static BATTERY_SERVICE_UUID = to128bitUUID('180F'); + public static BATTERY_CHAR_UUID = to128bitUUID('2A19'); + public device_id: string; protected pressure: Pressure; protected platforms: Platforms[]; @@ -43,14 +49,17 @@ export abstract class PressureDevice { } protected setPressure(_newPressure: number) { - this.pressureParentLogger.log('Bluetooth Pressure Device - New pressure recieved ' + _newPressure); + this.pressureParentLogger.log( + 'Bluetooth Pressure Device - New pressure recieved ' + _newPressure + ); this.pressure.actual = _newPressure; const actualDate = new Date(); try { - this.pressureParentLogger.log('Bluetooth Pressure Device - Are subscriptions existing? ' + this.pressureChange?.observers?.length); - }catch(ex) { - - } + this.pressureParentLogger.log( + 'Bluetooth Pressure Device - Are subscriptions existing? ' + + this.pressureChange?.observers?.length + ); + } catch (ex) {} this.pressureChange.emit({ actual: this.pressure.actual, old: this.pressure.old, @@ -59,6 +68,31 @@ export abstract class PressureDevice { this.pressure.old = _newPressure; } + + /** + * getBattery returns the battery level of the device + * + * @return a promise resolving to a number from 0 to 100 representing available battery percentage + */ + public getBattery(): Promise { + return new Promise((resolve, reject) => { + ble.read( + this.device_id, + PressureDevice.BATTERY_SERVICE_UUID, + PressureDevice.BATTERY_CHAR_UUID, + (buffer: ArrayBuffer) => { + const data = new Uint8Array(buffer); + resolve(data[0]); + }, + (err: unknown) => { + if (!(err instanceof Error)) { + err = new Error(JSON.stringify(err)); + } + reject(err); + } + ); + }); + } } export function psiToBar(v: number) { From 68a938eb699ea0685738d7d1f9d5456323aa506a Mon Sep 17 00:00:00 2001 From: Mimoja Date: Fri, 22 Jul 2022 08:46:48 +0200 Subject: [PATCH 45/78] devices: Add Eureka Precisa Scale (#393) * Add simplified Chiese translation. (#372) * Create zh,json * Rename zh,json to zh.json * Rename zh.json to zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update README.md * Update zh-hans.json * Update README.md * Update README.md * Update zh-hans.json * Update README.md * Update README.md * Update zh-hans.json * Create old-en.json * Update zh-hans.json * Update zh-hans.json * Update old-en.json * Delete old-en.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * Update zh-hans.json * update Chinese tranlation * update Chinese tranlation * change some spellings in en.json Co-authored-by: DC <34479243+DC1024@users.noreply.github.com> * devices: Add Eureka Precisa Scale The eureka precisa scale is a branded version of the Krell CFS-9002 smart bluetooth coffee scale, sold by eureka in europe. It provies a 1-2000g range of measurement with an .1g resolution. The unit can be set to g, oz and ml(!). One characteristic is used for weight notifications (also containing the timer) One is used to write to. All write _must be_ unackknowledged writes. All logic is based on the decents de1app logic under GPLv3 here: https://github.com/decentespresso/de1app/commit/f935c7ef099fcac0f7298560450ad816e77012f3 Testing done: None, cordova build fails on all owned systems indipendant of this change. Open Questions: how to write in an unacknowledged way? Signed-off-by: Mimoja Co-authored-by: Graphefruit Co-authored-by: Jiageng Ding Co-authored-by: DC <34479243+DC1024@users.noreply.github.com> --- src/assets/i18n/zh-cn.json | 1169 +++++++++++++++++++++ src/classes/devices/eurekaPrecisaScale.ts | 189 ++++ src/classes/devices/index.ts | 33 +- 3 files changed, 1363 insertions(+), 28 deletions(-) create mode 100644 src/assets/i18n/zh-cn.json create mode 100644 src/classes/devices/eurekaPrecisaScale.ts diff --git a/src/assets/i18n/zh-cn.json b/src/assets/i18n/zh-cn.json new file mode 100644 index 000000000..40d3d6843 --- /dev/null +++ b/src/assets/i18n/zh-cn.json @@ -0,0 +1,1169 @@ +{ + "NAV_MENU": "菜单", + "NAV_HOME": "主页", + "NAV_SETTINGS": "设置", + "NAV_BREWS": "冲泡", + "NAV_BEANS": "咖啡豆", + "NAV_PREPARATION": "冲泡方法", + "NAV_MILL": "磨豆机", + "NAV_ABOUT_US": "关于我们", + "NAV_CONTACT": "联系方式", + "NAV_PRIVACY": "隐私", + "NAV_CREDITS": "Credits", + "NAV_TERMS": "团队和贡献者", + "NAV_THANKS": "谢谢!", + "NAV_LICENCES": "开源许可证", + "NAV_STATISTICS": "数据统计", + "NAV_IMPRESSUM": "公司信息", + "NAV_COOKIE": "缓存文件", + "NAV_LOGS": "日志", + "NAV_BREW_PARAMS": "冲泡参数", + "NAV_INFORMATION_TO_APP": "关于软件", + "NAV_WATER_SECTION": "水质", + "NAV_HELPER": "计算", + "POPOVER_BREWS_OPTION_REPEAT": "复制", + "POPOVER_BREWS_OPTION_DETAIL": "详情", + "DETAIL": "详情", + "POPOVER_BREWS_OPTION_EDIT": "编辑", + "POPOVER_BREWS_OPTION_DELETE": "删除", + "POPOVER_BREWS_OPTION_PHOTO_GALLERY": "图库", + "POPOVER_BREWS_OPTION_CUPPING": "品尝", + "POPOVER_BREWS_OPTION_MAP_COORDINATES": "在地图上展示", + "POPOVER_BREWS_OPTION_FAST_REPEAT": "快速复制", + "PAGE_BREWS_NO_ENTRIES": "目前还没有添加冲泡方式", + "PAGE_BREWS_NO_ARCHIVED_ENTRIES": "目前还没有完成过一次冲泡", + "CANT_START_NEW_BREW_TITLE": "这儿少了点什么 ...", + "CANT_START_NEW_BREW_DESCRIPTION": "使用软件前,请至少添加一种咖啡豆、一种冲泡方式和一个研磨机。 你可以使用菜单跳转到不同的类别以添加上述信息。", + "PAGE_HOME_WELCOME_GREETINGS": "终于等到你来了!", + "PAGE_HOME_TOTAL_BREW": "冲泡", + "PAGE_HOME_TOTAL_BREWS": "冲泡次数", + "PAGE_HOME_BEAN_EXPLORED": "款咖啡豆", + "PAGE_HOME_BEANS_EXPLORED": "款咖啡豆", + "PAGE_HOME_LAST_BREWS": "冲泡记录", + "PAGE_HOME_LAST_BREW": "上一次冲泡", + "PAGE_HOME_DIFFERENT_PREPARATION_METHODS": "不同的冲泡方式", + "PAGE_HOME_DIFFERENT_MILLS": "不同的磨豆机", + "PAGE_HOME_SUPPORTER": "软件支持", + "PAGE_HOME_START_BREW": "开始冲泡", + "PAGE_BEANS_LIST_OBTAINABLE": "可用", + "PAGE_BEANS_LIST_YOU_GOT_NO_FRESH_BEANS": "咖啡豆没货啦,快买一点新的吧!", + "PAGE_BEANS_LIST_YOU_GOT_NO_FINISHED_BEANS": "目前还没有一包已经喝完的咖啡。", + "PAGE_MILL_LIST_NO_MILL_EXISTING": "你还没有添加任何一个磨豆机", + "PAGE_PREPARATION_LIST_NO_PREPARATION_EXISTING": "你还没有添加任何一个冲泡方式", + "PAGE_CONTACT_SUGGESTIONS_QUESTIONS_WISHES": "建议、问题或请求?", + "PAGE_THANKS_THANKS_FOR_YOUR_SUPPORT": "感谢你的支持", + "PAGE_SETTINGS_LANGUAGE": "语言偏好", + "PAGE_SETTINGS_LANGUAGE_GERMAN": "German", + "PAGE_SETTINGS_LANGUAGE_ENGLISH": "English", + "PAGE_SETTINGS_LANGUAGE_SPANISH": "Spanish", + "PAGE_SETTINGS_LANGUAGE_CHINESE": "Chinese", + "PAGE_SETTINGS_GENERAL_SETTINGS": "常规设置", + "PAGE_SETTINGS_TRANSFER": "数据转移", + "PAGE_SETTINGS_PRESET_LAST_BREW": "使用预设值?", + "PAGE_SETTINGS_DISPLAY": "显示方式", + "PAGE_SETTINGS_DISPLAY_SINGLE_PAGE": "单页", + "PAGE_SETTINGS_DISPLAY_PAGING": "连续页面", + "PAGE_SETTINGS_STARTUP_VIEW": "起始页", + "PAGE_SETTINGS_ANALYTICS_INFORMATION": "分析", + "PAGE_SETTINGS_ANALYTICS_INFORMATION_TOOLTIP": "按 i 了解更多信息", + "PAGE_SETTINGS_TRACK_BREW_COORDINATES": "保存冲泡经纬度", + "PAGE_SETTINGS_FAST_REPEAT": "快速复制", + "PAGE_SETTINGS_TRACK_CAFFEINE_CONSUMPTION": "保存咖啡因信息", + "PAGE_SETTINGS_WAKE_LOCK": "冲泡时屏幕保持常亮", + "PAGE_SETTINGS_CURRENCY": "货币单位", + "PAGE_STATISTICS_DIFFERENT_PREPARATION_METHOD": "冲泡器具", + "PAGE_STATISTICS_TOTAL_GROUND_BEANS": "研磨的咖啡豆总计", + "PAGE_STATISTICS_MONEY_SPENT_FOR_COFFEE": "购买咖啡豆总费用", + "PAGE_STATISTICS_DRUNKEN_BREWS": "冲泡总数", + "PAGE_STATISTICS_BREW_PROCESSES": "总冲泡次数", + "PAGE_STATISTICS_DRUNKEN_QUANTITY": "咖啡豆消耗量", + "PAGE_STATISTICS_BEAN_WEIGHT_USED": "咖啡豆研磨总量", + "PAGE_BREW_TEXT_INFORMATION_FROM_ROASTER": "烘焙信息", + "PAGE_ABOUT_NO_VERSION_AVAILABLE": "没有可用的版本", + "PAGE_ABOUT_APP_VERSION": "软件版本", + "PAGE_LICENCES_WEBSITE": "网站", + "BEAN_DATA_ROAST_NAME": "烘焙程度", + "BEAN_DATA_CUSTOM_ROAST_NAME": "自定义烘焙温度", + "BEAN_DATA_ROASTING_DATE": "烘焙日期", + "BEAN_DATA_ROASTER": "烘焙者", + "BEAN_DATA_VARIETY": "品种", + "BEAN_DATA_PROCESSING": "处理法", + "BEAN_DATA_COUNTRY": "国家", + "BEAN_DATA_MIX": "单一产地/拼配", + "BEAN_DATA_AROMATICS": "风味味谱", + "BEAN_DATA_WEIGHT": "重量", + "BEAN_DATA_COST": "花销", + "BEAN_DATA_NAME": "咖啡豆名称", + "BEAN_DATA_REGION": "地区", + "BEAN_DATA_FARM": "庄园", + "BEAN_DATA_FARMER": "农场主", + "BEAN_DATA_ELEVATION": "海拔", + "BEAN_DATA_HARVEST_TIME": "收获日期", + "BEAN_DATA_PERCENTAGE": "百分比", + "BEAN_DATA_CERTIFICATION": "咖啡豆认证", + "BEAN_DATA_ROASTING_TYPE": "烘焙用于", + "BEAN_DATA_DECAFFEINATED": "无咖啡因", + "BEAN_DATA_URL": "网站", + "BEAN_DATA_EAN": "条形码", + "BEAN_DATA_PURCHASING_PRICE": "购买价格", + "BEAN_DATA_FOB_PRICE": "离岸价", + "BEAN_DATA_CUPPING_POINTS": "杯测分数", + "BREW_DATA_CUSTOM_BREW_TIME": "自定义冲泡时间", + "BREW_CREATION_DATE": "创建日期", + "REPEAT": "重复", + "EDIT": "编辑", + "DELETE": "删除", + "FINISHED": "归档", + "NOTES": "笔记", + "ADD_PHOTO": "添加照片", + "CANCEL": "取消", + "GENERATE": "生成", + "SAVE": "保存", + "ADD_SOMETHING": "添加", + "CONTACT": "联系", + "NAME": "名称", + "IMPORT": "导入", + "EXPORT": "导出", + "VIEW": "查看", + "ARCHIVE": "归档", + "CURRENT": "当前", + "BACK": "返回", + "CLOSE": "关闭", + "DAY": "日", + "BREW_DATA_TEMPERATURE_TIME": "温度时间", + "BREW_DATA_SURF_TIME": "冲泡时间", + "BREW_DATA_TIME": "时间", + "BREW_DATA_GRIND_SIZE": "研磨设置", + "BREW_DATA_GRIND_WEIGHT": "咖啡粉 (gr)", + "BREW_DATA_IN_OUT_BR": "入/出 (BR)", + "BREW_DATA_NOTES": "笔记", + "BREW_DATA_PREPARATION_METHOD": "冲泡器具", + "BREW_DATA_MILL": "磨豆机", + "BREW_DATA_MILL_SPEED": "研磨速度 (rpm)", + "BREW_DATA_MILL_TIMER": "研磨时间", + "BREW_DATA_BREW_QUANTITY": "水量", + "BREW_DATA_BEAN_TYPE": "咖啡豆类型", + "BREW_DATA_BREW_TEMPERATURE": "冲泡温度", + "BREW_DATA_PRESSURE_PROFILE": "冲泡参数", + "BREW_DATA_COFFEE_TYPE": "咖啡类型", + "BREW_DATA_COFFEE_CONCENTRATION": "咖啡浓度", + "BREW_DATA_COFFEE_FIRST_DRIP_TIME": "第一滴咖啡落下", + "BREW_DATA_COFFEE_BLOOMING_TIME": "闷蒸/预浸泡时间", + "BREW_DATA_ATTACHMENTS": "附件/照片", + "BREW_DATA_RATING": "评分", + "BREW_DATA_CALCULATED_COFFEE_BREW_TIME": "萃取时间", + "BREW_DATA_TDS": "总溶解固体", + "BREW_DATA_CALCULATED_EXTRACTION_YIELD": "萃取率 %", + "BREW_INFORMATION_BREW_RATIO": "冲泡率", + "BREW_INFORMATION_BEAN_AGE": "豆龄", + "BREW_INFORMATION_BREW_QUANTITY_TYPE_NAME": "计数类型", + "BREW_DATA_TDS_EY": "TDS / %EY", + "BREW_DATA_BREW_BEVERAGE_QUANTITY": "冲泡出的咖啡", + "BREW_DATA_PREPARATION_METHOD_TOOL": "冲泡器具", + "BREW_DATA_WATER": "水质", + "BREW_DATA_BEAN_WEIGHT_IN": "咖啡豆数量 (gr)", + "BREW_DATA_VESSEL": "Server", + "BREW_DATA_VESSEL_WEIGHT": "Server weight", + "BREW_DATA_VESSEL_NAME": "Server name", + "BREW_DATA_FLAVOR": "风味", + "BREW_DATA_FLOW_PROFILE": "Flow", + "ONE_DAY": "天", + "DAYS": "天", + "ONE_HOUR": "小时", + "HOURS": "小时", + "ONE_MINUTE": "分钟", + "MINUTES": "分钟", + "WITHOUT_COFFEE": "没冲咖啡", + "NOT_FOUND": "未找到", + "INVALID_FILE_FORMAT": "文件格式无效", + "FILE_NOT_FOUND_INFORMATION": "文件未找到", + "ERROR_ON_FILE_READING": "读取文件数据时出错", + "IMPORT_SUCCESSFULLY": "导入成功", + "IMPORT_UNSUCCESSFULLY_DATA_NOT_CHANGED": "导入不成功,没有数据被更改", + "INVALID_FILE_DATA": "无效的文件内容", + "DOWNLOADED": "下载", + "FILE_DOWNLOADED_SUCCESSFULLY": "文件 '{{fileName}}' 已成功下载到您的下载文件夹!", + "NO": "不", + "YES": "是", + "SURE_QUESTION": "确定吗?", + "DELETE_BREW_QUESTION": "删除本次冲泡?", + "DELETE_BEAN_QUESTION": "确定要删除这款咖啡豆吗? 所有相关的冲泡数据也将被删除!", + "DELETE_GREEN_BEAN_QUESTION": "确定要删除这款生豆吗? 所有相关的咖啡豆以及冲泡数据都将被删除!", + "DELETE_MILL_QUESTION": "确定要删除这个研磨机吗? 所有相关的冲泡数据也将被删除!", + "DELETE_PREPARATION_METHOD_QUESTION": "确定要删除这个器具吗? 所有相关的冲泡数据也将被删除!", + "DELETE_PREPARATION_TOOL_QUESTION": "确定要删除这个工具吗? 所有相关的冲泡数据也将被删除。", + "APP_COULD_NOT_STARTED_CORRECTLY_BECAUSE_MISSING_FILESYSTEM": "由于缺少文件系统,应用程序无法正确启动", + "CARE": "关心", + "ERROR_OCCURED": "出现错误", + "CSV_FILE_NOT_DOWNLOADED": "CSV 文件无法下载!", + "CSV_FILE_DOWNLOADED_SUCCESSFULLY": "CSV 文件 '{{fileName}}' 已成功下载到您的下载文件夹!", + "ADD_BREW": "添加冲泡", + "CHOOSE": "选择", + "CHOOSE_PHOTO_OR_LIBRARY": "拍摄照片或从相册选择", + "RECORD": "拍摄", + "PAGE_BEAN_INFORMATION": "咖啡豆信息", + "PAGE_BEAN_INFORMATION_GOOD_BREWS": "好的", + "PAGE_BEAN_INFORMATION_BAD_BREWS": "差的", + "PAGE_BEAN_INFORMATION_COUNT_BREWS": "总冲泡次数", + "INFORMATION": "信息", + "PAGE_BEAN_BREW_CHART_TITLE": "该款咖啡豆的冲泡概述", + "PAGE_BEAN_INFORMATION_AWESOME_BREWS": "令人惊叹", + "PAGE_BEAN_INFORMATION_NORMAL_BREWS": "感觉普通", + "PAGE_BEAN_INFORMATION_NOT_RATED_BREWS": "不做评价", + "PAGE_PREPARATION_INFORMATION_BREWS_DONE": "用这种器具冲泡", + "PAGE_PREPARATION_INFORMATION_BREWED_QUANTITY": "冲泡数量", + "PAGE_PREPARATION_INFORMATION_GRIND_WEIGHT": "消耗的豆子重量", + "PAGE_PREPARATION_INFORMATION_TIME_SPENT_BREWING": "总冲泡时间", + "PAGE_PREPARATION_INFORMATION": "器具信息", + "SECONDS": "秒", + "PAGE_MILL_INFORMATION": "磨豆机信息", + "PAGE_MILL_INFORMATION_BREWS_DONE": "使用这个磨豆机", + "PAGE_MILL_INFORMATION_GRIND_WEIGHT": "消耗的豆子重量", + "PAGE_HELPER_WATER_HARDNESS": "水的硬度", + "PAGE_HELPER_WATER_HARDNESS_CA_CONTENTS": "钙含量 mg/l", + "PAGE_HELPER_WATER_HARDNESS_MG_CONTENTS": "镁含量 mg/l", + "PAGE_HELPER_WATER_HARDNESS_GERMAN_HARDNESS": "°dH", + "PAGE_HELPER_WATER_HARDNESS_TOTAL_HARDNESS": "总硬度", + "PAGE_HELPER_BREW_RATIO": "粉液比", + "PAGE_HELPER_BREW_RATIO_GROUND_COFFEE": "咖啡粉重 (gr)", + "PAGE_HELPER_BREW_RATIO_WATER": "液体 (gr/ml)", + "PAGE_HELPER_BREW_RATIO_CALCULATED": "计算出的粉液比", + "PAGE_SETTINGS_SHOW_ARCHIVED_BREWS": "显示已经归档的冲泡", + "PAGE_SETTINGS_SHOW_ARCHIVED_BEANS": "显示已经归档的咖啡豆", + "PAGE_SETTINGS_SHOW_ARCHIVED_GREEN_BEANS": "显示已经归档的生豆", + "CUPPING_SCORE": "分数", + "CUPPING_SCORE_DRY_FRAGRANCE": "干香", + "CUPPING_SCORE_WET_AROMA": "湿香", + "CUPPING_SCORE_BRIGHTNESS": "明亮度", + "CUPPING_SCORE_FLAVOR": "风味", + "CUPPING_SCORE_BODY": "醇厚度", + "CUPPING_SCORE_FINISH": "尾韵", + "CUPPING_SCORE_SWEETNESS": "甜度", + "CUPPING_SCORE_CLEAN_CUP": "干净度", + "CUPPING_SCORE_COMPLEXITY": "复杂度", + "CUPPING_SCORE_UNIFORMITY": "一致性", + "CUPPING_SCORE_CUPPERS_CORRECTION": "杯测矫正", + "CUPPING_SCORE_DRY_FRAGRANCE_TOOLTIP": "指加入热水前,干磨咖啡的气味", + "CUPPING_SCORE_WET_AROMA_TOOLTIP": "指加入热水后,湿咖啡研磨的气味。", + "CUPPING_SCORE_BRIGHTNESS_TOOLTIP": "酸度是由一组绿原酸、柠檬酸、奎宁酸、乙酸等引起的咖啡中尖锐的高调味道,主要在口腔和舌头的前部感觉到。 (质量很好;与咖啡的苦味无关,也不会直接导致胃部不适)。 酸度受到许多杯测者的重视,并且直接关系到杯子的质量,因为酸度是高海拔种植的产物。", + "CUPPING_SCORE_FLAVOR_TOOLTIP": "这是口中的整体印象,包括所有其他评级。 有 4 种“主要味道”组(酸、甜、咸、苦)和许多“次要味道”。", + "CUPPING_SCORE_BODY_TOOLTIP": "通常被称为“口感”,主体是冲泡咖啡的重量和厚度感,由杯子中可溶性固体的百分比引起,包括提取的所有有机化合物(冲泡方法和使用的磨碎咖啡量会影响这一点 大大)。 我们对 Body 的评分较低,因为清淡的咖啡肯定不错,而且在某些原产地,较轻的酒体最适合整体杯子的特性。", + "CUPPING_SCORE_FINISH_TOOLTIP": "口腔清洁后的挥之不去的或新出现的味道。 这包括咖啡从嘴里流出到几分钟后的时间……这就是为什么你会发现很多杯测者在一两分钟后仍然体验到积极的味道时会修改回味分数的原因。", + "CUPPING_SCORE_SWEETNESS_TOOLTIP": "甜味几乎总是咖啡的理想品质,即使它被委婉地描述为“质朴的甜味”或“苦乐参半”。你可能会注意到精致的甜味(想想欧洲糕点、精美的糖果、白糖、 纯甜味)得分高,以及来自水果糖(果糖)的复杂甜味。 麦芽甜味(麦芽糖)不太传统,但非常令人向往,蜂蜜的范围从非常纯净干净到复杂、质朴的几乎是酵母味。 基本上,如果甜度是杯子的关键,它会被评为很好。", + "CUPPING_SCORE_CLEAN_CUP_TOOLTIP": "请注意,“干净的杯子”并不意味着咖啡上没有污垢。 它只是关于风味和“不干净”的原始、时髦的咖啡,而且风味也可能非常理想,例如来自苏门答腊的湿法去壳印度尼西亚咖啡,或干加工的埃塞俄比亚和也门类型。", + "CUPPING_SCORE_COMPLEXITY_TOOLTIP": "复杂性与“风味”和“完成”分数相得益彰,以传达多种风味的多样性或层次感。 这意味着在杯子里有很多发现。 再说一次,简单的咖啡可以在过度暴露于许多强大的、强烈的、复杂的咖啡后得到解脱。", + "CUPPING_SCORE_UNIFORMITY_TOOLTIP": "均匀度是指杯与杯之间的差异。 干法咖啡在本质上可能不如湿法咖啡均匀。 如果偶尔放弃的话,我们永远不会避免很多味道很好的东西。 这是在杯测方案中进行评分的,其中每个被审查的批次都制作了多个杯子。", + "CUPPING_SCORE_CUPPERS_CORRECTION_TOOLTIP": "这改编自 SCAA 系统和卓越杯评分(他们有时称其为“总分”)。 它允许杯测者确保总分正确传达杯子的整体印象。 你可能会批评这种方法,并认为它是“捏造”的。 在某种程度上,你是对的......但是改变类别分数以达到所需的总分(当你知道它是 7 时,给咖啡的酸度为 9)会更糟糕,或者相反,有一个 绝对值得 90 分的咖啡最终以 84 分结束。具体的 Cupper 校正数无关紧要,无论是 5 还是 8 ......这个想法是总分给出了咖啡质量的正确印象。", + "CUPPING_SCORE_TOOLTIP": "100-95 = 令人震惊,90-94 = 杰出,85-89 = 非常好,80-84 = 好,75-79 = 一般,70-74 = 差", + "DETAIL_BREW": "冲泡详情", + "DETAIL_BEAN": "咖啡豆详情", + "DETAIL_MILL": "研磨机详情", + "DETAIL_PREPARATION": "准备冲泡", + "EDIT_BREW": "编辑冲泡", + "ADD_BEAN": "添加咖啡豆", + "EDIT_BEAN": "编辑咖啡豆", + "ADD_PREPARATION": "添加冲泡器具", + "EDIT_PREPARATION": "编辑冲泡器具", + "ADD_MILL": "新增研磨机", + "EDIT_MILL": "编辑研磨机", + "USE_FILTER": "应用筛选", + "RESET_FILTER": "重置筛选", + "COFFEE_GRAMS_GRINDED": "研磨咖啡豆总克数", + "BEANS_USED": "研磨咖啡豆种类", + "BREW_HEADER_BEFORE_BREW": "冲泡前", + "BREW_HEADER_WHILE_BREW": "冲泡时", + "BREW_HEADER_AFTER_BREW": "冲泡后", + "BREW_HEADER_CUPPING": "品尝", + "BEANS_CONSUMED": "归档", + "NAV_MANAGE_PARAMETERS": "管理参数", + "NAV_SORT_PARAMETERS": "参数排序", + "NAV_DEFAULT_PARAMETERS": "定义默认参数", + "PAGE_SORT_PARAMETERS_DESCRIPTION": "拖放参数以定义它们将显示的顺序", + "PAGE_MANAGE_PARAMETERS_DESCRIPTION": "编辑冲泡信息时要显示的数据", + "PAGE_DEFAULT_PARAMETERS_DESCRIPTION": "标记哪些参数应默认为最后使用的值", + "SORT_PARAMETERS_BEFORE": "冲泡前", + "SORT_PARAMETERS_MEANWHILE": "冲泡时", + "SORT_PARAMETERS_AFTER": "冲泡后", + "MORE_INFORMATION": "更多信息", + "UNDERSTOOD": "了解", + "WELCOME_PAGE_ACTIVATE_ANALYTICS_TITLE": "分析和跟踪", + "WELCOME_PAGE_ACTIVATE_ANALYTICS_DESCRIPTION": "我们希望不断改进应用程序、网站和我们未来为您提供的服务。 为此,我们需要跟踪您如何使用该应用程序及其功能的一些数据。 但我们承诺,我们永远不会追踪任何个人数据。 为了确保这些承诺,我们使用 Matomo,一个以数据安全和隐私为中心的开源服务,该服务托管在我们自己的服务器上 - 这确保只有我们拥有数据所有权。 我们的网站提供有关我们跟踪的参数的所有信息,此外,您可以查看 100% 开源的源代码。 如果你有任何问题,请随时与我们联系。", + "ANALYTICS_INFORMATION_TITLE": "分析和跟踪", + "ANALYTICS_INFORMATION_DESCRIPTION": "如您所知,您的数据和隐私的安全是我们的首要任务。

因此,我们已从 Google Analytics 切换到以数据安全和隐私为重点的开源服务 Matomo,该服务由托管 在我们自己的服务器上 - 这意味着我们拥有完整的数据所有权。

跟踪的参数没有改变,我们仍然承诺永远不会跟踪任何个人数据。
我们的网站提供了我们跟踪的参数的所有信息,此外您可以查看100%开源的源代码。

您有问题吗?

联系我们。", + "ACTIVATE": "分析", + "DO_NOT_ACTIVE": "停止分析", + "WELCOME_PAGE_BEAN_TITLE": "咖啡豆", + "WELCOME_PAGE_BEAN_DESCRIPTION": "用咖啡豆来冲泡咖啡有点复杂。 请添加您的第一种咖啡豆以开始使用!", + "WELCOME_PAGE_BEAN_ADD": "添加咖啡豆", + "SKIP": "跳过", + "WELCOME_PAGE_PREPARATION_TITLE": "冲泡器具", + "WELCOME_PAGE_PREPARATION_DESCRIPTION": "V60滤杯, 爱乐压, 手冲式 - 冲泡咖啡的方式有很多种。请添加至少一个冲泡器具", + "WELCOME_PAGE_PREPARATION_ADD": "添加冲泡器具", + "WELCOME_PAGE_MILL_TITLE": "研磨机", + "WELCOME_PAGE_MILL_DESCRIPTION": "就快要完成了,但你需要一些东西来研磨咖啡豆!请添加至少一台研磨机", + "WELCOME_PAGE_MILL_ADD": "新增研磨机", + "WELCOME_PAGE_TITLE": "欢迎!", + "WELCOME_PAGE_BEAN_HEADLINE": "第一款咖啡豆", + "WELCOME_PAGE_PREPARATION_HEADLINE": "添加冲泡器具", + "WELCOME_PAGE_MILL_HEADLINE": "第一个研磨机", + "WELCOME_PAGE_LETS_START_HEADLINE": "现在我们开始吧!", + "WELCOME_PAGE_LETS_START_TITLE": "现在我们开始吧!", + "WELCOME_PAGE_LETS_START_DESCRIPTION": "恭喜,你已经准备好做你一生中最好的咖啡了。玩得开心,传播对好咖啡的热爱!", + "PREPARATION_TYPE": "制作类型", + "PREPARATION_TYPE_NAME": "名称", + "ARCHIVED": "归档", + "PAGE_SETTINGS_SHOW_ARCHIVED_PREPARATIONS": "显示归档的冲泡器具", + "PAGE_SETTINGS_SHOW_ARCHIVED_MILLS": "显示归档的冲泡研磨机", + "PAGE_MILL_LIST_NO_ARCHIVED_MILL_EXISTING": "你还没有归档任何一个研磨机", + "PAGE_PREPARATION_LIST_NO_ARCHIVED_PREPARATION_EXISTING": "你还没有归档任何一种器具", + "TOAST_BREW_ADDED_SUCCESSFULLY": "冲泡添加成功", + "TOAST_BREW_REPEATED_SUCCESSFULLY": "冲泡复制成功", + "TOAST_BEAN_ADDED_SUCCESSFULLY": "咖啡豆添加成功", + "TOAST_MILL_ADDED_SUCCESSFULLY": "新的研磨机已添加成功", + "TOAST_PREPARATION_ADDED_SUCCESSFULLY": "冲泡器具添加成功", + "TOAST_WATER_ADDED_SUCCESSFULLY": "水质添加成功", + "TOAST_BREW_DELETED_SUCCESSFULLY": "冲泡记录已被删除", + "TOAST_BEAN_DELETED_SUCCESSFULLY": "咖啡豆已被删除", + "TOAST_GREEN_BEAN_DELETED_SUCCESSFULLY": "生豆已被删除", + "TOAST_MILL_DELETED_SUCCESSFULLY": "研磨机已被删除", + "TOAST_WATER_DELETED_SUCCESSFULLY": "水质已被删除", + "TOAST_PREPARATION_DELETED_SUCCESSFULLY": "冲泡器具已被删除", + "TOAST_BREW_EDITED_SUCCESSFULLY": "冲泡记录已被编辑", + "TOAST_BEAN_EDITED_SUCCESSFULLY": "咖啡豆已被编辑", + "TOAST_MILL_EDITED_SUCCESSFULLY": "研磨机已被编辑", + "TOAST_PREPARATION_EDITED_SUCCESSFULLY": "器具已被编辑", + "TOAST_WATER_EDITED_SUCCESSFULLY": "水质已被编辑", + "TOAST_BEAN_ARCHIVED_SUCCESSFULLY": "咖啡豆已经归档", + "TOAST_MILL_ARCHIVED_SUCCESSFULLY": "研磨机已经归档", + "TOAST_PREPARATION_ARCHIVED_SUCCESSFULLY": "冲泡器具已经归档", + "TOAST_WATER_ARCHIVED_SUCCESSFULLY": "水质已被编辑", + "BEAN_WEIGHT_ALREADY_USED": "{{gramUsed}}g of {{gramTotal}}g", + "PREPARATION_TYPE_CUSTOM_PREPARATION": "自定义冲泡器具", + "PREPARATION_TYPE_AEROPRESS": "爱乐压", + "PREPARATION_TYPE_V60": "V60滤杯", + "PREPARATION_TYPE_CHEMEX": "Chemex", + "PREPARATION_TYPE_BIALETTI": "比乐蒂/摩卡壶", + "PREPARATION_TYPE_PORTAFILTER": "过滤手柄", + "PREPARATION_TYPE_KALITA_WAVE": "蛋糕杯", + "PREPARATION_TYPE_FRENCH_PRESS": "法压壶", + "PREPARATION_TYPE_SWANNECK": "Swanneck", + "PREPARATION_TYPE_DRIPPER": "聪明杯", + "PREPARATION_TYPE_DELTER_PRESS": "D特压(Delder Press)", + "PREPARATION_TYPE_COLD_BREW": "冷萃", + "PREPARATION_TYPE_AEROPRESS_INVERTED": "爱乐压倒压法", + "PREPARATION_TYPE_TURKISH": "极细研磨", + "PREPARATION_TYPE_BLUE_DRIPPER": "蓝瓶子滤杯", + "PREPARATION_TYPE_ADD_CUSTOM": "添加自定义器具", + "PREPARATION_TYPE_GINA": "Gina智能咖啡机", + "PREPARATION_TYPE_KONO": "KONO滤杯", + "PREPARATION_TYPE_ORIGAMI": "折纸滤杯", + "PREPARATION_TYPE_CAFELAT": "Cafelat拉杆咖啡机", + "PREPARATION_TYPE_OREA": "Orea滤杯", + "PREPARATION_TYPE_COLD_DRIP": "冰滴", + "PREPARATION_TYPE_HAND_LEVER": "手压式", + "PREPARATION_TYPE_FLAIR": "Flair手压意式咖啡机", + "PREPARATION_TYPE_APRIL_BREWER": "April Brewer滤杯", + "PREPARATION_TYPE_ESPRO_BLOOM": "Espro Bloom滤杯", + "PREPARATION_TYPE_FELLOW_STAGG": "Fellow Stagg温控咖啡壶", + "PREPARATION_TYPE_HSIAO_50": "Hsiao 50滤杯", + "PREPARATION_TYPE_KARLSBADER_KANNE": "Karlsbader", + "PREPARATION_TYPE_MOCCA_MASTER": "Mocca Master滴漏式咖啡机", + "PREPARATION_TYPE_SIPHON": "虹吸式", + "CHOOSE_BEANS": "选择咖啡豆", + "CHOOSE_BEAN": "选择咖啡豆", + "CHOOSE_WATERS": "选择水质", + "CHOOSE_WATER": "选择水质", + "CHOOSE_PREPARATIONS": "选择冲泡器具", + "CHOOSE_PREPARATION": "选择冲泡器具", + "CHOOSE_MILLS": "选择研磨机", + "CHOOSE_MILL": "选择研磨机", + "BEAN": { + "PLACE_HOLDER": { + "BEAN_DATA_NAME": "添加咖啡豆的名称", + "BEAN_DATA_ROAST_NAME": "添加烘焙温度", + "BEAN_DATA_ROASTING_DATE": "请输入咖啡豆的烘焙日期", + "BEAN_DATA_ROASTER": "请输入烘焙者的名称", + "BEAN_DATA_VARIETY": "添加咖啡品种", + "BEAN_DATA_PROCESSING": "请输入咖啡豆的处理方法,如:水洗", + "BEAN_DATA_COUNTRY": "它起源于哪儿?", + "BEAN_DATA_MIX": "什么是混合比例?", + "BEAN_DATA_AROMATICS": "描述它的风味吧", + "BEAN_DATA_WEIGHT": "咖啡豆的总重量", + "BEAN_DATA_COST": "购入这款咖啡豆花费了多少钱?", + "BEAN_DATA_REGION": "添加它的产区", + "BEAN_DATA_FARM": "添加它的庄园/农场", + "BEAN_DATA_FARMER": "添加它的种植者名称", + "BEAN_DATA_ELEVATION": "请输入咖啡豆的生长海拔", + "BEAN_DATA_HARVEST_TIME": "请输入咖啡豆的收获日期", + "BEAN_DATA_BUY_DATE": "请输入咖啡豆的购买日期", + "BEAN_DATA_PERCENTAGE": "添加该款咖啡豆在此包装中的占比(主要用于拼配包装填写)", + "BEAN_DATA_CERTIFICATION": "添加豆类认证 (例如:fair trade, bio)", + "BEAN_DATA_ROASTING_TYPE": "添加烘焙类型", + "BEAN_DATA_DECAFFEINATED": "这款咖啡不含咖啡因", + "BEAN_DATA_URL": "添加网站链接", + "BEAN_DATA_EAN": "添加条形码", + "BEAN_DATA_CUPPING_POINTS": "添加它的杯测分数", + "BEAN_DATA_PURCHASING_PRICE": "添加购买价格", + "BEAN_DATA_FOB_PRICE": "添加离岸价格", + "NOTES": "为咖啡豆添加注释", + "CHOOSE_DATA_ROASTER": "添加烘焙机", + "CHOOSE_DATA_ROASTING_TYPE": "选择烘焙类型" + } + }, + "PREPARATION": { + "PLACE_HOLDER": { + "PREPARATION_TYPE_NAME": "添加名称", + "NOTES": "为冲泡器具添加注释" + } + }, + "MILL": { + "PLACE_HOLDER": { + "NAME": "添加名称", + "NOTES": "为研磨机添加注释" + } + }, + "BREW": { + "PLACE_HOLDER": { + "BREW_DATA_GRIND_SIZE": "输入研磨设置,如:5", + "BREW_DATA_GRIND_WEIGHT": "输入此次冲泡咖啡的咖啡粉克数 (gr)", + "BREW_DATA_BREW_TEMPERATURE": "输入冲泡温度", + "BREW_DATA_PREPARATION_METHOD": "选择冲泡器具", + "BREW_DATA_BEAN_TYPE": "选择咖啡豆", + "BREW_DATA_MILL": "选择一个研磨机", + "BREW_DATA_MILL_SPEED": "输入研磨机的研磨速度", + "BREW_DATA_MILL_TIMER": "输入研磨所花费的时间", + "BREW_DATA_PRESSURE_PROFILE": "压力/流量曲线,冲泡建议等", + "BREW_DATA_TEMPERATURE_TIME": "请输入加热器具的时间", + "BREW_DATA_COFFEE_BLOOMING_TIME": "请输入闷蒸/预浸泡所花费的时间", + "BREW_DATA_COFFEE_FIRST_DRIP_TIME": "咖啡的第一滴水是什么时候出现的?", + "BREW_DATA_BREW_QUANTITY": "冲泡时用了多少水?", + "BREW_DATA_COFFEE_TYPE": "输入咖啡类型 (e.g. ristretto)", + "BREW_DATA_COFFEE_CONCENTRATION": "输入咖啡浓度", + "BREW_DATA_TDS": "总共溶解了多少固体?", + "BREW_DATA_NOTES": "为这次冲泡添加注释", + "BREW_DATA_BREW_BEVERAGE_QUANTITY": "冲泡完成以后,得到了多少的咖啡液?", + "BREW_DATA_PREPARATION_METHOD_TOOL": "请选择你的冲泡器具", + "BREW_DATA_WATER": "选择此次使用的水质", + "BREW_DATA_BEAN_WEIGHT_IN": "你使用了多少咖啡豆?(gr)" + } + }, + "ROASTED_BEFORE": "烘焙在", + "DAY_OLD": "天前", + "DAYS_OLD": "天前", + "BEANS_AMOUNT_USED": "已使用", + "CUPPING_BREW": "品尝", + "COFFEE_DRUNKEN_QUANTITY": "咖啡液", + "IMAGE_DELETED": "图片已删除", + "IMAGE_NOT_DELETED": "图片无法删除", + "EXTERNAL_STORAGE_NOT_SUPPORTED": "抱歉,不支持外部故事", + "BEANS_ARCHIVED": "已归档", + "TAB_ARCHIVE": "归档", + "TODAY": "今日", + "PLEASE_WAIT": "请稍等...", + "PREPARATION_STYLE_POUR_OVER": "手冲咖啡", + "PREPARATION_STYLE_ESPRESSO": "意式浓缩", + "PREPARATION_STYLE_FULL_IMMERSION": "全浸泡", + "PREPARATION_STYLE_PERCOLATION": "渗滤式", + "PREPARATION_TYPE_STYLE": "冲泡方式", + "PAGE_SETTINGS_FAST_REPEAT_DESCRIPTION": "开启一个新的菜单条目 - 使用它您可以直接复制冲泡。", + "PAGE_SETTINGS_TRACK_BREW_COORDINATES_DESCRIPTION": "保存每次冲泡时的经纬度", + "PAGE_SETTINGS_TRACK_CAFFEINE_CONSUMPTION_DESCRIPTION": "节省消耗的咖啡因量", + "UPDATE_TITLE": "有什么新玩意儿?", + "NEXT": "下一个", + "UPDATE_TEXT_TITLE_TITLE": { + "5.0.0": { + "TITLE": "版本 5.0: 新玩意儿!", + "DESCRIPTION": [ + "新布局,新图标,新颜色,新标志", + "新的冲泡器具", + "现在可以对冲泡进行分类(渗透、浓缩咖啡、全浸)", + "冲泡工作现在可以继承工具(例如不同的过滤器)", + "现在可以自定义冲泡参数,为每个冲泡定义自己的冲泡流程", + "添加了更多可编辑的咖啡豆信息,现在可以添加不同的排序", + "水量可渗透/全浸", + "你在哪里冲泡最好的咖啡? 主动设置经纬度保存", + "启用快速复制以立即添加冲泡", + "添加了更新屏幕以显示最新更改", + "在25次使用后向用户请求评分", + "为豆类添加了排序", + "添加了冲泡、咖啡豆的搜索面板", + "冲泡详细信息中添加了杯测图", + "在主页上显示剩余的豆子重量", + "为烘焙机添加了预输入", + "评级改为星级而不是图标" + ] + }, + "5.1.0": { + "TITLE": "版本 5.1: 新玩意儿!", + "DESCRIPTION": [ + "新的冲泡时间选择器", + "现在可以在 iOS 上再次选择烘焙日期", + "可以在 iPad 上再次选择图像", + "TDS 计算现在再次显示在饮料量上", + "为 iOS 设备添加了安全区域" + ] + }, + "5.2.0": { + "TITLE": "版本 5.2: 新玩意儿!", + "DESCRIPTION": [ + "冲泡:", + "冲泡计时器将在后台继续计时", + "可以将冲泡设为喜爱", + "添加和编辑咖啡豆的界面现在看起来几乎完全相同了", + "屏幕在冲泡期间可以保持亮屏(可以在设置菜单中启用)", + "最近的冲泡列表现在还能显示归档的冲泡", + "", + "咖啡豆:", + "咖啡豆照片显示在概览中", + "咖啡豆可以评级", + "", + "互动:", + "长按卡片会进入编辑视图", + "可以通过点击卡片访问详细视图", + "Github / Facebook / Instagram 帐户已关联", + "", + "修复:", + "咖啡豆信息复制不正确", + "新用户默认启用冲泡量", + "", + "其它:", + "Apple Healthkit 集成(可在设置菜单中启用)", + "清理", + "布局更改", + "统计扩展", + "启动检查已修改", + "支持冲泡和咖啡豆的不同卡片大小" + ] + }, + "5.3.1": { + "TITLE": "Version 5.3: Thats new!", + "DESCRIPTION": [ + "Brew methods:", + "Changes to the card view", + "Custom images can be attached in the edit screen", + "Brew tools will be saved in edit screen, even when '+' is not pressed", + "", + "Grinders:", + "Custom images can be attached in the edit screen", + "", + "Brews:", + "Parameter 'Attachments' renamed in 'Attachments / Photos'", + "", + "Dashboard:", + "If bean amount is less then 1000g, the number will be written as a whole", + "", + "Bug fixes:", + "Editing via a long-press, does not change information any more", + "Information on the dashboard are updated after made changes", + "Multiple variety information with blends can be saved again", + "Added startup error message if app-data is missing" + ] + }, + "5.4.0": { + "TITLE": "Version 5.4: Thats new!", + "DESCRIPTION": [ + "烘焙选项:", + "Manage all of your green beans and roasters (can be activated in the settings menu)", + "Save all of your green beans and transfer them into roasted onces", + "Add your roaster and connect them with your different kind of roasted beans", + "", + "Website:", + "Go live of our new website! -> https://beanconqueror.com", + "", + "Support us:", + "You've always wanted to support Beanconqueror? We've added a new 'Buy me a coffee' connection", + "", + "iOS - iCloud:", + "The first step into iCloud support was made. At the very first start all of your existing app data will be moved into the support iCloud directory.", + "You have to activate this option in the iCloud Settings first in order to save Beanconqueror on iCloud", + "", + "Android/iOS - Automated file-export:", + "Automated Beanconqueror.json-File is saved for a maximum of 7 days, after that they will be automated deleted again", + "Android: Download/Beanconqueror_export/Beanconqueror_automatic_export_DAY.json", + "iOS: Files/Download/Beanconqueror_export/Beanconqueror_automatic_export_FILE.json", + "", + "Settings:", + "Excel - Export all of your data to excel to work with it even further", + "Define your own image quality between 50% to 100% (default 100%)", + "Brew rating - Define how much stars/points you'd like to set for each brew. Minimum 5, maximum 100", + "", + "New tracking:", + "We've changed to our open source service Matomo, which will be hosted on our own server", + "Removed Google Analytics / Firebase", + "", + "Bug fixes:", + "Apple Healthkit - Settings were not saved", + "Sometimes brew rating stars weren't filled (Brew add/edit)", + "Edit via long tap, screen wasn't scrollable", + "Import of bigger files on iOS led to misconduct", + "Delete procedure of beans / preparations or mills were not consistent and lead to graphical issues", + "Wrong calculation of beverage quantity in statistics and list views", + "", + "分享:", + "与所有咖啡爱好者分享您的咖啡和咖啡豆!", + "", + "Other:", + "Clean ups", + "Layout changes", + "Extension of statistics", + "Startup check revised, added please wait window", + "Some label changes", + "Changed data access / order inside app to reduce problems" + ] + }, + "6.0.0": { + "TITLE": "Version 6.0: Thats new!", + "DESCRIPTION": [ + "蓝牙电子秤", + "Support of the first bluetooth scale - Decent-Scale - Big thanks to Decent Espresso", + "Support of Acaia Lunar", + "", + "Aroma cupping", + "Cup each brew with the different aromatics and flavors", + "", + "Water section", + "Add your own water, activate this section in the settings", + "", + "Support of more languages", + "Support for spanish - Big thanks to Frank!", + "", + "Improvements", + "Support of long press '+' on brews", + "Added new brew parameters", + "Support of different currencies", + "Edit brew while in detail view", + "Choose multiple images at once", + "Support of brix to TDS conversion", + "If bean package is empty, you'll be asked if you want to archive the package on the last brew", + "Reset of roastdate supported", + "Support of detail views on beans, grinders and preparation methods", + "Added brew ratio (g/l)", + "", + "iOS", + "Support of safe areas", + "", + "Bug fixes", + "Apple Healthkit - Decaffeinated coffee was saved", + "Copy of beans led to misconduct", + "Added brew time to excel export", + "Small bug fixes", + "", + "Others", + "Beans, grinders and preparation methods are now sorted alphabetic in dropdowns" + ] + }, + "6.1.0": { + "TITLE": "版本 6.1: 这些是新东西!", + "DESCRIPTION": [ + "二维码", + "扫描你的咖啡包装! 所有咖啡信息都将从烘焙店中插入。", + "", + "蓝牙电子秤", + "支持 Acaia Pearl 2021 - 感谢 Micah 和 Mike", + "支持 Acaia Lunar 2021 - 感谢 Micah 和 Mike", + "支持 Acaia Pyxis - 感谢 Micah 和 Mike", + "支持Hiroia Jimmy - 感谢 Silas", + "支持 Felicita Arc - 感谢 Herman", + "注意:目前不支持 Acaia Pearl 2021 以下的电子秤", + "咖啡豆页面现在可以使用蓝牙电子秤获得的重量信息", + "现在无需通过计时器开始冲泡即可看到重量变化", + "", + "冲泡概述", + "自定义概览中的可见冲煮参数或针对每种冲泡方法", + "准备图像现在在列表视图中可见", + "", + "冲泡视图", + "重制了冲泡视图,相比以往更加平滑", + "冲泡视图现在可以最大化", + "冲泡视图现在可以在冲泡细节视图中放大以及导出", + "现在显示平均流量", + "", + "咖啡豆", + "添加字段:购买日期、离岸价格、采购价格", + "现在可以收藏和筛选咖啡豆", + "如果咖啡豆被归档,您现在也可以对它进行评分", + "按+,您现在可以选择添加或扫描新的咖啡豆包装", + "长按+,直接添加新的咖啡豆", + "", + "预处理方法", + "预处理方法现在可以重复所有设置", + "支持更多的预处理方法 - 感谢 Nicola", + "选择一个预处理方法并展示图片", + "", + "设置", + "评级现在可以阶梯式进行(1、0.75、0.5、0.25、0.1)", + "蓝牙电子秤 - 定义在开始新的冲泡或启动计时器时是否应将秤设置为零重量", + "蓝牙电子秤 - 定义是否要忽略异常或负值 - 如果是,则无法生成实时图表", + "现在选择, 如果您想在主页上查看存档的咖啡豆", + "导出现在还导出保存的蓝牙值的原始数据", + "", + "改进", + "删除冲泡方法和工具时,不会再删除与其相关的咖啡豆", + "制备方法工具现在可以编辑和存档", + "", + "Bug修复:", + "发现更多可能导致数据丢失的问题", + "小错误修复", + "", + "其它:", + "更新到 Ionic-Framework 6,因此发生了一些小的视觉变化" + ] + }, + "6.1.3": { + "TITLE": "版本 6.1.3: 这些是新东西!", + "DESCRIPTION": [ + "Android - 注意", + "首先:对不起!", + "遗憾的是,数据库在 Android Play 商店中从 APK 格式重置为 AAB 格式,您的应用程序可能会在没有数据的情况下启动。", + "我无法调试或控制这种情况,虽然开发工作都按预期进行。", + "如果您的应用显示空白,请进入设置并导入下面的文件 'Download/Beanconqueror_export/Beanconqueror_automatic_export_*.json' * 代表最新的数据备份。", + "然后所有数据都应该恢复正常,如果没有,请给我写一封电子邮件:info@beanconqueror.com。" + ] + } + }, + "CUSTOM_PARAMETERS": "自定义参数", + "CUSTOM_DEFAULT_PARAMETERS": "默认", + "CUSTOM_MANAGE_PARAMETERS": "管理", + "CUSTOM_SORT_PARAMETERS": "种类", + "BREW_PARAMETER_CUSTOMIZE_TITLE": "自定义每种冲泡器具的参数", + "BREW_PARAMETER_CUSTOMIZE_DESCRIPTION": "您想为每种冲泡器具选择自定义参数吗?跳转到“器具”,打开具体冲泡器具的选项,选择“自定义参数”。现在您可以选择将用于此准备的参数!", + "BREW_DATA_BREW_QUANTITY_TOOLTIP": "不能用于意式浓缩咖啡的水量", + "BREW_DATA_COFFEE_FIRST_DRIP_TIME_TOOLTIP": "第一个可用于意式浓缩咖啡的滴漏咖啡o", + "BREW_DATA_PREPARATION_METHOD_TOOLTIP": "冲泡活动时可自定义", + "PAGE_SETTINGS_GENERAL": "常规设置", + "EDIT_PREPARATION_CUSTOM_PARAMETERS": "自定义参数", + "ENABLE_PREPARATION_CUSTOM_PARAMETERS": "使用个人参数", + "BEAN_ADD_ANOTHER_SORT": "添加另一种类", + "BEAN_SORT": "种类", + "BEAN_SORT_INFORMATION": "变化信息", + "BEAN_SORT_MORE_INFORMATION": "更多信息", + "NAVIGATE_TO_PREPARATION_METHODS": "跳转到冲泡页面", + "PREPARATION_TOOLS": "冲泡器具", + "PREPARATION_TOOLS_INFORMATION": "为您的过滤器添加不同的容器. 对于 V60 滤杯 或 123 添加例如 布、纸或网状过滤器", + "PREPARATION_TOOLS_PLACEHOLDER": "纸或布过滤器、VST-20g、14g-Basket等。", + "PREPARATION_PARAMETERS_CUSTOMIZED": "参数自定义", + "BEANS_WEIGHT_AVAILABLE": "可用的咖啡豆", + "SORT_ORDER": "改变顺序", + "ASCENDING": "升序", + "DESCENDING": "倒序", + "SORT_AFTER": "排序", + "BEAN_SORT_NAME_OF_BEAN": "咖啡豆名称", + "BEAN_SORT_ROASTER": "烘焙机", + "BEAN_SORT_ROASTING_DATE": "烘焙日期", + "BEAN_TAB_ROAST_INFORMATION": "烘焙信息", + "BEAN_TAB_GENERAL_INFORMATION": "常规", + "BEAN_TAB_SORT_INFORMATION": "品种信息", + "PAGE_SETTINGS_MANAGE_ARCHIVE": "管理归档", + "LAST_USE": "上一次使用在", + "SEARCH": "搜索", + "OVERVIEW": "概览", + "BEAN_HEADER_ADDITIONALE_INFORMATION": "附加信息", + "THREE_DEE_TOUCH_ACTION_BREW": "冲泡", + "THREE_DEE_TOUCH_ACTION_BEAN": "咖啡豆", + "THREE_DEE_TOUCH_ACTION_PREPARATION": "冲泡器具", + "THREE_DEE_TOUCH_ACTION_MILL": "研磨机", + "PAGE_CREDITS_NOT_EXISTING": "无内容", + "TIMER_HOUR": "小时", + "TIMER_MINUTES": "分钟", + "TIMER_SECONDS": "秒", + "EXCEL": { + "BEAN": { + "CREATION_DATE": "创建日期", + "ID": "咖啡豆编号" + }, + "PREPARATION": { + "CREATION_DATE": "创建日期", + "ID": "器具编号" + }, + "GRINDER": { + "CREATION_DATE": "创建日期", + "ID": "工厂编号" + } + }, + "EXCEL_EXPORT": "导出为Excel", + "HEALTH_KIT_QUESTION_TITLE": "节省咖啡因消耗", + "HEALTH_KIT_QUESTION_MESSAGE": "通过启用,每次冲泡中占用的咖啡因将自动保存在 Apple Health 中", + "NAV_ROASTING_SECTION": "烘焙", + "ROASTING_SECTION": { + "NAV_GREEN_BEANS": "生豆", + "NAV_ROASTING_MACHINE": "烘焙机", + "ROASTING_MACHINE": { + "TOTAL_ROAST_QUANTITY": "烘焙出的咖啡豆", + "TOTAL_ROAST_COUNT": "烘焙次数" + }, + "GREEN_BEAN": { + "ADD": "添加", + "EDIT": "编辑", + "DETAIL": "生豆详情", + "ROASTABLE": "待烘焙", + "NO_ROASTS_YET": "目前还没有烘焙" + }, + "BEAN": { + "DROP_TEMPERATURE": "烘焙的最终温度", + "ROAST_LENGTH": "烘焙时长", + "ROASTER_MACHINE": "烘焙机", + "GREEN_BEAN_WEIGHT": "生豆重量", + "OUTSIDE_TEMPERATURE": "气温", + "HUMIDITY": "湿度", + "FIRST_CRACK_MINUTE": "一爆分钟", + "FIRST_CRACK_TEMPERATURE": "一爆温度", + "SECOND_CRACK_MINUTE": "二爆分钟", + "SECOND_CRACK_TEMPERATURE": "二爆温度", + "PLACE_HOLDER": { + "DROP_TEMPERATURE": "烘焙的最终温度", + "ROAST_LENGTH": "烘焙时长", + "ROASTER_MACHINE": "烘焙机", + "GREEN_BEAN_WEIGHT": "生豆重量", + "OUTSIDE_TEMPERATURE": "气温", + "HUMIDITY": "湿度", + "FIRST_CRACK_MINUTE": "一爆分钟", + "FIRST_CRACK_TEMPERATURE": "一爆温度", + "SECOND_CRACK_TEMPERATURE": "二爆温度", + "SECOND_CRACK_MINUTE": "二爆分钟" + } + } + }, + "PAGE_SETTINGS_MANAGE_SECTIONS": "更多选项卡", + "PAGE_SETTINGS_SHOW_ROASTING_SECTION": "启用烘焙选项卡", + "PAGE_SETTINGS_SHOW_WATER_SECTION": "启用水质选项卡", + "PAGE_SETTINGS_SHOW_CUPPING_SECTION": "启用杯测选项", + "BEAN_DATA_BUY_DATE": "购买日期", + "BEAN_SORT_CREATION_DATE": "创建日期", + "BEAN_SORT_PURCHASE_DATE": "购买日期", + "BEAN_ROAST_COUNT": "烘焙度", + "TRANSFER_ROAST": "烘焙", + "BEAN_TAB_LINKED_ROASTS": "烘焙", + "BEAN_DATA_WEIGHT_AFTER_ROASTING": "烘焙后的重量", + "TOAST_GREEN_BEAN_ADDED_SUCCESSFULLY": "生豆已添加成功", + "TOAST_GREEN_BEAN_EDITED_SUCCESSFULLY": "生豆已编辑成功", + "TOAST_GREEN_BEAN_ARCHIVED_SUCCESSFULLY": "生豆已归档成功", + "TOAST_ROASTING_MACHINE_ADDED_SUCCESSFULLY": "烘焙机已添加成功", + "TOAST_ROASTING_MACHINE_EDITED_SUCCESSFULLY": "烘焙机已编辑成功", + "TOAST_ROASTING_MACHINE_ARCHIVED_SUCCESSFULLY": "烘焙机已归档成功", + "DELETE_ROASTING_MACHINE_QUESTION": "删除烘焙机?所有相关已经烘焙后的咖啡豆都将更新,不会被删除", + "TOAST_ROASTING_MACHINE_DELETED_SUCCESSFULLY": "烘焙机已删除成功", + "EDIT_ROASTING_MACHINE": "编辑", + "DETAIL_ROASTING_MACHINE": "烘焙详情", + "DELETE_WATER_QUESTION": "删除水质?所有相关已经烘焙后的咖啡豆都将更新,不会被删除", + "ROASTING_MACHINE": { + "PLACE_HOLDER": { + "NAME": "添加名称", + "NOTES": "为烘焙机添加注释" + } + }, + "NAV_ROASTING_MACHINE": "烘焙机", + "PAGE_ROASTING_MACHINE_LIST_NO_MACHINES_EXISTING": "您没有添加任何烘焙机", + "PAGE_ROASTING_MACHINE_LIST_NO_ARCHIVED_MACHINES_EXISTING": "您没有归档任何烘焙机", + "CHOOSE_ROASTING_MACHINES": "选择烘焙机", + "CHOOSE_ROASTING_MACHINE": "选择烘焙机", + "POPOVER_BREWS_OPTION_TOGGLE_FAVOURITE": "喜爱", + "TOAST_BREW_FAVOURITE_ADDED": "已添加为喜爱", + "TOAST_BREW_FAVOURITE_REMOVED": "已从喜爱中删除", + "BREW_FILTER_JUST_FAVOURITE": "喜爱", + "STATISTICS_PREPARATION_USAGES": "器具用途", + "STATISTICS_PREPARATION_TIMELINE_USAGES": "器具的使用历史", + "STATISTICS_GRINDER_TIMELINE_USAGES": "研磨机的使用历史", + "ACCEPT": "接受", + "STATISTIC_TAB_GENERAL": "常规", + "STATISTIC_TAB_BREWS": "冲泡", + "STATISTIC_TAB_BEANS": "咖啡豆", + "STATISTIC_TAB_PREPARATIONS": "冲泡器具", + "STATISTIC_TAB_GRINDERS": "研磨机", + "PAGE_STATISTICS_BREW_PER_DAYPROCESSES": "每天冲泡", + "PAGE_STATISTICS_BREW_TIME": "冲泡时间", + "PAGE_STATISTICS_PHOTOS_TAKEN": "拍摄的照片", + "PAGE_SETTINGS_IMAGE_QUALITY": "图像质量", + "PAGE_SETTINGS_IMAGE_QUALITY_TOOLTIP": "定义图像加载质量,这可以降低您的数据使用量。", + "PAGE_SETTINGS_BREW_RATING": "冲泡评分", + "PAGE_SETTINGS_BREW_RATING_TOOLTIP": "对冲泡进行-1到5分的评分太少了吗?你最高可以设置到100的评分区间", + "UPDATE_ENTRY_OF": "Update entry {{index}} of {{count}}", + "WEBSITE": "网站", + "SHARE": "分享", + "ANDROID_FILE_ACCESS_NEEDED_TITLE": "需要授权文件访问权限", + "ANDROID_FILE_ACCESS_NEEDED_DESCRIPTION": "为了让应用程序充分发挥作用,我们需要您授权文件访问。 否则应用程序内会有部分功能受限。 这是自动备份功能所需要的权限。", + "COULD_NOT_ACCESS_FILE": "我们无法访问所选文件", + "WRONG_FILE_FORMAT": "您选择了不受支持的文件格式", + "SCAN_BEAN": "扫描包", + "CLEAR": "清除", + "BEAN_LOOKS_LIKE_CONSUMED": "这包咖啡豆看起来已经完全消耗了,要将它归档吗?", + "CUPPING_1": "水果(Fruit)", + "CUPPING_2": "柑橘类(Citrus)", + "CUPPING_3": "柠檬和柠檬水(Lemo)", + "CUPPING_4": "酸橙(Lime)", + "CUPPING_5": "西柚(Grapefruit)", + "CUPPING_6": "小柑橘(Clementine)", + "CUPPING_7": "柑橘(Tangerine)", + "CUPPING_8": "砂糖橘(Mandarin orange)", + "CUPPING_9": "橙子(Orange)", + "CUPPING_10": "苹果/梨(Apple/pear)", + "CUPPING_11": "绿苹果(Green apple)", + "CUPPING_12": "红苹果(Red apple)", + "CUPPING_13": "瓜(Melon)", + "CUPPING_14": "西瓜(Watermelon)", + "CUPPING_15": "甜瓜(Honeydew)", + "CUPPING_16": "哈密瓜(Cantaloupe)", + "CUPPING_17": "葡萄(Grape)", + "CUPPING_18": "白葡萄(White grape)", + "CUPPING_19": "绿葡萄(Green grape)", + "CUPPING_20": "红葡萄(Red grape)", + "CUPPING_21": "康科德葡萄(Concord grape)", + "CUPPING_22": "热带水果(Tropical fruit)", + "CUPPING_23": "荔枝(Lychee)", + "CUPPING_24": "杨桃(Star fruit)", + "CUPPING_25": "酸角(Tamarind)", + "CUPPING_26": "百香果(Passion fruit)", + "CUPPING_27": "菠萝(Pineapple)", + "CUPPING_28": "芒果(Mango)", + "CUPPING_29": "木瓜(Papaya)", + "CUPPING_30": "猕猴桃(Kiwi)", + "CUPPING_31": "香蕉(Banana)", + "CUPPING_32": "椰子(Coconut)", + "CUPPING_33": "核果(Stone fruit)", + "CUPPING_34": "桃子(Peach)", + "CUPPING_35": "油桃(Nectarine)", + "CUPPING_36": "杏(Apricot)", + "CUPPING_37": "李子(Plum)", + "CUPPING_38": "樱桃(Cherry)", + "CUPPING_39": "黑樱桃(Black cherry)", + "CUPPING_40": "浆果类(Berry)", + "CUPPING_41": "蔓越莓(Cranberry)", + "CUPPING_42": "覆盆子(Raspberry)", + "CUPPING_43": "草莓(Strawberry)", + "CUPPING_44": "蓝莓(Blueberry)", + "CUPPING_45": "红加仑(Red currant)", + "CUPPING_46": "黑加仑(Black currant)", + "CUPPING_47": "干果类(Dried fruit)", + "CUPPING_48": "红葡萄干(Golden raisin)", + "CUPPING_49": "葡萄干(Raisin)", + "CUPPING_50": "无花果干(Dried fig)", + "CUPPING_51": "枣干(ried dates)", + "CUPPING_52": "梅干(Prune)", + "CUPPING_53": "甜味和烘培(Sweet & Roasting Notes)", + "CUPPING_54": "巧克力(Chocolate)", + "CUPPING_55": "可可碎(Cacao nibs)", + "CUPPING_56": "黑巧(Dark chocolate)", + "CUPPING_57": "贝克巧克力(Bakers chocolate)", + "CUPPING_58": "Bittersweet chocolate", + "CUPPING_59": "可可粉(Cocoa powder)", + "CUPPING_60": "牛奶巧克力(Milk chocolate)", + "CUPPING_61": "坚果类(Nut)", + "CUPPING_62": "核桃(Walnut)", + "CUPPING_63": "花生(Peanut)", + "CUPPING_64": "腰果(Cashew)", + "CUPPING_65": "山核桃(Pecan)", + "CUPPING_66": "榛子(Hazelnut)", + "CUPPING_67": "杏仁(Almond)", + "CUPPING_68": "谷物(Grain & Cereal)", + "CUPPING_69": "Sweet bread pastry", + "CUPPING_70": "格兰诺拉麦片(Granola)", + "CUPPING_71": "全麦饼干(Graham cracker)", + "CUPPING_72": "黑麦(Rye)", + "CUPPING_73": "小麦(Wheat)", + "CUPPING_74": "大麦(Barley)", + "CUPPING_75": "新鲜面包(Fresh bread)", + "CUPPING_76": "甜味和糖类(Sweet & Sugary)", + "CUPPING_77": "香草(Vanila)", + "CUPPING_78": "牛轧糖(Nougat)", + "CUPPING_79": "蜂蜜(Honey)", + "CUPPING_80": "黄油(Butter)", + "CUPPING_81": "奶油(Cream)", + "CUPPING_82": "棉花糖(Marshmallow)", + "CUPPING_83": "甘蔗(Sugarcane)", + "CUPPING_84": "红糖(Brown sugar)", + "CUPPING_85": "焦糖(Caramel)", + "CUPPING_86": "枫糖浆(Maple syrup)", + "CUPPING_87": "糖浆(Molasses)", + "CUPPING_88": "可乐(Cola)", + "CUPPING_89": "烘焙(Roast)", + "CUPPING_90": "吐司(Toast)", + "CUPPING_91": "焦糖(Burnt sugar)", + "CUPPING_92": "烟熏(Smokey)", + "CUPPING_93": "木炭(Carbon)", + "CUPPING_94": "植物、咸味食物和香料(Vegetal, Savory & Spices)", + "CUPPING_95": "香料(Spice)", + "CUPPING_96": "黑胡椒(Black pepper)", + "CUPPING_97": "白胡椒(White pepper)", + "CUPPING_98": "肉桂(Cinnamon)", + "CUPPING_99": "芫荽、香菜(Coriander)", + "CUPPING_100": "生姜(Ginger)", + "CUPPING_101": "肉豆蔻(Nutmeg)", + "CUPPING_102": "咖喱(Curry)", + "CUPPING_103": "甘草-茴香Licorice-anise", + "CUPPING_104": "丁香(Clove)", + "CUPPING_105": "咸味食物(Savory)", + "CUPPING_106": "Leathery", + "CUPPING_107": "Meat-like", + "CUPPING_108": "酱油(Soy sauce)", + "CUPPING_109": "番茄干(Sundried tomato)", + "CUPPING_110": "番茄(Tomato)", + "CUPPING_111": "植物泥土草药(Vegetal Earthy Herb)", + "CUPPING_112": "土壤(Soil)", + "CUPPING_113": "新鲜木材(Fresh wood)", + "CUPPING_114": "雪松(Cedar)", + "CUPPING_115": "烟草(Tobacco)", + "CUPPING_116": "干草/稻草(Hay / straw)", + "CUPPING_117": "绿叶蔬菜(Leafy greens)", + "CUPPING_118": "橄榄(Olive)", + "CUPPING_119": "青椒(Green pepper)", + "CUPPING_120": "南瓜(Squash)", + "CUPPING_121": "蘑菇(Mushroom)", + "CUPPING_122": "甜豌豆(Sweet pea)", + "CUPPING_123": "荷兰豆(Snow pea)", + "CUPPING_124": "草(Grassy)", + "CUPPING_125": "茴香(Dill)", + "CUPPING_126": "鼠尾草(Sage)", + "CUPPING_127": "薄荷(Mint)", + "CUPPING_128": "绿茶(Green tea)", + "CUPPING_129": "红茶(Black tea)", + "CUPPING_130": "啤酒花(Hops)", + "CUPPING_131": "佛手柑(Bergamot)", + "CUPPING_132": "花类(Flowery)", + "CUPPING_133": "花(Floral)", + "CUPPING_134": "木槿花(Hibiscus)", + "CUPPING_135": "蔷薇果(Rose hips)", + "CUPPING_136": "薰衣草(Lavender)", + "CUPPING_137": "木兰花(Magnolia)", + "CUPPING_138": "茉莉、金银花(Jasmine honeysuckle)", + "CUPPING_139": "橙花(Orange blossom)", + "CUPPING_140": "香茅(Lemongrass)", + "WATER_SECTION": { + "NAV_WATER": "水质", + "YOU_GOT_NO_ARCHIVED_WATER": "你还没有归档任何水质", + "YOU_GOT_NO_WATER": "你还没有添加任何水质", + "CATEGORY_INFORMATION": "水质信息", + "CATEGORY_GENERAL": "常规", + "WATER_BOTTLE_EXPLANATION": "水质通常以 ppm = mg/L 为单位表示浓度", + "USED_TIMES": "使用次数", + "AMOUNT": "使用量", + "WATER": { + "GENERAL_HARDNESS": "一般硬度 (GH)", + "TOTAL_ALKALINITY": "总碱度 (KH)", + "CALCIUM": "钙 (Ca)", + "MAGNESIUM": "镁 (Mg)", + "SODIUM": "钠 (Na)", + "TDS": "总溶解固体 (TDS)", + "UNITS": "单位", + "PLACE_HOLDER": { + "GENERAL_HARDNESS": "一般硬度", + "TOTAL_ALKALINITY": "总碱度", + "CALCIUM": "钙 (Ca)", + "MAGNESIUM": "镁 (Mg)", + "SODIUM": "钠 (Na)", + "TDS": "总溶解固体 (TDS)", + "NAME": "添加水的名称", + "NOTES": "为水质添加注释" + }, + "WATER_UNIT": { + "UNKNOWN": "不清楚", + "PPM": "以CaCO3计量ppm", + "MG_L": "mg/L", + "MMOL_L": "mmol/L", + "DH": "°dH" + } + } + }, + "BREW_BRIX_CALCULATION": "白利糖度", + "SET_TDS": "设置 tds", + "TOTAL_WEIGHT": "总重量", + "CALCULATED_WEIGHT": "计算重量", + "SET_WEIGHT": "设置重量", + "ADD_FLAVORS_AROMAS_TITLE": "香气/风味", + "CUSTOM_FLAVORS_AROMAS": "自定义香气", + "CUSTOM_FLAVORS_AROMAS_PLACEHOLDER": "以自己的语言描述它的香气", + "PREDEFINED_FLAVORS_AROMAS": "常见的香气", + "ADD_AROMA_FLAVOR": "添加香气/风味", + "BEAN_WEIGHT_IN_PLACEHOLDER": "从咖啡包装中取出的咖啡豆", + "VESSEL_PLACEHOLDER": "容器名和净重", + "GRIND_WEIGHT_PLACEHOLDER": "用于冲泡的咖啡粉的重量", + "PRESET_BREW_TITLE": "使用最后一次冲泡作为预设", + "CUPPING_BREW_TAB_AROMA": "香气", + "CUPPING_BREW_TAB_TASTING": "评分", + "WATER_PLACEHOLDER": "如需完整功能,请在设置菜单中激活水质部分", + "PAGE_SETTINGS_SCALES": "电子秤", + "CONNECT": "连接", + "DISCONNECT": "断开连接", + "SCALE": { + "BLUETOOTH_SCAN_RUNNING": "正在搜索附件的电子秤,请稍等60秒", + "BLUETOOTH_NOT_ENABLED": "未开启蓝牙,请开启蓝牙以进行搜索", + "CONNECTION_NOT_ESTABLISHED": "附近找不到电子秤或是无法建立连接", + "CONNECTED_SUCCESSFULLY": "电子秤已连接", + "DISCONNECTED_SUCCESSFULLY": "电子秤已断开连接", + "DISCONNECTED_UNPLANNED": "电子秤意外断开", + "REQUEST_PERMISSION": { + "LOCATION": "软件需要位置权限来搜索电子秤", + "BLUETOOTH": "软件需要蓝牙权限来搜索电子秤" + }, + "INFORMATION_DESCRIPTION": "支持的电子秤: Decent 电子秤, Acaia 电子秤, Felicita 电子秤以及 Hiroia Jimmy" + }, + "QR": { + "WRONG_QRCODE_DESCRIPTION": "错误的二维码或错误的内容", + "WRONG_QRCODE_TITLE": "错误", + "WRONG_LINK_DESCRIPTION": "错误的应用链接", + "WRONG_LINK_TITLE": "错误", + "SERVER": { + "ERROR_OCCURED": "出现错误,无法读取二维码,请重试。" + }, + "BEAN_SUCCESSFULLY_SCANNED": "咖啡豆扫描成功", + "IMAGES_GETTING_DOWNLOADED": "正在下载的图像" + }, + "RETRY_CONNECT": "重试连接", + "SMART_SCALE_STAY_CONNECTED_ON_APP_MINIMIZE": "即使应用程序被最小化/非活动状态,也让电子秤连接", + "BREW_FLOW_WEIGHT": "重量", + "BREW_FLOW_WEIGHT_PER_SECOND": "流速", + "ROAST_TYPE_UNKNOWN": "不清楚", + "ROAST_TYPE_CINNAMON_ROAST": "浅烘焙(Cimon Roast)", + "ROAST_TYPE_AMERICAN_ROAST": "美式烘焙(American Roast)", + "ROAST_TYPE_NEW_ENGLAND_ROAST": "新英格兰烘焙(New England Roast)", + "ROAST_TYPE_HALF_CITY_ROAST": "半城市烘焙(Half City Roast)", + "ROAST_TYPE_MODERATE_LIGHT_ROAST": "Moderate-Light Roast", + "ROAST_TYPE_CITY_ROAST": "中深度烘焙(City Roast)", + "ROAST_TYPE_CITY_PLUS_ROAST": "City+ Roast", + "ROAST_TYPE_FULL_CITY_ROAST": "微深度烘焙(Full City Roast)", + "ROAST_TYPE_FULL_CITY_PLUS_ROAST": "深度烘焙(Full City + Roast)", + "ROAST_TYPE_ITALIAN_ROAST": "极深度烘焙(Italian Roast)", + "ROAST_TYPE_VIEANNA_ROAST": "维也纳烘焙(Vienna Roast)", + "ROAST_TYPE_FRENCH_ROAST": "法式烘焙(French Roast)", + "ROAST_TYPE_CUSTOM_ROAST": "自定义", + "BEAN_MIX_UNKNOWN": "不清楚", + "BEAN_MIX_SINGLE_ORIGIN": "单一产地", + "BEAN_MIX_BLEND": "拼配", + "BEAN_ROASTING_TYPE_FILTER": "滴滤式/Filter", + "BEAN_ROASTING_TYPE_ESPRESSO": "意式浓缩/Espresso", + "BEAN_ROASTING_TYPE_OMNI": "均可/Omni", + "BEAN_ROASTING_TYPE_UNKNOWN": "不清楚", + "SMART_SCALE_LOG": "为智能电子秤激活日志文件(仅用于发送日志进行调试)", + "TOAST_PREPARATION_TOOL_EDITED_SUCCESSFULLY": "杯测工具编辑", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE": "蓝牙电子秤", + "PAGE_SETTINGS_TAB_GENERAL": "常规", + "SMART_SCALE_TARE_ON_BREW": "在开始新的冲泡时去皮", + "SMART_SCALE_TARE_ON_START_TIMER": "当定时器启动时去皮", + "PAGE_SETTINGS_BREW_RATING_STEPS": "评级步骤", + "BREW_AVG_FLOW_WEIGHT_PER_SECOND": "Ø 流速", + "CUSTOM_LIST_VIEW_PARAMETERS": "列表视图参数", + "NAV_LIST_VIEW_CUSTOM_PARAMETERS": "列表视图参数", + "PAGE_LIST_VIEW_CUSTOM_PARAMETERS_DESCRIPTION": "决定你的咖啡冲泡的哪个参数,应该显示在列表视图上", + "BREW_DATA_VESSEL_NAME_WEIGHT": "容器 名称/重量", + "IGNORE_NEGATIVE_VALUES": "忽略负重量值", + "IGNORE_ANOMALY_VALUES": "忽略异常值", + "IGNORE_ANOMALY_VALUES_TOOLTIP": "例如:在秤上旋转杯子", + "TOAST_BEAN_FAVOURITE_ADDED": "喜爱已添加", + "TOAST_BEAN_FAVOURITE_REMOVED": "喜爱已移除", + "QR_CODE_SCANNER_INFORMATION_TITLE": "二维码", + "QR_CODE_SCANNER_INFORMATION_DESCRIPTION": "所有扫描的咖啡豆信息都直接来自烘焙店。
如果您发现错误或误导性信息,请通过电子邮件通知我: info@beanconqueror.com.", + "DONT_SHOW_AGAIN": "不再显示", + "ARCHIVED_TOOLS": "归档工具", + "UNARCHIVE": "取消归档", + "PAGE_SETTINGS_HIDE_ARCHIVED_BREWS_DASHBOARD": "在仪表盘上显示已归档的冲泡", + "PAGE_SETTINGS_HIDE_ARCHIVED_BREWS_DASHBOARD_DESCRIPTION": "已归档的冲泡应该显示在主页上吗?", + "COPY": "复制", + "TOAST_PREPARATION_METHOD_REPEATED_SUCCESSFULLY": "杯测方法复制成功", + "PREPARATION_TYPE_CAFEC_FLOWER": "Cafec 花辦滤杯(Cafec Flower)", + "PREPARATION_TYPE_DECEMBER_DRIPPER": "December 可调咖啡滤杯(December Dripper)", + "PREPARATION_TYPE_DECENT_ESPRESSO": "Decent Espresso", + "PREPARATION_TYPE_HARIO_SWITCH": "Hario Switch 聪明杯", + "PREPARATION_TYPE_HARIO_WOODNECK": "Hario Woodneck 滤布", + "PREPARATION_TYPE_RATIO_SIX_COFFEE_BREWER": "Ratio Six Coffee Brewer", + "PREPARATION_TYPE_ROK": "ROK 手压咖啡机", + "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo", + "PREPARATION_TYPE_TRICOLATE": "Tricolate 聪明杯" +} diff --git a/src/classes/devices/eurekaPrecisaScale.ts b/src/classes/devices/eurekaPrecisaScale.ts new file mode 100644 index 000000000..be8741c27 --- /dev/null +++ b/src/classes/devices/eurekaPrecisaScale.ts @@ -0,0 +1,189 @@ +import { Platforms } from '@ionic/core'; +import {PeripheralData} from './ble.types'; +import {BluetoothScale, SCALE_TIMER_COMMAND, Weight} from './bluetoothDevice'; +import { Logger } from './common/logger'; + +const DEVICE_NAME = 'CFS-9002'; + +const DATA_SERVICE = 'FFE0'; +const DATA_CHARACTERISTIC = 'FFE1'; +const CMD_CHARACTERISTIC = 'FFE2'; + +const EURECA_PRECISA_GRAM_UNIT = 'g'; +const EURECA_PRECISA_OUNCE_UNIT = 'oz'; +const EURECA_PRECISA_MILLILITERS_UNIT = 'ml'; + +const CMD_HEADER = 0xAA; +const CMD_BASE = 0x02; +const CMD_START_TIMER = 0x33; +const CMD_STOP_TIMER = 0x34; +const CMD_RESET_TIMER = 0x35; +const CMD_TARE = 0x31; + +const CMD_UNIT_BASE = 0x0336; +const CMD_UNIT_GRAM = 0x00; +const CMD_UNIT_OUNCE = 0x01; +const CMD_UNIT_ML = 0x02; + +declare var ble; + +/** + * Provides BluetoothScale integration for EURECA PRECISA Scales. + */ +export default class EurekaPrecisaScale extends BluetoothScale { + + // Constructor + + constructor(data: PeripheralData, platforms: Platforms[]) { + super(data, platforms); + this.batteryLevel = 0; + this.scaleUnit = EURECA_PRECISA_GRAM_UNIT; + this.logger = new Logger('EurekaPrecisaScale'); + + this.connect(); + } + + // Accessors + + public getWeight() { + return this.weight.actual; + } + + public getSmoothedWeight() { + return this.weight.smoothed; + } + + public getOldSmoothedWeight() { + return this.weight.old; + } + + public async setTimer(command: SCALE_TIMER_COMMAND) { + this.logger.log("Setting Timer command " + command + "..."); + + if (command === SCALE_TIMER_COMMAND.START) { + await this.startTimer(); + } else if (command === SCALE_TIMER_COMMAND.STOP) { + await this.stopTimer(); + } else { + await this.resetTimer(); + } + } + + // Public Methods + + public async connect() { + this.logger.log("Connecting..."); + + await this.attachNotification(); + } + + /** + * Tares the Scale current weight to 0; + */ + public async tare() { + this.logger.log("Taring..."); + + await this.write([CMD_HEADER, CMD_BASE, CMD_TARE, CMD_TARE]); + + this.weight.smoothed = 0; + this.weight.actual = 0; + this.weight.oldSmoothed = 0; + this.weight.old = 0; + + this.setWeight(0); + } + + + /** + * Checks if this class supports interaction with @param device. + * @param device The device being checked for support. + * @returns boolean If support is provided for device. + */ + public static test(device): boolean { + return device && device.name && [DEVICE_NAME].includes(device.name); + } + + public disconnectTriggered(): void { + this.logger.log("Disconnecting..."); + + this.deattachNotification() + } + + // Private Methods + + /** + * Writes a @param _bytes payload to Scale via BLE. + * @param _bytes the payload to be written. + * @returns Asyncronous in nature, returns a callback. + */ + //TODO write without confirm! + private write(_bytes: number[]) { + return new Promise((resolve, reject) => { + ble.write(this.device_id, + DATA_SERVICE, + CMD_CHARACTERISTIC, + new Uint8Array(_bytes).buffer, + (e) => { resolve(true); }, + (e) => { resolve(false); }); + }); + } + + private async attachNotification() { + ble.startNotification(this.device_id, DATA_SERVICE, DATA_CHARACTERISTIC, + async (_data) => { this.parseStatusUpdate(new Uint8Array(_data)); }, (_data) => { } + ); + } + + /** + * Eureka Scales provide status updates via a 11 length unsigned integer array. + * @param scaleRawStatus The 11 length unsigned integer array retreived from BLE. + */ + private parseStatusUpdate(scaleRawStatus: Uint8Array) { + + this.logger.log("scaleRawStatus received is: " + scaleRawStatus); + + let is_neg = scaleRawStatus[5]; + let weight = scaleRawStatus[6] + (scaleRawStatus[7] << 8); + + weight = is_neg ? weight * -1: weight; + + this.setWeight(weight / 10); + } + + private async startTimer() { + this.write([CMD_HEADER, CMD_BASE, CMD_START_TIMER, CMD_START_TIMER]); + } + + private async resetTimer() { + this.write([CMD_HEADER, CMD_BASE, CMD_RESET_TIMER, CMD_RESET_TIMER]); + } + + private async stopTimer() { + this.write([CMD_HEADER, CMD_BASE, CMD_STOP_TIMER, CMD_STOP_TIMER]); + } + + private async deattachNotification() { + ble.stopNotification(this.device_id, DATA_SERVICE, DATA_CHARACTERISTIC, + (e) => { + + }, + (e) => { + + }); + } + + // Class Members + + private logger: Logger; + + public scaleUnit = EURECA_PRECISA_GRAM_UNIT; + + public batteryLevel: number; + + protected weight: Weight = { + actual: 0, + old: 0, + smoothed: 0, + oldSmoothed: 0, + }; +} diff --git a/src/classes/devices/index.ts b/src/classes/devices/index.ts index 34b124afc..efbba6ffc 100644 --- a/src/classes/devices/index.ts +++ b/src/classes/devices/index.ts @@ -5,9 +5,7 @@ import DecentScale from './decentScale'; import FelicitaScale from './felicitaScale'; import JimmyScale from './jimmyScale'; import LunarScale from './lunarScale'; -import { PressureDevice } from './pressureBluetoothDevice'; -import PopsiclePressure from './popsiclePressure'; -import TransducerDirectPressure from './transducerDirectPressure'; +import EurekaPrecisaScale from './eurekaPrecisaScale'; export { BluetoothScale, SCALE_TIMER_COMMAND } from './bluetoothDevice'; export { default as DecentScale } from './decentScale'; @@ -19,18 +17,10 @@ export enum ScaleType { LUNAR = 'LUNAR', JIMMY = 'JIMMY', FELICITA = 'FELICITA', + EUREKAPRECISA = 'EUREKAPRECISA', } -export enum PressureType { - POPSICLE = 'POPSICLE', - DIRECT = 'DIRECT', -} - -export function makeDevice( - type: ScaleType, - data: PeripheralData, - platforms: Platforms[] -): BluetoothScale { +export function makeDevice(type: ScaleType, data: PeripheralData, platforms: Platforms[]): BluetoothScale { switch (type) { case ScaleType.DECENT: return new DecentScale(data, platforms); @@ -40,21 +30,8 @@ export function makeDevice( return new JimmyScale(data, platforms); case ScaleType.FELICITA: return new FelicitaScale(data, platforms); - default: - return null; - } -} - -export function makePressureDevice( - type: PressureType, - data: PeripheralData, - platforms: Platforms[] -): PressureDevice { - switch (type) { - case PressureType.POPSICLE: - return new PopsiclePressure(data, platforms); - case PressureType.DIRECT: - return new TransducerDirectPressure(data, platforms); + case ScaleType.EUREKAPRECISA: + return new EurekaPrecisaScale(data, platforms); default: return null; } From 2935208d8360f23488a70566157ed735d63a9e14 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Fri, 22 Jul 2022 17:04:44 +0200 Subject: [PATCH 46/78] Updated ionic package --- src/app/app.component.ts | 639 ++++++++++++++++++++--------------- src/classes/devices/index.ts | 30 +- 2 files changed, 398 insertions(+), 271 deletions(-) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index be4519e6e..f7f214138 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,17 +1,30 @@ -import { AfterViewInit, Component, ViewChild, ViewEncapsulation } from '@angular/core'; +import { + AfterViewInit, + Component, + ViewChild, + ViewEncapsulation, +} from '@angular/core'; import { Router } from '@angular/router'; import { AppMinimize } from '@ionic-native/app-minimize/ngx'; import { Globalization } from '@ionic-native/globalization/ngx'; import { Keyboard } from '@ionic-native/keyboard/ngx'; import { SplashScreen } from '@ionic-native/splash-screen/ngx'; import { StatusBar } from '@ionic-native/status-bar/ngx'; -import { ThreeDeeTouch, ThreeDeeTouchQuickAction } from '@ionic-native/three-dee-touch/ngx'; -import { IonRouterOutlet, MenuController, ModalController, Platform } from '@ionic/angular'; +import { + ThreeDeeTouch, + ThreeDeeTouchQuickAction, +} from '@ionic-native/three-dee-touch/ngx'; +import { + IonRouterOutlet, + MenuController, + ModalController, + Platform, +} from '@ionic/angular'; import { TranslateService } from '@ngx-translate/core'; import { Chart, registerables } from 'chart.js'; /** Third party */ import moment from 'moment'; -import {PressureType, ScaleType} from 'src/classes/devices'; +import { PressureType, ScaleType } from 'src/classes/devices'; import { Settings } from '../classes/settings/settings'; import LINK_TRACKING from '../data/tracking/linkTracking'; import STARTUP_TRACKING from '../data/tracking/startupTracking'; @@ -43,8 +56,8 @@ import { UIUpdate } from '../services/uiUpdate'; import { UiVersionStorage } from '../services/uiVersionStorage'; import { UIWaterStorage } from '../services/uiWaterStorage'; import { Device } from '@ionic-native/device/ngx'; -import {AppVersion} from '@ionic-native/app-version/ngx'; -import {Storage} from '@ionic/storage'; +import { AppVersion } from '@ionic-native/app-version/ngx'; +import { Storage } from '@ionic/storage'; import 'chartjs-adapter-luxon'; import ChartStreaming from 'chartjs-plugin-streaming'; import zoomPlugin from 'chartjs-plugin-zoom'; @@ -59,34 +72,122 @@ declare var window; export class AppComponent implements AfterViewInit { public toggleAbout: boolean = false; public registerBackFunction: any; - @ViewChild(IonRouterOutlet, { static: false }) public routerOutlet: IonRouterOutlet; + @ViewChild(IonRouterOutlet, { static: false }) + public routerOutlet: IonRouterOutlet; public pages = { home: { title: 'NAV_HOME', url: '/', icon: 'home-outline', active: true }, - scale: { title: 'SCALE', url: '/scale-test', icon: 'home-outline', active: true }, - roasting_section: { title: 'NAV_ROASTING_SECTION', url: '/roasting-section', active: false }, - water_section: { title: 'NAV_WATER_SECTION', url: '/water-section', active: false }, - settings: { title: 'NAV_SETTINGS', url: '/settings', icon: 'settings-outline', active: false }, - - info: { title: 'NAV_INFORMATION_TO_APP', url: '/info', icon: 'information-circle-outline', active: false }, - about: { title: 'NAV_ABOUT_US', url: '/info/about', icon: 'information-circle-outline', active: false }, - contact: { title: 'NAV_CONTACT', url: '/info/contact', icon: 'mail-outline', active: false }, - privacy: { title: 'NAV_PRIVACY', url: '/info/privacy', icon: 'documents-outline', active: false }, - credits: { title: 'NAV_CREDITS', url: '/info/credits', icon: 'documents-outline', active: false }, - terms: { title: 'NAV_TERMS', url: '/info/terms', icon: 'documents-outline', active: false }, - thanks: { title: 'NAV_THANKS', url: '/info/thanks', icon: 'happy-outline', active: false }, - licences: { title: 'NAV_LICENCES', url: '/info/licences', icon: 'copy-outline', active: false }, - - statistic: { title: 'NAV_STATISTICS', url: '/statistic', icon: 'analytics-outline', active: false }, - logs: { title: 'NAV_LOGS', url: '/info/logs', icon: 'logo-buffer', active: false }, - - helper: { title: 'NAV_HELPER', url: '/helper', icon: 'logo-buffer', active: false }, - helper_brew_ratio: { title: 'PAGE_HELPER_BREW_RATIO', url: '/helper/brew-ratio', icon: 'construct-outline', active: false }, - helper_water_hardness: { title: 'PAGE_HELPER_WATER_HARDNESS', url: '/helper/water-hardness', icon: 'construct-outline', active: false }, - brew_parameter: { title: 'NAV_BREW_PARAMS', url: '/brew-parameter', icon: 'construct-outline', active: false } + scale: { + title: 'SCALE', + url: '/scale-test', + icon: 'home-outline', + active: true, + }, + roasting_section: { + title: 'NAV_ROASTING_SECTION', + url: '/roasting-section', + active: false, + }, + water_section: { + title: 'NAV_WATER_SECTION', + url: '/water-section', + active: false, + }, + settings: { + title: 'NAV_SETTINGS', + url: '/settings', + icon: 'settings-outline', + active: false, + }, + + info: { + title: 'NAV_INFORMATION_TO_APP', + url: '/info', + icon: 'information-circle-outline', + active: false, + }, + about: { + title: 'NAV_ABOUT_US', + url: '/info/about', + icon: 'information-circle-outline', + active: false, + }, + contact: { + title: 'NAV_CONTACT', + url: '/info/contact', + icon: 'mail-outline', + active: false, + }, + privacy: { + title: 'NAV_PRIVACY', + url: '/info/privacy', + icon: 'documents-outline', + active: false, + }, + credits: { + title: 'NAV_CREDITS', + url: '/info/credits', + icon: 'documents-outline', + active: false, + }, + terms: { + title: 'NAV_TERMS', + url: '/info/terms', + icon: 'documents-outline', + active: false, + }, + thanks: { + title: 'NAV_THANKS', + url: '/info/thanks', + icon: 'happy-outline', + active: false, + }, + licences: { + title: 'NAV_LICENCES', + url: '/info/licences', + icon: 'copy-outline', + active: false, + }, + + statistic: { + title: 'NAV_STATISTICS', + url: '/statistic', + icon: 'analytics-outline', + active: false, + }, + logs: { + title: 'NAV_LOGS', + url: '/info/logs', + icon: 'logo-buffer', + active: false, + }, + + helper: { + title: 'NAV_HELPER', + url: '/helper', + icon: 'logo-buffer', + active: false, + }, + helper_brew_ratio: { + title: 'PAGE_HELPER_BREW_RATIO', + url: '/helper/brew-ratio', + icon: 'construct-outline', + active: false, + }, + helper_water_hardness: { + title: 'PAGE_HELPER_WATER_HARDNESS', + url: '/helper/water-hardness', + icon: 'construct-outline', + active: false, + }, + brew_parameter: { + title: 'NAV_BREW_PARAMS', + url: '/brew-parameter', + icon: 'construct-outline', + active: false, + }, }; - constructor( private readonly router: Router, public platform: Platform, @@ -125,33 +226,20 @@ export class AppComponent implements AfterViewInit { private readonly cleanupService: CleanupService, private readonly device: Device, private readonly appVersion: AppVersion, - private readonly storage: Storage, - + private readonly storage: Storage ) { - // Dont remove androidPlatformService, we need to initialize it via constructor try { // Touch DB Factory to make sure, it is properly initialized even on iOS 14.6 const db = window.indexedDB; - } catch(ex) { - - } + } catch (ex) {} try { // Touch DB Factory to make sure, it is properly initialized even on iOS 14.6 const db = window.sqlitePlugin; - } catch(ex) { - - } - - + } catch (ex) {} } - public ngOnInit() { - - - - - } + public ngOnInit() {} public ngAfterViewInit(): void { this.uiLog.log('Platform ready, init app'); @@ -163,178 +251,163 @@ export class AppComponent implements AfterViewInit { this.__appReady(); } - public dismiss() { this.menu.close(); } private __appReady(): void { - this.platform.ready() - .then(async () => { - - - try { + this.platform.ready().then(async () => { + try { // #285 - Add more device loggings this.uiLog.log(`Device-Model: ${this.device.model}`); this.uiLog.log(`Manufacturer: ${this.device.manufacturer}`); this.uiLog.log(`Platform: ${this.device.platform}`); this.uiLog.log(`Version: ${this.device.version}`); if (this.platform.is('cordova')) { - const versionCode: string | number = await this.appVersion.getVersionNumber(); + const versionCode: string | number = + await this.appVersion.getVersionNumber(); this.uiLog.log(`App-Version: ${versionCode}`); - this.uiLog.log(`Storage-Driver: ${ this.storage.driver}`); - } - } catch (ex) { - + this.uiLog.log(`Storage-Driver: ${this.storage.driver}`); } + } catch (ex) {} + + // Okay, so the platform is ready and our plugins are available. + // Here you can do any higher level native things you might need. + // #7 + this.statusBar.show(); + this.statusBar.styleDefault(); + this.splashScreen.hide(); + this.keyboard.hideFormAccessoryBar(false); + if (environment.production === true) { + // When we're in cordova, disable the log messages + this.uiLog.disable(); + } - // Okay, so the platform is ready and our plugins are available. - // Here you can do any higher level native things you might need. - // #7 - this.statusBar.show(); - this.statusBar.styleDefault(); - this.splashScreen.hide(); - this.keyboard.hideFormAccessoryBar(false); - if (environment.production === true) { - // When we're in cordova, disable the log messages - this.uiLog.disable(); - } - - if (this.platform.is('ios')) { - this.uiLog.log(`iOS Device - attach to home icon pressed`); - this.threeDeeTouch.onHomeIconPressed() - .subscribe( - async (payload) => { - /* We need to wait for app finished loading, but already attach on platform start, else - * the event won't get triggered **/ - this.uiHelper.isBeanconqurorAppReady().then(async () => { - const payloadType = payload.type; - try { - this.uiAnalytics.trackEvent(STARTUP_TRACKING.TITLE, STARTUP_TRACKING.ACTIONS.FORCE_TOUCH.CATEGORY, payloadType.toUpperCase()); - this.uiLog.log(`iOS Device - Home icon was pressed`); - } catch (ex) { - } - if (payload.type === 'Brew') { - await this.__trackNewBrew(); - } else if (payload.type === 'Bean') { - await this.__trackNewBean(); - } else if (payload.type === 'Preparation') { - await this.__trackNewPreparation(); - } else if (payload.type === 'Mill') { - await this.__trackNewMill(); - } - }); - // returns an object that is the button you presed - - } - ); - } - - if (this.platform.is('cordova')) { - // Just support deeplinks on devices. - this.intentHandlerService.attachOnHandleOpenUrl(); - - } - - - // Before we update and show messages, we need atleast to set one default language. - this._translate.setDefaultLang('en'); - await this._translate.use('en').toPromise(); + if (this.platform.is('ios')) { + this.uiLog.log(`iOS Device - attach to home icon pressed`); + this.threeDeeTouch.onHomeIconPressed().subscribe(async (payload) => { + /* We need to wait for app finished loading, but already attach on platform start, else + * the event won't get triggered **/ + this.uiHelper.isBeanconqurorAppReady().then(async () => { + const payloadType = payload.type; + try { + this.uiAnalytics.trackEvent( + STARTUP_TRACKING.TITLE, + STARTUP_TRACKING.ACTIONS.FORCE_TOUCH.CATEGORY, + payloadType.toUpperCase() + ); + this.uiLog.log(`iOS Device - Home icon was pressed`); + } catch (ex) {} + if (payload.type === 'Brew') { + await this.__trackNewBrew(); + } else if (payload.type === 'Bean') { + await this.__trackNewBean(); + } else if (payload.type === 'Preparation') { + await this.__trackNewPreparation(); + } else if (payload.type === 'Mill') { + await this.__trackNewMill(); + } + }); + // returns an object that is the button you presed + }); + } - if (this.platform.is('ios')) { - await this.__checkIOSBackup(); - } else if (this.platform.is('android')) { - await this.__checkAndroidBackup(); - } + if (this.platform.is('cordova')) { + // Just support deeplinks on devices. + this.intentHandlerService.attachOnHandleOpenUrl(); + } - try { - await this.uiBeanStorage.initializeStorage(); - await this.uiPreparationStorage.initializeStorage(); - await this.uiSettingsStorage.initializeStorage(); - await this.uiBrewStorage.initializeStorage(); - await this.uiMillStorage.initializeStorage(); - await this.uiVersionStorage.initializeStorage(); - await this.uiGreenBeanStorage.initializeStorage(); - await this.uiRoastingMachineStorage.initializeStorage(); - await this.uiWaterStorage.initializeStorage(); - - // Wait for every necessary service to be ready before starting the app - // Settings and version, will create a new object on start, so we need to wait for this in the end. - const beanStorageReadyCallback = this.uiBeanStorage.storageReady(); - const preparationStorageReadyCallback = this.uiPreparationStorage.storageReady(); - const uiSettingsStorageReadyCallback = this.uiSettingsStorage.storageReady(); - const brewStorageReadyCallback = this.uiBrewStorage.storageReady(); - const millStorageReadyCallback = this.uiMillStorage.storageReady(); - const versionStorageReadyCallback = this.uiVersionStorage.storageReady(); - const greenBeanStorageCallback = this.uiGreenBeanStorage.storageReady(); - const roastingMachineStorageCallback = this.uiRoastingMachineStorage.storageReady(); - const waterStorageCallback = this.uiWaterStorage.storageReady(); - - - Promise.all([ - beanStorageReadyCallback, - preparationStorageReadyCallback, - brewStorageReadyCallback, - uiSettingsStorageReadyCallback, - millStorageReadyCallback, - versionStorageReadyCallback, - greenBeanStorageCallback, - roastingMachineStorageCallback, - waterStorageCallback - ]) - .then(async () => { - this.uiLog.log('App finished loading'); - this.uiLog.info('Everything should be fine!!!'); - await this.__checkUpdate(); - await this.__checkCleanup(); - await this.__initApp(); - this.uiHelper.setAppReady(1); - - }, async () => { - await this.uiAlert.showAppShetItSelfMessage(); - this.uiLog.error('App finished loading, but errors occured'); - }); + // Before we update and show messages, we need atleast to set one default language. + this._translate.setDefaultLang('en'); + await this._translate.use('en').toPromise(); - } catch (ex) { - await this.uiAlert.showAppShetItSelfMessage(); - this.uiLog.error('App finished loading, but errors occured'); - } + if (this.platform.is('ios')) { + await this.__checkIOSBackup(); + } else if (this.platform.is('android')) { + await this.__checkAndroidBackup(); + } - }); + try { + await this.uiBeanStorage.initializeStorage(); + await this.uiPreparationStorage.initializeStorage(); + await this.uiSettingsStorage.initializeStorage(); + await this.uiBrewStorage.initializeStorage(); + await this.uiMillStorage.initializeStorage(); + await this.uiVersionStorage.initializeStorage(); + await this.uiGreenBeanStorage.initializeStorage(); + await this.uiRoastingMachineStorage.initializeStorage(); + await this.uiWaterStorage.initializeStorage(); + + // Wait for every necessary service to be ready before starting the app + // Settings and version, will create a new object on start, so we need to wait for this in the end. + const beanStorageReadyCallback = this.uiBeanStorage.storageReady(); + const preparationStorageReadyCallback = + this.uiPreparationStorage.storageReady(); + const uiSettingsStorageReadyCallback = + this.uiSettingsStorage.storageReady(); + const brewStorageReadyCallback = this.uiBrewStorage.storageReady(); + const millStorageReadyCallback = this.uiMillStorage.storageReady(); + const versionStorageReadyCallback = + this.uiVersionStorage.storageReady(); + const greenBeanStorageCallback = this.uiGreenBeanStorage.storageReady(); + const roastingMachineStorageCallback = + this.uiRoastingMachineStorage.storageReady(); + const waterStorageCallback = this.uiWaterStorage.storageReady(); + + Promise.all([ + beanStorageReadyCallback, + preparationStorageReadyCallback, + brewStorageReadyCallback, + uiSettingsStorageReadyCallback, + millStorageReadyCallback, + versionStorageReadyCallback, + greenBeanStorageCallback, + roastingMachineStorageCallback, + waterStorageCallback, + ]).then( + async () => { + this.uiLog.log('App finished loading'); + this.uiLog.info('Everything should be fine!!!'); + await this.__checkUpdate(); + await this.__checkCleanup(); + await this.__initApp(); + this.uiHelper.setAppReady(1); + }, + async () => { + await this.uiAlert.showAppShetItSelfMessage(); + this.uiLog.error('App finished loading, but errors occured'); + } + ); + } catch (ex) { + await this.uiAlert.showAppShetItSelfMessage(); + this.uiLog.error('App finished loading, but errors occured'); + } + }); } private async __checkUpdate() { try { await this.uiUpdate.checkUpdate(); - } catch (ex) { - - } + } catch (ex) {} } private async __checkCleanup() { try { await this.cleanupService.cleanupOldBrewData(); - } catch (ex) { - - } + } catch (ex) {} } private async __checkAndroidBackup() { try { await this.androidPlatformService.checkAndroidBackup(); - } catch (ex) { - - } + } catch (ex) {} } private async __checkIOSBackup() { try { await this.iosPlatformService.checkIOSBackup(); - } catch (ex) { - - } + } catch (ex) {} } - public showRoastingSection() { const settings: Settings = this.uiSettingsStorage.getSettings(); return settings.show_roasting_section; @@ -349,46 +422,49 @@ export class AppComponent implements AfterViewInit { return new Promise(async (resolve, reject) => { const settings: Settings = this.uiSettingsStorage.getSettings(); if (this.platform.is('cordova')) { - try { this.uiLog.info('Its a mobile device, try to set language now'); - if (settings.language === null || settings.language === undefined || settings.language === '') { - this.globalization.getPreferredLanguage().then(async (res) => { - // Run other functions after getting device default lang - let systemLanguage: string = res['value'].toLowerCase(); - this.uiLog.log(`Found system language: ${systemLanguage}`); - if (systemLanguage.indexOf('-') > -1) { - systemLanguage = systemLanguage.split('-')[0]; - } - - let settingLanguage: string = ''; - if (systemLanguage === 'de') { - settingLanguage = 'de'; - } else if (systemLanguage === 'es') { - settingLanguage = 'es'; - } - else if (systemLanguage === 'tr') { - settingLanguage = 'tr'; - } - else if (systemLanguage === 'zh') { - settingLanguage = 'zh'; - } - else { - settingLanguage = 'en'; - } - this.uiLog.log(`Setting language: ${settingLanguage}`); - this._translate.setDefaultLang(settingLanguage); - settings.language = settingLanguage; - await this.uiSettingsStorage.saveSettings(settings); - await this._translate.use(settingLanguage).toPromise(); - moment.locale(settingLanguage); - resolve(undefined); - - }) + if ( + settings.language === null || + settings.language === undefined || + settings.language === '' + ) { + this.globalization + .getPreferredLanguage() + .then(async (res) => { + // Run other functions after getting device default lang + let systemLanguage: string = res['value'].toLowerCase(); + this.uiLog.log(`Found system language: ${systemLanguage}`); + if (systemLanguage.indexOf('-') > -1) { + systemLanguage = systemLanguage.split('-')[0]; + } + + let settingLanguage: string = ''; + if (systemLanguage === 'de') { + settingLanguage = 'de'; + } else if (systemLanguage === 'es') { + settingLanguage = 'es'; + } else if (systemLanguage === 'tr') { + settingLanguage = 'tr'; + } else if (systemLanguage === 'zh') { + settingLanguage = 'zh'; + } else { + settingLanguage = 'en'; + } + this.uiLog.log(`Setting language: ${settingLanguage}`); + this._translate.setDefaultLang(settingLanguage); + settings.language = settingLanguage; + await this.uiSettingsStorage.saveSettings(settings); + await this._translate.use(settingLanguage).toPromise(); + moment.locale(settingLanguage); + resolve(undefined); + }) .catch(async (ex) => { const exMessage: string = JSON.stringify(ex); - this.uiLog.error(`Exception occured when setting language ${exMessage}`); + this.uiLog.error( + `Exception occured when setting language ${exMessage}` + ); this._translate.setDefaultLang('en'); await this._translate.use('en').toPromise(); moment.locale('en'); @@ -402,11 +478,12 @@ export class AppComponent implements AfterViewInit { await this._translate.use(settingLanguage).toPromise(); moment.locale(settingLanguage); resolve(undefined); - } } catch (ex) { const exMessage: string = JSON.stringify(ex); - this.uiLog.error(`Exception occured when setting language ${exMessage}`); + this.uiLog.error( + `Exception occured when setting language ${exMessage}` + ); this._translate.setDefaultLang('en'); settings.language = 'en'; await this.uiSettingsStorage.saveSettings(settings); @@ -415,15 +492,23 @@ export class AppComponent implements AfterViewInit { resolve(undefined); } } else { - this.uiLog.info('Cant set language for device, because no cordova device'); - if (settings.language !== null && settings.language !== undefined && settings.language !== '') { + this.uiLog.info( + 'Cant set language for device, because no cordova device' + ); + if ( + settings.language !== null && + settings.language !== undefined && + settings.language !== '' + ) { this.uiLog.info(`Set language from settings: ${settings.language}`); this._translate.setDefaultLang(settings.language); await this._translate.use(settings.language).toPromise(); moment.locale(settings.language); resolve(undefined); } else { - this.uiLog.info(`Set default language from settings, because no settings set: en `); + this.uiLog.info( + `Set default language from settings, because no settings set: en ` + ); this._translate.setDefaultLang('en'); settings.language = 'en'; await this.uiSettingsStorage.saveSettings(settings); @@ -431,7 +516,6 @@ export class AppComponent implements AfterViewInit { moment.locale(settings.language); resolve(undefined); } - } }); } @@ -439,10 +523,11 @@ export class AppComponent implements AfterViewInit { private async __checkStartupView() { const settings: Settings = this.uiSettingsStorage.getSettings(); if (settings.startup_view !== STARTUP_VIEW_ENUM.HOME_PAGE) { - - this.uiAnalytics.trackEvent(STARTUP_TRACKING.TITLE, + this.uiAnalytics.trackEvent( + STARTUP_TRACKING.TITLE, STARTUP_TRACKING.ACTIONS.STARTUP_VIEW.CATEGORY, - settings.startup_view); + settings.startup_view + ); } switch (settings.startup_view) { case STARTUP_VIEW_ENUM.HOME_PAGE: @@ -459,15 +544,13 @@ export class AppComponent implements AfterViewInit { } private async __initApp() { - this.__registerBack(); await this.__setDeviceLanguage(); // After we set the right device language, we check now if we can request external storage if (this.platform.is('cordova') && this.platform.is('android')) { try { await this.androidPlatformService.checkHasExternalStorage(); - } catch (ex) { - } + } catch (ex) {} } this.__setThreeDeeTouchActions(); @@ -477,20 +560,16 @@ export class AppComponent implements AfterViewInit { await this.uiUpdate.checkUpdateScreen(); // #281 - Connect smartscale before checking the startup view - setTimeout(() => - { + setTimeout(() => { // Just connect after 5 seconds, to get some time, and maybe handle all the connection errors this.__connectSmartScale(); this.__connectPressureDevice(); - },5000); - + }, 5000); await this.__checkStartupView(); this.__instanceAppRating(); this.__attachOnDevicePause(); this.__attachOnDeviceResume(); - - } private __connectSmartScale() { @@ -499,25 +578,32 @@ export class AppComponent implements AfterViewInit { const scale_type: ScaleType = settings.scale_type; this.uiLog.log(`Connect smartscale? ${scale_id}`); if (scale_id !== undefined && scale_id !== '') { - this.bleManager.autoConnectScale(scale_type, scale_id, true); + this.bleManager.autoConnectScale(scale_type, scale_id, true); + setTimeout(() => { + this.bleManager.disconnect(scale_id); + setTimeout(() => { + this.bleManager.autoConnectScale(scale_type, scale_id, true); + }, 2000); + }, 10000); } else { this.uiLog.log('Smartscale not connected, dont try to connect'); } - } - private __connectPressureDevice() { const settings = this.uiSettingsStorage.getSettings(); const pressure_id: string = settings.pressure_id; const pressure_type: PressureType = settings.pressure_type; this.uiLog.log(`Connect pressure device? ${pressure_id}`); if (pressure_id !== undefined && pressure_id !== '') { - this.bleManager.autoConnectPressureDevice(pressure_type, pressure_id, true); + this.bleManager.autoConnectPressureDevice( + pressure_type, + pressure_id, + true + ); } else { this.uiLog.log('Pressure device not connected, dont try to connect'); } - } private __attachOnDevicePause() { @@ -527,7 +613,7 @@ export class AppComponent implements AfterViewInit { const decent_scale_id: string = settings.scale_id; if (decent_scale_id !== undefined && decent_scale_id !== '') { // Don't show message on device pause. - this.bleManager.disconnect(settings.scale_id,false); + this.bleManager.disconnect(settings.scale_id, false); } } }); @@ -538,7 +624,6 @@ export class AppComponent implements AfterViewInit { if (settings.bluetooth_scale_stay_connected === false) { this.__connectSmartScale(); } - }); } @@ -549,32 +634,30 @@ export class AppComponent implements AfterViewInit { { type: 'Brew', title: this._translate.instant('THREE_DEE_TOUCH_ACTION_BREW'), - iconType: 'Add' + iconType: 'Add', }, { type: 'Bean', title: this._translate.instant('THREE_DEE_TOUCH_ACTION_BEAN'), - iconType: 'Add' + iconType: 'Add', }, { type: 'Preparation', title: this._translate.instant('THREE_DEE_TOUCH_ACTION_PREPARATION'), - iconType: 'Add' + iconType: 'Add', }, { type: 'Mill', title: this._translate.instant('THREE_DEE_TOUCH_ACTION_MILL'), - iconType: 'Add' + iconType: 'Add', }, ]; this.threeDeeTouch.configureQuickActions(actions); } - } private __instanceAppRating() { - if (this.platform.is('cordova')) { const appLanguage = this.uiSettingsStorage.getSettings().language; AppRate.setPreferences({ @@ -586,7 +669,7 @@ export class AppComponent implements AfterViewInit { promptAgainForEachNewVersion: false, reviewType: { ios: 'AppStoreReview', - android: 'InAppReview' + android: 'InAppReview', }, useLanguage: appLanguage, }); @@ -596,34 +679,34 @@ export class AppComponent implements AfterViewInit { } private async __trackNewBrew() { - if (this.uiBrewHelper.canBrew()) { await this.uiBrewHelper.addBrew(); this.router.navigate(['/home/brews'], { replaceUrl: true }); } - } - private async __checkWelcomePage() { - const settings = this.uiSettingsStorage.getSettings(); const welcomePagedShowed: boolean = settings.welcome_page_showed; if (!welcomePagedShowed) { - const modal = await this.modalCtrl.create({ component: WelcomePopoverComponent, id: 'welcome-popover' }); + const modal = await this.modalCtrl.create({ + component: WelcomePopoverComponent, + id: 'welcome-popover', + }); await modal.present(); await modal.onWillDismiss(); } } - private async __checkAnalyticsInformationPage() { - const settings = this.uiSettingsStorage.getSettings(); const matomo_analytics: boolean = settings.matomo_analytics; if (matomo_analytics === undefined) { - const modal = await this.modalCtrl.create({ component: AnalyticsPopoverComponent, id: AnalyticsPopoverComponent.POPOVER_ID }); + const modal = await this.modalCtrl.create({ + component: AnalyticsPopoverComponent, + id: AnalyticsPopoverComponent.POPOVER_ID, + }); await modal.present(); await modal.onWillDismiss(); } @@ -632,27 +715,26 @@ export class AppComponent implements AfterViewInit { private async __trackNewBean() { await this.uiBeanHelper.addBean(); this.router.navigate(['/'], { replaceUrl: true }); - } private async __trackNewPreparation() { await this.uiPreparationHelper.addPreparation(); this.router.navigate(['/'], { replaceUrl: true }); - } private async __trackNewMill() { await this.uiMillHelper.addMill(); this.router.navigate(['/'], { replaceUrl: true }); - } private __registerBack() { - - this.platform.backButton.subscribeWithPriority(0, () => { // NAvigation handler - if (this.router.url.indexOf('/home') === -1 && this.routerOutlet && this.routerOutlet.canGoBack()) { + if ( + this.router.url.indexOf('/home') === -1 && + this.routerOutlet && + this.routerOutlet.canGoBack() + ) { this.routerOutlet.pop(); } else if (this.router.url.indexOf('/home') >= 0) { this.appMinimize.minimize(); @@ -666,20 +748,39 @@ export class AppComponent implements AfterViewInit { } public openGithub() { - this.uiAnalytics.trackEvent(LINK_TRACKING.TITLE, LINK_TRACKING.ACTIONS.GITHUB); - this.uiHelper.openExternalWebpage('https://github.com/graphefruit/Beanconqueror'); + this.uiAnalytics.trackEvent( + LINK_TRACKING.TITLE, + LINK_TRACKING.ACTIONS.GITHUB + ); + this.uiHelper.openExternalWebpage( + 'https://github.com/graphefruit/Beanconqueror' + ); } public openInstagram() { - this.uiAnalytics.trackEvent(LINK_TRACKING.TITLE, LINK_TRACKING.ACTIONS.INSTAGRAM); - this.uiHelper.openExternalWebpage('https://www.instagram.com/beanconqueror/'); + this.uiAnalytics.trackEvent( + LINK_TRACKING.TITLE, + LINK_TRACKING.ACTIONS.INSTAGRAM + ); + this.uiHelper.openExternalWebpage( + 'https://www.instagram.com/beanconqueror/' + ); } public openFacebook() { - this.uiAnalytics.trackEvent(LINK_TRACKING.TITLE, LINK_TRACKING.ACTIONS.FACEBOOK); - this.uiHelper.openExternalWebpage('https://www.facebook.com/Beanconqueror/'); + this.uiAnalytics.trackEvent( + LINK_TRACKING.TITLE, + LINK_TRACKING.ACTIONS.FACEBOOK + ); + this.uiHelper.openExternalWebpage( + 'https://www.facebook.com/Beanconqueror/' + ); } public openDonatePage() { - this.uiAnalytics.trackEvent(LINK_TRACKING.TITLE, LINK_TRACKING.ACTIONS.BUY_ME_A_COFFEE); - this.uiHelper.openExternalWebpage('https://www.buymeacoffee.com/beanconqueror'); - + this.uiAnalytics.trackEvent( + LINK_TRACKING.TITLE, + LINK_TRACKING.ACTIONS.BUY_ME_A_COFFEE + ); + this.uiHelper.openExternalWebpage( + 'https://www.buymeacoffee.com/beanconqueror' + ); } } diff --git a/src/classes/devices/index.ts b/src/classes/devices/index.ts index efbba6ffc..04a3a8375 100644 --- a/src/classes/devices/index.ts +++ b/src/classes/devices/index.ts @@ -5,8 +5,10 @@ import DecentScale from './decentScale'; import FelicitaScale from './felicitaScale'; import JimmyScale from './jimmyScale'; import LunarScale from './lunarScale'; +import { PressureDevice } from './pressureBluetoothDevice'; +import PopsiclePressure from './popsiclePressure'; +import TransducerDirectPressure from './transducerDirectPressure'; import EurekaPrecisaScale from './eurekaPrecisaScale'; - export { BluetoothScale, SCALE_TIMER_COMMAND } from './bluetoothDevice'; export { default as DecentScale } from './decentScale'; export { default as LunarScale } from './lunarScale'; @@ -20,7 +22,16 @@ export enum ScaleType { EUREKAPRECISA = 'EUREKAPRECISA', } -export function makeDevice(type: ScaleType, data: PeripheralData, platforms: Platforms[]): BluetoothScale { +export enum PressureType { + POPSICLE = 'POPSICLE', + DIRECT = 'DIRECT', +} + +export function makeDevice( + type: ScaleType, + data: PeripheralData, + platforms: Platforms[] +): BluetoothScale { switch (type) { case ScaleType.DECENT: return new DecentScale(data, platforms); @@ -36,3 +47,18 @@ export function makeDevice(type: ScaleType, data: PeripheralData, platforms: Pla return null; } } + +export function makePressureDevice( + type: PressureType, + data: PeripheralData, + platforms: Platforms[] +): PressureDevice { + switch (type) { + case PressureType.POPSICLE: + return new PopsiclePressure(data, platforms); + case PressureType.DIRECT: + return new TransducerDirectPressure(data, platforms); + default: + return null; + } +} From 8340170cbcbb4151d11f146aa7dd138688508cf1 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 31 Jul 2022 11:20:33 +0200 Subject: [PATCH 47/78] The whole bluetooth scale code was moved to another repository on github. https://github.com/graphefruit/coffee-bluetooth-devices-cordova/ Also we've updated to angular 14 --- angular.json | 10 +- package-lock.json | 12441 +++++++++------- package.json | 31 +- src/app/app-routing.module.ts | 135 +- src/app/app.component.ts | 17 +- src/app/app.module.ts | 85 +- src/app/dashboard/dashboard.page.html | 1 + src/app/dashboard/dashboard.page.ts | 123 +- .../scale-test/scale-test-routing.module.ts | 17 - src/app/scale-test/scale-test.module.ts | 22 - src/app/scale-test/scale-test.page.html | 24 - src/app/scale-test/scale-test.page.scss | 0 src/app/scale-test/scale-test.page.spec.ts | 24 - src/app/scale-test/scale-test.page.ts | 75 - src/app/settings/settings.page.ts | 977 +- src/app/shared/shared.module.ts | 958 +- src/classes/devices/acaia/acaia.ts | 643 - src/classes/devices/acaia/common.ts | 67 - src/classes/devices/acaia/constants.ts | 11 - src/classes/devices/acaia/decode.worker.ts | 27 - src/classes/devices/acaia/decoder.ts | 287 - src/classes/devices/acaia/index.ts | 1 - src/classes/devices/ble.types.ts | 38 - src/classes/devices/bluetoothDevice.ts | 137 - src/classes/devices/common/constants.ts | 1 - src/classes/devices/common/logger.ts | 47 - src/classes/devices/common/util.ts | 48 - src/classes/devices/decentScale.ts | 221 - src/classes/devices/eurekaPrecisaScale.ts | 189 - src/classes/devices/felicita/constants.ts | 20 - .../devices/felicita/felicita-readme.md | 28 - src/classes/devices/felicitaScale.ts | 227 - src/classes/devices/index.ts | 64 - src/classes/devices/jimmyScale.ts | 140 - src/classes/devices/lunarScale.ts | 89 - src/classes/devices/popsiclePressure.ts | 75 - .../devices/pressureBluetoothDevice.ts | 100 - .../devices/transducerDirectPressure.ts | 84 - src/classes/settings/settings.ts | 124 +- .../bean-general-information.component.ts | 101 +- .../bean-roast-information.component.ts | 54 +- .../brew-timer/brew-timer.component.ts | 84 +- .../brew-brewing/brew-brewing.component.ts | 104 +- src/interfaces/settings/iSettings.ts | 46 +- .../bleManager/ble-manager.service.spec.ts | 16 - .../bleManager/ble-manager.service.ts | 601 - tsconfig.worker.json | 2 +- 47 files changed, 8454 insertions(+), 10162 deletions(-) delete mode 100644 src/app/scale-test/scale-test-routing.module.ts delete mode 100644 src/app/scale-test/scale-test.module.ts delete mode 100644 src/app/scale-test/scale-test.page.html delete mode 100644 src/app/scale-test/scale-test.page.scss delete mode 100644 src/app/scale-test/scale-test.page.spec.ts delete mode 100644 src/app/scale-test/scale-test.page.ts delete mode 100644 src/classes/devices/acaia/acaia.ts delete mode 100644 src/classes/devices/acaia/common.ts delete mode 100644 src/classes/devices/acaia/constants.ts delete mode 100644 src/classes/devices/acaia/decode.worker.ts delete mode 100644 src/classes/devices/acaia/decoder.ts delete mode 100644 src/classes/devices/acaia/index.ts delete mode 100644 src/classes/devices/ble.types.ts delete mode 100644 src/classes/devices/bluetoothDevice.ts delete mode 100644 src/classes/devices/common/constants.ts delete mode 100644 src/classes/devices/common/logger.ts delete mode 100644 src/classes/devices/common/util.ts delete mode 100644 src/classes/devices/decentScale.ts delete mode 100644 src/classes/devices/eurekaPrecisaScale.ts delete mode 100644 src/classes/devices/felicita/constants.ts delete mode 100644 src/classes/devices/felicita/felicita-readme.md delete mode 100644 src/classes/devices/felicitaScale.ts delete mode 100644 src/classes/devices/index.ts delete mode 100644 src/classes/devices/jimmyScale.ts delete mode 100644 src/classes/devices/lunarScale.ts delete mode 100644 src/classes/devices/popsiclePressure.ts delete mode 100644 src/classes/devices/pressureBluetoothDevice.ts delete mode 100644 src/classes/devices/transducerDirectPressure.ts delete mode 100644 src/services/bleManager/ble-manager.service.spec.ts delete mode 100644 src/services/bleManager/ble-manager.service.ts diff --git a/angular.json b/angular.json index d724c180f..aea092e36 100644 --- a/angular.json +++ b/angular.json @@ -1,7 +1,6 @@ { "$schema": "./node_modules/@angular-devkit/core/src/workspace/workspace-schema.json", "version": 1, - "defaultProject": "app", "newProjectRoot": "projects", "projects": { "app": { @@ -57,7 +56,7 @@ "sourceMap": true, "optimization": false, "namedChunks": true, - "webWorkerTsConfig": "tsconfig.worker.json" + }, "configurations": { "production": { @@ -128,8 +127,7 @@ "input": "src/assets", "output": "/assets" } - ], - "webWorkerTsConfig": "tsconfig.worker.json" + ] }, "configurations": { "ci": { @@ -187,7 +185,9 @@ } }, "cli": { - "defaultCollection": "@ionic/angular-toolkit" + "schematicCollections": [ + "@ionic/angular-toolkit" + ] }, "schematics": { "@ionic/angular-toolkit:component": { diff --git a/package-lock.json b/package-lock.json index a468e28ea..075a8c3a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,12 +8,13 @@ "name": "beanconqueror", "version": "2.0.0", "dependencies": { - "@angular/common": "^13.1.0", - "@angular/core": "^13.1.0", - "@angular/forms": "^13.1.0", - "@angular/platform-browser": "^13.1.0", - "@angular/platform-browser-dynamic": "^13.1.0", - "@angular/router": "^13.1.0", + "@angular/common": "^14.1.0", + "@angular/core": "^14.1.0", + "@angular/forms": "^14.1.0", + "@angular/platform-browser": "^14.1.0", + "@angular/platform-browser-dynamic": "^14.1.0", + "@angular/router": "^14.1.0", + "@graphefruit/coffee-bluetooth-devices": "file:../../graphefruit-coffee-bluetooth-devices-0.0.14.tgz", "@ionic-native/android-permissions": "^5.33.1", "@ionic-native/app-minimize": "^5.33.1", "@ionic-native/app-version": "^5.33.1", @@ -76,14 +77,14 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@angular-devkit/architect": "^0.1301.0", - "@angular-devkit/build-angular": "^13.1.1", - "@angular-devkit/core": "^13.1.0", - "@angular-devkit/schematics": "^13.1.0", - "@angular/cli": "^13.1.0", - "@angular/compiler": "^13.1.0", - "@angular/compiler-cli": "^13.1.0", - "@angular/language-service": "^13.1.0", + "@angular-devkit/architect": "^0.1401.0", + "@angular-devkit/build-angular": "^14.1.0", + "@angular-devkit/core": "^14.1.0", + "@angular-devkit/schematics": "^14.1.0", + "@angular/cli": "^14.1.0", + "@angular/compiler": "^14.1.0", + "@angular/compiler-cli": "^14.1.0", + "@angular/language-service": "^14.1.0", "@ionic/angular-toolkit": "^5.0.3", "@types/cordova-plugin-ble-central": "^1.3.1", "@types/jasmine": "~3.6.0", @@ -135,150 +136,124 @@ "stylelint-config-standard": "^20.0.0", "ts-node": "~8.3.0", "tslint": "~6.1.0", - "typescript": "~4.5.4", + "typescript": "~4.7.4", "webpack-subresource-integrity": "^1.5.2" } }, "node_modules/@ampproject/remapping": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.0.2.tgz", - "integrity": "sha512-SncaVxs+E3EdoA9xJgHfWPxZfowAgeIsd71VpqCKP6KNKm6s7zSqqvUc70UpKUFsrV3dAmy6qxHoIj5NG+3DiA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "1.0.0", - "sourcemap-codec": "1.4.8" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@ampproject/remapping/node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, "node_modules/@angular-devkit/architect": { - "version": "0.1301.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1301.1.tgz", - "integrity": "sha512-3g1wlqihVEOhClsuSzyJYm8Sr4qc4IUDuOa45m8439bz9iQy2wZ3JUGTwX1NcpeLxmCDrgewuphIsW096HxYlg==", + "version": "0.1401.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1401.0.tgz", + "integrity": "sha512-dHgP2/5EXkJpdf6Y1QHQX2RP8xTli/CFZH3uNnTh+EuAib/kwu+Z6K3UttZWB5VGhAF1u/xf97Vly/UkXvjKAg==", "dev": true, "dependencies": { - "@angular-devkit/core": "13.1.1", + "@angular-devkit/core": "14.1.0", "rxjs": "6.6.7" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "node": "^14.15.0 || >=16.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/architect/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/@angular-devkit/architect/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@angular-devkit/build-angular": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.1.1.tgz", - "integrity": "sha512-9+Ql4+rIt5CFfxLCZntCUdcVGl7mOi43/jpmYd31DKEUt4OPrqLoR5LsYepy3UR0+B0kNP6/PEOvaRiCb4t2GQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "1.0.2", - "@angular-devkit/architect": "0.1301.1", - "@angular-devkit/build-webpack": "0.1301.1", - "@angular-devkit/core": "13.1.1", - "@babel/core": "7.16.0", - "@babel/generator": "7.16.0", - "@babel/helper-annotate-as-pure": "7.16.0", - "@babel/plugin-proposal-async-generator-functions": "7.16.4", - "@babel/plugin-transform-async-to-generator": "7.16.0", - "@babel/plugin-transform-runtime": "7.16.4", - "@babel/preset-env": "7.16.4", - "@babel/runtime": "7.16.3", - "@babel/template": "7.16.0", - "@discoveryjs/json-ext": "0.5.6", - "@ngtools/webpack": "13.1.1", - "ansi-colors": "4.1.1", - "babel-loader": "8.2.3", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.1.0.tgz", + "integrity": "sha512-AtecSuDEPLYd3p7uFVKpoA0XNcq+NvVYFJK8h90BG+IRZtzEm7ZJeYdohXVeVfTO5GvpNFN1XoHxR5rxiXeBhg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.2.0", + "@angular-devkit/architect": "0.1401.0", + "@angular-devkit/build-webpack": "0.1401.0", + "@angular-devkit/core": "14.1.0", + "@babel/core": "7.18.6", + "@babel/generator": "7.18.7", + "@babel/helper-annotate-as-pure": "7.18.6", + "@babel/plugin-proposal-async-generator-functions": "7.18.6", + "@babel/plugin-transform-async-to-generator": "7.18.6", + "@babel/plugin-transform-runtime": "7.18.6", + "@babel/preset-env": "7.18.6", + "@babel/runtime": "7.18.6", + "@babel/template": "7.18.6", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "14.1.0", + "ansi-colors": "4.1.3", + "babel-loader": "8.2.5", "babel-plugin-istanbul": "6.1.1", "browserslist": "^4.9.1", - "cacache": "15.3.0", - "circular-dependency-plugin": "5.2.2", - "copy-webpack-plugin": "10.0.0", - "core-js": "3.19.3", - "critters": "0.0.15", - "css-loader": "6.5.1", - "esbuild-wasm": "0.14.2", - "glob": "7.2.0", - "https-proxy-agent": "5.0.0", - "inquirer": "8.2.0", - "jsonc-parser": "3.0.0", + "cacache": "16.1.1", + "copy-webpack-plugin": "11.0.0", + "critters": "0.0.16", + "css-loader": "6.7.1", + "esbuild-wasm": "0.14.49", + "glob": "8.0.3", + "https-proxy-agent": "5.0.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.1.0", "karma-source-map-support": "1.4.0", - "less": "4.1.2", - "less-loader": "10.2.0", - "license-webpack-plugin": "4.0.0", + "less": "4.1.3", + "less-loader": "11.0.0", + "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.0", - "mini-css-extract-plugin": "2.4.5", - "minimatch": "3.0.4", + "mini-css-extract-plugin": "2.6.1", + "minimatch": "5.1.0", "open": "8.4.0", "ora": "5.4.1", "parse5-html-rewriting-stream": "6.0.1", - "piscina": "3.1.0", - "postcss": "8.4.4", - "postcss-import": "14.0.2", - "postcss-loader": "6.2.1", - "postcss-preset-env": "6.7.0", + "piscina": "3.2.0", + "postcss": "8.4.14", + "postcss-import": "14.1.0", + "postcss-loader": "7.0.1", + "postcss-preset-env": "7.7.2", "regenerator-runtime": "0.13.9", - "resolve-url-loader": "4.0.0", + "resolve-url-loader": "5.0.0", "rxjs": "6.6.7", - "sass": "1.44.0", - "sass-loader": "12.4.0", - "semver": "7.3.5", - "source-map-loader": "3.0.0", + "sass": "1.53.0", + "sass-loader": "13.0.2", + "semver": "7.3.7", + "source-map-loader": "4.0.0", "source-map-support": "0.5.21", - "stylus": "0.55.0", - "stylus-loader": "6.2.0", - "terser": "5.10.0", + "stylus": "0.58.1", + "stylus-loader": "7.0.0", + "terser": "5.14.2", "text-table": "0.2.0", "tree-kill": "1.2.2", - "tslib": "2.3.1", - "webpack": "5.65.0", - "webpack-dev-middleware": "5.2.2", - "webpack-dev-server": "4.6.0", + "tslib": "2.4.0", + "webpack": "5.73.0", + "webpack-dev-middleware": "5.3.3", + "webpack-dev-server": "4.9.3", "webpack-merge": "5.8.0", - "webpack-subresource-integrity": "5.0.0" + "webpack-subresource-integrity": "5.1.0" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "node": "^14.15.0 || >=16.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.14.2" + "esbuild": "0.14.49" }, "peerDependencies": { - "@angular/compiler-cli": "^13.0.0 || ^13.1.0-next", - "@angular/localize": "^13.0.0 || ^13.1.0-next", - "@angular/service-worker": "^13.0.0 || ^13.1.0-next", + "@angular/compiler-cli": "^14.0.0", + "@angular/localize": "^14.0.0", + "@angular/service-worker": "^14.0.0", "karma": "^6.3.0", - "ng-packagr": "^13.0.0 || ^13.1.0-next", + "ng-packagr": "^14.0.0", "protractor": "^7.0.0", - "tailwindcss": "^2.0.0", - "typescript": ">=4.4.3 <4.6" + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=4.6.2 <4.8" }, "peerDependenciesMeta": { "@angular/localize": { @@ -301,215 +276,225 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "node_modules/@angular-devkit/build-angular/node_modules/@npmcli/move-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.0.tgz", + "integrity": "sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==", "dev": true, "dependencies": { - "@babel/highlight": "^7.16.0" + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=6.9.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", - "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "node_modules/@angular-devkit/build-angular/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "debug": "4" }, "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "node": ">= 6.0.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/@angular-devkit/build-angular/node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">=6" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "node_modules/@angular-devkit/build-angular/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "node_modules/@angular-devkit/build-angular/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": { - "@babel/types": "^7.16.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/helper-module-transforms": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", - "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", + "node_modules/@angular-devkit/build-angular/node_modules/autoprefixer": { + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], "dependencies": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" }, "engines": { - "node": ">=6.9.0" + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "node_modules/@angular-devkit/build-angular/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" + "balanced-match": "^1.0.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "node_modules/@angular-devkit/build-angular/node_modules/cacache": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.1.tgz", + "integrity": "sha512-VDKN+LHyCQXaaYZ7rA/qtkURU+/yYhviUdvqEv2LT6QPZU8jpyzEkEVAcKlKLt5dJ5BRp11ym8lo3NKLluEPLg==", "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" + }, "engines": { - "node": ">=6.9.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/helpers": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.5.tgz", - "integrity": "sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==", + "node_modules/@angular-devkit/build-angular/node_modules/cacache/node_modules/lru-cache": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz", + "integrity": "sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ==", "dev": true, - "dependencies": { - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - }, "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "node_modules/@angular-devkit/build-angular/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@angular-devkit/build-angular/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/@angular-devkit/build-angular/node_modules/css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", "dev": true, "dependencies": { - "debug": "4" + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" }, "engines": { - "node": ">= 6.0.0" + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@angular-devkit/build-angular/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@angular-devkit/build-angular/node_modules/css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" + }, "engines": { - "node": ">=8" + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@angular-devkit/build-angular/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==", + "node_modules/@angular-devkit/build-angular/node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" }, "engines": { - "node": ">=8" + "node": "^12 || ^14 || >=16" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@angular-devkit/build-angular/node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "node_modules/@angular-devkit/build-angular/node_modules/cssdb": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.6.3.tgz", + "integrity": "sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA==", "dev": true, - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" } }, "node_modules/@angular-devkit/build-angular/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -523,60 +508,20 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/esbuild": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.2.tgz", - "integrity": "sha512-l076A6o/PIgcyM24s0dWmDI/b8RQf41uWoJu9I0M71CtW/YSw5T5NUeXxs5lo2tFQD+O4CW4nBHJXx3OY5NpXg==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "optionalDependencies": { - "esbuild-android-arm64": "0.14.2", - "esbuild-darwin-64": "0.14.2", - "esbuild-darwin-arm64": "0.14.2", - "esbuild-freebsd-64": "0.14.2", - "esbuild-freebsd-arm64": "0.14.2", - "esbuild-linux-32": "0.14.2", - "esbuild-linux-64": "0.14.2", - "esbuild-linux-arm": "0.14.2", - "esbuild-linux-arm64": "0.14.2", - "esbuild-linux-mips64le": "0.14.2", - "esbuild-linux-ppc64le": "0.14.2", - "esbuild-netbsd-64": "0.14.2", - "esbuild-openbsd-64": "0.14.2", - "esbuild-sunos-64": "0.14.2", - "esbuild-windows-32": "0.14.2", - "esbuild-windows-64": "0.14.2", - "esbuild-windows-arm64": "0.14.2" - } - }, - "node_modules/@angular-devkit/build-angular/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/@angular-devkit/build-angular/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "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" + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": "*" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -592,9 +537,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "dependencies": { "agent-base": "6", @@ -604,10 +549,22 @@ "node": ">= 6" } }, + "node_modules/@angular-devkit/build-angular/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/inquirer": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", - "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", @@ -620,46 +577,25 @@ "mute-stream": "0.0.8", "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^7.2.0", + "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=12.0.0" } }, "node_modules/@angular-devkit/build-angular/node_modules/inquirer/node_modules/rxjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", - "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", + "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", "dev": true, "dependencies": { - "tslib": "~2.1.0" + "tslib": "^2.1.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/inquirer/node_modules/tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - }, "node_modules/@angular-devkit/build-angular/node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -675,6 +611,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@angular-devkit/build-angular/node_modules/jsonc-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", + "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -710,22 +664,558 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/build-angular/node_modules/postcss": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.4.tgz", - "integrity": "sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q==", + "node_modules/@angular-devkit/build-angular/node_modules/piscina": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", + "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", "dev": true, "dependencies": { - "nanoid": "^3.1.30", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0" + }, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.10" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-custom-properties": { + "version": "12.1.8", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.8.tgz", + "integrity": "sha512-8rbj8kVu00RQh2fQF81oBqtduiANu4MIxhyf0HbbStgPtnFlWn0yiaYTpLHrPnJbffVY1s9apWsIoVZcc68FxA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "dev": true, + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "dev": true, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "dev": true, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "dev": true, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "dev": true, + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "dev": true, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-nesting": { + "version": "10.1.10", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.10.tgz", + "integrity": "sha512-lqd7LXCq0gWc0wKXtoKDru5wEUNjm3OryLVNRZ8OnW8km6fSNUuFrjEhU3nklxXE2jvd4qrox566acgh+xQt8w==", + "dev": true, + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "dev": true, + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-preset-env": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.7.2.tgz", + "integrity": "sha512-1q0ih7EDsZmCb/FMDRvosna7Gsbdx8CvYO5hYT120hcp2ZAuOHpSzibujZ4JpIUcAC02PG6b+eftxqjTFh5BNA==", + "dev": true, + "dependencies": { + "@csstools/postcss-cascade-layers": "^1.0.4", + "@csstools/postcss-color-function": "^1.1.0", + "@csstools/postcss-font-format-keywords": "^1.0.0", + "@csstools/postcss-hwb-function": "^1.0.1", + "@csstools/postcss-ic-unit": "^1.0.0", + "@csstools/postcss-is-pseudo-class": "^2.0.6", + "@csstools/postcss-normalize-display-values": "^1.0.0", + "@csstools/postcss-oklab-function": "^1.1.0", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.1", + "@csstools/postcss-unset-value": "^1.0.1", + "autoprefixer": "^10.4.7", + "browserslist": "^4.21.0", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^6.6.3", + "postcss-attribute-case-insensitive": "^5.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.3", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.0", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.8", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.4", + "postcss-double-position-gradients": "^3.1.1", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.3", + "postcss-image-set-function": "^4.0.6", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.0", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.1.9", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.3", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.4", + "postcss-pseudo-class-any-link": "^7.1.5", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "dev": true, + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" } }, "node_modules/@angular-devkit/build-angular/node_modules/rimraf": { @@ -743,28 +1233,52 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "node_modules/@angular-devkit/build-angular/node_modules/rimraf/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": { - "tslib": "^1.9.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "npm": ">=2.0.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@angular-devkit/build-angular/node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "node_modules/@angular-devkit/build-angular/node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, "node_modules/@angular-devkit/build-angular/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -776,15 +1290,45 @@ "node": ">=10" } }, + "node_modules/@angular-devkit/build-angular/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/@angular-devkit/build-angular/node_modules/source-map-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/@angular-devkit/build-angular/node_modules/source-map-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz", + "integrity": "sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -795,13 +1339,16 @@ "source-map": "^0.6.0" } }, - "node_modules/@angular-devkit/build-angular/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==", + "node_modules/@angular-devkit/build-angular/node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, "engines": { - "node": ">=0.10.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/@angular-devkit/build-angular/node_modules/strip-ansi": { @@ -829,15 +1376,15 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/@angular-devkit/build-angular/node_modules/webpack-subresource-integrity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.0.0.tgz", - "integrity": "sha512-x9514FpLRydO+UAQ8DY4aLtCjxmdLkuQVcDFN1kGzuusREYJ1B0rzk/iIlWiL6dnvrhEGFj2+UsdxDkP8Z4UKg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", "dev": true, "dependencies": { "typed-assert": "^1.0.8" @@ -896,16 +1443,16 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1301.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1301.1.tgz", - "integrity": "sha512-drXKdqsM3uB4nII0pU8FtAI6cd96sza3r1mWl8mqJEkzgkYIGVK/2CekKdVe1AXAvEeQFVRDRMYXraMNpli/QQ==", + "version": "0.1401.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1401.0.tgz", + "integrity": "sha512-jKfnHal09mVnEapmNrAHXL/00LfafmfEUtlOPzQMgGJL7MWCeMcFthsbcOnGuzUerbiiquRk/KmLTERYjH+ZrQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1301.1", + "@angular-devkit/architect": "0.1401.0", "rxjs": "6.6.7" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "node": "^14.15.0 || >=16.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -914,39 +1461,20 @@ "webpack-dev-server": "^4.0.0" } }, - "node_modules/@angular-devkit/build-webpack/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/@angular-devkit/build-webpack/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@angular-devkit/core": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.1.1.tgz", - "integrity": "sha512-tpOOzdrbrXG+BiJ/iKUX5VU5vBXN/n+H1EMThTwjgT11mqw2uvMj4sSRPvHUrrfxbLE9deuCDQEzmci71enn2w==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.1.0.tgz", + "integrity": "sha512-Y2d/+nFmjjY4eatc3cwdDDAnpnhG3KTX2OVW7dXSUxW3eY5e3vdMlVUbFiKwvwAshlrJy85Y6RMvZSBN4VrpnA==", "dev": true, "dependencies": { - "ajv": "8.8.2", + "ajv": "8.11.0", "ajv-formats": "2.1.1", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", + "jsonc-parser": "3.1.0", "rxjs": "6.6.7", - "source-map": "0.7.3" + "source-map": "0.7.4" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "node": "^14.15.0 || >=16.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -960,9 +1488,9 @@ } }, "node_modules/@angular-devkit/core/node_modules/ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -992,124 +1520,124 @@ } } }, - "node_modules/@angular-devkit/core/node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, "node_modules/@angular-devkit/core/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/@angular-devkit/core/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "node_modules/@angular-devkit/core/node_modules/jsonc-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", + "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", + "dev": true + }, + "node_modules/@angular-devkit/core/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, "engines": { - "npm": ">=2.0.0" + "node": ">= 8" } }, - "node_modules/@angular-devkit/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@angular-devkit/schematics": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.1.1.tgz", - "integrity": "sha512-uDE0vzjx7MyiJOul91MYMVpRPnAW5/o+pHcINx85wR6t4/RDQSH3UdBCCFxxwv1W9YZSR4kMiwi/sUYqPqbQMw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.1.0.tgz", + "integrity": "sha512-5QC01k9eznuQSiqxijKhVkAEmA8sioYuLhBzyffaPszSySH8kPMNxhAc8zJhBTNLumbS6iDaGkSqTQl5Kv9fOw==", "dev": true, "dependencies": { - "@angular-devkit/core": "13.1.1", - "jsonc-parser": "3.0.0", - "magic-string": "0.25.7", + "@angular-devkit/core": "14.1.0", + "jsonc-parser": "3.1.0", + "magic-string": "0.26.2", "ora": "5.4.1", "rxjs": "6.6.7" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "node": "^14.15.0 || >=16.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/schematics/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "node_modules/@angular-devkit/schematics/node_modules/jsonc-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", + "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", + "dev": true + }, + "node_modules/@angular-devkit/schematics/node_modules/magic-string": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", + "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", "dev": true, "dependencies": { - "tslib": "^1.9.0" + "sourcemap-codec": "^1.4.8" }, "engines": { - "npm": ">=2.0.0" + "node": ">=12" } }, - "node_modules/@angular-devkit/schematics/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@angular/cli": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.1.1.tgz", - "integrity": "sha512-cdcl3UAhA2oQK8klDl9zt5SwScSg2F4VQDUQ8XsdApKIRlEfee1Xf7WXKsGpgAuojrFHMzDVWjAg/bOyIpioLg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.1.0.tgz", + "integrity": "sha512-W/t2PkGHu9r87po1ZXQRYU81VtjzNMuGsP5tmoW1pGuibK7Kj+25G+jrXK/WADTi+pjTMXHNXYn8PlMNAIrZ/w==", "dev": true, - "hasInstallScript": true, "dependencies": { - "@angular-devkit/architect": "0.1301.1", - "@angular-devkit/core": "13.1.1", - "@angular-devkit/schematics": "13.1.1", - "@schematics/angular": "13.1.1", + "@angular-devkit/architect": "0.1401.0", + "@angular-devkit/core": "14.1.0", + "@angular-devkit/schematics": "14.1.0", + "@schematics/angular": "14.1.0", "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.1", - "debug": "4.3.3", - "ini": "2.0.0", - "inquirer": "8.2.0", - "jsonc-parser": "3.0.0", - "npm-package-arg": "8.1.5", - "npm-pick-manifest": "6.1.1", + "ansi-colors": "4.1.3", + "debug": "4.3.4", + "ini": "3.0.0", + "inquirer": "8.2.4", + "jsonc-parser": "3.1.0", + "npm-package-arg": "9.1.0", + "npm-pick-manifest": "7.0.1", "open": "8.4.0", "ora": "5.4.1", - "pacote": "12.0.2", - "resolve": "1.20.0", - "semver": "7.3.5", + "pacote": "13.6.1", + "resolve": "1.22.1", + "semver": "7.3.7", "symbol-observable": "4.0.0", - "uuid": "8.3.2" + "uuid": "8.3.2", + "yargs": "17.5.1" }, "bin": { "ng": "bin/ng.js" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "node": "^14.15.0 || >=16.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular/cli/node_modules/@schematics/angular": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.1.1.tgz", - "integrity": "sha512-GY49qumsQ+w1aDsCa796iPL/GcokCVKr2OMLss3avwciBFciMOVsLxZ04lprPCivCQRcKNqbSDDx4+xH5qkrAg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.1.0.tgz", + "integrity": "sha512-lhqNZzA+iT3XwlwRU757mhYmd5WE9XB2OKFhosvvszou2zuNUJMDPR9P01ZVNCOa2fScOeCMg2q3ZDgGTBl96Q==", "dev": true, "dependencies": { - "@angular-devkit/core": "13.1.1", - "@angular-devkit/schematics": "13.1.1", - "jsonc-parser": "3.0.0" + "@angular-devkit/core": "14.1.0", + "@angular-devkit/schematics": "14.1.0", + "jsonc-parser": "3.1.0" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "node": "^14.15.0 || >=16.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, + "node_modules/@angular/cli/node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/@angular/cli/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1151,9 +1679,9 @@ } }, "node_modules/@angular/cli/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -1177,18 +1705,18 @@ } }, "node_modules/@angular/cli/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz", + "integrity": "sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==", "dev": true, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/@angular/cli/node_modules/inquirer": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", - "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", @@ -1201,13 +1729,14 @@ "mute-stream": "0.0.8", "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^7.2.0", + "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6" + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" } }, "node_modules/@angular/cli/node_modules/is-docker": { @@ -1225,6 +1754,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@angular/cli/node_modules/jsonc-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", + "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", + "dev": true + }, "node_modules/@angular/cli/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -1248,32 +1783,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular/cli/node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/@angular/cli/node_modules/rxjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", - "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", + "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", "dev": true, "dependencies": { - "tslib": "~2.1.0" + "tslib": "^2.1.0" } }, "node_modules/@angular/cli/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -1309,12 +1831,6 @@ "node": ">=8" } }, - "node_modules/@angular/cli/node_modules/tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - }, "node_modules/@angular/cli/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -1325,43 +1841,50 @@ } }, "node_modules/@angular/common": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.1.0.tgz", - "integrity": "sha512-bDuxl9N2fsaDrkNNuyNEdXMLwCCkjT9ru03QzP+b9RxmCBoUGeHD0uN61N5PMrsKq2RxB6jv4MJQJjT+jQqTsA==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.1.0.tgz", + "integrity": "sha512-leethDtLbA3qySaOEBUto602DF0qH1maK9u2zHncrUFOpnHAYUEd7N9MFMdIYASurTnwOSglEoIDCML94qzImQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + "node": "^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/core": "13.1.0", + "@angular/core": "14.1.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.1.0.tgz", - "integrity": "sha512-l5qE3e+I/ogjVtXVHK0VoBOTE7N71dUcshI7Cvh5J7dFLKqbkYIr9xAP1D1tEVR6h9mzOVP5qD/M5ylR51rrOA==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-14.1.0.tgz", + "integrity": "sha512-aLbtpFDF3fp/DOEsWSdpszmoNZAb0To/zoKhHVmEReuUKkMtlPNd3+e6wkR2vrvR/cWgbKwdb7RQ1IQtGDu74A==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + "node": "^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/core": "14.1.0" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } } }, "node_modules/@angular/compiler-cli": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.1.0.tgz", - "integrity": "sha512-AUfRF3+hqy2M1TFvi70OiC13Ew9IzzTAbZppGF+N7f5ZbhyuZyGNy/gs3BxlZC0Up5ZQo7GcMHwPxovLNvgFMA==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.1.0.tgz", + "integrity": "sha512-llJkDnv0+riTdRPdOJv/FToz4X9ZO1URnalW+tIe2RyfOzkEqM+VLD/x+3cVgnsaFKuoPxIjZEkMoppGwVB4kg==", "dev": true, "dependencies": { - "@babel/core": "^7.8.6", - "canonical-path": "1.0.0", + "@babel/core": "^7.17.2", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", "dependency-graph": "^0.11.0", - "magic-string": "^0.25.0", + "magic-string": "^0.26.0", "reflect-metadata": "^0.1.2", "semver": "^7.0.0", "sourcemap-codec": "^1.4.8", @@ -1374,17 +1897,29 @@ "ngcc": "bundles/ngcc/main-ngcc.js" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + "node": "^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/compiler": "13.1.0", - "typescript": ">=4.4.2 <4.6" + "@angular/compiler": "14.1.0", + "typescript": ">=4.6.2 <4.8" + } + }, + "node_modules/@angular/compiler-cli/node_modules/magic-string": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", + "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + }, + "engines": { + "node": ">=12" } }, "node_modules/@angular/compiler-cli/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -1396,21 +1931,15 @@ "node": ">=10" } }, - "node_modules/@angular/compiler-cli/node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, "node_modules/@angular/core": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.1.0.tgz", - "integrity": "sha512-eW+8dqGUqVbuzmFdyjhwizzH1FF9Mey5tvRZqzDSG1nTzlMgzQfrF/R0NEuqJdxUyjDFXiO4NyhUivFQ65CsdA==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-14.1.0.tgz", + "integrity": "sha512-3quEsHmQifJOQ2oij5K+cjGjmhsKsyZI1+OTHWNZ6IXeuYviZv4U/Cui9fUJ1RN3CZxH3NzWB3gB/5qYFQfOgg==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + "node": "^14.15.0 || >=16.10.0" }, "peerDependencies": { "rxjs": "^6.5.3 || ^7.4.0", @@ -1418,45 +1947,45 @@ } }, "node_modules/@angular/forms": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.1.0.tgz", - "integrity": "sha512-sf9I8wftUk2+bTbdaVH2ioTXw5UfKNl0P4XFUoFxDuAzUxxlxN/ocY/VzevIEtQfoAwUp8eawnN9BkIXy+EMww==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-14.1.0.tgz", + "integrity": "sha512-y7VQ2t+/ASEjzt8zXg4y5b03lMSPHmnhy4XzjDT14ZFrALaSxyhkSqoBfAksPkTeKmsFMnP/VgLboRsE8TLs0Q==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + "node": "^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/common": "13.1.0", - "@angular/core": "13.1.0", - "@angular/platform-browser": "13.1.0", + "@angular/common": "14.1.0", + "@angular/core": "14.1.0", + "@angular/platform-browser": "14.1.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-13.1.0.tgz", - "integrity": "sha512-tpK/0CljInRJNP/nizQ8Bj0yFsLLmbcqAJ5yUp4uDM9nVpgmHxzJIIpR/Sk+8KKMlED5eGRXjZKPY4zhlJTmqw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-14.1.0.tgz", + "integrity": "sha512-ldL4xMDjXYZ93FCEIBVGipx9Qfgr7NuBNO+e25d+nWikXrUOnLfvF4UOL/TSUwSwqN4jxDI2KMNQIF6SecZfvQ==", "dev": true, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + "node": "^14.15.0 || >=16.10.0" } }, "node_modules/@angular/platform-browser": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.1.0.tgz", - "integrity": "sha512-2c1OdOefpGVuIgFD0bojtEzPttXMC+iC8h/4fMpmW4v9JyRvTgPV2OPIpgfT25fTnGLQAJ19C8VG/S1J/JlXMw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.1.0.tgz", + "integrity": "sha512-axNXUSqxsP0QSdNskd1pFo2uMo1UNoFaSAB02eDWwLkWQ1pWel+T78HiQY2bNeI3elgzjwPTT4vCCDQKNVTNig==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + "node": "^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/animations": "13.1.0", - "@angular/common": "13.1.0", - "@angular/core": "13.1.0" + "@angular/animations": "14.1.0", + "@angular/common": "14.1.0", + "@angular/core": "14.1.0" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1465,36 +1994,36 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.1.0.tgz", - "integrity": "sha512-rLFOHejw3ifJZapze0q/tHopFUZw+u/2biLFNffo+Z3UFsKI/PrBq9F+NVXnLdWzJNRY+NiI8ZFctJ9u4H39GQ==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.1.0.tgz", + "integrity": "sha512-0Lxz3HJ9qTOyMTp5Qud2tycP7wqe+tnHOSUqDywrbNRozTKGX0z3i+l0KMku3BtUbuMi3tJomqV914/dtbCvIw==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + "node": "^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/common": "13.1.0", - "@angular/compiler": "13.1.0", - "@angular/core": "13.1.0", - "@angular/platform-browser": "13.1.0" + "@angular/common": "14.1.0", + "@angular/compiler": "14.1.0", + "@angular/core": "14.1.0", + "@angular/platform-browser": "14.1.0" } }, "node_modules/@angular/router": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.1.0.tgz", - "integrity": "sha512-A/8O0GGLKENg5wxP7TFTPWmDtyMOL9qq65uxYQCyv46/2ra76FKteFg9UzcuuXPBiCAxD1wbL5kRF2MZlfrQ3Q==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-14.1.0.tgz", + "integrity": "sha512-WBC1E+d9RS8vy57zJ6LVtWT3AM12mEHY7SCMBRJNBcrmBYJwojxeV8IVkUoW4Ds910gG/w3LjIN0eNHg5qRtNA==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + "node": "^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/common": "13.1.0", - "@angular/core": "13.1.0", - "@angular/platform-browser": "13.1.0", + "@angular/common": "14.1.0", + "@angular/core": "14.1.0", + "@angular/platform-browser": "14.1.0", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1505,45 +2034,47 @@ "dev": true }, "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==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, "dependencies": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", - "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helpers": "^7.9.0", - "@babel/parser": "^7.9.0", - "@babel/template": "^7.8.6", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", + "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helpers": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -1553,26 +2084,6 @@ "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/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/debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -1589,72 +2100,77 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@babel/core/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "engines": { - "node": ">=0.10.0" + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", + "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", "dev": true, "dependencies": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.18.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", - "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.5.tgz", - "integrity": "sha512-3JEA9G5dmmnIWdzaT9d0NmFRgYnWUThLsDaL7982H0XqqWr56lRrsmwheXFMjR+TMl7QMBb6mzy9kvgr1lRLUA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", "dev": true, "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", - "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.17.5", + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", "semver": "^6.3.0" }, "engines": { @@ -1674,18 +2190,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.5.tgz", - "integrity": "sha512-NEohnYA7mkB8L5JhU7BLwcBdU3j83IziR9aseMueWGeAjblbul3zzb8UvJ3a1zuBiqCMObzCJHFqKIQE6hTVmg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", + "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-member-expression-to-functions": "^7.16.5", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.5", - "@babel/helper-split-export-declaration": "^7.16.0" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1694,54 +2210,14 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz", - "integrity": "sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", - "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-replace-supers": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz", - "integrity": "sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-member-expression-to-functions": "^7.16.5", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz", - "integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", + "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "regexpu-core": "^4.7.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" }, "engines": { "node": ">=6.9.0" @@ -1751,9 +2227,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz", - "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.13.0", @@ -1769,22 +2245,10 @@ "@babel/core": "^7.4.0-0" } }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -1814,234 +2278,250 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz", - "integrity": "sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz", - "integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", "dev": true, "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", - "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "dev": true, "dependencies": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", - "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", - "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", "dev": true, "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz", - "integrity": "sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.10.5" - } - }, "node_modules/@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "dependencies": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.5.tgz", - "integrity": "sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.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==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "dev": true, "dependencies": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", - "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.5.tgz", - "integrity": "sha512-X+aAJldyxrOmN9v3FKp+Hu1NO69VWgYgDGq6YDykwRPzxs5f2N+X988CBXS7EQahDU+Vpet5QYMqLk+nsp+Qxw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-wrap-function": "^7.16.5", - "@babel/types": "^7.16.0" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", + "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", "dev": true, "dependencies": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", "dev": true, "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", - "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.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 + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.5.tgz", - "integrity": "sha512-2J2pmLBqUqVdJw78U0KPNdeE2qeuIyKoG4mKV7wAq3mc4jJG282UgjZw4ZYDnqiWQuS3Y3IYdF/AQ6CpyBV3VA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz", + "integrity": "sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" + "@babel/helper-function-name": "^7.18.9", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", "dev": true, "dependencies": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.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==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.5.tgz", - "integrity": "sha512-+Ce7T5iPNWzfu9C1aB5tN3Lyafs5xb3Ic7vBWyZL2KXT3QSdD1dD3CvgOzPmQKoNNRt6uauc0XwNJTQtXC2/Mw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -2051,12 +2531,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz", - "integrity": "sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2066,14 +2546,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz", - "integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2083,13 +2563,14 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", - "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", + "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.4", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -2100,13 +2581,13 @@ } }, "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.5.tgz", - "integrity": "sha512-pJD3HjgRv83s5dv1sTnDbZOaTjghKEz8KUn1Kbh2eAIRhGuyQ1XSeI4xVXU3UlIEVA3DAyIdxqT1eRn7Wcn55A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.5", - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2116,13 +2597,13 @@ } }, "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.5.tgz", - "integrity": "sha512-EEFzuLZcm/rNJ8Q5krK+FRKdVkd6FjfzT9tuSZql9sQn64K0hHA2KLJ0DqVot9/iV6+SsuadC5yI39zWnm+nmQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.5", - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -2133,12 +2614,12 @@ } }, "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.5.tgz", - "integrity": "sha512-P05/SJZTTvHz79LNYTF8ff5xXge0kk5sIIWAypcWgX4BTRUgyHc8wRxJ/Hk+mU0KXldgOOslKaeqnhthcDJCJQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -2149,12 +2630,12 @@ } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.5.tgz", - "integrity": "sha512-i+sltzEShH1vsVydvNaTRsgvq2vZsfyrd7K7vPLUU/KgS0D5yZMe6uipM0+izminnkKrEfdUnz7CxMRb6oHZWw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -2165,12 +2646,12 @@ } }, "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.5.tgz", - "integrity": "sha512-QQJueTFa0y9E4qHANqIvMsuxM/qcLQmKttBACtPCQzGUEizsXDACGonlPiSwynHfOa3vNw0FPMVvQzbuXwh4SQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -2181,12 +2662,12 @@ } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.5.tgz", - "integrity": "sha512-xqibl7ISO2vjuQM+MzR3rkd0zfNWltk7n9QhaD8ghMmMceVguYrNDt7MikRyj4J4v3QehpnrU8RYLnC7z/gZLA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -2197,12 +2678,12 @@ } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.5.tgz", - "integrity": "sha512-YwMsTp/oOviSBhrjwi0vzCUycseCYwoXnLiXIL3YNjHSMBHicGTz7GjVU/IGgz4DtOEXBdCNG72pvCX22ehfqg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -2213,12 +2694,12 @@ } }, "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.5.tgz", - "integrity": "sha512-DvB9l/TcsCRvsIV9v4jxR/jVP45cslTVC0PMVHvaJhhNuhn2Y1SOhCSFlPK777qLB5wb8rVDaNoqMTyOqtY5Iw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -2229,16 +2710,16 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.5.tgz", - "integrity": "sha512-UEd6KpChoyPhCoE840KRHOlGhEZFutdPDMGj+0I56yuTTOaT51GzmnEl/0uT41fB/vD2nT+Pci2KjezyE3HmUw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", + "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-compilation-targets": "^7.16.3", - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.5" + "@babel/plugin-transform-parameters": "^7.18.8" }, "engines": { "node": ">=6.9.0" @@ -2248,12 +2729,12 @@ } }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.5.tgz", - "integrity": "sha512-ihCMxY1Iljmx4bWy/PIMJGXN4NS4oUj1MKynwO07kiKms23pNvIn1DMB92DNB2R0EA882sw0VXIelYGdtF7xEQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -2264,13 +2745,13 @@ } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.5.tgz", - "integrity": "sha512-kzdHgnaXRonttiTfKYnSVafbWngPPr2qKw9BWYBESl91W54e+9R5pP70LtWxV56g0f05f/SQrwHYkfvbwcdQ/A==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -2281,13 +2762,13 @@ } }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.5.tgz", - "integrity": "sha512-+yFMO4BGT3sgzXo+lrq7orX5mAZt57DwUK6seqII6AcJnJOIhBJ8pzKH47/ql/d426uQ7YhN8DpUFirQzqYSUA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.5", - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2297,14 +2778,14 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.5.tgz", - "integrity": "sha512-+YGh5Wbw0NH3y/E5YMu6ci5qTDmAEVNoZ3I54aB6nVEOZ5BQ7QJlwKq5pYVucQilMByGn/bvX0af+uNaPRCabA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-create-class-features-plugin": "^7.16.5", - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -2315,13 +2796,13 @@ } }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.5.tgz", - "integrity": "sha512-s5sKtlKQyFSatt781HQwv1hoM5BQ9qRH30r+dK56OLDsHmV74mzwJNX7R1yMuE7VZKG5O6q/gmOGSAO6ikTudg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=4" @@ -2393,6 +2874,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "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", @@ -2508,12 +3004,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.5.tgz", - "integrity": "sha512-8bTHiiZyMOyfZFULjsCnYOWG059FVMes0iljEHSfARhNgFfpsqE92OrCffv3veSw9rwMkYcFe9bj0ZoXU2IGtQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2523,14 +3019,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", - "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.0" + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2539,25 +3035,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.5.tgz", - "integrity": "sha512-BxmIyKLjUGksJ99+hJyL/HIxLIGnLKtw772zYDER7UuycDZ+Xvzs98ZQw6NGgM2ss4/hlFAaGiZmMNKvValEjw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2567,12 +3051,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.5.tgz", - "integrity": "sha512-JxjSPNZSiOtmxjX7PBRBeRJTUKTyJ607YUYeT0QJCNdsedOe+/rXITjP08eG8xUpsLfPirgzdCFN+h0w6RI+pQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", + "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2582,18 +3066,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.5.tgz", - "integrity": "sha512-DzJ1vYf/7TaCYy57J3SJ9rV+JEuvmlnvvyvYKFbk5u46oQbBvuB9/0w+YsVsxkOv8zVWKpDmUoj4T5ILHoXevA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-plugin-utils": "^7.16.5", - "@babel/helper-replace-supers": "^7.16.5", - "@babel/helper-split-export-declaration": "^7.16.0", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", + "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, "engines": { @@ -2603,53 +3087,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz", - "integrity": "sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", - "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-replace-supers": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz", - "integrity": "sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-member-expression-to-functions": "^7.16.5", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.5.tgz", - "integrity": "sha512-n1+O7xtU5lSLraRzX88CNcpl7vtGdPakKzww74bVwpAIRgz9JVLJJpOLb0uYqcOaXVM0TL6X0RVeIJGD2CnCkg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2659,12 +3103,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.5.tgz", - "integrity": "sha512-GuRVAsjq+c9YPK6NeTkRLWyQskDC099XkBSVO+6QzbnOnH2d/4mBVXYStaPrZD3dFRfg00I6BFJ9Atsjfs8mlg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", + "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2674,13 +3118,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.5.tgz", - "integrity": "sha512-iQiEMt8Q4/5aRGHpGVK2Zc7a6mx7qEAO7qehgSug3SDImnuMzgmm/wtJALXaz25zUj1PmnNHtShjFgk4PDx4nw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2690,12 +3134,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.5.tgz", - "integrity": "sha512-81tijpDg2a6I1Yhj4aWY1l3O1J4Cg/Pd7LfvuaH2VVInAkXtzibz9+zSPdUM1WvuUi128ksstAP0hM5w48vQgg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2705,13 +3149,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.5.tgz", - "integrity": "sha512-12rba2HwemQPa7BLIKCzm1pT2/RuQHtSFHdNl41cFiC6oi4tcrp7gjB07pxQvFpcADojQywSjblQth6gJyE6CA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.5", - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2721,12 +3165,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.5.tgz", - "integrity": "sha512-+DpCAJFPAvViR17PIMi9x2AE34dll5wNlXO43wagAX2YcRGgEVHCNFC4azG85b4YyyFarvkc/iD5NPrz4Oneqw==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2736,13 +3180,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.5.tgz", - "integrity": "sha512-Fuec/KPSpVLbGo6z1RPw4EE1X+z9gZk1uQmnYy7v4xr4TO9p41v1AoUuXEtyqAI7H+xNJYSICzRqZBhDEkd3kQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2752,12 +3197,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.5.tgz", - "integrity": "sha512-B1j9C/IfvshnPcklsc93AVLTrNVa69iSqztylZH6qnmiAsDDOmmjEYqOm3Ts2lGSgTSywnBNiqC949VdD0/gfw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2767,12 +3212,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.5.tgz", - "integrity": "sha512-d57i3vPHWgIde/9Y8W/xSFUndhvhZN5Wu2TjRrN1MVz5KzdUihKnfDVlfP1U7mS5DNj/WHHhaE4/tTi4hIyHwQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2782,13 +3227,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.5.tgz", - "integrity": "sha512-oHI15S/hdJuSCfnwIz+4lm6wu/wBn7oJ8+QrkzPPwSFGXk8kgdI/AIKcbR/XnD1nQVMg/i6eNaXpszbGuwYDRQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", + "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.16.5", - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -2798,67 +3243,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-module-transforms": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", - "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.5.tgz", - "integrity": "sha512-ABhUkxvoQyqhCWyb8xXtfwqNMJD7tx+irIRnUh6lmyFud7Jln1WzONXKlax1fg/ey178EXbs4bSGNd6PngO+SQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", + "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.16.5", - "@babel/helper-plugin-utils": "^7.16.5", - "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -2868,68 +3261,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-module-transforms": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", - "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.5.tgz", - "integrity": "sha512-53gmLdScNN28XpjEVIm7LbWnD/b/TpbwKbLk6KV4KqC9WyU6rq1jnNmVG6UgAdQZVVGZVoik3DqHNxk4/EvrjA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", + "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.5", - "@babel/helper-plugin-utils": "^7.16.5", - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -2939,66 +3280,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-module-transforms": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", - "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.5.tgz", - "integrity": "sha512-qTFnpxHMoenNHkS3VoWRdwrcJ3FhX567GvDA3hRZKF0Dj8Fmg0UzySZp3AP2mShl/bzcywb/UWAMQIjA1bhXvw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.16.5", - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3007,65 +3296,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-module-transforms": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", - "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.5.tgz", - "integrity": "sha512-/wqGDgvFUeKELW6ex6QB7dLVRkd5ehjw34tpXu1nhKC0sFfmaLabIswnpf8JgDyV2NeDmZiwoOb0rAmxciNfjA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", + "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3075,12 +3313,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.5.tgz", - "integrity": "sha512-ZaIrnXF08ZC8jnKR4/5g7YakGVL6go6V9ql6Jl3ecO8PQaQqFE74CuM384kezju7Z9nGCCA20BqZaR1tJ/WvHg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3090,13 +3328,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.5.tgz", - "integrity": "sha512-tded+yZEXuxt9Jdtkc1RraW1zMF/GalVxaVVxh41IYwirdRgyAxxxCKZ9XB7LxZqmsjfjALxupNE1MIz9KH+Zg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5", - "@babel/helper-replace-supers": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3105,53 +3343,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz", - "integrity": "sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", - "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-replace-supers": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz", - "integrity": "sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-member-expression-to-functions": "^7.16.5", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.5.tgz", - "integrity": "sha512-B3O6AL5oPop1jAVg8CV+haeUte9oFuY85zu0jwnRNZZi3tVAbJriu5tag/oaO2kGaQM/7q7aGPBlTI5/sr9enA==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3161,12 +3359,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.5.tgz", - "integrity": "sha512-+IRcVW71VdF9pEH/2R/Apab4a19LVvdVsr/gEeotH00vSDVlKD+XgfSIw+cgGWsjDB/ziqGv/pGoQZBIiQVXHg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3176,12 +3374,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.5.tgz", - "integrity": "sha512-2z+it2eVWU8TtQQRauvGUqZwLy4+7rTfo6wO4npr+fvvN1SW30ZF3O/ZRCNmTuu4F5MIP8OJhXAhRV5QMJOuYg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", "dev": true, "dependencies": { - "regenerator-transform": "^0.14.2" + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" }, "engines": { "node": ">=6.9.0" @@ -3191,12 +3390,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.5.tgz", - "integrity": "sha512-aIB16u8lNcf7drkhXJRoggOxSTUAuihTSTfAcpynowGJOZiGf+Yvi7RuTwFzVYSYPmWyARsPqUGoZWWWxLiknw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3206,16 +3405,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz", - "integrity": "sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.6.tgz", + "integrity": "sha512-8uRHk9ZmRSnWqUgyae249EJZ94b0yAGLBIqzZzl+0iEdbno55Pmlt/32JZsHwXD9k/uZj18Aqqk35wBX4CBTXA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.4.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "babel-plugin-polyfill-corejs2": "^0.3.1", + "babel-plugin-polyfill-corejs3": "^0.5.2", + "babel-plugin-polyfill-regenerator": "^0.3.1", "semver": "^6.3.0" }, "engines": { @@ -3225,18 +3424,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -3247,12 +3434,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.5.tgz", - "integrity": "sha512-ZbuWVcY+MAXJuuW7qDoCwoxDUNClfZxoo7/4swVbOW1s/qYLOMHlm9YRWMsxMFuLs44eXsv4op1vAaBaBaDMVg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3262,13 +3449,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.5.tgz", - "integrity": "sha512-5d6l/cnG7Lw4tGHEoga4xSkYp1euP7LAtrah1h1PgJ3JY7yNsjybsxQAnVK4JbtReZ/8z6ASVmd3QhYYKLaKZw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", + "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -3278,12 +3465,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.5.tgz", - "integrity": "sha512-usYsuO1ID2LXxzuUxifgWtJemP7wL2uZtyrTVM4PKqsmJycdS4U4mGovL5xXkfUheds10Dd2PjoQLXw6zCsCbg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3293,12 +3480,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.5.tgz", - "integrity": "sha512-gnyKy9RyFhkovex4BjKWL3BVYzUDG6zC0gba7VMLbQoDuqMfJ1SDXs8k/XK41Mmt1Hyp4qNAvGFb9hKzdCqBRQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -3308,12 +3495,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.5.tgz", - "integrity": "sha512-ldxCkW180qbrvyCVDzAUZqB0TAeF8W/vGJoRcaf75awm6By+PxfJKvuqVAnq8N9wz5Xa6mSpM19OfVKKVmGHSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -3323,12 +3510,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.5.tgz", - "integrity": "sha512-shiCBHTIIChGLdyojsKQjoAyB8MBwat25lKM7MJjbe1hE0bgIppD+LX9afr41lLHOhqceqeWl4FkLp+Bgn9o1Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", + "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3338,13 +3525,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.5.tgz", - "integrity": "sha512-GTJ4IW012tiPEMMubd7sD07iU9O/LOo8Q/oU4xNhcaq0Xn8+6TcUQaHtC8YxySo1T+ErQ8RaWogIEeFhKGNPzw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3354,37 +3541,38 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", - "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-compilation-targets": "^7.16.3", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-async-generator-functions": "^7.16.4", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-class-static-block": "^7.16.0", - "@babel/plugin-proposal-dynamic-import": "^7.16.0", - "@babel/plugin-proposal-export-namespace-from": "^7.16.0", - "@babel/plugin-proposal-json-strings": "^7.16.0", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-object-rest-spread": "^7.16.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-proposal-private-property-in-object": "^7.16.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", + "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-async-generator-functions": "^7.18.6", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.6", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.18.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -3394,44 +3582,44 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.0", - "@babel/plugin-transform-async-to-generator": "^7.16.0", - "@babel/plugin-transform-block-scoped-functions": "^7.16.0", - "@babel/plugin-transform-block-scoping": "^7.16.0", - "@babel/plugin-transform-classes": "^7.16.0", - "@babel/plugin-transform-computed-properties": "^7.16.0", - "@babel/plugin-transform-destructuring": "^7.16.0", - "@babel/plugin-transform-dotall-regex": "^7.16.0", - "@babel/plugin-transform-duplicate-keys": "^7.16.0", - "@babel/plugin-transform-exponentiation-operator": "^7.16.0", - "@babel/plugin-transform-for-of": "^7.16.0", - "@babel/plugin-transform-function-name": "^7.16.0", - "@babel/plugin-transform-literals": "^7.16.0", - "@babel/plugin-transform-member-expression-literals": "^7.16.0", - "@babel/plugin-transform-modules-amd": "^7.16.0", - "@babel/plugin-transform-modules-commonjs": "^7.16.0", - "@babel/plugin-transform-modules-systemjs": "^7.16.0", - "@babel/plugin-transform-modules-umd": "^7.16.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", - "@babel/plugin-transform-new-target": "^7.16.0", - "@babel/plugin-transform-object-super": "^7.16.0", - "@babel/plugin-transform-parameters": "^7.16.3", - "@babel/plugin-transform-property-literals": "^7.16.0", - "@babel/plugin-transform-regenerator": "^7.16.0", - "@babel/plugin-transform-reserved-words": "^7.16.0", - "@babel/plugin-transform-shorthand-properties": "^7.16.0", - "@babel/plugin-transform-spread": "^7.16.0", - "@babel/plugin-transform-sticky-regex": "^7.16.0", - "@babel/plugin-transform-template-literals": "^7.16.0", - "@babel/plugin-transform-typeof-symbol": "^7.16.0", - "@babel/plugin-transform-unicode-escapes": "^7.16.0", - "@babel/plugin-transform-unicode-regex": "^7.16.0", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.18.6", + "@babel/plugin-transform-classes": "^7.18.6", + "@babel/plugin-transform-computed-properties": "^7.18.6", + "@babel/plugin-transform-destructuring": "^7.18.6", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.6", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.6", + "@babel/plugin-transform-function-name": "^7.18.6", + "@babel/plugin-transform-literals": "^7.18.6", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.18.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.6", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.18.6", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.6", + "@babel/plugin-transform-typeof-symbol": "^7.18.6", + "@babel/plugin-transform-unicode-escapes": "^7.18.6", + "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.0", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.4.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.19.1", + "@babel/types": "^7.18.6", + "babel-plugin-polyfill-corejs2": "^0.3.1", + "babel-plugin-polyfill-corejs3": "^0.5.2", + "babel-plugin-polyfill-regenerator": "^0.3.1", + "core-js-compat": "^3.22.1", "semver": "^6.3.0" }, "engines": { @@ -3467,9 +3655,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", - "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", + "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" @@ -3479,68 +3667,33 @@ } }, "node_modules/@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", "dev": true, "dependencies": { - "@babel/highlight": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template/node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template/node_modules/@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", - "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.5", - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.5", - "@babel/types": "^7.16.0", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", + "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.9", + "@babel/types": "^7.18.9", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -3548,53 +3701,32 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", - "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", "dev": true, "dependencies": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.18.9", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, "node_modules/@babel/traverse/node_modules/debug": { @@ -3620,37 +3752,19 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@babel/traverse/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/@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/types/node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -3669,21 +3783,276 @@ "node": ">=4.0.0" } }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.0.5.tgz", + "integrity": "sha512-Id/9wBT7FkgFzdEpiEWrsVd4ltDxN0rI0QS0SChbeQiSuux3z21SJCRLu6h2cvCEUmaRi+VD0mHFj+GJD4GFnw==", + "dev": true, + "dependencies": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "dev": true, + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "dev": true, + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "dev": true, + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "dev": true, + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "dev": true, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", + "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", + "dev": true, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2", + "postcss-selector-parser": "^6.0.10" + } + }, "node_modules/@discoveryjs/json-ext": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", - "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, "engines": { "node": ">=10.0.0" } }, "node_modules/@gar/promisify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", - "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "dev": true }, + "node_modules/@graphefruit/coffee-bluetooth-devices": { + "version": "0.0.14", + "resolved": "file:../../graphefruit-coffee-bluetooth-devices-0.0.14.tgz", + "integrity": "sha512-eePday/7pxBiLbD+RgyvMJaajar8oZSW7Pf+OaRpYmlP3QiHS4z/i3+s7XZ0v9XI7Xnp7mAoNOn9t0ORH+FEiw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^14.1.0", + "@angular/core": "^14.1.0" + } + }, "node_modules/@ionic-native/android-permissions": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/android-permissions/-/android-permissions-5.33.1.tgz", @@ -4410,18 +4779,6 @@ "node": ">=0.10.0" } }, - "node_modules/@ionic/angular-toolkit/node_modules/@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@ionic/angular-toolkit/node_modules/@babel/core": { "version": "7.14.8", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.8.tgz", @@ -4533,114 +4890,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@ionic/angular-toolkit/node_modules/@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@ionic/angular-toolkit/node_modules/@babel/helper-module-transforms": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", - "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@ionic/angular-toolkit/node_modules/@babel/helper-module-transforms/node_modules/@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@ionic/angular-toolkit/node_modules/@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@ionic/angular-toolkit/node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@ionic/angular-toolkit/node_modules/@babel/helpers": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.5.tgz", - "integrity": "sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@ionic/angular-toolkit/node_modules/@babel/helpers/node_modules/@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@ionic/angular-toolkit/node_modules/@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@ionic/angular-toolkit/node_modules/@babel/plugin-proposal-async-generator-functions": { "version": "7.14.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", @@ -5134,53 +5383,12 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/@ionic/angular-toolkit/node_modules/copy-webpack-plugin/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -5682,15 +5890,6 @@ "node": ">= 4.0" } }, - "node_modules/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -6099,27 +6298,6 @@ "node": ">=0.10.0" } }, - "node_modules/@ionic/angular-toolkit/node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@ionic/angular-toolkit/node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "dependencies": { - "mime-db": "1.51.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/@ionic/angular-toolkit/node_modules/mini-css-extract-plugin": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.2.tgz", @@ -6338,24 +6516,6 @@ "node": ">=0.10" } }, - "node_modules/@ionic/angular-toolkit/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/@ionic/angular-toolkit/node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@ionic/angular-toolkit/node_modules/sass": { "version": "1.36.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.36.0.tgz", @@ -6448,12 +6608,6 @@ "node": ">=0.10.0" } }, - "node_modules/@ionic/angular-toolkit/node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, "node_modules/@ionic/angular-toolkit/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -7121,12 +7275,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@ionic/angular-toolkit/node_modules/webpack/node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, "node_modules/@ionic/angular-toolkit/node_modules/webpack/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -7962,6 +8110,19 @@ "node": ">=8" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-1.0.0.tgz", @@ -7971,6 +8132,64 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jsdevtools/coverage-istanbul-loader": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", @@ -8022,6 +8241,12 @@ "semver": "bin/semver.js" } }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, "node_modules/@netflix/nerror": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@netflix/nerror/-/nerror-1.1.3.tgz", @@ -8043,19 +8268,19 @@ ] }, "node_modules/@ngtools/webpack": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.1.1.tgz", - "integrity": "sha512-TGCuscGFNHPoXScswuj9UxNv8E+A/PXs5XH8cyTtbkmlpBec1EShnaUTdDP5nhykjjaWzd3TLChlp9DinE+Ctg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.1.0.tgz", + "integrity": "sha512-d4U6ymDCXckVgfjYEv1Wjzd78ZSm0NKgq8mN6FdlrCupg02LPIODjeKyNr4c4zwMAOJeHkVNEZ+USoDEK3XSsw==", "dev": true, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "node": "^14.15.0 || >=16.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^13.0.0 || ^13.1.0-next", - "typescript": ">=4.4.3 <4.6", - "webpack": "^5.30.0" + "@angular/compiler-cli": "^14.0.0", + "typescript": ">=4.6.2 <4.8", + "webpack": "^5.54.0" } }, "node_modules/@ngx-translate/core": { @@ -8129,23 +8354,22 @@ } }, "node_modules/@npmcli/fs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.0.tgz", - "integrity": "sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA==", - "deprecated": "this version had an improper engines field added, update to 1.1.1", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.1.tgz", + "integrity": "sha512-1Q0uzx6c/NVNGszePbr5Gc2riSU1zLpNlo/1YWntH+eaPmMgBssAW0qXofCVkpdj3ce4swZtlDYQu+NKiYcptg==", "dev": true, "dependencies": { - "@gar/promisify": "^1.0.1", + "@gar/promisify": "^1.1.3", "semver": "^7.3.5" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -8158,19 +8382,32 @@ } }, "node_modules/@npmcli/git": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", - "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.1.tgz", + "integrity": "sha512-UU85F/T+F1oVn3IsB/L6k9zXIMpXBuUBE25QDH0SsURwT6IOBqkC7M16uqo2vVZIyji3X1K4XH9luip7YekH1A==", "dev": true, "dependencies": { - "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^6.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", "mkdirp": "^1.0.4", - "npm-pick-manifest": "^6.1.1", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz", + "integrity": "sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ==", + "dev": true, + "engines": { + "node": ">=12" } }, "node_modules/@npmcli/git/node_modules/mkdirp": { @@ -8186,9 +8423,9 @@ } }, "node_modules/@npmcli/git/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -8200,6 +8437,18 @@ "node": ">=10" } }, + "node_modules/@npmcli/git/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@npmcli/git/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -8256,30 +8505,55 @@ } }, "node_modules/@npmcli/node-gyp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", - "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", + "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } }, "node_modules/@npmcli/promise-spawn": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", - "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", + "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", "dev": true, "dependencies": { "infer-owner": "^1.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/@npmcli/run-script": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-2.0.0.tgz", - "integrity": "sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.1.7.tgz", + "integrity": "sha512-WXr/MyM4tpKA4BotB81NccGAv8B48lNH0gRoILucbcAhTQXLCoi6HflMV3KdXubIqvP9SuLsFn68Z7r4jl+ppw==", "dev": true, "dependencies": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^8.2.0", - "read-package-json-fast": "^2.0.1" + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/run-script/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/@schematics/angular": { @@ -8361,24 +8635,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/@schematics/angular/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/@schematics/angular/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@stencil/core": { "version": "2.17.1", "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.17.1.tgz", @@ -8436,6 +8692,25 @@ "node": ">=10.13.0" } }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -8448,6 +8723,25 @@ "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", "dev": true }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, "node_modules/@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -8482,9 +8776,9 @@ } }, "node_modules/@types/eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "dev": true, "dependencies": { "@types/eslint": "*", @@ -8497,6 +8791,29 @@ "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", "dev": true }, + "node_modules/@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.29", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", + "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, "node_modules/@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -8508,9 +8825,9 @@ } }, "node_modules/@types/http-proxy": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", - "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", "dev": true, "dependencies": { "@types/node": "*" @@ -8552,6 +8869,12 @@ "@types/unist": "*" } }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, "node_modules/@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", @@ -8588,10 +8911,22 @@ "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", "dev": true }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, "node_modules/@types/retry": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, "node_modules/@types/selenium-webdriver": { @@ -8600,6 +8935,34 @@ "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", "dev": true }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/source-list-map": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", @@ -8632,6 +8995,15 @@ "node": ">=0.10.0" } }, + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -8804,9 +9176,9 @@ "dev": true }, "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, "node_modules/abbrev": { @@ -8816,13 +9188,13 @@ "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==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" @@ -8931,9 +9303,9 @@ } }, "node_modules/agentkeepalive": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.4.tgz", - "integrity": "sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", "dev": true, "dependencies": { "debug": "^4.1.0", @@ -8945,9 +9317,9 @@ } }, "node_modules/agentkeepalive/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -9185,16 +9557,16 @@ "dev": true }, "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", "dev": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16" } }, "node_modules/are-we-there-yet/node_modules/readable-stream": { @@ -9460,13 +9832,13 @@ "dev": true }, "node_modules/babel-loader": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", - "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", "dev": true, "dependencies": { "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", + "loader-utils": "^2.0.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, @@ -9478,30 +9850,18 @@ "webpack": ">=2" } }, - "node_modules/babel-loader/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/babel-loader/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==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dev": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "json5": "^2.1.2" }, "engines": { - "node": ">=4.0.0" + "node": ">=8.9.0" } }, "node_modules/babel-loader/node_modules/make-dir": { @@ -9554,13 +9914,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", - "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", "dev": true, "dependencies": { "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.0", + "@babel/helper-define-polyfill-provider": "^0.3.1", "semver": "^6.1.1" }, "peerDependencies": { @@ -9577,25 +9937,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", - "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.0", - "core-js-compat": "^3.18.0" + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz", - "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.0" + "@babel/helper-define-polyfill-provider": "^0.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -9766,42 +10126,72 @@ } }, "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==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dev": true, "dependencies": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "engines": { "node": ">= 0.8" } }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/body-parser/node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/bonjour": { @@ -9818,6 +10208,43 @@ "multicast-dns-service-types": "^1.1.0" } }, + "node_modules/bonjour-service": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz", + "integrity": "sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/bonjour-service/node_modules/dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bonjour-service/node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -9871,40 +10298,33 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.2.tgz", + "integrity": "sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001366", + "electron-to-chromium": "^1.4.188", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.4" }, "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/electron-to-chromium": { - "version": "1.4.17", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.17.tgz", - "integrity": "sha512-zhk1MravPtq/KBhmGB7TLBILmXTgRG9TFSI3qS3DbgyfHzIl72iiTE37r/BHIbPCJJlWIo5rySyxiH4vWhu2ZA==", - "dev": true - }, - "node_modules/browserslist/node_modules/node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true - }, "node_modules/browserstack": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.0.tgz", @@ -9960,10 +10380,28 @@ } }, "node_modules/builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", - "dev": true + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/builtins/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, "node_modules/bytes": { "version": "3.0.0", @@ -10100,20 +10538,27 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001286", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz", - "integrity": "sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ==", + "version": "1.0.30001369", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001369.tgz", + "integrity": "sha512-OY1SBHaodJc4wflDIKnlkdqWzJZd1Ls/2zbVJHBSv3AT7vgOJ58yAhd2CN4d57l2kPJrgMb7P9+N1Mhy4tNSQA==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] }, "node_modules/canonical-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/caseless": { "version": "0.12.0", @@ -10454,10 +10899,16 @@ } }, "node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -10912,15 +11363,6 @@ "node": ">= 0.6" } }, - "node_modules/compressible/node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/compression": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", @@ -10971,21 +11413,41 @@ "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true }, "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==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "dependencies": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" }, "engines": { "node": ">= 0.6" } }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -11005,9 +11467,9 @@ } }, "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==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true, "engines": { "node": ">= 0.6" @@ -11043,20 +11505,20 @@ } }, "node_modules/copy-webpack-plugin": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.0.0.tgz", - "integrity": "sha512-tuCVuFMBbRsb7IH0q1CUb50/Skv+7a6c7DJ+xi4fAbOzNLTYVMUTPnf8uGvKPtmqTvzYBrfEFo7YgP4TsUWmtg==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, "dependencies": { - "fast-glob": "^3.2.7", + "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", - "globby": "^12.0.2", + "globby": "^13.1.1", "normalize-path": "^3.0.0", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0" }, "engines": { - "node": ">= 12.20.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", @@ -11067,9 +11529,9 @@ } }, "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -11111,56 +11573,15 @@ "ajv": "^8.8.2" } }, - "node_modules/copy-webpack-plugin/node_modules/array-union": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", - "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/copy-webpack-plugin/node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-12.0.2.tgz", - "integrity": "sha512-lAsmb/5Lww4r7MM9nCCliDZVIKbZTavrsunAsHLr9oHthrZP1qi7/gAnHOsUs9bLvEt2vKVJhHmxuL7QbDuPdQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", "dev": true, "dependencies": { - "array-union": "^3.0.1", "dir-glob": "^3.0.1", - "fast-glob": "^3.2.7", - "ignore": "^5.1.8", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^4.0.0" }, @@ -11239,22 +11660,6 @@ "semver": "5.6.0" } }, - "node_modules/cordova-android/node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/cordova-android/node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -11269,18 +11674,6 @@ "node": ">=12" } }, - "node_modules/cordova-android/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/cordova-android/node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -11960,12 +12353,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.3.tgz", - "integrity": "sha512-59tYzuWgEEVU9r+SRgceIGXSSUn47JknoiXW6Oq7RW8QHjXWz3/vp8pa7dbtuVu40sewz3OP3JmQEcDdztrLhA==", + "version": "3.23.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.5.tgz", + "integrity": "sha512-fHYozIFIxd+91IIbXJgWd/igXIc8Mf9is0fusswjnGIWVG96y2cwyUdlCkGOw6rMLHKAxg7xtCIVaHsyOUnJIg==", "dev": true, "dependencies": { - "browserslist": "^4.18.1", + "browserslist": "^4.21.2", "semver": "7.0.0" }, "funding": { @@ -12032,13 +12425,13 @@ } }, "node_modules/critters": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.15.tgz", - "integrity": "sha512-AE7hkXb3eZUbEvS1SKZa+OU4o2kUOXtzVeE/2E/mjU/0mV1wpBT1HfUCWVRS4zwvkBNJ0AQYsVjAoFm+kIhfdw==", + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", + "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", "dev": true, "dependencies": { "chalk": "^4.1.0", - "css-select": "^4.1.3", + "css-select": "^4.2.0", "parse5": "^6.0.1", "parse5-htmlparser2-tree-adapter": "^6.0.1", "postcss": "^8.3.7", @@ -12085,33 +12478,6 @@ "node": ">=8" } }, - "node_modules/critters/node_modules/postcss": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", - "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", - "dev": true, - "dependencies": { - "nanoid": "^3.1.30", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/critters/node_modules/source-map-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/critters/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -12299,18 +12665,18 @@ } }, "node_modules/css-loader": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", - "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.2.15", + "postcss": "^8.4.7", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", + "postcss-value-parser": "^4.2.0", "semver": "^7.3.5" }, "engines": { @@ -12325,9 +12691,9 @@ } }, "node_modules/css-loader/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -12954,49 +13320,6 @@ "node": ">= 6" } }, - "node_modules/del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "dev": true, - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del/node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "node_modules/del/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -13008,13 +13331,14 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true }, "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" } @@ -13029,10 +13353,14 @@ } }, "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, "node_modules/detect-node": { "version": "2.1.0", @@ -13168,6 +13496,12 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "node_modules/electron-to-chromium": { + "version": "1.4.199", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.199.tgz", + "integrity": "sha512-WIGME0Cs7oob3mxsJwHbeWkH0tYkIE/sjkJ8ML2BYmuRcjhRl/q5kVDXG7W9LOOKwzPU5M0LBlXRq9rlSgnNlg==", + "dev": true + }, "node_modules/elementtree": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", @@ -13354,9 +13688,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", - "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -13366,12 +13700,6 @@ "node": ">=10.13.0" } }, - "node_modules/enhanced-resolve/node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, "node_modules/ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", @@ -13447,10 +13775,62 @@ "es6-promise": "^4.0.3" } }, + "node_modules/esbuild": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.49.tgz", + "integrity": "sha512-/TlVHhOaq7Yz8N1OJrjqM3Auzo5wjvHFLk+T8pIue+fhnhIMpfAzsG6PLVMbFveVxqD2WOp3QHei+52IMUNmCw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-64": "0.14.49", + "esbuild-android-arm64": "0.14.49", + "esbuild-darwin-64": "0.14.49", + "esbuild-darwin-arm64": "0.14.49", + "esbuild-freebsd-64": "0.14.49", + "esbuild-freebsd-arm64": "0.14.49", + "esbuild-linux-32": "0.14.49", + "esbuild-linux-64": "0.14.49", + "esbuild-linux-arm": "0.14.49", + "esbuild-linux-arm64": "0.14.49", + "esbuild-linux-mips64le": "0.14.49", + "esbuild-linux-ppc64le": "0.14.49", + "esbuild-linux-riscv64": "0.14.49", + "esbuild-linux-s390x": "0.14.49", + "esbuild-netbsd-64": "0.14.49", + "esbuild-openbsd-64": "0.14.49", + "esbuild-sunos-64": "0.14.49", + "esbuild-windows-32": "0.14.49", + "esbuild-windows-64": "0.14.49", + "esbuild-windows-arm64": "0.14.49" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.49.tgz", + "integrity": "sha512-vYsdOTD+yi+kquhBiFWl3tyxnj2qZJsl4tAqwhT90ktUdnyTizgle7TjNx6Ar1bN7wcwWqZ9QInfdk2WVagSww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/esbuild-android-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.2.tgz", - "integrity": "sha512-hEixaKMN3XXCkoe+0WcexO4CcBVU5DCSUT+7P8JZiWZCbAjSkc9b6Yz2X5DSfQmRCtI/cQRU6TfMYrMQ5NBfdw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.49.tgz", + "integrity": "sha512-g2HGr/hjOXCgSsvQZ1nK4nW/ei8JUx04Li74qub9qWrStlysaVmadRyTVuW32FGIpLQyc5sUjjZopj49eGGM2g==", "cpu": [ "arm64" ], @@ -13458,12 +13838,15 @@ "optional": true, "os": [ "android" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-darwin-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.2.tgz", - "integrity": "sha512-Uq8t0cbJQkxkQdbUfOl2wZqZ/AtLZjvJulR1HHnc96UgyzG9YlCLSDMiqjM+NANEy7/zzvwKJsy3iNC9wwqLJA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.49.tgz", + "integrity": "sha512-3rvqnBCtX9ywso5fCHixt2GBCUsogNp9DjGmvbBohh31Ces34BVzFltMSxJpacNki96+WIcX5s/vum+ckXiLYg==", "cpu": [ "x64" ], @@ -13471,12 +13854,15 @@ "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-darwin-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.2.tgz", - "integrity": "sha512-619MSa17sr7YCIrUj88KzQu2ESA4jKYtIYfLU/smX6qNgxQt3Y/gzM4s6sgJ4fPQzirvmXgcHv1ZNQAs/Xh48A==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.49.tgz", + "integrity": "sha512-XMaqDxO846srnGlUSJnwbijV29MTKUATmOLyQSfswbK/2X5Uv28M9tTLUJcKKxzoo9lnkYPsx2o8EJcTYwCs/A==", "cpu": [ "arm64" ], @@ -13484,12 +13870,15 @@ "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-freebsd-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.2.tgz", - "integrity": "sha512-aP6FE/ZsChZpUV6F3HE3x1Pz0paoYXycJ7oLt06g0G9dhJKknPawXCqQg/WMyD+ldCEZfo7F1kavenPdIT/SGQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.49.tgz", + "integrity": "sha512-NJ5Q6AjV879mOHFri+5lZLTp5XsO2hQ+KSJYLbfY9DgCu8s6/Zl2prWXVANYTeCDLlrIlNNYw8y34xqyLDKOmQ==", "cpu": [ "x64" ], @@ -13497,12 +13886,15 @@ "optional": true, "os": [ "freebsd" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.2.tgz", - "integrity": "sha512-LSm98WTb1QIhyS83+Po0KTpZNdd2XpVpI9ua5rLWqKWbKeNRFwOsjeiuwBaRNc+O32s9oC2ZMefETxHBV6VNkQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.49.tgz", + "integrity": "sha512-lFLtgXnAc3eXYqj5koPlBZvEbBSOSUbWO3gyY/0+4lBdRqELyz4bAuamHvmvHW5swJYL7kngzIZw6kdu25KGOA==", "cpu": [ "arm64" ], @@ -13510,12 +13902,15 @@ "optional": true, "os": [ "freebsd" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-linux-32": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.2.tgz", - "integrity": "sha512-8VxnNEyeUbiGflTKcuVc5JEPTqXfsx2O6ABwUbfS1Hp26lYPRPC7pKQK5Dxa0MBejGc50jy7YZae3EGQUQ8EkQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.49.tgz", + "integrity": "sha512-zTTH4gr2Kb8u4QcOpTDVn7Z8q7QEIvFl/+vHrI3cF6XOJS7iEI1FWslTo3uofB2+mn6sIJEQD9PrNZKoAAMDiA==", "cpu": [ "ia32" ], @@ -13523,12 +13918,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-linux-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.2.tgz", - "integrity": "sha512-4bzMS2dNxOJoFIiHId4w+tqQzdnsch71JJV1qZnbnErSFWcR9lRgpSqWnTTFtv6XM+MvltRzSXC5wQ7AEBY6Hg==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.49.tgz", + "integrity": "sha512-hYmzRIDzFfLrB5c1SknkxzM8LdEUOusp6M2TnuQZJLRtxTgyPnZZVtyMeCLki0wKgYPXkFsAVhi8vzo2mBNeTg==", "cpu": [ "x64" ], @@ -13536,12 +13934,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-linux-arm": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.2.tgz", - "integrity": "sha512-PaylahvMHhH8YMfJPMKEqi64qA0Su+d4FNfHKvlKes/2dUe4QxgbwXT9oLVgy8iJdcFMrO7By4R8fS8S0p8aVQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.49.tgz", + "integrity": "sha512-iE3e+ZVv1Qz1Sy0gifIsarJMQ89Rpm9mtLSRtG3AH0FPgAzQ5Z5oU6vYzhc/3gSPi2UxdCOfRhw2onXuFw/0lg==", "cpu": [ "arm" ], @@ -13549,12 +13950,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-linux-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.2.tgz", - "integrity": "sha512-RlIVp0RwJrdtasDF1vTFueLYZ8WuFzxoQ1OoRFZOTyJHCGCNgh7xJIC34gd7B7+RT0CzLBB4LcM5n0LS+hIoww==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.49.tgz", + "integrity": "sha512-KLQ+WpeuY+7bxukxLz5VgkAAVQxUv67Ft4DmHIPIW+2w3ObBPQhqNoeQUHxopoW/aiOn3m99NSmSV+bs4BSsdA==", "cpu": [ "arm64" ], @@ -13562,12 +13966,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-linux-mips64le": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.2.tgz", - "integrity": "sha512-Fdwrq2roFnO5oetIiUQQueZ3+5soCxBSJswg3MvYaXDomj47BN6oAWMZgLrFh1oVrtWrxSDLCJBenYdbm2s+qQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.49.tgz", + "integrity": "sha512-n+rGODfm8RSum5pFIqFQVQpYBw+AztL8s6o9kfx7tjfK0yIGF6tm5HlG6aRjodiiKkH2xAiIM+U4xtQVZYU4rA==", "cpu": [ "mips64el" ], @@ -13575,12 +13982,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.2.tgz", - "integrity": "sha512-vxptskw8JfCDD9QqpRO0XnsM1osuWeRjPaXX1TwdveLogYsbdFtcuiuK/4FxGiNMUr1ojtnCS2rMPbY8puc5NA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.49.tgz", + "integrity": "sha512-WP9zR4HX6iCBmMFH+XHHng2LmdoIeUmBpL4aL2TR8ruzXyT4dWrJ5BSbT8iNo6THN8lod6GOmYDLq/dgZLalGw==", "cpu": [ "ppc64" ], @@ -13588,12 +13998,47 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.49.tgz", + "integrity": "sha512-h66ORBz+Dg+1KgLvzTVQEA1LX4XBd1SK0Fgbhhw4akpG/YkN8pS6OzYI/7SGENiN6ao5hETRDSkVcvU9NRtkMQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.49.tgz", + "integrity": "sha512-DhrUoFVWD+XmKO1y7e4kNCqQHPs6twz6VV6Uezl/XHYGzM60rBewBF5jlZjG0nCk5W/Xy6y1xWeopkrhFFM0sQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-netbsd-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.2.tgz", - "integrity": "sha512-I8+LzYK5iSNpspS9eCV9sW67Rj8FgMHimGri4mKiGAmN0pNfx+hFX146rYtzGtewuxKtTsPywWteHx+hPRLDsw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.49.tgz", + "integrity": "sha512-BXaUwFOfCy2T+hABtiPUIpWjAeWK9P8O41gR4Pg73hpzoygVGnj0nI3YK4SJhe52ELgtdgWP/ckIkbn2XaTxjQ==", "cpu": [ "x64" ], @@ -13601,12 +14046,15 @@ "optional": true, "os": [ "netbsd" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-openbsd-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.2.tgz", - "integrity": "sha512-120HgMe9elidWUvM2E6mMf0csrGwx8sYDqUIJugyMy1oHm+/nT08bTAVXuwYG/rkMIqsEO9AlMxuYnwR6En/3Q==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.49.tgz", + "integrity": "sha512-lP06UQeLDGmVPw9Rg437Btu6J9/BmyhdoefnQ4gDEJTtJvKtQaUcOQrhjTq455ouZN4EHFH1h28WOJVANK41kA==", "cpu": [ "x64" ], @@ -13614,12 +14062,15 @@ "optional": true, "os": [ "openbsd" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-sunos-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.2.tgz", - "integrity": "sha512-Q3xcf9Uyfra9UuCFxoLixVvdigo0daZaKJ97TL2KNA4bxRUPK18wwGUk3AxvgDQZpRmg82w9PnkaNYo7a+24ow==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.49.tgz", + "integrity": "sha512-4c8Zowp+V3zIWje329BeLbGh6XI9c/rqARNaj5yPHdC61pHI9UNdDxT3rePPJeWcEZVKjkiAS6AP6kiITp7FSw==", "cpu": [ "x64" ], @@ -13627,24 +14078,27 @@ "optional": true, "os": [ "sunos" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-wasm": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.2.tgz", - "integrity": "sha512-Rs8NjWoo1UdsVjhxT2o6kLCX9Sh65pyd3/h4XeJ3jjQNM6NgL+/CSowuJgvOIjDAXMLXpc6fdGnyZQDil9IUJA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.49.tgz", + "integrity": "sha512-5ddzZv8M3WI1fWZ5rEfK5cSA9swlWJcceKgqjKLLERC7FnlNW50kF7hxhpkyC0Z/4w7Xeyt3yUJ9QWNMDXLk2Q==", "dev": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=8" + "node": ">=12" } }, "node_modules/esbuild-windows-32": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.2.tgz", - "integrity": "sha512-TW7O49tPsrq+N1sW8mb3m24j/iDGa4xzAZH4wHWwoIzgtZAYPKC0hpIhufRRG/LA30bdMChO9pjJZ5mtcybtBQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.49.tgz", + "integrity": "sha512-q7Rb+J9yHTeKr9QTPDYkqfkEj8/kcKz9lOabDuvEXpXuIcosWCJgo5Z7h/L4r7rbtTH4a8U2FGKb6s1eeOHmJA==", "cpu": [ "ia32" ], @@ -13652,12 +14106,15 @@ "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-windows-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.2.tgz", - "integrity": "sha512-Rym6ViMNmi1E2QuQMWy0AFAfdY0wGwZD73BnzlsQBX5hZBuy/L+Speh7ucUZ16gwsrMM9v86icZUDrSN/lNBKg==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.49.tgz", + "integrity": "sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==", "cpu": [ "x64" ], @@ -13665,12 +14122,15 @@ "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-windows-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.2.tgz", - "integrity": "sha512-ZrLbhr0vX5Em/P1faMnHucjVVWPS+m3tktAtz93WkMZLmbRJevhiW1y4CbulBd2z0MEdXZ6emDa1zFHq5O5bSA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.49.tgz", + "integrity": "sha512-v+HYNAXzuANrCbbLFJ5nmO3m5y2PGZWLe3uloAkLt87aXiO2mZr3BTmacZdjwNkNEHuH3bNtN8cak+mzVjVPfA==", "cpu": [ "arm64" ], @@ -13678,7 +14138,10 @@ "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/escalade": { "version": "3.1.1", @@ -13798,7 +14261,7 @@ "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, "engines": { "node": ">= 0.6" @@ -14033,38 +14496,39 @@ } }, "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", "dev": true, "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", "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", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -14079,13 +14543,87 @@ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, + "node_modules/express/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" } }, "node_modules/extend": { @@ -14188,20 +14726,19 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-glob/node_modules/glob-parent": { @@ -14498,6 +15035,19 @@ "node": ">=0.8" } }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, "node_modules/fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -14513,7 +15063,7 @@ "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, "engines": { "node": ">= 0.6" @@ -14636,23 +15186,22 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/gauge": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.0.tgz", - "integrity": "sha512-F8sU45yQpjQjxKkm1UOAhf0U/O0aFt//Fl7hsrNVto+patMHjs7dPI9mFOGUKbhrgKm0S3EjW3scMFuQmWSROw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1", "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", "has-unicode": "^2.0.1", - "signal-exit": "^3.0.0", + "signal-exit": "^3.0.7", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" + "wide-align": "^1.1.5" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/gauge/node_modules/ansi-regex": { @@ -14677,9 +15226,9 @@ } }, "node_modules/gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "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" @@ -14938,9 +15487,9 @@ } }, "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==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "node_modules/hammerjs": { "version": "2.0.8", @@ -15061,7 +15610,7 @@ "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, "node_modules/has-value": { @@ -15190,9 +15739,9 @@ } }, "node_modules/html-entities": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", - "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true }, "node_modules/html-escaper": { @@ -15251,24 +15800,35 @@ "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "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=" + "node_modules/http-errors/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } }, "node_modules/http-parser-js": { "version": "0.5.5", @@ -15336,12 +15896,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/http-proxy-middleware": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", - "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, "dependencies": { - "@types/http-proxy": "^1.17.5", + "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", @@ -15349,6 +15909,14 @@ }, "engines": { "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { @@ -15418,7 +15986,7 @@ "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "dependencies": { "ms": "^2.0.0" @@ -15483,21 +16051,42 @@ ] }, "node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" } }, "node_modules/ignore-walk": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz", - "integrity": "sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", + "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", "dev": true, "dependencies": { - "minimatch": "^3.0.4" + "minimatch": "^5.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" @@ -15522,9 +16111,9 @@ "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" }, "node_modules/immutable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", - "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", "dev": true }, "node_modules/import-fresh": { @@ -16098,9 +16687,9 @@ "dev": true }, "node_modules/is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -16231,7 +16820,7 @@ "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true }, "node_modules/is-number": { @@ -16453,168 +17042,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-instrument/node_modules/@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/@babel/core": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.5.tgz", - "integrity": "sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.5", - "@babel/helper-compilation-targets": "^7.16.3", - "@babel/helper-module-transforms": "^7.16.5", - "@babel/helpers": "^7.16.5", - "@babel/parser": "^7.16.5", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/@babel/generator": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", - "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/@babel/helper-module-transforms": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", - "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/@babel/helpers": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.5.tgz", - "integrity": "sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/istanbul-lib-instrument/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/istanbul-lib-instrument/node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -16624,12 +17051,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-instrument/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/istanbul-lib-instrument/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -16639,15 +17060,6 @@ "semver": "bin/semver.js" } }, - "node_modules/istanbul-lib-instrument/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/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", @@ -16926,13 +17338,10 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -16956,7 +17365,7 @@ "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" @@ -17133,12 +17542,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/karma/node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, "node_modules/karma/node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", @@ -17264,9 +17667,9 @@ } }, "node_modules/less": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz", - "integrity": "sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "dev": true, "dependencies": { "copy-anything": "^2.0.1", @@ -17285,20 +17688,20 @@ "image-size": "~0.5.0", "make-dir": "^2.1.0", "mime": "^1.4.1", - "needle": "^2.5.2", + "needle": "^3.1.0", "source-map": "~0.6.0" } }, "node_modules/less-loader": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.2.0.tgz", - "integrity": "sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.0.0.tgz", + "integrity": "sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw==", "dev": true, "dependencies": { "klona": "^2.0.4" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", @@ -17309,6 +17712,54 @@ "webpack": "^5.0.0" } }, + "node_modules/less/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/less/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/less/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "optional": true + }, + "node_modules/less/node_modules/needle": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.1.0.tgz", + "integrity": "sha512-gCE9weDhjVGCRqS8dwDR/D3GTAeyXLXuqp7I8EzH6DllZGXSUyxuqqLh+YX9rMAWaaTFyVAg6rHGL25dqvczKw==", + "dev": true, + "optional": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, "node_modules/less/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -17332,9 +17783,9 @@ } }, "node_modules/license-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-b9iMrROrw2fTOJBZ57h0xJfT5/1Cxg4ucYbtpWoukv4Awb2TFPfDDFVHNM8w6SYQpVfB13a5tQJxgGamqwrsyw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", "dev": true, "dependencies": { "webpack-sources": "^3.0.0" @@ -17349,9 +17800,9 @@ } }, "node_modules/license-webpack-plugin/node_modules/webpack-sources": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz", - "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, "engines": { "node": ">=10.13.0" @@ -18050,28 +18501,50 @@ "dev": true }, "node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.0.tgz", + "integrity": "sha512-OnEfCLofQVJ5zgKwGk55GaqosqKjaR6khQlJY3dBAA+hM25Bc5CmX5rKUfVut+rYA3uidA7zb7AvcglU87rPRg==", "dev": true, "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", + "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", + "minipass-fetch": "^2.0.3", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", + "negotiator": "^0.6.3", "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/@npmcli/move-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.0.tgz", + "integrity": "sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, "engines": { "node": ">= 10" } @@ -18088,10 +18561,48 @@ "node": ">= 6.0.0" } }, + "node_modules/make-fetch-happen/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/cacache": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.1.tgz", + "integrity": "sha512-VDKN+LHyCQXaaYZ7rA/qtkURU+/yYhviUdvqEv2LT6QPZU8jpyzEkEVAcKlKLt5dJ5BRp11ym8lo3NKLluEPLg==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/make-fetch-happen/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -18105,12 +18616,32 @@ } } }, - "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { + "node_modules/make-fetch-happen/node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "dependencies": { + "@tootallnate/once": "2", "agent-base": "6", "debug": "4" }, @@ -18118,16 +18649,50 @@ "node": ">= 6" } }, - "node_modules/make-fetch-happen/node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "dependencies": { - "minipass": "^3.0.0" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=8" + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz", + "integrity": "sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/make-fetch-happen/node_modules/ms": { @@ -18136,34 +18701,89 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/make-fetch-happen/node_modules/socks": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz", - "integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==", + "node_modules/make-fetch-happen/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/make-fetch-happen/node_modules/rimraf/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/make-fetch-happen/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/make-fetch-happen/node_modules/socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, "dependencies": { "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" + "debug": "^4.3.3", + "socks": "^2.6.2" }, "engines": { "node": ">= 10" } }, + "node_modules/make-fetch-happen/node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", @@ -18305,12 +18925,12 @@ } }, "node_modules/memfs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.0.tgz", - "integrity": "sha512-o/RfP0J1d03YwsAxyHxAYs2kyJp55AFkMazlFAZFR2I2IXkxiUTXRabJ6RmNNCQ83LAD2jy52Khj0m3OffpNdA==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", "dev": true, "dependencies": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.3" }, "engines": { "node": ">= 4.0.0" @@ -18506,19 +19126,19 @@ } }, "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==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "1.40.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -18542,9 +19162,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.5.tgz", - "integrity": "sha512-oEIhRucyn1JbT/1tU2BhnwO6ft1jjH1iCX9Gc59WFMg0n5773rQU0oyQ0zzeYFFuBfONaRbQJyGoPtuNseMxjA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", + "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", "dev": true, "dependencies": { "schema-utils": "^4.0.0" @@ -18561,9 +19181,9 @@ } }, "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -18673,9 +19293,9 @@ } }, "node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", "dependencies": { "yallist": "^4.0.0" }, @@ -18696,20 +19316,20 @@ } }, "node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.0.tgz", + "integrity": "sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==", "dev": true, "dependencies": { - "minipass": "^3.1.0", + "minipass": "^3.1.6", "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" + "minizlib": "^2.1.2" }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" }, "optionalDependencies": { - "encoding": "^0.1.12" + "encoding": "^0.1.13" } }, "node_modules/minipass-flush": { @@ -18735,9 +19355,9 @@ } }, "node_modules/minipass-pipeline": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz", - "integrity": "sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, "dependencies": { "minipass": "^3.0.0" @@ -18914,9 +19534,9 @@ "optional": 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==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, "engines": { "node": ">= 0.6" @@ -18991,15 +19611,15 @@ } }, "node_modules/node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.1.0.tgz", + "integrity": "sha512-HkmN0ZpQJU7FLbJauJTHkHlSVAXlNGDAzH/VYFZGDOnFyn/Na3GlNJfkudmufOdS6/jNFhy88ObzL7ERz9es1g==", "dev": true, "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", + "make-fetch-happen": "^10.0.3", "nopt": "^5.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", @@ -19011,7 +19631,7 @@ "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": ">= 10.12.0" + "node": "^12.22 || ^14.13 || >=16" } }, "node_modules/node-gyp-build": { @@ -19026,12 +19646,6 @@ "node-gyp-build-test": "build-test.js" } }, - "node_modules/node-gyp/node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, "node_modules/node-gyp/node_modules/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -19063,9 +19677,9 @@ } }, "node_modules/node-gyp/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -19092,6 +19706,12 @@ "node": ">= 8" } }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, "node_modules/node-version-compare": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/node-version-compare/-/node-version-compare-1.0.3.tgz", @@ -19175,21 +19795,21 @@ } }, "node_modules/npm-install-checks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", - "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", + "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", "dev": true, "dependencies": { "semver": "^7.1.1" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/npm-install-checks/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -19208,23 +19828,45 @@ "dev": true }, "node_modules/npm-package-arg": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", - "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", + "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", "dev": true, "dependencies": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", + "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/npm-package-arg/node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz", + "integrity": "sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ==", + "dev": true, + "engines": { + "node": ">=12" } }, "node_modules/npm-package-arg/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -19237,39 +19879,82 @@ } }, "node_modules/npm-packlist": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz", - "integrity": "sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.1.tgz", + "integrity": "sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==", "dev": true, "dependencies": { - "glob": "^7.1.6", - "ignore-walk": "^4.0.1", - "npm-bundled": "^1.1.1", + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^1.1.2", "npm-normalize-package-bin": "^1.0.1" }, "bin": { "npm-packlist": "bin/index.js" }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-packlist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm-packlist/node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-packlist/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { "node": ">=10" } }, "node_modules/npm-pick-manifest": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", - "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz", + "integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==", "dev": true, "dependencies": { - "npm-install-checks": "^4.0.0", + "npm-install-checks": "^5.0.0", "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/npm-pick-manifest/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -19282,20 +19967,21 @@ } }, "node_modules/npm-registry-fetch": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", - "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.0.tgz", + "integrity": "sha512-10LJQ/1+VhKrZjIuY9I/+gQTvumqqlgnsCufoXETHAPFTS3+M+Z5CFhZRDHGavmJ6rOye3UvNga88vl8n1r6gg==", "dev": true, "dependencies": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/npm-run-path": { @@ -19310,18 +19996,18 @@ } }, "node_modules/npmlog": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.0.tgz", - "integrity": "sha512-03ppFRGlsyUaQFbGC2C8QWJN/C/K7PsfyD9aQdhVKAQIH4sQBc8WASqFBP7O+Ut4d2oo5LoeoboB3cGdBZSp6Q==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "dev": true, "dependencies": { - "are-we-there-yet": "^2.0.0", + "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", - "gauge": "^4.0.0", + "gauge": "^4.0.3", "set-blocking": "^2.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/nth-check": { @@ -19852,12 +20538,12 @@ } }, "node_modules/p-retry": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", - "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, "dependencies": { - "@types/retry": "^0.12.0", + "@types/retry": "0.12.0", "retry": "^0.13.1" }, "engines": { @@ -19959,36 +20645,129 @@ } }, "node_modules/pacote": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.2.tgz", - "integrity": "sha512-Ar3mhjcxhMzk+OVZ8pbnXdb0l8+pimvlsqBGRNkble2NVgyqOGE3yrCGi/lAYq7E7NRDMz89R1Wx5HIMCGgeYg==", + "version": "13.6.1", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.1.tgz", + "integrity": "sha512-L+2BI1ougAPsFjXRyBhcKmfT016NscRFLv6Pz5EiNf1CCFJFU0pSKKQwsZTyAQB+sTuUL4TyFyp6J1Ork3dOqw==", "dev": true, "dependencies": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^2.0.0", - "cacache": "^15.0.5", + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^3.0.0", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" + "ssri": "^9.0.0", + "tar": "^6.1.11" }, "bin": { "pacote": "lib/bin.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/pacote/node_modules/@npmcli/move-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.0.tgz", + "integrity": "sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/pacote/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/pacote/node_modules/cacache": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.1.tgz", + "integrity": "sha512-VDKN+LHyCQXaaYZ7rA/qtkURU+/yYhviUdvqEv2LT6QPZU8jpyzEkEVAcKlKLt5dJ5BRp11ym8lo3NKLluEPLg==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/pacote/node_modules/cacache/node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pacote/node_modules/lru-cache": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz", + "integrity": "sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/pacote/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/pacote/node_modules/mkdirp": { @@ -20018,6 +20797,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/pacote/node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -20209,8 +21000,7 @@ "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -20343,20 +21133,26 @@ } }, "node_modules/postcss": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", - "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], "dependencies": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map-js": "^0.6.2" + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" } }, "node_modules/postcss-attribute-case-insensitive": { @@ -20414,6 +21210,21 @@ "postcss": "^8.2.2" } }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, "node_modules/postcss-color-functional-notation": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", @@ -21418,17 +22229,17 @@ } }, "node_modules/postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", + "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", "dev": true, "dependencies": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", - "semver": "^7.3.5" + "semver": "^7.3.7" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", @@ -21440,9 +22251,9 @@ } }, "node_modules/postcss-loader/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -21889,6 +22700,25 @@ "postcss": "^8.2.15" } }, + "node_modules/postcss-opacity-percentage": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", + "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", + "dev": true, + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "engines": { + "node": "^12 || ^14 || >=16" + } + }, "node_modules/postcss-ordered-values": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz", @@ -22465,9 +23295,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.7.tgz", - "integrity": "sha512-U+b/Deoi4I/UmE6KOVPpnhS7I7AYdKbhGcat+qTQ27gycvaACvNEw11ba6RrkwVmDVRW7sigWgLj4/KbbJjeDA==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -22519,9 +23349,9 @@ } }, "node_modules/postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, "node_modules/postcss-values-parser": { @@ -22538,10 +23368,13 @@ "node": ">=6.14.4" } }, - "node_modules/postcss/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==" + "node_modules/postcss/node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/prelude-ls": { "version": "1.1.2", @@ -22589,6 +23422,15 @@ "node": ">=0.8" } }, + "node_modules/proc-log": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -23131,12 +23973,12 @@ } }, "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==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -23145,9 +23987,9 @@ } }, "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } @@ -23183,6 +24025,21 @@ "node": ">=6" } }, + "node_modules/read-package-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.1.tgz", + "integrity": "sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg==", + "dev": true, + "dependencies": { + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/read-package-json-fast": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", @@ -23196,6 +24053,97 @@ "node": ">=10" } }, + "node_modules/read-package-json/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/hosted-git-info": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", + "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/read-package-json/node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz", + "integrity": "sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/read-package-json/node_modules/normalize-package-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.0.tgz", + "integrity": "sha512-m+GL22VXJKkKbw62ZaBBjv8u6IE3UI4Mh5QakIqs3fWiKe0Xyi6L97hakwZK41/LD4R/2ly71Bayx0NLMwLA/g==", + "dev": true, + "dependencies": { + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/read-package-json/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -23322,9 +24270,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", - "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -23340,9 +24288,9 @@ "dev": true }, "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==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" @@ -23384,15 +24332,15 @@ } }, "node_modules/regexpu-core": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", - "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", + "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", "dev": true, "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^9.0.0", - "regjsgen": "^0.5.2", - "regjsparser": "^0.7.0", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.0.0" }, @@ -23401,15 +24349,15 @@ } }, "node_modules/regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", "dev": true }, "node_modules/regjsparser": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", - "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", "dev": true, "dependencies": { "jsesc": "~0.5.0" @@ -23421,7 +24369,7 @@ "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=", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, "bin": { "jsesc": "bin/jsesc" @@ -23555,12 +24503,17 @@ "dev": true }, "node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "dependencies": { - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -23758,9 +24711,9 @@ "dev": true }, "node_modules/rxjs": { - "version": "6.6.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.6.tgz", - "integrity": "sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dependencies": { "tslib": "^1.9.0" }, @@ -23793,32 +24746,33 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.44.0.tgz", - "integrity": "sha512-0hLREbHFXGQqls/K8X+koeP+ogFRPF4ZqetVB19b7Cst9Er8cOR0rc6RU7MaI4W1JmUShd1BPgPoeqmmgMMYFw==", + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz", + "integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0" + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { "sass": "sass.js" }, "engines": { - "node": ">=8.9.0" + "node": ">=12.0.0" } }, "node_modules/sass-loader": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", - "integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", + "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", "dev": true, "dependencies": { "klona": "^2.0.4", "neo-async": "^2.6.2" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", @@ -23828,6 +24782,7 @@ "fibers": ">= 3.1.0", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", "sass": "^1.3.0", + "sass-embedded": "*", "webpack": "^5.0.0" }, "peerDependenciesMeta": { @@ -23839,6 +24794,9 @@ }, "sass": { "optional": true + }, + "sass-embedded": { + "optional": true } } }, @@ -23945,35 +24903,65 @@ } }, "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", @@ -24029,15 +25017,15 @@ "dev": true }, "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==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -24095,9 +25083,9 @@ } }, "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/shallow-clone": { "version": "3.0.1", @@ -24231,9 +25219,9 @@ } }, "node_modules/smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -24573,15 +25561,15 @@ } }, "node_modules/socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", + "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", "dependencies": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 6.0.0", + "node": ">= 10.13.0", "npm": ">= 3.0.0" } }, @@ -24630,6 +25618,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -24649,6 +25642,7 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -24724,9 +25718,9 @@ "dev": true }, "node_modules/sourcemap-codec": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", - "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, "node_modules/spdx-correct": { @@ -25058,6 +26052,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, "engines": { "node": ">= 0.6" } @@ -25510,18 +26505,15 @@ } }, "node_modules/stylus": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.55.0.tgz", - "integrity": "sha512-MuzIIVRSbc8XxHH7FjkvWqkIcr1BvoMZoR/oFuAJDlh7VSaNJzrB4uJ38GRQa+mWjLXODAMzeDe0xi9GYbGwnw==", + "version": "0.58.1", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.58.1.tgz", + "integrity": "sha512-AYiCHm5ogczdCPMfe9aeQa4NklB2gcf4D/IhzYPddJjTgPc+k4D/EVE0yfQbZD43MHP3lPy+8NZ9fcFxkrgs/w==", "dev": true, "dependencies": { "css": "^3.0.0", - "debug": "~3.1.0", + "debug": "^4.3.2", "glob": "^7.1.6", - "mkdirp": "~1.0.4", - "safer-buffer": "^2.1.2", "sax": "~1.2.4", - "semver": "^6.3.0", "source-map": "^0.7.3" }, "bin": { @@ -25532,17 +26524,17 @@ } }, "node_modules/stylus-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.2.0.tgz", - "integrity": "sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.0.0.tgz", + "integrity": "sha512-WTbtLrNfOfLgzTaR9Lj/BPhQroKk/LC1hfTXSUbrxmxgfUo3Y3LpmKRVA2R1XbjvTAvOfaian9vOyfv1z99E+A==", "dev": true, "dependencies": { - "fast-glob": "^3.2.7", - "klona": "^2.0.4", + "fast-glob": "^3.2.11", + "klona": "^2.0.5", "normalize-path": "^3.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", @@ -25553,63 +26545,28 @@ "webpack": "^5.0.0" } }, - "node_modules/stylus-loader/node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylus-loader/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/stylus/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/stylus/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" + "ms": "2.1.2" }, "engines": { - "node": ">=10" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/stylus/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "node_modules/stylus/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/sugarss": { "version": "2.0.0", @@ -25803,6 +26760,18 @@ "node": ">=6" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/svg-tags": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", @@ -25931,13 +26900,14 @@ } }, "node_modules/terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dev": true, "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "bin": { @@ -25945,14 +26915,6 @@ }, "engines": { "node": ">=10" - }, - "peerDependencies": { - "acorn": "^8.5.0" - }, - "peerDependenciesMeta": { - "acorn": { - "optional": true - } } }, "node_modules/terser-webpack-plugin": { @@ -26160,9 +27122,9 @@ } }, "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { "node": ">=0.6" } @@ -26344,9 +27306,9 @@ } }, "node_modules/typed-assert": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.8.tgz", - "integrity": "sha512-5NkbXZUlmCE73Fs7gvkp1XXJWHYetPkg60QnQ2NXQmBYNFxbBr2zA8GCtaH4K2s2WhOmSlgiSTmrjrcm5tnM5g==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", "dev": true }, "node_modules/typedarray-to-buffer": { @@ -26358,9 +27320,9 @@ } }, "node_modules/typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -26660,6 +27622,32 @@ "yarn": "*" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -26751,12 +27739,15 @@ } }, "node_modules/validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, "dependencies": { - "builtins": "^1.0.3" + "builtins": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/vary": { @@ -26904,13 +27895,13 @@ } }, "node_modules/webpack": { - "version": "5.65.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.65.0.tgz", - "integrity": "sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw==", + "version": "5.73.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", + "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", "dev": true, "dependencies": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", @@ -26918,13 +27909,13 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.3", + "enhanced-resolve": "^5.9.3", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", - "json-parse-better-errors": "^1.0.2", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", @@ -26932,7 +27923,7 @@ "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.3.1", - "webpack-sources": "^3.2.2" + "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" @@ -26951,13 +27942,13 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.2.2.tgz", - "integrity": "sha512-DjZyYrsHhkikAFNvSNKrpnziXukU1EChFAh9j4LAm6ndPLPW8cN0KhM7T+RAiOqsQ6ABfQ8hoKIs9IWMTjov+w==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "dev": true, "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.2.2", + "memfs": "^3.4.3", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" @@ -26974,9 +27965,9 @@ } }, "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -27024,27 +28015,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/webpack-dev-middleware/node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "dependencies": { - "mime-db": "1.51.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -27065,36 +28035,40 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.6.0.tgz", - "integrity": "sha512-oojcBIKvx3Ya7qs1/AVWHDgmP1Xml8rGsEBnSobxU/UJSX1xP1GPM3MwsAnDzvqcVmVki8tV7lbcsjEjk0PtYg==", - "dev": true, - "dependencies": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.3.tgz", + "integrity": "sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^3.5.2", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", + "connect-history-api-fallback": "^2.0.0", "default-gateway": "^6.0.3", - "del": "^6.0.0", - "express": "^4.17.1", + "express": "^4.17.3", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", + "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", "open": "^8.0.9", "p-retry": "^4.5.0", - "portfinder": "^1.0.28", + "rimraf": "^3.0.2", "schema-utils": "^4.0.0", - "selfsigned": "^1.10.11", + "selfsigned": "^2.0.1", "serve-index": "^1.9.1", - "sockjs": "^0.3.21", + "sockjs": "^0.3.24", "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^5.2.1", - "ws": "^8.1.0" + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" @@ -27102,6 +28076,10 @@ "engines": { "node": ">= 12.13.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, "peerDependencies": { "webpack": "^4.37.0 || ^5.0.0" }, @@ -27112,9 +28090,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -27156,30 +28134,45 @@ "ajv": "^8.8.2" } }, - "node_modules/webpack-dev-server/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/webpack-dev-server/node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=0.8" } }, - "node_modules/webpack-dev-server/node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/webpack-dev-server/node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/webpack-dev-server/node_modules/schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -27199,19 +28192,16 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/webpack-dev-server/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "node_modules/webpack-dev-server/node_modules/selfsigned": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "node-forge": "^1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=10" } }, "node_modules/webpack-log": { @@ -27289,6 +28279,12 @@ } } }, + "node_modules/webpack/node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, "node_modules/webpack/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -27305,33 +28301,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/webpack/node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "node_modules/webpack/node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack/node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "dependencies": { - "mime-db": "1.51.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -27351,9 +28320,9 @@ } }, "node_modules/webpack/node_modules/webpack-sources": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz", - "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, "engines": { "node": ">=10.13.0" @@ -27569,9 +28538,9 @@ } }, "node_modules/ws": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz", - "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", "dev": true, "engines": { "node": ">=10.0.0" @@ -27763,229 +28732,104 @@ }, "dependencies": { "@ampproject/remapping": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.0.2.tgz", - "integrity": "sha512-SncaVxs+E3EdoA9xJgHfWPxZfowAgeIsd71VpqCKP6KNKm6s7zSqqvUc70UpKUFsrV3dAmy6qxHoIj5NG+3DiA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "1.0.0", - "sourcemap-codec": "1.4.8" - }, - "dependencies": { - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - } + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@angular-devkit/architect": { - "version": "0.1301.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1301.1.tgz", - "integrity": "sha512-3g1wlqihVEOhClsuSzyJYm8Sr4qc4IUDuOa45m8439bz9iQy2wZ3JUGTwX1NcpeLxmCDrgewuphIsW096HxYlg==", + "version": "0.1401.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1401.0.tgz", + "integrity": "sha512-dHgP2/5EXkJpdf6Y1QHQX2RP8xTli/CFZH3uNnTh+EuAib/kwu+Z6K3UttZWB5VGhAF1u/xf97Vly/UkXvjKAg==", "dev": true, "requires": { - "@angular-devkit/core": "13.1.1", + "@angular-devkit/core": "14.1.0", "rxjs": "6.6.7" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } } }, "@angular-devkit/build-angular": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.1.1.tgz", - "integrity": "sha512-9+Ql4+rIt5CFfxLCZntCUdcVGl7mOi43/jpmYd31DKEUt4OPrqLoR5LsYepy3UR0+B0kNP6/PEOvaRiCb4t2GQ==", - "dev": true, - "requires": { - "@ampproject/remapping": "1.0.2", - "@angular-devkit/architect": "0.1301.1", - "@angular-devkit/build-webpack": "0.1301.1", - "@angular-devkit/core": "13.1.1", - "@babel/core": "7.16.0", - "@babel/generator": "7.16.0", - "@babel/helper-annotate-as-pure": "7.16.0", - "@babel/plugin-proposal-async-generator-functions": "7.16.4", - "@babel/plugin-transform-async-to-generator": "7.16.0", - "@babel/plugin-transform-runtime": "7.16.4", - "@babel/preset-env": "7.16.4", - "@babel/runtime": "7.16.3", - "@babel/template": "7.16.0", - "@discoveryjs/json-ext": "0.5.6", - "@ngtools/webpack": "13.1.1", - "ansi-colors": "4.1.1", - "babel-loader": "8.2.3", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.1.0.tgz", + "integrity": "sha512-AtecSuDEPLYd3p7uFVKpoA0XNcq+NvVYFJK8h90BG+IRZtzEm7ZJeYdohXVeVfTO5GvpNFN1XoHxR5rxiXeBhg==", + "dev": true, + "requires": { + "@ampproject/remapping": "2.2.0", + "@angular-devkit/architect": "0.1401.0", + "@angular-devkit/build-webpack": "0.1401.0", + "@angular-devkit/core": "14.1.0", + "@babel/core": "7.18.6", + "@babel/generator": "7.18.7", + "@babel/helper-annotate-as-pure": "7.18.6", + "@babel/plugin-proposal-async-generator-functions": "7.18.6", + "@babel/plugin-transform-async-to-generator": "7.18.6", + "@babel/plugin-transform-runtime": "7.18.6", + "@babel/preset-env": "7.18.6", + "@babel/runtime": "7.18.6", + "@babel/template": "7.18.6", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "14.1.0", + "ansi-colors": "4.1.3", + "babel-loader": "8.2.5", "babel-plugin-istanbul": "6.1.1", "browserslist": "^4.9.1", - "cacache": "15.3.0", - "circular-dependency-plugin": "5.2.2", - "copy-webpack-plugin": "10.0.0", - "core-js": "3.19.3", - "critters": "0.0.15", - "css-loader": "6.5.1", - "esbuild": "0.14.2", - "esbuild-wasm": "0.14.2", - "glob": "7.2.0", - "https-proxy-agent": "5.0.0", - "inquirer": "8.2.0", - "jsonc-parser": "3.0.0", + "cacache": "16.1.1", + "copy-webpack-plugin": "11.0.0", + "critters": "0.0.16", + "css-loader": "6.7.1", + "esbuild": "0.14.49", + "esbuild-wasm": "0.14.49", + "glob": "8.0.3", + "https-proxy-agent": "5.0.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.1.0", "karma-source-map-support": "1.4.0", - "less": "4.1.2", - "less-loader": "10.2.0", - "license-webpack-plugin": "4.0.0", + "less": "4.1.3", + "less-loader": "11.0.0", + "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.0", - "mini-css-extract-plugin": "2.4.5", - "minimatch": "3.0.4", + "mini-css-extract-plugin": "2.6.1", + "minimatch": "5.1.0", "open": "8.4.0", "ora": "5.4.1", "parse5-html-rewriting-stream": "6.0.1", - "piscina": "3.1.0", - "postcss": "8.4.4", - "postcss-import": "14.0.2", - "postcss-loader": "6.2.1", - "postcss-preset-env": "6.7.0", + "piscina": "3.2.0", + "postcss": "8.4.14", + "postcss-import": "14.1.0", + "postcss-loader": "7.0.1", + "postcss-preset-env": "7.7.2", "regenerator-runtime": "0.13.9", - "resolve-url-loader": "4.0.0", + "resolve-url-loader": "5.0.0", "rxjs": "6.6.7", - "sass": "1.44.0", - "sass-loader": "12.4.0", - "semver": "7.3.5", - "source-map-loader": "3.0.0", + "sass": "1.53.0", + "sass-loader": "13.0.2", + "semver": "7.3.7", + "source-map-loader": "4.0.0", "source-map-support": "0.5.21", - "stylus": "0.55.0", - "stylus-loader": "6.2.0", - "terser": "5.10.0", + "stylus": "0.58.1", + "stylus-loader": "7.0.0", + "terser": "5.14.2", "text-table": "0.2.0", "tree-kill": "1.2.2", - "tslib": "2.3.1", - "webpack": "5.65.0", - "webpack-dev-middleware": "5.2.2", - "webpack-dev-server": "4.6.0", + "tslib": "2.4.0", + "webpack": "5.73.0", + "webpack-dev-middleware": "5.3.3", + "webpack-dev-server": "4.9.3", "webpack-merge": "5.8.0", - "webpack-subresource-integrity": "5.0.0" + "webpack-subresource-integrity": "5.1.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.0" - } - }, - "@babel/core": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", - "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", - "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - }, - "@babel/helpers": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.5.tgz", - "integrity": "sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==", - "dev": true, - "requires": { - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - } - }, - "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "@npmcli/move-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.0.tgz", + "integrity": "sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" } }, "agent-base": { @@ -27997,6 +28841,12 @@ "debug": "4" } }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -28012,85 +28862,124 @@ "color-convert": "^2.0.1" } }, + "autoprefixer": { + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", + "dev": true, + "requires": { + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, "cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.1.tgz", + "integrity": "sha512-VDKN+LHyCQXaaYZ7rA/qtkURU+/yYhviUdvqEv2LT6QPZU8jpyzEkEVAcKlKLt5dJ5BRp11ym8lo3NKLluEPLg==", "dev": true, "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", "unique-filename": "^1.1.1" + }, + "dependencies": { + "lru-cache": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz", + "integrity": "sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ==", + "dev": true + } } }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "ms": "2.1.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "esbuild": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.2.tgz", - "integrity": "sha512-l076A6o/PIgcyM24s0dWmDI/b8RQf41uWoJu9I0M71CtW/YSw5T5NUeXxs5lo2tFQD+O4CW4nBHJXx3OY5NpXg==", + "css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", "dev": true, - "optional": true, "requires": { - "esbuild-android-arm64": "0.14.2", - "esbuild-darwin-64": "0.14.2", - "esbuild-darwin-arm64": "0.14.2", - "esbuild-freebsd-64": "0.14.2", - "esbuild-freebsd-arm64": "0.14.2", - "esbuild-linux-32": "0.14.2", - "esbuild-linux-64": "0.14.2", - "esbuild-linux-arm": "0.14.2", - "esbuild-linux-arm64": "0.14.2", - "esbuild-linux-mips64le": "0.14.2", - "esbuild-linux-ppc64le": "0.14.2", - "esbuild-netbsd-64": "0.14.2", - "esbuild-openbsd-64": "0.14.2", - "esbuild-sunos-64": "0.14.2", - "esbuild-windows-32": "0.14.2", - "esbuild-windows-64": "0.14.2", - "esbuild-windows-arm64": "0.14.2" - } - }, - "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==", + "postcss-selector-parser": "^6.0.9" + } + }, + "css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "dev": true, + "requires": {} + }, + "cssdb": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.6.3.tgz", + "integrity": "sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA==", "dev": true }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "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" + "minimatch": "^5.0.1", + "once": "^1.3.0" } }, "has-flag": { @@ -28100,19 +28989,28 @@ "dev": true }, "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "requires": { "agent-base": "6", "debug": "4" } }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, "inquirer": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", - "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", @@ -28125,36 +29023,21 @@ "mute-stream": "0.0.8", "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^7.2.0", + "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6" + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" }, "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "rxjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", - "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", + "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", "dev": true, "requires": { - "tslib": "~2.1.0" + "tslib": "^2.1.0" } - }, - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true } } }, @@ -28164,6 +29047,21 @@ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true }, + "jsonc-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", + "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", + "dev": true + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -28187,15 +29085,331 @@ "is-wsl": "^2.2.0" } }, - "postcss": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.4.tgz", - "integrity": "sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q==", + "piscina": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", + "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", "dev": true, "requires": { - "nanoid": "^3.1.30", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0", + "nice-napi": "^1.0.2" + } + }, + "postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-properties": { + "version": "12.1.8", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.8.tgz", + "integrity": "sha512-8rbj8kVu00RQh2fQF81oBqtduiANu4MIxhyf0HbbStgPtnFlWn0yiaYTpLHrPnJbffVY1s9apWsIoVZcc68FxA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "dev": true, + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "dev": true, + "requires": {} + }, + "postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "dev": true, + "requires": {} + }, + "postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "dev": true, + "requires": {} + }, + "postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "dev": true, + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "dev": true, + "requires": {} + }, + "postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "dev": true, + "requires": {} + }, + "postcss-nesting": { + "version": "10.1.10", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.10.tgz", + "integrity": "sha512-lqd7LXCq0gWc0wKXtoKDru5wEUNjm3OryLVNRZ8OnW8km6fSNUuFrjEhU3nklxXE2jvd4qrox566acgh+xQt8w==", + "dev": true, + "requires": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "dev": true, + "requires": {} + }, + "postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-preset-env": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.7.2.tgz", + "integrity": "sha512-1q0ih7EDsZmCb/FMDRvosna7Gsbdx8CvYO5hYT120hcp2ZAuOHpSzibujZ4JpIUcAC02PG6b+eftxqjTFh5BNA==", + "dev": true, + "requires": { + "@csstools/postcss-cascade-layers": "^1.0.4", + "@csstools/postcss-color-function": "^1.1.0", + "@csstools/postcss-font-format-keywords": "^1.0.0", + "@csstools/postcss-hwb-function": "^1.0.1", + "@csstools/postcss-ic-unit": "^1.0.0", + "@csstools/postcss-is-pseudo-class": "^2.0.6", + "@csstools/postcss-normalize-display-values": "^1.0.0", + "@csstools/postcss-oklab-function": "^1.1.0", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.1", + "@csstools/postcss-unset-value": "^1.0.1", + "autoprefixer": "^10.4.7", + "browserslist": "^4.21.0", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^6.6.3", + "postcss-attribute-case-insensitive": "^5.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.3", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.0", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.8", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.4", + "postcss-double-position-gradients": "^3.1.1", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.3", + "postcss-image-set-function": "^4.0.6", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.0", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.1.9", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.3", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.4", + "postcss-pseudo-class-any-link": "^7.1.5", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "dev": true, + "requires": {} + }, + "postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "requires": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } } }, "rimraf": { @@ -28205,40 +29419,75 @@ "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" }, "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "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" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } } } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "source-map-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true }, + "source-map-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz", + "integrity": "sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw==", + "dev": true, + "requires": { + "abab": "^2.0.6", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + } + }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -28247,14 +29496,15 @@ "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 - } + } + }, + "ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "requires": { + "minipass": "^3.1.1" } }, "strip-ansi": { @@ -28276,15 +29526,15 @@ } }, "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "webpack-subresource-integrity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.0.0.tgz", - "integrity": "sha512-x9514FpLRydO+UAQ8DY4aLtCjxmdLkuQVcDFN1kGzuusREYJ1B0rzk/iIlWiL6dnvrhEGFj2+UsdxDkP8Z4UKg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", "dev": true, "requires": { "typed-assert": "^1.0.8" @@ -28312,50 +29562,32 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1301.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1301.1.tgz", - "integrity": "sha512-drXKdqsM3uB4nII0pU8FtAI6cd96sza3r1mWl8mqJEkzgkYIGVK/2CekKdVe1AXAvEeQFVRDRMYXraMNpli/QQ==", + "version": "0.1401.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1401.0.tgz", + "integrity": "sha512-jKfnHal09mVnEapmNrAHXL/00LfafmfEUtlOPzQMgGJL7MWCeMcFthsbcOnGuzUerbiiquRk/KmLTERYjH+ZrQ==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1301.1", + "@angular-devkit/architect": "0.1401.0", "rxjs": "6.6.7" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } } }, "@angular-devkit/core": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.1.1.tgz", - "integrity": "sha512-tpOOzdrbrXG+BiJ/iKUX5VU5vBXN/n+H1EMThTwjgT11mqw2uvMj4sSRPvHUrrfxbLE9deuCDQEzmci71enn2w==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.1.0.tgz", + "integrity": "sha512-Y2d/+nFmjjY4eatc3cwdDDAnpnhG3KTX2OVW7dXSUxW3eY5e3vdMlVUbFiKwvwAshlrJy85Y6RMvZSBN4VrpnA==", "dev": true, "requires": { - "ajv": "8.8.2", + "ajv": "8.11.0", "ajv-formats": "2.1.1", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", + "jsonc-parser": "3.1.0", "rxjs": "6.6.7", - "source-map": "0.7.3" + "source-map": "0.7.4" }, "dependencies": { "ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -28373,103 +29605,101 @@ "ajv": "^8.0.0" } }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "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" - } + "jsonc-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", + "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", + "dev": true }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true } } }, "@angular-devkit/schematics": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.1.1.tgz", - "integrity": "sha512-uDE0vzjx7MyiJOul91MYMVpRPnAW5/o+pHcINx85wR6t4/RDQSH3UdBCCFxxwv1W9YZSR4kMiwi/sUYqPqbQMw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.1.0.tgz", + "integrity": "sha512-5QC01k9eznuQSiqxijKhVkAEmA8sioYuLhBzyffaPszSySH8kPMNxhAc8zJhBTNLumbS6iDaGkSqTQl5Kv9fOw==", "dev": true, "requires": { - "@angular-devkit/core": "13.1.1", - "jsonc-parser": "3.0.0", - "magic-string": "0.25.7", + "@angular-devkit/core": "14.1.0", + "jsonc-parser": "3.1.0", + "magic-string": "0.26.2", "ora": "5.4.1", "rxjs": "6.6.7" }, "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "jsonc-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", + "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", + "dev": true + }, + "magic-string": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", + "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", "dev": true, "requires": { - "tslib": "^1.9.0" + "sourcemap-codec": "^1.4.8" } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true } } }, "@angular/cli": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.1.1.tgz", - "integrity": "sha512-cdcl3UAhA2oQK8klDl9zt5SwScSg2F4VQDUQ8XsdApKIRlEfee1Xf7WXKsGpgAuojrFHMzDVWjAg/bOyIpioLg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.1.0.tgz", + "integrity": "sha512-W/t2PkGHu9r87po1ZXQRYU81VtjzNMuGsP5tmoW1pGuibK7Kj+25G+jrXK/WADTi+pjTMXHNXYn8PlMNAIrZ/w==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1301.1", - "@angular-devkit/core": "13.1.1", - "@angular-devkit/schematics": "13.1.1", - "@schematics/angular": "13.1.1", + "@angular-devkit/architect": "0.1401.0", + "@angular-devkit/core": "14.1.0", + "@angular-devkit/schematics": "14.1.0", + "@schematics/angular": "14.1.0", "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.1", - "debug": "4.3.3", - "ini": "2.0.0", - "inquirer": "8.2.0", - "jsonc-parser": "3.0.0", - "npm-package-arg": "8.1.5", - "npm-pick-manifest": "6.1.1", + "ansi-colors": "4.1.3", + "debug": "4.3.4", + "ini": "3.0.0", + "inquirer": "8.2.4", + "jsonc-parser": "3.1.0", + "npm-package-arg": "9.1.0", + "npm-pick-manifest": "7.0.1", "open": "8.4.0", "ora": "5.4.1", - "pacote": "12.0.2", - "resolve": "1.20.0", - "semver": "7.3.5", + "pacote": "13.6.1", + "resolve": "1.22.1", + "semver": "7.3.7", "symbol-observable": "4.0.0", - "uuid": "8.3.2" + "uuid": "8.3.2", + "yargs": "17.5.1" }, "dependencies": { "@schematics/angular": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.1.1.tgz", - "integrity": "sha512-GY49qumsQ+w1aDsCa796iPL/GcokCVKr2OMLss3avwciBFciMOVsLxZ04lprPCivCQRcKNqbSDDx4+xH5qkrAg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.1.0.tgz", + "integrity": "sha512-lhqNZzA+iT3XwlwRU757mhYmd5WE9XB2OKFhosvvszou2zuNUJMDPR9P01ZVNCOa2fScOeCMg2q3ZDgGTBl96Q==", "dev": true, "requires": { - "@angular-devkit/core": "13.1.1", - "@angular-devkit/schematics": "13.1.1", - "jsonc-parser": "3.0.0" + "@angular-devkit/core": "14.1.0", + "@angular-devkit/schematics": "14.1.0", + "jsonc-parser": "3.1.0" } }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -28496,9 +29726,9 @@ } }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -28511,15 +29741,15 @@ "dev": true }, "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz", + "integrity": "sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==", "dev": true }, "inquirer": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", - "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", @@ -28532,10 +29762,11 @@ "mute-stream": "0.0.8", "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^7.2.0", + "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6" + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" } }, "is-docker": { @@ -28544,6 +29775,12 @@ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true }, + "jsonc-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", + "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -28561,29 +29798,19 @@ "is-wsl": "^2.2.0" } }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, "rxjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", - "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", + "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", "dev": true, "requires": { - "tslib": "~2.1.0" + "tslib": "^2.1.0" } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -28607,12 +29834,6 @@ "has-flag": "^4.0.0" } }, - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -28622,33 +29843,32 @@ } }, "@angular/common": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.1.0.tgz", - "integrity": "sha512-bDuxl9N2fsaDrkNNuyNEdXMLwCCkjT9ru03QzP+b9RxmCBoUGeHD0uN61N5PMrsKq2RxB6jv4MJQJjT+jQqTsA==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.1.0.tgz", + "integrity": "sha512-leethDtLbA3qySaOEBUto602DF0qH1maK9u2zHncrUFOpnHAYUEd7N9MFMdIYASurTnwOSglEoIDCML94qzImQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.1.0.tgz", - "integrity": "sha512-l5qE3e+I/ogjVtXVHK0VoBOTE7N71dUcshI7Cvh5J7dFLKqbkYIr9xAP1D1tEVR6h9mzOVP5qD/M5ylR51rrOA==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-14.1.0.tgz", + "integrity": "sha512-aLbtpFDF3fp/DOEsWSdpszmoNZAb0To/zoKhHVmEReuUKkMtlPNd3+e6wkR2vrvR/cWgbKwdb7RQ1IQtGDu74A==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.1.0.tgz", - "integrity": "sha512-AUfRF3+hqy2M1TFvi70OiC13Ew9IzzTAbZppGF+N7f5ZbhyuZyGNy/gs3BxlZC0Up5ZQo7GcMHwPxovLNvgFMA==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.1.0.tgz", + "integrity": "sha512-llJkDnv0+riTdRPdOJv/FToz4X9ZO1URnalW+tIe2RyfOzkEqM+VLD/x+3cVgnsaFKuoPxIjZEkMoppGwVB4kg==", "dev": true, "requires": { - "@babel/core": "^7.8.6", - "canonical-path": "1.0.0", + "@babel/core": "^7.17.2", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", "dependency-graph": "^0.11.0", - "magic-string": "^0.25.0", + "magic-string": "^0.26.0", "reflect-metadata": "^0.1.2", "semver": "^7.0.0", "sourcemap-codec": "^1.4.8", @@ -28656,65 +29876,68 @@ "yargs": "^17.2.1" }, "dependencies": { + "magic-string": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", + "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" } - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true } } }, "@angular/core": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.1.0.tgz", - "integrity": "sha512-eW+8dqGUqVbuzmFdyjhwizzH1FF9Mey5tvRZqzDSG1nTzlMgzQfrF/R0NEuqJdxUyjDFXiO4NyhUivFQ65CsdA==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-14.1.0.tgz", + "integrity": "sha512-3quEsHmQifJOQ2oij5K+cjGjmhsKsyZI1+OTHWNZ6IXeuYviZv4U/Cui9fUJ1RN3CZxH3NzWB3gB/5qYFQfOgg==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.1.0.tgz", - "integrity": "sha512-sf9I8wftUk2+bTbdaVH2ioTXw5UfKNl0P4XFUoFxDuAzUxxlxN/ocY/VzevIEtQfoAwUp8eawnN9BkIXy+EMww==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-14.1.0.tgz", + "integrity": "sha512-y7VQ2t+/ASEjzt8zXg4y5b03lMSPHmnhy4XzjDT14ZFrALaSxyhkSqoBfAksPkTeKmsFMnP/VgLboRsE8TLs0Q==", "requires": { "tslib": "^2.3.0" } }, "@angular/language-service": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-13.1.0.tgz", - "integrity": "sha512-tpK/0CljInRJNP/nizQ8Bj0yFsLLmbcqAJ5yUp4uDM9nVpgmHxzJIIpR/Sk+8KKMlED5eGRXjZKPY4zhlJTmqw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-14.1.0.tgz", + "integrity": "sha512-ldL4xMDjXYZ93FCEIBVGipx9Qfgr7NuBNO+e25d+nWikXrUOnLfvF4UOL/TSUwSwqN4jxDI2KMNQIF6SecZfvQ==", "dev": true }, "@angular/platform-browser": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.1.0.tgz", - "integrity": "sha512-2c1OdOefpGVuIgFD0bojtEzPttXMC+iC8h/4fMpmW4v9JyRvTgPV2OPIpgfT25fTnGLQAJ19C8VG/S1J/JlXMw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.1.0.tgz", + "integrity": "sha512-axNXUSqxsP0QSdNskd1pFo2uMo1UNoFaSAB02eDWwLkWQ1pWel+T78HiQY2bNeI3elgzjwPTT4vCCDQKNVTNig==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.1.0.tgz", - "integrity": "sha512-rLFOHejw3ifJZapze0q/tHopFUZw+u/2biLFNffo+Z3UFsKI/PrBq9F+NVXnLdWzJNRY+NiI8ZFctJ9u4H39GQ==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.1.0.tgz", + "integrity": "sha512-0Lxz3HJ9qTOyMTp5Qud2tycP7wqe+tnHOSUqDywrbNRozTKGX0z3i+l0KMku3BtUbuMi3tJomqV914/dtbCvIw==", "requires": { "tslib": "^2.3.0" } }, "@angular/router": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.1.0.tgz", - "integrity": "sha512-A/8O0GGLKENg5wxP7TFTPWmDtyMOL9qq65uxYQCyv46/2ra76FKteFg9UzcuuXPBiCAxD1wbL5kRF2MZlfrQ3Q==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-14.1.0.tgz", + "integrity": "sha512-WBC1E+d9RS8vy57zJ6LVtWT3AM12mEHY7SCMBRJNBcrmBYJwojxeV8IVkUoW4Ds910gG/w3LjIN0eNHg5qRtNA==", "requires": { "tslib": "^2.3.0" } @@ -28726,64 +29949,43 @@ "dev": true }, "@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==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, "requires": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.18.6" } }, "@babel/compat-data": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", - "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", "dev": true }, "@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helpers": "^7.9.0", - "@babel/parser": "^7.9.0", - "@babel/template": "^7.8.6", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", + "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helpers": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.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/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" - } - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -28799,61 +30001,66 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", + "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", "dev": true, "requires": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.18.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" }, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } } } }, "@babel/helper-annotate-as-pure": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", - "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.5.tgz", - "integrity": "sha512-3JEA9G5dmmnIWdzaT9d0NmFRgYnWUThLsDaL7982H0XqqWr56lRrsmwheXFMjR+TMl7QMBb6mzy9kvgr1lRLUA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" } }, "@babel/helper-compilation-targets": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", - "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", "dev": true, "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.17.5", + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", "semver": "^6.3.0" }, "dependencies": { @@ -28866,67 +30073,34 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.5.tgz", - "integrity": "sha512-NEohnYA7mkB8L5JhU7BLwcBdU3j83IziR9aseMueWGeAjblbul3zzb8UvJ3a1zuBiqCMObzCJHFqKIQE6hTVmg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", + "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-member-expression-to-functions": "^7.16.5", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.5", - "@babel/helper-split-export-declaration": "^7.16.0" - }, - "dependencies": { - "@babel/helper-member-expression-to-functions": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz", - "integrity": "sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", - "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-replace-supers": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz", - "integrity": "sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-member-expression-to-functions": "^7.16.5", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - } - } + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz", - "integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", + "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "regexpu-core": "^4.7.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" } }, "@babel/helper-define-polyfill-provider": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz", - "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.13.0", @@ -28939,19 +30113,10 @@ "semver": "^6.1.2" }, "dependencies": { - "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -28972,379 +30137,369 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz", - "integrity": "sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true }, "@babel/helper-explode-assignable-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz", - "integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" } }, "@babel/helper-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", - "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", - "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" } }, "@babel/helper-hoist-variables": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", - "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz", - "integrity": "sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", "dev": true, "requires": { - "@babel/types": "^7.10.5" + "@babel/types": "^7.18.9" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-transforms": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.5.tgz", - "integrity": "sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@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==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.18.6" } }, "@babel/helper-plugin-utils": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", - "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.5.tgz", - "integrity": "sha512-X+aAJldyxrOmN9v3FKp+Hu1NO69VWgYgDGq6YDykwRPzxs5f2N+X988CBXS7EQahDU+Vpet5QYMqLk+nsp+Qxw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-wrap-function": "^7.16.5", - "@babel/types": "^7.16.0" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", + "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.18.6" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.9" } }, "@babel/helper-split-export-declaration": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", - "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" } }, "@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==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.5.tgz", - "integrity": "sha512-2J2pmLBqUqVdJw78U0KPNdeE2qeuIyKoG4mKV7wAq3mc4jJG282UgjZw4ZYDnqiWQuS3Y3IYdF/AQ6CpyBV3VA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz", + "integrity": "sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" + "@babel/helper-function-name": "^7.18.9", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.5.tgz", - "integrity": "sha512-+Ce7T5iPNWzfu9C1aB5tN3Lyafs5xb3Ic7vBWyZL2KXT3QSdD1dD3CvgOzPmQKoNNRt6uauc0XwNJTQtXC2/Mw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz", - "integrity": "sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz", - "integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", - "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", + "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.4", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.5.tgz", - "integrity": "sha512-pJD3HjgRv83s5dv1sTnDbZOaTjghKEz8KUn1Kbh2eAIRhGuyQ1XSeI4xVXU3UlIEVA3DAyIdxqT1eRn7Wcn55A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.5", - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.5.tgz", - "integrity": "sha512-EEFzuLZcm/rNJ8Q5krK+FRKdVkd6FjfzT9tuSZql9sQn64K0hHA2KLJ0DqVot9/iV6+SsuadC5yI39zWnm+nmQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.5", - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.5.tgz", - "integrity": "sha512-P05/SJZTTvHz79LNYTF8ff5xXge0kk5sIIWAypcWgX4BTRUgyHc8wRxJ/Hk+mU0KXldgOOslKaeqnhthcDJCJQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.5.tgz", - "integrity": "sha512-i+sltzEShH1vsVydvNaTRsgvq2vZsfyrd7K7vPLUU/KgS0D5yZMe6uipM0+izminnkKrEfdUnz7CxMRb6oHZWw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.5.tgz", - "integrity": "sha512-QQJueTFa0y9E4qHANqIvMsuxM/qcLQmKttBACtPCQzGUEizsXDACGonlPiSwynHfOa3vNw0FPMVvQzbuXwh4SQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.5.tgz", - "integrity": "sha512-xqibl7ISO2vjuQM+MzR3rkd0zfNWltk7n9QhaD8ghMmMceVguYrNDt7MikRyj4J4v3QehpnrU8RYLnC7z/gZLA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.5.tgz", - "integrity": "sha512-YwMsTp/oOviSBhrjwi0vzCUycseCYwoXnLiXIL3YNjHSMBHicGTz7GjVU/IGgz4DtOEXBdCNG72pvCX22ehfqg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.5.tgz", - "integrity": "sha512-DvB9l/TcsCRvsIV9v4jxR/jVP45cslTVC0PMVHvaJhhNuhn2Y1SOhCSFlPK777qLB5wb8rVDaNoqMTyOqtY5Iw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.5.tgz", - "integrity": "sha512-UEd6KpChoyPhCoE840KRHOlGhEZFutdPDMGj+0I56yuTTOaT51GzmnEl/0uT41fB/vD2nT+Pci2KjezyE3HmUw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", + "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", "dev": true, "requires": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-compilation-targets": "^7.16.3", - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.5" + "@babel/plugin-transform-parameters": "^7.18.8" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.5.tgz", - "integrity": "sha512-ihCMxY1Iljmx4bWy/PIMJGXN4NS4oUj1MKynwO07kiKms23pNvIn1DMB92DNB2R0EA882sw0VXIelYGdtF7xEQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.5.tgz", - "integrity": "sha512-kzdHgnaXRonttiTfKYnSVafbWngPPr2qKw9BWYBESl91W54e+9R5pP70LtWxV56g0f05f/SQrwHYkfvbwcdQ/A==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.5.tgz", - "integrity": "sha512-+yFMO4BGT3sgzXo+lrq7orX5mAZt57DwUK6seqII6AcJnJOIhBJ8pzKH47/ql/d426uQ7YhN8DpUFirQzqYSUA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.5", - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.5.tgz", - "integrity": "sha512-+YGh5Wbw0NH3y/E5YMu6ci5qTDmAEVNoZ3I54aB6nVEOZ5BQ7QJlwKq5pYVucQilMByGn/bvX0af+uNaPRCabA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-create-class-features-plugin": "^7.16.5", - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.5.tgz", - "integrity": "sha512-s5sKtlKQyFSatt781HQwv1hoM5BQ9qRH30r+dK56OLDsHmV74mzwJNX7R1yMuE7VZKG5O6q/gmOGSAO6ikTudg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-async-generators": { @@ -29392,6 +30547,15 @@ "@babel/helper-plugin-utils": "^7.8.3" } }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, "@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", @@ -29474,521 +30638,270 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.5.tgz", - "integrity": "sha512-8bTHiiZyMOyfZFULjsCnYOWG059FVMes0iljEHSfARhNgFfpsqE92OrCffv3veSw9rwMkYcFe9bj0ZoXU2IGtQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", - "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.0" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - } + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.5.tgz", - "integrity": "sha512-BxmIyKLjUGksJ99+hJyL/HIxLIGnLKtw772zYDER7UuycDZ+Xvzs98ZQw6NGgM2ss4/hlFAaGiZmMNKvValEjw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.5.tgz", - "integrity": "sha512-JxjSPNZSiOtmxjX7PBRBeRJTUKTyJ607YUYeT0QJCNdsedOe+/rXITjP08eG8xUpsLfPirgzdCFN+h0w6RI+pQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", + "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-classes": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.5.tgz", - "integrity": "sha512-DzJ1vYf/7TaCYy57J3SJ9rV+JEuvmlnvvyvYKFbk5u46oQbBvuB9/0w+YsVsxkOv8zVWKpDmUoj4T5ILHoXevA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-plugin-utils": "^7.16.5", - "@babel/helper-replace-supers": "^7.16.5", - "@babel/helper-split-export-declaration": "^7.16.0", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", + "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" - }, - "dependencies": { - "@babel/helper-member-expression-to-functions": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz", - "integrity": "sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", - "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-replace-supers": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz", - "integrity": "sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-member-expression-to-functions": "^7.16.5", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - } - } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.5.tgz", - "integrity": "sha512-n1+O7xtU5lSLraRzX88CNcpl7vtGdPakKzww74bVwpAIRgz9JVLJJpOLb0uYqcOaXVM0TL6X0RVeIJGD2CnCkg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-destructuring": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.5.tgz", - "integrity": "sha512-GuRVAsjq+c9YPK6NeTkRLWyQskDC099XkBSVO+6QzbnOnH2d/4mBVXYStaPrZD3dFRfg00I6BFJ9Atsjfs8mlg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", + "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.5.tgz", - "integrity": "sha512-iQiEMt8Q4/5aRGHpGVK2Zc7a6mx7qEAO7qehgSug3SDImnuMzgmm/wtJALXaz25zUj1PmnNHtShjFgk4PDx4nw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.5.tgz", - "integrity": "sha512-81tijpDg2a6I1Yhj4aWY1l3O1J4Cg/Pd7LfvuaH2VVInAkXtzibz9+zSPdUM1WvuUi128ksstAP0hM5w48vQgg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.5.tgz", - "integrity": "sha512-12rba2HwemQPa7BLIKCzm1pT2/RuQHtSFHdNl41cFiC6oi4tcrp7gjB07pxQvFpcADojQywSjblQth6gJyE6CA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.5", - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-for-of": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.5.tgz", - "integrity": "sha512-+DpCAJFPAvViR17PIMi9x2AE34dll5wNlXO43wagAX2YcRGgEVHCNFC4azG85b4YyyFarvkc/iD5NPrz4Oneqw==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-function-name": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.5.tgz", - "integrity": "sha512-Fuec/KPSpVLbGo6z1RPw4EE1X+z9gZk1uQmnYy7v4xr4TO9p41v1AoUuXEtyqAI7H+xNJYSICzRqZBhDEkd3kQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-literals": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.5.tgz", - "integrity": "sha512-B1j9C/IfvshnPcklsc93AVLTrNVa69iSqztylZH6qnmiAsDDOmmjEYqOm3Ts2lGSgTSywnBNiqC949VdD0/gfw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.5.tgz", - "integrity": "sha512-d57i3vPHWgIde/9Y8W/xSFUndhvhZN5Wu2TjRrN1MVz5KzdUihKnfDVlfP1U7mS5DNj/WHHhaE4/tTi4hIyHwQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.5.tgz", - "integrity": "sha512-oHI15S/hdJuSCfnwIz+4lm6wu/wBn7oJ8+QrkzPPwSFGXk8kgdI/AIKcbR/XnD1nQVMg/i6eNaXpszbGuwYDRQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", + "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.5", - "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", - "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - } } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.5.tgz", - "integrity": "sha512-ABhUkxvoQyqhCWyb8xXtfwqNMJD7tx+irIRnUh6lmyFud7Jln1WzONXKlax1fg/ey178EXbs4bSGNd6PngO+SQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", + "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.5", - "@babel/helper-plugin-utils": "^7.16.5", - "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", - "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - } } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.5.tgz", - "integrity": "sha512-53gmLdScNN28XpjEVIm7LbWnD/b/TpbwKbLk6KV4KqC9WyU6rq1jnNmVG6UgAdQZVVGZVoik3DqHNxk4/EvrjA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", + "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.5", - "@babel/helper-plugin-utils": "^7.16.5", - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", - "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - } } }, "@babel/plugin-transform-modules-umd": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.5.tgz", - "integrity": "sha512-qTFnpxHMoenNHkS3VoWRdwrcJ3FhX567GvDA3hRZKF0Dj8Fmg0UzySZp3AP2mShl/bzcywb/UWAMQIjA1bhXvw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.5", - "@babel/helper-plugin-utils": "^7.16.5" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", - "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - } + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.5.tgz", - "integrity": "sha512-/wqGDgvFUeKELW6ex6QB7dLVRkd5ehjw34tpXu1nhKC0sFfmaLabIswnpf8JgDyV2NeDmZiwoOb0rAmxciNfjA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", + "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-new-target": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.5.tgz", - "integrity": "sha512-ZaIrnXF08ZC8jnKR4/5g7YakGVL6go6V9ql6Jl3ecO8PQaQqFE74CuM384kezju7Z9nGCCA20BqZaR1tJ/WvHg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-object-super": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.5.tgz", - "integrity": "sha512-tded+yZEXuxt9Jdtkc1RraW1zMF/GalVxaVVxh41IYwirdRgyAxxxCKZ9XB7LxZqmsjfjALxupNE1MIz9KH+Zg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5", - "@babel/helper-replace-supers": "^7.16.5" - }, - "dependencies": { - "@babel/helper-member-expression-to-functions": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz", - "integrity": "sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", - "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-replace-supers": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz", - "integrity": "sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-member-expression-to-functions": "^7.16.5", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - } - } + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" } }, "@babel/plugin-transform-parameters": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.5.tgz", - "integrity": "sha512-B3O6AL5oPop1jAVg8CV+haeUte9oFuY85zu0jwnRNZZi3tVAbJriu5tag/oaO2kGaQM/7q7aGPBlTI5/sr9enA==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-property-literals": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.5.tgz", - "integrity": "sha512-+IRcVW71VdF9pEH/2R/Apab4a19LVvdVsr/gEeotH00vSDVlKD+XgfSIw+cgGWsjDB/ziqGv/pGoQZBIiQVXHg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-regenerator": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.5.tgz", - "integrity": "sha512-2z+it2eVWU8TtQQRauvGUqZwLy4+7rTfo6wO4npr+fvvN1SW30ZF3O/ZRCNmTuu4F5MIP8OJhXAhRV5QMJOuYg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", "dev": true, "requires": { - "regenerator-transform": "^0.14.2" + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.5.tgz", - "integrity": "sha512-aIB16u8lNcf7drkhXJRoggOxSTUAuihTSTfAcpynowGJOZiGf+Yvi7RuTwFzVYSYPmWyARsPqUGoZWWWxLiknw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-runtime": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz", - "integrity": "sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.6.tgz", + "integrity": "sha512-8uRHk9ZmRSnWqUgyae249EJZ94b0yAGLBIqzZzl+0iEdbno55Pmlt/32JZsHwXD9k/uZj18Aqqk35wBX4CBTXA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.4.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "babel-plugin-polyfill-corejs2": "^0.3.1", + "babel-plugin-polyfill-corejs3": "^0.5.2", + "babel-plugin-polyfill-regenerator": "^0.3.1", "semver": "^6.3.0" }, "dependencies": { - "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -29998,102 +30911,103 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.5.tgz", - "integrity": "sha512-ZbuWVcY+MAXJuuW7qDoCwoxDUNClfZxoo7/4swVbOW1s/qYLOMHlm9YRWMsxMFuLs44eXsv4op1vAaBaBaDMVg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-spread": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.5.tgz", - "integrity": "sha512-5d6l/cnG7Lw4tGHEoga4xSkYp1euP7LAtrah1h1PgJ3JY7yNsjybsxQAnVK4JbtReZ/8z6ASVmd3QhYYKLaKZw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", + "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.5.tgz", - "integrity": "sha512-usYsuO1ID2LXxzuUxifgWtJemP7wL2uZtyrTVM4PKqsmJycdS4U4mGovL5xXkfUheds10Dd2PjoQLXw6zCsCbg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-template-literals": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.5.tgz", - "integrity": "sha512-gnyKy9RyFhkovex4BjKWL3BVYzUDG6zC0gba7VMLbQoDuqMfJ1SDXs8k/XK41Mmt1Hyp4qNAvGFb9hKzdCqBRQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.5.tgz", - "integrity": "sha512-ldxCkW180qbrvyCVDzAUZqB0TAeF8W/vGJoRcaf75awm6By+PxfJKvuqVAnq8N9wz5Xa6mSpM19OfVKKVmGHSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.5.tgz", - "integrity": "sha512-shiCBHTIIChGLdyojsKQjoAyB8MBwat25lKM7MJjbe1hE0bgIppD+LX9afr41lLHOhqceqeWl4FkLp+Bgn9o1Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", + "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.5.tgz", - "integrity": "sha512-GTJ4IW012tiPEMMubd7sD07iU9O/LOo8Q/oU4xNhcaq0Xn8+6TcUQaHtC8YxySo1T+ErQ8RaWogIEeFhKGNPzw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/preset-env": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", - "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-compilation-targets": "^7.16.3", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-async-generator-functions": "^7.16.4", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-class-static-block": "^7.16.0", - "@babel/plugin-proposal-dynamic-import": "^7.16.0", - "@babel/plugin-proposal-export-namespace-from": "^7.16.0", - "@babel/plugin-proposal-json-strings": "^7.16.0", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-object-rest-spread": "^7.16.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-proposal-private-property-in-object": "^7.16.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", + "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-async-generator-functions": "^7.18.6", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.6", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.18.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -30103,44 +31017,44 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.0", - "@babel/plugin-transform-async-to-generator": "^7.16.0", - "@babel/plugin-transform-block-scoped-functions": "^7.16.0", - "@babel/plugin-transform-block-scoping": "^7.16.0", - "@babel/plugin-transform-classes": "^7.16.0", - "@babel/plugin-transform-computed-properties": "^7.16.0", - "@babel/plugin-transform-destructuring": "^7.16.0", - "@babel/plugin-transform-dotall-regex": "^7.16.0", - "@babel/plugin-transform-duplicate-keys": "^7.16.0", - "@babel/plugin-transform-exponentiation-operator": "^7.16.0", - "@babel/plugin-transform-for-of": "^7.16.0", - "@babel/plugin-transform-function-name": "^7.16.0", - "@babel/plugin-transform-literals": "^7.16.0", - "@babel/plugin-transform-member-expression-literals": "^7.16.0", - "@babel/plugin-transform-modules-amd": "^7.16.0", - "@babel/plugin-transform-modules-commonjs": "^7.16.0", - "@babel/plugin-transform-modules-systemjs": "^7.16.0", - "@babel/plugin-transform-modules-umd": "^7.16.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", - "@babel/plugin-transform-new-target": "^7.16.0", - "@babel/plugin-transform-object-super": "^7.16.0", - "@babel/plugin-transform-parameters": "^7.16.3", - "@babel/plugin-transform-property-literals": "^7.16.0", - "@babel/plugin-transform-regenerator": "^7.16.0", - "@babel/plugin-transform-reserved-words": "^7.16.0", - "@babel/plugin-transform-shorthand-properties": "^7.16.0", - "@babel/plugin-transform-spread": "^7.16.0", - "@babel/plugin-transform-sticky-regex": "^7.16.0", - "@babel/plugin-transform-template-literals": "^7.16.0", - "@babel/plugin-transform-typeof-symbol": "^7.16.0", - "@babel/plugin-transform-unicode-escapes": "^7.16.0", - "@babel/plugin-transform-unicode-regex": "^7.16.0", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.18.6", + "@babel/plugin-transform-classes": "^7.18.6", + "@babel/plugin-transform-computed-properties": "^7.18.6", + "@babel/plugin-transform-destructuring": "^7.18.6", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.6", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.6", + "@babel/plugin-transform-function-name": "^7.18.6", + "@babel/plugin-transform-literals": "^7.18.6", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.18.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.6", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.18.6", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.6", + "@babel/plugin-transform-typeof-symbol": "^7.18.6", + "@babel/plugin-transform-unicode-escapes": "^7.18.6", + "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.0", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.4.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.19.1", + "@babel/types": "^7.18.6", + "babel-plugin-polyfill-corejs2": "^0.3.1", + "babel-plugin-polyfill-corejs3": "^0.5.2", + "babel-plugin-polyfill-regenerator": "^0.3.1", + "core-js-compat": "^3.22.1", "semver": "^6.3.0" }, "dependencies": { @@ -30166,106 +31080,63 @@ } }, "@babel/runtime": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", - "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", + "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - } + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" } }, "@babel/traverse": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", - "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.5", - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.5", - "@babel/types": "^7.16.0", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", + "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.9", + "@babel/types": "^7.18.9", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.0" - } - }, "@babel/generator": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", - "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", "dev": true, "requires": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.18.9", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" } }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" } }, "debug": { @@ -30282,31 +31153,17 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "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 } } }, "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - } } }, "@colors/colors": { @@ -30321,18 +31178,143 @@ "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", "dev": true }, + "@csstools/postcss-cascade-layers": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.0.5.tgz", + "integrity": "sha512-Id/9wBT7FkgFzdEpiEWrsVd4ltDxN0rI0QS0SChbeQiSuux3z21SJCRLu6h2cvCEUmaRi+VD0mHFj+GJD4GFnw==", + "dev": true, + "requires": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + } + }, + "@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "dev": true, + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "dev": true, + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "dev": true, + "requires": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + } + }, + "@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "dev": true, + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "dev": true, + "requires": {} + }, + "@csstools/selector-specificity": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", + "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", + "dev": true, + "requires": {} + }, "@discoveryjs/json-ext": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", - "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, "@gar/promisify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", - "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "dev": true }, + "@graphefruit/coffee-bluetooth-devices": { + "version": "file:../../graphefruit-coffee-bluetooth-devices-0.0.14.tgz", + "integrity": "sha512-eePday/7pxBiLbD+RgyvMJaajar8oZSW7Pf+OaRpYmlP3QiHS4z/i3+s7XZ0v9XI7Xnp7mAoNOn9t0ORH+FEiw==", + "requires": { + "tslib": "^2.3.0" + } + }, "@ionic-native/android-permissions": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@ionic-native/android-permissions/-/android-permissions-5.33.1.tgz", @@ -30843,15 +31825,6 @@ } } }, - "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.0" - } - }, "@babel/core": { "version": "7.14.8", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.8.tgz", @@ -30941,94 +31914,6 @@ } } }, - "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", - "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - }, - "dependencies": { - "@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" - } - } - } - }, - "@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - }, - "@babel/helpers": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.5.tgz", - "integrity": "sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==", - "dev": true, - "requires": { - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - }, - "dependencies": { - "@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" - } - } - } - }, - "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.14.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", @@ -31413,46 +32298,12 @@ "uri-js": "^4.2.2" } }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, "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 }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -31778,12 +32629,6 @@ "nan": "^2.12.1" } }, - "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 - }, "glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -32102,21 +32947,6 @@ } } }, - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "requires": { - "mime-db": "1.51.0" - } - }, "mini-css-extract-plugin": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.2.tgz", @@ -32266,23 +33096,6 @@ "readable-stream": "^2.0.2" } }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, "sass": { "version": "1.36.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.36.0.tgz", @@ -32335,12 +33148,6 @@ } } }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -32532,12 +33339,6 @@ "uri-js": "^4.2.2" } }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -33463,12 +34264,75 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@jridgewell/resolve-uri": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-1.0.0.tgz", "integrity": "sha512-9oLAnygRMi8Q5QkYEU4XWK04B+nuoXoxjRvRxgjuChkLZFBja0YPSgdZ7dZtwhncLBcQe/I/E+fLuk5qxcYVJA==", "dev": true }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "dependencies": { + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + } + } + }, "@jsdevtools/coverage-istanbul-loader": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", @@ -33513,6 +34377,12 @@ } } }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, "@netflix/nerror": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@netflix/nerror/-/nerror-1.1.3.tgz", @@ -33533,9 +34403,9 @@ } }, "@ngtools/webpack": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.1.1.tgz", - "integrity": "sha512-TGCuscGFNHPoXScswuj9UxNv8E+A/PXs5XH8cyTtbkmlpBec1EShnaUTdDP5nhykjjaWzd3TLChlp9DinE+Ctg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.1.0.tgz", + "integrity": "sha512-d4U6ymDCXckVgfjYEv1Wjzd78ZSm0NKgq8mN6FdlrCupg02LPIODjeKyNr4c4zwMAOJeHkVNEZ+USoDEK3XSsw==", "dev": true, "requires": {} }, @@ -33596,19 +34466,19 @@ } }, "@npmcli/fs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.0.tgz", - "integrity": "sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.1.tgz", + "integrity": "sha512-1Q0uzx6c/NVNGszePbr5Gc2riSU1zLpNlo/1YWntH+eaPmMgBssAW0qXofCVkpdj3ce4swZtlDYQu+NKiYcptg==", "dev": true, "requires": { - "@gar/promisify": "^1.0.1", + "@gar/promisify": "^1.1.3", "semver": "^7.3.5" }, "dependencies": { "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -33617,21 +34487,28 @@ } }, "@npmcli/git": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", - "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.1.tgz", + "integrity": "sha512-UU85F/T+F1oVn3IsB/L6k9zXIMpXBuUBE25QDH0SsURwT6IOBqkC7M16uqo2vVZIyji3X1K4XH9luip7YekH1A==", "dev": true, "requires": { - "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^6.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", "mkdirp": "^1.0.4", - "npm-pick-manifest": "^6.1.1", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^2.0.2" }, "dependencies": { + "lru-cache": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz", + "integrity": "sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ==", + "dev": true + }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -33639,12 +34516,23 @@ "dev": true }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "which": { @@ -33686,30 +34574,42 @@ } }, "@npmcli/node-gyp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", - "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", + "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", "dev": true }, "@npmcli/promise-spawn": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", - "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", + "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", "dev": true, "requires": { "infer-owner": "^1.0.4" } }, "@npmcli/run-script": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-2.0.0.tgz", - "integrity": "sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.1.7.tgz", + "integrity": "sha512-WXr/MyM4tpKA4BotB81NccGAv8B48lNH0gRoILucbcAhTQXLCoi6HflMV3KdXubIqvP9SuLsFn68Z7r4jl+ppw==", "dev": true, "requires": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^8.2.0", - "read-package-json-fast": "^2.0.1" + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "@schematics/angular": { @@ -33771,21 +34671,6 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true } } }, @@ -33824,6 +34709,25 @@ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -33836,6 +34740,25 @@ "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", "dev": true }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, "@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -33870,9 +34793,9 @@ } }, "@types/eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "dev": true, "requires": { "@types/eslint": "*", @@ -33885,6 +34808,29 @@ "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", "dev": true }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.29", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", + "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, "@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -33896,9 +34842,9 @@ } }, "@types/http-proxy": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", - "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", "dev": true, "requires": { "@types/node": "*" @@ -33940,6 +34886,12 @@ "@types/unist": "*" } }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, "@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", @@ -33976,10 +34928,22 @@ "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", "dev": true }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, "@types/retry": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, "@types/selenium-webdriver": { @@ -33988,6 +34952,34 @@ "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", "dev": true }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/source-list-map": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", @@ -34019,6 +35011,15 @@ } } }, + "@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -34190,9 +35191,9 @@ "dev": true }, "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, "abbrev": { @@ -34202,13 +35203,13 @@ "dev": true }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { @@ -34282,9 +35283,9 @@ } }, "agentkeepalive": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.4.tgz", - "integrity": "sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", "dev": true, "requires": { "debug": "^4.1.0", @@ -34293,9 +35294,9 @@ }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -34479,9 +35480,9 @@ "dev": true }, "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", "dev": true, "requires": { "delegates": "^1.0.0", @@ -34690,35 +35691,26 @@ "dev": true }, "babel-loader": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", - "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", "dev": true, "requires": { "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", + "loader-utils": "^2.0.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "json5": "^2.1.2" } }, "make-dir": { @@ -34761,13 +35753,13 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", - "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", "dev": true, "requires": { "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.0", + "@babel/helper-define-polyfill-provider": "^0.3.1", "semver": "^6.1.1" }, "dependencies": { @@ -34780,22 +35772,22 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", - "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.0", - "core-js-compat": "^3.18.0" + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz", - "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.0" + "@babel/helper-define-polyfill-provider": "^0.3.1" } }, "bail": { @@ -34922,34 +35914,54 @@ } }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dev": true, "requires": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "dependencies": { "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } } } }, @@ -34967,6 +35979,39 @@ "multicast-dns-service-types": "^1.1.0" } }, + "bonjour-service": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz", + "integrity": "sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==", + "dev": true, + "requires": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + }, + "dependencies": { + "dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "dev": true, + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + } + } + }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -35014,30 +36059,15 @@ "dev": true }, "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.2.tgz", + "integrity": "sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - }, - "dependencies": { - "electron-to-chromium": { - "version": "1.4.17", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.17.tgz", - "integrity": "sha512-zhk1MravPtq/KBhmGB7TLBILmXTgRG9TFSI3qS3DbgyfHzIl72iiTE37r/BHIbPCJJlWIo5rySyxiH4vWhu2ZA==", - "dev": true - }, - "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true - } + "caniuse-lite": "^1.0.30001366", + "electron-to-chromium": "^1.4.188", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.4" } }, "browserstack": { @@ -35078,10 +36108,24 @@ "dev": true }, "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", - "dev": true + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "requires": { + "semver": "^7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } }, "bytes": { "version": "3.0.0", @@ -35187,16 +36231,17 @@ } }, "caniuse-lite": { - "version": "1.0.30001286", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz", - "integrity": "sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ==", + "version": "1.0.30001369", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001369.tgz", + "integrity": "sha512-OY1SBHaodJc4wflDIKnlkdqWzJZd1Ls/2zbVJHBSv3AT7vgOJ58yAhd2CN4d57l2kPJrgMb7P9+N1Mhy4tNSQA==", "dev": true }, "canonical-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", - "dev": true + "dev": true, + "peer": true }, "caseless": { "version": "0.12.0", @@ -35443,9 +36488,9 @@ } }, "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { "anymatch": "~3.1.2", @@ -35784,14 +36829,6 @@ "dev": true, "requires": { "mime-db": ">= 1.43.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true - } } }, "compression": { @@ -35835,16 +36872,24 @@ "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, "content-type": { @@ -35863,9 +36908,9 @@ } }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true }, "cookie-signature": { @@ -35895,23 +36940,23 @@ "dev": true }, "copy-webpack-plugin": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.0.0.tgz", - "integrity": "sha512-tuCVuFMBbRsb7IH0q1CUb50/Skv+7a6c7DJ+xi4fAbOzNLTYVMUTPnf8uGvKPtmqTvzYBrfEFo7YgP4TsUWmtg==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, "requires": { - "fast-glob": "^3.2.7", + "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", - "globby": "^12.0.2", + "globby": "^13.1.1", "normalize-path": "^3.0.0", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0" }, "dependencies": { "ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -35938,46 +36983,15 @@ "fast-deep-equal": "^3.1.3" } }, - "array-union": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", - "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", - "dev": true - }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, "globby": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-12.0.2.tgz", - "integrity": "sha512-lAsmb/5Lww4r7MM9nCCliDZVIKbZTavrsunAsHLr9oHthrZP1qi7/gAnHOsUs9bLvEt2vKVJhHmxuL7QbDuPdQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", "dev": true, "requires": { - "array-union": "^3.0.1", "dir-glob": "^3.0.1", - "fast-glob": "^3.2.7", - "ignore": "^5.1.8", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^4.0.0" } @@ -36027,19 +37041,6 @@ "which": "^2.0.2" }, "dependencies": { - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, "fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -36051,15 +37052,6 @@ "universalify": "^2.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" - } - }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -36489,12 +37481,12 @@ "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==" }, "core-js-compat": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.3.tgz", - "integrity": "sha512-59tYzuWgEEVU9r+SRgceIGXSSUn47JknoiXW6Oq7RW8QHjXWz3/vp8pa7dbtuVu40sewz3OP3JmQEcDdztrLhA==", + "version": "3.23.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.5.tgz", + "integrity": "sha512-fHYozIFIxd+91IIbXJgWd/igXIc8Mf9is0fusswjnGIWVG96y2cwyUdlCkGOw6rMLHKAxg7xtCIVaHsyOUnJIg==", "dev": true, "requires": { - "browserslist": "^4.18.1", + "browserslist": "^4.21.2", "semver": "7.0.0" }, "dependencies": { @@ -36544,13 +37536,13 @@ } }, "critters": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.15.tgz", - "integrity": "sha512-AE7hkXb3eZUbEvS1SKZa+OU4o2kUOXtzVeE/2E/mjU/0mV1wpBT1HfUCWVRS4zwvkBNJ0AQYsVjAoFm+kIhfdw==", + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", + "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", "dev": true, "requires": { "chalk": "^4.1.0", - "css-select": "^4.1.3", + "css-select": "^4.2.0", "parse5": "^6.0.1", "parse5-htmlparser2-tree-adapter": "^6.0.1", "postcss": "^8.3.7", @@ -36582,23 +37574,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "postcss": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", - "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", - "dev": true, - "requires": { - "nanoid": "^3.1.30", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" - } - }, - "source-map-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -36743,25 +37718,25 @@ } }, "css-loader": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", - "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", "dev": true, "requires": { "icss-utils": "^5.1.0", - "postcss": "^8.2.15", + "postcss": "^8.4.7", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", + "postcss-value-parser": "^4.2.0", "semver": "^7.3.5" }, "dependencies": { "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -37222,39 +38197,6 @@ "vm2": "^3.9.3" } }, - "del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "dev": true, - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -37263,13 +38205,14 @@ "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true }, "dependency-graph": { "version": "0.11.0", @@ -37278,9 +38221,9 @@ "dev": true }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, "detect-node": { @@ -37411,6 +38354,12 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "electron-to-chromium": { + "version": "1.4.199", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.199.tgz", + "integrity": "sha512-WIGME0Cs7oob3mxsJwHbeWkH0tYkIE/sjkJ8ML2BYmuRcjhRl/q5kVDXG7W9LOOKwzPU5M0LBlXRq9rlSgnNlg==", + "dev": true + }, "elementtree": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", @@ -37562,21 +38511,13 @@ "dev": true }, "enhanced-resolve": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", - "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", "dev": true, "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - } } }, "ent": { @@ -37648,128 +38589,178 @@ "es6-promise": "^4.0.3" } }, + "esbuild": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.49.tgz", + "integrity": "sha512-/TlVHhOaq7Yz8N1OJrjqM3Auzo5wjvHFLk+T8pIue+fhnhIMpfAzsG6PLVMbFveVxqD2WOp3QHei+52IMUNmCw==", + "dev": true, + "optional": true, + "requires": { + "esbuild-android-64": "0.14.49", + "esbuild-android-arm64": "0.14.49", + "esbuild-darwin-64": "0.14.49", + "esbuild-darwin-arm64": "0.14.49", + "esbuild-freebsd-64": "0.14.49", + "esbuild-freebsd-arm64": "0.14.49", + "esbuild-linux-32": "0.14.49", + "esbuild-linux-64": "0.14.49", + "esbuild-linux-arm": "0.14.49", + "esbuild-linux-arm64": "0.14.49", + "esbuild-linux-mips64le": "0.14.49", + "esbuild-linux-ppc64le": "0.14.49", + "esbuild-linux-riscv64": "0.14.49", + "esbuild-linux-s390x": "0.14.49", + "esbuild-netbsd-64": "0.14.49", + "esbuild-openbsd-64": "0.14.49", + "esbuild-sunos-64": "0.14.49", + "esbuild-windows-32": "0.14.49", + "esbuild-windows-64": "0.14.49", + "esbuild-windows-arm64": "0.14.49" + } + }, + "esbuild-android-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.49.tgz", + "integrity": "sha512-vYsdOTD+yi+kquhBiFWl3tyxnj2qZJsl4tAqwhT90ktUdnyTizgle7TjNx6Ar1bN7wcwWqZ9QInfdk2WVagSww==", + "dev": true, + "optional": true + }, "esbuild-android-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.2.tgz", - "integrity": "sha512-hEixaKMN3XXCkoe+0WcexO4CcBVU5DCSUT+7P8JZiWZCbAjSkc9b6Yz2X5DSfQmRCtI/cQRU6TfMYrMQ5NBfdw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.49.tgz", + "integrity": "sha512-g2HGr/hjOXCgSsvQZ1nK4nW/ei8JUx04Li74qub9qWrStlysaVmadRyTVuW32FGIpLQyc5sUjjZopj49eGGM2g==", "dev": true, "optional": true }, "esbuild-darwin-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.2.tgz", - "integrity": "sha512-Uq8t0cbJQkxkQdbUfOl2wZqZ/AtLZjvJulR1HHnc96UgyzG9YlCLSDMiqjM+NANEy7/zzvwKJsy3iNC9wwqLJA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.49.tgz", + "integrity": "sha512-3rvqnBCtX9ywso5fCHixt2GBCUsogNp9DjGmvbBohh31Ces34BVzFltMSxJpacNki96+WIcX5s/vum+ckXiLYg==", "dev": true, "optional": true }, "esbuild-darwin-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.2.tgz", - "integrity": "sha512-619MSa17sr7YCIrUj88KzQu2ESA4jKYtIYfLU/smX6qNgxQt3Y/gzM4s6sgJ4fPQzirvmXgcHv1ZNQAs/Xh48A==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.49.tgz", + "integrity": "sha512-XMaqDxO846srnGlUSJnwbijV29MTKUATmOLyQSfswbK/2X5Uv28M9tTLUJcKKxzoo9lnkYPsx2o8EJcTYwCs/A==", "dev": true, "optional": true }, "esbuild-freebsd-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.2.tgz", - "integrity": "sha512-aP6FE/ZsChZpUV6F3HE3x1Pz0paoYXycJ7oLt06g0G9dhJKknPawXCqQg/WMyD+ldCEZfo7F1kavenPdIT/SGQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.49.tgz", + "integrity": "sha512-NJ5Q6AjV879mOHFri+5lZLTp5XsO2hQ+KSJYLbfY9DgCu8s6/Zl2prWXVANYTeCDLlrIlNNYw8y34xqyLDKOmQ==", "dev": true, "optional": true }, "esbuild-freebsd-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.2.tgz", - "integrity": "sha512-LSm98WTb1QIhyS83+Po0KTpZNdd2XpVpI9ua5rLWqKWbKeNRFwOsjeiuwBaRNc+O32s9oC2ZMefETxHBV6VNkQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.49.tgz", + "integrity": "sha512-lFLtgXnAc3eXYqj5koPlBZvEbBSOSUbWO3gyY/0+4lBdRqELyz4bAuamHvmvHW5swJYL7kngzIZw6kdu25KGOA==", "dev": true, "optional": true }, "esbuild-linux-32": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.2.tgz", - "integrity": "sha512-8VxnNEyeUbiGflTKcuVc5JEPTqXfsx2O6ABwUbfS1Hp26lYPRPC7pKQK5Dxa0MBejGc50jy7YZae3EGQUQ8EkQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.49.tgz", + "integrity": "sha512-zTTH4gr2Kb8u4QcOpTDVn7Z8q7QEIvFl/+vHrI3cF6XOJS7iEI1FWslTo3uofB2+mn6sIJEQD9PrNZKoAAMDiA==", "dev": true, "optional": true }, "esbuild-linux-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.2.tgz", - "integrity": "sha512-4bzMS2dNxOJoFIiHId4w+tqQzdnsch71JJV1qZnbnErSFWcR9lRgpSqWnTTFtv6XM+MvltRzSXC5wQ7AEBY6Hg==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.49.tgz", + "integrity": "sha512-hYmzRIDzFfLrB5c1SknkxzM8LdEUOusp6M2TnuQZJLRtxTgyPnZZVtyMeCLki0wKgYPXkFsAVhi8vzo2mBNeTg==", "dev": true, "optional": true }, "esbuild-linux-arm": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.2.tgz", - "integrity": "sha512-PaylahvMHhH8YMfJPMKEqi64qA0Su+d4FNfHKvlKes/2dUe4QxgbwXT9oLVgy8iJdcFMrO7By4R8fS8S0p8aVQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.49.tgz", + "integrity": "sha512-iE3e+ZVv1Qz1Sy0gifIsarJMQ89Rpm9mtLSRtG3AH0FPgAzQ5Z5oU6vYzhc/3gSPi2UxdCOfRhw2onXuFw/0lg==", "dev": true, "optional": true }, "esbuild-linux-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.2.tgz", - "integrity": "sha512-RlIVp0RwJrdtasDF1vTFueLYZ8WuFzxoQ1OoRFZOTyJHCGCNgh7xJIC34gd7B7+RT0CzLBB4LcM5n0LS+hIoww==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.49.tgz", + "integrity": "sha512-KLQ+WpeuY+7bxukxLz5VgkAAVQxUv67Ft4DmHIPIW+2w3ObBPQhqNoeQUHxopoW/aiOn3m99NSmSV+bs4BSsdA==", "dev": true, "optional": true }, "esbuild-linux-mips64le": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.2.tgz", - "integrity": "sha512-Fdwrq2roFnO5oetIiUQQueZ3+5soCxBSJswg3MvYaXDomj47BN6oAWMZgLrFh1oVrtWrxSDLCJBenYdbm2s+qQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.49.tgz", + "integrity": "sha512-n+rGODfm8RSum5pFIqFQVQpYBw+AztL8s6o9kfx7tjfK0yIGF6tm5HlG6aRjodiiKkH2xAiIM+U4xtQVZYU4rA==", "dev": true, "optional": true }, "esbuild-linux-ppc64le": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.2.tgz", - "integrity": "sha512-vxptskw8JfCDD9QqpRO0XnsM1osuWeRjPaXX1TwdveLogYsbdFtcuiuK/4FxGiNMUr1ojtnCS2rMPbY8puc5NA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.49.tgz", + "integrity": "sha512-WP9zR4HX6iCBmMFH+XHHng2LmdoIeUmBpL4aL2TR8ruzXyT4dWrJ5BSbT8iNo6THN8lod6GOmYDLq/dgZLalGw==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.49.tgz", + "integrity": "sha512-h66ORBz+Dg+1KgLvzTVQEA1LX4XBd1SK0Fgbhhw4akpG/YkN8pS6OzYI/7SGENiN6ao5hETRDSkVcvU9NRtkMQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.49.tgz", + "integrity": "sha512-DhrUoFVWD+XmKO1y7e4kNCqQHPs6twz6VV6Uezl/XHYGzM60rBewBF5jlZjG0nCk5W/Xy6y1xWeopkrhFFM0sQ==", "dev": true, "optional": true }, "esbuild-netbsd-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.2.tgz", - "integrity": "sha512-I8+LzYK5iSNpspS9eCV9sW67Rj8FgMHimGri4mKiGAmN0pNfx+hFX146rYtzGtewuxKtTsPywWteHx+hPRLDsw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.49.tgz", + "integrity": "sha512-BXaUwFOfCy2T+hABtiPUIpWjAeWK9P8O41gR4Pg73hpzoygVGnj0nI3YK4SJhe52ELgtdgWP/ckIkbn2XaTxjQ==", "dev": true, "optional": true }, "esbuild-openbsd-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.2.tgz", - "integrity": "sha512-120HgMe9elidWUvM2E6mMf0csrGwx8sYDqUIJugyMy1oHm+/nT08bTAVXuwYG/rkMIqsEO9AlMxuYnwR6En/3Q==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.49.tgz", + "integrity": "sha512-lP06UQeLDGmVPw9Rg437Btu6J9/BmyhdoefnQ4gDEJTtJvKtQaUcOQrhjTq455ouZN4EHFH1h28WOJVANK41kA==", "dev": true, "optional": true }, "esbuild-sunos-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.2.tgz", - "integrity": "sha512-Q3xcf9Uyfra9UuCFxoLixVvdigo0daZaKJ97TL2KNA4bxRUPK18wwGUk3AxvgDQZpRmg82w9PnkaNYo7a+24ow==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.49.tgz", + "integrity": "sha512-4c8Zowp+V3zIWje329BeLbGh6XI9c/rqARNaj5yPHdC61pHI9UNdDxT3rePPJeWcEZVKjkiAS6AP6kiITp7FSw==", "dev": true, "optional": true }, "esbuild-wasm": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.2.tgz", - "integrity": "sha512-Rs8NjWoo1UdsVjhxT2o6kLCX9Sh65pyd3/h4XeJ3jjQNM6NgL+/CSowuJgvOIjDAXMLXpc6fdGnyZQDil9IUJA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.49.tgz", + "integrity": "sha512-5ddzZv8M3WI1fWZ5rEfK5cSA9swlWJcceKgqjKLLERC7FnlNW50kF7hxhpkyC0Z/4w7Xeyt3yUJ9QWNMDXLk2Q==", "dev": true }, "esbuild-windows-32": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.2.tgz", - "integrity": "sha512-TW7O49tPsrq+N1sW8mb3m24j/iDGa4xzAZH4wHWwoIzgtZAYPKC0hpIhufRRG/LA30bdMChO9pjJZ5mtcybtBQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.49.tgz", + "integrity": "sha512-q7Rb+J9yHTeKr9QTPDYkqfkEj8/kcKz9lOabDuvEXpXuIcosWCJgo5Z7h/L4r7rbtTH4a8U2FGKb6s1eeOHmJA==", "dev": true, "optional": true }, "esbuild-windows-64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.2.tgz", - "integrity": "sha512-Rym6ViMNmi1E2QuQMWy0AFAfdY0wGwZD73BnzlsQBX5hZBuy/L+Speh7ucUZ16gwsrMM9v86icZUDrSN/lNBKg==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.49.tgz", + "integrity": "sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==", "dev": true, "optional": true }, "esbuild-windows-arm64": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.2.tgz", - "integrity": "sha512-ZrLbhr0vX5Em/P1faMnHucjVVWPS+m3tktAtz93WkMZLmbRJevhiW1y4CbulBd2z0MEdXZ6emDa1zFHq5O5bSA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.49.tgz", + "integrity": "sha512-v+HYNAXzuANrCbbLFJ5nmO3m5y2PGZWLe3uloAkLt87aXiO2mZr3BTmacZdjwNkNEHuH3bNtN8cak+mzVjVPfA==", "dev": true, "optional": true }, @@ -37855,7 +38846,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true }, "eventemitter-asyncresource": { @@ -38035,38 +39026,39 @@ } }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", "dev": true, "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", "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", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -38078,10 +39070,55 @@ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true } } @@ -38167,17 +39204,16 @@ "dev": true }, "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" }, "dependencies": { "glob-parent": { @@ -38401,6 +39437,12 @@ "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==" }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -38413,7 +39455,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, "fs-extra": { @@ -38500,20 +39542,19 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "gauge": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.0.tgz", - "integrity": "sha512-F8sU45yQpjQjxKkm1UOAhf0U/O0aFt//Fl7hsrNVto+patMHjs7dPI9mFOGUKbhrgKm0S3EjW3scMFuQmWSROw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "dev": true, "requires": { - "ansi-regex": "^5.0.1", "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", "has-unicode": "^2.0.1", - "signal-exit": "^3.0.0", + "signal-exit": "^3.0.7", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" + "wide-align": "^1.1.5" }, "dependencies": { "ansi-regex": { @@ -38534,9 +39575,9 @@ } }, "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "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": { @@ -38724,9 +39765,9 @@ } }, "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==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "hammerjs": { "version": "2.0.8", @@ -38809,7 +39850,7 @@ "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, "has-value": { @@ -38924,9 +39965,9 @@ } }, "html-entities": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", - "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true }, "html-escaper": { @@ -38981,21 +40022,26 @@ "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" } } }, @@ -39050,12 +40096,12 @@ } }, "http-proxy-middleware": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", - "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, "requires": { - "@types/http-proxy": "^1.17.5", + "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", @@ -39116,7 +40162,7 @@ "humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "requires": { "ms": "^2.0.0" @@ -39150,18 +40196,38 @@ "dev": true }, "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "ignore-walk": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz", - "integrity": "sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", + "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", "dev": true, "requires": { - "minimatch": "^3.0.4" + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "image-size": { @@ -39177,9 +40243,9 @@ "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" }, "immutable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", - "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", "dev": true }, "import-fresh": { @@ -39612,9 +40678,9 @@ "dev": true }, "is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, "requires": { "has": "^1.0.3" @@ -39704,7 +40770,7 @@ "is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true }, "is-number": { @@ -39865,149 +40931,17 @@ "semver": "^6.3.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.0" - } - }, - "@babel/core": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.5.tgz", - "integrity": "sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.5", - "@babel/helper-compilation-targets": "^7.16.3", - "@babel/helper-module-transforms": "^7.16.5", - "@babel/helpers": "^7.16.5", - "@babel/parser": "^7.16.5", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", - "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", - "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - }, - "@babel/helpers": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.5.tgz", - "integrity": "sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==", - "dev": true, - "requires": { - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" - } - }, - "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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 - }, "istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, - "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 - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "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 } } }, @@ -40232,13 +41166,10 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true }, "jsonc-parser": { "version": "3.0.0", @@ -40256,7 +41187,7 @@ "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true }, "jsprim": { @@ -40353,12 +41284,6 @@ "path-is-absolute": "^1.0.0" } }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, "mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", @@ -40508,9 +41433,9 @@ } }, "less": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz", - "integrity": "sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "dev": true, "requires": { "copy-anything": "^2.0.1", @@ -40519,12 +41444,51 @@ "image-size": "~0.5.0", "make-dir": "^2.1.0", "mime": "^1.4.1", - "needle": "^2.5.2", + "needle": "^3.1.0", "parse-node-version": "^1.0.1", "source-map": "~0.6.0", "tslib": "^2.3.0" }, "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "optional": true + }, + "needle": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.1.0.tgz", + "integrity": "sha512-gCE9weDhjVGCRqS8dwDR/D3GTAeyXLXuqp7I8EzH6DllZGXSUyxuqqLh+YX9rMAWaaTFyVAg6rHGL25dqvczKw==", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -40535,9 +41499,9 @@ } }, "less-loader": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.2.0.tgz", - "integrity": "sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.0.0.tgz", + "integrity": "sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw==", "dev": true, "requires": { "klona": "^2.0.4" @@ -40553,18 +41517,18 @@ } }, "license-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-b9iMrROrw2fTOJBZ57h0xJfT5/1Cxg4ucYbtpWoukv4Awb2TFPfDDFVHNM8w6SYQpVfB13a5tQJxgGamqwrsyw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", "dev": true, "requires": { "webpack-sources": "^3.0.0" }, "dependencies": { "webpack-sources": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz", - "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true } } @@ -41081,29 +42045,45 @@ "dev": true }, "make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.0.tgz", + "integrity": "sha512-OnEfCLofQVJ5zgKwGk55GaqosqKjaR6khQlJY3dBAA+hM25Bc5CmX5rKUfVut+rYA3uidA7zb7AvcglU87rPRg==", "dev": true, "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", + "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", + "minipass-fetch": "^2.0.3", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", + "negotiator": "^0.6.3", "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" }, "dependencies": { + "@npmcli/move-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.0.tgz", + "integrity": "sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -41113,59 +42093,173 @@ "debug": "4" } }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "cacache": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.1.tgz", + "integrity": "sha512-VDKN+LHyCQXaaYZ7rA/qtkURU+/yYhviUdvqEv2LT6QPZU8jpyzEkEVAcKlKLt5dJ5BRp11ym8lo3NKLluEPLg==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" + } + }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" } }, - "https-proxy-agent": { + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "http-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "requires": { + "@tootallnate/once": "2", "agent-base": "6", "debug": "4" } }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "requires": { - "minipass": "^3.0.0" + "agent-base": "6", + "debug": "4" } }, + "lru-cache": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz", + "integrity": "sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ==", + "dev": true + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, "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 }, - "socks": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz", - "integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==", + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" + "glob": "^7.1.3" + }, + "dependencies": { + "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" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, "requires": { "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "requires": { + "minipass": "^3.1.1" } } } @@ -41270,12 +42364,12 @@ } }, "memfs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.0.tgz", - "integrity": "sha512-o/RfP0J1d03YwsAxyHxAYs2kyJp55AFkMazlFAZFR2I2IXkxiUTXRabJ6RmNNCQ83LAD2jy52Khj0m3OffpNdA==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", "dev": true, "requires": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.3" } }, "memory-fs": { @@ -41420,16 +42514,16 @@ "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==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.40.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -41444,18 +42538,18 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.5.tgz", - "integrity": "sha512-oEIhRucyn1JbT/1tU2BhnwO6ft1jjH1iCX9Gc59WFMg0n5773rQU0oyQ0zzeYFFuBfONaRbQJyGoPtuNseMxjA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", + "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", "dev": true, "requires": { "schema-utils": "^4.0.0" }, "dependencies": { "ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -41539,9 +42633,9 @@ } }, "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", "requires": { "yallist": "^4.0.0" } @@ -41556,15 +42650,15 @@ } }, "minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.0.tgz", + "integrity": "sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==", "dev": true, "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", + "encoding": "^0.1.13", + "minipass": "^3.1.6", "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" + "minizlib": "^2.1.2" } }, "minipass-flush": { @@ -41587,9 +42681,9 @@ } }, "minipass-pipeline": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz", - "integrity": "sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, "requires": { "minipass": "^3.0.0" @@ -41732,9 +42826,9 @@ } }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true }, "neo-async": { @@ -41794,15 +42888,15 @@ "dev": true }, "node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.1.0.tgz", + "integrity": "sha512-HkmN0ZpQJU7FLbJauJTHkHlSVAXlNGDAzH/VYFZGDOnFyn/Na3GlNJfkudmufOdS6/jNFhy88ObzL7ERz9es1g==", "dev": true, "requires": { "env-paths": "^2.2.0", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", + "make-fetch-happen": "^10.0.3", "nopt": "^5.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", @@ -41811,12 +42905,6 @@ "which": "^2.0.2" }, "dependencies": { - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, "nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -41836,9 +42924,9 @@ } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -41862,6 +42950,12 @@ "dev": true, "optional": true }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, "node-version-compare": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/node-version-compare/-/node-version-compare-1.0.3.tgz", @@ -41932,18 +43026,18 @@ } }, "npm-install-checks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", - "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", + "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", "dev": true, "requires": { "semver": "^7.1.1" }, "dependencies": { "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -41958,20 +43052,38 @@ "dev": true }, "npm-package-arg": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", - "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", + "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", "dev": true, "requires": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" }, "dependencies": { + "hosted-git-info": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", + "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + }, + "dependencies": { + "lru-cache": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz", + "integrity": "sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ==", + "dev": true + } + } + }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -41980,33 +43092,66 @@ } }, "npm-packlist": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz", - "integrity": "sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.1.tgz", + "integrity": "sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==", "dev": true, "requires": { - "glob": "^7.1.6", - "ignore-walk": "^4.0.1", - "npm-bundled": "^1.1.1", + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^1.1.2", "npm-normalize-package-bin": "^1.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "npm-pick-manifest": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", - "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz", + "integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==", "dev": true, "requires": { - "npm-install-checks": "^4.0.0", + "npm-install-checks": "^5.0.0", "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" }, "dependencies": { "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -42015,17 +43160,18 @@ } }, "npm-registry-fetch": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", - "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.0.tgz", + "integrity": "sha512-10LJQ/1+VhKrZjIuY9I/+gQTvumqqlgnsCufoXETHAPFTS3+M+Z5CFhZRDHGavmJ6rOye3UvNga88vl8n1r6gg==", "dev": true, "requires": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" } }, "npm-run-path": { @@ -42037,14 +43183,14 @@ } }, "npmlog": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.0.tgz", - "integrity": "sha512-03ppFRGlsyUaQFbGC2C8QWJN/C/K7PsfyD9aQdhVKAQIH4sQBc8WASqFBP7O+Ut4d2oo5LoeoboB3cGdBZSp6Q==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "dev": true, "requires": { - "are-we-there-yet": "^2.0.0", + "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", - "gauge": "^4.0.0", + "gauge": "^4.0.3", "set-blocking": "^2.0.0" } }, @@ -42430,12 +43576,12 @@ } }, "p-retry": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", - "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, "requires": { - "@types/retry": "^0.12.0", + "@types/retry": "0.12.0", "retry": "^0.13.1" }, "dependencies": { @@ -42512,32 +43658,109 @@ } }, "pacote": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.2.tgz", - "integrity": "sha512-Ar3mhjcxhMzk+OVZ8pbnXdb0l8+pimvlsqBGRNkble2NVgyqOGE3yrCGi/lAYq7E7NRDMz89R1Wx5HIMCGgeYg==", + "version": "13.6.1", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.1.tgz", + "integrity": "sha512-L+2BI1ougAPsFjXRyBhcKmfT016NscRFLv6Pz5EiNf1CCFJFU0pSKKQwsZTyAQB+sTuUL4TyFyp6J1Ork3dOqw==", "dev": true, "requires": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^2.0.0", - "cacache": "^15.0.5", + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^3.0.0", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" + "ssri": "^9.0.0", + "tar": "^6.1.11" }, "dependencies": { + "@npmcli/move-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.0.tgz", + "integrity": "sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "cacache": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.1.tgz", + "integrity": "sha512-VDKN+LHyCQXaaYZ7rA/qtkURU+/yYhviUdvqEv2LT6QPZU8jpyzEkEVAcKlKLt5dJ5BRp11ym8lo3NKLluEPLg==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + } + } + }, + "lru-cache": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz", + "integrity": "sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ==", + "dev": true + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -42552,6 +43775,15 @@ "requires": { "glob": "^7.1.3" } + }, + "ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } } } }, @@ -42711,8 +43943,7 @@ "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "picomatch": { "version": "2.3.1", @@ -42812,19 +44043,19 @@ "dev": true }, "postcss": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", - "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", "requires": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map-js": "^0.6.2" + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "dependencies": { - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" } } }, @@ -42872,6 +44103,15 @@ "postcss-value-parser": "^4.0.2" } }, + "postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, "postcss-color-functional-notation": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", @@ -43613,20 +44853,20 @@ } }, "postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", + "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", "dev": true, "requires": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", - "semver": "^7.3.5" + "semver": "^7.3.7" }, "dependencies": { "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -43924,6 +45164,12 @@ "postcss-value-parser": "^4.1.0" } }, + "postcss-opacity-percentage": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", + "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", + "dev": true + }, "postcss-ordered-values": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz", @@ -44367,9 +45613,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.7.tgz", - "integrity": "sha512-U+b/Deoi4I/UmE6KOVPpnhS7I7AYdKbhGcat+qTQ27gycvaACvNEw11ba6RrkwVmDVRW7sigWgLj4/KbbJjeDA==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -44404,9 +45650,9 @@ } }, "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, "postcss-values-parser": { @@ -44442,6 +45688,12 @@ "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" }, + "proc-log": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "dev": true + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -44871,20 +46123,20 @@ "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==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, "dependencies": { "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" } } }, @@ -44915,6 +46167,89 @@ "with-open-file": "^0.1.6" } }, + "read-package-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.1.tgz", + "integrity": "sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg==", + "dev": true, + "requires": { + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "hosted-git-info": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", + "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + }, + "dependencies": { + "lru-cache": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz", + "integrity": "sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ==", + "dev": true + } + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "normalize-package-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.0.tgz", + "integrity": "sha512-m+GL22VXJKkKbw62ZaBBjv8u6IE3UI4Mh5QakIqs3fWiKe0Xyi6L97hakwZK41/LD4R/2ly71Bayx0NLMwLA/g==", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "read-package-json-fast": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", @@ -45028,9 +46363,9 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", - "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", "dev": true, "requires": { "regenerate": "^1.4.2" @@ -45043,9 +46378,9 @@ "dev": true }, "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" @@ -45078,29 +46413,29 @@ } }, "regexpu-core": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", - "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", + "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", "dev": true, "requires": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^9.0.0", - "regjsgen": "^0.5.2", - "regjsparser": "^0.7.0", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.0.0" } }, "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", "dev": true }, "regjsparser": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", - "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -45109,7 +46444,7 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true } } @@ -45214,12 +46549,14 @@ "dev": true }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "requires": { - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-cwd": { @@ -45358,9 +46695,9 @@ "dev": true }, "rxjs": { - "version": "6.6.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.6.tgz", - "integrity": "sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "requires": { "tslib": "^1.9.0" }, @@ -45392,19 +46729,20 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.44.0.tgz", - "integrity": "sha512-0hLREbHFXGQqls/K8X+koeP+ogFRPF4ZqetVB19b7Cst9Er8cOR0rc6RU7MaI4W1JmUShd1BPgPoeqmmgMMYFw==", + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz", + "integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0" + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" } }, "sass-loader": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", - "integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", + "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", "dev": true, "requires": { "klona": "^2.0.4", @@ -45495,30 +46833,51 @@ "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true } } @@ -45574,15 +46933,15 @@ } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" } }, "set-blocking": { @@ -45627,9 +46986,9 @@ } }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "shallow-clone": { "version": "3.0.1", @@ -45732,9 +47091,9 @@ } }, "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, "snapdragon": { "version": "0.8.2", @@ -46011,12 +47370,19 @@ } }, "socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", + "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", "requires": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "dependencies": { + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + } } }, "socks-proxy-agent": { @@ -46067,7 +47433,8 @@ "source-map-js": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "dev": true }, "source-map-loader": { "version": "3.0.0", @@ -46126,9 +47493,9 @@ "dev": true }, "sourcemap-codec": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", - "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, "spdx-correct": { @@ -46402,7 +47769,8 @@ "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true }, "stream-buffers": { "version": "2.2.0", @@ -46739,77 +48107,44 @@ } }, "stylus": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.55.0.tgz", - "integrity": "sha512-MuzIIVRSbc8XxHH7FjkvWqkIcr1BvoMZoR/oFuAJDlh7VSaNJzrB4uJ38GRQa+mWjLXODAMzeDe0xi9GYbGwnw==", + "version": "0.58.1", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.58.1.tgz", + "integrity": "sha512-AYiCHm5ogczdCPMfe9aeQa4NklB2gcf4D/IhzYPddJjTgPc+k4D/EVE0yfQbZD43MHP3lPy+8NZ9fcFxkrgs/w==", "dev": true, "requires": { "css": "^3.0.0", - "debug": "~3.1.0", + "debug": "^4.3.2", "glob": "^7.1.6", - "mkdirp": "~1.0.4", - "safer-buffer": "^2.1.2", "sax": "~1.2.4", - "semver": "^6.3.0", "source-map": "^0.7.3" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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 } } }, "stylus-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.2.0.tgz", - "integrity": "sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.0.0.tgz", + "integrity": "sha512-WTbtLrNfOfLgzTaR9Lj/BPhQroKk/LC1hfTXSUbrxmxgfUo3Y3LpmKRVA2R1XbjvTAvOfaian9vOyfv1z99E+A==", "dev": true, "requires": { - "fast-glob": "^3.2.7", - "klona": "^2.0.4", + "fast-glob": "^3.2.11", + "klona": "^2.0.5", "normalize-path": "^3.0.0" - }, - "dependencies": { - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } } }, "sugarss": { @@ -46947,6 +48282,12 @@ "has-flag": "^3.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, "svg-tags": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", @@ -47047,13 +48388,14 @@ } }, "terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dev": true, "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "dependencies": { @@ -47211,9 +48553,9 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "tough-cookie": { "version": "2.5.0", @@ -47346,9 +48688,9 @@ } }, "typed-assert": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.8.tgz", - "integrity": "sha512-5NkbXZUlmCE73Fs7gvkp1XXJWHYetPkg60QnQ2NXQmBYNFxbBr2zA8GCtaH4K2s2WhOmSlgiSTmrjrcm5tnM5g==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", "dev": true }, "typedarray-to-buffer": { @@ -47360,9 +48702,9 @@ } }, "typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true }, "ua-parser-js": { @@ -47568,6 +48910,16 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, + "update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -47650,12 +49002,12 @@ } }, "validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, "requires": { - "builtins": "^1.0.3" + "builtins": "^5.0.0" } }, "vary": { @@ -47759,13 +49111,13 @@ } }, "webpack": { - "version": "5.65.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.65.0.tgz", - "integrity": "sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw==", + "version": "5.73.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", + "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", "dev": true, "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", @@ -47773,13 +49125,13 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.3", + "enhanced-resolve": "^5.9.3", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", - "json-parse-better-errors": "^1.0.2", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", @@ -47787,9 +49139,15 @@ "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.3.1", - "webpack-sources": "^3.2.2" + "webpack-sources": "^3.2.3" }, "dependencies": { + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -47802,27 +49160,6 @@ "uri-js": "^4.2.2" } }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "requires": { - "mime-db": "1.51.0" - } - }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -47835,30 +49172,30 @@ } }, "webpack-sources": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz", - "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true } } }, "webpack-dev-middleware": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.2.2.tgz", - "integrity": "sha512-DjZyYrsHhkikAFNvSNKrpnziXukU1EChFAh9j4LAm6ndPLPW8cN0KhM7T+RAiOqsQ6ABfQ8hoKIs9IWMTjov+w==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "dev": true, "requires": { "colorette": "^2.0.10", - "memfs": "^3.2.2", + "memfs": "^3.4.3", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "dependencies": { "ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -47891,21 +49228,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "requires": { - "mime-db": "1.51.0" - } - }, "schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -47921,42 +49243,46 @@ } }, "webpack-dev-server": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.6.0.tgz", - "integrity": "sha512-oojcBIKvx3Ya7qs1/AVWHDgmP1Xml8rGsEBnSobxU/UJSX1xP1GPM3MwsAnDzvqcVmVki8tV7lbcsjEjk0PtYg==", - "dev": true, - "requires": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.3.tgz", + "integrity": "sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw==", + "dev": true, + "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^3.5.2", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", + "connect-history-api-fallback": "^2.0.0", "default-gateway": "^6.0.3", - "del": "^6.0.0", - "express": "^4.17.1", + "express": "^4.17.3", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", + "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", "open": "^8.0.9", "p-retry": "^4.5.0", - "portfinder": "^1.0.28", + "rimraf": "^3.0.2", "schema-utils": "^4.0.0", - "selfsigned": "^1.10.11", + "selfsigned": "^2.0.1", "serve-index": "^1.9.1", - "sockjs": "^0.3.21", + "sockjs": "^0.3.24", "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^5.2.1", - "ws": "^8.1.0" + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" }, "dependencies": { "ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -47983,16 +49309,10 @@ "fast-deep-equal": "^3.1.3" } }, - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true }, "json-schema-traverse": { @@ -48001,6 +49321,21 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -48013,13 +49348,13 @@ "ajv-keywords": "^5.0.0" } }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "selfsigned": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", "dev": true, "requires": { - "ansi-regex": "^6.0.1" + "node-forge": "^1" } } } @@ -48236,9 +49571,9 @@ } }, "ws": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz", - "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index 7581620da..b89444003 100644 --- a/package.json +++ b/package.json @@ -16,12 +16,13 @@ }, "private": true, "dependencies": { - "@angular/common": "^13.1.0", - "@angular/core": "^13.1.0", - "@angular/forms": "^13.1.0", - "@angular/platform-browser": "^13.1.0", - "@angular/platform-browser-dynamic": "^13.1.0", - "@angular/router": "^13.1.0", + "@angular/common": "^14.1.0", + "@angular/core": "^14.1.0", + "@angular/forms": "^14.1.0", + "@angular/platform-browser": "^14.1.0", + "@angular/platform-browser-dynamic": "^14.1.0", + "@angular/router": "^14.1.0", + "@graphefruit/coffee-bluetooth-devices": "file:../../graphefruit-coffee-bluetooth-devices-0.0.14.tgz", "@ionic-native/android-permissions": "^5.33.1", "@ionic-native/app-minimize": "^5.33.1", "@ionic-native/app-version": "^5.33.1", @@ -84,14 +85,14 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@angular-devkit/architect": "^0.1301.0", - "@angular-devkit/build-angular": "^13.1.1", - "@angular-devkit/core": "^13.1.0", - "@angular-devkit/schematics": "^13.1.0", - "@angular/cli": "^13.1.0", - "@angular/compiler": "^13.1.0", - "@angular/compiler-cli": "^13.1.0", - "@angular/language-service": "^13.1.0", + "@angular-devkit/architect": "^0.1401.0", + "@angular-devkit/build-angular": "^14.1.0", + "@angular-devkit/core": "^14.1.0", + "@angular-devkit/schematics": "^14.1.0", + "@angular/cli": "^14.1.0", + "@angular/compiler": "^14.1.0", + "@angular/compiler-cli": "^14.1.0", + "@angular/language-service": "^14.1.0", "@ionic/angular-toolkit": "^5.0.3", "@types/cordova-plugin-ble-central": "^1.3.1", "@types/jasmine": "~3.6.0", @@ -143,7 +144,7 @@ "stylelint-config-standard": "^20.0.0", "ts-node": "~8.3.0", "tslint": "~6.1.0", - "typescript": "~4.5.4", + "typescript": "~4.7.4", "webpack-subresource-integrity": "^1.5.2" }, "description": "Beanconqueror", diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 56da5f0c0..3aaa22f83 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -1,6 +1,6 @@ -import {NgModule} from '@angular/core'; -import {PreloadAllModules, RouterModule, Routes} from '@angular/router'; -import {RouteResolver} from './app-routing-resolver'; +import { NgModule } from '@angular/core'; +import { PreloadAllModules, RouterModule, Routes } from '@angular/router'; +import { RouteResolver } from './app-routing-resolver'; const routes: Routes = [ { @@ -8,86 +8,127 @@ const routes: Routes = [ redirectTo: '/home/dashboard', pathMatch: 'full', resolve: { - resolver: RouteResolver + resolver: RouteResolver, }, }, { - path: 'home', resolve: { - resolver: RouteResolver + path: 'home', + resolve: { + resolver: RouteResolver, }, - loadChildren: () => import('./home/home.module').then(m => m.HomePageModule), + loadChildren: () => + import('./home/home.module').then((m) => m.HomePageModule), }, { - path: 'roasting-section', resolve: { - resolver: RouteResolver + path: 'roasting-section', + resolve: { + resolver: RouteResolver, }, - loadChildren: () => import('./roasting-section/roasting-section.module').then(m => m.RoastingSectionPageModule) + loadChildren: () => + import('./roasting-section/roasting-section.module').then( + (m) => m.RoastingSectionPageModule + ), }, { - path: 'water-section', resolve: { - resolver: RouteResolver + path: 'water-section', + resolve: { + resolver: RouteResolver, }, - loadChildren: () => import('./water-section/water-section.module').then(m => m.WaterSectionPageModule) + loadChildren: () => + import('./water-section/water-section.module').then( + (m) => m.WaterSectionPageModule + ), }, { - path: 'info', resolve: { - resolver: RouteResolver + path: 'info', + resolve: { + resolver: RouteResolver, }, - loadChildren: () => import('./info/info.module').then(m => m.InfoModule), + loadChildren: () => import('./info/info.module').then((m) => m.InfoModule), }, { - path: 'settings', resolve: { - resolver: RouteResolver - }, loadChildren: () => import('./settings/settings.module').then(m => m.SettingsPageModule), pathMatch: 'full' + path: 'settings', + resolve: { + resolver: RouteResolver, + }, + loadChildren: () => + import('./settings/settings.module').then((m) => m.SettingsPageModule), + pathMatch: 'full', }, { - path: 'mill', resolve: { - resolver: RouteResolver - }, loadChildren: () => import('./mill/mill.module').then(m => m.MillPageModule), pathMatch: 'full' + path: 'mill', + resolve: { + resolver: RouteResolver, + }, + loadChildren: () => + import('./mill/mill.module').then((m) => m.MillPageModule), + pathMatch: 'full', }, { - path: 'beans', resolve: { - resolver: RouteResolver - }, loadChildren: () => import('./beans/beans.module').then(m => m.BeansPageModule), pathMatch: 'full' + path: 'beans', + resolve: { + resolver: RouteResolver, + }, + loadChildren: () => + import('./beans/beans.module').then((m) => m.BeansPageModule), + pathMatch: 'full', }, { - path: 'preparation', resolve: { - resolver: RouteResolver - }, loadChildren: () => import('./preparation/preparation.module').then(m => m.PreparationPageModule), pathMatch: 'full' + path: 'preparation', + resolve: { + resolver: RouteResolver, + }, + loadChildren: () => + import('./preparation/preparation.module').then( + (m) => m.PreparationPageModule + ), + pathMatch: 'full', }, { - path: 'brew', resolve: { - resolver: RouteResolver - }, loadChildren: () => import('./brew/brew.module').then(m => m.BrewPageModule), pathMatch: 'full' + path: 'brew', + resolve: { + resolver: RouteResolver, + }, + loadChildren: () => + import('./brew/brew.module').then((m) => m.BrewPageModule), + pathMatch: 'full', }, { - path: 'statistic', resolve: { - resolver: RouteResolver - }, loadChildren: () => import('./statistic/statistic.module').then(m => m.StatisticPageModule), pathMatch: 'full' - }, { - path: 'helper', resolve: { - resolver: RouteResolver + path: 'statistic', + resolve: { + resolver: RouteResolver, }, - loadChildren: () => import('./helper/helper.module').then(m => m.HelperPageModule) + loadChildren: () => + import('./statistic/statistic.module').then((m) => m.StatisticPageModule), + pathMatch: 'full', }, { - path: 'brew-parameter', resolve: { - resolver: RouteResolver + path: 'helper', + resolve: { + resolver: RouteResolver, }, - loadChildren: () => import('./brew-parameter/brew-parameter.module').then(m => m.BrewParameterPageModule) + loadChildren: () => + import('./helper/helper.module').then((m) => m.HelperPageModule), }, { - path: 'scale-test', resolve: { - resolver: RouteResolver + path: 'brew-parameter', + resolve: { + resolver: RouteResolver, }, - loadChildren: () => import('./scale-test/scale-test.module').then( m => m.ScaleTestPageModule) - } + loadChildren: () => + import('./brew-parameter/brew-parameter.module').then( + (m) => m.BrewParameterPageModule + ), + }, ]; @NgModule({ imports: [ - RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules, relativeLinkResolution: 'legacy' }) + RouterModule.forRoot(routes, { + preloadingStrategy: PreloadAllModules, + relativeLinkResolution: 'legacy', + }), ], - exports: [RouterModule] + exports: [RouterModule], }) export class AppRoutingModule {} diff --git a/src/app/app.component.ts b/src/app/app.component.ts index f7f214138..7bd597a2e 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -24,7 +24,6 @@ import { TranslateService } from '@ngx-translate/core'; import { Chart, registerables } from 'chart.js'; /** Third party */ import moment from 'moment'; -import { PressureType, ScaleType } from 'src/classes/devices'; import { Settings } from '../classes/settings/settings'; import LINK_TRACKING from '../data/tracking/linkTracking'; import STARTUP_TRACKING from '../data/tracking/startupTracking'; @@ -33,7 +32,7 @@ import { environment } from '../environments/environment'; import { AnalyticsPopoverComponent } from '../popover/analytics-popover/analytics-popover.component'; import { WelcomePopoverComponent } from '../popover/welcome-popover/welcome-popover.component'; import { AndroidPlatformService } from '../services/androidPlatform/android-platform.service'; -import { BleManagerService } from '../services/bleManager/ble-manager.service'; + import { CleanupService } from '../services/cleanupService/cleanup.service'; import { IntentHandlerService } from '../services/intentHandler/intent-handler.service'; import { IosPlatformService } from '../services/iosPlatform/ios-platform.service'; @@ -62,6 +61,10 @@ import 'chartjs-adapter-luxon'; import ChartStreaming from 'chartjs-plugin-streaming'; import zoomPlugin from 'chartjs-plugin-zoom'; import annotationPlugin from 'chartjs-plugin-annotation'; + +import { PressureType, ScaleType } from '@graphefruit/coffee-bluetooth-devices'; +import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-devices'; + declare var AppRate; declare var window; @Component({ @@ -222,12 +225,13 @@ export class AppComponent implements AfterViewInit { private readonly uiBeanHelper: UIBeanHelper, private readonly uiMillHelper: UIMillHelper, private readonly uiPreparationHelper: UIPreparationHelper, - private readonly bleManager: BleManagerService, + private readonly bleManager: CoffeeBluetoothDevicesService, private readonly cleanupService: CleanupService, private readonly device: Device, private readonly appVersion: AppVersion, private readonly storage: Storage ) { + console.log(1); // Dont remove androidPlatformService, we need to initialize it via constructor try { // Touch DB Factory to make sure, it is properly initialized even on iOS 14.6 @@ -237,11 +241,15 @@ export class AppComponent implements AfterViewInit { // Touch DB Factory to make sure, it is properly initialized even on iOS 14.6 const db = window.sqlitePlugin; } catch (ex) {} + console.log(2); } - public ngOnInit() {} + public ngOnInit() { + console.log(3); + } public ngAfterViewInit(): void { + console.log(4); this.uiLog.log('Platform ready, init app'); Chart.register(...registerables); @@ -256,6 +264,7 @@ export class AppComponent implements AfterViewInit { } private __appReady(): void { + this.uiLog.log(`App Ready, wait for Platform ready`); this.platform.ready().then(async () => { try { // #285 - Add more device loggings diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 87f05f39d..5e94015e0 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,18 +1,18 @@ -import {NgModule, NO_ERRORS_SCHEMA} from '@angular/core'; -import {BrowserModule} from '@angular/platform-browser'; -import {RouteReuseStrategy} from '@angular/router'; +import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { RouteReuseStrategy } from '@angular/router'; -import {IonicModule, IonicRouteStrategy} from '@ionic/angular'; +import { IonicModule, IonicRouteStrategy } from '@ionic/angular'; -import {AppComponent} from './app.component'; -import {AppRoutingModule} from './app-routing.module'; -import {IonicStorageModule} from '@ionic/storage'; +import { AppComponent } from './app.component'; +import { AppRoutingModule } from './app-routing.module'; +import { IonicStorageModule } from '@ionic/storage'; -import {SharedModule} from './shared/shared.module'; +import { SharedModule } from './shared/shared.module'; -import {TranslateLoader, TranslateModule} from '@ngx-translate/core'; -import {TranslateHttpLoader} from '@ngx-translate/http-loader'; -import {HttpClient, HttpClientModule} from '@angular/common/http'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { TranslateHttpLoader } from '@ngx-translate/http-loader'; +import { HttpClient, HttpClientModule } from '@angular/common/http'; // AoT requires an exported function for factories export function HttpLoaderFactory(http: HttpClient) { @@ -20,37 +20,34 @@ export function HttpLoaderFactory(http: HttpClient) { } @NgModule({ - declarations: [AppComponent], - imports: [ - BrowserModule, - HttpClientModule, - TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useFactory: HttpLoaderFactory, - deps: [HttpClient] - } - }), - IonicModule.forRoot({ - mode: 'md', - menuIcon: 'beanconqueror-menu', - swipeBackEnabled: true, - animated: true, - rippleEffect: false, - }), - IonicStorageModule.forRoot({ - name: '__baristaDB', - driverOrder: ['indexeddb', 'sqlite', 'websql'] - }), - AppRoutingModule, - SharedModule, - ], - providers: [ - { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }, - ], - bootstrap: [AppComponent], - exports: [], - schemas: [NO_ERRORS_SCHEMA] + declarations: [AppComponent], + imports: [ + BrowserModule, + HttpClientModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient], + }, + }), + IonicModule.forRoot({ + mode: 'md', + menuIcon: 'beanconqueror-menu', + swipeBackEnabled: true, + animated: true, + rippleEffect: false, + }), + IonicStorageModule.forRoot({ + name: '__baristaDB', + driverOrder: ['indexeddb', 'sqlite', 'websql'], + }), + AppRoutingModule, + SharedModule, + ], + providers: [{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }], + bootstrap: [AppComponent], + exports: [], + schemas: [NO_ERRORS_SCHEMA], }) -export class AppModule { -} +export class AppModule {} diff --git a/src/app/dashboard/dashboard.page.html b/src/app/dashboard/dashboard.page.html index e46cf3cb7..0e455bd6d 100644 --- a/src/app/dashboard/dashboard.page.html +++ b/src/app/dashboard/dashboard.page.html @@ -14,6 +14,7 @@ + shit diff --git a/src/app/dashboard/dashboard.page.ts b/src/app/dashboard/dashboard.page.ts index dd85aeb39..e0dfc404f 100644 --- a/src/app/dashboard/dashboard.page.ts +++ b/src/app/dashboard/dashboard.page.ts @@ -1,17 +1,18 @@ -import {ChangeDetectorRef, Component, OnInit, ViewChild} from '@angular/core'; -import {UIStatistic} from '../../services/uiStatistic'; -import {ModalController} from '@ionic/angular'; -import {Brew} from '../../classes/brew/brew'; -import {UIBrewStorage} from '../../services/uiBrewStorage'; -import {UIBrewHelper} from '../../services/uiBrewHelper'; -import {BREW_ACTION} from '../../enums/brews/brewAction'; -import {Router} from '@angular/router'; -import {UIBeanStorage} from '../../services/uiBeanStorage'; -import {Bean} from '../../classes/bean/bean'; -import {UIBeanHelper} from '../../services/uiBeanHelper'; -import {Chart} from 'chart.js'; +import { ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core'; +import { UIStatistic } from '../../services/uiStatistic'; +import { ModalController } from '@ionic/angular'; +import { Brew } from '../../classes/brew/brew'; +import { UIBrewStorage } from '../../services/uiBrewStorage'; +import { UIBrewHelper } from '../../services/uiBrewHelper'; +import { BREW_ACTION } from '../../enums/brews/brewAction'; +import { Router } from '@angular/router'; +import { UIBeanStorage } from '../../services/uiBeanStorage'; +import { Bean } from '../../classes/bean/bean'; +import { UIBeanHelper } from '../../services/uiBeanHelper'; +import { Chart } from 'chart.js'; import moment from 'moment'; -import {UISettingsStorage} from '../../services/uiSettingsStorage'; +import { UISettingsStorage } from '../../services/uiSettingsStorage'; +import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-devices'; @Component({ selector: 'dashboard', @@ -19,31 +20,50 @@ import {UISettingsStorage} from '../../services/uiSettingsStorage'; styleUrls: ['./dashboard.page.scss'], }) export class DashboardPage implements OnInit { - public brews: Array = []; private leftOverBeansWeight: number = undefined; - /*public flowProfileChartEl: any = undefined; + /*public flowProfileChartEl: any = undefined; @ViewChild('flowProfileChart', { static: false }) public flowProfileChart;*/ - constructor(public uiStatistic: UIStatistic, - private readonly modalCtrl: ModalController, - private readonly uiBrewStorage: UIBrewStorage, - private readonly uiBrewHelper: UIBrewHelper, - private readonly changeDetectorRef: ChangeDetectorRef, - private readonly router: Router, - private readonly uiBeanStorage: UIBeanStorage, - private readonly uiBeanHelper: UIBeanHelper, - private readonly uiSettingsStorage: UISettingsStorage - ) { - - + constructor( + public uiStatistic: UIStatistic, + private readonly modalCtrl: ModalController, + private readonly uiBrewStorage: UIBrewStorage, + private readonly uiBrewHelper: UIBrewHelper, + private readonly changeDetectorRef: ChangeDetectorRef, + private readonly router: Router, + private readonly uiBeanStorage: UIBeanStorage, + private readonly uiBeanHelper: UIBeanHelper, + private readonly uiSettingsStorage: UISettingsStorage, + private readonly bleManager: CoffeeBluetoothDevicesService + ) {} + private scale: any = undefined; + public async doShit() { + if (this.scale) { + this.bleManager.disconnect(this.scale.id); + setTimeout(() => { + this.scale = null; + }, 150); + } else { + this.scale = await this.bleManager.tryToFindScale(); + if (this.scale) { + try { + // We don't need to retry for iOS, because we just did scan before. + + // NEVER!!! Await here, else the bluetooth logic will get broken. + this.bleManager.autoConnectScale( + this.scale.type, + this.scale.id, + false + ); + } catch (ex) {} + } + } } - - public getRandomInt (min, max) { + public getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } - public ngOnInit() { - + public ngOnInit() { this.uiBrewStorage.attachOnEvent().subscribe((_val) => { // If an brew is deleted, we need to reset our array for the next call. this.leftOverBeansWeight = undefined; @@ -64,10 +84,11 @@ export class DashboardPage implements OnInit { this.brews = UIBrewHelper.sortBrews(this.brews); const settings = this.uiSettingsStorage.getSettings(); if (settings.show_archived_brews_on_dashboard === false) { - this.brews = this.brews.filter((e) => - e.getBean().finished === false && - e.getMill().finished === false && - e.getPreparation().finished === false + this.brews = this.brews.filter( + (e) => + e.getBean().finished === false && + e.getMill().finished === false && + e.getPreparation().finished === false ); } this.brews = this.brews.slice(0, 10); @@ -75,10 +96,9 @@ export class DashboardPage implements OnInit { } public async addBrew() { - - await this.uiBrewHelper.addBrew(); - this.loadBrews(); - this.router.navigate(['/home/brews']); + await this.uiBrewHelper.addBrew(); + this.loadBrews(); + this.router.navigate(['/home/brews']); } public async longPressAdd(event: Event) { @@ -93,7 +113,6 @@ export class DashboardPage implements OnInit { } public getBrews() { - return this.brews; } @@ -101,40 +120,36 @@ export class DashboardPage implements OnInit { this.loadBrews(); } - public openBeansLeftOverCount(): string { // #183 if (this.leftOverBeansWeight === undefined) { let leftOverCount: number = 0; - const openBeans: Array = this.uiBeanStorage.getAllEntries().filter( - (bean) => !bean.finished); + const openBeans: Array = this.uiBeanStorage + .getAllEntries() + .filter((bean) => !bean.finished); for (const bean of openBeans) { - if (bean.weight > 0) { - leftOverCount += (bean.weight - this.getUsedWeightCount(bean)); + leftOverCount += bean.weight - this.getUsedWeightCount(bean); } } - this.leftOverBeansWeight = leftOverCount; } - if (this.leftOverBeansWeight <1000) { - return (Math.round(this.leftOverBeansWeight * 100) / 100 )+ ' g'; - + if (this.leftOverBeansWeight < 1000) { + return Math.round(this.leftOverBeansWeight * 100) / 100 + ' g'; } else { - return (Math.round((this.leftOverBeansWeight / 1000) * 100) / 100) + ' kg'; + return Math.round((this.leftOverBeansWeight / 1000) * 100) / 100 + ' kg'; } - } public getUsedWeightCount(_bean: Bean): number { let usedWeightCount: number = 0; - const relatedBrews: Array = this.uiBeanHelper.getAllBrewsForThisBean(_bean.config.uuid); + const relatedBrews: Array = this.uiBeanHelper.getAllBrewsForThisBean( + _bean.config.uuid + ); for (const brew of relatedBrews) { usedWeightCount += brew.grind_weight; } return usedWeightCount; } - - } diff --git a/src/app/scale-test/scale-test-routing.module.ts b/src/app/scale-test/scale-test-routing.module.ts deleted file mode 100644 index 0c5da4a86..000000000 --- a/src/app/scale-test/scale-test-routing.module.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; - -import { ScaleTestPage } from './scale-test.page'; - -const routes: Routes = [ - { - path: '', - component: ScaleTestPage - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class ScaleTestPageRoutingModule {} diff --git a/src/app/scale-test/scale-test.module.ts b/src/app/scale-test/scale-test.module.ts deleted file mode 100644 index 39b5ca165..000000000 --- a/src/app/scale-test/scale-test.module.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; - -import { IonicModule } from '@ionic/angular'; - -import { ScaleTestPageRoutingModule } from './scale-test-routing.module'; - -import { ScaleTestPage } from './scale-test.page'; -import {SharedModule} from '../shared/shared.module'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - IonicModule, - ScaleTestPageRoutingModule, - SharedModule, - ], - declarations: [] -}) -export class ScaleTestPageModule {} diff --git a/src/app/scale-test/scale-test.page.html b/src/app/scale-test/scale-test.page.html deleted file mode 100644 index 68d6dea62..000000000 --- a/src/app/scale-test/scale-test.page.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - {{"DECENT" | translate}} - - - - - - CONNECT SCALE - - - START - - - STOP - - - - - diff --git a/src/app/scale-test/scale-test.page.scss b/src/app/scale-test/scale-test.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/app/scale-test/scale-test.page.spec.ts b/src/app/scale-test/scale-test.page.spec.ts deleted file mode 100644 index 8132ace69..000000000 --- a/src/app/scale-test/scale-test.page.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { IonicModule } from '@ionic/angular'; - -import { ScaleTestPage } from './scale-test.page'; - -describe('ScaleTestPage', () => { - let component: ScaleTestPage; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ ScaleTestPage ], - imports: [IonicModule.forRoot()] - }).compileComponents(); - - fixture = TestBed.createComponent(ScaleTestPage); - component = fixture.componentInstance; - fixture.detectChanges(); - })); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/scale-test/scale-test.page.ts b/src/app/scale-test/scale-test.page.ts deleted file mode 100644 index c0b8d95ad..000000000 --- a/src/app/scale-test/scale-test.page.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { BleManagerService } from '../../services/bleManager/ble-manager.service'; -import { UIAlert } from '../../services/uiAlert'; - -@Component({ - selector: 'scale-teset-page', - templateUrl: './scale-test.page.html', - styleUrls: ['./scale-test.page.scss'], -}) -export class ScaleTestPage implements OnInit { - - private interval: any = undefined; - constructor(private readonly bleManager: BleManagerService, private readonly uiAlert: UIAlert) { } - - public ngOnInit() { - } - - public async findAndConnectScale() { - - const hasLocationPermission: boolean = await this.bleManager.hasLocationPermission(); - if (!hasLocationPermission) { - await this.uiAlert.showMessage('SCALE.REQUEST_PERMISSION.LOCATION', undefined, undefined, true); - await this.bleManager.requestLocationPermissions(); - } - - const hasBluetoothPermission: boolean = await this.bleManager.hasBluetoothPermission(); - if (!hasBluetoothPermission) { - await this.uiAlert.showMessage('SCALE.REQUEST_PERMISSION.BLUETOOTH', undefined, undefined, true); - await this.bleManager.requestBluetoothPermissions(); - } - - - const bleEnabled: boolean = await this.bleManager.isBleEnabled(); - if (bleEnabled === false) { - await this.uiAlert.showMessage('SCALE.BLUETOOTH_NOT_ENABLED', undefined, undefined, true); - return; - } - - - await this.uiAlert.showLoadingSpinner(); - const device: any = await this.bleManager.tryToFindScale(); - if (device) { - await this.uiAlert.hideLoadingSpinner(); - // We don't need to retry for iOS, because we just did scan before. - this.bleManager.autoConnectScale(device.type, device.id, false); - } else { - await this.uiAlert.hideLoadingSpinner(); - this.uiAlert.showMessage('SCALE.CONNECTION_NOT_ESTABLISHED', undefined, undefined, true); - } - } - - public sendLEDCommand() { - const scale = this.bleManager.getScale(); - scale.connect().then(() => { - - }); - if (this.interval === undefined) { - let weightOn: boolean = false; - let timerOn: boolean = false; - this.interval = setInterval(() => { - weightOn = !weightOn; - timerOn = !timerOn; - scale.setLed(weightOn, timerOn); - }, 1000); - } - - } - public stopLEDCommand() { - if (this.interval !== undefined) { - clearInterval(this.interval); - this.interval = undefined; - } - } - -} diff --git a/src/app/settings/settings.page.ts b/src/app/settings/settings.page.ts index 7db3e4137..558d49833 100644 --- a/src/app/settings/settings.page.ts +++ b/src/app/settings/settings.page.ts @@ -1,69 +1,73 @@ -import {AlertController, ModalController, Platform} from '@ionic/angular'; +import { AlertController, ModalController, Platform } from '@ionic/angular'; import BeanconquerorSettingsDummy from '../../assets/BeanconquerorTestData.json'; -import {Bean} from '../../classes/bean/bean'; -import {BluetoothScale, SCALE_TIMER_COMMAND} from './../../classes/devices/bluetoothDevice'; -import {Brew} from '../../classes/brew/brew'; -import {BREW_VIEW_ENUM} from '../../enums/settings/brewView'; -import {ChangeDetectorRef, Component, ElementRef, OnInit, ViewChild} from '@angular/core'; -import {debounceTime, distinctUntilChanged} from 'rxjs/operators'; -import {DirectoryEntry, FileEntry} from '@ionic-native/file'; -import {FileChooser} from '@ionic-native/file-chooser/ngx'; -import {File} from '@ionic-native/file/ngx'; -import {FilePath} from '@ionic-native/file-path/ngx'; -import {IBean} from '../../interfaces/bean/iBean'; -import {IBrew} from '../../interfaces/brew/iBrew'; -import {IOSFilePicker} from '@ionic-native/file-picker/ngx'; -import {ISettings} from '../../interfaces/settings/iSettings'; -import {Mill} from '../../classes/mill/mill'; -import {Settings} from '../../classes/settings/settings'; -import {SocialSharing} from '@ionic-native/social-sharing/ngx'; -import {STARTUP_VIEW_ENUM} from '../../enums/settings/startupView'; -import {Subject, Subscription} from 'rxjs'; -import {TranslateService} from '@ngx-translate/core'; -import {UIAlert} from '../../services/uiAlert'; -import {UIAnalytics} from '../../services/uiAnalytics'; -import {UIBeanStorage} from '../../services/uiBeanStorage'; -import {UIBrewStorage} from '../../services/uiBrewStorage'; -import {UIHelper} from '../../services/uiHelper'; -import {UILog} from '../../services/uiLog'; -import {UIMillStorage} from '../../services/uiMillStorage'; -import {UIPreparationStorage} from '../../services/uiPreparationStorage'; -import {UISettingsStorage} from '../../services/uiSettingsStorage'; -import {UIStorage} from '../../services/uiStorage'; - +import { Bean } from '../../classes/bean/bean'; + +import { Brew } from '../../classes/brew/brew'; +import { BREW_VIEW_ENUM } from '../../enums/settings/brewView'; +import { + ChangeDetectorRef, + Component, + ElementRef, + OnInit, + ViewChild, +} from '@angular/core'; +import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; +import { DirectoryEntry, FileEntry } from '@ionic-native/file'; +import { FileChooser } from '@ionic-native/file-chooser/ngx'; +import { File } from '@ionic-native/file/ngx'; +import { FilePath } from '@ionic-native/file-path/ngx'; +import { IBean } from '../../interfaces/bean/iBean'; +import { IBrew } from '../../interfaces/brew/iBrew'; +import { IOSFilePicker } from '@ionic-native/file-picker/ngx'; +import { ISettings } from '../../interfaces/settings/iSettings'; +import { Mill } from '../../classes/mill/mill'; +import { Settings } from '../../classes/settings/settings'; +import { SocialSharing } from '@ionic-native/social-sharing/ngx'; +import { STARTUP_VIEW_ENUM } from '../../enums/settings/startupView'; +import { Subject, Subscription } from 'rxjs'; +import { TranslateService } from '@ngx-translate/core'; +import { UIAlert } from '../../services/uiAlert'; +import { UIAnalytics } from '../../services/uiAnalytics'; +import { UIBeanStorage } from '../../services/uiBeanStorage'; +import { UIBrewStorage } from '../../services/uiBrewStorage'; +import { UIHelper } from '../../services/uiHelper'; +import { UILog } from '../../services/uiLog'; +import { UIMillStorage } from '../../services/uiMillStorage'; +import { UIPreparationStorage } from '../../services/uiPreparationStorage'; +import { UISettingsStorage } from '../../services/uiSettingsStorage'; +import { UIStorage } from '../../services/uiStorage'; /** Third party */ -import {AnalyticsPopoverComponent} from '../../popover/analytics-popover/analytics-popover.component'; -import {AndroidPermissions} from '@ionic-native/android-permissions/ngx'; -import {BleManagerService} from '../../services/bleManager/ble-manager.service'; -import {CurrencyService} from '../../services/currencyService/currency.service'; -import {GreenBean} from '../../classes/green-bean/green-bean'; -import {IGreenBean} from '../../interfaces/green-bean/iGreenBean'; -import {IMill} from '../../interfaces/mill/iMill'; -import {IPreparation} from '../../interfaces/preparation/iPreparation'; -import {IRoastingMachine} from '../../interfaces/roasting-machine/iRoastingMachine'; +import { AnalyticsPopoverComponent } from '../../popover/analytics-popover/analytics-popover.component'; +import { AndroidPermissions } from '@ionic-native/android-permissions/ngx'; + +import { CurrencyService } from '../../services/currencyService/currency.service'; +import { GreenBean } from '../../classes/green-bean/green-bean'; +import { IGreenBean } from '../../interfaces/green-bean/iGreenBean'; +import { IMill } from '../../interfaces/mill/iMill'; +import { IPreparation } from '../../interfaces/preparation/iPreparation'; +import { IRoastingMachine } from '../../interfaces/roasting-machine/iRoastingMachine'; import moment from 'moment'; -import {Preparation} from '../../classes/preparation/preparation'; -import {RoastingMachine} from '../../classes/roasting-machine/roasting-machine'; +import { Preparation } from '../../classes/preparation/preparation'; +import { RoastingMachine } from '../../classes/roasting-machine/roasting-machine'; import SETTINGS_TRACKING from '../../data/tracking/settingsTracking'; -import {UIExcel} from '../../services/uiExcel'; -import {UIGreenBeanStorage} from '../../services/uiGreenBeanStorage'; -import {UIHealthKit} from '../../services/uiHealthKit'; -import {UIRoastingMachineStorage} from '../../services/uiRoastingMachineStorage'; -import {UIToast} from '../../services/uiToast'; -import {UIUpdate} from '../../services/uiUpdate'; -import {UiVersionStorage} from '../../services/uiVersionStorage'; -import {UIWaterStorage} from '../../services/uiWaterStorage'; -import {Water} from '../../classes/water/water'; -import {AppEvent} from '../../classes/appEvent/appEvent'; -import {AppEventType} from '../../enums/appEvent/appEvent'; -import {EventQueueService} from '../../services/queueService/queue-service.service'; - +import { UIExcel } from '../../services/uiExcel'; +import { UIGreenBeanStorage } from '../../services/uiGreenBeanStorage'; +import { UIHealthKit } from '../../services/uiHealthKit'; +import { UIRoastingMachineStorage } from '../../services/uiRoastingMachineStorage'; +import { UIToast } from '../../services/uiToast'; +import { UIUpdate } from '../../services/uiUpdate'; +import { UiVersionStorage } from '../../services/uiVersionStorage'; +import { UIWaterStorage } from '../../services/uiWaterStorage'; +import { Water } from '../../classes/water/water'; +import { AppEvent } from '../../classes/appEvent/appEvent'; +import { AppEventType } from '../../enums/appEvent/appEvent'; +import { EventQueueService } from '../../services/queueService/queue-service.service'; +import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-devices'; declare var cordova: any; declare var device: any; - declare var window: any; @Component({ @@ -72,7 +76,6 @@ declare var window: any; styleUrls: ['./settings.page.scss'], }) export class SettingsPage implements OnInit { - public settings: Settings; public BREW_VIEWS = BREW_VIEW_ENUM; @@ -83,22 +86,20 @@ export class SettingsPage implements OnInit { public currencies = {}; - public settings_segment: string = "general"; - private __cleanupAttachmentData(_data: Array): any { + public settings_segment: string = 'general'; + private __cleanupAttachmentData( + _data: Array< + IBean | IBrew | IMill | IPreparation | IGreenBean | IRoastingMachine + > + ): any { if (_data !== undefined && _data.length > 0) { for (const obj of _data) { obj.attachments = []; } } - - } - - - - public ngOnDestroy() { - } + public ngOnDestroy() {} private __cleanupImportSettingsData(_data: ISettings | any): void { // We need to remove the filter because of new data here. @@ -113,38 +114,39 @@ export class SettingsPage implements OnInit { } } - constructor(private readonly platform: Platform, - public uiSettingsStorage: UISettingsStorage, - public uiStorage: UIStorage, - public uiHelper: UIHelper, - private readonly fileChooser: FileChooser, - private readonly filePath: FilePath, - private readonly file: File, - private readonly alertCtrl: AlertController, - private readonly uiAlert: UIAlert, - private readonly uiPreparationStorage: UIPreparationStorage, - private readonly uiBeanStorage: UIBeanStorage, - private readonly uiBrewStorage: UIBrewStorage, - private readonly uiMillStorage: UIMillStorage, - private readonly iosFilePicker: IOSFilePicker, - private readonly socialSharing: SocialSharing, - private readonly uiLog: UILog, - private readonly translate: TranslateService, - private readonly changeDetectorRef: ChangeDetectorRef, - private readonly uiAnalytics: UIAnalytics, - private readonly androidPermissions: AndroidPermissions, - private readonly uiUpdate: UIUpdate, - private readonly uiVersionStorage: UiVersionStorage, - private readonly uiExcel: UIExcel, - private readonly uiHealthKit: UIHealthKit, - private readonly modalCtrl: ModalController, - private readonly uiRoastingMachineStorage: UIRoastingMachineStorage, - private readonly uiGreenBeanStorage: UIGreenBeanStorage, - private readonly uiWaterStorage: UIWaterStorage, - private readonly bleManager: BleManagerService, - private readonly uiToast: UIToast, - private readonly currencyService: CurrencyService, - private readonly eventQueue: EventQueueService, + constructor( + private readonly platform: Platform, + public uiSettingsStorage: UISettingsStorage, + public uiStorage: UIStorage, + public uiHelper: UIHelper, + private readonly fileChooser: FileChooser, + private readonly filePath: FilePath, + private readonly file: File, + private readonly alertCtrl: AlertController, + private readonly uiAlert: UIAlert, + private readonly uiPreparationStorage: UIPreparationStorage, + private readonly uiBeanStorage: UIBeanStorage, + private readonly uiBrewStorage: UIBrewStorage, + private readonly uiMillStorage: UIMillStorage, + private readonly iosFilePicker: IOSFilePicker, + private readonly socialSharing: SocialSharing, + private readonly uiLog: UILog, + private readonly translate: TranslateService, + private readonly changeDetectorRef: ChangeDetectorRef, + private readonly uiAnalytics: UIAnalytics, + private readonly androidPermissions: AndroidPermissions, + private readonly uiUpdate: UIUpdate, + private readonly uiVersionStorage: UiVersionStorage, + private readonly uiExcel: UIExcel, + private readonly uiHealthKit: UIHealthKit, + private readonly modalCtrl: ModalController, + private readonly uiRoastingMachineStorage: UIRoastingMachineStorage, + private readonly uiGreenBeanStorage: UIGreenBeanStorage, + private readonly uiWaterStorage: UIWaterStorage, + private readonly bleManager: CoffeeBluetoothDevicesService, + private readonly uiToast: UIToast, + private readonly currencyService: CurrencyService, + private readonly eventQueue: EventQueueService ) { this.__initializeSettings(); this.debounceLanguageFilter @@ -155,39 +157,54 @@ export class SettingsPage implements OnInit { this.currencies = this.currencyService.getCurrencies(); - this.uiHealthKit.isAvailable().then(() => { - this.isHealthSectionAvailable = true; - }, () => { - this.isHealthSectionAvailable = false; - }); + this.uiHealthKit.isAvailable().then( + () => { + this.isHealthSectionAvailable = true; + }, + () => { + this.isHealthSectionAvailable = false; + } + ); } - - public async ngOnInit() { - - } + public async ngOnInit() {} public async findAndConnectPressureDevice(_retry: boolean = false) { - const hasLocationPermission: boolean = await this.bleManager.hasLocationPermission(); + const hasLocationPermission: boolean = + await this.bleManager.hasLocationPermission(); if (!hasLocationPermission) { - await this.uiAlert.showMessage('SCALE.REQUEST_PERMISSION.LOCATION', undefined, undefined, true); + await this.uiAlert.showMessage( + 'SCALE.REQUEST_PERMISSION.LOCATION', + undefined, + undefined, + true + ); await this.bleManager.requestLocationPermissions(); } - const hasBluetoothPermission: boolean = await this.bleManager.hasBluetoothPermission(); + const hasBluetoothPermission: boolean = + await this.bleManager.hasBluetoothPermission(); if (!hasBluetoothPermission) { - await this.uiAlert.showMessage('SCALE.REQUEST_PERMISSION.BLUETOOTH', undefined, undefined, true); + await this.uiAlert.showMessage( + 'SCALE.REQUEST_PERMISSION.BLUETOOTH', + undefined, + undefined, + true + ); await this.bleManager.requestBluetoothPermissions(); } - const bleEnabled: boolean = await this.bleManager.isBleEnabled(); if (bleEnabled === false) { - await this.uiAlert.showMessage('SCALE.BLUETOOTH_NOT_ENABLED', undefined, undefined, true); + await this.uiAlert.showMessage( + 'SCALE.BLUETOOTH_NOT_ENABLED', + undefined, + undefined, + true + ); return; } - await this.uiAlert.showLoadingSpinner(); this.uiAlert.setLoadingSpinnerMessage('SCALE.BLUETOOTH_SCAN_RUNNING', true); const pressureDevice = await this.bleManager.tryToFindPressureDevice(); @@ -197,10 +214,12 @@ export class SettingsPage implements OnInit { // We don't need to retry for iOS, because we just did scan before. // NEVER!!! Await here, else the bluetooth logic will get broken. - this.bleManager.autoConnectPressureDevice(pressureDevice.type, pressureDevice.id, false); - } catch(ex) { - - } + this.bleManager.autoConnectPressureDevice( + pressureDevice.type, + pressureDevice.id, + false + ); + } catch (ex) {} this.settings.pressure_id = pressureDevice.id; this.settings.pressure_type = pressureDevice.type; @@ -208,61 +227,81 @@ export class SettingsPage implements OnInit { //this.uiAnalytics.trackEvent(SETTINGS_TRACKING.TITLE, SETTINGS_TRACKING.ACTIONS.SCALE.CATEGORY,scale.type); await this.saveSettings(); - } else { await this.uiAlert.hideLoadingSpinner(); - this.uiAlert.showMessage('SCALE.CONNECTION_NOT_ESTABLISHED', undefined, undefined, true); + this.uiAlert.showMessage( + 'SCALE.CONNECTION_NOT_ESTABLISHED', + undefined, + undefined, + true + ); } } public async findAndConnectScale(_retry: boolean = false) { - const hasLocationPermission: boolean = await this.bleManager.hasLocationPermission(); + const hasLocationPermission: boolean = + await this.bleManager.hasLocationPermission(); if (!hasLocationPermission) { - await this.uiAlert.showMessage('SCALE.REQUEST_PERMISSION.LOCATION', undefined, undefined, true); + await this.uiAlert.showMessage( + 'SCALE.REQUEST_PERMISSION.LOCATION', + undefined, + undefined, + true + ); await this.bleManager.requestLocationPermissions(); } - const hasBluetoothPermission: boolean = await this.bleManager.hasBluetoothPermission(); + const hasBluetoothPermission: boolean = + await this.bleManager.hasBluetoothPermission(); if (!hasBluetoothPermission) { - await this.uiAlert.showMessage('SCALE.REQUEST_PERMISSION.BLUETOOTH', undefined, undefined, true); + await this.uiAlert.showMessage( + 'SCALE.REQUEST_PERMISSION.BLUETOOTH', + undefined, + undefined, + true + ); await this.bleManager.requestBluetoothPermissions(); } - const bleEnabled: boolean = await this.bleManager.isBleEnabled(); if (bleEnabled === false) { - await this.uiAlert.showMessage('SCALE.BLUETOOTH_NOT_ENABLED', undefined, undefined, true); + await this.uiAlert.showMessage( + 'SCALE.BLUETOOTH_NOT_ENABLED', + undefined, + undefined, + true + ); return; } - await this.uiAlert.showLoadingSpinner(); this.uiAlert.setLoadingSpinnerMessage('SCALE.BLUETOOTH_SCAN_RUNNING', true); const scale = await this.bleManager.tryToFindScale(); if (scale) { - try { // We don't need to retry for iOS, because we just did scan before. // NEVER!!! Await here, else the bluetooth logic will get broken. this.bleManager.autoConnectScale(scale.type, scale.id, false); - } catch(ex) { - - } + } catch (ex) {} this.settings.scale_id = scale.id; this.settings.scale_type = scale.type; - this.uiAnalytics.trackEvent(SETTINGS_TRACKING.TITLE, SETTINGS_TRACKING.ACTIONS.SCALE.CATEGORY,scale.type); + this.uiAnalytics.trackEvent( + SETTINGS_TRACKING.TITLE, + SETTINGS_TRACKING.ACTIONS.SCALE.CATEGORY, + scale.type + ); await this.saveSettings(); let skipLoop = 0; - for (let i=0;i<5;i++) { + for (let i = 0; i < 5; i++) { await new Promise((resolve) => { setTimeout(async () => { const connectedScale = this.bleManager.getScale(); - if(connectedScale !== null && connectedScale !== undefined) { + if (connectedScale !== null && connectedScale !== undefined) { skipLoop = 1; await connectedScale.setLed(true, true); } @@ -272,18 +311,23 @@ export class SettingsPage implements OnInit { if (skipLoop === 1) { break; } - } await this.uiAlert.hideLoadingSpinner(); - } else { await this.uiAlert.hideLoadingSpinner(); - this.uiAlert.showMessage('SCALE.CONNECTION_NOT_ESTABLISHED', undefined, undefined, true); + this.uiAlert.showMessage( + 'SCALE.CONNECTION_NOT_ESTABLISHED', + undefined, + undefined, + true + ); } } public async disconnectScale() { - this.eventQueue.dispatch(new AppEvent(AppEventType.BLUETOOTH_SCALE_DISCONNECT, undefined)); + this.eventQueue.dispatch( + new AppEvent(AppEventType.BLUETOOTH_SCALE_DISCONNECT, undefined) + ); let disconnected: boolean = true; //if scale is connected, we try to disconnect, if scale is not connected, we just forget scale :) @@ -298,14 +342,20 @@ export class SettingsPage implements OnInit { } } - public async disconnectPressureDevice() { - this.eventQueue.dispatch(new AppEvent(AppEventType.BLUETOOTH_PRESSURE_DEVICE_DISCONNECT, undefined)); + this.eventQueue.dispatch( + new AppEvent(AppEventType.BLUETOOTH_PRESSURE_DEVICE_DISCONNECT, undefined) + ); let disconnected: boolean = true; //if scale is connected, we try to disconnect, if scale is not connected, we just forget scale :) - if (this.settings.pressure_id !== '' && this.bleManager.getPressureDevice()) { - disconnected = await this.bleManager.disconnectPressureDevice(this.settings.pressure_id); + if ( + this.settings.pressure_id !== '' && + this.bleManager.getPressureDevice() + ) { + disconnected = await this.bleManager.disconnectPressureDevice( + this.settings.pressure_id + ); } if (disconnected) { @@ -315,9 +365,6 @@ export class SettingsPage implements OnInit { } } - - - public async retryConnectPressureDevice() { await this.findAndConnectPressureDevice(true); } @@ -333,9 +380,6 @@ export class SettingsPage implements OnInit { return this.bleManager.pressureDevice !== null; } - - - public async checkWaterSection() { if (this.settings.show_water_section === false) { await this.uiAlert.showLoadingSpinner(); @@ -343,16 +387,15 @@ export class SettingsPage implements OnInit { this.settings.manage_parameters.water = true; await this.saveSettings(); - const preps: Array = this.uiPreparationStorage.getAllEntries(); + const preps: Array = + this.uiPreparationStorage.getAllEntries(); if (preps.length > 0) { for (const prep of preps) { prep.manage_parameters.water = true; await this.uiPreparationStorage.update(prep); } } - } catch (ex) { - - } + } catch (ex) {} await this.uiAlert.hideLoadingSpinner(); } @@ -361,40 +404,59 @@ export class SettingsPage implements OnInit { public checkHealthPlugin() { // #200 - Didn't save the settings if (this.settings.track_caffeine_consumption === false) { - this.uiAlert.showConfirm('HEALTH_KIT_QUESTION_MESSAGE', 'HEALTH_KIT_QUESTION_TITLE', true).then(() => { - this.uiHealthKit.requestAuthorization().then(async () => { - // Allowed - this.settings.track_caffeine_consumption = true; - await this.saveSettings(); - }, async () => { - // Forbidden - this.settings.track_caffeine_consumption = false; - await this.saveSettings(); - }); - }, async () => { - this.settings.track_caffeine_consumption = false; - await this.saveSettings(); - }); + this.uiAlert + .showConfirm( + 'HEALTH_KIT_QUESTION_MESSAGE', + 'HEALTH_KIT_QUESTION_TITLE', + true + ) + .then( + () => { + this.uiHealthKit.requestAuthorization().then( + async () => { + // Allowed + this.settings.track_caffeine_consumption = true; + await this.saveSettings(); + }, + async () => { + // Forbidden + this.settings.track_caffeine_consumption = false; + await this.saveSettings(); + } + ); + }, + async () => { + this.settings.track_caffeine_consumption = false; + await this.saveSettings(); + } + ); } - - } - public checkCoordinates() { if (this.platform.is('android')) { // Request permission, - this.androidPermissions.checkPermission(this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION).then((_status) => { - this.androidPermissions.requestPermission(this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION).then((_status) => { - }, () => { - }); - }, () => { - }); + this.androidPermissions + .checkPermission( + this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION + ) + .then( + (_status) => { + this.androidPermissions + .requestPermission( + this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION + ) + .then( + (_status) => {}, + () => {} + ); + }, + () => {} + ); } } public async changeBrewRating() { - // #379 - First save then reset filter ;) await this.saveSettings(); this.settings.resetFilter(); @@ -406,7 +468,10 @@ export class SettingsPage implements OnInit { } public async showAnalyticsInformation() { - const modal = await this.modalCtrl.create({component: AnalyticsPopoverComponent, id: AnalyticsPopoverComponent.POPOVER_ID}); + const modal = await this.modalCtrl.create({ + component: AnalyticsPopoverComponent, + id: AnalyticsPopoverComponent.POPOVER_ID, + }); await modal.present(); await modal.onWillDismiss(); } @@ -418,44 +483,76 @@ export class SettingsPage implements OnInit { public setLanguage(): void { this.translate.setDefaultLang(this.settings.language); this.translate.use(this.settings.language); - this.uiAnalytics.trackEvent(SETTINGS_TRACKING.TITLE, SETTINGS_TRACKING.ACTIONS.SET_LANGUAGE.CATEGORY, this.settings.language); + this.uiAnalytics.trackEvent( + SETTINGS_TRACKING.TITLE, + SETTINGS_TRACKING.ACTIONS.SET_LANGUAGE.CATEGORY, + this.settings.language + ); this.uiSettingsStorage.saveSettings(this.settings); moment.locale(this.settings.language); } public import(): void { if (this.platform.is('cordova')) { - this.uiAnalytics.trackEvent(SETTINGS_TRACKING.TITLE, SETTINGS_TRACKING.ACTIONS.IMPORT); + this.uiAnalytics.trackEvent( + SETTINGS_TRACKING.TITLE, + SETTINGS_TRACKING.ACTIONS.IMPORT + ); this.uiLog.log('Import real data'); if (this.platform.is('android')) { - this.fileChooser.open() - .then(async (uri) => { - try { - const fileEntry: any = await new Promise(async (resolve) => + this.fileChooser.open().then(async (uri) => { + try { + const fileEntry: any = await new Promise( + async (resolve) => await window.resolveLocalFileSystemURL(uri, resolve) + ); + const newPath: string = await this.filePath.resolveNativePath( + fileEntry.nativeURL + ); + let importPath: string = ''; + if (newPath.lastIndexOf('/Download/') > -1) { + let pathFromDownload = newPath.substr( + 0, + newPath.lastIndexOf('/Download/') ); - const newPath: string = await this.filePath.resolveNativePath(fileEntry.nativeURL); - let importPath: string = ''; - if (newPath.lastIndexOf('/Download/') > -1) { - let pathFromDownload = newPath.substr(0, newPath.lastIndexOf('/Download/')); - const decodedURI = decodeURIComponent(uri); - pathFromDownload = pathFromDownload + decodedURI.substring(decodedURI.lastIndexOf('/Download/')); - importPath = pathFromDownload; - importPath = importPath.substring(0, importPath.lastIndexOf('/') + 1); - } else { - // After the new API-Changes we just can support this download path - importPath = this.file.externalRootDirectory + 'Download/Beanconqueror_export/'; - } + const decodedURI = decodeURIComponent(uri); + pathFromDownload = + pathFromDownload + + decodedURI.substring(decodedURI.lastIndexOf('/Download/')); + importPath = pathFromDownload; + importPath = importPath.substring( + 0, + importPath.lastIndexOf('/') + 1 + ); + } else { + // After the new API-Changes we just can support this download path + importPath = + this.file.externalRootDirectory + + 'Download/Beanconqueror_export/'; + } - this.__readAndroidJSONFile(fileEntry, importPath).then(() => { + this.__readAndroidJSONFile(fileEntry, importPath).then( + () => { // nothing todo - }, (_err) => { - this.uiAlert.showMessage(this.translate.instant('ERROR_ON_FILE_READING') + ' (' + JSON.stringify(_err) + ')'); - }); - } catch (ex) { - this.uiAlert.showMessage(this.translate.instant('FILE_NOT_FOUND_INFORMATION') + ' (' + JSON.stringify(ex) + ')'); - } - }); + }, + (_err) => { + this.uiAlert.showMessage( + this.translate.instant('ERROR_ON_FILE_READING') + + ' (' + + JSON.stringify(_err) + + ')' + ); + } + ); + } catch (ex) { + this.uiAlert.showMessage( + this.translate.instant('FILE_NOT_FOUND_INFORMATION') + + ' (' + + JSON.stringify(ex) + + ')' + ); + } + }); } else { this.iosFilePicker.pickFile().then((uri) => { if (uri && uri.endsWith('.json')) { @@ -464,16 +561,24 @@ export class SettingsPage implements OnInit { if (path.indexOf('file://') !== 0) { path = 'file://' + path; } - this.__readJSONFile(path, file).then(() => { - // nothing todo - }).catch((_err) => { - this.uiAlert.showMessage(this.translate.instant('FILE_NOT_FOUND_INFORMATION') + ' (' + JSON.stringify(_err) + ')'); - }); + this.__readJSONFile(path, file) + .then(() => { + // nothing todo + }) + .catch((_err) => { + this.uiAlert.showMessage( + this.translate.instant('FILE_NOT_FOUND_INFORMATION') + + ' (' + + JSON.stringify(_err) + + ')' + ); + }); } else { - this.uiAlert.showMessage(this.translate.instant('INVALID_FILE_FORMAT')); + this.uiAlert.showMessage( + this.translate.instant('INVALID_FILE_FORMAT') + ); } }); - } } else { this.__importDummyData(); @@ -481,94 +586,107 @@ export class SettingsPage implements OnInit { } public isMobile(): boolean { - return (this.platform.is('android') || this.platform.is('ios')); + return this.platform.is('android') || this.platform.is('ios'); } private async exportAttachments() { - const exportObjects: Array = - [...this.uiBeanStorage.getAllEntries(), - ...this.uiBrewStorage.getAllEntries(), - ...this.uiPreparationStorage.getAllEntries(), - ...this.uiMillStorage.getAllEntries(), - ...this.uiWaterStorage.getAllEntries(), - ...this.uiGreenBeanStorage.getAllEntries(), - ...this.uiRoastingMachineStorage.getAllEntries()]; + const exportObjects: Array = [ + ...this.uiBeanStorage.getAllEntries(), + ...this.uiBrewStorage.getAllEntries(), + ...this.uiPreparationStorage.getAllEntries(), + ...this.uiMillStorage.getAllEntries(), + ...this.uiWaterStorage.getAllEntries(), + ...this.uiGreenBeanStorage.getAllEntries(), + ...this.uiRoastingMachineStorage.getAllEntries(), + ]; await this._exportAttachments(exportObjects); } - private async exportFlowProfiles() { - const exportObjects: Array =[...this.uiBrewStorage.getAllEntries()]; + const exportObjects: Array = [...this.uiBrewStorage.getAllEntries()]; await this._exportFlowProfiles(exportObjects); } public async export() { - await this.uiAlert.showLoadingSpinner(); - this.uiAnalytics.trackEvent(SETTINGS_TRACKING.TITLE, SETTINGS_TRACKING.ACTIONS.EXPORT); - - - this.uiStorage.export().then((_data) => { - this.uiHelper.exportJSON('Beanconqueror.json', JSON.stringify(_data)).then(async (_fileEntry: FileEntry) => { - - if (this.platform.is('cordova')) { - if (this.platform.is('android')) { - - await this.exportAttachments(); - await this.exportFlowProfiles(); - await this.uiAlert.hideLoadingSpinner(); - - const alert = await this.alertCtrl.create({ - header: this.translate.instant('DOWNLOADED'), - subHeader: this.translate.instant('FILE_DOWNLOADED_SUCCESSFULLY', {fileName: _fileEntry.name}), - buttons: ['OK'] - }); - await alert.present(); - } else { - await this.uiAlert.hideLoadingSpinner(); - // File already downloaded - // We don't support image export yet, because - } - } else { - await this.uiAlert.hideLoadingSpinner(); - // File already downloaded - // We don't support image export yet, because - } - - - }, async () => { + this.uiAnalytics.trackEvent( + SETTINGS_TRACKING.TITLE, + SETTINGS_TRACKING.ACTIONS.EXPORT + ); + + this.uiStorage.export().then( + (_data) => { + this.uiHelper + .exportJSON('Beanconqueror.json', JSON.stringify(_data)) + .then( + async (_fileEntry: FileEntry) => { + if (this.platform.is('cordova')) { + if (this.platform.is('android')) { + await this.exportAttachments(); + await this.exportFlowProfiles(); + await this.uiAlert.hideLoadingSpinner(); + + const alert = await this.alertCtrl.create({ + header: this.translate.instant('DOWNLOADED'), + subHeader: this.translate.instant( + 'FILE_DOWNLOADED_SUCCESSFULLY', + { fileName: _fileEntry.name } + ), + buttons: ['OK'], + }); + await alert.present(); + } else { + await this.uiAlert.hideLoadingSpinner(); + // File already downloaded + // We don't support image export yet, because + } + } else { + await this.uiAlert.hideLoadingSpinner(); + // File already downloaded + // We don't support image export yet, because + } + }, + async () => { + await this.uiAlert.hideLoadingSpinner(); + } + ); + }, + async () => { await this.uiAlert.hideLoadingSpinner(); - }); - - }, async () => { - await this.uiAlert.hideLoadingSpinner(); - }); - + } + ); } public excelExport(): void { this.uiExcel.export(); } - private async _exportAttachments(_storedData: Array | Array | Array | Array | Array | Array | Array) { + private async _exportAttachments( + _storedData: + | Array + | Array + | Array + | Array + | Array + | Array + | Array + ) { for (const entry of _storedData) { for (const attachment of entry.attachments) { await this._exportFile(attachment); } } } - private async _exportFlowProfiles(_storedData: Array ) { + private async _exportFlowProfiles(_storedData: Array) { for (const entry of _storedData) { if (entry.flow_profile) { await this._exportFile(entry.flow_profile); } - } } - private async _exportFile(_filePath) { let path: string; let fileName: string; @@ -580,7 +698,6 @@ export class SettingsPage implements OnInit { let storageLocation: string = ''; switch (device.platform) { - case 'Android': storageLocation = cordova.file.externalRootDirectory; break; @@ -590,51 +707,78 @@ export class SettingsPage implements OnInit { } try { - const fileSystem: any = await new Promise(async (resolve) => - await window.resolveLocalFileSystemURL(storageLocation, resolve) + const fileSystem: any = await new Promise( + async (resolve) => + await window.resolveLocalFileSystemURL(storageLocation, resolve) ); - const directory: DirectoryEntry = await new Promise(async (resolve) => - await fileSystem.getDirectory('Download', { - create: true, - exclusive: false - }, resolve) + const directory: DirectoryEntry = await new Promise( + async (resolve) => + await fileSystem.getDirectory( + 'Download', + { + create: true, + exclusive: false, + }, + resolve + ) ); - let exportDirectory: DirectoryEntry = await new Promise(async (resolve) => - await directory.getDirectory('Beanconqueror_export', { - create: true, - exclusive: false - }, resolve) + let exportDirectory: DirectoryEntry = await new Promise( + async (resolve) => + await directory.getDirectory( + 'Beanconqueror_export', + { + create: true, + exclusive: false, + }, + resolve + ) ); let exportingFilename = ''; const folders = fileName.split('/'); - for (let i=0;i=0) { + if (folderName.indexOf('.') >= 0) { // We found the filename woop exportingFilename = folderName.trim(); - } else if(folderName !=='') { + } else if (folderName !== '') { // We found another folder, create it or just get it path = path + folderName + '/'; - exportDirectory = await new Promise(async (resolve) => - await exportDirectory.getDirectory(folderName, { - create: true, - exclusive: false - }, resolve) + exportDirectory = await new Promise( + async (resolve) => + await exportDirectory.getDirectory( + folderName, + { + create: true, + exclusive: false, + }, + resolve + ) ); } } - await this.file.copyFile(path, exportingFilename, exportDirectory.nativeURL, exportingFilename); - } catch (ex) { - - } - - + await this.file.copyFile( + path, + exportingFilename, + exportDirectory.nativeURL, + exportingFilename + ); + } catch (ex) {} } - private async _importFiles(_storedData: Array | Array | Array | Array | Array | Array | Array, _importPath: string) { + private async _importFiles( + _storedData: + | Array + | Array + | Array + | Array + | Array + | Array + | Array, + _importPath: string + ) { for (const entry of _storedData) { for (const attachment of entry.attachments) { await this._importFile(attachment, _importPath); @@ -653,7 +797,6 @@ export class SettingsPage implements OnInit { let storageLocation: string = ''; switch (device.platform) { - case 'Android': storageLocation = _importPath; break; @@ -663,28 +806,44 @@ export class SettingsPage implements OnInit { } try { - const fileExists: boolean = await this.file.checkFile(storageLocation,fileName); + const fileExists: boolean = await this.file.checkFile( + storageLocation, + fileName + ); if (fileExists === true) { - this.uiLog.log('File did exist and was copied - file:' + storageLocation + '' + fileName + ' to: ' + path + '' + fileName); + this.uiLog.log( + 'File did exist and was copied - file:' + + storageLocation + + '' + + fileName + + ' to: ' + + path + + '' + + fileName + ); await this.file.copyFile(storageLocation, fileName, path, fileName); - } else { - this.uiLog.log('File doesnt exist - file:' + storageLocation + '' + fileName + ' to: ' + path + '' + fileName); + this.uiLog.log( + 'File doesnt exist - file:' + + storageLocation + + '' + + fileName + + ' to: ' + + path + + '' + + fileName + ); } try { // extra catch because maybe file is not existing // await this.file.removeFile(path, fileName); - } catch (ex) { - - } - + } catch (ex) {} } catch (ex) { this.uiLog.error('Import file ' + ex.message); } } - /* tslint:disable */ private __importDummyData(): void { this.uiLog.log('Import dummy data'); @@ -694,7 +853,9 @@ export class SettingsPage implements OnInit { this.uiLog.log('Old brew order structure'); // Breaking change, we need to throw away the old order types by import const settingsConst = new Settings(); - dummyData['SETTINGS'][0]['brew_order'] = this.uiHelper.copyData(settingsConst.brew_order); + dummyData['SETTINGS'][0]['brew_order'] = this.uiHelper.copyData( + settingsConst.brew_order + ); } this.__cleanupImportSettingsData(dummyData['SETTINGS'][0]); @@ -704,7 +865,9 @@ export class SettingsPage implements OnInit { this.__initializeSettings(); this.settings.resetFilter(); this.setLanguage(); - await this.uiAlert.showMessage(this.translate.instant('IMPORT_SUCCESSFULLY')); + await this.uiAlert.showMessage( + this.translate.instant('IMPORT_SUCCESSFULLY') + ); if (this.settings.matomo_analytics === undefined) { await this.showAnalyticsInformation(); } else { @@ -715,13 +878,15 @@ export class SettingsPage implements OnInit { } /* tslint:enable */ - private async __readAndroidJSONFile(_fileEntry: FileEntry, _importPath: string): Promise { + private async __readAndroidJSONFile( + _fileEntry: FileEntry, + _importPath: string + ): Promise { return new Promise((resolve, reject) => { _fileEntry.file(async (file) => { const reader = new FileReader(); reader.onloadend = (event: Event) => { this.__importJSON(reader.result as string, _importPath); - }; reader.onerror = (event: Event) => { reject(); @@ -729,26 +894,24 @@ export class SettingsPage implements OnInit { reader.readAsText(file); }); - }); } /* tslint:enable */ private async __readJSONFile(path, file): Promise { return new Promise((resolve, reject) => { - this.file.readAsText(path, file) + this.file + .readAsText(path, file) .then((content) => { this.__importJSON(content, path); }) .catch((err) => { - this.uiLog.error(`Could not read json file ${JSON.stringify(err)}` ); + this.uiLog.error(`Could not read json file ${JSON.stringify(err)}`); reject(err); - }); }); } - private async __importJSON(_content: string, _importPath: string) { const parsedContent = JSON.parse(_content); this.uiLog.log('Parsed import data successfully'); @@ -778,91 +941,120 @@ export class SettingsPage implements OnInit { if (!parsedContent[this.uiVersionStorage.getDBPath()]) { parsedContent[this.uiVersionStorage.getDBPath()] = []; } - if (parsedContent[this.uiPreparationStorage.getDBPath()] && + if ( + parsedContent[this.uiPreparationStorage.getDBPath()] && parsedContent[this.uiBeanStorage.getDBPath()] && parsedContent[this.uiBrewStorage.getDBPath()] && - parsedContent[this.uiSettingsStorage.getDBPath()]) { - + parsedContent[this.uiSettingsStorage.getDBPath()] + ) { this.uiLog.log('All data existing'); - this.__cleanupImportSettingsData(parsedContent[this.uiSettingsStorage.getDBPath()]); + this.__cleanupImportSettingsData( + parsedContent[this.uiSettingsStorage.getDBPath()] + ); // When exporting the value is a number, when importing it needs to be a string. - parsedContent['SETTINGS'][0]['brew_view'] = parsedContent['SETTINGS'][0]['brew_view'] + ''; + parsedContent['SETTINGS'][0]['brew_view'] = + parsedContent['SETTINGS'][0]['brew_view'] + ''; this.uiLog.log('Cleaned all data'); try { - if (!parsedContent['SETTINGS'][0]['brew_order']['before'] === undefined) { + if ( + !parsedContent['SETTINGS'][0]['brew_order']['before'] === undefined + ) { this.uiLog.log('Old brew order structure'); // Breaking change, we need to throw away the old order types by import const settingsConst = new Settings(); - parsedContent['SETTINGS'][0]['brew_order'] = this.uiHelper.copyData(settingsConst.brew_order); + parsedContent['SETTINGS'][0]['brew_order'] = this.uiHelper.copyData( + settingsConst.brew_order + ); } } catch (ex) { const settingsConst = new Settings(); - parsedContent['SETTINGS'][0]['brew_order'] = this.uiHelper.copyData(settingsConst.brew_order); + parsedContent['SETTINGS'][0]['brew_order'] = this.uiHelper.copyData( + settingsConst.brew_order + ); } await this.uiAlert.showLoadingSpinner(); - this.uiStorage.import(parsedContent).then(async (_data) => { - if (_data.BACKUP === false) { - this.__reinitializeStorages().then(async () => { - this.uiAnalytics.disableTracking(); - this.__initializeSettings(); - - if (!isIOS) { - const brewsData: Array = this.uiBrewStorage.getAllEntries(); - const beansData: Array = this.uiBeanStorage.getAllEntries(); - const preparationData: Array = this.uiPreparationStorage.getAllEntries(); - const millData: Array = this.uiMillStorage.getAllEntries(); - const greenBeanData: Array = this.uiGreenBeanStorage.getAllEntries(); - const roastingMachineData: Array = this.uiRoastingMachineStorage.getAllEntries(); - const waterData: Array = this.uiWaterStorage.getAllEntries(); - - await this._importFiles(brewsData, _importPath); - await this._importFiles(beansData, _importPath); - await this._importFiles(preparationData, _importPath); - await this._importFiles(millData, _importPath); - await this._importFiles(greenBeanData, _importPath); - await this._importFiles(roastingMachineData, _importPath); - await this._importFiles(waterData, _importPath); - } - - if (this.uiBrewStorage.getAllEntries().length > 0 && this.uiMillStorage.getAllEntries().length <= 0) { - // We got an update and we got no mills yet, therefore we add a Standard mill. - const data: Mill = new Mill(); - data.name = 'Standard'; - await this.uiMillStorage.add(data); - - const brews: Array = this.uiBrewStorage.getAllEntries(); - for (const brew of brews) { - brew.mill = data.config.uuid; - await this.uiBrewStorage.update(brew); + this.uiStorage.import(parsedContent).then( + async (_data) => { + if (_data.BACKUP === false) { + this.__reinitializeStorages().then( + async () => { + this.uiAnalytics.disableTracking(); + this.__initializeSettings(); + + if (!isIOS) { + const brewsData: Array = + this.uiBrewStorage.getAllEntries(); + const beansData: Array = + this.uiBeanStorage.getAllEntries(); + const preparationData: Array = + this.uiPreparationStorage.getAllEntries(); + const millData: Array = + this.uiMillStorage.getAllEntries(); + const greenBeanData: Array = + this.uiGreenBeanStorage.getAllEntries(); + const roastingMachineData: Array = + this.uiRoastingMachineStorage.getAllEntries(); + const waterData: Array = + this.uiWaterStorage.getAllEntries(); + + await this._importFiles(brewsData, _importPath); + await this._importFiles(beansData, _importPath); + await this._importFiles(preparationData, _importPath); + await this._importFiles(millData, _importPath); + await this._importFiles(greenBeanData, _importPath); + await this._importFiles(roastingMachineData, _importPath); + await this._importFiles(waterData, _importPath); + } + + if ( + this.uiBrewStorage.getAllEntries().length > 0 && + this.uiMillStorage.getAllEntries().length <= 0 + ) { + // We got an update and we got no mills yet, therefore we add a Standard mill. + const data: Mill = new Mill(); + data.name = 'Standard'; + await this.uiMillStorage.add(data); + + const brews: Array = this.uiBrewStorage.getAllEntries(); + for (const brew of brews) { + brew.mill = data.config.uuid; + await this.uiBrewStorage.update(brew); + } + } + this.setLanguage(); + + this.settings.resetFilter(); + await this.uiSettingsStorage.saveSettings(this.settings); + await this.uiAlert.hideLoadingSpinner(); + await this.uiAlert.showMessage( + this.translate.instant('IMPORT_SUCCESSFULLY') + ); + if (this.settings.matomo_analytics === undefined) { + await this.showAnalyticsInformation(); + } else { + this.uiAnalytics.enableTracking(); + } + }, + async () => { + await this.uiAlert.hideLoadingSpinner(); } - } - this.setLanguage(); - - this.settings.resetFilter(); - await this.uiSettingsStorage.saveSettings(this.settings); - await this.uiAlert.hideLoadingSpinner(); - await this.uiAlert.showMessage(this.translate.instant('IMPORT_SUCCESSFULLY')); - if (this.settings.matomo_analytics === undefined) { - await this.showAnalyticsInformation(); - } else { - this.uiAnalytics.enableTracking(); - } - }, async () => { + ); + } else { await this.uiAlert.hideLoadingSpinner(); - }); - - } else { + this.uiAlert.showMessage( + this.translate.instant('IMPORT_UNSUCCESSFULLY_DATA_NOT_CHANGED') + ); + } + }, + async () => { await this.uiAlert.hideLoadingSpinner(); - this.uiAlert.showMessage(this.translate.instant('IMPORT_UNSUCCESSFULLY_DATA_NOT_CHANGED')); + this.uiAlert.showMessage( + this.translate.instant('IMPORT_UNSUCCESSFULLY_DATA_NOT_CHANGED') + ); } - - }, async () => { - await this.uiAlert.hideLoadingSpinner(); - this.uiAlert.showMessage(this.translate.instant('IMPORT_UNSUCCESSFULLY_DATA_NOT_CHANGED')); - }); - + ); } else { this.uiAlert.showMessage(this.translate.instant('INVALID_FILE_DATA')); } @@ -870,12 +1062,10 @@ export class SettingsPage implements OnInit { private __initializeSettings(): void { this.settings = this.uiSettingsStorage.getSettings(); - } private async __reinitializeStorages(): Promise { return new Promise(async (resolve) => { - await this.uiBeanStorage.reinitializeStorage(); await this.uiPreparationStorage.reinitializeStorage(); await this.uiSettingsStorage.reinitializeStorage(); @@ -889,16 +1079,18 @@ export class SettingsPage implements OnInit { // Wait for every necessary service to be ready before starting the app // Settings and version, will create a new object on start, so we need to wait for this in the end. const beanStorageReadyCallback = this.uiBeanStorage.storageReady(); - const preparationStorageReadyCallback = this.uiPreparationStorage.storageReady(); - const uiSettingsStorageReadyCallback = this.uiSettingsStorage.storageReady(); + const preparationStorageReadyCallback = + this.uiPreparationStorage.storageReady(); + const uiSettingsStorageReadyCallback = + this.uiSettingsStorage.storageReady(); const brewStorageReadyCallback = this.uiBrewStorage.storageReady(); const millStorageReadyCallback = this.uiMillStorage.storageReady(); const versionStorageReadyCallback = this.uiVersionStorage.storageReady(); const greenBeanStorageCallback = this.uiGreenBeanStorage.storageReady(); - const roastingMachineStorageCallback = this.uiRoastingMachineStorage.storageReady(); + const roastingMachineStorageCallback = + this.uiRoastingMachineStorage.storageReady(); const waterStorageCallback = this.uiWaterStorage.storageReady(); - Promise.all([ beanStorageReadyCallback, preparationStorageReadyCallback, @@ -908,15 +1100,16 @@ export class SettingsPage implements OnInit { versionStorageReadyCallback, greenBeanStorageCallback, roastingMachineStorageCallback, - waterStorageCallback - ]).then(async () => { - await this.uiUpdate.checkUpdate(); - resolve(undefined); - }, () => { - resolve(undefined); - }); + waterStorageCallback, + ]).then( + async () => { + await this.uiUpdate.checkUpdate(); + resolve(undefined); + }, + () => { + resolve(undefined); + } + ); }); } - - } diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index a6128fc16..fa1edc25b 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -1,483 +1,487 @@ -import {CUSTOM_ELEMENTS_SCHEMA, NgModule} from '@angular/core'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import {FormatDatePipe} from '../../pipes/formatDate'; -import {KeysPipe} from '../../pipes/keys'; -import {CommonModule} from '@angular/common'; -import {IonicModule} from '@ionic/angular'; -import {AsyncImageComponent} from '../../components/async-image/async-image.component'; -import {RemoveEmptyNumberDirective} from '../../directive/remove-empty-number.directive'; -import {PreventCharacterDirective} from '../../directive/prevent-character.directive'; -import {BrewAddComponent} from '../brew/brew-add/brew-add.component'; -import {BrewPage} from '../brew/brew.page'; -import {BrewDetailComponent} from '../brew/brew-detail/brew-detail.component'; -import {BrewEditComponent} from '../brew/brew-edit/brew-edit.component'; -import {TimerComponent} from '../../components/timer/timer.component'; -import {BrewTimerComponent} from '../../components/brew-timer/brew-timer.component'; -import {FormsModule} from '@angular/forms'; -import {MillPage} from '../mill/mill.page'; -import {MillEditComponent} from '../mill/mill-edit/mill-edit.component'; -import {MillAddComponent} from '../mill/mill-add/mill-add.component'; -import {PreparationPage} from '../preparation/preparation.page'; -import {PreparationAddComponent} from '../preparation/preparation-add/preparation-add.component'; -import {PreparationEditComponent} from '../preparation/preparation-edit/preparation-edit.component'; -import {AboutComponent} from '../info/about/about.component'; -import {ContactComponent} from '../info/contact/contact.component'; -import {CreditsComponent} from '../info/credits/credits.component'; -import {LicencesComponent} from '../info/licences/licences.component'; -import {PrivacyComponent} from '../info/privacy/privacy.component'; -import {TermsComponent} from '../info/terms/terms.component'; -import {ThanksComponent} from '../info/thanks/thanks.component'; -import {InAppBrowser} from '@ionic-native/in-app-browser/ngx'; -import {File} from '@ionic-native/file/ngx'; +import { FormatDatePipe } from '../../pipes/formatDate'; +import { KeysPipe } from '../../pipes/keys'; +import { CommonModule } from '@angular/common'; +import { IonicModule } from '@ionic/angular'; +import { AsyncImageComponent } from '../../components/async-image/async-image.component'; +import { RemoveEmptyNumberDirective } from '../../directive/remove-empty-number.directive'; +import { PreventCharacterDirective } from '../../directive/prevent-character.directive'; +import { BrewAddComponent } from '../brew/brew-add/brew-add.component'; +import { BrewPage } from '../brew/brew.page'; +import { BrewDetailComponent } from '../brew/brew-detail/brew-detail.component'; +import { BrewEditComponent } from '../brew/brew-edit/brew-edit.component'; +import { TimerComponent } from '../../components/timer/timer.component'; +import { BrewTimerComponent } from '../../components/brew-timer/brew-timer.component'; +import { FormsModule } from '@angular/forms'; +import { MillPage } from '../mill/mill.page'; +import { MillEditComponent } from '../mill/mill-edit/mill-edit.component'; +import { MillAddComponent } from '../mill/mill-add/mill-add.component'; +import { PreparationPage } from '../preparation/preparation.page'; +import { PreparationAddComponent } from '../preparation/preparation-add/preparation-add.component'; +import { PreparationEditComponent } from '../preparation/preparation-edit/preparation-edit.component'; +import { AboutComponent } from '../info/about/about.component'; +import { ContactComponent } from '../info/contact/contact.component'; +import { CreditsComponent } from '../info/credits/credits.component'; +import { LicencesComponent } from '../info/licences/licences.component'; +import { PrivacyComponent } from '../info/privacy/privacy.component'; +import { TermsComponent } from '../info/terms/terms.component'; +import { ThanksComponent } from '../info/thanks/thanks.component'; +import { InAppBrowser } from '@ionic-native/in-app-browser/ngx'; +import { File } from '@ionic-native/file/ngx'; import { Device } from '@ionic-native/device/ngx'; -import {FileChooser} from '@ionic-native/file-chooser/ngx'; -import {FilePath} from '@ionic-native/file-path/ngx'; -import {IOSFilePicker} from '@ionic-native/file-picker/ngx'; -import {SocialSharing} from '@ionic-native/social-sharing/ngx'; -import {AppMinimize} from '@ionic-native/app-minimize/ngx'; -import {Keyboard} from '@ionic-native/keyboard/ngx'; -import {ThreeDeeTouch} from '@ionic-native/three-dee-touch/ngx'; -import {Camera} from '@ionic-native/camera/ngx'; -import {ImagePicker} from '@ionic-native/image-picker/ngx'; -import {AndroidPermissions} from '@ionic-native/android-permissions/ngx'; -import {StatusBar} from '@ionic-native/status-bar/ngx'; -import {SplashScreen} from '@ionic-native/splash-screen/ngx'; -import {BeansPage} from '../beans/beans.page'; -import {BeansAddComponent} from '../beans/beans-add/beans-add.component'; -import {BeansEditComponent} from '../beans/beans-edit/beans-edit.component'; -import {HomePage} from '../home/home.page'; -import {StatisticPage} from '../statistic/statistic.page'; -import {SettingsPage} from '../settings/settings.page'; -import {BrewPopoverActionsComponent} from '../brew/brew-popover-actions/brew-popover-actions.component'; -import {LogComponent} from '../info/log/log.component'; -import {LogTextComponent} from '../info/log/log-text/log-text.component'; -import {TranslateModule} from '@ngx-translate/core'; -import {Globalization} from '@ionic-native/globalization/ngx'; -import {AppVersion} from '@ionic-native/app-version/ngx'; -import {EnumToArrayPipe} from '../../pipes/enumToArray'; -import {HelperPage} from '../helper/helper.page'; -import {BrewInformationComponent} from '../../components/brew-information/brew-information.component'; -import {CuppingRadarComponent} from '../../components/cupping-radar/cupping-radar.component'; -import {TooltipDirective} from '../../directive/tooltip.directive'; -import {DashboardPage} from '../dashboard/dashboard.page'; -import {BeanInformationComponent} from '../../components/bean-information/bean-information.component'; -import {BeanPopoverActionsComponent} from '../beans/bean-popover-actions/bean-popover-actions.component'; -import {PreparationPopoverActionsComponent} from '../preparation/preparation-popover-actions/preparation-popover-actions.component'; -import {PreparationInformationCardComponent} from '../../components/preparation-information-card/preparation-information-card.component'; -import {MillInformationCardComponent} from '../../components/mill-information-card/mill-information-card.component'; -import {MillPopoverActionsComponent} from '../mill/mill-popover-actions/mill-popover-actions.component'; -import {BrewFilterComponent} from '../brew/brew-filter/brew-filter.component'; -import {HelperBrewRatioComponent} from '../helper/helper-brew-ratio/helper-brew-ratio.component'; -import {HelperWaterHardnessComponent} from '../helper/helper-water-hardness/helper-water-hardness.component'; -import {BrewParameterPage} from '../brew-parameter/brew-parameter.page'; -import {SortParameterComponent} from '../brew-parameter/sort-parameter/sort-parameter.component'; -import {ManageParameterComponent} from '../brew-parameter/manage-parameter/manage-parameter.component'; -import {DefaultParameterComponent} from '../brew-parameter/default-parameter/default-parameter.component'; -import {InfoComponent} from '../info/info.component'; -import {RouterModule} from '@angular/router'; -import {CustomPopoverComponent} from '../../popover/custom-popover/custom-popover.component'; -import {WelcomePopoverComponent} from '../../popover/welcome-popover/welcome-popover.component'; -import {PreparationAddTypeComponent} from '../preparation/preparation-add-type/preparation-add-type.component'; -import {BeanOverlayDirective} from '../../directive/bean-overlay.directive'; -import {BeanModalSelectComponent} from '../beans/bean-modal-select/bean-modal-select.component'; -import {MillModalSelectComponent} from '../mill/mill-modal-select/mill-modal-select.component'; -import {PreparationModalSelectComponent} from '../preparation/preparation-modal-select/preparation-modal-select.component'; -import {MillOverlayDirective} from '../../directive/mill-overlay.directive'; -import {PreparationOverlayDirective} from '../../directive/preparation-overlay.directive'; -import {DisableDoubleClickDirective} from '../../directive/disable-double-click.directive'; -import {NgxStarsModule} from 'ngx-stars'; -import {BrewCuppingComponent} from '../brew/brew-cupping/brew-cupping.component'; -import {Geolocation} from '@ionic-native/geolocation/ngx'; -import {UpdatePopoverComponent} from '../../popover/update-popover/update-popover.component'; -import {PreparationCustomParametersComponent} from '../preparation/preparation-custom-parameters/preparation-custom-parameters.component'; -import {DefaultCustomParameterComponent} from '../../components/parameter/default-custom-parameter/default-custom-parameter.component'; -import {SortCustomParameterComponent} from '../../components/parameter/sort-custom-parameter/sort-custom-parameter.component'; -import {ManageCustomParameterComponent} from '../../components/parameter/manage-custom-parameter/manage-custom-parameter.component'; -import {BeanSortComponent} from '../beans/bean-sort/bean-sort.component'; -import {BeansDetailComponent} from '../beans/beans-detail/beans-detail.component'; -import {MaxNumberValueDirective} from '../../directive/max-number-value.directive'; -import {DatetimePopoverComponent} from '../../popover/datetime-popover/datetime-popover.component'; -import {MillDetailComponent} from '../mill/mill-detail/mill-detail.component'; -import {PreparationDetailComponent} from '../preparation/preparation-detail/preparation-detail.component'; -import {RoastingSectionPage} from '../roasting-section/roasting-section.page'; -import {GreenBeansPage} from '../roasting-section/green-beans/green-beans.page'; -import {GreenBeanAddComponent} from '../roasting-section/green-beans/green-bean-add/green-bean-add.component'; -import {GreenBeanEditComponent} from '../roasting-section/green-beans/green-bean-edit/green-bean-edit.component'; -import {GreenBeanDetailComponent} from '../roasting-section/green-beans/green-bean-detail/green-bean-detail.component'; -import {GreenBeanPopoverActionsComponent} from '../roasting-section/green-beans/green-bean-popover-actions/green-bean-popover-actions.component'; -import {GreenBeanInformationComponent} from '../../components/green-bean-information/green-bean-information.component'; +import { FileChooser } from '@ionic-native/file-chooser/ngx'; +import { FilePath } from '@ionic-native/file-path/ngx'; +import { IOSFilePicker } from '@ionic-native/file-picker/ngx'; +import { SocialSharing } from '@ionic-native/social-sharing/ngx'; +import { AppMinimize } from '@ionic-native/app-minimize/ngx'; +import { Keyboard } from '@ionic-native/keyboard/ngx'; +import { ThreeDeeTouch } from '@ionic-native/three-dee-touch/ngx'; +import { Camera } from '@ionic-native/camera/ngx'; +import { ImagePicker } from '@ionic-native/image-picker/ngx'; +import { AndroidPermissions } from '@ionic-native/android-permissions/ngx'; +import { StatusBar } from '@ionic-native/status-bar/ngx'; +import { SplashScreen } from '@ionic-native/splash-screen/ngx'; +import { BeansPage } from '../beans/beans.page'; +import { BeansAddComponent } from '../beans/beans-add/beans-add.component'; +import { BeansEditComponent } from '../beans/beans-edit/beans-edit.component'; +import { HomePage } from '../home/home.page'; +import { StatisticPage } from '../statistic/statistic.page'; +import { SettingsPage } from '../settings/settings.page'; +import { BrewPopoverActionsComponent } from '../brew/brew-popover-actions/brew-popover-actions.component'; +import { LogComponent } from '../info/log/log.component'; +import { LogTextComponent } from '../info/log/log-text/log-text.component'; +import { TranslateModule } from '@ngx-translate/core'; +import { Globalization } from '@ionic-native/globalization/ngx'; +import { AppVersion } from '@ionic-native/app-version/ngx'; +import { EnumToArrayPipe } from '../../pipes/enumToArray'; +import { HelperPage } from '../helper/helper.page'; +import { BrewInformationComponent } from '../../components/brew-information/brew-information.component'; +import { CuppingRadarComponent } from '../../components/cupping-radar/cupping-radar.component'; +import { TooltipDirective } from '../../directive/tooltip.directive'; +import { DashboardPage } from '../dashboard/dashboard.page'; +import { BeanInformationComponent } from '../../components/bean-information/bean-information.component'; +import { BeanPopoverActionsComponent } from '../beans/bean-popover-actions/bean-popover-actions.component'; +import { PreparationPopoverActionsComponent } from '../preparation/preparation-popover-actions/preparation-popover-actions.component'; +import { PreparationInformationCardComponent } from '../../components/preparation-information-card/preparation-information-card.component'; +import { MillInformationCardComponent } from '../../components/mill-information-card/mill-information-card.component'; +import { MillPopoverActionsComponent } from '../mill/mill-popover-actions/mill-popover-actions.component'; +import { BrewFilterComponent } from '../brew/brew-filter/brew-filter.component'; +import { HelperBrewRatioComponent } from '../helper/helper-brew-ratio/helper-brew-ratio.component'; +import { HelperWaterHardnessComponent } from '../helper/helper-water-hardness/helper-water-hardness.component'; +import { BrewParameterPage } from '../brew-parameter/brew-parameter.page'; +import { SortParameterComponent } from '../brew-parameter/sort-parameter/sort-parameter.component'; +import { ManageParameterComponent } from '../brew-parameter/manage-parameter/manage-parameter.component'; +import { DefaultParameterComponent } from '../brew-parameter/default-parameter/default-parameter.component'; +import { InfoComponent } from '../info/info.component'; +import { RouterModule } from '@angular/router'; +import { CustomPopoverComponent } from '../../popover/custom-popover/custom-popover.component'; +import { WelcomePopoverComponent } from '../../popover/welcome-popover/welcome-popover.component'; +import { PreparationAddTypeComponent } from '../preparation/preparation-add-type/preparation-add-type.component'; +import { BeanOverlayDirective } from '../../directive/bean-overlay.directive'; +import { BeanModalSelectComponent } from '../beans/bean-modal-select/bean-modal-select.component'; +import { MillModalSelectComponent } from '../mill/mill-modal-select/mill-modal-select.component'; +import { PreparationModalSelectComponent } from '../preparation/preparation-modal-select/preparation-modal-select.component'; +import { MillOverlayDirective } from '../../directive/mill-overlay.directive'; +import { PreparationOverlayDirective } from '../../directive/preparation-overlay.directive'; +import { DisableDoubleClickDirective } from '../../directive/disable-double-click.directive'; +import { NgxStarsModule } from 'ngx-stars'; +import { BrewCuppingComponent } from '../brew/brew-cupping/brew-cupping.component'; +import { Geolocation } from '@ionic-native/geolocation/ngx'; +import { UpdatePopoverComponent } from '../../popover/update-popover/update-popover.component'; +import { PreparationCustomParametersComponent } from '../preparation/preparation-custom-parameters/preparation-custom-parameters.component'; +import { DefaultCustomParameterComponent } from '../../components/parameter/default-custom-parameter/default-custom-parameter.component'; +import { SortCustomParameterComponent } from '../../components/parameter/sort-custom-parameter/sort-custom-parameter.component'; +import { ManageCustomParameterComponent } from '../../components/parameter/manage-custom-parameter/manage-custom-parameter.component'; +import { BeanSortComponent } from '../beans/bean-sort/bean-sort.component'; +import { BeansDetailComponent } from '../beans/beans-detail/beans-detail.component'; +import { MaxNumberValueDirective } from '../../directive/max-number-value.directive'; +import { DatetimePopoverComponent } from '../../popover/datetime-popover/datetime-popover.component'; +import { MillDetailComponent } from '../mill/mill-detail/mill-detail.component'; +import { PreparationDetailComponent } from '../preparation/preparation-detail/preparation-detail.component'; +import { RoastingSectionPage } from '../roasting-section/roasting-section.page'; +import { GreenBeansPage } from '../roasting-section/green-beans/green-beans.page'; +import { GreenBeanAddComponent } from '../roasting-section/green-beans/green-bean-add/green-bean-add.component'; +import { GreenBeanEditComponent } from '../roasting-section/green-beans/green-bean-edit/green-bean-edit.component'; +import { GreenBeanDetailComponent } from '../roasting-section/green-beans/green-bean-detail/green-bean-detail.component'; +import { GreenBeanPopoverActionsComponent } from '../roasting-section/green-beans/green-bean-popover-actions/green-bean-popover-actions.component'; +import { GreenBeanInformationComponent } from '../../components/green-bean-information/green-bean-information.component'; import { Insomnia } from '@ionic-native/insomnia/ngx'; -import {PhotoPopoverComponent} from '../../popover/photo-popover/photo-popover.component'; -import {PhotoAddComponent} from '../../components/photo-add/photo-add.component'; -import {BeanRoastInformationComponent} from '../../components/beans/bean-roast-information/bean-roast-information.component'; -import {BeanGeneralInformationComponent} from '../../components/beans/bean-general-information/bean-general-information.component'; -import {BeanSortInformationComponent} from '../../components/beans/bean-sort-information/bean-sort-information.component'; -import {GreenBeanGeneralInformationComponent} from '../../components/beans/green-bean-general-information/green-bean-general-information.component'; -import {BrewBrewingComponent} from '../../components/brews/brew-brewing/brew-brewing.component'; -import {BeanDetailSortInformationComponent} from '../../components/beans/detail/bean-detail-sort-information/bean-detail-sort-information.component'; -import {GreenBeanSortComponent} from '../roasting-section/green-beans/green-bean-sort/green-bean-sort.component'; -import {RoastingMachineEditComponent} from '../roasting-section/roasting-machine/roasting-machine-edit/roasting-machine-edit.component'; -import {RoastingMachineAddComponent} from '../roasting-section/roasting-machine/roasting-machine-add/roasting-machine-add.component'; -import {RoastingMachineDetailComponent} from '../roasting-section/roasting-machine/roasting-machine-detail/roasting-machine-detail.component'; -import {RoastingMachinePage} from '../roasting-section/roasting-machine/roasting-machine.page'; -import {RoastingMachinePopoverActionsComponent} from '../roasting-section/roasting-machine/roasting-machine-popover-actions/roasting-machine-popover-actions.component'; -import {RoastingMachineInformationCardComponent} from '../../components/roasting-machine-information-card/roasting-machine-information-card.component'; -import {RoastingMachineOverlayDirective} from '../../directive/roasting-machine-overlay.directive'; -import {RoastingMachineModalSelectComponent} from '../roasting-section/roasting-machine/roasting-machine-modal-select/roasting-machine-modal-select.component'; -import {AgVirtualScrollModule} from 'ag-virtual-scroll'; -import {LongPressDirective} from '../../directive/long-press.directive'; -import {ImpressumComponent} from '../info/impressum/impressum.component'; -import {CookieComponent} from '../info/cookie/cookie.component'; -import {FilesystemErrorPopoverComponent} from '../../popover/filesystem-error-popover/filesystem-error-popover.component'; -import {AnalyticsPopoverComponent} from '../../popover/analytics-popover/analytics-popover.component'; -import {Deeplinks} from '@ionic-native/deeplinks/ngx'; -import {BeanArchivePopoverComponent} from '../beans/bean-archive-popover/bean-archive-popover.component'; -import {CuppingFlavorsComponent} from '../../components/cupping-flavors/cupping-flavors.component'; -import {WaterSectionPage} from '../water-section/water-section.page'; -import {WaterPage} from '../water-section/water/water.page'; -import {WaterPopoverActionsComponent} from '../water-section/water/water-popover-actions/water-popover-actions.component'; -import {WaterAddComponent} from '../water-section/water/water-add/water-add.component'; -import {WaterInformationCardComponent} from '../../components/water-information-card/water-information-card.component'; -import {WaterEditComponent} from '../water-section/water/water-edit/water-edit.component'; -import {WaterDetailComponent} from '../water-section/water/water-detail/water-detail.component'; -import {WaterModalSelectComponent} from '../water-section/water/water-modal-select/water-modal-select.component'; -import {WaterOverlayDirective} from '../../directive/water-overlay.directive'; -import {BrewBrixCalculatorComponent} from '../brew/brew-brix-calculator/brew-brix-calculator.component'; -import {BrewBeverageQuantityCalculatorComponent} from '../brew/brew-beverage-quantity-calculator/brew-beverage-quantity-calculator.component'; -import {BrewFlavorPickerComponent} from '../brew/brew-flavor-picker/brew-flavor-picker.component'; -import {BrewChoosePreparationToBrewComponent} from '../brew/brew-choose-preparation-to-brew/brew-choose-preparation-to-brew.component'; -import {ShortPressDirective} from '../../directive/short-press.directive'; -import {ScaleTestPage} from '../scale-test/scale-test.page'; -import {FileTransfer} from '@ionic-native/file-transfer/ngx'; -import {TransformDateDirective} from '../../directive/transform-date'; -import {PreparationEditToolComponent} from '../preparation/preparation-edit-tool/preparation-edit-tool.component'; -import {ListViewParameterComponent} from '../brew-parameter/list-view-parameter/list-view-parameter.component'; -import {ListViewCustomParameterComponent} from '../../components/parameter/list-view-custom-parameter/list-view-custom-parameter.component'; -import {BrewFlowComponent} from '../brew/brew-flow/brew-flow.component'; -import {ScreenOrientation} from '@ionic-native/screen-orientation/ngx'; -import {BeanFilterComponent} from '../beans/bean-filter/bean-filter.component'; -import {ChooseDateOverlayDirective} from '../../directive/choose-date.directive'; -import {BeanPopoverAddComponent} from '../beans/bean-popover-add/bean-popover-add.component'; -import {PhotoViewComponent} from '../../components/photo-view/photo-view.component'; -import {QrCodeScannerPopoverComponent} from '../../popover/qr-code-scanner-popover/qr-code-scanner-popover.component'; -import { - PreparationToolModalSelectComponent -} from '../preparation/preparation-tool-modal-select/preparation-tool-modal-select.component'; -import {PreparationToolOverlayDirective} from '../../directive/preparation-tool-overlay.directive'; +import { PhotoPopoverComponent } from '../../popover/photo-popover/photo-popover.component'; +import { PhotoAddComponent } from '../../components/photo-add/photo-add.component'; +import { BeanRoastInformationComponent } from '../../components/beans/bean-roast-information/bean-roast-information.component'; +import { BeanGeneralInformationComponent } from '../../components/beans/bean-general-information/bean-general-information.component'; +import { BeanSortInformationComponent } from '../../components/beans/bean-sort-information/bean-sort-information.component'; +import { GreenBeanGeneralInformationComponent } from '../../components/beans/green-bean-general-information/green-bean-general-information.component'; +import { BrewBrewingComponent } from '../../components/brews/brew-brewing/brew-brewing.component'; +import { BeanDetailSortInformationComponent } from '../../components/beans/detail/bean-detail-sort-information/bean-detail-sort-information.component'; +import { GreenBeanSortComponent } from '../roasting-section/green-beans/green-bean-sort/green-bean-sort.component'; +import { RoastingMachineEditComponent } from '../roasting-section/roasting-machine/roasting-machine-edit/roasting-machine-edit.component'; +import { RoastingMachineAddComponent } from '../roasting-section/roasting-machine/roasting-machine-add/roasting-machine-add.component'; +import { RoastingMachineDetailComponent } from '../roasting-section/roasting-machine/roasting-machine-detail/roasting-machine-detail.component'; +import { RoastingMachinePage } from '../roasting-section/roasting-machine/roasting-machine.page'; +import { RoastingMachinePopoverActionsComponent } from '../roasting-section/roasting-machine/roasting-machine-popover-actions/roasting-machine-popover-actions.component'; +import { RoastingMachineInformationCardComponent } from '../../components/roasting-machine-information-card/roasting-machine-information-card.component'; +import { RoastingMachineOverlayDirective } from '../../directive/roasting-machine-overlay.directive'; +import { RoastingMachineModalSelectComponent } from '../roasting-section/roasting-machine/roasting-machine-modal-select/roasting-machine-modal-select.component'; +import { AgVirtualScrollModule } from 'ag-virtual-scroll'; +import { LongPressDirective } from '../../directive/long-press.directive'; +import { ImpressumComponent } from '../info/impressum/impressum.component'; +import { CookieComponent } from '../info/cookie/cookie.component'; +import { FilesystemErrorPopoverComponent } from '../../popover/filesystem-error-popover/filesystem-error-popover.component'; +import { AnalyticsPopoverComponent } from '../../popover/analytics-popover/analytics-popover.component'; +import { Deeplinks } from '@ionic-native/deeplinks/ngx'; +import { BeanArchivePopoverComponent } from '../beans/bean-archive-popover/bean-archive-popover.component'; +import { CuppingFlavorsComponent } from '../../components/cupping-flavors/cupping-flavors.component'; +import { WaterSectionPage } from '../water-section/water-section.page'; +import { WaterPage } from '../water-section/water/water.page'; +import { WaterPopoverActionsComponent } from '../water-section/water/water-popover-actions/water-popover-actions.component'; +import { WaterAddComponent } from '../water-section/water/water-add/water-add.component'; +import { WaterInformationCardComponent } from '../../components/water-information-card/water-information-card.component'; +import { WaterEditComponent } from '../water-section/water/water-edit/water-edit.component'; +import { WaterDetailComponent } from '../water-section/water/water-detail/water-detail.component'; +import { WaterModalSelectComponent } from '../water-section/water/water-modal-select/water-modal-select.component'; +import { WaterOverlayDirective } from '../../directive/water-overlay.directive'; +import { BrewBrixCalculatorComponent } from '../brew/brew-brix-calculator/brew-brix-calculator.component'; +import { BrewBeverageQuantityCalculatorComponent } from '../brew/brew-beverage-quantity-calculator/brew-beverage-quantity-calculator.component'; +import { BrewFlavorPickerComponent } from '../brew/brew-flavor-picker/brew-flavor-picker.component'; +import { BrewChoosePreparationToBrewComponent } from '../brew/brew-choose-preparation-to-brew/brew-choose-preparation-to-brew.component'; +import { ShortPressDirective } from '../../directive/short-press.directive'; +import { FileTransfer } from '@ionic-native/file-transfer/ngx'; +import { TransformDateDirective } from '../../directive/transform-date'; +import { PreparationEditToolComponent } from '../preparation/preparation-edit-tool/preparation-edit-tool.component'; +import { ListViewParameterComponent } from '../brew-parameter/list-view-parameter/list-view-parameter.component'; +import { ListViewCustomParameterComponent } from '../../components/parameter/list-view-custom-parameter/list-view-custom-parameter.component'; +import { BrewFlowComponent } from '../brew/brew-flow/brew-flow.component'; +import { ScreenOrientation } from '@ionic-native/screen-orientation/ngx'; +import { BeanFilterComponent } from '../beans/bean-filter/bean-filter.component'; +import { ChooseDateOverlayDirective } from '../../directive/choose-date.directive'; +import { BeanPopoverAddComponent } from '../beans/bean-popover-add/bean-popover-add.component'; +import { PhotoViewComponent } from '../../components/photo-view/photo-view.component'; +import { QrCodeScannerPopoverComponent } from '../../popover/qr-code-scanner-popover/qr-code-scanner-popover.component'; +import { PreparationToolModalSelectComponent } from '../preparation/preparation-tool-modal-select/preparation-tool-modal-select.component'; +import { PreparationToolOverlayDirective } from '../../directive/preparation-tool-overlay.directive'; +import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-devices'; @NgModule({ - declarations: [ - SettingsPage, - StatisticPage, - HomePage, - BrewParameterPage, - DashboardPage, - RoastingSectionPage, - WaterSectionPage, - WaterPage, - GreenBeansPage, - GreenBeanAddComponent, - GreenBeanEditComponent, - GreenBeanDetailComponent, - GreenBeanPopoverActionsComponent, - GreenBeanInformationComponent, - BeansPage, HelperPage, BeansAddComponent, - BrewFlowComponent, - BeansEditComponent, - BeansDetailComponent, - AboutComponent, - ContactComponent, - InfoComponent, - CookieComponent, - ImpressumComponent, - PreparationAddTypeComponent, - CustomPopoverComponent, - FilesystemErrorPopoverComponent, - WelcomePopoverComponent, - AnalyticsPopoverComponent, - QrCodeScannerPopoverComponent, - UpdatePopoverComponent, - DatetimePopoverComponent, - CreditsComponent, - LicencesComponent, - PrivacyComponent, - DefaultParameterComponent, - SortParameterComponent, - ManageParameterComponent, - HelperBrewRatioComponent, - HelperWaterHardnessComponent, - BrewCuppingComponent, - TermsComponent, - ThanksComponent, - LogComponent, - LogTextComponent, - PreparationPage, - PreparationAddComponent, - PreparationEditComponent, - PreparationEditToolComponent, - ListViewCustomParameterComponent, - ListViewParameterComponent, - PreparationCustomParametersComponent, - MillPage, - MillEditComponent, - MillDetailComponent, - PreparationDetailComponent, - BrewFilterComponent, - BeanFilterComponent, - BeanSortComponent, - MillAddComponent, - BrewAddComponent, - BrewBrixCalculatorComponent, - BrewChoosePreparationToBrewComponent, - BrewFlavorPickerComponent, - BrewBeverageQuantityCalculatorComponent, - FormatDatePipe, - KeysPipe, - EnumToArrayPipe, - AsyncImageComponent, - BrewInformationComponent, - BeanInformationComponent, - PreparationInformationCardComponent, - MillInformationCardComponent, - WaterInformationCardComponent, - WaterEditComponent, - WaterDetailComponent, - CuppingRadarComponent, - CuppingFlavorsComponent, - RemoveEmptyNumberDirective, - PreventCharacterDirective, - MaxNumberValueDirective, - LongPressDirective, - ShortPressDirective, - BeanOverlayDirective, - MillOverlayDirective, - RoastingMachineOverlayDirective, - PreparationOverlayDirective, - PreparationToolOverlayDirective, - WaterOverlayDirective, - ChooseDateOverlayDirective, - TooltipDirective, - TransformDateDirective, - DisableDoubleClickDirective, - BrewPage, - ScaleTestPage, - BrewDetailComponent, - BrewEditComponent, - PhotoPopoverComponent, - WaterPopoverActionsComponent, - BrewPopoverActionsComponent, - BeanPopoverActionsComponent, - BeanPopoverAddComponent, - BeanArchivePopoverComponent, - MillPopoverActionsComponent, - BeanModalSelectComponent, - WaterModalSelectComponent, - RoastingMachineModalSelectComponent, - MillModalSelectComponent, - PreparationModalSelectComponent, - PreparationToolModalSelectComponent, - PreparationPopoverActionsComponent, - TimerComponent, - DefaultCustomParameterComponent, - SortCustomParameterComponent, - ManageCustomParameterComponent, - BrewTimerComponent, - PhotoAddComponent, - PhotoViewComponent, - BeanRoastInformationComponent, - BeanGeneralInformationComponent, - BeanSortInformationComponent, - GreenBeanGeneralInformationComponent, - BrewBrewingComponent, - BeanDetailSortInformationComponent, - GreenBeanSortComponent, - RoastingMachineInformationCardComponent, - RoastingMachineEditComponent, - RoastingMachineAddComponent, - RoastingMachineDetailComponent, - RoastingMachinePage, - RoastingMachinePopoverActionsComponent, - WaterAddComponent - ], - imports: [ - CommonModule, - IonicModule, - FormsModule, - TranslateModule, - RouterModule, - NgxStarsModule, - AgVirtualScrollModule - ], - providers: [ - AppVersion, - StatusBar, - SplashScreen, - RemoveEmptyNumberDirective, PreventCharacterDirective, - MaxNumberValueDirective, - LongPressDirective, - ShortPressDirective, - BeanOverlayDirective, - MillOverlayDirective, - RoastingMachineOverlayDirective, - PreparationOverlayDirective, - PreparationToolOverlayDirective, - WaterOverlayDirective, - ChooseDateOverlayDirective, - TooltipDirective, - TransformDateDirective, - DisableDoubleClickDirective, - FormatDatePipe, KeysPipe, EnumToArrayPipe, - InAppBrowser, - File, - Device, - FileChooser, - FilePath, - IOSFilePicker, - SocialSharing, - AppMinimize, - Keyboard, - ThreeDeeTouch, - Camera, ImagePicker, AndroidPermissions, - InAppBrowser, Globalization, - Geolocation, - Insomnia, - Deeplinks, - FileTransfer, - ScreenOrientation - ], - exports: [ - SettingsPage, - StatisticPage, - HomePage, - BrewParameterPage, - BeansPage, - HelperPage, - RoastingSectionPage, - WaterSectionPage, - WaterPage, - GreenBeansPage, - BeansAddComponent, - BrewFlowComponent, - BeansEditComponent, - GreenBeanAddComponent, - GreenBeanEditComponent, - GreenBeanDetailComponent, - GreenBeanPopoverActionsComponent, - GreenBeanInformationComponent, - BeansDetailComponent, - AboutComponent, - ContactComponent, - InfoComponent, - CookieComponent, - ImpressumComponent, - PreparationAddTypeComponent, - CustomPopoverComponent, - FilesystemErrorPopoverComponent, - WelcomePopoverComponent, - AnalyticsPopoverComponent, - QrCodeScannerPopoverComponent, - UpdatePopoverComponent, - DatetimePopoverComponent, - CreditsComponent, - LicencesComponent, - PrivacyComponent, - DefaultParameterComponent, - SortParameterComponent, - ManageParameterComponent, - HelperBrewRatioComponent, - HelperWaterHardnessComponent, - BrewCuppingComponent, - TermsComponent, - ThanksComponent, - PreparationPage, - PreparationAddComponent, - PreparationEditComponent, - PreparationEditToolComponent, - ListViewCustomParameterComponent, - ListViewParameterComponent, - PreparationCustomParametersComponent, - BrewFilterComponent, - BeanFilterComponent, - BeanSortComponent, - MillPage, - MillEditComponent, - MillDetailComponent, - PreparationDetailComponent, - MillAddComponent, - BrewAddComponent, - BrewBrixCalculatorComponent, - BrewChoosePreparationToBrewComponent, - BrewFlavorPickerComponent, - BrewBeverageQuantityCalculatorComponent, - FormatDatePipe, - KeysPipe, - EnumToArrayPipe, - AsyncImageComponent, - BrewInformationComponent, - BeanInformationComponent, - PreparationInformationCardComponent, - MillInformationCardComponent, - WaterInformationCardComponent, - WaterEditComponent, - WaterDetailComponent, - CuppingRadarComponent, - CuppingFlavorsComponent, - RemoveEmptyNumberDirective, - PreventCharacterDirective, - MaxNumberValueDirective, - LongPressDirective, - ShortPressDirective, - BeanOverlayDirective, - MillOverlayDirective, - RoastingMachineOverlayDirective, - PreparationOverlayDirective, - PreparationToolOverlayDirective, - WaterOverlayDirective, - ChooseDateOverlayDirective, - TooltipDirective, - TransformDateDirective, - DisableDoubleClickDirective, - BrewPage, - ScaleTestPage, - BrewDetailComponent, - BrewEditComponent, - PhotoPopoverComponent, - BrewPopoverActionsComponent, - WaterPopoverActionsComponent, - BeanPopoverActionsComponent, - BeanPopoverAddComponent, - BeanArchivePopoverComponent, - BeanModalSelectComponent, - WaterModalSelectComponent, - RoastingMachineModalSelectComponent, - MillModalSelectComponent, - PreparationModalSelectComponent, - PreparationToolModalSelectComponent, - MillPopoverActionsComponent, - PreparationPopoverActionsComponent, - TimerComponent, - DefaultCustomParameterComponent, - SortCustomParameterComponent, - ManageCustomParameterComponent, - BrewTimerComponent, - PhotoAddComponent, - PhotoViewComponent, - BeanRoastInformationComponent, - BeanGeneralInformationComponent, - BeanSortInformationComponent, - GreenBeanGeneralInformationComponent, - BrewBrewingComponent, - BeanDetailSortInformationComponent, - GreenBeanSortComponent, - RoastingMachineInformationCardComponent, - RoastingMachineEditComponent, - RoastingMachineAddComponent, - RoastingMachineDetailComponent, - RoastingMachinePage, - RoastingMachinePopoverActionsComponent, - WaterAddComponent - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] + declarations: [ + SettingsPage, + StatisticPage, + HomePage, + BrewParameterPage, + DashboardPage, + RoastingSectionPage, + WaterSectionPage, + WaterPage, + GreenBeansPage, + GreenBeanAddComponent, + GreenBeanEditComponent, + GreenBeanDetailComponent, + GreenBeanPopoverActionsComponent, + GreenBeanInformationComponent, + BeansPage, + HelperPage, + BeansAddComponent, + BrewFlowComponent, + BeansEditComponent, + BeansDetailComponent, + AboutComponent, + ContactComponent, + InfoComponent, + CookieComponent, + ImpressumComponent, + PreparationAddTypeComponent, + CustomPopoverComponent, + FilesystemErrorPopoverComponent, + WelcomePopoverComponent, + AnalyticsPopoverComponent, + QrCodeScannerPopoverComponent, + UpdatePopoverComponent, + DatetimePopoverComponent, + CreditsComponent, + LicencesComponent, + PrivacyComponent, + DefaultParameterComponent, + SortParameterComponent, + ManageParameterComponent, + HelperBrewRatioComponent, + HelperWaterHardnessComponent, + BrewCuppingComponent, + TermsComponent, + ThanksComponent, + LogComponent, + LogTextComponent, + PreparationPage, + PreparationAddComponent, + PreparationEditComponent, + PreparationEditToolComponent, + ListViewCustomParameterComponent, + ListViewParameterComponent, + PreparationCustomParametersComponent, + MillPage, + MillEditComponent, + MillDetailComponent, + PreparationDetailComponent, + BrewFilterComponent, + BeanFilterComponent, + BeanSortComponent, + MillAddComponent, + BrewAddComponent, + BrewBrixCalculatorComponent, + BrewChoosePreparationToBrewComponent, + BrewFlavorPickerComponent, + BrewBeverageQuantityCalculatorComponent, + FormatDatePipe, + KeysPipe, + EnumToArrayPipe, + AsyncImageComponent, + BrewInformationComponent, + BeanInformationComponent, + PreparationInformationCardComponent, + MillInformationCardComponent, + WaterInformationCardComponent, + WaterEditComponent, + WaterDetailComponent, + CuppingRadarComponent, + CuppingFlavorsComponent, + RemoveEmptyNumberDirective, + PreventCharacterDirective, + MaxNumberValueDirective, + LongPressDirective, + ShortPressDirective, + BeanOverlayDirective, + MillOverlayDirective, + RoastingMachineOverlayDirective, + PreparationOverlayDirective, + PreparationToolOverlayDirective, + WaterOverlayDirective, + ChooseDateOverlayDirective, + TooltipDirective, + TransformDateDirective, + DisableDoubleClickDirective, + BrewPage, + + BrewDetailComponent, + BrewEditComponent, + PhotoPopoverComponent, + WaterPopoverActionsComponent, + BrewPopoverActionsComponent, + BeanPopoverActionsComponent, + BeanPopoverAddComponent, + BeanArchivePopoverComponent, + MillPopoverActionsComponent, + BeanModalSelectComponent, + WaterModalSelectComponent, + RoastingMachineModalSelectComponent, + MillModalSelectComponent, + PreparationModalSelectComponent, + PreparationToolModalSelectComponent, + PreparationPopoverActionsComponent, + TimerComponent, + DefaultCustomParameterComponent, + SortCustomParameterComponent, + ManageCustomParameterComponent, + BrewTimerComponent, + PhotoAddComponent, + PhotoViewComponent, + BeanRoastInformationComponent, + BeanGeneralInformationComponent, + BeanSortInformationComponent, + GreenBeanGeneralInformationComponent, + BrewBrewingComponent, + BeanDetailSortInformationComponent, + GreenBeanSortComponent, + RoastingMachineInformationCardComponent, + RoastingMachineEditComponent, + RoastingMachineAddComponent, + RoastingMachineDetailComponent, + RoastingMachinePage, + RoastingMachinePopoverActionsComponent, + WaterAddComponent, + ], + imports: [ + CommonModule, + IonicModule, + FormsModule, + TranslateModule, + RouterModule, + NgxStarsModule, + AgVirtualScrollModule, + ], + providers: [ + AppVersion, + StatusBar, + SplashScreen, + RemoveEmptyNumberDirective, + PreventCharacterDirective, + MaxNumberValueDirective, + LongPressDirective, + ShortPressDirective, + BeanOverlayDirective, + MillOverlayDirective, + RoastingMachineOverlayDirective, + PreparationOverlayDirective, + PreparationToolOverlayDirective, + WaterOverlayDirective, + ChooseDateOverlayDirective, + TooltipDirective, + TransformDateDirective, + DisableDoubleClickDirective, + FormatDatePipe, + KeysPipe, + EnumToArrayPipe, + InAppBrowser, + File, + Device, + FileChooser, + FilePath, + IOSFilePicker, + SocialSharing, + AppMinimize, + Keyboard, + ThreeDeeTouch, + Camera, + ImagePicker, + AndroidPermissions, + InAppBrowser, + Globalization, + Geolocation, + Insomnia, + Deeplinks, + FileTransfer, + ScreenOrientation, + ], + exports: [ + SettingsPage, + StatisticPage, + HomePage, + BrewParameterPage, + BeansPage, + HelperPage, + RoastingSectionPage, + WaterSectionPage, + WaterPage, + GreenBeansPage, + BeansAddComponent, + BrewFlowComponent, + BeansEditComponent, + GreenBeanAddComponent, + GreenBeanEditComponent, + GreenBeanDetailComponent, + GreenBeanPopoverActionsComponent, + GreenBeanInformationComponent, + BeansDetailComponent, + AboutComponent, + ContactComponent, + InfoComponent, + CookieComponent, + ImpressumComponent, + PreparationAddTypeComponent, + CustomPopoverComponent, + FilesystemErrorPopoverComponent, + WelcomePopoverComponent, + AnalyticsPopoverComponent, + QrCodeScannerPopoverComponent, + UpdatePopoverComponent, + DatetimePopoverComponent, + CreditsComponent, + LicencesComponent, + PrivacyComponent, + DefaultParameterComponent, + SortParameterComponent, + ManageParameterComponent, + HelperBrewRatioComponent, + HelperWaterHardnessComponent, + BrewCuppingComponent, + TermsComponent, + ThanksComponent, + PreparationPage, + PreparationAddComponent, + PreparationEditComponent, + PreparationEditToolComponent, + ListViewCustomParameterComponent, + ListViewParameterComponent, + PreparationCustomParametersComponent, + BrewFilterComponent, + BeanFilterComponent, + BeanSortComponent, + MillPage, + MillEditComponent, + MillDetailComponent, + PreparationDetailComponent, + MillAddComponent, + BrewAddComponent, + BrewBrixCalculatorComponent, + BrewChoosePreparationToBrewComponent, + BrewFlavorPickerComponent, + BrewBeverageQuantityCalculatorComponent, + FormatDatePipe, + KeysPipe, + EnumToArrayPipe, + AsyncImageComponent, + BrewInformationComponent, + BeanInformationComponent, + PreparationInformationCardComponent, + MillInformationCardComponent, + WaterInformationCardComponent, + WaterEditComponent, + WaterDetailComponent, + CuppingRadarComponent, + CuppingFlavorsComponent, + RemoveEmptyNumberDirective, + PreventCharacterDirective, + MaxNumberValueDirective, + LongPressDirective, + ShortPressDirective, + BeanOverlayDirective, + MillOverlayDirective, + RoastingMachineOverlayDirective, + PreparationOverlayDirective, + PreparationToolOverlayDirective, + WaterOverlayDirective, + ChooseDateOverlayDirective, + TooltipDirective, + TransformDateDirective, + DisableDoubleClickDirective, + BrewPage, + BrewDetailComponent, + BrewEditComponent, + PhotoPopoverComponent, + BrewPopoverActionsComponent, + WaterPopoverActionsComponent, + BeanPopoverActionsComponent, + BeanPopoverAddComponent, + BeanArchivePopoverComponent, + BeanModalSelectComponent, + WaterModalSelectComponent, + RoastingMachineModalSelectComponent, + MillModalSelectComponent, + PreparationModalSelectComponent, + PreparationToolModalSelectComponent, + MillPopoverActionsComponent, + PreparationPopoverActionsComponent, + TimerComponent, + DefaultCustomParameterComponent, + SortCustomParameterComponent, + ManageCustomParameterComponent, + BrewTimerComponent, + PhotoAddComponent, + PhotoViewComponent, + BeanRoastInformationComponent, + BeanGeneralInformationComponent, + BeanSortInformationComponent, + GreenBeanGeneralInformationComponent, + BrewBrewingComponent, + BeanDetailSortInformationComponent, + GreenBeanSortComponent, + RoastingMachineInformationCardComponent, + RoastingMachineEditComponent, + RoastingMachineAddComponent, + RoastingMachineDetailComponent, + RoastingMachinePage, + RoastingMachinePopoverActionsComponent, + WaterAddComponent, + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], }) -export class SharedModule { -} +export class SharedModule {} diff --git a/src/classes/devices/acaia/acaia.ts b/src/classes/devices/acaia/acaia.ts deleted file mode 100644 index 276f86627..000000000 --- a/src/classes/devices/acaia/acaia.ts +++ /dev/null @@ -1,643 +0,0 @@ -import { Platforms } from '@ionic/core'; -// Converted to TypeScript from Python from https://github.com/lucapinello/pyacaia -import { Characteristic } from '../ble.types'; -import { - MAGIC1, - MAGIC2, - PYXIS_RX_CHARACTERISTIC_UUID, - PYXIS_TX_CHARACTERISTIC_UUID, - SCALE_CHARACTERISTIC_UUID, -} from './constants'; -import { - Button, - DecoderResultType, - MessageType, - ParsedMessage, - ScaleMessageType, - Units, - WorkerResult, -} from './common'; -import { memoize } from 'lodash'; -import { UILog } from '../../../services/uiLog'; -import { Logger } from '../common/logger'; -import { DEBUG } from '../common/constants'; -import { to128bitUUID } from '../common/util'; - -declare var ble; - -export enum EventType { - WEIGHT, - TIMER_START, - TIMER_STOP, - TIMER_RESET, - TARE, - SETTINGS, -} - -const log = (...args) => { - if (DEBUG) { - try { - UILog.getInstance().log(`ACAIA: ${JSON.stringify(args)}`); - } catch (e) {} - } -}; - -// DecodeWorkers receives array buffer from heartbeat notification and emits parsed messages if any -class DecoderWorker { - private readonly worker: Worker; - private readonly decodeCallback: (msgs: ParsedMessage[]) => any; - private readonly logger: Logger; - - private loading: Promise; - - constructor(callback: (msgs: ParsedMessage[]) => any) { - this.decodeCallback = callback; - this.logger = new Logger('ACAIA DecodeWorker container'); - - if (typeof Worker !== 'undefined') { - this.logger.log('Workers are supported. Creating a decode worker...'); - this.worker = new Worker(new URL('./decode.worker', import.meta.url)); - this.worker.onmessage = this.handleMessage.bind(this); - } else { - this.logger.log('Workers are NOT supported. Import decoder...'); - // fallback to running in setTimeout - // dynamically imoprt './decoder' to prevent webpack including the code when we have Workers - this.loading = import('./decoder') - .then(({ Decoder }) => { - this.logger.debug('Decoder is imported, initalizing...'); - const l = new Logger('ACAIA DecodeWorker'); - const decoder = new Decoder(l.debug.bind(l)); - // @ts-ignore - this.worker = { - postMessage: (message) => { - // pretend that we are doing it in parallel - setTimeout(() => { - const result = decoder.process(message); - if (result) { - setTimeout(() => { - this.handleMessage({ data: result }); - }); - } - }); - }, - }; - }) - .catch(this.logger.error.bind(this.logger)); - } - } - - public addBuffer(buffer: ArrayBuffer) { - if (this.worker) { - this.worker.postMessage(buffer, [buffer]); - } else { - this.loading.then(() => this.addBuffer(buffer)); - } - } - - private handleMessage({ data }) { - this.logger.debug('Decoder sent a message', data); - if ( - data instanceof Object && - data.hasOwnProperty('type') && - data.hasOwnProperty('data') - ) { - switch ((data as WorkerResult).type) { - case DecoderResultType.LOG: - this.logger.debug(...data.data); - break; - case DecoderResultType.DECODE_RESULT: - this.decodeCallback(data.data); - break; - } - } - } -} - -const HEARTBEAT_INTERVAL = 1000; - -export class AcaiaScale { - private readonly device_id: string; - private rx_char_uuid: string; - private tx_char_uuid: string; - private weight_uuid: string; - - private isPyxisStyle: boolean; - private readonly characteristics: Characteristic[]; - - private platforms: Platforms[]; - - private worker: DecoderWorker; - - private readonly logger: Logger; - - private connected: boolean; - private packet: Uint8Array; - private last_heartbeat: number; - - private timer_start_time: number; - private paused_time: number; - private readonly transit_delay: number; - private weight: number; - private battery: number; - private units: Units; - private auto_off: boolean; - private beep_on: boolean; - private timer_running: boolean; - - private command_queue: ArrayBuffer[]; - private set_interval_thread: ReturnType; - private callback: (eventType: EventType, data?: any) => any; - - private heartbeat_monitor_interval: ReturnType; - - constructor( - device_id: string, - platforms: Platforms[], - characteristics: Characteristic[] - ) { - /*For Pyxis-style devices, the UUIDs can be overridden. char_uuid - is the command UUID, and weight_uuid is where the notify comes - from. Old-style scales only specify char_uuid - */ - this.device_id = device_id; - this.platforms = platforms; - this.connected = false; - - this.logger = new Logger(); - - // TODO(mike1808): make it to work with new Lunar and Pyxis by auto-detecting service and char uuid - this.logger.info( - 'received characteristics: ', - JSON.stringify(characteristics) - ); - this.characteristics = characteristics; - this.isPyxisStyle = false; - - if (!this.findBLEUUIDs()) { - throw new Error( - 'Cannot find weight service and characteristics on the scale' - ); - } - - // this.char_uuid = SCALE_CHARACTERISTIC_UUID; - // this.weight_uuid = SCALE_SERVICE_UUID; - - this.command_queue = []; - this.packet = null; - this.set_interval_thread = null; - this.last_heartbeat = 0; - this.timer_start_time = 0; - this.paused_time = 0; - this.transit_delay = 200; - this.weight = null; - this.battery = null; - this.units = null; - this.auto_off = null; - this.beep_on = null; - this.timer_running = false; - } - - public getElapsedTime(): number { - if (this.timer_running) { - return Date.now() - this.timer_start_time + this.transit_delay; - } else { - return this.paused_time; - } - } - - public async connect(callback) { - this.logger.log('Connect scale'); - if (this.connected) { - this.logger.log('Already connected, bail.'); - return; - } - - this.callback = callback; - - if (!this.platforms.includes('ios')) { - try { - await promisify(ble.requestMtu)(this.device_id, 247); - } catch (e) { - this.logger.error('failed to set MTU' + JSON.stringify(e)); - } - } - - this.worker = new DecoderWorker(this.messageParseCallback.bind(this)); - this.logger.log('Subscribing to notifications', { - device_id: this.device_id, - weight_uuid: this.weight_uuid, - char_uuid: this.rx_char_uuid, - }); - - // We moved this line from notifications ready to here. - this.connected = true; - - ble.startNotification( - this.device_id, - this.weight_uuid, - this.rx_char_uuid, - this.handleNotification.bind(this), - (err) => { - this.logger.error( - 'failed to subscribe to notifications ' + JSON.stringify(err) - ); - this.disconnect().catch(this.logger.error.bind(this.logger)); - } - ); - - await this.write(new Uint8Array([0, 1]).buffer); - - await this.notificationsReady(); - - this.startHeartbeatMonitor(); - } - - public disconnectTriggered() { - this.logger.debug('Scale disconnect triggered'); - // Class is still existing, therefore we should do something good maybe? - this.connected = false; - this.stopHeartbeatMonitor(); - } - - public async disconnect() { - this.logger.debug('Scale disconnected'); - this.stopHeartbeatMonitor(); - if (this.connected) { - if (this.device_id && this.weight_uuid && this.tx_char_uuid) { - this.logger.debug('Disconnect the device with its characteristics'); - // Lars - I don't know if we need this, but the problem is when the scale is disconnected via settings, or shutdown, it will crash everything. - // Try catch won't help here, because the device is already deattached. - // await promisify(ble.stopNotification)((this.device_id, this.weight_uuid, this.tx_char_uuid)); - } else { - this.logger.debug( - 'We cant disconnect because one of the characteristics is missing' + - JSON.stringify({ - device_id: this.device_id, - weight: this.weight_uuid, - char_uuid: this.tx_char_uuid, - }) - ); - } - this.connected = false; - } - } - - public tare() { - if (!this.connected) { - return false; - } - - this.logger.debug('taring...'); - this.command_queue.push(encodeTare()); - return true; - } - - public startTimer() { - if (!this.connected) { - return false; - } - this.logger.debug('start timer...'); - this.command_queue.push(encodeStartTimer()); - this.timer_start_time = Date.now(); - this.timer_running = true; - return true; - } - - public stopTimer() { - if (!this.connected) { - return false; - } - this.logger.debug('stop timer...'); - this.command_queue.push(encodeStopTimer()); - this.paused_time = Date.now() - this.timer_start_time; - this.timer_running = false; - return true; - } - - public resetTimer() { - if (!this.connected) { - return false; - } - this.logger.debug('reset timer...'); - this.command_queue.push(encodeResetTimer()); - this.paused_time = 0; - this.timer_running = false; - } - - private findBLEUUIDs() { - let foundRx = false; - let foundTx = false; - for (const char of this.characteristics) { - if ( - to128bitUUID(char.characteristic) === - to128bitUUID(SCALE_CHARACTERISTIC_UUID) - ) { - this.rx_char_uuid = char.characteristic.toLowerCase(); - this.tx_char_uuid = char.characteristic.toLowerCase(); - this.weight_uuid = char.service.toLowerCase(); - this.isPyxisStyle = false; - foundRx = true; - foundTx = true; - } else if ( - to128bitUUID(char.characteristic) === - to128bitUUID(PYXIS_RX_CHARACTERISTIC_UUID) - ) { - this.rx_char_uuid = char.characteristic.toLowerCase(); - foundRx = true; - } else if ( - to128bitUUID(char.characteristic) === - to128bitUUID(PYXIS_TX_CHARACTERISTIC_UUID) - ) { - this.tx_char_uuid = char.characteristic.toLowerCase(); - this.weight_uuid = char.service.toLowerCase(); - this.isPyxisStyle = true; - foundTx = true; - } - this.logger.log('findBleeUIDS', { - device_id: this.device_id, - weight_uuid: this.weight_uuid, - char_uuid: this.rx_char_uuid, - isPyxis: this.isPyxisStyle, - foundRx: foundRx, - foundTx: foundTx, - - }); - if (foundRx && foundTx) { - return true; - } - } - return false; - } - - private handleNotification(value: ArrayBuffer) { - if (this.connected) { - this.worker.addBuffer(value); - this.heartbeat(); - } - } - - private startHeartbeatMonitor() { - this.heartbeat_monitor_interval = setInterval(async () => { - if (Date.now() > this.last_heartbeat + HEARTBEAT_INTERVAL) { - await this.initScales(); - this.logger.info('Sent heartbeat reviving request.'); - } - }, HEARTBEAT_INTERVAL * 2); - } - - private stopHeartbeatMonitor() { - if (this.heartbeat_monitor_interval) { - clearInterval(this.heartbeat_monitor_interval); - this.heartbeat_monitor_interval = null; - } - } - - private messageParseCallback(messages: ParsedMessage[]) { - messages.forEach((msg) => { - this.logger.debug('Message recieved - ' + JSON.stringify(msg)); - if (msg.type === MessageType.SETTINGS) { - this.battery = msg.battery; - this.units = msg.units; - this.auto_off = msg.autoOff; - this.beep_on = msg.beepOn; - this.callback(EventType.SETTINGS); - } else if (msg.type === MessageType.MESSAGE) { - if (msg.msgType === ScaleMessageType.WEIGHT) { - this.weight = msg.weight; - this.callback(EventType.WEIGHT, this.weight); - this.logger.debug('weight: ' + msg.weight + ' ' + Date.now()); - } else if (msg.msgType === ScaleMessageType.TARE_START_STOP_RESET) { - if (msg.button === 'unknown') { - if (this.timer_running) { - msg.button = Button.STOP; - } else if (this.paused_time > 0) { - msg.button = Button.RESET; - } - } - switch (msg.button) { - case Button.TARE: - this.weight = 0; - this.callback(EventType.TARE, 0); - break; - case Button.START: - this.timer_start_time = - Date.now() - this.paused_time + this.transit_delay; - this.timer_running = true; - this.callback(EventType.TIMER_START, this.timer_start_time); - break; - case Button.STOP: - this.paused_time = msg.time; - this.timer_running = false; - this.callback(EventType.TIMER_STOP, this.paused_time); - break; - case Button.RESET: - this.paused_time = 0; - this.timer_running = false; - this.callback(EventType.TIMER_RESET, 0); - break; - } - } - } - }); - } - - public isConnected(): boolean { - return this.connected; - } - - private async initScales() { - await this.ident(); - this.last_heartbeat = Date.now(); - } - - private async notificationsReady() { - await this.initScales(); - this.logger.info('Scale Ready!'); - } - - private write(data: ArrayBuffer, withoutResponse = false) { - this.logger.debug('trying to write: ', new Uint8Array(data)); - return new Promise((resolve) => { - if (this.connected) { - ble[withoutResponse ? 'writeWithoutResponse' : 'write']( - this.device_id, - this.weight_uuid, - this.tx_char_uuid, - data, - resolve, - (err) => { - this.logger.error( - 'failed to write to characteristic, but we are ignoring it', - err, - withoutResponse - ); - resolve(false); // resolve for both cases because sometimes write says it's an error but in reality it's fine - } - ); - } else { - this.logger.debug( - "We didn't write, because scale wasn't connected anymore ", - new Uint8Array(data) - ); - } - }); - } - - private ident() { - return Promise.all([ - this.write(encodeId(this.isPyxisStyle), true), - this.write(encodeNotificationRequest(), true), - ]); - } - - private heartbeat() { - if (!this.connected) { - return false; - } - setTimeout(async () => { - try { - if (!this.connected) { - return false; - } - while (this.command_queue.length) { - const packet = this.command_queue.shift(); - this.write(packet, true).catch(this.logger.error.bind(this.logger)); - } - - if (Date.now() >= this.last_heartbeat + HEARTBEAT_INTERVAL) { - this.logger.debug('Sending heartbeat...'); - this.last_heartbeat = Date.now(); - if (this.isPyxisStyle) { - this.write(encodeId(this.isPyxisStyle)).catch( - this.logger.error.bind(this.logger) - ); - } - this.write(encodeHeartbeat(), false).catch( - this.logger.error.bind(this.logger) - ); - this.logger.debug('Heartbeat success'); - } - return true; - } catch (e) { - this.logger.error('Heartbeat failed ' + JSON.stringify(e)); - console.error('Heartbeat failed ' + e); - try { - await this.disconnect(); - } catch (e) { - this.logger.error(e); - return false; - } - } - }, 0); - } -} - -const encodeEventData = memoize((payload: number[]): ArrayBuffer => { - const bytes = new Array(payload.length + 1); - bytes[0] = payload.length + 1; - for (let i = 0, _pj_a = payload.length; i < _pj_a; i += 1) { - bytes[i + 1] = payload[i] & 0xff; - } - return encode(12, bytes); -}); - -const encodeNotificationRequest = memoize((): ArrayBuffer => { - log('encodeNotificationRequest'); - const payload = [ - 0, // weight - 1, // weight argument - 1, // battery - 2, // battery argument - 2, // timer - 5, // timer argument (number heartbeats between timer messages) - 3, // key - 4, // setting - ]; - return encodeEventData(payload); -}); - -const encodeId = memoize((isPyxisStyle = false): ArrayBuffer => { - log('encodeId'); - let payload: number[]; - if (isPyxisStyle) { - payload = [ - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, - 0x32, 0x33, 0x34, - ]; - } else { - payload = [ - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, - ]; - } - return encode(11, payload); -}); - -const encodeHeartbeat = memoize((): ArrayBuffer => { - log('encodeHeartbeat'); - const payload = [2, 0]; - return encode(0, payload); -}); - -const encodeTare = memoize((): ArrayBuffer => { - log('encodeTare'); - const payload = [0]; - return encode(4, payload); -}); - -const encodeGetSettings = memoize((): ArrayBuffer => { - log('encodeSettings'); - /* Settings are returned as a notification */ - const payload = new Array(16).fill(0); - return encode(6, payload); -}); - -const encodeStartTimer = memoize((): ArrayBuffer => { - log('encodeStartTimer'); - const payload = [0, 0]; - return encode(13, payload); -}); - -const encodeStopTimer = memoize((): ArrayBuffer => { - log('encodeStopTimer'); - const payload = [0, 2]; - return encode(13, payload); -}); - -const encodeResetTimer = memoize((): ArrayBuffer => { - log('encodeResetTimer'); - const payload = [0, 1]; - return encode(13, payload); -}); - -function encode(msgType: number, payload: number[]): ArrayBuffer { - log('encode', { msgType, payload }); - let cksum1, cksum2, val; - const bytes = new Uint8Array(5 + payload.length); - bytes[0] = MAGIC1; - bytes[1] = MAGIC2; - bytes[2] = msgType; - cksum1 = 0; - cksum2 = 0; - for (let i = 0, _pj_a = payload.length; i < _pj_a; i += 1) { - val = payload[i] & 0xff; - bytes[3 + i] = val; - if (i % 2 === 0) { - cksum1 += val; - } else { - cksum2 += val; - } - } - bytes[payload.length + 3] = cksum1 & 0xff; - bytes[payload.length + 4] = cksum2 & 0xff; - return bytes.buffer; -} - -function promisify(fn) { - // tslint:disable-next-line:only-arrow-functions - return function (...args) { - return new Promise((resolve, reject) => { - fn(...args, resolve, reject); - }); - }; -} diff --git a/src/classes/devices/acaia/common.ts b/src/classes/devices/acaia/common.ts deleted file mode 100644 index 96ec70287..000000000 --- a/src/classes/devices/acaia/common.ts +++ /dev/null @@ -1,67 +0,0 @@ -export enum ScaleMessageType { - WEIGHT = 5, - HEARTBEAT = 11, - TIMER = 7, - TARE_START_STOP_RESET = 8, -} - -export enum Button { - TARE = 'tare', - START = 'start', - STOP = 'stop', - RESET = 'reset', - UNKNOWN = 'unknown', -} - -export enum Units { - GRAMS = 'grams', - OUNCES = 'ounces', -} - -export enum MessageType { - MESSAGE, - SETTINGS, -} - -export interface Message { - type: MessageType.MESSAGE; - msgType: ScaleMessageType; - weight: number; - time: number; - button: Button; -} - -export interface Settings { - type: MessageType.SETTINGS; - units: Units; - battery: number; - beepOn: boolean; - autoOff: boolean; -} - -export type ParsedMessage = Settings | Message; - -export enum DecoderResultType { - LOG, - DECODE_RESULT, - ENCODE_RESULT, -} - -export interface DecoderResult { - type: DecoderResultType.DECODE_RESULT; - data: ParsedMessage[]; -} - -export interface DecoderLog { - type: DecoderResultType.LOG; - data: unknown[]; -} - -export type WorkerResult = DecoderLog | DecoderResult; - -export type Platform = - 'ios' - | 'android' - | 'web' - | 'mobile' - // they are more but we don't care diff --git a/src/classes/devices/acaia/constants.ts b/src/classes/devices/acaia/constants.ts deleted file mode 100644 index 77d37cd5d..000000000 --- a/src/classes/devices/acaia/constants.ts +++ /dev/null @@ -1,11 +0,0 @@ -// unused currently -export const SCALE_SERVICE_UUID = '00001820-0000-1000-8000-00805f9b34fb'; -export const SCALE_CHARACTERISTIC_UUID = '00002a80-0000-1000-8000-00805f9b34fb'; - -// unused currently -export const PYXIS_SERVICE_UUID = '49535343-FE7D-4AE5-8FA9-9FAFD205E455'; -export const PYXIS_TX_CHARACTERISTIC_UUID = '49535343-8841-43F4-A8D4-ECBE34729BB3'; -export const PYXIS_RX_CHARACTERISTIC_UUID = '49535343-1E4D-4BD9-BA61-23C647249616'; - -export const MAGIC1 = 0xEF; -export const MAGIC2 = 0xDD; diff --git a/src/classes/devices/acaia/decode.worker.ts b/src/classes/devices/acaia/decode.worker.ts deleted file mode 100644 index c89cb8997..000000000 --- a/src/classes/devices/acaia/decode.worker.ts +++ /dev/null @@ -1,27 +0,0 @@ -/// - -import { DEBUG } from '../common/constants'; -import { - WorkerResult, - DecoderResultType, -} from './common'; - -import {Decoder} from './decoder'; - -function log(...args) { - if (DEBUG) { - self.postMessage({type: DecoderResultType.LOG, data: args} as WorkerResult); - } -} - -const acaia = new Decoder(log); - -self.addEventListener('message', ({data}: MessageEvent) => { - if (data instanceof ArrayBuffer) { - const result = acaia.process(data); - if (result) { - self.postMessage(result); - } - } -}); - diff --git a/src/classes/devices/acaia/decoder.ts b/src/classes/devices/acaia/decoder.ts deleted file mode 100644 index ee83d6044..000000000 --- a/src/classes/devices/acaia/decoder.ts +++ /dev/null @@ -1,287 +0,0 @@ -import {MAGIC1, MAGIC2} from './constants'; -import { - Button, - Message, - MessageType, - ParsedMessage, - ScaleMessageType, - Settings, - Units, - DecoderResult, - DecoderResultType -} from './common'; - -type Logger = (...args: unknown[]) => any; - -export class Decoder { - private readonly log: Logger; - private packet: ArrayBuffer; - - constructor(log: Logger) { - this.log = log; - } - - public process(buffer: ArrayBuffer): DecoderResult { - this.log("Decoder#process start"); - this.addBuffer(buffer); - const messages = this.processMessages(); - this.log("Decoder#process, receives messages", { messages }); - - if (messages.length) { - return {type: DecoderResultType.DECODE_RESULT, data: messages}; - } - - return null; - } - - private processMessages() { - const msgs: ParsedMessage[] = []; - - while (true) { - let msg; - [msg, this.packet] = this.decode(this.packet); - if (!msg) { - break; - } else { - msgs.push(msg); - } - } - - return msgs; - } - - private addBuffer(buffer: ArrayBuffer) { - if (this.packet) { - const tmp = new Uint8Array(this.packet.byteLength + buffer.byteLength); - tmp.set(new Uint8Array(this.packet), 0); - tmp.set(new Uint8Array(buffer), this.packet.byteLength); - this.packet = tmp.buffer; - } else { - this.packet = buffer; - } - } - - private decode(buffer: ArrayBuffer): [ParsedMessage, ArrayBuffer] { - const bytes = new Uint8Array(buffer); - - let messageStart, msgType, payloadIn; - messageStart = -1; - - for (let i = 0, _pj_a = bytes.length - 1; i < _pj_a; i += 1) { - if (bytes[i] === MAGIC1 && bytes[i + 1] === MAGIC2) { - messageStart = i; - break; - } - } - if (messageStart < 0 || bytes.length - messageStart < 6) { - return [null, bytes.buffer]; - } - const messageEnd = messageStart + bytes[messageStart + 3] + 5; - if (messageEnd > bytes.length) { - return [null, bytes.buffer]; - } - if (messageStart > 0) { - this.log('Ignoring ' + messageStart + ' bytes before header'); - } - const cmd = bytes[messageStart + 2]; - if (cmd === 12) { - msgType = bytes[messageStart + 4]; - payloadIn = bytes.slice(messageStart + 5, messageEnd); - return [this.parseMessage(msgType, payloadIn.buffer), bytes.slice(messageEnd).buffer]; - } - if (cmd === 8) { - return [ - this.parseSettings(bytes.slice(messageStart + 3).buffer), - bytes.slice(messageEnd), - ]; - } - - this.log( - 'Non event notification message command ' + - cmd + - ' ' + - bytes.slice(messageStart, messageEnd) - ); - return [null, bytes.slice(messageEnd).buffer]; - } - - private parseMessage(msgType: ScaleMessageType, buffer: ArrayBuffer): Message { - const payload = new Uint8Array(buffer); - - let weight: number = null; - let button: Button = null; - let time: number = null; - - if (msgType === ScaleMessageType.WEIGHT) { - weight = this.decodeWeight(payload); - } else { - if (msgType === ScaleMessageType.HEARTBEAT) { - if (payload[2] === 5) { - weight = this.decodeWeight(payload.slice(3)); - } else { - if (payload[2] === 7) { - time = this.decodeTime(payload.slice(3)); - } - } - this.log( - 'heartbeat response (weight: ' + - weight + - ' time: ' + - time - ); - } else { - if (msgType === ScaleMessageType.TIMER) { - time = this.decodeTime(payload); - this.log('timer: ' + time); - } else { - if (msgType === ScaleMessageType.TARE_START_STOP_RESET) { - if (payload[0] === 0 && payload[1] === 5) { - button = Button.TARE; - weight = this.decodeWeight(payload.slice(2)); - this.log('tare (weight: ' + weight + ')'); - } else { - if (payload[0] === 8 && payload[1] === 5) { - button = Button.START; - weight = this.decodeWeight(payload.slice(2)); - this.log('start (weight: ' + weight + ')'); - } else { - if (payload[0] === 10 && payload[1] === 7) { - button = Button.STOP; - time = this.decodeTime(payload.slice(2)); - weight = this.decodeWeight(payload.slice(6)); - this.log( - 'stop time: ' + - time + - ' weight: ' + - weight - ); - } else { - if (payload[0] === 9 && payload[1] === 7) { - button = Button.RESET; - time = this.decodeTime(payload.slice(2)); - weight = this.decodeWeight(payload.slice(6)); - this.log( - 'reset time: ' + - time + - ' weight: ' + - weight - ); - } else { - button = Button.UNKNOWN; - this.log('unknownbutton ' + payload); - } - } - } - } - } else { - this.log('message ' + msgType + ': ' + payload); - } - } - } - } - - return { - type: MessageType.MESSAGE, - msgType, - weight, - button, - time, - }; - } - - private decodeWeight(weight_payload: Uint8Array): number { - let value = ((weight_payload[1] & 0xff) << 8) + (weight_payload[0] & 255); - const unit = weight_payload[4] & 0xff; - if (unit === 1) { - value /= 10.0; - } else { - if (unit === 2) { - value /= 100.0; - } else { - if (unit === 3) { - value /= 1000.0; - } else { - if (unit === 4) { - value /= 10000.0; - } else { - try - { - - for (const v of weight_payload) { - console.log("0x" + v.toString(16)); - } - // console.log(weight_payload.map((v) => `0x${ ("" + v).toString(16)}`)); - console.error(`unit value not in range ${unit}`); - //throw new Error(`unit value not in range ${unit}`); - } - catch(ex){ - - } - } - } - } - } - if ((weight_payload[5] & 2) === 2) { - value *= -1; - } - return value; - } - - private decodeTime(time_payload: Uint8Array): number { - let value = (time_payload[0] & 0xff) * 60; - value = value + time_payload[1]; - value = value + time_payload[2] / 10.0; - return value * 1000; - } - - private parseSettings(buffer: ArrayBuffer): Settings { - const payload = new Uint8Array(buffer); - - let units: Units; - const battery = payload[1] & 127; - - if (payload[2] === 2) { - units = Units.GRAMS; - } else { - if (payload[2] === 5) { - units = Units.OUNCES; - } else { - units = null; - } - } - - const autoOff = !!(payload[4] * 5); - const beepOn = payload[6] === 1; - this.log( - 'settings: battery=' + - battery + - ' ' + - units + - ' auto_off=' + - autoOff + - ' beep=' + - beepOn - ); - - this.log( - 'unknown settings: ' + - [ - payload[0], - payload[1] & 128, - payload[3], - payload[5], - payload[7], - payload[8], - payload[9], - ] - ); - - return { - type: MessageType.SETTINGS, - battery, - units, - autoOff, - beepOn, - }; - } -} diff --git a/src/classes/devices/acaia/index.ts b/src/classes/devices/acaia/index.ts deleted file mode 100644 index 46a0f9a7a..000000000 --- a/src/classes/devices/acaia/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {AcaiaScale, EventType} from './acaia'; diff --git a/src/classes/devices/ble.types.ts b/src/classes/devices/ble.types.ts deleted file mode 100644 index 48f986b20..000000000 --- a/src/classes/devices/ble.types.ts +++ /dev/null @@ -1,38 +0,0 @@ -export type UUID = string; - -export interface IOSAdvertisingData { - kCBAdvDataLocalName?: string; - kCBAdvDataManufacturerData?: ArrayBuffer; - kCBAdvDataServiceUUIDs?: string[]; - kCBAdvDataIsConnectable?: boolean; - kCBAdvDataServiceData?: { [k: string]: ArrayBuffer }; -} - -export interface LimitedPeripheralData { - name: string; - id: string; - advertising: ArrayBuffer | IOSAdvertisingData; - rssi: number; -} - -export interface PeripheralData extends LimitedPeripheralData { - services?: UUID[]; - characteristics: Characteristic[]; -} - -export interface Characteristic { - service: UUID; - characteristic: UUID; - propertis: Property[]; - descriptors?: Descriptor[]; -} - -export enum Property { - READ = 'Read', - WRITE = 'Write', - NOTIFY = 'Notify', -} - -export interface Descriptor { - uuid: UUID; -} diff --git a/src/classes/devices/bluetoothDevice.ts b/src/classes/devices/bluetoothDevice.ts deleted file mode 100644 index 0d195fe33..000000000 --- a/src/classes/devices/bluetoothDevice.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { Platforms } from '@ionic/core'; -import { PeripheralData } from './ble.types'; - -declare var ble; - -import { EventEmitter } from '@angular/core'; -import {Logger} from './common/logger'; - -export enum SCALE_TIMER_COMMAND { - STOP = 'STOP', - RESET = 'RESET', - START = 'START' -} - -export interface Weight { - actual: number; - old: number; - smoothed: number; - oldSmoothed: number; -} - -export interface WeightChangeEvent extends Weight { - stable: boolean; -} - -export interface FlowChangeEvent extends WeightChangeEvent { - date: Date; -} - -export interface TimerEvent { - command: SCALE_TIMER_COMMAND; - data: any; -} -export type TareEvent = undefined; - -export class BluetoothScale { - public device_id: string; - protected weight: Weight; - protected platforms: Platforms[]; - public batteryLevel: number; - private blueToothParentlogger: Logger; - public weightChange: EventEmitter = new EventEmitter(); - public flowChange: EventEmitter = new EventEmitter(); - - public timerEvent: EventEmitter = new EventEmitter(); - public tareEvent: EventEmitter = new EventEmitter(); - - constructor(data: PeripheralData, platforms: Platforms[]) { - this.device_id = data.id; - this.platforms = platforms; - this.blueToothParentlogger = new Logger(); - - } - - public async connect() { - } - - public async tare() { - } - - public async setLed(_weightOn: boolean, _timerOn: boolean) { - } - - public async setTimer(_timer: SCALE_TIMER_COMMAND) { - } - - public getWeight(): number { - return null; - } - - public getSmoothedWeight(): number { - return 0; - } - - public getOldSmoothedWeight(): number { - return 0; - } - - /** - * Disconnect is triggered because the scale was turned off, battery shutdown, or something went broken. - */ - public disconnectTriggered(): void { - - } - - protected setWeight(_newWeight: number, _stableWeight: boolean = false) { - // Allow negative weight - // Each value effect the current weight bei 10%. - // (A3 * 03 + b2 * 0.7) - // Actual value * 03 + smoothed value * 0.7 - - this.blueToothParentlogger.log('Bluetooth Scale - New weight recieved ' + _newWeight); - - this.weight.oldSmoothed = this.weight.smoothed; - this.weight.smoothed = this.calculateSmoothedWeight(_newWeight, this.weight.smoothed); - - // We passed every shake change, seems like everything correct, set the new weight. - this.weight.actual = _newWeight; - - try { - this.blueToothParentlogger.log('Bluetooth Scale - Are weight subscriptions existing? ' + this.weightChange?.observers?.length); - }catch(ex) { - - } - this.weightChange.emit({ - actual: this.weight.actual, - smoothed: this.weight.smoothed, - stable: _stableWeight, - old: this.weight.old, - oldSmoothed: this.weight.oldSmoothed, - }); - this.triggerFlow(_stableWeight); - this.weight.old = _newWeight; - } - - protected calculateSmoothedWeight(_actualWeight: number, _smoothedWeight: number): number { - return (_actualWeight * 0.3) + (_smoothedWeight * 0.7); - } - - protected triggerFlow(_stableWeight: boolean = false) { - const actualDate = new Date(); - this.blueToothParentlogger.log('Bluetooth Scale - Flow triggered'); - try { - this.blueToothParentlogger.log('Bluetooth Scale - Are flow subscriptions existing? ' + this.flowChange?.observers?.length); - }catch(ex) { - - } - this.flowChange.emit({ - actual: this.weight.actual, - smoothed: this.weight.smoothed, - stable: _stableWeight, - old: this.weight.old, - oldSmoothed: this.weight.oldSmoothed, - date: actualDate, - }); - } -} diff --git a/src/classes/devices/common/constants.ts b/src/classes/devices/common/constants.ts deleted file mode 100644 index 4785ccd78..000000000 --- a/src/classes/devices/common/constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const DEBUG = false; diff --git a/src/classes/devices/common/logger.ts b/src/classes/devices/common/logger.ts deleted file mode 100644 index c007e86fe..000000000 --- a/src/classes/devices/common/logger.ts +++ /dev/null @@ -1,47 +0,0 @@ - -import { DEBUG } from './constants'; -import {UILog} from '../../../services/uiLog'; -import {UISettingsStorage} from '../../../services/uiSettingsStorage'; - -export class Logger { - private uiLog: UILog; - private uiSettingsStorage: UISettingsStorage; - - private prefix: string; - - constructor(prefix = 'DEFAULT') { - this.uiLog = UILog.getInstance(); - this.uiSettingsStorage = UISettingsStorage.getInstance(); - this.prefix = prefix; - } - - private isLogEnabled(): boolean { - try { - return this.uiSettingsStorage.getSettings().scale_log; - }catch(ex){ - return false; - } - - } - - public log(...args) { - if (this.isLogEnabled() || DEBUG) { - return this.uiLog.log(`${this.prefix}: ${JSON.stringify(args)}`); - } - - } - - public info(...args) { - return this.uiLog.info(`${this.prefix} INFO: ${JSON.stringify(args)}`); - } - - public error(...args) { - return this.uiLog.error(`${this.prefix} ERROR: ${JSON.stringify(args)}`); - } - - public debug(...args) { - if (this.isLogEnabled() || DEBUG) { - return this.uiLog.log(`${this.prefix} DEBUG: ${JSON.stringify(args)}`); - } - } - } diff --git a/src/classes/devices/common/util.ts b/src/classes/devices/common/util.ts deleted file mode 100644 index 167f0b4b2..000000000 --- a/src/classes/devices/common/util.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { IOSAdvertisingData } from '../ble.types'; - -export function to128bitUUID(uuid: string) { - // nothing to do - switch (uuid.length) { - case 4: - return `0000${uuid.toUpperCase()}-0000-1000-8000-00805F9B34FB`; - case 8: - return `${uuid.toUpperCase()}-0000-1000-8000-00805F9B34FB`; - case 36: - return uuid.toUpperCase(); - default: - throw new Error('invalid uuid: ' + uuid); - } -} - -export function parseAdvertisingManufacturerData( - adv: ArrayBuffer | IOSAdvertisingData -): Uint8Array | null { - if ( - adv && - 'kCBAdvDataManufacturerData' in adv && - adv.kCBAdvDataManufacturerData instanceof ArrayBuffer - ) { - return new Uint8Array(adv.kCBAdvDataManufacturerData); - } - - if (adv instanceof ArrayBuffer) { - const view = new Uint8Array(adv); - if (!view.length) { - return null; - } - - for (let i = 0; i < view.length - 1; ) { - const packetLength = view[i++]; // first byte is length - const packetType = view[i++]; // second byte is type - const dataLength = packetLength - 1; // -1 for type - - if (packetType === 0xff) { - // 0xff is manufacturer's data - return new Uint8Array(view.slice(i, i + dataLength)); - } - i += dataLength; - } - } - - return null; -} diff --git a/src/classes/devices/decentScale.ts b/src/classes/devices/decentScale.ts deleted file mode 100644 index cdc596489..000000000 --- a/src/classes/devices/decentScale.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { Platforms } from '@ionic/core'; -import {PeripheralData} from './ble.types'; -import {BluetoothScale, SCALE_TIMER_COMMAND, Weight} from './bluetoothDevice'; -import {EventEmitter} from '@angular/core'; - -declare var ble; -export default class DecentScale extends BluetoothScale { - public static WRITE_SERVICE_UUID = 'fff0'; - public static WRITE_CHAR_UUID = '36f5'; - - public static READ_SERVICE_UUID = 'fff0'; - public static READ_CHAR_UUID = 'fff4'; - - - public static HEADER = 0x03; - - private tareCounter: number = 0; - private buffer: Uint8Array; - - protected weight: Weight = { - actual: 0, - old: 0, - smoothed: 0, - oldSmoothed: 0, - }; - - public static notification_callback(event, scale) { - - } - - public static test(device) { - return device && device.name && device.name.toLowerCase().startsWith('decent'); - } - - constructor(data: PeripheralData, platforms: Platforms[]) { - super(data, platforms); - this.batteryLevel = 0; - this.buffer = new Uint8Array(); - this.connect(); - } - - private getXOR(_bytes) { - return _bytes[0] ^ _bytes[1] ^ _bytes[2] ^ _bytes[3] ^ _bytes[4] ^ _bytes[5]; - } - - private buildTareCommand() { - const buf = new ArrayBuffer(7); - const bytes = new Uint8Array(buf); - bytes[0] = DecentScale.HEADER; - - bytes[1] = 0x0F; - bytes[2] = 0xFD; - bytes[3] = this.tareCounter; - bytes[4] = 0x00; - bytes[5] = 0x00; - bytes[6] = this.getXOR(bytes); - - this.tareCounter++; - if (this.tareCounter > 255) { - this.tareCounter = 0; - } - - return bytes; - } - - private buildLedOnOffCommand(_weightLedOn: boolean, _timerLedOn: boolean) { - const buf = new ArrayBuffer(7); - const bytes = new Uint8Array(buf); - bytes[0] = DecentScale.HEADER; - - bytes[1] = 0x0A; - - if (_weightLedOn) { - bytes[2] = 0x01; - } else { - bytes[2] = 0x00; - } - - - if (_timerLedOn) { - bytes[3] = 0x01; - } else { - bytes[3] = 0x00; - } - bytes[4] = 0x00; - bytes[5] = 0x00; - bytes[6] = this.getXOR(bytes); - - return bytes; - } - - private buildTimerCommand(_timer: SCALE_TIMER_COMMAND = SCALE_TIMER_COMMAND.START) { - const buf = new ArrayBuffer(7); - const bytes = new Uint8Array(buf); - bytes[0] = DecentScale.HEADER; - - bytes[1] = 0x0B; - - if (_timer === SCALE_TIMER_COMMAND.START) { - bytes[2] = 0x03; - } else if (_timer === SCALE_TIMER_COMMAND.RESET) { - bytes[2] = 0x02; - } else { - bytes[2] = 0x00; - } - - bytes[3] = 0x00; - bytes[4] = 0x00; - bytes[5] = 0x00; - bytes[6] = this.getXOR(bytes); - - return bytes; - } - - - public async connect() { - await this.setLed(true, true); - await this.attachNotification(); - } - - private write(_bytes: Uint8Array) { - return new Promise((resolve, reject) => { - ble.write(this.device_id, - DecentScale.WRITE_SERVICE_UUID, - DecentScale.WRITE_CHAR_UUID, - _bytes.buffer, - (e) => { - resolve(true); - }, (e) => { - resolve(false); - }); - }); - } - - public async tare() { - this.weight.smoothed = 0; - this.weight.actual = 0; - this.weight.oldSmoothed = 0; - this.weight.old = 0; - this.setWeight(0); - - await this.write(this.buildTareCommand()); - await setTimeout(async () => { - await this.write(this.buildTareCommand()); - }, 200); - } - - public async setLed(_weightOn: boolean, _timerOn: boolean) { - await this.write(this.buildLedOnOffCommand(_weightOn, _timerOn)); - - await setTimeout(async () => { - await this.write(this.buildLedOnOffCommand(_weightOn, _timerOn)); - }, 200); - } - - - public async setTimer(_timer: SCALE_TIMER_COMMAND) { - await this.write(this.buildTimerCommand(_timer)); - await setTimeout(async () => { - await this.write(this.buildTimerCommand(_timer)); - }, 200); - } - - public getWeight() { - return this.weight.actual; - } - - public getSmoothedWeight() { - return this.weight.smoothed; - } - - public getOldSmoothedWeight() { - return this.weight.old; - } - - private async attachNotification() { - ble.startNotification(this.device_id, DecentScale.READ_SERVICE_UUID, DecentScale.READ_CHAR_UUID, - async (_data) => { - const scaleData = new Int8Array(_data); - const uScaleData = new Uint8Array(_data); - // console.log("Received: " + scaleData[1] + " - " + scaleData[2] + " - "+ scaleData[3]); - if (uScaleData[1] === 0xCE || uScaleData[1] === 0xCA) { - // Weight notification - let newWeight: number = ((uScaleData[2] << 8) + uScaleData[3]) / 10; - - /** We've got the issue that the Uint doesn't pass us negative values, but if we used signed, when the scale shows - * 23 grams, the weight is -23 grams, therefore we cant make a good compromise. - * After the scale will go up to 3200 kilos, we check the weight and if its above, we take the signed int. - */ - if (newWeight > 3200) { - newWeight = ((scaleData[2] << 8) + scaleData[3]) / 10; - } - const weightIsStable = (uScaleData[1] === 0xCE); - this.setWeight(newWeight, weightIsStable); - - } else if (uScaleData[1] === 0xAA && uScaleData[2] === 0x01) { - // Tare button pressed. - this.tareEvent.emit(); - await this.tare(); - } else if (uScaleData[1] === 0xAA && uScaleData[2] === 0x02) { - // Timer button pressed - this.timerEvent.emit(null); - } - - - }, (_data) => { - - } - ); - } - - private async deattachNotification() { - ble.stopNotification(this.device_id, DecentScale.READ_SERVICE_UUID, DecentScale.READ_CHAR_UUID, - (e) => { - - }, - (e) => { - - }); - } -} diff --git a/src/classes/devices/eurekaPrecisaScale.ts b/src/classes/devices/eurekaPrecisaScale.ts deleted file mode 100644 index be8741c27..000000000 --- a/src/classes/devices/eurekaPrecisaScale.ts +++ /dev/null @@ -1,189 +0,0 @@ -import { Platforms } from '@ionic/core'; -import {PeripheralData} from './ble.types'; -import {BluetoothScale, SCALE_TIMER_COMMAND, Weight} from './bluetoothDevice'; -import { Logger } from './common/logger'; - -const DEVICE_NAME = 'CFS-9002'; - -const DATA_SERVICE = 'FFE0'; -const DATA_CHARACTERISTIC = 'FFE1'; -const CMD_CHARACTERISTIC = 'FFE2'; - -const EURECA_PRECISA_GRAM_UNIT = 'g'; -const EURECA_PRECISA_OUNCE_UNIT = 'oz'; -const EURECA_PRECISA_MILLILITERS_UNIT = 'ml'; - -const CMD_HEADER = 0xAA; -const CMD_BASE = 0x02; -const CMD_START_TIMER = 0x33; -const CMD_STOP_TIMER = 0x34; -const CMD_RESET_TIMER = 0x35; -const CMD_TARE = 0x31; - -const CMD_UNIT_BASE = 0x0336; -const CMD_UNIT_GRAM = 0x00; -const CMD_UNIT_OUNCE = 0x01; -const CMD_UNIT_ML = 0x02; - -declare var ble; - -/** - * Provides BluetoothScale integration for EURECA PRECISA Scales. - */ -export default class EurekaPrecisaScale extends BluetoothScale { - - // Constructor - - constructor(data: PeripheralData, platforms: Platforms[]) { - super(data, platforms); - this.batteryLevel = 0; - this.scaleUnit = EURECA_PRECISA_GRAM_UNIT; - this.logger = new Logger('EurekaPrecisaScale'); - - this.connect(); - } - - // Accessors - - public getWeight() { - return this.weight.actual; - } - - public getSmoothedWeight() { - return this.weight.smoothed; - } - - public getOldSmoothedWeight() { - return this.weight.old; - } - - public async setTimer(command: SCALE_TIMER_COMMAND) { - this.logger.log("Setting Timer command " + command + "..."); - - if (command === SCALE_TIMER_COMMAND.START) { - await this.startTimer(); - } else if (command === SCALE_TIMER_COMMAND.STOP) { - await this.stopTimer(); - } else { - await this.resetTimer(); - } - } - - // Public Methods - - public async connect() { - this.logger.log("Connecting..."); - - await this.attachNotification(); - } - - /** - * Tares the Scale current weight to 0; - */ - public async tare() { - this.logger.log("Taring..."); - - await this.write([CMD_HEADER, CMD_BASE, CMD_TARE, CMD_TARE]); - - this.weight.smoothed = 0; - this.weight.actual = 0; - this.weight.oldSmoothed = 0; - this.weight.old = 0; - - this.setWeight(0); - } - - - /** - * Checks if this class supports interaction with @param device. - * @param device The device being checked for support. - * @returns boolean If support is provided for device. - */ - public static test(device): boolean { - return device && device.name && [DEVICE_NAME].includes(device.name); - } - - public disconnectTriggered(): void { - this.logger.log("Disconnecting..."); - - this.deattachNotification() - } - - // Private Methods - - /** - * Writes a @param _bytes payload to Scale via BLE. - * @param _bytes the payload to be written. - * @returns Asyncronous in nature, returns a callback. - */ - //TODO write without confirm! - private write(_bytes: number[]) { - return new Promise((resolve, reject) => { - ble.write(this.device_id, - DATA_SERVICE, - CMD_CHARACTERISTIC, - new Uint8Array(_bytes).buffer, - (e) => { resolve(true); }, - (e) => { resolve(false); }); - }); - } - - private async attachNotification() { - ble.startNotification(this.device_id, DATA_SERVICE, DATA_CHARACTERISTIC, - async (_data) => { this.parseStatusUpdate(new Uint8Array(_data)); }, (_data) => { } - ); - } - - /** - * Eureka Scales provide status updates via a 11 length unsigned integer array. - * @param scaleRawStatus The 11 length unsigned integer array retreived from BLE. - */ - private parseStatusUpdate(scaleRawStatus: Uint8Array) { - - this.logger.log("scaleRawStatus received is: " + scaleRawStatus); - - let is_neg = scaleRawStatus[5]; - let weight = scaleRawStatus[6] + (scaleRawStatus[7] << 8); - - weight = is_neg ? weight * -1: weight; - - this.setWeight(weight / 10); - } - - private async startTimer() { - this.write([CMD_HEADER, CMD_BASE, CMD_START_TIMER, CMD_START_TIMER]); - } - - private async resetTimer() { - this.write([CMD_HEADER, CMD_BASE, CMD_RESET_TIMER, CMD_RESET_TIMER]); - } - - private async stopTimer() { - this.write([CMD_HEADER, CMD_BASE, CMD_STOP_TIMER, CMD_STOP_TIMER]); - } - - private async deattachNotification() { - ble.stopNotification(this.device_id, DATA_SERVICE, DATA_CHARACTERISTIC, - (e) => { - - }, - (e) => { - - }); - } - - // Class Members - - private logger: Logger; - - public scaleUnit = EURECA_PRECISA_GRAM_UNIT; - - public batteryLevel: number; - - protected weight: Weight = { - actual: 0, - old: 0, - smoothed: 0, - oldSmoothed: 0, - }; -} diff --git a/src/classes/devices/felicita/constants.ts b/src/classes/devices/felicita/constants.ts deleted file mode 100644 index 3474be3e7..000000000 --- a/src/classes/devices/felicita/constants.ts +++ /dev/null @@ -1,20 +0,0 @@ -export const DEVICE_UUID = '07498FB9-5FEB-5C4D-82AB-2777F52922C4'; //Currently unused, may be the Felicita model -export const DEVICE_NAME = 'FELICITA'; - -export const DATA_SERVICE = 'FFE0'; -export const DATA_CHARACTERISTIC = 'FFE1'; - -export const FELICITA_GRAM_UNIT = 'g'; -export const FELICITA_OUNCE_UNIT = 'oz'; - -export const MIN_BATTERY_LEVEL = 129; -export const MAX_BATTERY_LEVEL = 158; - -export const CMD_START_TIMER = 0x52; -export const CMD_STOP_TIMER = 0x53; -export const CMD_RESET_TIMER = 0x43; - -export const CMD_TOGGLE_TIMER = 0x42; -export const CMD_TOGGLE_PRECISION = 0x44; -export const CMD_TARE = 0x54; -export const CMD_TOGGLE_UNIT = 0x55; diff --git a/src/classes/devices/felicita/felicita-readme.md b/src/classes/devices/felicita/felicita-readme.md deleted file mode 100644 index b2003d3c6..000000000 --- a/src/classes/devices/felicita/felicita-readme.md +++ /dev/null @@ -1,28 +0,0 @@ -#Felicita Scale - -##Sample BLE Discovery -``` -{ - "id": "91768FE8-C303-CAA5-782B-A89794C90A93", - "state": "disconnected", - "rssi": -52, - "name": "FELICITA", - "advertising": { - "kCBAdvDataLocalName": "FELICITA", - "kCBAdvDataManufacturerData": {}, - "kCBAdvDataServiceUUIDs": ["FFE0", "FEE0"], - "kCBAdvDataIsConnectable": 1 - } -} -``` - -##Sample BLE status updates -``` -[1,2,43,48,48,48,48,48,48,32,103,83,79,48,34,137,13,10] -``` -index[0-3] = unknown -index[3-9] = weight digits, substract 48 from each to get weight, index 8-9 are the decimal places. Example 1010.10 would be [1,2,43,49,48,49,48,49,48,32,103,83,79,48,34,137,13,10]. -index[9-11] = scale units, convert from binary to text using TextDecoder. -index[11-15] = unknown -index[15] = battery, value between 129 and 158. -index[16-19] = unknown \ No newline at end of file diff --git a/src/classes/devices/felicitaScale.ts b/src/classes/devices/felicitaScale.ts deleted file mode 100644 index 9e806e203..000000000 --- a/src/classes/devices/felicitaScale.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { Platforms } from '@ionic/core'; -import {PeripheralData} from './ble.types'; -import {BluetoothScale, SCALE_TIMER_COMMAND, Weight} from './bluetoothDevice'; -import { Logger } from './common/logger'; -import { CMD_RESET_TIMER, CMD_START_TIMER, CMD_STOP_TIMER, CMD_TARE, - DATA_CHARACTERISTIC, DATA_SERVICE, DEVICE_NAME, MAX_BATTERY_LEVEL, MIN_BATTERY_LEVEL, - FELICITA_GRAM_UNIT, CMD_TOGGLE_UNIT, CMD_TOGGLE_PRECISION } from './felicita/constants'; - -declare var ble; - -/** - * Provides BluetoothScale integration for Felicita Scales. - */ -export default class FelicitaScale extends BluetoothScale { - - // Constructor - - // Class Members - - private logger: Logger; - - public scaleUnit = FELICITA_GRAM_UNIT; - - public batteryLevel: number; - - protected weight: Weight = { - actual: 0, - old: 0, - smoothed: 0, - oldSmoothed: 0, - }; - - constructor(data: PeripheralData, platforms: Platforms[]) { - super(data, platforms); - this.batteryLevel = 0; - this.scaleUnit = FELICITA_GRAM_UNIT; - this.logger = new Logger('FelicitaScale'); - - this.connect(); - } - - // Accessors - - public getWeight() { - return this.weight.actual; - } - - public getSmoothedWeight() { - return this.weight.smoothed; - } - - public getOldSmoothedWeight() { - return this.weight.old; - } - - public async setTimer(command: SCALE_TIMER_COMMAND) { - this.logger.log("Setting Timer command " + command + "..."); - - if (command === SCALE_TIMER_COMMAND.START) { - await this.startTimer(); - } else if (command === SCALE_TIMER_COMMAND.STOP) { - await this.stopTimer(); - } else { - await this.resetTimer(); - } - } - - // Public Methods - - public async connect() { - this.logger.log("Connecting..."); - - await this.attachNotification(); - } - - /** - * Tares the Felicita Scale current weight to 0; - */ - public async tare() { - this.logger.log("Taring..."); - - await this.write([CMD_TARE]); - - this.weight.smoothed = 0; - this.weight.actual = 0; - this.weight.oldSmoothed = 0; - this.weight.old = 0; - - this.setWeight(0); - } - - /** - * Toggles the Felicita Scale Units between grams and ounces. - */ - public async toggleUnit() { - await this.write([CMD_TOGGLE_UNIT]); - } - - /** - * Toggles the Felicita Scale Precision between one and two decimal places. - * Note: This likely depends if the Felicita Scale HW supports two decimal places, but my guess is that the BLE implementation is universal, the value at statusUpdate index 9 will not change. - */ - public async togglePrecision() { - await this.write([CMD_TOGGLE_PRECISION]); - } - - /** - * Checks if this class supports interaction with @param device. - * @param device The device being checked for support. - * @returns boolean If support is provided for device. - */ - public static test(device): boolean { - return device && device.name && [DEVICE_NAME].includes(device.name); - } - - public disconnectTriggered(): void { - this.logger.log("Disconnecting..."); - - this.deattachNotification() - } - - // Private Methods - - /** - * Writes a @param _bytes payload to Felicita Scale via BLE. - * @param _bytes the payload to be written. - * @returns Asyncronous in nature, returns a callback. - */ - private write(_bytes: number[]) { - return new Promise((resolve, reject) => { - ble.write(this.device_id, - DATA_SERVICE, - DATA_CHARACTERISTIC, - new Uint8Array(_bytes).buffer, - (e) => { - this.logger.debug('Write successfully'); - resolve(true); - }, - (e) => { - this.logger.debug('Write unsuccessfully'); - resolve(false); - }); - }); - } - - private async attachNotification() { - ble.startNotification(this.device_id, DATA_SERVICE, DATA_CHARACTERISTIC, - async (_data) => { this.parseStatusUpdate(new Uint8Array(_data)); }, (_data) => { } - ); - } - - /** - * Felicita Scales provide status updates via a 18 length unsigned integer array. - * @param felicitaRawStatus The 18 length unsigned integer array retreived from BLE. - */ - private parseStatusUpdate(felicitaRawStatus: Uint8Array) { - - this.logger.log("felicitaRawStatus received is: " + felicitaRawStatus); - if (this.isValidFelicitaRawStatus(felicitaRawStatus)) { - let weight = this.getWeightFromFelicitaRawStatus(felicitaRawStatus); - this.setWeight(parseFloat(weight)/100); - - this.scaleUnit = this.getScaleUnitFromFelicitaRawStatus(felicitaRawStatus); - - this.batteryLevel = this.getBatteryPercentageFromFelicitaRawStatus(felicitaRawStatus); - } else { - this.logger.log("Bluetooth incoming statusUpdate is malformed, we should probably throw an error here..."); - } - } - - private async startTimer() { - this.logger.debug('Write - Start timer'); - await this.write([CMD_START_TIMER]); - } - - private async resetTimer() { - this.logger.debug('Write - Reset timer'); - await this.write([CMD_RESET_TIMER]); - } - - private async stopTimer() { - this.logger.debug('Write - Stop timer'); - await this.write([CMD_STOP_TIMER]); - } - - /** - * Gets battery percentage as a while integer number from 0-100. - * @param felicitaRawStatus The 18 length unsigned integer array retreived from BLE. - * @returns The integer battery percentage. - */ - private getBatteryPercentageFromFelicitaRawStatus(felicitaRawStatus: Uint8Array) { - let batteryLevelPercentage = Math.round((felicitaRawStatus[15] - MIN_BATTERY_LEVEL) / (MAX_BATTERY_LEVEL- MIN_BATTERY_LEVEL) * 100); - - this.logger.log("Battery level percentage is: " + batteryLevelPercentage); - return batteryLevelPercentage; - } - - private getScaleUnitFromFelicitaRawStatus(felicitaRawStatus: Uint8Array) { - let scaleUnit = new TextDecoder().decode(felicitaRawStatus.slice(9,11)); - - this.logger.log("Scale unit is: " + scaleUnit); - return scaleUnit; - } - - private getWeightFromFelicitaRawStatus(felicitaRawStatus) { - let weight = felicitaRawStatus.slice(3,9).map((value) => { return value - 48; }).join(''); - - this.logger.log("Weight is: " + weight); - return weight; - } - - private isValidFelicitaRawStatus(felicitaRawStatus: Uint8Array) { - return felicitaRawStatus.length == 18 ? true : false; - } - - private async deattachNotification() { - ble.stopNotification(this.device_id, DATA_SERVICE, DATA_CHARACTERISTIC, - (e) => { - - }, - (e) => { - - }); - } - - -} diff --git a/src/classes/devices/index.ts b/src/classes/devices/index.ts deleted file mode 100644 index 04a3a8375..000000000 --- a/src/classes/devices/index.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Platforms } from '@ionic/core'; -import { PeripheralData } from './ble.types'; -import { BluetoothScale } from './bluetoothDevice'; -import DecentScale from './decentScale'; -import FelicitaScale from './felicitaScale'; -import JimmyScale from './jimmyScale'; -import LunarScale from './lunarScale'; -import { PressureDevice } from './pressureBluetoothDevice'; -import PopsiclePressure from './popsiclePressure'; -import TransducerDirectPressure from './transducerDirectPressure'; -import EurekaPrecisaScale from './eurekaPrecisaScale'; -export { BluetoothScale, SCALE_TIMER_COMMAND } from './bluetoothDevice'; -export { default as DecentScale } from './decentScale'; -export { default as LunarScale } from './lunarScale'; -export { default as JimmyScale } from './jimmyScale'; - -export enum ScaleType { - DECENT = 'DECENT', - LUNAR = 'LUNAR', - JIMMY = 'JIMMY', - FELICITA = 'FELICITA', - EUREKAPRECISA = 'EUREKAPRECISA', -} - -export enum PressureType { - POPSICLE = 'POPSICLE', - DIRECT = 'DIRECT', -} - -export function makeDevice( - type: ScaleType, - data: PeripheralData, - platforms: Platforms[] -): BluetoothScale { - switch (type) { - case ScaleType.DECENT: - return new DecentScale(data, platforms); - case ScaleType.LUNAR: - return new LunarScale(data, platforms); - case ScaleType.JIMMY: - return new JimmyScale(data, platforms); - case ScaleType.FELICITA: - return new FelicitaScale(data, platforms); - case ScaleType.EUREKAPRECISA: - return new EurekaPrecisaScale(data, platforms); - default: - return null; - } -} - -export function makePressureDevice( - type: PressureType, - data: PeripheralData, - platforms: Platforms[] -): PressureDevice { - switch (type) { - case PressureType.POPSICLE: - return new PopsiclePressure(data, platforms); - case PressureType.DIRECT: - return new TransducerDirectPressure(data, platforms); - default: - return null; - } -} diff --git a/src/classes/devices/jimmyScale.ts b/src/classes/devices/jimmyScale.ts deleted file mode 100644 index 8f815af03..000000000 --- a/src/classes/devices/jimmyScale.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { Platforms } from '@ionic/core'; -import {PeripheralData} from './ble.types'; -import {BluetoothScale, SCALE_TIMER_COMMAND, Weight} from './bluetoothDevice'; - -declare var ble; - -enum JimmyUnit { GRAMM = 'g', OUNCE = 'oz' } -enum JimmyMode { SCALE_ONLY = 0x01, TIMER_SCALE = 0x02, POUR_OVER = 0x03, ESPRESSO_1 = 0x04, ESPRESSO_2 = 0x05, ESPRESSO_3 = 0x06 } - -export default class JimmyScale extends BluetoothScale { - public static SERVICE_UUID = '06c31822-8682-4744-9211-febc93e3bece'; - public static WRITE_CHAR_UUID = '06c31823-8682-4744-9211-febc93e3bece'; - public static READ_CHAR_UUID = '06c31824-8682-4744-9211-febc93e3bece'; - - private unit?: JimmyUnit = undefined; - private mode?: JimmyMode = undefined; - - protected weight: Weight = { - actual: 0, - old: 0, - smoothed: 0, - oldSmoothed: 0, - }; - - public static test(device) { - return device && device.name && device.name.toLowerCase().startsWith('hiroia'); - } - - constructor(data: PeripheralData, platforms: Platforms[]) { - super(data, platforms); - this.connect(); - } - - public async connect() { - await this.attachNotification(); - setTimeout(async () => { - await this.setUnit(JimmyUnit.GRAMM) - await this.setMode(JimmyMode.SCALE_ONLY); - }, 500); - } - - private write(_bytes: number[]) { - return new Promise((resolve, reject) => { - ble.write(this.device_id, - JimmyScale.SERVICE_UUID, - JimmyScale.WRITE_CHAR_UUID, - new Uint8Array(_bytes).buffer, - (e) => { resolve(true); }, - (e) => { resolve(false); }); - }); - } - - public async tare() { - this.weight.smoothed = 0; - this.weight.actual = 0; - this.weight.oldSmoothed = 0; - this.weight.old = 0; - this.setWeight(0); - - const tare = [0x07, 0x00]; - - await this.write(tare); - setTimeout(() => { this.write(tare); }, 200); - } - - public async setLed(_weightOn: boolean, _timerOn: boolean) { - // no led on jimmy - } - - public async setTimer(_timer: SCALE_TIMER_COMMAND) { - // Jimmy scale only supports a toggle timer command [0x05, 0x00] - // therefore we don't use its timer to avoid drift between scale timer and app timer state in case of conn problems - } - - public getWeight() { - return this.weight.actual; - } - - public getSmoothedWeight() { - return this.weight.smoothed; - } - - public getOldSmoothedWeight() { - return this.weight.old; - } - - private async attachNotification() { - ble.startNotification(this.device_id, JimmyScale.SERVICE_UUID, JimmyScale.READ_CHAR_UUID, - async (_data) => { this.parseStatusUpdate(new Uint8Array(_data)); }, (_data) => { } - ); - } - - private parseStatusUpdate(buf: Uint8Array) { - const mode = buf[0]; - const sign = buf[6]; - const msw = buf[5]; - const lsw = buf[4]; - - // timer state is also in buffer, but currently not read by this implemenation - - let weight = 256 * msw + lsw; - - if (sign === 255) // negative weight - weight = (65536-weight) *- 1; - - if (mode > 0x08) { - this.unit = JimmyUnit.OUNCE; - this.setWeight(weight / 1000); - this.mode = (mode - 0x08) - } else { - this.unit = JimmyUnit.GRAMM; - this.setWeight(weight / 10); - this.mode = mode; - } - } - - private async toggleUnit() { - const toggleUnit = [0x0b, 0x00]; - await this.write(toggleUnit); - } - - private async toggleMode() { - const toggleMode = [0x04, 0x00]; - await this.write(toggleMode); - } - - private async setUnit(unit: JimmyUnit) { - if (this.unit !== unit) { - await this.toggleUnit(); - await setTimeout(() => this.setUnit(unit), 250); - } - } - - private async setMode(mode: JimmyMode) { - if (this.mode !== mode) { - await this.toggleMode(); - await setTimeout(() => this.setMode(mode), 250); - } - } -} diff --git a/src/classes/devices/lunarScale.ts b/src/classes/devices/lunarScale.ts deleted file mode 100644 index c940d7774..000000000 --- a/src/classes/devices/lunarScale.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { Platforms } from '@ionic/core'; -import { PeripheralData } from './ble.types'; -import { BluetoothScale, SCALE_TIMER_COMMAND, Weight } from './bluetoothDevice'; -import { AcaiaScale, EventType } from './acaia'; - -declare var ble; -export default class LunarScale extends BluetoothScale { - private scale: AcaiaScale; - protected weight: Weight = { - actual: 0, - old: 0, - smoothed: 0, - oldSmoothed: 0, - }; - - public static test(device) { - return device && device.name && ['ACAIA', 'LUNAR', 'PYXIS', 'PROCH', 'PEARL', 'CINCO'].includes(device.name.slice(0, 5)); - } - - constructor(data: PeripheralData, platforms: Platforms[]) { - super(data, platforms); - - this.scale = new AcaiaScale(data.id, platforms, data.characteristics); - this.connect(); - } - - - public disconnectTriggered (): void { - this.scale.disconnectTriggered(); - } - - public async connect() { - await this.scale.connect(this.onEvent.bind(this)); - } - - public async tare() { - this.scale.tare(); - - this.weight.smoothed = 0; - this.weight.actual = 0; - this.weight.oldSmoothed = 0; - this.weight.old = 0; - - this.setWeight(0); - } - - public async setLed(_weightOn: boolean, _timerOn: boolean) { - } - - public async setTimer(command: SCALE_TIMER_COMMAND) { - if (this.scale.isConnected()) { - if (command === SCALE_TIMER_COMMAND.START) { - this.scale.startTimer(); - } else if (command === SCALE_TIMER_COMMAND.STOP) { - this.scale.stopTimer(); - } else { - this.scale.resetTimer(); - } - } - } - - public getWeight(): number { - return this.weight.actual; - } - - public getSmoothedWeight() { - return this.weight.smoothed; - } - - public getOldSmoothedWeight() { - return this.weight.oldSmoothed; - } - - private onEvent(eventType: EventType, data: any) { - switch (eventType) { - case EventType.WEIGHT: - const weight = data as number; - return this.setWeight(weight); - case EventType.TARE: - return this.tareEvent.emit(); - case EventType.TIMER_START: - return this.timerEvent.emit({ command: SCALE_TIMER_COMMAND.START, data }); - case EventType.TIMER_STOP: - return this.timerEvent.emit({ command: SCALE_TIMER_COMMAND.STOP, data }); - case EventType.TIMER_RESET: - return this.timerEvent.emit({ command: SCALE_TIMER_COMMAND.RESET, data }); - } - } -} diff --git a/src/classes/devices/popsiclePressure.ts b/src/classes/devices/popsiclePressure.ts deleted file mode 100644 index edd0b2ce0..000000000 --- a/src/classes/devices/popsiclePressure.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { Platforms } from '@ionic/core'; -import { LimitedPeripheralData, PeripheralData } from './ble.types'; - -import { Pressure, PressureDevice, psiToBar } from './pressureBluetoothDevice'; -import { parseAdvertisingManufacturerData, to128bitUUID } from './common/util'; - -declare var ble; -export default class PopsiclePressure extends PressureDevice { - public static PRESSURE_SERVICE_UUID = '1c47e896-4922-4030-957c-32a5be64d3ba'; - public static PRESSURE_CHAR_UUID = to128bitUUID('2A6D'); - - public static ZERO_SERVICE_UUID = '1c47e896-4922-4030-957c-32a5be64d3ba'; - public static ZERO_CHAR_UUID = 'ad029632-366d-4a52-ad6b-2a52fb369d3d'; - - public static test(device: LimitedPeripheralData) { - const adv = - device && - device.advertising && - parseAdvertisingManufacturerData(device.advertising); - return adv && adv.length >= 2 && adv[0] === 0xea && adv[1] === 0xf0; - } - - constructor(data: PeripheralData, platforms: Platforms[]) { - super(data, platforms); - this.connect(); - } - - public connect() { - this.attachNotification(); - return this.updateZero().catch(() => {}); - } - - public updateZero(): Promise { - const data = new Uint8Array(1); - - return new Promise((resolve, reject) => { - ble.writeWithoutResponse( - this.device_id, - PopsiclePressure.ZERO_SERVICE_UUID, - PopsiclePressure.ZERO_CHAR_UUID, - data.buffer, - resolve, - reject - ); - }); - } - - public disconnect() { - this.deattachNotification(); - } - - private attachNotification() { - ble.startNotification( - this.device_id, - PopsiclePressure.PRESSURE_SERVICE_UUID, - PopsiclePressure.PRESSURE_CHAR_UUID, - async (_data) => { - const v = new Float32Array(_data); - const psi = v[0]; - this.setPressure(psiToBar(psi)); - }, - (_data) => {} - ); - } - - private deattachNotification() { - ble.stopNotification( - this.device_id, - PopsiclePressure.PRESSURE_SERVICE_UUID, - PopsiclePressure.PRESSURE_CHAR_UUID, - (e) => {}, - (e) => {} - ); - } -} diff --git a/src/classes/devices/pressureBluetoothDevice.ts b/src/classes/devices/pressureBluetoothDevice.ts deleted file mode 100644 index ee9256b51..000000000 --- a/src/classes/devices/pressureBluetoothDevice.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { Platforms } from '@ionic/core'; -import { PeripheralData } from './ble.types'; -import { EventEmitter } from '@angular/core'; -import { Logger } from './common/logger'; -import { to128bitUUID } from './common/util'; - -declare var ble; - -export interface Pressure { - actual: number; - old: number; -} - -export interface PressureChangeEvent extends Pressure { - date: Date; -} - -export abstract class PressureDevice { - public static BATTERY_SERVICE_UUID = to128bitUUID('180F'); - public static BATTERY_CHAR_UUID = to128bitUUID('2A19'); - - public device_id: string; - protected pressure: Pressure; - protected platforms: Platforms[]; - public batteryLevel: number; - private pressureParentLogger: Logger; - public pressureChange: EventEmitter = new EventEmitter(); - - protected constructor(data: PeripheralData, platforms: Platforms[]) { - this.device_id = data.id; - this.platforms = platforms; - this.pressure = { - actual: 0, - old: 0, - }; - this.pressureParentLogger = new Logger(); - } - - public abstract connect(): Promise; - public abstract disconnect(): void; - public abstract updateZero(): Promise; - - public getPressure() { - return this.pressure.actual; - } - - public getOldPressure() { - return this.pressure.old; - } - - protected setPressure(_newPressure: number) { - this.pressureParentLogger.log( - 'Bluetooth Pressure Device - New pressure recieved ' + _newPressure - ); - this.pressure.actual = _newPressure; - const actualDate = new Date(); - try { - this.pressureParentLogger.log( - 'Bluetooth Pressure Device - Are subscriptions existing? ' + - this.pressureChange?.observers?.length - ); - } catch (ex) {} - this.pressureChange.emit({ - actual: this.pressure.actual, - old: this.pressure.old, - date: actualDate, - }); - - this.pressure.old = _newPressure; - } - - /** - * getBattery returns the battery level of the device - * - * @return a promise resolving to a number from 0 to 100 representing available battery percentage - */ - public getBattery(): Promise { - return new Promise((resolve, reject) => { - ble.read( - this.device_id, - PressureDevice.BATTERY_SERVICE_UUID, - PressureDevice.BATTERY_CHAR_UUID, - (buffer: ArrayBuffer) => { - const data = new Uint8Array(buffer); - resolve(data[0]); - }, - (err: unknown) => { - if (!(err instanceof Error)) { - err = new Error(JSON.stringify(err)); - } - reject(err); - } - ); - }); - } -} - -export function psiToBar(v: number) { - return v * 0.0689476; -} diff --git a/src/classes/devices/transducerDirectPressure.ts b/src/classes/devices/transducerDirectPressure.ts deleted file mode 100644 index ae9aa770b..000000000 --- a/src/classes/devices/transducerDirectPressure.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { Platforms } from '@ionic/core'; -import { LimitedPeripheralData, PeripheralData } from './ble.types'; - -import { Pressure, PressureDevice, psiToBar } from './pressureBluetoothDevice'; -import { parseAdvertisingManufacturerData } from './common/util'; - -declare var ble; -export default class TransducerDirectPressure extends PressureDevice { - public static PRESSURE_SERVICE_UUID = 'CC4A6A80-51E0-11E3-B451-0002A5D5C51B'; - public static PRESSURE_CHAR_UUID = '835AB4C0-51E4-11E3-A5BD-0002A5D5C51B'; - - public static ZERO_SERVICE_UUID = 'CC4A6A80-51E0-11E3-B451-0002A5D5C51B'; - public static ZERO_CHAR_UUID = '8CD67DA0-DA9B-11E3-9087-0002A5D5C51B'; - public static test(device: LimitedPeripheralData) { - const adv = - device && - device.advertising && - parseAdvertisingManufacturerData(device.advertising); - - console.log('ADV', adv); - return adv && adv.length >= 2 && adv[0] === 0x0c && adv[1] === 0x01; - } - - constructor(data: PeripheralData, platforms: Platforms[]) { - super(data, platforms); - this.connect(); - } - - public connect(): Promise { - this.attachNotification(); - - return this.updateZero().catch(() => {}); // ignore error - } - - public async updateZero(): Promise { - const data = new Uint8Array(1); - - return new Promise((resolve, reject) => { - ble.writeWithoutResponse( - this.device_id, - TransducerDirectPressure.ZERO_SERVICE_UUID, - TransducerDirectPressure.ZERO_CHAR_UUID, - data.buffer, - () => { - resolve(); - }, () => { - reject(); - } - ); - }); - } - - public disconnect() { - this.deattachNotification(); - } - - private attachNotification() { - ble.startNotification( - this.device_id, - TransducerDirectPressure.PRESSURE_SERVICE_UUID, - TransducerDirectPressure.PRESSURE_CHAR_UUID, - (_data) => { - const v = new Uint16Array(_data); - const psi = swap16(v[0]) / 10; - this.setPressure(psiToBar(psi)); - }, - (_data) => {} - ); - } - - private deattachNotification() { - ble.stopNotification( - this.device_id, - TransducerDirectPressure.PRESSURE_SERVICE_UUID, - TransducerDirectPressure.PRESSURE_CHAR_UUID, - (e) => {}, - (e) => {} - ); - } -} - -function swap16(val) { - return ((val & 0xff) << 8) | ((val >> 8) & 0xff); -} diff --git a/src/classes/settings/settings.ts b/src/classes/settings/settings.ts index bd70ebf13..2bc83a022 100755 --- a/src/classes/settings/settings.ts +++ b/src/classes/settings/settings.ts @@ -1,32 +1,28 @@ -import {PressureType, ScaleType} from './../devices'; /** Interfaces */ /** Enums */ -import {BREW_VIEW_ENUM} from '../../enums/settings/brewView'; -import {ISettings} from '../../interfaces/settings/iSettings'; +import { BREW_VIEW_ENUM } from '../../enums/settings/brewView'; +import { ISettings } from '../../interfaces/settings/iSettings'; /** Classes */ -import {Config} from '../objectConfig/objectConfig'; - -import {DefaultBrewParameter} from '../parameter/defaultBrewParameter'; -import {STARTUP_VIEW_ENUM} from '../../enums/settings/startupView'; -import {OrderBrewParameter} from '../parameter/orderBrewParameter'; -import {IBrewPageFilter} from '../../interfaces/brew/iBrewPageFilter'; -import {ManageBrewParameter} from '../parameter/manageBrewParameter'; -import {IBeanPageSort} from '../../interfaces/bean/iBeanPageSort'; -import {BEAN_SORT_AFTER} from '../../enums/beans/beanSortAfter'; -import {BEAN_SORT_ORDER} from '../../enums/beans/beanSortOrder'; -import {ListViewBrewParameter} from '../parameter/listViewBrewParameter'; -import {IBeanPageFilter} from '../../interfaces/bean/iBeanPageFilter'; -import {BEAN_ROASTING_TYPE_ENUM} from '../../enums/beans/beanRoastingType'; -import {IBrewGraphs} from '../../interfaces/brew/iBrewGraphs'; - +import { Config } from '../objectConfig/objectConfig'; + +import { DefaultBrewParameter } from '../parameter/defaultBrewParameter'; +import { STARTUP_VIEW_ENUM } from '../../enums/settings/startupView'; +import { OrderBrewParameter } from '../parameter/orderBrewParameter'; +import { IBrewPageFilter } from '../../interfaces/brew/iBrewPageFilter'; +import { ManageBrewParameter } from '../parameter/manageBrewParameter'; +import { IBeanPageSort } from '../../interfaces/bean/iBeanPageSort'; +import { BEAN_SORT_AFTER } from '../../enums/beans/beanSortAfter'; +import { BEAN_SORT_ORDER } from '../../enums/beans/beanSortOrder'; +import { ListViewBrewParameter } from '../parameter/listViewBrewParameter'; +import { IBeanPageFilter } from '../../interfaces/bean/iBeanPageFilter'; + +import { IBrewGraphs } from '../../interfaces/brew/iBrewGraphs'; +import { PressureType, ScaleType } from '@graphefruit/coffee-bluetooth-devices'; export class Settings implements ISettings { - - public brew_view: BREW_VIEW_ENUM; public startup_view: STARTUP_VIEW_ENUM; - public matomo_analytics: boolean; public qr_scanner_information: boolean; public manage_parameters: ManageBrewParameter; @@ -52,31 +48,28 @@ export class Settings implements ISettings { public welcome_page_showed: boolean; public track_caffeine_consumption: boolean; public brew_filter: { - OPEN: IBrewPageFilter, - ARCHIVED: IBrewPageFilter + OPEN: IBrewPageFilter; + ARCHIVED: IBrewPageFilter; }; - - public bean_filter: { - OPEN: IBeanPageFilter, - ARCHIVED: IBeanPageFilter + OPEN: IBeanPageFilter; + ARCHIVED: IBeanPageFilter; }; public bean_sort: { - OPEN: IBeanPageSort, - ARCHIVED: IBeanPageSort + OPEN: IBeanPageSort; + ARCHIVED: IBeanPageSort; }; public green_bean_sort: { - OPEN: IBeanPageSort, - ARCHIVED: IBeanPageSort + OPEN: IBeanPageSort; + ARCHIVED: IBeanPageSort; }; - public graph: { - ESPRESSO: IBrewGraphs, - FILTER: IBrewGraphs, + ESPRESSO: IBrewGraphs; + FILTER: IBrewGraphs; }; public wake_lock: boolean; @@ -97,7 +90,6 @@ export class Settings implements ISettings { public bluetooth_ignore_negative_values: boolean; public bluetooth_ignore_anomaly_values: boolean; - public pressure_id: string; public pressure_type: PressureType; public pressure_log: boolean; @@ -106,22 +98,20 @@ export class Settings implements ISettings { public currency: string; - public GET_BEAN_FILTER(): IBeanPageFilter { return { favourite: false, rating: { upper: 5, - lower: 0 + lower: 0, }, bean_roasting_type: [], roastingDateStart: '', - roastingDateEnd: '' + roastingDateEnd: '', } as IBeanPageFilter; } public GET_BREW_FILTER(): IBrewPageFilter { - const upperRating: number = this.brew_rating; return { @@ -132,8 +122,8 @@ export class Settings implements ISettings { favourite: false, rating: { upper: upperRating, - lower:-1 - } + lower: -1, + }, } as IBrewPageFilter; } @@ -142,7 +132,7 @@ export class Settings implements ISettings { weight: true, calc_flow: true, realtime_flow: true, - pressure: true + pressure: true, } as IBrewGraphs; } @@ -179,27 +169,27 @@ export class Settings implements ISettings { this.brew_filter = { OPEN: {} as IBrewPageFilter, - ARCHIVED: {} as IBrewPageFilter + ARCHIVED: {} as IBrewPageFilter, }; this.bean_filter = { OPEN: {} as IBeanPageFilter, - ARCHIVED: {} as IBeanPageFilter + ARCHIVED: {} as IBeanPageFilter, }; this.bean_sort = { OPEN: {} as IBeanPageSort, - ARCHIVED: {} as IBeanPageSort + ARCHIVED: {} as IBeanPageSort, }; this.green_bean_sort = { OPEN: {} as IBeanPageSort, - ARCHIVED: {} as IBeanPageSort + ARCHIVED: {} as IBeanPageSort, }; this.graph = { ESPRESSO: {} as IBrewGraphs, - FILTER: {} as IBrewGraphs, + FILTER: {} as IBrewGraphs, }; this.graph.ESPRESSO = this.GET_BREW_GRAPHS(); @@ -214,12 +204,23 @@ export class Settings implements ISettings { this.bean_filter.OPEN = this.GET_BEAN_FILTER(); this.bean_filter.ARCHIVED = this.GET_BEAN_FILTER(); - this.bean_sort.OPEN = {sort_after: BEAN_SORT_AFTER.UNKOWN, sort_order: BEAN_SORT_ORDER.UNKOWN} as IBeanPageSort; - this.bean_sort.ARCHIVED = {sort_after: BEAN_SORT_AFTER.UNKOWN, sort_order: BEAN_SORT_ORDER.UNKOWN} as IBeanPageSort; - - this.green_bean_sort.OPEN = {sort_after: BEAN_SORT_AFTER.UNKOWN, sort_order: BEAN_SORT_ORDER.UNKOWN} as IBeanPageSort; - this.green_bean_sort.ARCHIVED = {sort_after: BEAN_SORT_AFTER.UNKOWN, sort_order: BEAN_SORT_ORDER.UNKOWN} as IBeanPageSort; - + this.bean_sort.OPEN = { + sort_after: BEAN_SORT_AFTER.UNKOWN, + sort_order: BEAN_SORT_ORDER.UNKOWN, + } as IBeanPageSort; + this.bean_sort.ARCHIVED = { + sort_after: BEAN_SORT_AFTER.UNKOWN, + sort_order: BEAN_SORT_ORDER.UNKOWN, + } as IBeanPageSort; + + this.green_bean_sort.OPEN = { + sort_after: BEAN_SORT_AFTER.UNKOWN, + sort_order: BEAN_SORT_ORDER.UNKOWN, + } as IBeanPageSort; + this.green_bean_sort.ARCHIVED = { + sort_after: BEAN_SORT_AFTER.UNKOWN, + sort_order: BEAN_SORT_ORDER.UNKOWN, + } as IBeanPageSort; this.welcome_page_showed = false; this.wake_lock = false; @@ -244,7 +245,6 @@ export class Settings implements ISettings { this.pressure_threshold_bar = 0.5; this.currency = 'EUR'; - } public initializeByObject(settingsObj: ISettings): void { @@ -258,29 +258,25 @@ export class Settings implements ISettings { Object.assign(this.brew_order, settingsObj.brew_order); this.default_last_coffee_parameters = new DefaultBrewParameter(); - Object.assign(this.default_last_coffee_parameters, settingsObj.default_last_coffee_parameters); - - + Object.assign( + this.default_last_coffee_parameters, + settingsObj.default_last_coffee_parameters + ); } - - public resetFilter() { this.brew_filter = { OPEN: {} as IBrewPageFilter, - ARCHIVED: {} as IBrewPageFilter + ARCHIVED: {} as IBrewPageFilter, }; this.brew_filter.OPEN = this.GET_BREW_FILTER(); this.brew_filter.ARCHIVED = this.GET_BREW_FILTER(); this.bean_filter = { OPEN: {} as IBeanPageFilter, - ARCHIVED: {} as IBeanPageFilter + ARCHIVED: {} as IBeanPageFilter, }; this.bean_filter.OPEN = this.GET_BEAN_FILTER(); this.bean_filter.ARCHIVED = this.GET_BEAN_FILTER(); } - - - } diff --git a/src/components/beans/bean-general-information/bean-general-information.component.ts b/src/components/beans/bean-general-information/bean-general-information.component.ts index 6e38819ff..1aa973e72 100644 --- a/src/components/beans/bean-general-information/bean-general-information.component.ts +++ b/src/components/beans/bean-general-information/bean-general-information.component.ts @@ -1,16 +1,25 @@ -import {ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core'; -import {Bean} from '../../../classes/bean/bean'; +import { + ChangeDetectorRef, + Component, + EventEmitter, + Input, + OnInit, + Output, + ViewChild, +} from '@angular/core'; +import { Bean } from '../../../classes/bean/bean'; import moment from 'moment'; -import {Platform} from '@ionic/angular'; -import {UIBeanStorage} from '../../../services/uiBeanStorage'; -import {TranslateService} from '@ngx-translate/core'; -import {ROASTS_ENUM} from '../../../enums/beans/roasts'; -import {BEAN_MIX_ENUM} from '../../../enums/beans/mix'; -import {BEAN_ROASTING_TYPE_ENUM} from '../../../enums/beans/beanRoastingType'; -import {NgxStarsComponent} from 'ngx-stars'; -import {IBeanInformation} from '../../../interfaces/bean/iBeanInformation'; -import {BluetoothScale} from '../../../classes/devices'; -import {BleManagerService} from '../../../services/bleManager/ble-manager.service'; +import { Platform } from '@ionic/angular'; +import { UIBeanStorage } from '../../../services/uiBeanStorage'; +import { TranslateService } from '@ngx-translate/core'; +import { ROASTS_ENUM } from '../../../enums/beans/roasts'; +import { BEAN_MIX_ENUM } from '../../../enums/beans/mix'; +import { BEAN_ROASTING_TYPE_ENUM } from '../../../enums/beans/beanRoastingType'; +import { NgxStarsComponent } from 'ngx-stars'; +import { IBeanInformation } from '../../../interfaces/bean/iBeanInformation'; + +import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-devices'; +import { BluetoothScale } from '@graphefruit/coffee-bluetooth-devices'; declare var cordova; @Component({ @@ -19,12 +28,12 @@ declare var cordova; styleUrls: ['./bean-general-information.component.scss'], }) export class BeanGeneralInformationComponent implements OnInit { - - @Input() public data: Bean ; + @Input() public data: Bean; @Output() public dataChange = new EventEmitter(); - @ViewChild('beanStars', {read: NgxStarsComponent, static: false}) public beanStars: NgxStarsComponent; - @ViewChild('beanRating', {read: NgxStarsComponent, static: false}) public beanRating: NgxStarsComponent; - + @ViewChild('beanStars', { read: NgxStarsComponent, static: false }) + public beanStars: NgxStarsComponent; + @ViewChild('beanRating', { read: NgxStarsComponent, static: false }) + public beanRating: NgxStarsComponent; public roastsEnum = ROASTS_ENUM; public mixEnum = BEAN_MIX_ENUM; @@ -34,22 +43,20 @@ export class BeanGeneralInformationComponent implements OnInit { public roasterResults: string[] = []; public roasterFocused: boolean = false; - constructor(private readonly platform: Platform, - private readonly uiBeanStorage: UIBeanStorage, - private readonly translate: TranslateService, - private readonly changeDetectorRef: ChangeDetectorRef, - private readonly bleManager: BleManagerService) { } + constructor( + private readonly platform: Platform, + private readonly uiBeanStorage: UIBeanStorage, + private readonly translate: TranslateService, + private readonly changeDetectorRef: ChangeDetectorRef, + private readonly bleManager: CoffeeBluetoothDevicesService + ) {} public ngOnInit() { - setTimeout(() => { - if (this.beanStars && this.beanStars.setRating) - { + if (this.beanStars && this.beanStars.setRating) { this.beanStars.setRating(this.data.roast_range); } - },1000); - - + }, 1000); } public smartScaleConnected() { @@ -76,46 +83,43 @@ export class BeanGeneralInformationComponent implements OnInit { return; } - actualSearchValue = actualSearchValue.toLowerCase(); - const filteredEntries = this.uiBeanStorage.getAllEntries().filter((e)=>e.roaster.toLowerCase().includes(actualSearchValue)); + const filteredEntries = this.uiBeanStorage + .getAllEntries() + .filter((e) => e.roaster.toLowerCase().includes(actualSearchValue)); for (const entry of filteredEntries) { this.roasterResults.push(entry.roaster); } // Distinct values - this.roasterResults = Array.from(new Set(this.roasterResults.map((e) => e))); + this.roasterResults = Array.from( + new Set(this.roasterResults.map((e) => e)) + ); if (this.roasterResults.length > 0) { this.roasterResultsAvailable = true; } else { this.roasterResultsAvailable = false; } - } public onRoasterSearchLeave($event) { setTimeout(() => { this.roasterResultsAvailable = false; this.roasterResults = []; this.roasterFocused = false; - },150); - + }, 150); } public onRoasterSearchFocus($event) { this.roasterFocused = true; } public roasterSelected(selected: string): void { - this.data.roaster = selected; this.roasterResults = []; this.roasterResultsAvailable = false; this.roasterFocused = false; } - - - public chooseBuyDate(_event) { _event.target.blur(); _event.cancelBubble = true; @@ -136,17 +140,14 @@ export class BeanGeneralInformationComponent implements OnInit { success: (newDate) => { if (newDate === undefined) { this.data.buyDate = ''; - } else - { + } else { this.data.buyDate = moment(newDate).toISOString(); } this.changeDetectorRef.detectChanges(); - }, error: () => { - - } + }, + error: () => {}, }); - } } @@ -170,23 +171,19 @@ export class BeanGeneralInformationComponent implements OnInit { success: (newDate) => { if (newDate === undefined) { this.data.roastingDate = ''; - } else - { + } else { this.data.roastingDate = moment(newDate).toISOString(); } this.changeDetectorRef.detectChanges(); - }, error: () => { - - } + }, + error: () => {}, }); - } } - public changedRating() { - if (typeof(this.beanRating) !== 'undefined') { + if (typeof this.beanRating !== 'undefined') { this.beanRating.setRating(this.data.rating); } } diff --git a/src/components/beans/bean-roast-information/bean-roast-information.component.ts b/src/components/beans/bean-roast-information/bean-roast-information.component.ts index 253940aca..7fda28af2 100644 --- a/src/components/beans/bean-roast-information/bean-roast-information.component.ts +++ b/src/components/beans/bean-roast-information/bean-roast-information.component.ts @@ -1,11 +1,11 @@ -import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; -import {Bean} from '../../../classes/bean/bean'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { Bean } from '../../../classes/bean/bean'; import moment from 'moment'; -import {ModalController, Platform} from '@ionic/angular'; -import {DatetimePopoverComponent} from '../../../popover/datetime-popover/datetime-popover.component'; -import {BluetoothScale} from '../../../classes/devices'; -import {BleManagerService} from '../../../services/bleManager/ble-manager.service'; +import { ModalController, Platform } from '@ionic/angular'; +import { DatetimePopoverComponent } from '../../../popover/datetime-popover/datetime-popover.component'; +import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-devices'; +import { BluetoothScale } from '@graphefruit/coffee-bluetooth-devices'; @Component({ selector: 'bean-roast-information', @@ -13,17 +13,21 @@ import {BleManagerService} from '../../../services/bleManager/ble-manager.servic styleUrls: ['./bean-roast-information.component.scss'], }) export class BeanRoastInformationComponent implements OnInit { - - @Input() public data: Bean ; + @Input() public data: Bean; @Output() public dataChange = new EventEmitter(); public displayingTime: string = ''; - constructor(private readonly platform: Platform, - private readonly modalCtrl: ModalController, - private readonly bleManager: BleManagerService) { } + constructor( + private readonly platform: Platform, + private readonly modalCtrl: ModalController, + private readonly bleManager: CoffeeBluetoothDevicesService + ) {} public ngOnInit() { - this.displayingTime = moment().startOf('day').add('seconds',this.data.bean_roast_information.roast_length).toISOString(); + this.displayingTime = moment() + .startOf('day') + .add('seconds', this.data.bean_roast_information.roast_length) + .toISOString(); } public smartScaleConnected() { if (!this.platform.is('cordova')) { @@ -35,7 +39,8 @@ export class BeanRoastInformationComponent implements OnInit { } public bluetoothScaleSetGreenBeanWeight() { - this.data.bean_roast_information.green_bean_weight = this.bleManager.getScaleWeight(); + this.data.bean_roast_information.green_bean_weight = + this.bleManager.getScaleWeight(); } public bluetoothScaleSetRoastBeanWeight() { this.data.weight = this.bleManager.getScaleWeight(); @@ -45,20 +50,29 @@ export class BeanRoastInformationComponent implements OnInit { _event.stopPropagation(); _event.stopImmediatePropagation(); - const modal = await this.modalCtrl.create({component: DatetimePopoverComponent, - id:'datetime-popover', + const modal = await this.modalCtrl.create({ + component: DatetimePopoverComponent, + id: 'datetime-popover', cssClass: 'half-bottom-modal', showBackdrop: true, backdropDismiss: true, swipeToClose: true, - componentProps: {displayingTime: this.displayingTime}}); + componentProps: { displayingTime: this.displayingTime }, + }); await modal.present(); const modalData = await modal.onWillDismiss(); - if (modalData !== undefined && modalData.data.displayingTime !== undefined) { + if ( + modalData !== undefined && + modalData.data.displayingTime !== undefined + ) { this.displayingTime = modalData.data.displayingTime; - this.data.bean_roast_information.roast_length =moment.duration(moment(modalData.data.displayingTime) - .diff(moment(modalData.data.displayingTime).startOf('day'))).asSeconds(); + this.data.bean_roast_information.roast_length = moment + .duration( + moment(modalData.data.displayingTime).diff( + moment(modalData.data.displayingTime).startOf('day') + ) + ) + .asSeconds(); } } - } diff --git a/src/components/brew-timer/brew-timer.component.ts b/src/components/brew-timer/brew-timer.component.ts index d39b350e2..e0726abac 100644 --- a/src/components/brew-timer/brew-timer.component.ts +++ b/src/components/brew-timer/brew-timer.component.ts @@ -1,11 +1,18 @@ -import {Component, EventEmitter, Input, OnDestroy, OnInit, Output} from '@angular/core'; - -import {ITimer} from '../../interfaces/timer/iTimer'; +import { + Component, + EventEmitter, + Input, + OnDestroy, + OnInit, + Output, +} from '@angular/core'; + +import { ITimer } from '../../interfaces/timer/iTimer'; import moment from 'moment'; -import {DatetimePopoverComponent} from '../../popover/datetime-popover/datetime-popover.component'; -import {ModalController} from '@ionic/angular'; -import {BleManagerService} from '../../services/bleManager/ble-manager.service'; +import { DatetimePopoverComponent } from '../../popover/datetime-popover/datetime-popover.component'; +import { ModalController } from '@ionic/angular'; +import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-devices'; @Component({ selector: 'brew-timer', @@ -15,7 +22,6 @@ import {BleManagerService} from '../../services/bleManager/ble-manager.service'; export class BrewTimerComponent implements OnInit, OnDestroy { @Input() public label: string; - @Output() public timerStarted = new EventEmitter(); @Output() public timerPaused = new EventEmitter(); @Output() public timerReset = new EventEmitter(); @@ -57,19 +63,19 @@ export class BrewTimerComponent implements OnInit, OnDestroy { public timer: ITimer; - constructor(private readonly modalCtrl: ModalController, private readonly bleManager: BleManagerService) { - } + constructor( + private readonly modalCtrl: ModalController, + private readonly bleManager: CoffeeBluetoothDevicesService + ) {} public smartScaleConnected() { try { return this.bleManager.getScale() !== null; - } catch (ex) { - } + } catch (ex) {} } public ngOnInit(): void { this.initTimer(); - } public isTimerRunning() { @@ -87,11 +93,13 @@ export class BrewTimerComponent implements OnInit, OnDestroy { public setTime(seconds: number): void { this.timer.seconds = seconds; this.timer.displayTime = this.getSecondsAsDigitalClock(this.timer.seconds); - this.displayingTime = moment(this.displayingTime).startOf('day').add('seconds', this.timer.seconds).toISOString(); + this.displayingTime = moment(this.displayingTime) + .startOf('day') + .add('seconds', this.timer.seconds) + .toISOString(); } public initTimer(): void { - // tslint:disable-next-line this.timer = { runTimer: false, @@ -103,9 +111,10 @@ export class BrewTimerComponent implements OnInit, OnDestroy { this.showDripTimer = this.dripTimerVisible; this.timer.displayTime = this.getSecondsAsDigitalClock(this.timer.seconds); - this.displayingTime = moment(this.displayingTime).startOf('day').add('seconds', this.timer.seconds).toISOString(); - - + this.displayingTime = moment(this.displayingTime) + .startOf('day') + .add('seconds', this.timer.seconds) + .toISOString(); } public startTimer(_resumed: boolean = false): void { @@ -135,7 +144,6 @@ export class BrewTimerComponent implements OnInit, OnDestroy { public bloomTime(): void { this.showBloomTimer = false; this.bloomTimer.emit(this.getSeconds()); - } public dripTime(): void { @@ -149,7 +157,6 @@ export class BrewTimerComponent implements OnInit, OnDestroy { } public timerTick(): void { - setTimeout(() => { if (!this.timer.runTimer) { return; @@ -160,8 +167,13 @@ export class BrewTimerComponent implements OnInit, OnDestroy { this.timer.seconds += delta; this.startedTimestamp = currentTickTimestamp; - this.timer.displayTime = this.getSecondsAsDigitalClock(this.timer.seconds); - this.displayingTime = moment(this.displayingTime).startOf('day').add('seconds', this.timer.seconds).toISOString(); + this.timer.displayTime = this.getSecondsAsDigitalClock( + this.timer.seconds + ); + this.displayingTime = moment(this.displayingTime) + .startOf('day') + .add('seconds', this.timer.seconds) + .toISOString(); this.timerTick(); this.changeEvent(); }, 1000); @@ -191,17 +203,19 @@ export class BrewTimerComponent implements OnInit, OnDestroy { public getSecondsAsDigitalClock(inputSeconds: number): string { const sec_num = parseInt(inputSeconds.toString(), 10); // don't forget the second param const hours = Math.floor(sec_num / 3600); - const minutes = Math.floor((sec_num - (hours * 3600)) / 60); - const seconds = sec_num - (hours * 3600) - (minutes * 60); - const hoursString = (hours < 10) ? `0${hours}` : hours.toString(); - const minutesString = (minutes < 10) ? `0${minutes}` : minutes.toString(); - const secondsString = (seconds < 10) ? `0${seconds}` : seconds.toString(); + const minutes = Math.floor((sec_num - hours * 3600) / 60); + const seconds = sec_num - hours * 3600 - minutes * 60; + const hoursString = hours < 10 ? `0${hours}` : hours.toString(); + const minutesString = minutes < 10 ? `0${minutes}` : minutes.toString(); + const secondsString = seconds < 10 ? `0${seconds}` : seconds.toString(); return `${hoursString}:${minutesString}:${secondsString}`; } public changeDate(_event) { - const durationPassed = moment.duration(moment(_event).diff(moment(_event).startOf('day'))); + const durationPassed = moment.duration( + moment(_event).diff(moment(_event).startOf('day')) + ); this.displayingTime = moment(_event).toISOString(); this.timer.seconds = durationPassed.asSeconds(); // Emit event so parent page can do something @@ -219,15 +233,23 @@ export class BrewTimerComponent implements OnInit, OnDestroy { showBackdrop: true, backdropDismiss: true, swipeToClose: true, - componentProps: {displayingTime: this.displayingTime} + componentProps: { displayingTime: this.displayingTime }, }); await modal.present(); const modalData = await modal.onWillDismiss(); - if (modalData !== undefined && modalData.data.displayingTime !== undefined) { + if ( + modalData !== undefined && + modalData.data.displayingTime !== undefined + ) { this.displayingTime = modalData.data.displayingTime; - this.timer.seconds = moment.duration(moment(this.displayingTime).diff(moment(this.displayingTime).startOf('day'))).asSeconds(); + this.timer.seconds = moment + .duration( + moment(this.displayingTime).diff( + moment(this.displayingTime).startOf('day') + ) + ) + .asSeconds(); this.changeEvent(); } - } } diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index 97f7ac959..d6fd3277c 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -33,14 +33,15 @@ import { UIBeanStorage } from '../../../services/uiBeanStorage'; import { UIWaterStorage } from '../../../services/uiWaterStorage'; import { BrewBrixCalculatorComponent } from '../../../app/brew/brew-brix-calculator/brew-brix-calculator.component'; import { BrewBeverageQuantityCalculatorComponent } from '../../../app/brew/brew-beverage-quantity-calculator/brew-beverage-quantity-calculator.component'; -import { BleManagerService } from '../../../services/bleManager/ble-manager.service'; + import { Subscription } from 'rxjs'; -import { BluetoothScale, SCALE_TIMER_COMMAND } from '../../../classes/devices'; + import { Chart } from 'chart.js'; import { UIHelper } from '../../../services/uiHelper'; import { UIExcel } from '../../../services/uiExcel'; import { - BrewFlow, IBrewPressureFlow, + BrewFlow, + IBrewPressureFlow, IBrewRealtimeWaterFlow, IBrewWaterFlow, IBrewWeightFlow, @@ -49,8 +50,12 @@ import { UIFileHelper } from '../../../services/uiFileHelper'; import { BrewFlowComponent } from '../../../app/brew/brew-flow/brew-flow.component'; import { ScreenOrientation } from '@ionic-native/screen-orientation/ngx'; import { PreparationTool } from '../../../classes/preparation/preparationTool'; -import { PressureDevice } from '../../../classes/devices/pressureBluetoothDevice'; -import {UIAlert} from '../../../services/uiAlert'; + +import { UIAlert } from '../../../services/uiAlert'; +import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-devices'; +import { BluetoothScale } from '@graphefruit/coffee-bluetooth-devices'; +import { SCALE_TIMER_COMMAND } from '@graphefruit/coffee-bluetooth-devices'; +import { PressureDevice } from '@graphefruit/coffee-bluetooth-devices'; declare var cordova; @@ -129,12 +134,12 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { private readonly uiMillStorage: UIMillStorage, private readonly uiBeanStorage: UIBeanStorage, private readonly uiWaterStorage: UIWaterStorage, - private readonly bleManager: BleManagerService, + private readonly bleManager: CoffeeBluetoothDevicesService, private readonly uiHelper: UIHelper, private readonly uiExcel: UIExcel, private readonly uiFileHelper: UIFileHelper, private readonly screenOrientation: ScreenOrientation, - private readonly uiAlert: UIAlert, + private readonly uiAlert: UIAlert ) {} public getActivePreparationTools() { @@ -226,23 +231,23 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.deattachToFlowChange(); this.deattachToScaleEvents(); disconnectTriggered = true; - } - else if (_type && _type.type === 'CONNECT_PRESSURE') { + } else if (_type && _type.type === 'CONNECT_PRESSURE') { connectTriggered = true; this.__connectPressureDevice(false); - } - else if (_type && _type.type === 'DISCONNECT_PRESSURE') { + } else if (_type && _type.type === 'DISCONNECT_PRESSURE') { this.deattachToPressureChange(); disconnectTriggered = true; } if (disconnectTriggered) { - if (!this.smartScaleConnected() && !this.pressureDeviceConnected()) { + if ( + !this.smartScaleConnected() && + !this.pressureDeviceConnected() + ) { // When one is connected we don't pause this.flowProfileChartEl.options.scales.x.realtime.pause = true; this.flowProfileChartEl.update('quiet'); } - } if (connectTriggered) { if (!this.flowProfileChartEl) { @@ -334,8 +339,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { }, 50); }); } - - } if (this.timer.isTimerRunning() === true && _firstStart === false) { this.attachToScaleWeightChange(); @@ -351,11 +354,11 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.deattachToPressureChange(); if (_firstStart) { - const pressureDevice: PressureDevice = this.bleManager.getPressureDevice(); + const pressureDevice: PressureDevice = + this.bleManager.getPressureDevice(); if (pressureDevice) { await pressureDevice.updateZero(); } - } if (this.timer.isTimerRunning() === true && _firstStart === false) { this.attachToPressureChange(); @@ -479,7 +482,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { if (this.preparationMethodHasBeenFocused === true) { this.data.method_of_preparation_tools = []; this.preparationMethodHasBeenFocused = false; - if (this.timer.isTimerRunning()===false) { + if (this.timer.isTimerRunning() === false) { this.initializeFlowChart(); } } @@ -503,7 +506,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { return !!pressureDevice; } - public attachToScaleWeightChange() { const scale: BluetoothScale = this.bleManager.getScale(); if (scale) { @@ -536,7 +538,10 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { if (this.timer.isTimerRunning()) { this.__setPressureFlow(_val); } else { - if (this.settings.pressure_threshold_active && _val.actual > this.settings.pressure_threshold_bar) { + if ( + this.settings.pressure_threshold_active && + _val.actual > this.settings.pressure_threshold_bar + ) { this.timer.startTimer(); } } @@ -579,7 +584,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { private initializeFlowChart(): void { setTimeout(() => { - if (this.flowProfileChartEl) { this.flowProfileChartEl.destroy(); this.flowProfileChartEl = undefined; @@ -591,8 +595,10 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } if (this.flowProfileChartEl === undefined) { let graphSettings = this.settings.graph.FILTER; - if ( this.data.getPreparation().style_type === - PREPARATION_STYLE_TYPE.ESPRESSO) { + if ( + this.data.getPreparation().style_type === + PREPARATION_STYLE_TYPE.ESPRESSO + ) { graphSettings = this.settings.graph.ESPRESSO; } @@ -607,7 +613,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { yAxisID: 'y', pointRadius: 0, tension: 0, - hidden: !graphSettings.weight + hidden: !graphSettings.weight, }, { label: this.translate.instant('BREW_FLOW_WEIGHT_PER_SECOND'), @@ -618,7 +624,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { spanGaps: true, pointRadius: 0, tension: 0, - hidden: !graphSettings.calc_flow + hidden: !graphSettings.calc_flow, }, { label: this.translate.instant('BREW_FLOW_WEIGHT_REALTIME'), @@ -629,12 +635,11 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { spanGaps: true, pointRadius: 0, tension: 0, - hidden: !graphSettings.calc_flow + hidden: !graphSettings.calc_flow, }, ], }; - const pressureDevice = this.bleManager.getPressureDevice(); if (pressureDevice != null || !this.platform.is('cordova')) { drinkingData.datasets.push({ @@ -670,9 +675,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { suggestedMaxWeight = 30; } - - - const chartOptions = { animation: false, // disa scales: { @@ -780,7 +782,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { y: data.value, }); } - if (this.flow_profile_raw.realtimeFlow) { + if (this.flow_profile_raw.realtimeFlow) { for (const data of this.flow_profile_raw.realtimeFlow) { const dataDay = moment(new Date()).startOf('day'); dataDay.add('seconds', data.brew_time); @@ -790,7 +792,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { }); } } - if ( this.flow_profile_raw.pressureFlow) { + if (this.flow_profile_raw.pressureFlow) { for (const data of this.flow_profile_raw.pressureFlow) { const dataDay = moment(new Date()).startOf('day'); dataDay.add('seconds', data.brew_time); @@ -800,7 +802,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { }); } } - } this.flowProfileChartEl.update('quite'); } @@ -831,18 +832,16 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } public shallFlowProfileBeHidden(): boolean { - if (this.smartScaleConnected() === true || this.pressureDeviceConnected() === true) { - return false; - } if ( - this.isEdit === true && - this.data.flow_profile !== '' + this.smartScaleConnected() === true || + this.pressureDeviceConnected() === true ) { return false; } - if ( - this.flow_profile_raw.weight.length > 0 - ) { + if (this.isEdit === true && this.data.flow_profile !== '') { + return false; + } + if (this.flow_profile_raw.weight.length > 0) { return false; } @@ -961,7 +960,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.flowProfileChartEl.update('quite'); },100); **/ - if (scale || pressureDevice ) { + if (scale || pressureDevice) { if (scale) { if (this.settings.bluetooth_scale_tare_on_start_timer === true) { await new Promise((resolve) => { @@ -970,7 +969,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { resolve(undefined); }, 50); }); - } await new Promise((resolve) => { setTimeout(async () => { @@ -978,13 +976,11 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { resolve(undefined); }, 50); }); - } if (pressureDevice) { await pressureDevice.updateZero(); } - this.startingFlowTime = Date.now(); const startingDay = moment(new Date()).startOf('day'); // IF brewtime has some seconds, we add this to the delay directly. @@ -1004,7 +1000,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { if (pressureDevice) { this.attachToPressureChange(); } - } } @@ -1013,12 +1008,11 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { const pressureDevice: PressureDevice = this.bleManager.getPressureDevice(); if (scale || pressureDevice) { - if (scale){ + if (scale) { await scale.setTimer(SCALE_TIMER_COMMAND.START); } this.startingFlowTime = Date.now(); - const startingDay = moment(new Date()).startOf('day'); // IF brewtime has some seconds, we add this to the delay directly. if (this.data.brew_time > 0) { @@ -1041,7 +1035,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { if (pressureDevice) { this.attachToPressureChange(); } - } } @@ -1115,8 +1108,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { resolve(undefined); }, 100); }); - - } } @@ -1323,7 +1314,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { const actual: number = _pressure.actual; const old: number = _pressure.old; - // If no smartscale is connected, the set pressure flow needs to be the master to set flowtime and flowtime seconds, else we just retrieve from the scale. const isSmartScaleConnected = this.smartScaleConnected(); if (!isSmartScaleConnected) { @@ -1332,7 +1322,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } } - const actualUnixTime: number = moment(new Date()) .startOf('day') .add('milliseconds', Date.now() - this.startingFlowTime) @@ -1403,7 +1392,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { oldSmoothedWeight: oldSmoothedWeight, flowTime: this.flowTime, flowTimeSecond: this.flowTime + '.' + this.flowSecondTick, - flowTimestamp: this.uiHelper.getActualTimeWithMilliseconds() + flowTimestamp: this.uiHelper.getActualTimeWithMilliseconds(), }; if (this.flowTime !== this.getTime()) { @@ -1702,7 +1691,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { private pushPressureProfile( _brewTime: string, _actualPressure: number, - _oldPressure: number, + _oldPressure: number ) { const pressureFlow: IBrewPressureFlow = {} as IBrewPressureFlow; pressureFlow.timestamp = this.uiHelper.getActualTimeWithMilliseconds(); @@ -2098,7 +2087,10 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { const { data } = await modal.onWillDismiss(); if (data !== undefined && data.brew_beverage_quantity > 0) { - this.data.brew_beverage_quantity = this.uiHelper.toFixedIfNecessary(data.brew_beverage_quantity, 1); + this.data.brew_beverage_quantity = this.uiHelper.toFixedIfNecessary( + data.brew_beverage_quantity, + 1 + ); } } } diff --git a/src/interfaces/settings/iSettings.ts b/src/interfaces/settings/iSettings.ts index 3c16b79cb..b34382e1a 100755 --- a/src/interfaces/settings/iSettings.ts +++ b/src/interfaces/settings/iSettings.ts @@ -1,19 +1,19 @@ -import {PressureType, ScaleType} from './../../classes/devices'; /** Interfaces */ /** Enums */ -import {BREW_VIEW_ENUM} from '../../enums/settings/brewView'; -import {IConfig} from '../objectConfig/iObjectConfig'; -import {IBrewParameter} from '../parameter/iBrewParameter'; -import {STARTUP_VIEW_ENUM} from '../../enums/settings/startupView'; -import {IOrderBrewParameter} from '../parameter/iOrderBrewParameter'; -import {IBrewPageFilter} from '../brew/iBrewPageFilter'; -import {IBeanPageSort} from '../bean/iBeanPageSort'; -import {ListViewBrewParameter} from '../../classes/parameter/listViewBrewParameter'; -import {IBeanPageFilter} from '../bean/iBeanPageFilter'; -import {IBrewGraphs} from '../brew/iBrewGraphs'; +import { BREW_VIEW_ENUM } from '../../enums/settings/brewView'; +import { IConfig } from '../objectConfig/iObjectConfig'; +import { IBrewParameter } from '../parameter/iBrewParameter'; +import { STARTUP_VIEW_ENUM } from '../../enums/settings/startupView'; +import { IOrderBrewParameter } from '../parameter/iOrderBrewParameter'; +import { IBrewPageFilter } from '../brew/iBrewPageFilter'; +import { IBeanPageSort } from '../bean/iBeanPageSort'; +import { ListViewBrewParameter } from '../../classes/parameter/listViewBrewParameter'; +import { IBeanPageFilter } from '../bean/iBeanPageFilter'; +import { IBrewGraphs } from '../brew/iBrewGraphs'; +import { PressureType, ScaleType } from '@graphefruit/coffee-bluetooth-devices'; export interface ISettings { - // Properties + // Properties brew_view: BREW_VIEW_ENUM; startup_view: STARTUP_VIEW_ENUM; @@ -45,29 +45,28 @@ export interface ISettings { show_cupping_section: boolean; brew_filter: { - OPEN: IBrewPageFilter, - ARCHIVED: IBrewPageFilter + OPEN: IBrewPageFilter; + ARCHIVED: IBrewPageFilter; }; bean_filter: { - OPEN: IBeanPageFilter, - ARCHIVED: IBeanPageFilter + OPEN: IBeanPageFilter; + ARCHIVED: IBeanPageFilter; }; - bean_sort: { - OPEN: IBeanPageSort, - ARCHIVED: IBeanPageSort + OPEN: IBeanPageSort; + ARCHIVED: IBeanPageSort; }; green_bean_sort: { - OPEN: IBeanPageSort, - ARCHIVED: IBeanPageSort + OPEN: IBeanPageSort; + ARCHIVED: IBeanPageSort; }; graph: { - ESPRESSO: IBrewGraphs, - FILTER: IBrewGraphs, + ESPRESSO: IBrewGraphs; + FILTER: IBrewGraphs; }; welcome_page_showed: boolean; @@ -87,7 +86,6 @@ export interface ISettings { bluetooth_ignore_negative_values: boolean; bluetooth_ignore_anomaly_values: boolean; - pressure_id: string; pressure_type: PressureType; pressure_log: boolean; diff --git a/src/services/bleManager/ble-manager.service.spec.ts b/src/services/bleManager/ble-manager.service.spec.ts deleted file mode 100644 index 229f0b785..000000000 --- a/src/services/bleManager/ble-manager.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { BleManagerService } from './ble-manager.service'; - -describe('BleManagerService', () => { - let service: BleManagerService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(BleManagerService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/services/bleManager/ble-manager.service.ts b/src/services/bleManager/ble-manager.service.ts deleted file mode 100644 index f79ef8f69..000000000 --- a/src/services/bleManager/ble-manager.service.ts +++ /dev/null @@ -1,601 +0,0 @@ -import { Platforms } from '@ionic/core'; -import { PeripheralData } from '../../classes/devices/ble.types'; -import { Injectable } from '@angular/core'; -import { - BluetoothScale, - ScaleType, - makeDevice, - LunarScale, - DecentScale, - JimmyScale, - PressureType, - makePressureDevice, -} from '../../classes/devices'; -import { Platform } from '@ionic/angular'; -import { UILog } from '../uiLog'; -import { UIToast } from '../uiToast'; -import { AndroidPermissions } from '@ionic-native/android-permissions/ngx'; -import { Observable, Subject } from 'rxjs'; -import { UIHelper } from '../uiHelper'; -import FelicitaScale from '../../classes/devices/felicitaScale'; -import PopsiclePressure from '../../classes/devices/popsiclePressure'; -import { PressureDevice } from '../../classes/devices/pressureBluetoothDevice'; -import TransducerDirectPressure from '../../classes/devices/transducerDirectPressure'; - -declare var ble; -declare var window; - -@Injectable({ - providedIn: 'root', -}) -export class BleManagerService { - public scale: BluetoothScale = null; - public pressureDevice: PressureDevice = null; - public failed: boolean; - public ready: boolean; - - private eventSubject = new Subject(); - - constructor( - private readonly platform: Platform, - private readonly uiLog: UILog, - private readonly uiToast: UIToast, - private androidPermissions: AndroidPermissions, - private readonly uiHelper: UIHelper - ) { - this.failed = false; - this.ready = true; - } - - private stopScanning() { - return new Promise((resolve, reject) => { - return ble.stopScan(resolve, reject); - }); - } - - public attachOnEvent(): Observable { - return this.eventSubject.asObservable(); - } - - private __sendEvent(_type: string) { - this.eventSubject.next({ type: _type }); - } - - public async hasLocationPermission(): Promise { - return new Promise((resolve, reject) => { - if (this.platform.is('android')) { - this.androidPermissions - .hasPermission( - this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION - ) - .then( - (_status) => { - if (_status.hasPermission === false) { - resolve(false); - } else { - resolve(true); - } - }, - () => { - resolve(false); - } - ); - } else { - resolve(true); - } - }); - } - - public async hasBluetoothPermission(): Promise { - return new Promise((resolve, reject) => { - if (this.platform.is('android')) { - this.androidPermissions - .hasPermission(this.androidPermissions.PERMISSION.BLUETOOTH_ADMIN) - .then( - (_status) => { - if (_status.hasPermission === false) { - resolve(false); - } else { - resolve(true); - } - }, - () => { - resolve(false); - } - ); - } else { - resolve(true); - } - }); - } - - public async requestBluetoothPermissions() { - return new Promise((resolve, reject) => { - this.androidPermissions - .requestPermission(this.androidPermissions.PERMISSION.BLUETOOTH_ADMIN) - .then( - (_status) => { - if (_status.hasPermission === false) { - resolve(false); - } else { - resolve(true); - } - }, - () => { - resolve(false); - } - ); - }); - } - - public async requestLocationPermissions() { - return new Promise((resolve, reject) => { - this.androidPermissions - .requestPermission( - this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION - ) - .then( - (_status) => { - if (_status.hasPermission === false) { - resolve(false); - } else { - resolve(true); - } - }, - () => { - resolve(false); - } - ); - }); - } - - public async scanDevices(): Promise> { - return new Promise>((resolve, reject) => { - const devices: Array = []; - - let timeoutVar: any = null; - const stopScanningAndResolve = async () => { - try { - await this.stopScanning(); - } catch (ex) { - // Grab error. - } - - this.uiLog.log('Scales found ' + JSON.stringify(devices)); - resolve(devices); - }; - - ble.startScan( - [], - async (device) => { - this.uiLog.log('Device found ' + JSON.stringify(device)); - if ( - DecentScale.test(device) || - LunarScale.test(device) || - JimmyScale.test(device) || - FelicitaScale.test(device) - ) { - // We found all needed devices. - devices.push(device); - - this.uiLog.log('Supported Scale found ' + JSON.stringify(device)); - clearTimeout(timeoutVar); - timeoutVar = null; - await stopScanningAndResolve(); - } - }, - () => { - resolve(devices); - } - ); - timeoutVar = setTimeout(async () => { - await stopScanningAndResolve(); - }, 60000); - }); - } - - public async scanPressureDevices(): Promise> { - return new Promise>((resolve, reject) => { - const devices: Array = []; - - let timeoutVar: any = null; - const stopScanningAndResolve = async () => { - try { - await this.stopScanning(); - } catch (ex) { - // Grab error. - } - - this.uiLog.log('Pressure devices found ' + JSON.stringify(devices)); - resolve(devices); - }; - - ble.startScan( - [], - async (device) => { - this.uiLog.log('Pressure devices found ' + JSON.stringify(device)); - if ( - PopsiclePressure.test(device) || - TransducerDirectPressure.test(device) - ) { - // We found all needed devices. - devices.push(device); - - this.uiLog.log( - 'Supported pressure devices found ' + JSON.stringify(device) - ); - clearTimeout(timeoutVar); - timeoutVar = null; - await stopScanningAndResolve(); - } - }, - () => { - resolve(devices); - } - ); - timeoutVar = setTimeout(async () => { - await stopScanningAndResolve(); - }, 60000); - }); - } - - public disconnect( - deviceId: string, - show_toast: boolean = true - ): Promise { - return new Promise((resolve, reject) => { - ble.disconnect( - deviceId, - () => { - this.scale = null; - if (show_toast) { - this.uiToast.showInfoToast('SCALE.DISCONNECTED_SUCCESSFULLY'); - } - resolve(true); - }, - () => { - resolve(false); - } - ); - }); - } - - public disconnectPressureDevice( - deviceId: string, - show_toast: boolean = true - ): Promise { - return new Promise((resolve, reject) => { - ble.disconnect( - deviceId, - () => { - this.pressureDevice = null; - if (show_toast) { - this.uiToast.showInfoToast('SCALE.DISCONNECTED_SUCCESSFULLY'); - } - resolve(true); - }, - () => { - resolve(false); - } - ); - }); - } - - public isBleEnabled(): Promise { - return new Promise((resolve, reject) => { - ble.isEnabled( - () => { - resolve(true); - }, - () => { - resolve(false); - } - ); - }); - } - - public getScale() { - return this.scale; - } - - public getPressureDevice() { - return this.pressureDevice; - } - - public getPressure() { - try { - if (this.pressureDevice) { - return this.uiHelper.toFixedIfNecessary( - this.pressureDevice.getPressure(), - 2 - ); - } - return 0; - } catch (ex) { - return 0; - } - } - - public getScaleWeight() { - try { - if (this.scale) { - return this.uiHelper.toFixedIfNecessary(this.scale.getWeight(), 1); - } - return 0; - } catch (ex) { - return 0; - } - } - - private async __scanAutoConnectScaleIOS() { - return new Promise(async (resolve, reject) => { - if (this.platform.is('ios')) { - // We just need to scan, then we can auto connect for iOS (lol) - this.uiLog.log('Try to find scale on iOS'); - const device = await this.tryToFindScale(); - if (device === undefined) { - this.uiLog.log('Scale not found, retry'); - // Try every 11 seconds, because the search algorythm goes 10 seconds at all. - const intV = setInterval(async () => { - const scaleStub = await this.tryToFindScale(); - if (scaleStub !== undefined) { - resolve(true); - clearInterval(intV); - } else { - this.uiLog.log('Scale not found, retry'); - } - }, 61000); - } else { - resolve(true); - } - } else { - resolve(true); - } - }); - } - - private async __scanAutoConnectPressureDeviceIOS() { - return new Promise(async (resolve, reject) => { - if (this.platform.is('ios')) { - // We just need to scan, then we can auto connect for iOS (lol) - this.uiLog.log('Try to find pressure on iOS'); - const device = await this.tryToFindPressureDevice(); - if (device === undefined) { - this.uiLog.log('Pressure device not found, retry'); - // Try every 61 seconds, because the search algorythm goes 60 seconds at all. - const intV = setInterval(async () => { - const pressureStub = await this.tryToFindPressureDevice(); - if (pressureStub !== undefined) { - resolve(true); - clearInterval(intV); - } else { - this.uiLog.log('Pressure device not found, retry'); - } - }, 61000); - } else { - resolve(true); - } - } else { - resolve(true); - } - }); - } - - public async tryToFindScale() { - return new Promise<{ id: string; type: ScaleType }>( - async (resolve, reject) => { - const devices: Array = await this.scanDevices(); - this.uiLog.log('BleManager - Loop through devices'); - for (const device of devices) { - if (DecentScale.test(device)) { - this.uiLog.log('BleManager - We found a decent scale'); - resolve({ id: device.id, type: ScaleType.DECENT }); - return; - } - if (LunarScale.test(device)) { - this.uiLog.log('BleManager - We found a lunar/acaia scale'); - resolve({ id: device.id, type: ScaleType.LUNAR }); - return; - } - if (JimmyScale.test(device)) { - this.uiLog.log('BleManager - We found a jimmy scale'); - resolve({ id: device.id, type: ScaleType.JIMMY }); - return; - } - if (FelicitaScale.test(device)) { - this.uiLog.log('BleManager - We found a felicita scale'); - resolve({ id: device.id, type: ScaleType.FELICITA }); - return; - } - } - resolve(undefined); - } - ); - } - - public async tryToFindPressureDevice() { - return new Promise<{ id: string; type: PressureType }>( - async (resolve, reject) => { - const devices: Array = await this.scanPressureDevices(); - this.uiLog.log('BleManager - Loop through pressure devices'); - for (const device of devices) { - if (PopsiclePressure.test(device)) { - this.uiLog.log('BleManager - We found a popsicle pressure device '); - resolve({ id: device.id, type: PressureType.POPSICLE }); - return; - } else if (TransducerDirectPressure.test(device)) { - this.uiLog.log( - 'BleManager - We found a Transducer Direct pressure device ' - ); - resolve({ id: device.id, type: PressureType.DIRECT }); - return; - } - } - resolve(undefined); - } - ); - } - - private async __iOSAccessBleStackAndAutoConnect( - _findPressureDevice: boolean = false - ) { - return await new Promise((resolve) => { - let counter: number = 1; - const iOSScanInterval = setInterval(async () => { - try { - this.uiLog.log( - '__iOSAccessBleStackAndAutoConnect - Try to get bluetooth state' - ); - const enabled: boolean = await this.isBleEnabled(); - if (enabled === true) { - clearInterval(iOSScanInterval); - if (_findPressureDevice === false) { - await this.__scanAutoConnectScaleIOS(); - this.uiLog.log( - '__iOSAccessBleStackAndAutoConnect - Scale for iOS found, resolve now' - ); - } else { - await this.__scanAutoConnectPressureDeviceIOS(); - this.uiLog.log( - '__iOSAccessBleStackAndAutoConnect - Pressure devices for iOS found, resolve now' - ); - } - - resolve(null); - } else { - this.uiLog.log( - '__iOSAccessBleStackAndAutoConnect - Bluetooth not enabled, try again' - ); - } - } catch (ex) { - this.uiLog.log( - '__iOSAccessBleStackAndAutoConnect - Bluetooth error occured ' + - JSON.stringify(ex) - ); - } - counter++; - if (counter > 10) { - this.uiLog.log( - '__iOSAccessBleStackAndAutoConnect - iOS - Stop after 10 tries' - ); - clearInterval(iOSScanInterval); - resolve(null); - } - }, 1000); - }); - } - - public async autoConnectScale( - deviceType: ScaleType, - deviceId: string, - _retryScanForIOS: boolean = false - ) { - if (_retryScanForIOS) { - // iOS needs to know the scale, before auto connect can be done - await this.__iOSAccessBleStackAndAutoConnect(); - } - - this.uiLog.log('AutoConnectScale - We can start or we waited for iOS'); - - - this.uiLog.log( - 'AutoConnectScale - We created our promise, and try to autoconnect to device now.' - ); - ble.autoConnect( - deviceId, - (data: PeripheralData) => { - this.connectCallback(deviceType,data); - }, - () => { - this.disconnectCallback(); - } - ); - - } - - public async autoConnectPressureDevice( - pressureType: PressureType, - deviceId: string, - _retryScanForIOS: boolean = false - ) { - if (_retryScanForIOS) { - // iOS needs to know the scale, before auto connect can be done - await this.__iOSAccessBleStackAndAutoConnect(true); - } - - this.uiLog.log( - 'AutoConnectPressureDevice - We can start or we waited for iOS' - ); - - - this.uiLog.log( - 'AutoConnectPressureDevice - We created our promise, and try to autoconnect to device now.' - ); - ble.autoConnect( - deviceId, - (data: PeripheralData) => { - this.connectPressureCallback(pressureType,data); - }, - () => { - this.disconnectPressureCallback(); - } - ); - - } - - private connectCallback( - deviceType: ScaleType, - data: PeripheralData - ) { - // wait for full data - if (!this.scale || 'characteristics' in data) { - this.scale = makeDevice( - deviceType, - data, - this.platform.platforms() as Platforms[] - ); - this.uiLog.log('Connected successfully'); - this.uiToast.showInfoToast('SCALE.CONNECTED_SUCCESSFULLY'); - this.__sendEvent('CONNECT_SCALE'); - } - } - - private disconnectCallback() { - if (this.scale) { - this.scale.disconnectTriggered(); - this.scale = null; - this.uiToast.showInfoToast('SCALE.DISCONNECTED_UNPLANNED'); - this.uiLog.log('Disconnected successfully'); - } - // Send disconnect callback, even if scale is already null/not existing anymore - this.__sendEvent('DISCONNECT_SCALE'); - } - - private connectPressureCallback( - pressureTaype: PressureType, - data: PeripheralData - ) { - // wait for full data - if (!this.pressureDevice || 'characteristics' in data) { - this.pressureDevice = makePressureDevice( - pressureTaype, - data, - this.platform.platforms() as Platforms[] - ); - this.uiLog.log('Pressure Connected successfully'); - this.uiToast.showInfoToast('PRESSURE.CONNECTED_SUCCESSFULLY'); - this.__sendEvent('CONNECT_PRESSURE'); - } - } - - private disconnectPressureCallback() { - if (this.scale) { - this.pressureDevice.disconnect(); - this.pressureDevice = null; - this.uiToast.showInfoToast('PRESSURE.DISCONNECTED_UNPLANNED'); - this.uiLog.log('Disconnected successfully'); - } - // Send disconnect callback, even if scale is already null/not existing anymore - this.__sendEvent('DISCONNECT_PRESSURE'); - } -} diff --git a/tsconfig.worker.json b/tsconfig.worker.json index 22dc45408..d461551c5 100644 --- a/tsconfig.worker.json +++ b/tsconfig.worker.json @@ -10,6 +10,6 @@ "types": [] }, "include": [ - "src/**/*.worker.ts" + ] } From 3d4c3f3ca99d1c4f2412a6faed714b123b165b64 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 31 Jul 2022 13:05:59 +0200 Subject: [PATCH 48/78] #395 - Added milliseconds --- .../brew-timer/brew-timer.component.html | 2 +- .../brew-timer/brew-timer.component.ts | 69 ++++++++++++++----- src/interfaces/timer/iTimer.ts | 1 + 3 files changed, 53 insertions(+), 19 deletions(-) diff --git a/src/components/brew-timer/brew-timer.component.html b/src/components/brew-timer/brew-timer.component.html index 6d7a09271..b4ad3d6c9 100644 --- a/src/components/brew-timer/brew-timer.component.html +++ b/src/components/brew-timer/brew-timer.component.html @@ -2,7 +2,7 @@ {{ label }} - + diff --git a/src/components/brew-timer/brew-timer.component.ts b/src/components/brew-timer/brew-timer.component.ts index e0726abac..1916a2686 100644 --- a/src/components/brew-timer/brew-timer.component.ts +++ b/src/components/brew-timer/brew-timer.component.ts @@ -35,8 +35,10 @@ export class BrewTimerComponent implements OnInit, OnDestroy { private _dripTimerVisible: boolean; - private startedTimestamp: number = -1; - + private startingDay; + private startedTimer; + private pausedTimer; + private startedOffset; get dripTimerVisible(): boolean { return this._dripTimerVisible; } @@ -90,15 +92,6 @@ export class BrewTimerComponent implements OnInit, OnDestroy { return this.timer.hasFinished; } - public setTime(seconds: number): void { - this.timer.seconds = seconds; - this.timer.displayTime = this.getSecondsAsDigitalClock(this.timer.seconds); - this.displayingTime = moment(this.displayingTime) - .startOf('day') - .add('seconds', this.timer.seconds) - .toISOString(); - } - public initTimer(): void { // tslint:disable-next-line this.timer = { @@ -106,6 +99,7 @@ export class BrewTimerComponent implements OnInit, OnDestroy { hasStarted: false, hasFinished: false, seconds: 0, + milliseconds: 0, } as ITimer; this.showBloomTimer = this.bloomTimerVisible; this.showDripTimer = this.dripTimerVisible; @@ -118,11 +112,21 @@ export class BrewTimerComponent implements OnInit, OnDestroy { } public startTimer(_resumed: boolean = false): void { - this.startedTimestamp = Math.floor(Date.now() / 1000); - + if (_resumed === false) { + const startingDate = new Date(); + this.startingDay = moment(startingDate).startOf('day'); + this.startedTimer = moment(startingDate); + this.startedOffset = this.startedTimer.diff(this.startingDay); + } else { + const restartTimer = moment(new Date()); + console.log(this.startedOffset); + console.log(restartTimer.diff(this.pausedTimer)); + this.startedOffset += restartTimer.diff(this.pausedTimer); + } this.timer.hasStarted = true; this.timer.runTimer = true; this.timerTick(); + this.millisecondTick(); if (_resumed === false) { this.timerStarted.emit(); } @@ -135,6 +139,7 @@ export class BrewTimerComponent implements OnInit, OnDestroy { } public pauseTimer(): void { + this.pausedTimer = moment(new Date()); this.timerPaused.emit(); this.timer.runTimer = false; this.timerPaused.emit(); @@ -156,27 +161,47 @@ export class BrewTimerComponent implements OnInit, OnDestroy { this.timerResumed.emit(); } + public millisecondTick(): void { + setTimeout(() => { + if (!this.timer.runTimer) { + return; + } + const milliSecondTimer = moment(new Date()).subtract(this.startedOffset); + + this.timer.milliseconds = milliSecondTimer.milliseconds(); + + this.displayingTime = moment(this.displayingTime) + .startOf('day') + .add('seconds', this.timer.seconds) + .add('milliseconds', this.timer.milliseconds) + .toISOString(); + this.millisecondTick(); + }, 10); + } public timerTick(): void { setTimeout(() => { if (!this.timer.runTimer) { return; } - const currentTickTimestamp: number = Math.floor(Date.now() / 1000); - const delta: number = currentTickTimestamp - this.startedTimestamp; - this.timer.seconds += delta; - this.startedTimestamp = currentTickTimestamp; + const actualDate = new Date(); + const actualTimerTick = moment(actualDate).subtract(this.startedOffset); + + const passedSeconds = actualTimerTick.diff(this.startingDay, 'seconds'); + this.timer.seconds = passedSeconds; this.timer.displayTime = this.getSecondsAsDigitalClock( this.timer.seconds ); this.displayingTime = moment(this.displayingTime) .startOf('day') .add('seconds', this.timer.seconds) + .add('milliseconds', this.timer.milliseconds) .toISOString(); + this.timerTick(); this.changeEvent(); - }, 1000); + }, 10); } public getSeconds(): number { @@ -199,6 +224,14 @@ export class BrewTimerComponent implements OnInit, OnDestroy { public changeEvent() { this.timerTicked.emit(); } + public setTime(seconds: number): void { + this.timer.seconds = seconds; + this.timer.displayTime = this.getSecondsAsDigitalClock(this.timer.seconds); + this.displayingTime = moment(this.displayingTime) + .startOf('day') + .add('seconds', this.timer.seconds) + .toISOString(); + } public getSecondsAsDigitalClock(inputSeconds: number): string { const sec_num = parseInt(inputSeconds.toString(), 10); // don't forget the second param diff --git a/src/interfaces/timer/iTimer.ts b/src/interfaces/timer/iTimer.ts index 614e64df6..74d46959e 100755 --- a/src/interfaces/timer/iTimer.ts +++ b/src/interfaces/timer/iTimer.ts @@ -3,6 +3,7 @@ */ export interface ITimer { seconds: number; + milliseconds: number; runTimer: boolean; hasStarted: boolean; hasFinished: boolean; From 1cf90be76e316806888aecc6fdea752164ef772c Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 31 Jul 2022 17:33:59 +0200 Subject: [PATCH 49/78] #396 - Add wakelock when activated for edit view aswell --- src/app/brew/brew-edit/brew-edit.component.ts | 100 +++++++++++------- 1 file changed, 63 insertions(+), 37 deletions(-) diff --git a/src/app/brew/brew-edit/brew-edit.component.ts b/src/app/brew/brew-edit/brew-edit.component.ts index 00bb9f962..287ee9ec3 100644 --- a/src/app/brew/brew-edit/brew-edit.component.ts +++ b/src/app/brew/brew-edit/brew-edit.component.ts @@ -1,17 +1,19 @@ -import { Component, OnInit, ViewChild} from '@angular/core'; -import {UIHelper} from '../../../services/uiHelper'; -import {UIBrewStorage} from '../../../services/uiBrewStorage'; -import {IBrew} from '../../../interfaces/brew/iBrew'; -import {ModalController, NavParams, Platform} from '@ionic/angular'; -import {Brew} from '../../../classes/brew/brew'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { UIHelper } from '../../../services/uiHelper'; +import { UIBrewStorage } from '../../../services/uiBrewStorage'; +import { IBrew } from '../../../interfaces/brew/iBrew'; +import { ModalController, NavParams, Platform } from '@ionic/angular'; +import { Brew } from '../../../classes/brew/brew'; import moment from 'moment'; -import {UIToast} from '../../../services/uiToast'; -import {UIBrewHelper} from '../../../services/uiBrewHelper'; -import {BrewBrewingComponent} from '../../../components/brews/brew-brewing/brew-brewing.component'; -import {BrewTrackingService} from '../../../services/brewTracking/brew-tracking.service'; +import { UIToast } from '../../../services/uiToast'; +import { UIBrewHelper } from '../../../services/uiBrewHelper'; +import { BrewBrewingComponent } from '../../../components/brews/brew-brewing/brew-brewing.component'; +import { BrewTrackingService } from '../../../services/brewTracking/brew-tracking.service'; import BREW_TRACKING from '../../../data/tracking/brewTracking'; -import {UIAnalytics} from '../../../services/uiAnalytics'; - +import { UIAnalytics } from '../../../services/uiAnalytics'; +import { UISettingsStorage } from '../../../services/uiSettingsStorage'; +import { Insomnia } from '@ionic-native/insomnia/ngx'; +import { Settings } from '../../../classes/settings/settings'; @Component({ selector: 'brew-edit', @@ -19,37 +21,59 @@ import {UIAnalytics} from '../../../services/uiAnalytics'; styleUrls: ['./brew-edit.component.scss'], }) export class BrewEditComponent implements OnInit { - - public static COMPONENT_ID: string = 'brew-edit'; - @ViewChild('brewBrewing', {read: BrewBrewingComponent, static: false}) public brewBrewing: BrewBrewingComponent; + @ViewChild('brewBrewing', { read: BrewBrewingComponent, static: false }) + public brewBrewing: BrewBrewingComponent; public data: Brew = new Brew(); - - - constructor (private readonly modalController: ModalController, - private readonly navParams: NavParams, - private readonly uiBrewStorage: UIBrewStorage, - private readonly uiHelper: UIHelper, - private readonly uiToast: UIToast, - private readonly platform: Platform, - private readonly uiBrewHelper: UIBrewHelper, - private readonly brewTracking: BrewTrackingService, - private readonly uiAnalytics: UIAnalytics) { - + public settings: Settings; + + constructor( + private readonly modalController: ModalController, + private readonly navParams: NavParams, + private readonly uiBrewStorage: UIBrewStorage, + private readonly uiHelper: UIHelper, + private readonly uiToast: UIToast, + private readonly platform: Platform, + private readonly uiBrewHelper: UIBrewHelper, + private readonly brewTracking: BrewTrackingService, + private readonly uiAnalytics: UIAnalytics, + private readonly uiSettingsStorage: UISettingsStorage, + private readonly insomnia: Insomnia + ) { + this.settings = this.uiSettingsStorage.getSettings(); // Moved from ionViewDidEnter, because of Ionic issues with ion-range const brew: IBrew = this.uiHelper.copyData(this.navParams.get('brew')); if (brew !== undefined) { this.data.initializeByObject(brew); } - } + public ionViewDidEnter(): void { + if (this.settings.wake_lock) { + this.insomnia.keepAwake().then( + () => {}, + () => {} + ); + } + } + public ionViewWillLeave() { + if (this.settings.wake_lock) { + this.insomnia.allowSleepAgain().then( + () => {}, + () => {} + ); + } + } public dismiss(): void { - this.modalController.dismiss({ - dismissed: true - },undefined,BrewEditComponent.COMPONENT_ID); + this.modalController.dismiss( + { + dismissed: true, + }, + undefined, + BrewEditComponent.COMPONENT_ID + ); } public async updateBrew() { @@ -65,18 +89,20 @@ export class BrewEditComponent implements OnInit { } await this.uiBrewStorage.update(this.data); - - this.brewTracking.trackBrew(this.data); this.uiToast.showInfoToast('TOAST_BREW_EDITED_SUCCESSFULLY'); - this.uiAnalytics.trackEvent(BREW_TRACKING.TITLE, BREW_TRACKING.ACTIONS.EDIT_FINISH); + this.uiAnalytics.trackEvent( + BREW_TRACKING.TITLE, + BREW_TRACKING.ACTIONS.EDIT_FINISH + ); this.dismiss(); } public ngOnInit() { - this.uiAnalytics.trackEvent(BREW_TRACKING.TITLE, BREW_TRACKING.ACTIONS.EDIT); + this.uiAnalytics.trackEvent( + BREW_TRACKING.TITLE, + BREW_TRACKING.ACTIONS.EDIT + ); } - - } From 686181875ecb456bc1455877b7c22a9b4818f78d Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Tue, 9 Aug 2022 10:27:18 +0200 Subject: [PATCH 50/78] #395 - Added milliseconds --- src/app/app.component.ts | 7 +- .../brew-detail/brew-detail.component.html | 6 +- .../brew/brew-detail/brew-detail.component.ts | 352 ++--- src/app/dashboard/dashboard.page.html | 2 +- src/app/settings/settings.page.html | 5 + src/assets/i18n/de.json | 5 +- src/assets/i18n/en.json | 5 +- src/assets/i18n/es.json | 11 +- src/assets/i18n/tr.json | 11 +- src/assets/i18n/zh-cn.json | 1169 ----------------- src/assets/i18n/zh.json | 11 +- src/classes/brew/brew.ts | 252 ++-- src/classes/settings/settings.ts | 2 + .../brew-timer/brew-timer.component.html | 2 +- .../brew-timer/brew-timer.component.ts | 38 +- .../brew-brewing/brew-brewing.component.html | 22 +- .../brew-brewing/brew-brewing.component.ts | 182 ++- src/components/timer/timer.component.html | 31 +- src/components/timer/timer.component.ts | 239 +++- src/interfaces/brew/iBrew.ts | 23 +- src/interfaces/settings/iSettings.ts | 1 + .../datetime-popover.component.html | 14 +- .../datetime-popover.component.ts | 53 +- src/services/uiBrewHelper.ts | 333 ++--- src/services/uiExcel.ts | 345 +++-- 25 files changed, 1250 insertions(+), 1871 deletions(-) delete mode 100644 src/assets/i18n/zh-cn.json diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 7bd597a2e..2defce90f 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -231,7 +231,6 @@ export class AppComponent implements AfterViewInit { private readonly appVersion: AppVersion, private readonly storage: Storage ) { - console.log(1); // Dont remove androidPlatformService, we need to initialize it via constructor try { // Touch DB Factory to make sure, it is properly initialized even on iOS 14.6 @@ -241,15 +240,11 @@ export class AppComponent implements AfterViewInit { // Touch DB Factory to make sure, it is properly initialized even on iOS 14.6 const db = window.sqlitePlugin; } catch (ex) {} - console.log(2); } - public ngOnInit() { - console.log(3); - } + public ngOnInit() {} public ngAfterViewInit(): void { - console.log(4); this.uiLog.log('Platform ready, init app'); Chart.register(...registerables); diff --git a/src/app/brew/brew-detail/brew-detail.component.html b/src/app/brew/brew-detail/brew-detail.component.html index 417616afb..a3ceeb9b7 100644 --- a/src/app/brew/brew-detail/brew-detail.component.html +++ b/src/app/brew/brew-detail/brew-detail.component.html @@ -221,7 +221,7 @@

{{data.getWater().name}}

data.getPreparation().use_custom_parameters)">

{{'BREW_DATA_TEMPERATURE_TIME' | translate}} / {{'BREW_DATA_SURF_TIME' | translate}}:

-

{{data.brew_temperature_time}}

+

{{formatSeconds(data.brew_temperature_time,data.brew_temperature_time_milliseconds)}}

{{data.getFormattedCoffeeBrewTime()}} data.getPreparation().use_custom_parameters)">

{{"BREW_DATA_COFFEE_BLOOMING_TIME" | translate}}:

-

{{data.coffee_blooming_time}}

+

{{formatSeconds(data.coffee_blooming_time,data.coffee_blooming_time_milliseconds)}}

{{"BREW_DATA_COFFEE_FIRST_DRIP_TIME" | translate}}:

-

{{data.coffee_first_drip_time}}

+

{{formatSeconds(data.coffee_first_drip_time,data.coffee_first_drip_time_milliseconds)}}

diff --git a/src/app/brew/brew-detail/brew-detail.component.ts b/src/app/brew/brew-detail/brew-detail.component.ts index 45245fec7..54e7bab0b 100644 --- a/src/app/brew/brew-detail/brew-detail.component.ts +++ b/src/app/brew/brew-detail/brew-detail.component.ts @@ -1,27 +1,33 @@ -import {Component, OnInit, ViewChild} from '@angular/core'; -import {UISettingsStorage} from '../../../services/uiSettingsStorage'; -import {IonSlides, ModalController, NavParams, Platform} from '@ionic/angular'; -import {UIHelper} from '../../../services/uiHelper'; -import {Brew} from '../../../classes/brew/brew'; -import {IBrew} from '../../../interfaces/brew/iBrew'; -import {Settings} from '../../../classes/settings/settings'; -import {Preparation} from '../../../classes/preparation/preparation'; -import {PREPARATION_STYLE_TYPE} from '../../../enums/preparations/preparationStyleTypes'; -import {UIBrewHelper} from '../../../services/uiBrewHelper'; -import {Chart} from 'chart.js'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { UISettingsStorage } from '../../../services/uiSettingsStorage'; +import { + IonSlides, + ModalController, + NavParams, + Platform, +} from '@ionic/angular'; +import { UIHelper } from '../../../services/uiHelper'; +import { Brew } from '../../../classes/brew/brew'; +import { IBrew } from '../../../interfaces/brew/iBrew'; +import { Settings } from '../../../classes/settings/settings'; +import { Preparation } from '../../../classes/preparation/preparation'; +import { PREPARATION_STYLE_TYPE } from '../../../enums/preparations/preparationStyleTypes'; +import { UIBrewHelper } from '../../../services/uiBrewHelper'; +import { Chart } from 'chart.js'; import BREW_TRACKING from '../../../data/tracking/brewTracking'; -import {UIAnalytics} from '../../../services/uiAnalytics'; -import {UIExcel} from '../../../services/uiExcel'; -import {UIBeanHelper} from '../../../services/uiBeanHelper'; -import {UIPreparationHelper} from '../../../services/uiPreparationHelper'; -import {UIMillHelper} from '../../../services/uiMillHelper'; -import {TranslateService} from '@ngx-translate/core'; -import {BrewFlow, IBrewWaterFlow} from '../../../classes/brew/brewFlow'; -import {UIFileHelper} from '../../../services/uiFileHelper'; -import {UIAlert} from '../../../services/uiAlert'; -import {SocialSharing} from '@ionic-native/social-sharing/ngx'; -import {BrewFlowComponent} from '../brew-flow/brew-flow.component'; -import {ScreenOrientation} from '@ionic-native/screen-orientation/ngx'; +import { UIAnalytics } from '../../../services/uiAnalytics'; +import { UIExcel } from '../../../services/uiExcel'; +import { UIBeanHelper } from '../../../services/uiBeanHelper'; +import { UIPreparationHelper } from '../../../services/uiPreparationHelper'; +import { UIMillHelper } from '../../../services/uiMillHelper'; +import { TranslateService } from '@ngx-translate/core'; +import { BrewFlow, IBrewWaterFlow } from '../../../classes/brew/brewFlow'; +import { UIFileHelper } from '../../../services/uiFileHelper'; +import { UIAlert } from '../../../services/uiAlert'; +import { SocialSharing } from '@ionic-native/social-sharing/ngx'; +import { BrewFlowComponent } from '../brew-flow/brew-flow.component'; +import { ScreenOrientation } from '@ionic-native/screen-orientation/ngx'; +import moment from 'moment'; @Component({ selector: 'brew-detail', @@ -31,72 +37,75 @@ import {ScreenOrientation} from '@ionic-native/screen-orientation/ngx'; export class BrewDetailComponent implements OnInit { public static COMPONENT_ID = 'brew-detail'; public PREPARATION_STYLE_TYPE = PREPARATION_STYLE_TYPE; - @ViewChild('photoSlides', {static: false}) public photoSlides: IonSlides; + @ViewChild('photoSlides', { static: false }) public photoSlides: IonSlides; public data: Brew = new Brew(); public settings: Settings; - @ViewChild('cuppingChart', {static: false}) public cuppingChart; + @ViewChild('cuppingChart', { static: false }) public cuppingChart; private brew: IBrew; public loaded: boolean = false; - @ViewChild('flowProfileChart', {static: false}) public flowProfileChart; + @ViewChild('flowProfileChart', { static: false }) public flowProfileChart; public flowProfileChartEl: any = undefined; public flow_profile_raw: BrewFlow = new BrewFlow(); - constructor (private readonly modalController: ModalController, - private readonly navParams: NavParams, - public uiHelper: UIHelper, - private readonly uiSettingsStorage: UISettingsStorage, - private readonly uiBrewHelper: UIBrewHelper, - private readonly uiAnalytics: UIAnalytics, - private readonly uiExcel: UIExcel, - private readonly uiBeanHelper: UIBeanHelper, - private readonly uiPreparationHelper: UIPreparationHelper, - private readonly uiMillHelper: UIMillHelper, - private readonly translate: TranslateService, - private readonly uiFileHelper: UIFileHelper, - private readonly uiAlert: UIAlert, - private readonly socialSharing: SocialSharing, - private readonly platform: Platform, - private readonly screenOrientation: ScreenOrientation) { - + constructor( + private readonly modalController: ModalController, + private readonly navParams: NavParams, + public uiHelper: UIHelper, + private readonly uiSettingsStorage: UISettingsStorage, + private readonly uiBrewHelper: UIBrewHelper, + private readonly uiAnalytics: UIAnalytics, + private readonly uiExcel: UIExcel, + private readonly uiBeanHelper: UIBeanHelper, + private readonly uiPreparationHelper: UIPreparationHelper, + private readonly uiMillHelper: UIMillHelper, + private readonly translate: TranslateService, + private readonly uiFileHelper: UIFileHelper, + private readonly uiAlert: UIAlert, + private readonly socialSharing: SocialSharing, + private readonly platform: Platform, + private readonly screenOrientation: ScreenOrientation + ) { this.settings = this.uiSettingsStorage.getSettings(); } public async ionViewWillEnter() { - this.uiAnalytics.trackEvent(BREW_TRACKING.TITLE, BREW_TRACKING.ACTIONS.DETAIL); + this.uiAnalytics.trackEvent( + BREW_TRACKING.TITLE, + BREW_TRACKING.ACTIONS.DETAIL + ); this.brew = this.navParams.get('brew'); if (this.brew) { const copy: IBrew = this.uiHelper.copyData(this.brew); this.data.initializeByObject(copy); } - if (this.showCupping()) - { + if (this.showCupping()) { // Set timeout else element wont be visible - setTimeout( () => { + setTimeout(() => { this.__loadCuppingChart(); - },150); + }, 150); } await this.readFlowProfile(); - setTimeout( ()=>{ + setTimeout(() => { this.initializeFlowChart(); - },150); + }, 150); this.loaded = true; - } public async detailBean() { await this.uiBeanHelper.detailBean(this.data.getBean()); } public async detailPreparation() { - await this.uiPreparationHelper.detailPreparation(this.data.getPreparation()); + await this.uiPreparationHelper.detailPreparation( + this.data.getPreparation() + ); } public async detailMill() { await this.uiMillHelper.detailMill(this.data.getMill()); } - public getPreparation(): Preparation { return this.data.getPreparation(); } @@ -111,9 +120,13 @@ export class BrewDetailComponent implements OnInit { return this.uiBrewHelper.showSectionBeforeBrew(this.getPreparation()); } public dismiss(): void { - this.modalController.dismiss({ - dismissed: true - },undefined,BrewDetailComponent.COMPONENT_ID); + this.modalController.dismiss( + { + dismissed: true, + }, + undefined, + BrewDetailComponent.COMPONENT_ID + ); } public ngOnInit() {} @@ -124,18 +137,31 @@ export class BrewDetailComponent implements OnInit { await this.readFlowProfile(); this.initializeFlowChart(); } - - + } + public formatSeconds(seconds: number, milliseconds) { + const secs = seconds; + let formattingStr: string = 'mm:ss'; + const millisecondsEnabled: boolean = this.settings.brew_milliseconds; + if (millisecondsEnabled) { + formattingStr = 'mm:ss.SSS'; + } + const formatted = moment + .utc(secs * 1000) + .add('milliseconds', milliseconds) + .format(formattingStr); + return formatted; } private showCupping(): boolean { return this.uiBrewHelper.showCupping(this.data); } private __loadCuppingChart(): void { - const chartObj = new Chart(this.cuppingChart.nativeElement, this.uiBrewHelper.getCuppingChartData(this.data) as any); + const chartObj = new Chart( + this.cuppingChart.nativeElement, + this.uiBrewHelper.getCuppingChartData(this.data) as any + ); } private initializeFlowChart(): void { - setTimeout(() => { if (this.flowProfileChartEl) { this.flowProfileChartEl.destroy(); @@ -143,22 +169,25 @@ export class BrewDetailComponent implements OnInit { } if (this.flowProfileChartEl === undefined) { let graphSettings = this.settings.graph.FILTER; - if ( this.data.getPreparation().style_type === - PREPARATION_STYLE_TYPE.ESPRESSO) { + if ( + this.data.getPreparation().style_type === + PREPARATION_STYLE_TYPE.ESPRESSO + ) { graphSettings = this.settings.graph.ESPRESSO; } const drinkingData = { labels: [], - datasets: [{ - label: this.translate.instant('BREW_FLOW_WEIGHT'), - data: [], - borderColor: 'rgb(159,140,111)', - backgroundColor: 'rgb(205,194,172)', - yAxisID: 'y', - pointRadius: 0, - hidden: !graphSettings.weight - }, + datasets: [ + { + label: this.translate.instant('BREW_FLOW_WEIGHT'), + data: [], + borderColor: 'rgb(159,140,111)', + backgroundColor: 'rgb(205,194,172)', + yAxisID: 'y', + pointRadius: 0, + hidden: !graphSettings.weight, + }, { label: this.translate.instant('BREW_FLOW_WEIGHT_PER_SECOND'), data: [], @@ -167,7 +196,7 @@ export class BrewDetailComponent implements OnInit { yAxisID: 'y1', spanGaps: true, pointRadius: 0, - hidden: !graphSettings.calc_flow + hidden: !graphSettings.calc_flow, }, { label: this.translate.instant('BREW_FLOW_WEIGHT_REALTIME'), @@ -178,38 +207,36 @@ export class BrewDetailComponent implements OnInit { spanGaps: true, pointRadius: 0, tension: 0, - hidden: !graphSettings.realtime_flow - }] + hidden: !graphSettings.realtime_flow, + }, + ], }; const chartOptions = { - plugins: { - backgroundColorPlugin: { - + backgroundColorPlugin: {}, + zoom: { + pan: { + enabled: true, + mode: 'x', }, zoom: { - pan: { + wheel: { + enabled: false, + }, + drag: { + enabled: true, + }, + pinch: { enabled: true, - mode: 'x', }, - zoom: { - wheel: { - enabled: false, - }, - drag: { - enabled: true, - }, - pinch: { - enabled: true - }, - mode: 'x', - } - } + mode: 'x', + }, }, + }, animation: true, legend: { display: false, - position: 'top' + position: 'top', }, responsive: true, maintainAspectRatio: false, @@ -246,13 +273,16 @@ export class BrewDetailComponent implements OnInit { }, xAxis: { ticks: { - maxTicksLimit: 10 - } - } - } + maxTicksLimit: 10, + }, + }, + }, }; - if (this.flow_profile_raw.pressureFlow && this.flow_profile_raw.pressureFlow.length > 0) { + if ( + this.flow_profile_raw.pressureFlow && + this.flow_profile_raw.pressureFlow.length > 0 + ) { chartOptions.scales['y3'] = { type: 'linear', display: true, @@ -267,26 +297,33 @@ export class BrewDetailComponent implements OnInit { }; } - this.flowProfileChartEl = new Chart(this.flowProfileChart.nativeElement, { - type: 'line', - data: drinkingData, - options: chartOptions, - plugins: [{ - id: 'backgroundColorPlugin', - beforeDraw: (chart, args, options) => { - const ctx = chart.canvas.getContext('2d'); - ctx.save(); - ctx.globalCompositeOperation = 'destination-over'; - ctx.fillStyle = 'white'; - ctx.fillRect(0, 0, chart.width, chart.height); - ctx.restore(); - } - }] - } as any); + this.flowProfileChartEl = new Chart( + this.flowProfileChart.nativeElement, + { + type: 'line', + data: drinkingData, + options: chartOptions, + plugins: [ + { + id: 'backgroundColorPlugin', + beforeDraw: (chart, args, options) => { + const ctx = chart.canvas.getContext('2d'); + ctx.save(); + ctx.globalCompositeOperation = 'destination-over'; + ctx.fillStyle = 'white'; + ctx.fillRect(0, 0, chart.width, chart.height); + ctx.restore(); + }, + }, + ], + } as any + ); if (this.flow_profile_raw.weight.length > 0) { for (const data of this.flow_profile_raw.weight) { - this.flowProfileChartEl.data.datasets[0].data.push(data.actual_weight); + this.flowProfileChartEl.data.datasets[0].data.push( + data.actual_weight + ); this.flowProfileChartEl.data.labels.push(data.brew_time); } @@ -295,43 +332,57 @@ export class BrewDetailComponent implements OnInit { } if (this.flow_profile_raw.realtimeFlow) { for (const data of this.flow_profile_raw.realtimeFlow) { - this.flowProfileChartEl.data.datasets[2].data.push(data.flow_value); + this.flowProfileChartEl.data.datasets[2].data.push( + data.flow_value + ); } } if (this.flow_profile_raw.pressureFlow) { for (const data of this.flow_profile_raw.pressureFlow) { - this.flowProfileChartEl.data.datasets[3].data.push(data.actual_pressure); + this.flowProfileChartEl.data.datasets[3].data.push( + data.actual_pressure + ); } } this.flowProfileChartEl.update(); } } - },250); + }, 250); } public async maximizeFlowGraph() { let actualOrientation; if (this.platform.is('cordova')) { - actualOrientation = this.screenOrientation.type; + actualOrientation = this.screenOrientation.type; } - const oldCanvasHeight = document.getElementById('canvasContainerBrew').offsetHeight; + const oldCanvasHeight = document.getElementById( + 'canvasContainerBrew' + ).offsetHeight; await new Promise(async (resolve) => { - if (this.platform.is('cordova')) { - await this.screenOrientation.lock(this.screenOrientation.ORIENTATIONS.LANDSCAPE); + await this.screenOrientation.lock( + this.screenOrientation.ORIENTATIONS.LANDSCAPE + ); } resolve(undefined); }); - const modal = await this.modalController.create({component: BrewFlowComponent, - id:BrewFlowComponent.COMPONENT_ID, - breakpoints: [0,1], - initialBreakpoint:1, + const modal = await this.modalController.create({ + component: BrewFlowComponent, + id: BrewFlowComponent.COMPONENT_ID, + breakpoints: [0, 1], + initialBreakpoint: 1, cssClass: 'popover-actions', - componentProps: {brewComponent: this, brew: this.data,flowChartEl: this.flowProfileChartEl, isDetail: true}}); + componentProps: { + brewComponent: this, + brew: this.data, + flowChartEl: this.flowProfileChartEl, + isDetail: true, + }, + }); await modal.present(); await modal.onWillDismiss().then(async () => { // If responsive would be true, the add of the container would result into 0 width 0 height, therefore the hack @@ -340,24 +391,31 @@ export class BrewDetailComponent implements OnInit { this.flowProfileChartEl.update(); if (this.platform.is('cordova')) { - if (this.screenOrientation.type === this.screenOrientation.ORIENTATIONS.LANDSCAPE) { - if (this.screenOrientation.ORIENTATIONS.LANDSCAPE === actualOrientation) { + if ( + this.screenOrientation.type === + this.screenOrientation.ORIENTATIONS.LANDSCAPE + ) { + if ( + this.screenOrientation.ORIENTATIONS.LANDSCAPE === actualOrientation + ) { // Get back to portrait setTimeout(async () => { - await this.screenOrientation.lock(this.screenOrientation.ORIENTATIONS.PORTRAIT_PRIMARY); + await this.screenOrientation.lock( + this.screenOrientation.ORIENTATIONS.PORTRAIT_PRIMARY + ); }, 50); - } - } - setTimeout( () => { + setTimeout(() => { this.screenOrientation.unlock(); - },150); + }, 150); } await new Promise((resolve) => { setTimeout(async () => { - document.getElementById('canvasContainerBrew').append(this.flowProfileChartEl.ctx.canvas); + document + .getElementById('canvasContainerBrew') + .append(this.flowProfileChartEl.ctx.canvas); resolve(undefined); }, 50); }); @@ -365,7 +423,8 @@ export class BrewDetailComponent implements OnInit { await new Promise((resolve) => { setTimeout(async () => { // If we would not set the old height, the graph would explode to big. - document.getElementById('canvasContainerBrew').style.height = oldCanvasHeight + 'px'; + document.getElementById('canvasContainerBrew').style.height = + oldCanvasHeight + 'px'; this.flowProfileChartEl.options.responsive = true; this.flowProfileChartEl.update(); resolve(undefined); @@ -377,13 +436,12 @@ export class BrewDetailComponent implements OnInit { private async readFlowProfile() { if (this.data.flow_profile !== '') { await this.uiAlert.showLoadingSpinner(); - const flowProfilePath = 'brews/' + this.data.config.uuid + '_flow_profile.json'; + const flowProfilePath = + 'brews/' + this.data.config.uuid + '_flow_profile.json'; try { const jsonParsed = await this.uiFileHelper.getJSONFile(flowProfilePath); this.flow_profile_raw = jsonParsed; - } catch(ex) { - - } + } catch (ex) {} await this.uiAlert.hideLoadingSpinner(); } @@ -392,20 +450,21 @@ export class BrewDetailComponent implements OnInit { await this.uiExcel.exportBrewFlowProfile(this.flow_profile_raw); } public async shareFlowProfile() { - - const fileShare: string = this.flowProfileChartEl.toBase64Image('image/jpeg', 1); - this.socialSharing.share(null,null,fileShare,null); + const fileShare: string = this.flowProfileChartEl.toBase64Image( + 'image/jpeg', + 1 + ); + this.socialSharing.share(null, null, fileShare, null); } public getAvgFlow(): number { - const waterFlows: Array = this.flow_profile_raw.waterFlow; let calculatedFlow: number = 0; let foundEntries: number = 0; for (const water of waterFlows) { if (water.value > 0) { - calculatedFlow +=water.value; - foundEntries +=1; + calculatedFlow += water.value; + foundEntries += 1; } } if (calculatedFlow > 0) { @@ -413,5 +472,4 @@ export class BrewDetailComponent implements OnInit { } return 0; } - } diff --git a/src/app/dashboard/dashboard.page.html b/src/app/dashboard/dashboard.page.html index 0e455bd6d..3eeb90b7f 100644 --- a/src/app/dashboard/dashboard.page.html +++ b/src/app/dashboard/dashboard.page.html @@ -14,7 +14,7 @@ - shit + shit diff --git a/src/app/settings/settings.page.html b/src/app/settings/settings.page.html index be662cd80..0afb2dcee 100644 --- a/src/app/settings/settings.page.html +++ b/src/app/settings/settings.page.html @@ -139,6 +139,11 @@

{{"PAGE_SETTINGS_ANALYTICS_INFORMATION" | translate}}

{{"PAGE_SETTINGS_FAST_REPEAT_DESCRIPTION" | translate}}

+ +

{{"PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS" | translate}}

+

{{"PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION" | translate}}

+ +
{{"PAGE_SETTINGS_CURRENCY" | translate}} diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index e55060fb9..ce96feae9 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -1196,5 +1196,8 @@ "PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE": "Druck Geräte", "PRESSURE_LOG": "Logfiles für Druck aktivieren", "PRESSURE_THRESHOLD_ACTIVE": "Zeit starten ab bestimmten Druck?", - "PRESSURE_THRESHOLD_BAR": "Schwellenwert Druck" + "PRESSURE_THRESHOLD_BAR": "Schwellenwert Druck", + "TIMER_MILLISECONDS": "MS", + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS": "Millisekunden?", + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Verwende Millisekunden um noch akkurater deine Brühungen zu Analysieren" } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index da1a439a5..400f0ef0e 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -1196,5 +1196,8 @@ "PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE": "Pressure device", "PRESSURE_LOG": "Activate logfiles for pressure device", "PRESSURE_THRESHOLD_ACTIVE": "Start timer with predefined pressure", - "PRESSURE_THRESHOLD_BAR": "Threshold pressure" + "PRESSURE_THRESHOLD_BAR": "Threshold pressure", + "TIMER_MILLISECONDS": "MS", + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS": "Milliseconds?", + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Use milliseconds to even more accurately analyze your brews" } diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index 29cb36287..ab141e2f9 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -1190,5 +1190,14 @@ "BREW_FLOW_WEIGHT_REALTIME": "Fujo (tiempo real)", "SMART_SCALE_STOP_TIMER_ON_BREW": "Stop scale timer on new brew", "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew", - "BREW_PRESSURE_FLOW": "Pressure" + "BREW_PRESSURE_FLOW": "Pressure", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_FILTER": "Show graphs for filter", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_ESPRESSO": "Show graphs for espresso", + "PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE": "Pressure device", + "PRESSURE_LOG": "Activate logfiles for pressure device", + "PRESSURE_THRESHOLD_ACTIVE": "Start timer with predefined pressure", + "PRESSURE_THRESHOLD_BAR": "Threshold pressure", + "TIMER_MILLISECONDS": "MS", + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS": "Milliseconds?", + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Use milliseconds to even more accurately analyze your brews" } diff --git a/src/assets/i18n/tr.json b/src/assets/i18n/tr.json index 786760a1a..7d51e0eff 100644 --- a/src/assets/i18n/tr.json +++ b/src/assets/i18n/tr.json @@ -1190,5 +1190,14 @@ "BREW_FLOW_WEIGHT_REALTIME": "Flow (Realtime)", "SMART_SCALE_STOP_TIMER_ON_BREW": "Stop scale timer on new brew", "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew", - "BREW_PRESSURE_FLOW": "Pressure" + "BREW_PRESSURE_FLOW": "Pressure", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_FILTER": "Show graphs for filter", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_ESPRESSO": "Show graphs for espresso", + "PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE": "Pressure device", + "PRESSURE_LOG": "Activate logfiles for pressure device", + "PRESSURE_THRESHOLD_ACTIVE": "Start timer with predefined pressure", + "PRESSURE_THRESHOLD_BAR": "Threshold pressure", + "TIMER_MILLISECONDS": "MS", + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS": "Milliseconds?", + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Use milliseconds to even more accurately analyze your brews" } diff --git a/src/assets/i18n/zh-cn.json b/src/assets/i18n/zh-cn.json deleted file mode 100644 index 40d3d6843..000000000 --- a/src/assets/i18n/zh-cn.json +++ /dev/null @@ -1,1169 +0,0 @@ -{ - "NAV_MENU": "菜单", - "NAV_HOME": "主页", - "NAV_SETTINGS": "设置", - "NAV_BREWS": "冲泡", - "NAV_BEANS": "咖啡豆", - "NAV_PREPARATION": "冲泡方法", - "NAV_MILL": "磨豆机", - "NAV_ABOUT_US": "关于我们", - "NAV_CONTACT": "联系方式", - "NAV_PRIVACY": "隐私", - "NAV_CREDITS": "Credits", - "NAV_TERMS": "团队和贡献者", - "NAV_THANKS": "谢谢!", - "NAV_LICENCES": "开源许可证", - "NAV_STATISTICS": "数据统计", - "NAV_IMPRESSUM": "公司信息", - "NAV_COOKIE": "缓存文件", - "NAV_LOGS": "日志", - "NAV_BREW_PARAMS": "冲泡参数", - "NAV_INFORMATION_TO_APP": "关于软件", - "NAV_WATER_SECTION": "水质", - "NAV_HELPER": "计算", - "POPOVER_BREWS_OPTION_REPEAT": "复制", - "POPOVER_BREWS_OPTION_DETAIL": "详情", - "DETAIL": "详情", - "POPOVER_BREWS_OPTION_EDIT": "编辑", - "POPOVER_BREWS_OPTION_DELETE": "删除", - "POPOVER_BREWS_OPTION_PHOTO_GALLERY": "图库", - "POPOVER_BREWS_OPTION_CUPPING": "品尝", - "POPOVER_BREWS_OPTION_MAP_COORDINATES": "在地图上展示", - "POPOVER_BREWS_OPTION_FAST_REPEAT": "快速复制", - "PAGE_BREWS_NO_ENTRIES": "目前还没有添加冲泡方式", - "PAGE_BREWS_NO_ARCHIVED_ENTRIES": "目前还没有完成过一次冲泡", - "CANT_START_NEW_BREW_TITLE": "这儿少了点什么 ...", - "CANT_START_NEW_BREW_DESCRIPTION": "使用软件前,请至少添加一种咖啡豆、一种冲泡方式和一个研磨机。 你可以使用菜单跳转到不同的类别以添加上述信息。", - "PAGE_HOME_WELCOME_GREETINGS": "终于等到你来了!", - "PAGE_HOME_TOTAL_BREW": "冲泡", - "PAGE_HOME_TOTAL_BREWS": "冲泡次数", - "PAGE_HOME_BEAN_EXPLORED": "款咖啡豆", - "PAGE_HOME_BEANS_EXPLORED": "款咖啡豆", - "PAGE_HOME_LAST_BREWS": "冲泡记录", - "PAGE_HOME_LAST_BREW": "上一次冲泡", - "PAGE_HOME_DIFFERENT_PREPARATION_METHODS": "不同的冲泡方式", - "PAGE_HOME_DIFFERENT_MILLS": "不同的磨豆机", - "PAGE_HOME_SUPPORTER": "软件支持", - "PAGE_HOME_START_BREW": "开始冲泡", - "PAGE_BEANS_LIST_OBTAINABLE": "可用", - "PAGE_BEANS_LIST_YOU_GOT_NO_FRESH_BEANS": "咖啡豆没货啦,快买一点新的吧!", - "PAGE_BEANS_LIST_YOU_GOT_NO_FINISHED_BEANS": "目前还没有一包已经喝完的咖啡。", - "PAGE_MILL_LIST_NO_MILL_EXISTING": "你还没有添加任何一个磨豆机", - "PAGE_PREPARATION_LIST_NO_PREPARATION_EXISTING": "你还没有添加任何一个冲泡方式", - "PAGE_CONTACT_SUGGESTIONS_QUESTIONS_WISHES": "建议、问题或请求?", - "PAGE_THANKS_THANKS_FOR_YOUR_SUPPORT": "感谢你的支持", - "PAGE_SETTINGS_LANGUAGE": "语言偏好", - "PAGE_SETTINGS_LANGUAGE_GERMAN": "German", - "PAGE_SETTINGS_LANGUAGE_ENGLISH": "English", - "PAGE_SETTINGS_LANGUAGE_SPANISH": "Spanish", - "PAGE_SETTINGS_LANGUAGE_CHINESE": "Chinese", - "PAGE_SETTINGS_GENERAL_SETTINGS": "常规设置", - "PAGE_SETTINGS_TRANSFER": "数据转移", - "PAGE_SETTINGS_PRESET_LAST_BREW": "使用预设值?", - "PAGE_SETTINGS_DISPLAY": "显示方式", - "PAGE_SETTINGS_DISPLAY_SINGLE_PAGE": "单页", - "PAGE_SETTINGS_DISPLAY_PAGING": "连续页面", - "PAGE_SETTINGS_STARTUP_VIEW": "起始页", - "PAGE_SETTINGS_ANALYTICS_INFORMATION": "分析", - "PAGE_SETTINGS_ANALYTICS_INFORMATION_TOOLTIP": "按 i 了解更多信息", - "PAGE_SETTINGS_TRACK_BREW_COORDINATES": "保存冲泡经纬度", - "PAGE_SETTINGS_FAST_REPEAT": "快速复制", - "PAGE_SETTINGS_TRACK_CAFFEINE_CONSUMPTION": "保存咖啡因信息", - "PAGE_SETTINGS_WAKE_LOCK": "冲泡时屏幕保持常亮", - "PAGE_SETTINGS_CURRENCY": "货币单位", - "PAGE_STATISTICS_DIFFERENT_PREPARATION_METHOD": "冲泡器具", - "PAGE_STATISTICS_TOTAL_GROUND_BEANS": "研磨的咖啡豆总计", - "PAGE_STATISTICS_MONEY_SPENT_FOR_COFFEE": "购买咖啡豆总费用", - "PAGE_STATISTICS_DRUNKEN_BREWS": "冲泡总数", - "PAGE_STATISTICS_BREW_PROCESSES": "总冲泡次数", - "PAGE_STATISTICS_DRUNKEN_QUANTITY": "咖啡豆消耗量", - "PAGE_STATISTICS_BEAN_WEIGHT_USED": "咖啡豆研磨总量", - "PAGE_BREW_TEXT_INFORMATION_FROM_ROASTER": "烘焙信息", - "PAGE_ABOUT_NO_VERSION_AVAILABLE": "没有可用的版本", - "PAGE_ABOUT_APP_VERSION": "软件版本", - "PAGE_LICENCES_WEBSITE": "网站", - "BEAN_DATA_ROAST_NAME": "烘焙程度", - "BEAN_DATA_CUSTOM_ROAST_NAME": "自定义烘焙温度", - "BEAN_DATA_ROASTING_DATE": "烘焙日期", - "BEAN_DATA_ROASTER": "烘焙者", - "BEAN_DATA_VARIETY": "品种", - "BEAN_DATA_PROCESSING": "处理法", - "BEAN_DATA_COUNTRY": "国家", - "BEAN_DATA_MIX": "单一产地/拼配", - "BEAN_DATA_AROMATICS": "风味味谱", - "BEAN_DATA_WEIGHT": "重量", - "BEAN_DATA_COST": "花销", - "BEAN_DATA_NAME": "咖啡豆名称", - "BEAN_DATA_REGION": "地区", - "BEAN_DATA_FARM": "庄园", - "BEAN_DATA_FARMER": "农场主", - "BEAN_DATA_ELEVATION": "海拔", - "BEAN_DATA_HARVEST_TIME": "收获日期", - "BEAN_DATA_PERCENTAGE": "百分比", - "BEAN_DATA_CERTIFICATION": "咖啡豆认证", - "BEAN_DATA_ROASTING_TYPE": "烘焙用于", - "BEAN_DATA_DECAFFEINATED": "无咖啡因", - "BEAN_DATA_URL": "网站", - "BEAN_DATA_EAN": "条形码", - "BEAN_DATA_PURCHASING_PRICE": "购买价格", - "BEAN_DATA_FOB_PRICE": "离岸价", - "BEAN_DATA_CUPPING_POINTS": "杯测分数", - "BREW_DATA_CUSTOM_BREW_TIME": "自定义冲泡时间", - "BREW_CREATION_DATE": "创建日期", - "REPEAT": "重复", - "EDIT": "编辑", - "DELETE": "删除", - "FINISHED": "归档", - "NOTES": "笔记", - "ADD_PHOTO": "添加照片", - "CANCEL": "取消", - "GENERATE": "生成", - "SAVE": "保存", - "ADD_SOMETHING": "添加", - "CONTACT": "联系", - "NAME": "名称", - "IMPORT": "导入", - "EXPORT": "导出", - "VIEW": "查看", - "ARCHIVE": "归档", - "CURRENT": "当前", - "BACK": "返回", - "CLOSE": "关闭", - "DAY": "日", - "BREW_DATA_TEMPERATURE_TIME": "温度时间", - "BREW_DATA_SURF_TIME": "冲泡时间", - "BREW_DATA_TIME": "时间", - "BREW_DATA_GRIND_SIZE": "研磨设置", - "BREW_DATA_GRIND_WEIGHT": "咖啡粉 (gr)", - "BREW_DATA_IN_OUT_BR": "入/出 (BR)", - "BREW_DATA_NOTES": "笔记", - "BREW_DATA_PREPARATION_METHOD": "冲泡器具", - "BREW_DATA_MILL": "磨豆机", - "BREW_DATA_MILL_SPEED": "研磨速度 (rpm)", - "BREW_DATA_MILL_TIMER": "研磨时间", - "BREW_DATA_BREW_QUANTITY": "水量", - "BREW_DATA_BEAN_TYPE": "咖啡豆类型", - "BREW_DATA_BREW_TEMPERATURE": "冲泡温度", - "BREW_DATA_PRESSURE_PROFILE": "冲泡参数", - "BREW_DATA_COFFEE_TYPE": "咖啡类型", - "BREW_DATA_COFFEE_CONCENTRATION": "咖啡浓度", - "BREW_DATA_COFFEE_FIRST_DRIP_TIME": "第一滴咖啡落下", - "BREW_DATA_COFFEE_BLOOMING_TIME": "闷蒸/预浸泡时间", - "BREW_DATA_ATTACHMENTS": "附件/照片", - "BREW_DATA_RATING": "评分", - "BREW_DATA_CALCULATED_COFFEE_BREW_TIME": "萃取时间", - "BREW_DATA_TDS": "总溶解固体", - "BREW_DATA_CALCULATED_EXTRACTION_YIELD": "萃取率 %", - "BREW_INFORMATION_BREW_RATIO": "冲泡率", - "BREW_INFORMATION_BEAN_AGE": "豆龄", - "BREW_INFORMATION_BREW_QUANTITY_TYPE_NAME": "计数类型", - "BREW_DATA_TDS_EY": "TDS / %EY", - "BREW_DATA_BREW_BEVERAGE_QUANTITY": "冲泡出的咖啡", - "BREW_DATA_PREPARATION_METHOD_TOOL": "冲泡器具", - "BREW_DATA_WATER": "水质", - "BREW_DATA_BEAN_WEIGHT_IN": "咖啡豆数量 (gr)", - "BREW_DATA_VESSEL": "Server", - "BREW_DATA_VESSEL_WEIGHT": "Server weight", - "BREW_DATA_VESSEL_NAME": "Server name", - "BREW_DATA_FLAVOR": "风味", - "BREW_DATA_FLOW_PROFILE": "Flow", - "ONE_DAY": "天", - "DAYS": "天", - "ONE_HOUR": "小时", - "HOURS": "小时", - "ONE_MINUTE": "分钟", - "MINUTES": "分钟", - "WITHOUT_COFFEE": "没冲咖啡", - "NOT_FOUND": "未找到", - "INVALID_FILE_FORMAT": "文件格式无效", - "FILE_NOT_FOUND_INFORMATION": "文件未找到", - "ERROR_ON_FILE_READING": "读取文件数据时出错", - "IMPORT_SUCCESSFULLY": "导入成功", - "IMPORT_UNSUCCESSFULLY_DATA_NOT_CHANGED": "导入不成功,没有数据被更改", - "INVALID_FILE_DATA": "无效的文件内容", - "DOWNLOADED": "下载", - "FILE_DOWNLOADED_SUCCESSFULLY": "文件 '{{fileName}}' 已成功下载到您的下载文件夹!", - "NO": "不", - "YES": "是", - "SURE_QUESTION": "确定吗?", - "DELETE_BREW_QUESTION": "删除本次冲泡?", - "DELETE_BEAN_QUESTION": "确定要删除这款咖啡豆吗? 所有相关的冲泡数据也将被删除!", - "DELETE_GREEN_BEAN_QUESTION": "确定要删除这款生豆吗? 所有相关的咖啡豆以及冲泡数据都将被删除!", - "DELETE_MILL_QUESTION": "确定要删除这个研磨机吗? 所有相关的冲泡数据也将被删除!", - "DELETE_PREPARATION_METHOD_QUESTION": "确定要删除这个器具吗? 所有相关的冲泡数据也将被删除!", - "DELETE_PREPARATION_TOOL_QUESTION": "确定要删除这个工具吗? 所有相关的冲泡数据也将被删除。", - "APP_COULD_NOT_STARTED_CORRECTLY_BECAUSE_MISSING_FILESYSTEM": "由于缺少文件系统,应用程序无法正确启动", - "CARE": "关心", - "ERROR_OCCURED": "出现错误", - "CSV_FILE_NOT_DOWNLOADED": "CSV 文件无法下载!", - "CSV_FILE_DOWNLOADED_SUCCESSFULLY": "CSV 文件 '{{fileName}}' 已成功下载到您的下载文件夹!", - "ADD_BREW": "添加冲泡", - "CHOOSE": "选择", - "CHOOSE_PHOTO_OR_LIBRARY": "拍摄照片或从相册选择", - "RECORD": "拍摄", - "PAGE_BEAN_INFORMATION": "咖啡豆信息", - "PAGE_BEAN_INFORMATION_GOOD_BREWS": "好的", - "PAGE_BEAN_INFORMATION_BAD_BREWS": "差的", - "PAGE_BEAN_INFORMATION_COUNT_BREWS": "总冲泡次数", - "INFORMATION": "信息", - "PAGE_BEAN_BREW_CHART_TITLE": "该款咖啡豆的冲泡概述", - "PAGE_BEAN_INFORMATION_AWESOME_BREWS": "令人惊叹", - "PAGE_BEAN_INFORMATION_NORMAL_BREWS": "感觉普通", - "PAGE_BEAN_INFORMATION_NOT_RATED_BREWS": "不做评价", - "PAGE_PREPARATION_INFORMATION_BREWS_DONE": "用这种器具冲泡", - "PAGE_PREPARATION_INFORMATION_BREWED_QUANTITY": "冲泡数量", - "PAGE_PREPARATION_INFORMATION_GRIND_WEIGHT": "消耗的豆子重量", - "PAGE_PREPARATION_INFORMATION_TIME_SPENT_BREWING": "总冲泡时间", - "PAGE_PREPARATION_INFORMATION": "器具信息", - "SECONDS": "秒", - "PAGE_MILL_INFORMATION": "磨豆机信息", - "PAGE_MILL_INFORMATION_BREWS_DONE": "使用这个磨豆机", - "PAGE_MILL_INFORMATION_GRIND_WEIGHT": "消耗的豆子重量", - "PAGE_HELPER_WATER_HARDNESS": "水的硬度", - "PAGE_HELPER_WATER_HARDNESS_CA_CONTENTS": "钙含量 mg/l", - "PAGE_HELPER_WATER_HARDNESS_MG_CONTENTS": "镁含量 mg/l", - "PAGE_HELPER_WATER_HARDNESS_GERMAN_HARDNESS": "°dH", - "PAGE_HELPER_WATER_HARDNESS_TOTAL_HARDNESS": "总硬度", - "PAGE_HELPER_BREW_RATIO": "粉液比", - "PAGE_HELPER_BREW_RATIO_GROUND_COFFEE": "咖啡粉重 (gr)", - "PAGE_HELPER_BREW_RATIO_WATER": "液体 (gr/ml)", - "PAGE_HELPER_BREW_RATIO_CALCULATED": "计算出的粉液比", - "PAGE_SETTINGS_SHOW_ARCHIVED_BREWS": "显示已经归档的冲泡", - "PAGE_SETTINGS_SHOW_ARCHIVED_BEANS": "显示已经归档的咖啡豆", - "PAGE_SETTINGS_SHOW_ARCHIVED_GREEN_BEANS": "显示已经归档的生豆", - "CUPPING_SCORE": "分数", - "CUPPING_SCORE_DRY_FRAGRANCE": "干香", - "CUPPING_SCORE_WET_AROMA": "湿香", - "CUPPING_SCORE_BRIGHTNESS": "明亮度", - "CUPPING_SCORE_FLAVOR": "风味", - "CUPPING_SCORE_BODY": "醇厚度", - "CUPPING_SCORE_FINISH": "尾韵", - "CUPPING_SCORE_SWEETNESS": "甜度", - "CUPPING_SCORE_CLEAN_CUP": "干净度", - "CUPPING_SCORE_COMPLEXITY": "复杂度", - "CUPPING_SCORE_UNIFORMITY": "一致性", - "CUPPING_SCORE_CUPPERS_CORRECTION": "杯测矫正", - "CUPPING_SCORE_DRY_FRAGRANCE_TOOLTIP": "指加入热水前,干磨咖啡的气味", - "CUPPING_SCORE_WET_AROMA_TOOLTIP": "指加入热水后,湿咖啡研磨的气味。", - "CUPPING_SCORE_BRIGHTNESS_TOOLTIP": "酸度是由一组绿原酸、柠檬酸、奎宁酸、乙酸等引起的咖啡中尖锐的高调味道,主要在口腔和舌头的前部感觉到。 (质量很好;与咖啡的苦味无关,也不会直接导致胃部不适)。 酸度受到许多杯测者的重视,并且直接关系到杯子的质量,因为酸度是高海拔种植的产物。", - "CUPPING_SCORE_FLAVOR_TOOLTIP": "这是口中的整体印象,包括所有其他评级。 有 4 种“主要味道”组(酸、甜、咸、苦)和许多“次要味道”。", - "CUPPING_SCORE_BODY_TOOLTIP": "通常被称为“口感”,主体是冲泡咖啡的重量和厚度感,由杯子中可溶性固体的百分比引起,包括提取的所有有机化合物(冲泡方法和使用的磨碎咖啡量会影响这一点 大大)。 我们对 Body 的评分较低,因为清淡的咖啡肯定不错,而且在某些原产地,较轻的酒体最适合整体杯子的特性。", - "CUPPING_SCORE_FINISH_TOOLTIP": "口腔清洁后的挥之不去的或新出现的味道。 这包括咖啡从嘴里流出到几分钟后的时间……这就是为什么你会发现很多杯测者在一两分钟后仍然体验到积极的味道时会修改回味分数的原因。", - "CUPPING_SCORE_SWEETNESS_TOOLTIP": "甜味几乎总是咖啡的理想品质,即使它被委婉地描述为“质朴的甜味”或“苦乐参半”。你可能会注意到精致的甜味(想想欧洲糕点、精美的糖果、白糖、 纯甜味)得分高,以及来自水果糖(果糖)的复杂甜味。 麦芽甜味(麦芽糖)不太传统,但非常令人向往,蜂蜜的范围从非常纯净干净到复杂、质朴的几乎是酵母味。 基本上,如果甜度是杯子的关键,它会被评为很好。", - "CUPPING_SCORE_CLEAN_CUP_TOOLTIP": "请注意,“干净的杯子”并不意味着咖啡上没有污垢。 它只是关于风味和“不干净”的原始、时髦的咖啡,而且风味也可能非常理想,例如来自苏门答腊的湿法去壳印度尼西亚咖啡,或干加工的埃塞俄比亚和也门类型。", - "CUPPING_SCORE_COMPLEXITY_TOOLTIP": "复杂性与“风味”和“完成”分数相得益彰,以传达多种风味的多样性或层次感。 这意味着在杯子里有很多发现。 再说一次,简单的咖啡可以在过度暴露于许多强大的、强烈的、复杂的咖啡后得到解脱。", - "CUPPING_SCORE_UNIFORMITY_TOOLTIP": "均匀度是指杯与杯之间的差异。 干法咖啡在本质上可能不如湿法咖啡均匀。 如果偶尔放弃的话,我们永远不会避免很多味道很好的东西。 这是在杯测方案中进行评分的,其中每个被审查的批次都制作了多个杯子。", - "CUPPING_SCORE_CUPPERS_CORRECTION_TOOLTIP": "这改编自 SCAA 系统和卓越杯评分(他们有时称其为“总分”)。 它允许杯测者确保总分正确传达杯子的整体印象。 你可能会批评这种方法,并认为它是“捏造”的。 在某种程度上,你是对的......但是改变类别分数以达到所需的总分(当你知道它是 7 时,给咖啡的酸度为 9)会更糟糕,或者相反,有一个 绝对值得 90 分的咖啡最终以 84 分结束。具体的 Cupper 校正数无关紧要,无论是 5 还是 8 ......这个想法是总分给出了咖啡质量的正确印象。", - "CUPPING_SCORE_TOOLTIP": "100-95 = 令人震惊,90-94 = 杰出,85-89 = 非常好,80-84 = 好,75-79 = 一般,70-74 = 差", - "DETAIL_BREW": "冲泡详情", - "DETAIL_BEAN": "咖啡豆详情", - "DETAIL_MILL": "研磨机详情", - "DETAIL_PREPARATION": "准备冲泡", - "EDIT_BREW": "编辑冲泡", - "ADD_BEAN": "添加咖啡豆", - "EDIT_BEAN": "编辑咖啡豆", - "ADD_PREPARATION": "添加冲泡器具", - "EDIT_PREPARATION": "编辑冲泡器具", - "ADD_MILL": "新增研磨机", - "EDIT_MILL": "编辑研磨机", - "USE_FILTER": "应用筛选", - "RESET_FILTER": "重置筛选", - "COFFEE_GRAMS_GRINDED": "研磨咖啡豆总克数", - "BEANS_USED": "研磨咖啡豆种类", - "BREW_HEADER_BEFORE_BREW": "冲泡前", - "BREW_HEADER_WHILE_BREW": "冲泡时", - "BREW_HEADER_AFTER_BREW": "冲泡后", - "BREW_HEADER_CUPPING": "品尝", - "BEANS_CONSUMED": "归档", - "NAV_MANAGE_PARAMETERS": "管理参数", - "NAV_SORT_PARAMETERS": "参数排序", - "NAV_DEFAULT_PARAMETERS": "定义默认参数", - "PAGE_SORT_PARAMETERS_DESCRIPTION": "拖放参数以定义它们将显示的顺序", - "PAGE_MANAGE_PARAMETERS_DESCRIPTION": "编辑冲泡信息时要显示的数据", - "PAGE_DEFAULT_PARAMETERS_DESCRIPTION": "标记哪些参数应默认为最后使用的值", - "SORT_PARAMETERS_BEFORE": "冲泡前", - "SORT_PARAMETERS_MEANWHILE": "冲泡时", - "SORT_PARAMETERS_AFTER": "冲泡后", - "MORE_INFORMATION": "更多信息", - "UNDERSTOOD": "了解", - "WELCOME_PAGE_ACTIVATE_ANALYTICS_TITLE": "分析和跟踪", - "WELCOME_PAGE_ACTIVATE_ANALYTICS_DESCRIPTION": "我们希望不断改进应用程序、网站和我们未来为您提供的服务。 为此,我们需要跟踪您如何使用该应用程序及其功能的一些数据。 但我们承诺,我们永远不会追踪任何个人数据。 为了确保这些承诺,我们使用 Matomo,一个以数据安全和隐私为中心的开源服务,该服务托管在我们自己的服务器上 - 这确保只有我们拥有数据所有权。 我们的网站提供有关我们跟踪的参数的所有信息,此外,您可以查看 100% 开源的源代码。 如果你有任何问题,请随时与我们联系。", - "ANALYTICS_INFORMATION_TITLE": "分析和跟踪", - "ANALYTICS_INFORMATION_DESCRIPTION": "如您所知,您的数据和隐私的安全是我们的首要任务。

因此,我们已从 Google Analytics 切换到以数据安全和隐私为重点的开源服务 Matomo,该服务由托管 在我们自己的服务器上 - 这意味着我们拥有完整的数据所有权。

跟踪的参数没有改变,我们仍然承诺永远不会跟踪任何个人数据。
我们的网站提供了我们跟踪的参数的所有信息,此外您可以查看100%开源的源代码。

您有问题吗?

联系我们。", - "ACTIVATE": "分析", - "DO_NOT_ACTIVE": "停止分析", - "WELCOME_PAGE_BEAN_TITLE": "咖啡豆", - "WELCOME_PAGE_BEAN_DESCRIPTION": "用咖啡豆来冲泡咖啡有点复杂。 请添加您的第一种咖啡豆以开始使用!", - "WELCOME_PAGE_BEAN_ADD": "添加咖啡豆", - "SKIP": "跳过", - "WELCOME_PAGE_PREPARATION_TITLE": "冲泡器具", - "WELCOME_PAGE_PREPARATION_DESCRIPTION": "V60滤杯, 爱乐压, 手冲式 - 冲泡咖啡的方式有很多种。请添加至少一个冲泡器具", - "WELCOME_PAGE_PREPARATION_ADD": "添加冲泡器具", - "WELCOME_PAGE_MILL_TITLE": "研磨机", - "WELCOME_PAGE_MILL_DESCRIPTION": "就快要完成了,但你需要一些东西来研磨咖啡豆!请添加至少一台研磨机", - "WELCOME_PAGE_MILL_ADD": "新增研磨机", - "WELCOME_PAGE_TITLE": "欢迎!", - "WELCOME_PAGE_BEAN_HEADLINE": "第一款咖啡豆", - "WELCOME_PAGE_PREPARATION_HEADLINE": "添加冲泡器具", - "WELCOME_PAGE_MILL_HEADLINE": "第一个研磨机", - "WELCOME_PAGE_LETS_START_HEADLINE": "现在我们开始吧!", - "WELCOME_PAGE_LETS_START_TITLE": "现在我们开始吧!", - "WELCOME_PAGE_LETS_START_DESCRIPTION": "恭喜,你已经准备好做你一生中最好的咖啡了。玩得开心,传播对好咖啡的热爱!", - "PREPARATION_TYPE": "制作类型", - "PREPARATION_TYPE_NAME": "名称", - "ARCHIVED": "归档", - "PAGE_SETTINGS_SHOW_ARCHIVED_PREPARATIONS": "显示归档的冲泡器具", - "PAGE_SETTINGS_SHOW_ARCHIVED_MILLS": "显示归档的冲泡研磨机", - "PAGE_MILL_LIST_NO_ARCHIVED_MILL_EXISTING": "你还没有归档任何一个研磨机", - "PAGE_PREPARATION_LIST_NO_ARCHIVED_PREPARATION_EXISTING": "你还没有归档任何一种器具", - "TOAST_BREW_ADDED_SUCCESSFULLY": "冲泡添加成功", - "TOAST_BREW_REPEATED_SUCCESSFULLY": "冲泡复制成功", - "TOAST_BEAN_ADDED_SUCCESSFULLY": "咖啡豆添加成功", - "TOAST_MILL_ADDED_SUCCESSFULLY": "新的研磨机已添加成功", - "TOAST_PREPARATION_ADDED_SUCCESSFULLY": "冲泡器具添加成功", - "TOAST_WATER_ADDED_SUCCESSFULLY": "水质添加成功", - "TOAST_BREW_DELETED_SUCCESSFULLY": "冲泡记录已被删除", - "TOAST_BEAN_DELETED_SUCCESSFULLY": "咖啡豆已被删除", - "TOAST_GREEN_BEAN_DELETED_SUCCESSFULLY": "生豆已被删除", - "TOAST_MILL_DELETED_SUCCESSFULLY": "研磨机已被删除", - "TOAST_WATER_DELETED_SUCCESSFULLY": "水质已被删除", - "TOAST_PREPARATION_DELETED_SUCCESSFULLY": "冲泡器具已被删除", - "TOAST_BREW_EDITED_SUCCESSFULLY": "冲泡记录已被编辑", - "TOAST_BEAN_EDITED_SUCCESSFULLY": "咖啡豆已被编辑", - "TOAST_MILL_EDITED_SUCCESSFULLY": "研磨机已被编辑", - "TOAST_PREPARATION_EDITED_SUCCESSFULLY": "器具已被编辑", - "TOAST_WATER_EDITED_SUCCESSFULLY": "水质已被编辑", - "TOAST_BEAN_ARCHIVED_SUCCESSFULLY": "咖啡豆已经归档", - "TOAST_MILL_ARCHIVED_SUCCESSFULLY": "研磨机已经归档", - "TOAST_PREPARATION_ARCHIVED_SUCCESSFULLY": "冲泡器具已经归档", - "TOAST_WATER_ARCHIVED_SUCCESSFULLY": "水质已被编辑", - "BEAN_WEIGHT_ALREADY_USED": "{{gramUsed}}g of {{gramTotal}}g", - "PREPARATION_TYPE_CUSTOM_PREPARATION": "自定义冲泡器具", - "PREPARATION_TYPE_AEROPRESS": "爱乐压", - "PREPARATION_TYPE_V60": "V60滤杯", - "PREPARATION_TYPE_CHEMEX": "Chemex", - "PREPARATION_TYPE_BIALETTI": "比乐蒂/摩卡壶", - "PREPARATION_TYPE_PORTAFILTER": "过滤手柄", - "PREPARATION_TYPE_KALITA_WAVE": "蛋糕杯", - "PREPARATION_TYPE_FRENCH_PRESS": "法压壶", - "PREPARATION_TYPE_SWANNECK": "Swanneck", - "PREPARATION_TYPE_DRIPPER": "聪明杯", - "PREPARATION_TYPE_DELTER_PRESS": "D特压(Delder Press)", - "PREPARATION_TYPE_COLD_BREW": "冷萃", - "PREPARATION_TYPE_AEROPRESS_INVERTED": "爱乐压倒压法", - "PREPARATION_TYPE_TURKISH": "极细研磨", - "PREPARATION_TYPE_BLUE_DRIPPER": "蓝瓶子滤杯", - "PREPARATION_TYPE_ADD_CUSTOM": "添加自定义器具", - "PREPARATION_TYPE_GINA": "Gina智能咖啡机", - "PREPARATION_TYPE_KONO": "KONO滤杯", - "PREPARATION_TYPE_ORIGAMI": "折纸滤杯", - "PREPARATION_TYPE_CAFELAT": "Cafelat拉杆咖啡机", - "PREPARATION_TYPE_OREA": "Orea滤杯", - "PREPARATION_TYPE_COLD_DRIP": "冰滴", - "PREPARATION_TYPE_HAND_LEVER": "手压式", - "PREPARATION_TYPE_FLAIR": "Flair手压意式咖啡机", - "PREPARATION_TYPE_APRIL_BREWER": "April Brewer滤杯", - "PREPARATION_TYPE_ESPRO_BLOOM": "Espro Bloom滤杯", - "PREPARATION_TYPE_FELLOW_STAGG": "Fellow Stagg温控咖啡壶", - "PREPARATION_TYPE_HSIAO_50": "Hsiao 50滤杯", - "PREPARATION_TYPE_KARLSBADER_KANNE": "Karlsbader", - "PREPARATION_TYPE_MOCCA_MASTER": "Mocca Master滴漏式咖啡机", - "PREPARATION_TYPE_SIPHON": "虹吸式", - "CHOOSE_BEANS": "选择咖啡豆", - "CHOOSE_BEAN": "选择咖啡豆", - "CHOOSE_WATERS": "选择水质", - "CHOOSE_WATER": "选择水质", - "CHOOSE_PREPARATIONS": "选择冲泡器具", - "CHOOSE_PREPARATION": "选择冲泡器具", - "CHOOSE_MILLS": "选择研磨机", - "CHOOSE_MILL": "选择研磨机", - "BEAN": { - "PLACE_HOLDER": { - "BEAN_DATA_NAME": "添加咖啡豆的名称", - "BEAN_DATA_ROAST_NAME": "添加烘焙温度", - "BEAN_DATA_ROASTING_DATE": "请输入咖啡豆的烘焙日期", - "BEAN_DATA_ROASTER": "请输入烘焙者的名称", - "BEAN_DATA_VARIETY": "添加咖啡品种", - "BEAN_DATA_PROCESSING": "请输入咖啡豆的处理方法,如:水洗", - "BEAN_DATA_COUNTRY": "它起源于哪儿?", - "BEAN_DATA_MIX": "什么是混合比例?", - "BEAN_DATA_AROMATICS": "描述它的风味吧", - "BEAN_DATA_WEIGHT": "咖啡豆的总重量", - "BEAN_DATA_COST": "购入这款咖啡豆花费了多少钱?", - "BEAN_DATA_REGION": "添加它的产区", - "BEAN_DATA_FARM": "添加它的庄园/农场", - "BEAN_DATA_FARMER": "添加它的种植者名称", - "BEAN_DATA_ELEVATION": "请输入咖啡豆的生长海拔", - "BEAN_DATA_HARVEST_TIME": "请输入咖啡豆的收获日期", - "BEAN_DATA_BUY_DATE": "请输入咖啡豆的购买日期", - "BEAN_DATA_PERCENTAGE": "添加该款咖啡豆在此包装中的占比(主要用于拼配包装填写)", - "BEAN_DATA_CERTIFICATION": "添加豆类认证 (例如:fair trade, bio)", - "BEAN_DATA_ROASTING_TYPE": "添加烘焙类型", - "BEAN_DATA_DECAFFEINATED": "这款咖啡不含咖啡因", - "BEAN_DATA_URL": "添加网站链接", - "BEAN_DATA_EAN": "添加条形码", - "BEAN_DATA_CUPPING_POINTS": "添加它的杯测分数", - "BEAN_DATA_PURCHASING_PRICE": "添加购买价格", - "BEAN_DATA_FOB_PRICE": "添加离岸价格", - "NOTES": "为咖啡豆添加注释", - "CHOOSE_DATA_ROASTER": "添加烘焙机", - "CHOOSE_DATA_ROASTING_TYPE": "选择烘焙类型" - } - }, - "PREPARATION": { - "PLACE_HOLDER": { - "PREPARATION_TYPE_NAME": "添加名称", - "NOTES": "为冲泡器具添加注释" - } - }, - "MILL": { - "PLACE_HOLDER": { - "NAME": "添加名称", - "NOTES": "为研磨机添加注释" - } - }, - "BREW": { - "PLACE_HOLDER": { - "BREW_DATA_GRIND_SIZE": "输入研磨设置,如:5", - "BREW_DATA_GRIND_WEIGHT": "输入此次冲泡咖啡的咖啡粉克数 (gr)", - "BREW_DATA_BREW_TEMPERATURE": "输入冲泡温度", - "BREW_DATA_PREPARATION_METHOD": "选择冲泡器具", - "BREW_DATA_BEAN_TYPE": "选择咖啡豆", - "BREW_DATA_MILL": "选择一个研磨机", - "BREW_DATA_MILL_SPEED": "输入研磨机的研磨速度", - "BREW_DATA_MILL_TIMER": "输入研磨所花费的时间", - "BREW_DATA_PRESSURE_PROFILE": "压力/流量曲线,冲泡建议等", - "BREW_DATA_TEMPERATURE_TIME": "请输入加热器具的时间", - "BREW_DATA_COFFEE_BLOOMING_TIME": "请输入闷蒸/预浸泡所花费的时间", - "BREW_DATA_COFFEE_FIRST_DRIP_TIME": "咖啡的第一滴水是什么时候出现的?", - "BREW_DATA_BREW_QUANTITY": "冲泡时用了多少水?", - "BREW_DATA_COFFEE_TYPE": "输入咖啡类型 (e.g. ristretto)", - "BREW_DATA_COFFEE_CONCENTRATION": "输入咖啡浓度", - "BREW_DATA_TDS": "总共溶解了多少固体?", - "BREW_DATA_NOTES": "为这次冲泡添加注释", - "BREW_DATA_BREW_BEVERAGE_QUANTITY": "冲泡完成以后,得到了多少的咖啡液?", - "BREW_DATA_PREPARATION_METHOD_TOOL": "请选择你的冲泡器具", - "BREW_DATA_WATER": "选择此次使用的水质", - "BREW_DATA_BEAN_WEIGHT_IN": "你使用了多少咖啡豆?(gr)" - } - }, - "ROASTED_BEFORE": "烘焙在", - "DAY_OLD": "天前", - "DAYS_OLD": "天前", - "BEANS_AMOUNT_USED": "已使用", - "CUPPING_BREW": "品尝", - "COFFEE_DRUNKEN_QUANTITY": "咖啡液", - "IMAGE_DELETED": "图片已删除", - "IMAGE_NOT_DELETED": "图片无法删除", - "EXTERNAL_STORAGE_NOT_SUPPORTED": "抱歉,不支持外部故事", - "BEANS_ARCHIVED": "已归档", - "TAB_ARCHIVE": "归档", - "TODAY": "今日", - "PLEASE_WAIT": "请稍等...", - "PREPARATION_STYLE_POUR_OVER": "手冲咖啡", - "PREPARATION_STYLE_ESPRESSO": "意式浓缩", - "PREPARATION_STYLE_FULL_IMMERSION": "全浸泡", - "PREPARATION_STYLE_PERCOLATION": "渗滤式", - "PREPARATION_TYPE_STYLE": "冲泡方式", - "PAGE_SETTINGS_FAST_REPEAT_DESCRIPTION": "开启一个新的菜单条目 - 使用它您可以直接复制冲泡。", - "PAGE_SETTINGS_TRACK_BREW_COORDINATES_DESCRIPTION": "保存每次冲泡时的经纬度", - "PAGE_SETTINGS_TRACK_CAFFEINE_CONSUMPTION_DESCRIPTION": "节省消耗的咖啡因量", - "UPDATE_TITLE": "有什么新玩意儿?", - "NEXT": "下一个", - "UPDATE_TEXT_TITLE_TITLE": { - "5.0.0": { - "TITLE": "版本 5.0: 新玩意儿!", - "DESCRIPTION": [ - "新布局,新图标,新颜色,新标志", - "新的冲泡器具", - "现在可以对冲泡进行分类(渗透、浓缩咖啡、全浸)", - "冲泡工作现在可以继承工具(例如不同的过滤器)", - "现在可以自定义冲泡参数,为每个冲泡定义自己的冲泡流程", - "添加了更多可编辑的咖啡豆信息,现在可以添加不同的排序", - "水量可渗透/全浸", - "你在哪里冲泡最好的咖啡? 主动设置经纬度保存", - "启用快速复制以立即添加冲泡", - "添加了更新屏幕以显示最新更改", - "在25次使用后向用户请求评分", - "为豆类添加了排序", - "添加了冲泡、咖啡豆的搜索面板", - "冲泡详细信息中添加了杯测图", - "在主页上显示剩余的豆子重量", - "为烘焙机添加了预输入", - "评级改为星级而不是图标" - ] - }, - "5.1.0": { - "TITLE": "版本 5.1: 新玩意儿!", - "DESCRIPTION": [ - "新的冲泡时间选择器", - "现在可以在 iOS 上再次选择烘焙日期", - "可以在 iPad 上再次选择图像", - "TDS 计算现在再次显示在饮料量上", - "为 iOS 设备添加了安全区域" - ] - }, - "5.2.0": { - "TITLE": "版本 5.2: 新玩意儿!", - "DESCRIPTION": [ - "冲泡:", - "冲泡计时器将在后台继续计时", - "可以将冲泡设为喜爱", - "添加和编辑咖啡豆的界面现在看起来几乎完全相同了", - "屏幕在冲泡期间可以保持亮屏(可以在设置菜单中启用)", - "最近的冲泡列表现在还能显示归档的冲泡", - "", - "咖啡豆:", - "咖啡豆照片显示在概览中", - "咖啡豆可以评级", - "", - "互动:", - "长按卡片会进入编辑视图", - "可以通过点击卡片访问详细视图", - "Github / Facebook / Instagram 帐户已关联", - "", - "修复:", - "咖啡豆信息复制不正确", - "新用户默认启用冲泡量", - "", - "其它:", - "Apple Healthkit 集成(可在设置菜单中启用)", - "清理", - "布局更改", - "统计扩展", - "启动检查已修改", - "支持冲泡和咖啡豆的不同卡片大小" - ] - }, - "5.3.1": { - "TITLE": "Version 5.3: Thats new!", - "DESCRIPTION": [ - "Brew methods:", - "Changes to the card view", - "Custom images can be attached in the edit screen", - "Brew tools will be saved in edit screen, even when '+' is not pressed", - "", - "Grinders:", - "Custom images can be attached in the edit screen", - "", - "Brews:", - "Parameter 'Attachments' renamed in 'Attachments / Photos'", - "", - "Dashboard:", - "If bean amount is less then 1000g, the number will be written as a whole", - "", - "Bug fixes:", - "Editing via a long-press, does not change information any more", - "Information on the dashboard are updated after made changes", - "Multiple variety information with blends can be saved again", - "Added startup error message if app-data is missing" - ] - }, - "5.4.0": { - "TITLE": "Version 5.4: Thats new!", - "DESCRIPTION": [ - "烘焙选项:", - "Manage all of your green beans and roasters (can be activated in the settings menu)", - "Save all of your green beans and transfer them into roasted onces", - "Add your roaster and connect them with your different kind of roasted beans", - "", - "Website:", - "Go live of our new website! -> https://beanconqueror.com", - "", - "Support us:", - "You've always wanted to support Beanconqueror? We've added a new 'Buy me a coffee' connection", - "", - "iOS - iCloud:", - "The first step into iCloud support was made. At the very first start all of your existing app data will be moved into the support iCloud directory.", - "You have to activate this option in the iCloud Settings first in order to save Beanconqueror on iCloud", - "", - "Android/iOS - Automated file-export:", - "Automated Beanconqueror.json-File is saved for a maximum of 7 days, after that they will be automated deleted again", - "Android: Download/Beanconqueror_export/Beanconqueror_automatic_export_DAY.json", - "iOS: Files/Download/Beanconqueror_export/Beanconqueror_automatic_export_FILE.json", - "", - "Settings:", - "Excel - Export all of your data to excel to work with it even further", - "Define your own image quality between 50% to 100% (default 100%)", - "Brew rating - Define how much stars/points you'd like to set for each brew. Minimum 5, maximum 100", - "", - "New tracking:", - "We've changed to our open source service Matomo, which will be hosted on our own server", - "Removed Google Analytics / Firebase", - "", - "Bug fixes:", - "Apple Healthkit - Settings were not saved", - "Sometimes brew rating stars weren't filled (Brew add/edit)", - "Edit via long tap, screen wasn't scrollable", - "Import of bigger files on iOS led to misconduct", - "Delete procedure of beans / preparations or mills were not consistent and lead to graphical issues", - "Wrong calculation of beverage quantity in statistics and list views", - "", - "分享:", - "与所有咖啡爱好者分享您的咖啡和咖啡豆!", - "", - "Other:", - "Clean ups", - "Layout changes", - "Extension of statistics", - "Startup check revised, added please wait window", - "Some label changes", - "Changed data access / order inside app to reduce problems" - ] - }, - "6.0.0": { - "TITLE": "Version 6.0: Thats new!", - "DESCRIPTION": [ - "蓝牙电子秤", - "Support of the first bluetooth scale - Decent-Scale - Big thanks to Decent Espresso", - "Support of Acaia Lunar", - "", - "Aroma cupping", - "Cup each brew with the different aromatics and flavors", - "", - "Water section", - "Add your own water, activate this section in the settings", - "", - "Support of more languages", - "Support for spanish - Big thanks to Frank!", - "", - "Improvements", - "Support of long press '+' on brews", - "Added new brew parameters", - "Support of different currencies", - "Edit brew while in detail view", - "Choose multiple images at once", - "Support of brix to TDS conversion", - "If bean package is empty, you'll be asked if you want to archive the package on the last brew", - "Reset of roastdate supported", - "Support of detail views on beans, grinders and preparation methods", - "Added brew ratio (g/l)", - "", - "iOS", - "Support of safe areas", - "", - "Bug fixes", - "Apple Healthkit - Decaffeinated coffee was saved", - "Copy of beans led to misconduct", - "Added brew time to excel export", - "Small bug fixes", - "", - "Others", - "Beans, grinders and preparation methods are now sorted alphabetic in dropdowns" - ] - }, - "6.1.0": { - "TITLE": "版本 6.1: 这些是新东西!", - "DESCRIPTION": [ - "二维码", - "扫描你的咖啡包装! 所有咖啡信息都将从烘焙店中插入。", - "", - "蓝牙电子秤", - "支持 Acaia Pearl 2021 - 感谢 Micah 和 Mike", - "支持 Acaia Lunar 2021 - 感谢 Micah 和 Mike", - "支持 Acaia Pyxis - 感谢 Micah 和 Mike", - "支持Hiroia Jimmy - 感谢 Silas", - "支持 Felicita Arc - 感谢 Herman", - "注意:目前不支持 Acaia Pearl 2021 以下的电子秤", - "咖啡豆页面现在可以使用蓝牙电子秤获得的重量信息", - "现在无需通过计时器开始冲泡即可看到重量变化", - "", - "冲泡概述", - "自定义概览中的可见冲煮参数或针对每种冲泡方法", - "准备图像现在在列表视图中可见", - "", - "冲泡视图", - "重制了冲泡视图,相比以往更加平滑", - "冲泡视图现在可以最大化", - "冲泡视图现在可以在冲泡细节视图中放大以及导出", - "现在显示平均流量", - "", - "咖啡豆", - "添加字段:购买日期、离岸价格、采购价格", - "现在可以收藏和筛选咖啡豆", - "如果咖啡豆被归档,您现在也可以对它进行评分", - "按+,您现在可以选择添加或扫描新的咖啡豆包装", - "长按+,直接添加新的咖啡豆", - "", - "预处理方法", - "预处理方法现在可以重复所有设置", - "支持更多的预处理方法 - 感谢 Nicola", - "选择一个预处理方法并展示图片", - "", - "设置", - "评级现在可以阶梯式进行(1、0.75、0.5、0.25、0.1)", - "蓝牙电子秤 - 定义在开始新的冲泡或启动计时器时是否应将秤设置为零重量", - "蓝牙电子秤 - 定义是否要忽略异常或负值 - 如果是,则无法生成实时图表", - "现在选择, 如果您想在主页上查看存档的咖啡豆", - "导出现在还导出保存的蓝牙值的原始数据", - "", - "改进", - "删除冲泡方法和工具时,不会再删除与其相关的咖啡豆", - "制备方法工具现在可以编辑和存档", - "", - "Bug修复:", - "发现更多可能导致数据丢失的问题", - "小错误修复", - "", - "其它:", - "更新到 Ionic-Framework 6,因此发生了一些小的视觉变化" - ] - }, - "6.1.3": { - "TITLE": "版本 6.1.3: 这些是新东西!", - "DESCRIPTION": [ - "Android - 注意", - "首先:对不起!", - "遗憾的是,数据库在 Android Play 商店中从 APK 格式重置为 AAB 格式,您的应用程序可能会在没有数据的情况下启动。", - "我无法调试或控制这种情况,虽然开发工作都按预期进行。", - "如果您的应用显示空白,请进入设置并导入下面的文件 'Download/Beanconqueror_export/Beanconqueror_automatic_export_*.json' * 代表最新的数据备份。", - "然后所有数据都应该恢复正常,如果没有,请给我写一封电子邮件:info@beanconqueror.com。" - ] - } - }, - "CUSTOM_PARAMETERS": "自定义参数", - "CUSTOM_DEFAULT_PARAMETERS": "默认", - "CUSTOM_MANAGE_PARAMETERS": "管理", - "CUSTOM_SORT_PARAMETERS": "种类", - "BREW_PARAMETER_CUSTOMIZE_TITLE": "自定义每种冲泡器具的参数", - "BREW_PARAMETER_CUSTOMIZE_DESCRIPTION": "您想为每种冲泡器具选择自定义参数吗?跳转到“器具”,打开具体冲泡器具的选项,选择“自定义参数”。现在您可以选择将用于此准备的参数!", - "BREW_DATA_BREW_QUANTITY_TOOLTIP": "不能用于意式浓缩咖啡的水量", - "BREW_DATA_COFFEE_FIRST_DRIP_TIME_TOOLTIP": "第一个可用于意式浓缩咖啡的滴漏咖啡o", - "BREW_DATA_PREPARATION_METHOD_TOOLTIP": "冲泡活动时可自定义", - "PAGE_SETTINGS_GENERAL": "常规设置", - "EDIT_PREPARATION_CUSTOM_PARAMETERS": "自定义参数", - "ENABLE_PREPARATION_CUSTOM_PARAMETERS": "使用个人参数", - "BEAN_ADD_ANOTHER_SORT": "添加另一种类", - "BEAN_SORT": "种类", - "BEAN_SORT_INFORMATION": "变化信息", - "BEAN_SORT_MORE_INFORMATION": "更多信息", - "NAVIGATE_TO_PREPARATION_METHODS": "跳转到冲泡页面", - "PREPARATION_TOOLS": "冲泡器具", - "PREPARATION_TOOLS_INFORMATION": "为您的过滤器添加不同的容器. 对于 V60 滤杯 或 123 添加例如 布、纸或网状过滤器", - "PREPARATION_TOOLS_PLACEHOLDER": "纸或布过滤器、VST-20g、14g-Basket等。", - "PREPARATION_PARAMETERS_CUSTOMIZED": "参数自定义", - "BEANS_WEIGHT_AVAILABLE": "可用的咖啡豆", - "SORT_ORDER": "改变顺序", - "ASCENDING": "升序", - "DESCENDING": "倒序", - "SORT_AFTER": "排序", - "BEAN_SORT_NAME_OF_BEAN": "咖啡豆名称", - "BEAN_SORT_ROASTER": "烘焙机", - "BEAN_SORT_ROASTING_DATE": "烘焙日期", - "BEAN_TAB_ROAST_INFORMATION": "烘焙信息", - "BEAN_TAB_GENERAL_INFORMATION": "常规", - "BEAN_TAB_SORT_INFORMATION": "品种信息", - "PAGE_SETTINGS_MANAGE_ARCHIVE": "管理归档", - "LAST_USE": "上一次使用在", - "SEARCH": "搜索", - "OVERVIEW": "概览", - "BEAN_HEADER_ADDITIONALE_INFORMATION": "附加信息", - "THREE_DEE_TOUCH_ACTION_BREW": "冲泡", - "THREE_DEE_TOUCH_ACTION_BEAN": "咖啡豆", - "THREE_DEE_TOUCH_ACTION_PREPARATION": "冲泡器具", - "THREE_DEE_TOUCH_ACTION_MILL": "研磨机", - "PAGE_CREDITS_NOT_EXISTING": "无内容", - "TIMER_HOUR": "小时", - "TIMER_MINUTES": "分钟", - "TIMER_SECONDS": "秒", - "EXCEL": { - "BEAN": { - "CREATION_DATE": "创建日期", - "ID": "咖啡豆编号" - }, - "PREPARATION": { - "CREATION_DATE": "创建日期", - "ID": "器具编号" - }, - "GRINDER": { - "CREATION_DATE": "创建日期", - "ID": "工厂编号" - } - }, - "EXCEL_EXPORT": "导出为Excel", - "HEALTH_KIT_QUESTION_TITLE": "节省咖啡因消耗", - "HEALTH_KIT_QUESTION_MESSAGE": "通过启用,每次冲泡中占用的咖啡因将自动保存在 Apple Health 中", - "NAV_ROASTING_SECTION": "烘焙", - "ROASTING_SECTION": { - "NAV_GREEN_BEANS": "生豆", - "NAV_ROASTING_MACHINE": "烘焙机", - "ROASTING_MACHINE": { - "TOTAL_ROAST_QUANTITY": "烘焙出的咖啡豆", - "TOTAL_ROAST_COUNT": "烘焙次数" - }, - "GREEN_BEAN": { - "ADD": "添加", - "EDIT": "编辑", - "DETAIL": "生豆详情", - "ROASTABLE": "待烘焙", - "NO_ROASTS_YET": "目前还没有烘焙" - }, - "BEAN": { - "DROP_TEMPERATURE": "烘焙的最终温度", - "ROAST_LENGTH": "烘焙时长", - "ROASTER_MACHINE": "烘焙机", - "GREEN_BEAN_WEIGHT": "生豆重量", - "OUTSIDE_TEMPERATURE": "气温", - "HUMIDITY": "湿度", - "FIRST_CRACK_MINUTE": "一爆分钟", - "FIRST_CRACK_TEMPERATURE": "一爆温度", - "SECOND_CRACK_MINUTE": "二爆分钟", - "SECOND_CRACK_TEMPERATURE": "二爆温度", - "PLACE_HOLDER": { - "DROP_TEMPERATURE": "烘焙的最终温度", - "ROAST_LENGTH": "烘焙时长", - "ROASTER_MACHINE": "烘焙机", - "GREEN_BEAN_WEIGHT": "生豆重量", - "OUTSIDE_TEMPERATURE": "气温", - "HUMIDITY": "湿度", - "FIRST_CRACK_MINUTE": "一爆分钟", - "FIRST_CRACK_TEMPERATURE": "一爆温度", - "SECOND_CRACK_TEMPERATURE": "二爆温度", - "SECOND_CRACK_MINUTE": "二爆分钟" - } - } - }, - "PAGE_SETTINGS_MANAGE_SECTIONS": "更多选项卡", - "PAGE_SETTINGS_SHOW_ROASTING_SECTION": "启用烘焙选项卡", - "PAGE_SETTINGS_SHOW_WATER_SECTION": "启用水质选项卡", - "PAGE_SETTINGS_SHOW_CUPPING_SECTION": "启用杯测选项", - "BEAN_DATA_BUY_DATE": "购买日期", - "BEAN_SORT_CREATION_DATE": "创建日期", - "BEAN_SORT_PURCHASE_DATE": "购买日期", - "BEAN_ROAST_COUNT": "烘焙度", - "TRANSFER_ROAST": "烘焙", - "BEAN_TAB_LINKED_ROASTS": "烘焙", - "BEAN_DATA_WEIGHT_AFTER_ROASTING": "烘焙后的重量", - "TOAST_GREEN_BEAN_ADDED_SUCCESSFULLY": "生豆已添加成功", - "TOAST_GREEN_BEAN_EDITED_SUCCESSFULLY": "生豆已编辑成功", - "TOAST_GREEN_BEAN_ARCHIVED_SUCCESSFULLY": "生豆已归档成功", - "TOAST_ROASTING_MACHINE_ADDED_SUCCESSFULLY": "烘焙机已添加成功", - "TOAST_ROASTING_MACHINE_EDITED_SUCCESSFULLY": "烘焙机已编辑成功", - "TOAST_ROASTING_MACHINE_ARCHIVED_SUCCESSFULLY": "烘焙机已归档成功", - "DELETE_ROASTING_MACHINE_QUESTION": "删除烘焙机?所有相关已经烘焙后的咖啡豆都将更新,不会被删除", - "TOAST_ROASTING_MACHINE_DELETED_SUCCESSFULLY": "烘焙机已删除成功", - "EDIT_ROASTING_MACHINE": "编辑", - "DETAIL_ROASTING_MACHINE": "烘焙详情", - "DELETE_WATER_QUESTION": "删除水质?所有相关已经烘焙后的咖啡豆都将更新,不会被删除", - "ROASTING_MACHINE": { - "PLACE_HOLDER": { - "NAME": "添加名称", - "NOTES": "为烘焙机添加注释" - } - }, - "NAV_ROASTING_MACHINE": "烘焙机", - "PAGE_ROASTING_MACHINE_LIST_NO_MACHINES_EXISTING": "您没有添加任何烘焙机", - "PAGE_ROASTING_MACHINE_LIST_NO_ARCHIVED_MACHINES_EXISTING": "您没有归档任何烘焙机", - "CHOOSE_ROASTING_MACHINES": "选择烘焙机", - "CHOOSE_ROASTING_MACHINE": "选择烘焙机", - "POPOVER_BREWS_OPTION_TOGGLE_FAVOURITE": "喜爱", - "TOAST_BREW_FAVOURITE_ADDED": "已添加为喜爱", - "TOAST_BREW_FAVOURITE_REMOVED": "已从喜爱中删除", - "BREW_FILTER_JUST_FAVOURITE": "喜爱", - "STATISTICS_PREPARATION_USAGES": "器具用途", - "STATISTICS_PREPARATION_TIMELINE_USAGES": "器具的使用历史", - "STATISTICS_GRINDER_TIMELINE_USAGES": "研磨机的使用历史", - "ACCEPT": "接受", - "STATISTIC_TAB_GENERAL": "常规", - "STATISTIC_TAB_BREWS": "冲泡", - "STATISTIC_TAB_BEANS": "咖啡豆", - "STATISTIC_TAB_PREPARATIONS": "冲泡器具", - "STATISTIC_TAB_GRINDERS": "研磨机", - "PAGE_STATISTICS_BREW_PER_DAYPROCESSES": "每天冲泡", - "PAGE_STATISTICS_BREW_TIME": "冲泡时间", - "PAGE_STATISTICS_PHOTOS_TAKEN": "拍摄的照片", - "PAGE_SETTINGS_IMAGE_QUALITY": "图像质量", - "PAGE_SETTINGS_IMAGE_QUALITY_TOOLTIP": "定义图像加载质量,这可以降低您的数据使用量。", - "PAGE_SETTINGS_BREW_RATING": "冲泡评分", - "PAGE_SETTINGS_BREW_RATING_TOOLTIP": "对冲泡进行-1到5分的评分太少了吗?你最高可以设置到100的评分区间", - "UPDATE_ENTRY_OF": "Update entry {{index}} of {{count}}", - "WEBSITE": "网站", - "SHARE": "分享", - "ANDROID_FILE_ACCESS_NEEDED_TITLE": "需要授权文件访问权限", - "ANDROID_FILE_ACCESS_NEEDED_DESCRIPTION": "为了让应用程序充分发挥作用,我们需要您授权文件访问。 否则应用程序内会有部分功能受限。 这是自动备份功能所需要的权限。", - "COULD_NOT_ACCESS_FILE": "我们无法访问所选文件", - "WRONG_FILE_FORMAT": "您选择了不受支持的文件格式", - "SCAN_BEAN": "扫描包", - "CLEAR": "清除", - "BEAN_LOOKS_LIKE_CONSUMED": "这包咖啡豆看起来已经完全消耗了,要将它归档吗?", - "CUPPING_1": "水果(Fruit)", - "CUPPING_2": "柑橘类(Citrus)", - "CUPPING_3": "柠檬和柠檬水(Lemo)", - "CUPPING_4": "酸橙(Lime)", - "CUPPING_5": "西柚(Grapefruit)", - "CUPPING_6": "小柑橘(Clementine)", - "CUPPING_7": "柑橘(Tangerine)", - "CUPPING_8": "砂糖橘(Mandarin orange)", - "CUPPING_9": "橙子(Orange)", - "CUPPING_10": "苹果/梨(Apple/pear)", - "CUPPING_11": "绿苹果(Green apple)", - "CUPPING_12": "红苹果(Red apple)", - "CUPPING_13": "瓜(Melon)", - "CUPPING_14": "西瓜(Watermelon)", - "CUPPING_15": "甜瓜(Honeydew)", - "CUPPING_16": "哈密瓜(Cantaloupe)", - "CUPPING_17": "葡萄(Grape)", - "CUPPING_18": "白葡萄(White grape)", - "CUPPING_19": "绿葡萄(Green grape)", - "CUPPING_20": "红葡萄(Red grape)", - "CUPPING_21": "康科德葡萄(Concord grape)", - "CUPPING_22": "热带水果(Tropical fruit)", - "CUPPING_23": "荔枝(Lychee)", - "CUPPING_24": "杨桃(Star fruit)", - "CUPPING_25": "酸角(Tamarind)", - "CUPPING_26": "百香果(Passion fruit)", - "CUPPING_27": "菠萝(Pineapple)", - "CUPPING_28": "芒果(Mango)", - "CUPPING_29": "木瓜(Papaya)", - "CUPPING_30": "猕猴桃(Kiwi)", - "CUPPING_31": "香蕉(Banana)", - "CUPPING_32": "椰子(Coconut)", - "CUPPING_33": "核果(Stone fruit)", - "CUPPING_34": "桃子(Peach)", - "CUPPING_35": "油桃(Nectarine)", - "CUPPING_36": "杏(Apricot)", - "CUPPING_37": "李子(Plum)", - "CUPPING_38": "樱桃(Cherry)", - "CUPPING_39": "黑樱桃(Black cherry)", - "CUPPING_40": "浆果类(Berry)", - "CUPPING_41": "蔓越莓(Cranberry)", - "CUPPING_42": "覆盆子(Raspberry)", - "CUPPING_43": "草莓(Strawberry)", - "CUPPING_44": "蓝莓(Blueberry)", - "CUPPING_45": "红加仑(Red currant)", - "CUPPING_46": "黑加仑(Black currant)", - "CUPPING_47": "干果类(Dried fruit)", - "CUPPING_48": "红葡萄干(Golden raisin)", - "CUPPING_49": "葡萄干(Raisin)", - "CUPPING_50": "无花果干(Dried fig)", - "CUPPING_51": "枣干(ried dates)", - "CUPPING_52": "梅干(Prune)", - "CUPPING_53": "甜味和烘培(Sweet & Roasting Notes)", - "CUPPING_54": "巧克力(Chocolate)", - "CUPPING_55": "可可碎(Cacao nibs)", - "CUPPING_56": "黑巧(Dark chocolate)", - "CUPPING_57": "贝克巧克力(Bakers chocolate)", - "CUPPING_58": "Bittersweet chocolate", - "CUPPING_59": "可可粉(Cocoa powder)", - "CUPPING_60": "牛奶巧克力(Milk chocolate)", - "CUPPING_61": "坚果类(Nut)", - "CUPPING_62": "核桃(Walnut)", - "CUPPING_63": "花生(Peanut)", - "CUPPING_64": "腰果(Cashew)", - "CUPPING_65": "山核桃(Pecan)", - "CUPPING_66": "榛子(Hazelnut)", - "CUPPING_67": "杏仁(Almond)", - "CUPPING_68": "谷物(Grain & Cereal)", - "CUPPING_69": "Sweet bread pastry", - "CUPPING_70": "格兰诺拉麦片(Granola)", - "CUPPING_71": "全麦饼干(Graham cracker)", - "CUPPING_72": "黑麦(Rye)", - "CUPPING_73": "小麦(Wheat)", - "CUPPING_74": "大麦(Barley)", - "CUPPING_75": "新鲜面包(Fresh bread)", - "CUPPING_76": "甜味和糖类(Sweet & Sugary)", - "CUPPING_77": "香草(Vanila)", - "CUPPING_78": "牛轧糖(Nougat)", - "CUPPING_79": "蜂蜜(Honey)", - "CUPPING_80": "黄油(Butter)", - "CUPPING_81": "奶油(Cream)", - "CUPPING_82": "棉花糖(Marshmallow)", - "CUPPING_83": "甘蔗(Sugarcane)", - "CUPPING_84": "红糖(Brown sugar)", - "CUPPING_85": "焦糖(Caramel)", - "CUPPING_86": "枫糖浆(Maple syrup)", - "CUPPING_87": "糖浆(Molasses)", - "CUPPING_88": "可乐(Cola)", - "CUPPING_89": "烘焙(Roast)", - "CUPPING_90": "吐司(Toast)", - "CUPPING_91": "焦糖(Burnt sugar)", - "CUPPING_92": "烟熏(Smokey)", - "CUPPING_93": "木炭(Carbon)", - "CUPPING_94": "植物、咸味食物和香料(Vegetal, Savory & Spices)", - "CUPPING_95": "香料(Spice)", - "CUPPING_96": "黑胡椒(Black pepper)", - "CUPPING_97": "白胡椒(White pepper)", - "CUPPING_98": "肉桂(Cinnamon)", - "CUPPING_99": "芫荽、香菜(Coriander)", - "CUPPING_100": "生姜(Ginger)", - "CUPPING_101": "肉豆蔻(Nutmeg)", - "CUPPING_102": "咖喱(Curry)", - "CUPPING_103": "甘草-茴香Licorice-anise", - "CUPPING_104": "丁香(Clove)", - "CUPPING_105": "咸味食物(Savory)", - "CUPPING_106": "Leathery", - "CUPPING_107": "Meat-like", - "CUPPING_108": "酱油(Soy sauce)", - "CUPPING_109": "番茄干(Sundried tomato)", - "CUPPING_110": "番茄(Tomato)", - "CUPPING_111": "植物泥土草药(Vegetal Earthy Herb)", - "CUPPING_112": "土壤(Soil)", - "CUPPING_113": "新鲜木材(Fresh wood)", - "CUPPING_114": "雪松(Cedar)", - "CUPPING_115": "烟草(Tobacco)", - "CUPPING_116": "干草/稻草(Hay / straw)", - "CUPPING_117": "绿叶蔬菜(Leafy greens)", - "CUPPING_118": "橄榄(Olive)", - "CUPPING_119": "青椒(Green pepper)", - "CUPPING_120": "南瓜(Squash)", - "CUPPING_121": "蘑菇(Mushroom)", - "CUPPING_122": "甜豌豆(Sweet pea)", - "CUPPING_123": "荷兰豆(Snow pea)", - "CUPPING_124": "草(Grassy)", - "CUPPING_125": "茴香(Dill)", - "CUPPING_126": "鼠尾草(Sage)", - "CUPPING_127": "薄荷(Mint)", - "CUPPING_128": "绿茶(Green tea)", - "CUPPING_129": "红茶(Black tea)", - "CUPPING_130": "啤酒花(Hops)", - "CUPPING_131": "佛手柑(Bergamot)", - "CUPPING_132": "花类(Flowery)", - "CUPPING_133": "花(Floral)", - "CUPPING_134": "木槿花(Hibiscus)", - "CUPPING_135": "蔷薇果(Rose hips)", - "CUPPING_136": "薰衣草(Lavender)", - "CUPPING_137": "木兰花(Magnolia)", - "CUPPING_138": "茉莉、金银花(Jasmine honeysuckle)", - "CUPPING_139": "橙花(Orange blossom)", - "CUPPING_140": "香茅(Lemongrass)", - "WATER_SECTION": { - "NAV_WATER": "水质", - "YOU_GOT_NO_ARCHIVED_WATER": "你还没有归档任何水质", - "YOU_GOT_NO_WATER": "你还没有添加任何水质", - "CATEGORY_INFORMATION": "水质信息", - "CATEGORY_GENERAL": "常规", - "WATER_BOTTLE_EXPLANATION": "水质通常以 ppm = mg/L 为单位表示浓度", - "USED_TIMES": "使用次数", - "AMOUNT": "使用量", - "WATER": { - "GENERAL_HARDNESS": "一般硬度 (GH)", - "TOTAL_ALKALINITY": "总碱度 (KH)", - "CALCIUM": "钙 (Ca)", - "MAGNESIUM": "镁 (Mg)", - "SODIUM": "钠 (Na)", - "TDS": "总溶解固体 (TDS)", - "UNITS": "单位", - "PLACE_HOLDER": { - "GENERAL_HARDNESS": "一般硬度", - "TOTAL_ALKALINITY": "总碱度", - "CALCIUM": "钙 (Ca)", - "MAGNESIUM": "镁 (Mg)", - "SODIUM": "钠 (Na)", - "TDS": "总溶解固体 (TDS)", - "NAME": "添加水的名称", - "NOTES": "为水质添加注释" - }, - "WATER_UNIT": { - "UNKNOWN": "不清楚", - "PPM": "以CaCO3计量ppm", - "MG_L": "mg/L", - "MMOL_L": "mmol/L", - "DH": "°dH" - } - } - }, - "BREW_BRIX_CALCULATION": "白利糖度", - "SET_TDS": "设置 tds", - "TOTAL_WEIGHT": "总重量", - "CALCULATED_WEIGHT": "计算重量", - "SET_WEIGHT": "设置重量", - "ADD_FLAVORS_AROMAS_TITLE": "香气/风味", - "CUSTOM_FLAVORS_AROMAS": "自定义香气", - "CUSTOM_FLAVORS_AROMAS_PLACEHOLDER": "以自己的语言描述它的香气", - "PREDEFINED_FLAVORS_AROMAS": "常见的香气", - "ADD_AROMA_FLAVOR": "添加香气/风味", - "BEAN_WEIGHT_IN_PLACEHOLDER": "从咖啡包装中取出的咖啡豆", - "VESSEL_PLACEHOLDER": "容器名和净重", - "GRIND_WEIGHT_PLACEHOLDER": "用于冲泡的咖啡粉的重量", - "PRESET_BREW_TITLE": "使用最后一次冲泡作为预设", - "CUPPING_BREW_TAB_AROMA": "香气", - "CUPPING_BREW_TAB_TASTING": "评分", - "WATER_PLACEHOLDER": "如需完整功能,请在设置菜单中激活水质部分", - "PAGE_SETTINGS_SCALES": "电子秤", - "CONNECT": "连接", - "DISCONNECT": "断开连接", - "SCALE": { - "BLUETOOTH_SCAN_RUNNING": "正在搜索附件的电子秤,请稍等60秒", - "BLUETOOTH_NOT_ENABLED": "未开启蓝牙,请开启蓝牙以进行搜索", - "CONNECTION_NOT_ESTABLISHED": "附近找不到电子秤或是无法建立连接", - "CONNECTED_SUCCESSFULLY": "电子秤已连接", - "DISCONNECTED_SUCCESSFULLY": "电子秤已断开连接", - "DISCONNECTED_UNPLANNED": "电子秤意外断开", - "REQUEST_PERMISSION": { - "LOCATION": "软件需要位置权限来搜索电子秤", - "BLUETOOTH": "软件需要蓝牙权限来搜索电子秤" - }, - "INFORMATION_DESCRIPTION": "支持的电子秤: Decent 电子秤, Acaia 电子秤, Felicita 电子秤以及 Hiroia Jimmy" - }, - "QR": { - "WRONG_QRCODE_DESCRIPTION": "错误的二维码或错误的内容", - "WRONG_QRCODE_TITLE": "错误", - "WRONG_LINK_DESCRIPTION": "错误的应用链接", - "WRONG_LINK_TITLE": "错误", - "SERVER": { - "ERROR_OCCURED": "出现错误,无法读取二维码,请重试。" - }, - "BEAN_SUCCESSFULLY_SCANNED": "咖啡豆扫描成功", - "IMAGES_GETTING_DOWNLOADED": "正在下载的图像" - }, - "RETRY_CONNECT": "重试连接", - "SMART_SCALE_STAY_CONNECTED_ON_APP_MINIMIZE": "即使应用程序被最小化/非活动状态,也让电子秤连接", - "BREW_FLOW_WEIGHT": "重量", - "BREW_FLOW_WEIGHT_PER_SECOND": "流速", - "ROAST_TYPE_UNKNOWN": "不清楚", - "ROAST_TYPE_CINNAMON_ROAST": "浅烘焙(Cimon Roast)", - "ROAST_TYPE_AMERICAN_ROAST": "美式烘焙(American Roast)", - "ROAST_TYPE_NEW_ENGLAND_ROAST": "新英格兰烘焙(New England Roast)", - "ROAST_TYPE_HALF_CITY_ROAST": "半城市烘焙(Half City Roast)", - "ROAST_TYPE_MODERATE_LIGHT_ROAST": "Moderate-Light Roast", - "ROAST_TYPE_CITY_ROAST": "中深度烘焙(City Roast)", - "ROAST_TYPE_CITY_PLUS_ROAST": "City+ Roast", - "ROAST_TYPE_FULL_CITY_ROAST": "微深度烘焙(Full City Roast)", - "ROAST_TYPE_FULL_CITY_PLUS_ROAST": "深度烘焙(Full City + Roast)", - "ROAST_TYPE_ITALIAN_ROAST": "极深度烘焙(Italian Roast)", - "ROAST_TYPE_VIEANNA_ROAST": "维也纳烘焙(Vienna Roast)", - "ROAST_TYPE_FRENCH_ROAST": "法式烘焙(French Roast)", - "ROAST_TYPE_CUSTOM_ROAST": "自定义", - "BEAN_MIX_UNKNOWN": "不清楚", - "BEAN_MIX_SINGLE_ORIGIN": "单一产地", - "BEAN_MIX_BLEND": "拼配", - "BEAN_ROASTING_TYPE_FILTER": "滴滤式/Filter", - "BEAN_ROASTING_TYPE_ESPRESSO": "意式浓缩/Espresso", - "BEAN_ROASTING_TYPE_OMNI": "均可/Omni", - "BEAN_ROASTING_TYPE_UNKNOWN": "不清楚", - "SMART_SCALE_LOG": "为智能电子秤激活日志文件(仅用于发送日志进行调试)", - "TOAST_PREPARATION_TOOL_EDITED_SUCCESSFULLY": "杯测工具编辑", - "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE": "蓝牙电子秤", - "PAGE_SETTINGS_TAB_GENERAL": "常规", - "SMART_SCALE_TARE_ON_BREW": "在开始新的冲泡时去皮", - "SMART_SCALE_TARE_ON_START_TIMER": "当定时器启动时去皮", - "PAGE_SETTINGS_BREW_RATING_STEPS": "评级步骤", - "BREW_AVG_FLOW_WEIGHT_PER_SECOND": "Ø 流速", - "CUSTOM_LIST_VIEW_PARAMETERS": "列表视图参数", - "NAV_LIST_VIEW_CUSTOM_PARAMETERS": "列表视图参数", - "PAGE_LIST_VIEW_CUSTOM_PARAMETERS_DESCRIPTION": "决定你的咖啡冲泡的哪个参数,应该显示在列表视图上", - "BREW_DATA_VESSEL_NAME_WEIGHT": "容器 名称/重量", - "IGNORE_NEGATIVE_VALUES": "忽略负重量值", - "IGNORE_ANOMALY_VALUES": "忽略异常值", - "IGNORE_ANOMALY_VALUES_TOOLTIP": "例如:在秤上旋转杯子", - "TOAST_BEAN_FAVOURITE_ADDED": "喜爱已添加", - "TOAST_BEAN_FAVOURITE_REMOVED": "喜爱已移除", - "QR_CODE_SCANNER_INFORMATION_TITLE": "二维码", - "QR_CODE_SCANNER_INFORMATION_DESCRIPTION": "所有扫描的咖啡豆信息都直接来自烘焙店。
如果您发现错误或误导性信息,请通过电子邮件通知我: info@beanconqueror.com.", - "DONT_SHOW_AGAIN": "不再显示", - "ARCHIVED_TOOLS": "归档工具", - "UNARCHIVE": "取消归档", - "PAGE_SETTINGS_HIDE_ARCHIVED_BREWS_DASHBOARD": "在仪表盘上显示已归档的冲泡", - "PAGE_SETTINGS_HIDE_ARCHIVED_BREWS_DASHBOARD_DESCRIPTION": "已归档的冲泡应该显示在主页上吗?", - "COPY": "复制", - "TOAST_PREPARATION_METHOD_REPEATED_SUCCESSFULLY": "杯测方法复制成功", - "PREPARATION_TYPE_CAFEC_FLOWER": "Cafec 花辦滤杯(Cafec Flower)", - "PREPARATION_TYPE_DECEMBER_DRIPPER": "December 可调咖啡滤杯(December Dripper)", - "PREPARATION_TYPE_DECENT_ESPRESSO": "Decent Espresso", - "PREPARATION_TYPE_HARIO_SWITCH": "Hario Switch 聪明杯", - "PREPARATION_TYPE_HARIO_WOODNECK": "Hario Woodneck 滤布", - "PREPARATION_TYPE_RATIO_SIX_COFFEE_BREWER": "Ratio Six Coffee Brewer", - "PREPARATION_TYPE_ROK": "ROK 手压咖啡机", - "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo", - "PREPARATION_TYPE_TRICOLATE": "Tricolate 聪明杯" -} diff --git a/src/assets/i18n/zh.json b/src/assets/i18n/zh.json index 9181ed006..c93de4399 100644 --- a/src/assets/i18n/zh.json +++ b/src/assets/i18n/zh.json @@ -1189,5 +1189,14 @@ "BREW_FLOW_WEIGHT_REALTIME": "Flow (Realtime)", "SMART_SCALE_STOP_TIMER_ON_BREW": "Stop scale timer on new brew", "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew", - "BREW_PRESSURE_FLOW": "Pressure" + "BREW_PRESSURE_FLOW": "Pressure", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_FILTER": "Show graphs for filter", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_ESPRESSO": "Show graphs for espresso", + "PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE": "Pressure device", + "PRESSURE_LOG": "Activate logfiles for pressure device", + "PRESSURE_THRESHOLD_ACTIVE": "Start timer with predefined pressure", + "PRESSURE_THRESHOLD_BAR": "Threshold pressure", + "TIMER_MILLISECONDS": "MS", + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS": "Milliseconds?", + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Use milliseconds to even more accurately analyze your brews" } diff --git a/src/classes/brew/brew.ts b/src/classes/brew/brew.ts index fa6a3f479..96c546d8a 100755 --- a/src/classes/brew/brew.ts +++ b/src/classes/brew/brew.ts @@ -1,30 +1,30 @@ /** Interfaces */ -import {IBean} from '../../interfaces/bean/iBean'; -import {IBrew} from '../../interfaces/brew/iBrew'; -import {IPreparation} from '../../interfaces/preparation/iPreparation'; +import { IBean } from '../../interfaces/bean/iBean'; +import { IBrew } from '../../interfaces/brew/iBrew'; +import { IPreparation } from '../../interfaces/preparation/iPreparation'; /** Classes */ /** Third party */ import moment from 'moment'; -import {BREW_QUANTITY_TYPES_ENUM} from '../../enums/brews/brewQuantityTypes'; -import {IMill} from '../../interfaces/mill/iMill'; +import { BREW_QUANTITY_TYPES_ENUM } from '../../enums/brews/brewQuantityTypes'; +import { IMill } from '../../interfaces/mill/iMill'; /** Services */ -import {UIBeanStorage} from '../../services/uiBeanStorage'; -import {UIMillStorage} from '../../services/uiMillStorage'; -import {UIPreparationStorage} from '../../services/uiPreparationStorage'; -import {Bean} from '../bean/bean'; -import {Mill} from '../mill/mill'; -import {Config} from '../objectConfig/objectConfig'; -import {Preparation} from '../preparation/preparation'; -import {ICupping} from '../../interfaces/cupping/iCupping'; -import {IBrewCoordinates} from '../../interfaces/brew/iBrewCoordinates'; -import {PREPARATION_STYLE_TYPE} from '../../enums/preparations/preparationStyleTypes'; -import {PreparationTool} from '../preparation/preparationTool'; -import {IFlavor} from '../../interfaces/flavor/iFlavor'; -import {UIWaterStorage} from '../../services/uiWaterStorage'; - -import {IWater} from '../../interfaces/water/iWater'; -import {Water} from '../water/water'; - +import { UIBeanStorage } from '../../services/uiBeanStorage'; +import { UIMillStorage } from '../../services/uiMillStorage'; +import { UIPreparationStorage } from '../../services/uiPreparationStorage'; +import { Bean } from '../bean/bean'; +import { Mill } from '../mill/mill'; +import { Config } from '../objectConfig/objectConfig'; +import { Preparation } from '../preparation/preparation'; +import { ICupping } from '../../interfaces/cupping/iCupping'; +import { IBrewCoordinates } from '../../interfaces/brew/iBrewCoordinates'; +import { PREPARATION_STYLE_TYPE } from '../../enums/preparations/preparationStyleTypes'; +import { PreparationTool } from '../preparation/preparationTool'; +import { IFlavor } from '../../interfaces/flavor/iFlavor'; +import { UIWaterStorage } from '../../services/uiWaterStorage'; + +import { IWater } from '../../interfaces/water/iWater'; +import { Water } from '../water/water'; +import { UISettingsStorage } from '../../services/uiSettingsStorage'; export class Brew implements IBrew { // tslint:disable-next-line @@ -48,8 +48,12 @@ export class Brew implements IBrew { public brew_temperature: number; // tslint:disable-next-line public brew_temperature_time: number; + + public brew_temperature_time_milliseconds: number; + // tslint:disable-next-line public brew_time: number; + public brew_time_milliseconds: number; // tslint:disable-next-line public brew_quantity: number; // tslint:disable-next-line @@ -62,8 +66,10 @@ export class Brew implements IBrew { public coffee_concentration: string; // tslint:disable-next-line public coffee_first_drip_time: number; + public coffee_first_drip_time_milliseconds: number; // tslint:disable-next-line public coffee_blooming_time: number; + public coffee_blooming_time_milliseconds: number; public attachments: Array; public tds: number; // UUID @@ -75,7 +81,6 @@ export class Brew implements IBrew { public coordinates: IBrewCoordinates; - public brew_beverage_quantity: number; public brew_beverage_quantity_type: BREW_QUANTITY_TYPES_ENUM; @@ -83,7 +88,6 @@ export class Brew implements IBrew { public cupping: ICupping; - public cupped_flavor: IFlavor; public method_of_preparation_tools: Array; @@ -94,7 +98,6 @@ export class Brew implements IBrew { public flow_profile: string; constructor() { - this.grind_size = ''; this.grind_weight = 0; this.method_of_preparation = ''; @@ -120,14 +123,18 @@ export class Brew implements IBrew { this.brew_beverage_quantity = 0; this.brew_beverage_quantity_type = 'GR' as BREW_QUANTITY_TYPES_ENUM; - this.coordinates ={ - accuracy: null, - altitude: null, - altitudeAccuracy:null, - heading:null, - latitude: null, - longitude: null, - speed: null + this.brew_time_milliseconds = 0; + this.brew_temperature_time_milliseconds = 0; + this.coffee_first_drip_time_milliseconds = 0; + this.coffee_blooming_time_milliseconds = 0; + this.coordinates = { + accuracy: null, + altitude: null, + altitudeAccuracy: null, + heading: null, + latitude: null, + longitude: null, + speed: null, } as IBrewCoordinates; this.cupping = { @@ -146,10 +153,8 @@ export class Brew implements IBrew { }; this.cupped_flavor = { - predefined_flavors: { - - }, - custom_flavors: [] + predefined_flavors: {}, + custom_flavors: [], } as IFlavor; this.method_of_preparation_tools = []; @@ -183,10 +188,8 @@ export class Brew implements IBrew { } if (this.cupped_flavor === undefined) { this.cupped_flavor = { - predefined_flavors: { - - }, - custom_flavors: [] + predefined_flavors: {}, + custom_flavors: [], } as IFlavor; } } @@ -206,43 +209,44 @@ export class Brew implements IBrew { } public getBean(): Bean { - const iBean: IBean = this.getBeanStorageInstance() - .getByUUID(this.bean) as IBean; + const iBean: IBean = this.getBeanStorageInstance().getByUUID( + this.bean + ) as IBean; const bean: Bean = new Bean(); bean.initializeByObject(iBean); return bean; - } public getPreparation(): Preparation { - const iPreparation: IPreparation = this.getPreparationStorageInstance() - .getByUUID(this.method_of_preparation) as IPreparation; + const iPreparation: IPreparation = + this.getPreparationStorageInstance().getByUUID( + this.method_of_preparation + ) as IPreparation; const preparation: Preparation = new Preparation(); preparation.initializeByObject(iPreparation); return preparation; - } public getMill(): Mill { - const iMill: IMill = this.getMillStorageInstance() - .getByUUID(this.mill) as IMill; + const iMill: IMill = this.getMillStorageInstance().getByUUID( + this.mill + ) as IMill; const mill: Mill = new Mill(); mill.initializeByObject(iMill); return mill; - } public getWater(): Water { - const iWater: IWater = this.getWaterStorageInstance() - .getByUUID(this.water) as IWater; + const iWater: IWater = this.getWaterStorageInstance().getByUUID( + this.water + ) as IWater; const water: Water = new Water(); water.initializeByObject(iWater); return water; - } /** @@ -250,9 +254,9 @@ export class Brew implements IBrew { * If no age could be calculated it returns -1 */ public getCalculatedBeanAge(): number { - - const bean: IBean = this.getBeanStorageInstance() - .getByUUID(this.bean) as IBean; + const bean: IBean = this.getBeanStorageInstance().getByUUID( + this.bean + ) as IBean; if (bean) { if (bean.roastingDate) { const roastingDate = moment(bean.roastingDate); @@ -271,27 +275,33 @@ export class Brew implements IBrew { const brewBeverageQuantity: number = this.brew_beverage_quantity; const tds: number = this.tds; - if (this.getPreparation().style_type === PREPARATION_STYLE_TYPE.FULL_IMMERSION && brewQuantity > 0) - { + if ( + this.getPreparation().style_type === + PREPARATION_STYLE_TYPE.FULL_IMMERSION && + brewQuantity > 0 + ) { // #262 // ey=(tds*total water)/dose - return this.toFixedIfNecessary(((brewQuantity * tds) / grindWeight),2).toString(); - + return this.toFixedIfNecessary( + (brewQuantity * tds) / grindWeight, + 2 + ).toString(); } - return this.toFixedIfNecessary(((brewBeverageQuantity * tds) / grindWeight),2).toString(); - + return this.toFixedIfNecessary( + (brewBeverageQuantity * tds) / grindWeight, + 2 + ).toString(); } - private toFixedIfNecessary( value, dp ){ + private toFixedIfNecessary(value, dp) { const parsedFloat = parseFloat(value); if (isNaN(parsedFloat)) { return 0; } - return +parsedFloat.toFixed( dp ); + return +parsedFloat.toFixed(dp); } - public getBrewRatio(): string { const grindWeight: number = this.grind_weight; let brewQuantity: number = 0; @@ -310,7 +320,6 @@ export class Brew implements IBrew { } return ratio; - } public getGramsPerLiter() { @@ -323,53 +332,84 @@ export class Brew implements IBrew { brewQuantity = this.brew_beverage_quantity; } - let ratio: string = ''; if (brewQuantity > 0 && grindWeight > 0) { - ratio = this.toFixedIfNecessary((grindWeight * 1000) / brewQuantity,2) + ' g/l'; + ratio = + this.toFixedIfNecessary((grindWeight * 1000) / brewQuantity, 2) + + ' g/l'; } else { ratio = '? g/l'; } return ratio; - } public getPreparationToolName(_uuid: string): string { - const tool: PreparationTool = this.getPreparation().tools.find((e) => e.config.uuid === _uuid); + const tool: PreparationTool = this.getPreparation().tools.find( + (e) => e.config.uuid === _uuid + ); if (tool) { return tool.name; } return ''; } - public formateDate(_format?: string): string { let format: string = 'DD.MM.YYYY, HH:mm:ss'; if (_format) { format = _format; - } - return moment.unix(this.config.unix_timestamp) - .format(format); + return moment.unix(this.config.unix_timestamp).format(format); } public getFormattedTotalCoffeeBrewTime(): string { const secs = this.brew_time; - let formatted = moment.utc(secs * 1000).format('mm:ss'); + const millisecondsEnabled: boolean = + this.getSettingsStorageInstance().getSettings().brew_milliseconds; + let formatted = ''; + if (millisecondsEnabled) { + formatted = moment + .utc(secs * 1000) + .add('milliseconds', this.brew_time_milliseconds) + .format('mm:ss.SSS'); + } else { + formatted = moment + .utc(secs * 1000) + .add('milliseconds', this.brew_time_milliseconds) + .format('mm:ss'); + } + if (moment.utc(secs * 1000).hours() > 0) { - formatted = moment.utc(secs * 1000).format('HH:mm:ss'); + if (millisecondsEnabled) { + formatted = moment + .utc(secs * 1000) + .add('milliseconds', this.brew_time_milliseconds) + .format('HH:mm:ss.SSS'); + } else { + formatted = moment + .utc(secs * 1000) + .add('milliseconds', this.brew_time_milliseconds) + .format('HH:mm:ss'); + } } return formatted; } public getFormattedBrewTime(): string { const secs = this.brew_time; - - const formatted = moment.utc(secs * 1000).format('HH:mm:ss'); + let formattingStr: string = 'HH:mm:ss'; + const millisecondsEnabled: boolean = + this.getSettingsStorageInstance().getSettings().brew_milliseconds; + if (millisecondsEnabled) { + formattingStr = 'HH:mm:ss.SSS'; + } + const formatted = moment + .utc(secs * 1000) + .add('milliseconds', this.brew_time_milliseconds) + .format(formattingStr); return formatted; } @@ -383,19 +423,32 @@ export class Brew implements IBrew { public getFormattedCoffeeBrewTime(): string { const secs = this.brew_time; - const start = moment().startOf('day').add('seconds',secs); - if (this.coffee_first_drip_time > 0) { - const diffing = moment().startOf('day').add('seconds',this.coffee_first_drip_time); + let formattingStr: string = 'HH:mm:ss'; + const millisecondsEnabled: boolean = + this.getSettingsStorageInstance().getSettings().brew_milliseconds; + if (millisecondsEnabled) { + formattingStr = 'HH:mm:ss.SSS'; + } + const start = moment() + .startOf('day') + .add('seconds', secs) + .add('milliseconds', this.brew_time_milliseconds); + if ( + this.coffee_first_drip_time > 0 || + this.coffee_first_drip_time_milliseconds + ) { + const diffing = moment() + .startOf('day') + .add('seconds', this.coffee_first_drip_time) + .add('milliseconds', this.coffee_first_drip_time_milliseconds); if (this.coffee_first_drip_time > this.brew_time) { - return ' - ' + moment.utc(diffing.diff(start)).format('HH:mm:ss'); + return ' - ' + moment.utc(diffing.diff(start)).format(formattingStr); } else { - return moment.utc(start.diff(diffing)).format('HH:mm:ss'); + return moment.utc(start.diff(diffing)).format(formattingStr); } } else { - return start.format('HH:mm:ss'); + return start.format(formattingStr); } - - } private getBeanStorageInstance(): UIBeanStorage { @@ -411,49 +464,50 @@ export class Brew implements IBrew { return uiPreparationStorage; } - private getMillStorageInstance(): UIMillStorage { + private getSettingsStorageInstance(): UISettingsStorage { + let uiSettingsStorage: UISettingsStorage; + uiSettingsStorage = UISettingsStorage.getInstance(); + + return uiSettingsStorage; + } + private getMillStorageInstance(): UIMillStorage { let uiMillStorage: UIMillStorage; uiMillStorage = UIMillStorage.getInstance(); return uiMillStorage; } - private getWaterStorageInstance(): UIWaterStorage { + private getWaterStorageInstance(): UIWaterStorage { let uiWaterStorage: UIWaterStorage; uiWaterStorage = UIWaterStorage.getInstance(); return uiWaterStorage; } - - public getCoordinateMapLink(): string { + public getCoordinateMapLink(): string { if (this.coordinates && this.coordinates.latitude) { - return `https://maps.google.com/?q=${this.coordinates.latitude},${this.coordinates.longitude}` - + return `https://maps.google.com/?q=${this.coordinates.latitude},${this.coordinates.longitude}`; } return undefined; } - + public isArchived(): boolean { const bean: Bean = this.getBean(); const mill: Mill = this.getMill(); const preparation: Preparation = this.getPreparation(); - + if (bean.finished || mill.finished || preparation.finished) { return true; } return false; } - - /** * Sorry for this, but angular hates inputs which are string and needs numbers */ public fixDataTypes(): boolean { let fixNeeded: boolean = false; - if (Number(this.brew_quantity) !== this.brew_quantity) { this.brew_quantity = Number(this.brew_quantity); fixNeeded = true; @@ -464,7 +518,6 @@ export class Brew implements IBrew { fixNeeded = true; } - if (Number(this.mill_speed) !== this.mill_speed) { this.mill_speed = Number(this.mill_speed); fixNeeded = true; @@ -484,7 +537,6 @@ export class Brew implements IBrew { fixNeeded = true; } - if (Number(this.brew_quantity) !== this.brew_quantity) { this.brew_quantity = Number(this.brew_quantity); fixNeeded = true; @@ -502,6 +554,4 @@ export class Brew implements IBrew { return fixNeeded; } - - } diff --git a/src/classes/settings/settings.ts b/src/classes/settings/settings.ts index 2bc83a022..2aa796e18 100755 --- a/src/classes/settings/settings.ts +++ b/src/classes/settings/settings.ts @@ -33,6 +33,7 @@ export class Settings implements ISettings { public language: string; public track_brew_coordinates: boolean; public fast_brew_repeat: boolean; + public brew_milliseconds: boolean; public image_quality: number; public brew_rating: number; public brew_rating_steps: number; @@ -153,6 +154,7 @@ export class Settings implements ISettings { this.track_brew_coordinates = false; this.fast_brew_repeat = false; + this.brew_milliseconds = false; this.show_archived_beans = true; this.show_archived_brews = true; this.show_archived_mills = true; diff --git a/src/components/brew-timer/brew-timer.component.html b/src/components/brew-timer/brew-timer.component.html index b4ad3d6c9..24004d4af 100644 --- a/src/components/brew-timer/brew-timer.component.html +++ b/src/components/brew-timer/brew-timer.component.html @@ -2,7 +2,7 @@ {{ label }} - + diff --git a/src/components/brew-timer/brew-timer.component.ts b/src/components/brew-timer/brew-timer.component.ts index 1916a2686..82ba0adee 100644 --- a/src/components/brew-timer/brew-timer.component.ts +++ b/src/components/brew-timer/brew-timer.component.ts @@ -13,6 +13,8 @@ import { DatetimePopoverComponent } from '../../popover/datetime-popover/datetim import { ModalController } from '@ionic/angular'; import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-devices'; +import { UISettingsStorage } from '../../services/uiSettingsStorage'; +import { Settings } from '../../classes/settings/settings'; @Component({ selector: 'brew-timer', @@ -64,11 +66,14 @@ export class BrewTimerComponent implements OnInit, OnDestroy { } public timer: ITimer; - + public settings: Settings; constructor( private readonly modalCtrl: ModalController, - private readonly bleManager: CoffeeBluetoothDevicesService - ) {} + private readonly bleManager: CoffeeBluetoothDevicesService, + private readonly uiSettingsStorage: UISettingsStorage + ) { + this.settings = this.uiSettingsStorage.getSettings(); + } public smartScaleConnected() { try { @@ -104,10 +109,10 @@ export class BrewTimerComponent implements OnInit, OnDestroy { this.showBloomTimer = this.bloomTimerVisible; this.showDripTimer = this.dripTimerVisible; - this.timer.displayTime = this.getSecondsAsDigitalClock(this.timer.seconds); this.displayingTime = moment(this.displayingTime) .startOf('day') .add('seconds', this.timer.seconds) + .add('milliseconds', this.timer.milliseconds) .toISOString(); } @@ -119,14 +124,16 @@ export class BrewTimerComponent implements OnInit, OnDestroy { this.startedOffset = this.startedTimer.diff(this.startingDay); } else { const restartTimer = moment(new Date()); - console.log(this.startedOffset); - console.log(restartTimer.diff(this.pausedTimer)); + this.startedOffset += restartTimer.diff(this.pausedTimer); } this.timer.hasStarted = true; this.timer.runTimer = true; this.timerTick(); - this.millisecondTick(); + if (this.settings?.brew_milliseconds) { + this.millisecondTick(); + } + if (_resumed === false) { this.timerStarted.emit(); } @@ -190,9 +197,7 @@ export class BrewTimerComponent implements OnInit, OnDestroy { const passedSeconds = actualTimerTick.diff(this.startingDay, 'seconds'); this.timer.seconds = passedSeconds; - this.timer.displayTime = this.getSecondsAsDigitalClock( - this.timer.seconds - ); + this.displayingTime = moment(this.displayingTime) .startOf('day') .add('seconds', this.timer.seconds) @@ -207,6 +212,9 @@ export class BrewTimerComponent implements OnInit, OnDestroy { public getSeconds(): number { return this.timer.seconds; } + public getMilliseconds(): number { + return this.timer.milliseconds; + } public reset() { this.timerReset.emit(); @@ -224,12 +232,15 @@ export class BrewTimerComponent implements OnInit, OnDestroy { public changeEvent() { this.timerTicked.emit(); } - public setTime(seconds: number): void { + public setTime(seconds: number, milliseconds: number = 0): void { this.timer.seconds = seconds; - this.timer.displayTime = this.getSecondsAsDigitalClock(this.timer.seconds); + if (milliseconds !== 0) { + this.timer.milliseconds = milliseconds; + } this.displayingTime = moment(this.displayingTime) .startOf('day') .add('seconds', this.timer.seconds) + .add('milliseconds', this.timer.milliseconds) .toISOString(); } @@ -282,6 +293,9 @@ export class BrewTimerComponent implements OnInit, OnDestroy { ) ) .asSeconds(); + this.timer.milliseconds = moment(this.displayingTime) + .startOf('day') + .milliseconds(); this.changeEvent(); } } diff --git a/src/components/brews/brew-brewing/brew-brewing.component.html b/src/components/brews/brew-brewing/brew-brewing.component.html index af38cf9f5..299bc2650 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.html +++ b/src/components/brews/brew-brewing/brew-brewing.component.html @@ -268,9 +268,8 @@ data.getPreparation().use_custom_parameters)" lines="inset">
@@ -368,11 +367,15 @@ data.getPreparation().brew_order.while.coffee_blooming_time, data.getPreparation().use_custom_parameters)" lines="inset"> - {{"BREW_DATA_COFFEE_BLOOMING_TIME" | translate}} - + +
- {{"BREW_DATA_COFFEE_FIRST_DRIP_TIME" | translate}} - +
diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index d6fd3277c..dbe4e3a99 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -68,6 +68,10 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { @ViewChild('timer', { static: false }) public timer: BrewTimerComponent; @ViewChild('brewTemperatureTime', { static: false }) public brewTemperatureTime: TimerComponent; + @ViewChild('brewCoffeeBloomingTime', { static: false }) + public brewCoffeeBloomingTime: TimerComponent; + @ViewChild('brewFirstDripTime', { static: false }) + public brewFirstDripTime: TimerComponent; @ViewChild('brewStars', { read: NgxStarsComponent, static: false }) public brewStars: NgxStarsComponent; @@ -189,13 +193,37 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } } else { if (this.timer) { - this.timer.setTime(this.data.brew_time); + this.timer.setTime( + this.data.brew_time, + this.data.brew_time_milliseconds + ); } if ( this.brewTemperatureTime && this.settings.manage_parameters.brew_temperature_time ) { - this.brewTemperatureTime.setTime(this.data.brew_temperature_time); + this.brewTemperatureTime.setTime( + this.data.brew_temperature_time, + this.data.brew_temperature_time_milliseconds + ); + } + if ( + this.brewCoffeeBloomingTime && + this.settings.manage_parameters.coffee_blooming_time + ) { + this.brewCoffeeBloomingTime.setTime( + this.data.coffee_blooming_time, + this.data.coffee_blooming_time_milliseconds + ); + } + if ( + this.brewFirstDripTime && + this.settings.manage_parameters.coffee_first_drip_time + ) { + this.brewFirstDripTime.setTime( + this.data.coffee_first_drip_time, + this.data.coffee_first_drip_time_milliseconds + ); } if (this.data.flow_profile !== '') { // We had a flow profile, so read data now. @@ -902,15 +930,34 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { public setCoffeeDripTime($event): void { this.data.coffee_first_drip_time = this.getTime(); + if (this.settings.brew_milliseconds) { + this.data.coffee_first_drip_time_milliseconds = + this.timer.getMilliseconds(); + } + this.brewFirstDripTime.setTime( + this.data.coffee_first_drip_time, + this.data.coffee_first_drip_time_milliseconds + ); } public setCoffeeBloomingTime($event): void { this.data.coffee_blooming_time = this.getTime(); + if (this.settings.brew_milliseconds) { + this.data.coffee_blooming_time_milliseconds = + this.timer.getMilliseconds(); + } + this.brewCoffeeBloomingTime.setTime( + this.data.coffee_blooming_time, + this.data.coffee_blooming_time_milliseconds + ); } public brewTimeTicked(_event): void { if (this.timer) { this.data.brew_time = this.timer.getSeconds(); + if (this.settings.brew_milliseconds) { + this.data.brew_time_milliseconds = this.timer.getMilliseconds(); + } } else { this.data.brew_time = 0; } @@ -1114,8 +1161,38 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { public temperatureTimeChanged(_event): void { if (this.brewTemperatureTime) { this.data.brew_temperature_time = this.brewTemperatureTime.getSeconds(); + if (this.settings.brew_milliseconds) { + this.data.brew_temperature_time_milliseconds = + this.brewTemperatureTime.getMilliseconds(); + } } else { this.data.brew_temperature_time = 0; + this.data.brew_temperature_time_milliseconds = 0; + } + } + + public coffeeBloomingTimeChanged(_event): void { + if (this.brewTemperatureTime) { + this.data.coffee_blooming_time = this.brewCoffeeBloomingTime.getSeconds(); + if (this.settings.brew_milliseconds) { + this.data.coffee_blooming_time_milliseconds = + this.brewCoffeeBloomingTime.getMilliseconds(); + } + } else { + this.data.coffee_blooming_time = 0; + this.data.coffee_blooming_time_milliseconds = 0; + } + } + public coffeeFirstDripTimeChanged(_event): void { + if (this.brewTemperatureTime) { + this.data.coffee_first_drip_time = this.brewFirstDripTime.getSeconds(); + if (this.settings.brew_milliseconds) { + this.data.coffee_first_drip_time_milliseconds = + this.brewFirstDripTime.getMilliseconds(); + } + } else { + this.data.coffee_first_drip_time = 0; + this.data.coffee_first_drip_time_milliseconds = 0; } } @@ -1244,31 +1321,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } else { // Pah. Shit here. } - - if ( - this.data.getPreparation().style_type === - PREPARATION_STYLE_TYPE.ESPRESSO && - _weight > 0 - ) { - // If the drip timer is showing, we can set the first drip and not doing a reference to the normal weight. - if ( - this.timer.showDripTimer === true && - this.data.coffee_first_drip_time <= 0 - ) { - // First drip is incoming - if ( - this.uiBrewHelper.fieldVisible( - this.settings.manage_parameters.coffee_first_drip_time, - this.data.getPreparation().manage_parameters.coffee_first_drip_time, - this.data.getPreparation().use_custom_parameters - ) - ) { - // The first time we set the weight, we have one sec delay, because of this do it -1 second - this.data.coffee_first_drip_time = this.getTime() - 1; - this.checkChanges(); - } - } - } } /** @@ -1647,6 +1699,35 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.flow_profile_raw.realtimeFlow.push(realtimeWaterFlow); /* Realtime flow End **/ + if ( + this.data.getPreparation().style_type === + PREPARATION_STYLE_TYPE.ESPRESSO && + flowObj.weight > 0 + ) { + // If the drip timer is showing, we can set the first drip and not doing a reference to the normal weight. + if ( + this.timer.showDripTimer === true && + this.data.coffee_first_drip_time <= 0 + ) { + // First drip is incoming + if ( + this.uiBrewHelper.fieldVisible( + this.settings.manage_parameters.coffee_first_drip_time, + this.data.getPreparation().manage_parameters.coffee_first_drip_time, + this.data.getPreparation().use_custom_parameters + ) + ) { + // The first time we set the weight, we have one sec delay, because of this do it -1 second + this.data.coffee_first_drip_time = this.timer.getSeconds(); + if (this.settings.brew_milliseconds) { + this.data.coffee_first_drip_time_milliseconds = + this.timer.getMilliseconds(); + } + this.checkChanges(); + } + } + } + if ( this.settings.bluetooth_ignore_anomaly_values === false && this.settings.bluetooth_ignore_negative_values === false @@ -1834,7 +1915,16 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { _template === true ) { this.data.brew_temperature_time = brew.brew_temperature_time; - this.brewTemperatureTime.setTime(this.data.brew_temperature_time); + if (this.settings.brew_milliseconds) { + this.data.brew_temperature_time_milliseconds = + brew.brew_temperature_time_milliseconds; + } + setTimeout(() => { + this.brewTemperatureTime.setTime( + this.data.brew_temperature_time, + this.data.brew_temperature_time_milliseconds + ); + }, 250); } } @@ -1844,7 +1934,15 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { _template === true ) { this.data.brew_time = brew.brew_time; - this.timer.setTime(this.data.brew_time); + if (this.settings.brew_milliseconds) { + this.data.brew_time_milliseconds = brew.brew_time_milliseconds; + } + setTimeout(() => { + this.timer.setTime( + this.data.brew_time, + this.data.brew_time_milliseconds + ); + }, 250); } } @@ -1872,12 +1970,38 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { _template === true ) { this.data.coffee_first_drip_time = brew.coffee_first_drip_time; + if (this.settings.brew_milliseconds) { + this.data.coffee_first_drip_time_milliseconds = + brew.coffee_first_drip_time_milliseconds; + } + + setTimeout(() => { + if (this.brewFirstDripTime) { + this.brewFirstDripTime.setTime( + this.data.coffee_first_drip_time, + this.data.coffee_first_drip_time_milliseconds + ); + } + }, 250); } if ( checkData.default_last_coffee_parameters.coffee_blooming_time || _template === true ) { this.data.coffee_blooming_time = brew.coffee_blooming_time; + if (this.settings.brew_milliseconds) { + this.data.coffee_blooming_time_milliseconds = + brew.coffee_blooming_time_milliseconds; + } + + setTimeout(() => { + if (this.brewCoffeeBloomingTime) { + this.brewCoffeeBloomingTime.setTime( + this.data.coffee_blooming_time, + this.data.coffee_blooming_time_milliseconds + ); + } + }, 250); } if (checkData.default_last_coffee_parameters.rating || _template === true) { diff --git a/src/components/timer/timer.component.html b/src/components/timer/timer.component.html index 616fd9712..b9838de72 100644 --- a/src/components/timer/timer.component.html +++ b/src/components/timer/timer.component.html @@ -1,24 +1,27 @@ - - {{ label }} - - + + {{ label }} + + + + - + - - - + - - + - - + + - + + diff --git a/src/components/timer/timer.component.ts b/src/components/timer/timer.component.ts index d53b4548c..3b2665d8d 100644 --- a/src/components/timer/timer.component.ts +++ b/src/components/timer/timer.component.ts @@ -1,6 +1,19 @@ -import {Component, EventEmitter, Input, OnDestroy, OnInit, Output} from '@angular/core'; - -import {ITimer} from '../../interfaces/timer/iTimer'; +import { + Component, + EventEmitter, + Input, + OnDestroy, + OnInit, + Output, +} from '@angular/core'; + +import { ITimer } from '../../interfaces/timer/iTimer'; +import { DatetimePopoverComponent } from '../../popover/datetime-popover/datetime-popover.component'; +import moment from 'moment'; +import { ModalController } from '@ionic/angular'; +import { Settings } from '../../classes/settings/settings'; +import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-devices'; +import { UISettingsStorage } from '../../services/uiSettingsStorage'; @Component({ selector: 'timer', @@ -9,84 +22,224 @@ import {ITimer} from '../../interfaces/timer/iTimer'; }) export class TimerComponent implements OnInit, OnDestroy { @Input() public label: string; - @Input() public timeInSeconds: number; - @Output() public timeChanged = new EventEmitter(); + @Input('hide-control-buttons') public hideControlButtons: boolean = false; + @Output() public timerStarted = new EventEmitter(); + @Output() public timerPaused = new EventEmitter(); + @Output() public timerReset = new EventEmitter(); + @Output() public timerResumed = new EventEmitter(); + @Output() public timerTicked = new EventEmitter(); + + public displayingTime: string = moment().startOf('day').toISOString(); + + private startingDay; + private startedTimer; + private pausedTimer; + private startedOffset; public timer: ITimer; - constructor() { } + public settings: Settings; + constructor( + private readonly modalCtrl: ModalController, + private readonly bleManager: CoffeeBluetoothDevicesService, + private readonly uiSettingsStorage: UISettingsStorage + ) { + this.settings = this.uiSettingsStorage.getSettings(); + } - public ngOnInit (): void { + public smartScaleConnected() { + try { + return this.bleManager.getScale() !== null; + } catch (ex) {} + } + + public ngOnInit(): void { this.initTimer(); } - public hasFinished (): boolean { - return this.timer.hasFinished; + public isTimerRunning() { + return this.timer.runTimer; } - public setTime (seconds: number): void { - this.timer.seconds = seconds; + public ngOnDestroy(): void { + this.timer.runTimer = false; + } - this.timer.displayTime = this.getSecondsAsDigitalClock(this.timer.seconds); + public hasFinished(): boolean { + return this.timer.hasFinished; } - public initTimer (): void { - if (!this.timeInSeconds) { this.timeInSeconds = 0; } + public initTimer(): void { // tslint:disable-next-line this.timer = { runTimer: false, hasStarted: false, hasFinished: false, - seconds: this.timeInSeconds + seconds: 0, + milliseconds: 0, } as ITimer; - this.timer.displayTime = this.getSecondsAsDigitalClock(this.timer.seconds); + this.displayingTime = moment(this.displayingTime) + .startOf('day') + .add('seconds', this.timer.seconds) + .add('milliseconds', this.timer.milliseconds) + .toISOString(); } - public startTimer (): void { + public startTimer(_resumed: boolean = false): void { + if (_resumed === false) { + const startingDate = new Date(); + this.startingDay = moment(startingDate).startOf('day'); + this.startedTimer = moment(startingDate); + this.startedOffset = this.startedTimer.diff(this.startingDay); + } else { + const restartTimer = moment(new Date()); + + this.startedOffset += restartTimer.diff(this.pausedTimer); + } this.timer.hasStarted = true; this.timer.runTimer = true; - this.timeChanged.emit(); this.timerTick(); + if (this.settings?.brew_milliseconds) { + this.millisecondTick(); + } + + if (_resumed === false) { + this.timerStarted.emit(); + } + + this.changeEvent(); } - public pauseTimer (): void { - this.timeChanged.emit(); + public pauseTimer(): void { + this.pausedTimer = moment(new Date()); + this.timerPaused.emit(); this.timer.runTimer = false; + this.timerPaused.emit(); + this.changeEvent(); } - public resumeTimer (): void { - this.startTimer(); + public resumeTimer(): void { + this.startTimer(true); + this.timerResumed.emit(); } - public timerTick (): void { + public millisecondTick(): void { setTimeout(() => { - if (!this.timer.runTimer) { return; } - this.timer.seconds++; - this.timer.displayTime = this.getSecondsAsDigitalClock(this.timer.seconds); + if (!this.timer.runTimer) { + return; + } + const milliSecondTimer = moment(new Date()).subtract(this.startedOffset); + + this.timer.milliseconds = milliSecondTimer.milliseconds(); + + this.displayingTime = moment(this.displayingTime) + .startOf('day') + .add('seconds', this.timer.seconds) + .add('milliseconds', this.timer.milliseconds) + .toISOString(); + this.millisecondTick(); + }, 10); + } + public timerTick(): void { + setTimeout(() => { + if (!this.timer.runTimer) { + return; + } + + const actualDate = new Date(); + + const actualTimerTick = moment(actualDate).subtract(this.startedOffset); + + const passedSeconds = actualTimerTick.diff(this.startingDay, 'seconds'); + this.timer.seconds = passedSeconds; + + this.displayingTime = moment(this.displayingTime) + .startOf('day') + .add('seconds', this.timer.seconds) + .add('milliseconds', this.timer.milliseconds) + .toISOString(); + this.timerTick(); - this.timeChanged.emit(); - }, 1000); + this.changeEvent(); + }, 10); } - public ngOnDestroy (): void { - this.timer.runTimer = false; + + public getSeconds(): number { + return this.timer.seconds; } - public inputChanged(){ - this.timeChanged.emit(); + public getMilliseconds(): number { + return this.timer.milliseconds; } - public getSeconds (): number { - return this.timer.seconds; + public reset() { + this.timerReset.emit(); + this.initTimer(); + this.changeEvent(); } - public getSecondsAsDigitalClock (inputSeconds: number): string { - const sec_num = parseInt(inputSeconds.toString(), 10); // don't forget the second param - const hours = Math.floor(sec_num / 3600); - const minutes = Math.floor((sec_num - (hours * 3600)) / 60); - const seconds = sec_num - (hours * 3600) - (minutes * 60); - const hoursString = (hours < 10) ? `0${hours}` : hours.toString(); - const minutesString = (minutes < 10) ? `0${minutes}` : minutes.toString(); - const secondsString = (seconds < 10) ? `0${seconds}` : seconds.toString(); + public formatSeconds(): string { + const secs = this.getSeconds(); + + const formatted = moment.utc(secs * 1000).format('mm:ss'); + return formatted; + } + + public changeEvent() { + this.timerTicked.emit(); + } + public setTime(seconds: number, milliseconds: number = 0): void { + this.timer.seconds = seconds; + if (milliseconds !== 0) { + this.timer.milliseconds = milliseconds; + } + this.displayingTime = moment(this.displayingTime) + .startOf('day') + .add('seconds', this.timer.seconds) + .add('milliseconds', this.timer.milliseconds) + .toISOString(); + } + + public changeDate(_event) { + const durationPassed = moment.duration( + moment(_event).diff(moment(_event).startOf('day')) + ); + this.displayingTime = moment(_event).toISOString(); + this.timer.seconds = durationPassed.asSeconds(); + // Emit event so parent page can do something + this.changeEvent(); + } - return `${hoursString}:${minutesString}:${secondsString}`; + public async showTimeOverlay(_event) { + _event.stopPropagation(); + _event.stopImmediatePropagation(); + + const modal = await this.modalCtrl.create({ + component: DatetimePopoverComponent, + id: 'datetime-popover', + cssClass: 'half-bottom-modal', + showBackdrop: true, + backdropDismiss: true, + swipeToClose: true, + componentProps: { displayingTime: this.displayingTime }, + }); + await modal.present(); + const modalData = await modal.onWillDismiss(); + if ( + modalData !== undefined && + modalData.data.displayingTime !== undefined + ) { + this.displayingTime = modalData.data.displayingTime; + this.timer.seconds = moment + .duration( + moment(this.displayingTime).diff( + moment(this.displayingTime).startOf('day') + ) + ) + .asSeconds(); + this.timer.milliseconds = moment(this.displayingTime) + .startOf('day') + .milliseconds(); + this.changeEvent(); + } } } diff --git a/src/interfaces/brew/iBrew.ts b/src/interfaces/brew/iBrew.ts index 44c947dbd..b1fda05b7 100755 --- a/src/interfaces/brew/iBrew.ts +++ b/src/interfaces/brew/iBrew.ts @@ -1,15 +1,15 @@ /** * Created by lars on 10/18/2017. */ -import {BREW_QUANTITY_TYPES_ENUM} from '../../enums/brews/brewQuantityTypes'; -import {IConfig} from '../objectConfig/iObjectConfig'; -import {ICupping} from '../cupping/iCupping'; -import {IBrewCoordinates} from './iBrewCoordinates'; -import {IFlavor} from '../flavor/iFlavor'; -import {BrewFlow} from '../../classes/brew/brewFlow'; +import { BREW_QUANTITY_TYPES_ENUM } from '../../enums/brews/brewQuantityTypes'; +import { IConfig } from '../objectConfig/iObjectConfig'; +import { ICupping } from '../cupping/iCupping'; +import { IBrewCoordinates } from './iBrewCoordinates'; +import { IFlavor } from '../flavor/iFlavor'; +import { BrewFlow } from '../../classes/brew/brewFlow'; export interface IBrew { - // Properties + // Properties /** * Inherits the grind size set on your hand/electric grinder */ @@ -52,10 +52,14 @@ export interface IBrew { * Inherits the temperature surfing time for the coffee- */ brew_temperature_time: number; + + brew_temperature_time_milliseconds: number; /** * Inherits the brewing time for the coffee, shot-time, infusion-time etc. */ brew_time: number; + + brew_time_milliseconds: number; /** * Inherits the output (user specific in g or ml) */ @@ -89,10 +93,14 @@ export interface IBrew { */ coffee_first_drip_time: number; + coffee_first_drip_time_milliseconds: number; + /** * Inherits the blooming / pid time */ coffee_blooming_time: number; + + coffee_blooming_time_milliseconds: number; /** * Image attachments */ @@ -145,5 +153,4 @@ export interface IBrew { // Functions formateDate(): string; - } diff --git a/src/interfaces/settings/iSettings.ts b/src/interfaces/settings/iSettings.ts index b34382e1a..775ed540c 100755 --- a/src/interfaces/settings/iSettings.ts +++ b/src/interfaces/settings/iSettings.ts @@ -26,6 +26,7 @@ export interface ISettings { qr_scanner_information: boolean; track_brew_coordinates: boolean; fast_brew_repeat: boolean; + brew_milliseconds: boolean; image_quality: number; brew_rating: number; brew_rating_steps: number; diff --git a/src/popover/datetime-popover/datetime-popover.component.html b/src/popover/datetime-popover/datetime-popover.component.html index 8d75f1cbe..d6becb355 100644 --- a/src/popover/datetime-popover/datetime-popover.component.html +++ b/src/popover/datetime-popover/datetime-popover.component.html @@ -1,14 +1,16 @@ - {{"TIMER_HOUR" | translate}} - {{"TIMER_MINUTES" | translate}} - {{"TIMER_SECONDS" | translate}} + {{"TIMER_HOUR" | translate}} + {{"TIMER_MINUTES" | translate}} + {{"TIMER_SECONDS" | translate}} + {{"TIMER_MILLISECONDS" | translate}} - - - + + + + diff --git a/src/popover/datetime-popover/datetime-popover.component.ts b/src/popover/datetime-popover/datetime-popover.component.ts index 4b4f2267d..73200a269 100644 --- a/src/popover/datetime-popover/datetime-popover.component.ts +++ b/src/popover/datetime-popover/datetime-popover.component.ts @@ -1,6 +1,8 @@ -import {Component, Input, OnInit} from '@angular/core'; -import {ModalController} from '@ionic/angular'; +import { Component, Input, OnInit } from '@angular/core'; +import { ModalController } from '@ionic/angular'; import moment from 'moment'; +import { UISettingsStorage } from '../../services/uiSettingsStorage'; +import { Settings } from '../../classes/settings/settings'; @Component({ selector: 'app-datetime-popover', @@ -8,47 +10,60 @@ import moment from 'moment'; styleUrls: ['./datetime-popover.component.scss'], }) export class DatetimePopoverComponent implements OnInit { - - public timer = { + public timer = { HOURS: 0, MINUTES: 0, SECONDS: 0, + MILLISECONDS: 0, }; @Input() public displayingTime: string; - constructor(private readonly modalCtrl: ModalController) { - - } + public settings: Settings; + constructor( + private readonly modalCtrl: ModalController, + private readonly uiSettingsStorage: UISettingsStorage + ) {} public ngOnInit() { + this.settings = this.uiSettingsStorage.getSettings(); const passedDisplayingTime = moment(this.displayingTime); this.timer.HOURS = passedDisplayingTime.hours(); this.timer.MINUTES = passedDisplayingTime.minutes(); this.timer.SECONDS = passedDisplayingTime.seconds(); + this.timer.MILLISECONDS = passedDisplayingTime.milliseconds(); } public dismiss(): void { - this.modalCtrl.dismiss({ - dismissed: true - },undefined, 'datetime-popover'); - + this.modalCtrl.dismiss( + { + dismissed: true, + }, + undefined, + 'datetime-popover' + ); } public choose() { const newDisplayingTime = moment().startOf('day'); - if (this.timer.SECONDS>0) { + if (this.timer.MILLISECONDS > 0) { + newDisplayingTime.add('milliseconds', this.timer.MILLISECONDS); + } + if (this.timer.SECONDS > 0) { newDisplayingTime.add('seconds', this.timer.SECONDS); } - if (this.timer.MINUTES>0) { + if (this.timer.MINUTES > 0) { newDisplayingTime.add('minutes', this.timer.MINUTES); } - if (this.timer.HOURS>0){ - newDisplayingTime.add('hours',this.timer.HOURS); + if (this.timer.HOURS > 0) { + newDisplayingTime.add('hours', this.timer.HOURS); } - this.modalCtrl.dismiss({ - displayingTime: newDisplayingTime.toISOString() - },undefined, 'datetime-popover'); + this.modalCtrl.dismiss( + { + displayingTime: newDisplayingTime.toISOString(), + }, + undefined, + 'datetime-popover' + ); } - } diff --git a/src/services/uiBrewHelper.ts b/src/services/uiBrewHelper.ts index 1b9b0da48..1be1749b1 100644 --- a/src/services/uiBrewHelper.ts +++ b/src/services/uiBrewHelper.ts @@ -1,44 +1,41 @@ /** Core */ -import {Injectable} from '@angular/core'; - -import {UIBeanStorage} from './uiBeanStorage'; -import {UIMillStorage} from './uiMillStorage'; -import {UIPreparationStorage} from './uiPreparationStorage'; -import {UIAlert} from './uiAlert'; -import {Brew} from '../classes/brew/brew'; -import {IBean} from '../interfaces/bean/iBean'; -import {IPreparation} from '../interfaces/preparation/iPreparation'; -import {IMill} from '../interfaces/mill/iMill'; -import {UISettingsStorage} from './uiSettingsStorage'; -import {Settings} from '../classes/settings/settings'; -import {Preparation} from '../classes/preparation/preparation'; -import {TranslateService} from '@ngx-translate/core'; -import {ICupping} from '../interfaces/cupping/iCupping'; -import {UIBrewStorage} from './uiBrewStorage'; -import {Bean} from '../classes/bean/bean'; -import {UIBeanHelper} from './uiBeanHelper'; +import { Injectable } from '@angular/core'; + +import { UIBeanStorage } from './uiBeanStorage'; +import { UIMillStorage } from './uiMillStorage'; +import { UIPreparationStorage } from './uiPreparationStorage'; +import { UIAlert } from './uiAlert'; +import { Brew } from '../classes/brew/brew'; +import { IBean } from '../interfaces/bean/iBean'; +import { IPreparation } from '../interfaces/preparation/iPreparation'; +import { IMill } from '../interfaces/mill/iMill'; +import { UISettingsStorage } from './uiSettingsStorage'; +import { Settings } from '../classes/settings/settings'; +import { Preparation } from '../classes/preparation/preparation'; +import { TranslateService } from '@ngx-translate/core'; +import { ICupping } from '../interfaces/cupping/iCupping'; +import { UIBrewStorage } from './uiBrewStorage'; +import { Bean } from '../classes/bean/bean'; +import { UIBeanHelper } from './uiBeanHelper'; import BREW_TRACKING from '../data/tracking/brewTracking'; -import {BrewAddComponent} from '../app/brew/brew-add/brew-add.component'; -import {UIAnalytics} from './uiAnalytics'; -import {ModalController} from '@ionic/angular'; -import {BrewChoosePreparationToBrewComponent} from '../app/brew/brew-choose-preparation-to-brew/brew-choose-preparation-to-brew.component'; -import {BrewEditComponent} from '../app/brew/brew-edit/brew-edit.component'; -import {IBrew} from '../interfaces/brew/iBrew'; -import {BrewDetailComponent} from '../app/brew/brew-detail/brew-detail.component'; -import {BrewCuppingComponent} from '../app/brew/brew-cupping/brew-cupping.component'; -import {BrewFlowComponent} from '../app/brew/brew-flow/brew-flow.component'; - +import { BrewAddComponent } from '../app/brew/brew-add/brew-add.component'; +import { UIAnalytics } from './uiAnalytics'; +import { ModalController } from '@ionic/angular'; +import { BrewChoosePreparationToBrewComponent } from '../app/brew/brew-choose-preparation-to-brew/brew-choose-preparation-to-brew.component'; +import { BrewEditComponent } from '../app/brew/brew-edit/brew-edit.component'; +import { IBrew } from '../interfaces/brew/iBrew'; +import { BrewDetailComponent } from '../app/brew/brew-detail/brew-detail.component'; +import { BrewCuppingComponent } from '../app/brew/brew-cupping/brew-cupping.component'; +import { BrewFlowComponent } from '../app/brew/brew-flow/brew-flow.component'; /** * Handles every helping functionalities */ @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class UIBrewHelper { - - private static instance: UIBrewHelper; private canBrewBoolean: boolean = undefined; @@ -80,17 +77,17 @@ export class UIBrewHelper { return sortedBrews; } - constructor (private readonly uiBeanStorage: UIBeanStorage, - private readonly uiMillStorage: UIMillStorage, - private readonly uiPreparationStorage: UIPreparationStorage, - private readonly uiBrewStorage: UIBrewStorage, - private readonly uiAlert: UIAlert, - private readonly uiSettingsStorage: UISettingsStorage, - private readonly translate: TranslateService, - private readonly uiAnalytics: UIAnalytics, - private readonly modalController: ModalController) { - - + constructor( + private readonly uiBeanStorage: UIBeanStorage, + private readonly uiMillStorage: UIMillStorage, + private readonly uiPreparationStorage: UIPreparationStorage, + private readonly uiBrewStorage: UIBrewStorage, + private readonly uiAlert: UIAlert, + private readonly uiSettingsStorage: UISettingsStorage, + private readonly translate: TranslateService, + private readonly uiAnalytics: UIAnalytics, + private readonly modalController: ModalController + ) { this.uiBeanStorage.attachOnEvent().subscribe(() => { this.canBrewBoolean = undefined; }); @@ -109,82 +106,94 @@ export class UIBrewHelper { if (UIBrewHelper.instance === undefined) { UIBrewHelper.instance = this; } - } - public fieldVisible(_settingsField:boolean,_preparationField:boolean,_useCustomPreparation: boolean) { - return _useCustomPreparation?_preparationField:_settingsField; + public fieldVisible( + _settingsField: boolean, + _preparationField: boolean, + _useCustomPreparation: boolean + ) { + return _useCustomPreparation ? _preparationField : _settingsField; } - public fieldOrder(_settingsOrder:number, _preparationOrder:number, _useCustomPreparation: boolean) { - return _useCustomPreparation?_preparationOrder:_settingsOrder; + public fieldOrder( + _settingsOrder: number, + _preparationOrder: number, + _useCustomPreparation: boolean + ) { + return _useCustomPreparation ? _preparationOrder : _settingsOrder; } - - public canBrew(): boolean { if (this.canBrewBoolean === undefined || this.canBrewBoolean === false) { - const hasBeans: boolean = (this.uiBeanStorage.getAllEntries().length > 0 && this.uiBeanStorage.getAllEntries() - .filter((bean) => !bean.finished).length > 0); - const hasPreparationMethods: boolean = (this.uiPreparationStorage.getAllEntries().filter((e) => !e.finished).length > 0); - const hasMills: boolean = (this.uiMillStorage.getAllEntries().filter((e) => !e.finished).length > 0); + const hasBeans: boolean = + this.uiBeanStorage.getAllEntries().length > 0 && + this.uiBeanStorage.getAllEntries().filter((bean) => !bean.finished) + .length > 0; + const hasPreparationMethods: boolean = + this.uiPreparationStorage.getAllEntries().filter((e) => !e.finished) + .length > 0; + const hasMills: boolean = + this.uiMillStorage.getAllEntries().filter((e) => !e.finished).length > + 0; this.canBrewBoolean = hasBeans && hasPreparationMethods && hasMills; } return this.canBrewBoolean; - } public canBrewIfNotShowMessage() { if (this.canBrew() === false) { - this.uiAlert.presentCustomPopover('CANT_START_NEW_BREW_TITLE', 'CANT_START_NEW_BREW_DESCRIPTION', 'UNDERSTOOD'); + this.uiAlert.presentCustomPopover( + 'CANT_START_NEW_BREW_TITLE', + 'CANT_START_NEW_BREW_DESCRIPTION', + 'UNDERSTOOD' + ); return false; } return true; } public checkIfBeanPackageIsConsumed(_bean: Bean): boolean { - const bean: Bean = _bean; - if (bean.weight > 0) { - const beanPackageWeight = bean.weight; - let usedWeightCount: number = 0; - const brews: Array = this.uiBrewStorage.getAllEntries().filter((e)=> e.getBean().config.uuid === bean.config.uuid); - for (const brew of brews) { - if (brew.bean_weight_in > 0) { - usedWeightCount += brew.bean_weight_in; - } else { - usedWeightCount += brew.grind_weight; - } - } - - // 5 grams is threshold - // If we just got 5 grams left, ask the user if he wants to archive his beans - if ((beanPackageWeight - usedWeightCount) <= 5) { - return true; + const bean: Bean = _bean; + if (bean.weight > 0) { + const beanPackageWeight = bean.weight; + let usedWeightCount: number = 0; + const brews: Array = this.uiBrewStorage + .getAllEntries() + .filter((e) => e.getBean().config.uuid === bean.config.uuid); + for (const brew of brews) { + if (brew.bean_weight_in > 0) { + usedWeightCount += brew.bean_weight_in; + } else { + usedWeightCount += brew.grind_weight; } + } + // 5 grams is threshold + // If we just got 5 grams left, ask the user if he wants to archive his beans + if (beanPackageWeight - usedWeightCount <= 5) { + return true; } - return false; + } + return false; } - public async checkIfBeanPackageIsConsumedTriggerMessageAndArchive(_bean) { - if (this.checkIfBeanPackageIsConsumed(_bean)) { - try { - await this.uiAlert.showConfirm('BEAN_LOOKS_LIKE_CONSUMED',undefined,true); - // He said yes - await UIBeanHelper.getInstance().archiveBeanWithRatingQuestion(_bean); - - } catch (ex) { - - } - - } - + if (this.checkIfBeanPackageIsConsumed(_bean)) { + try { + await this.uiAlert.showConfirm( + 'BEAN_LOOKS_LIKE_CONSUMED', + undefined, + true + ); + // He said yes + await UIBeanHelper.getInstance().archiveBeanWithRatingQuestion(_bean); + } catch (ex) {} + } } - public copyBrewToRepeat(_brewToCopy: Brew): Brew { const repeatBrew: Brew = new Brew(); const brewBean: IBean = this.uiBeanStorage.getByUUID(_brewToCopy.bean); @@ -195,7 +204,9 @@ export class UIBrewHelper { repeatBrew.grind_weight = _brewToCopy.grind_weight; - const brewPreparation: IPreparation = this.uiPreparationStorage.getByUUID(_brewToCopy.method_of_preparation); + const brewPreparation: IPreparation = this.uiPreparationStorage.getByUUID( + _brewToCopy.method_of_preparation + ); if (!brewPreparation.finished) { repeatBrew.method_of_preparation = brewPreparation.config.uuid; } @@ -209,30 +220,38 @@ export class UIBrewHelper { repeatBrew.pressure_profile = _brewToCopy.pressure_profile; repeatBrew.brew_temperature = _brewToCopy.brew_temperature; repeatBrew.brew_temperature_time = _brewToCopy.brew_temperature_time; + repeatBrew.brew_temperature_time_milliseconds = + _brewToCopy.brew_temperature_time_milliseconds; repeatBrew.brew_time = _brewToCopy.brew_time; + repeatBrew.brew_time_milliseconds = _brewToCopy.brew_time_milliseconds; repeatBrew.brew_quantity = _brewToCopy.brew_quantity; repeatBrew.brew_quantity_type = _brewToCopy.brew_quantity_type; repeatBrew.coffee_type = _brewToCopy.coffee_type; repeatBrew.coffee_concentration = _brewToCopy.coffee_concentration; repeatBrew.coffee_first_drip_time = _brewToCopy.coffee_first_drip_time; + repeatBrew.coffee_first_drip_time_milliseconds = + _brewToCopy.coffee_first_drip_time_milliseconds; repeatBrew.coffee_blooming_time = _brewToCopy.coffee_blooming_time; + repeatBrew.coffee_blooming_time_milliseconds = + _brewToCopy.coffee_blooming_time_milliseconds; repeatBrew.rating = _brewToCopy.rating; repeatBrew.note = _brewToCopy.note; repeatBrew.coordinates = _brewToCopy.coordinates; - repeatBrew.method_of_preparation_tools = []; const repeatTools = _brewToCopy.method_of_preparation_tools; for (const id of repeatTools) { - const tool = _brewToCopy.getPreparation().tools.find((e) => e.config.uuid === id); - if (tool.archived === false){ + const tool = _brewToCopy + .getPreparation() + .tools.find((e) => e.config.uuid === id); + if (tool.archived === false) { repeatBrew.method_of_preparation_tools.push(tool.config.uuid); } - } repeatBrew.tds = _brewToCopy.tds; repeatBrew.brew_beverage_quantity = _brewToCopy.brew_beverage_quantity; - repeatBrew.brew_beverage_quantity_type = _brewToCopy.brew_beverage_quantity_type; + repeatBrew.brew_beverage_quantity_type = + _brewToCopy.brew_beverage_quantity_type; repeatBrew.water = _brewToCopy.water; repeatBrew.bean_weight_in = _brewToCopy.bean_weight_in; repeatBrew.vessel_weight = _brewToCopy.vessel_weight; @@ -241,19 +260,16 @@ export class UIBrewHelper { return repeatBrew; } - public cleanInvisibleBrewData(brew: Brew) { const settingsObj: Settings = this.uiSettingsStorage.getSettings(); let checkData: Settings | Preparation; if (brew.getPreparation().use_custom_parameters === true) { - checkData = brew.getPreparation() + checkData = brew.getPreparation(); } else { checkData = settingsObj; } - - - if (!checkData.manage_parameters.grind_size ) { + if (!checkData.manage_parameters.grind_size) { brew.grind_size = ''; } if (!checkData.manage_parameters.grind_weight) { @@ -273,7 +289,7 @@ export class UIBrewHelper { brew.brew_temperature = 0; } if (!checkData.manage_parameters.brew_temperature_time) { - brew.brew_temperature_time = 0; + brew.brew_temperature_time = 0; } if (!checkData.manage_parameters.brew_time) { brew.brew_time = 0; @@ -289,7 +305,7 @@ export class UIBrewHelper { brew.coffee_concentration = ''; } if (!checkData.manage_parameters.coffee_first_drip_time) { - brew.coffee_first_drip_time = 0; + brew.coffee_first_drip_time = 0; } if (!checkData.manage_parameters.coffee_blooming_time) { brew.coffee_blooming_time = 0; @@ -299,10 +315,10 @@ export class UIBrewHelper { brew.rating = 0; } if (!checkData.manage_parameters.note) { - brew.note =''; + brew.note = ''; } if (!checkData.manage_parameters.tds) { - brew.tds =0; + brew.tds = 0; } if (!checkData.manage_parameters.brew_beverage_quantity) { brew.brew_beverage_quantity = 0; @@ -310,29 +326,27 @@ export class UIBrewHelper { if (!checkData.manage_parameters.method_of_preparation_tool) { brew.method_of_preparation_tools = []; } - if (!checkData.manage_parameters.water ) { + if (!checkData.manage_parameters.water) { brew.water = ''; } if (!checkData.manage_parameters.bean_weight_in) { brew.bean_weight_in = 0; } if (!checkData.manage_parameters.vessel) { - brew.vessel_name =''; + brew.vessel_name = ''; brew.vessel_weight = 0; } - } - public showSectionAfterBrew(_preparation: Preparation): boolean { - let checkData: Settings | Preparation; if (_preparation.use_custom_parameters === true) { checkData = _preparation; } else { checkData = this.settings; } - return (checkData.manage_parameters.brew_quantity || + return ( + checkData.manage_parameters.brew_quantity || checkData.manage_parameters.coffee_type || checkData.manage_parameters.coffee_concentration || checkData.manage_parameters.rating || @@ -340,10 +354,10 @@ export class UIBrewHelper { checkData.manage_parameters.set_custom_brew_time || checkData.manage_parameters.attachments || checkData.manage_parameters.tds || - checkData.manage_parameters.brew_beverage_quantity); + checkData.manage_parameters.brew_beverage_quantity + ); } - public showSectionWhileBrew(_preparation: Preparation): boolean { let checkData: Settings | Preparation; if (_preparation.use_custom_parameters === true) { @@ -351,11 +365,13 @@ export class UIBrewHelper { } else { checkData = this.settings; } - return (checkData.manage_parameters.pressure_profile || + return ( + checkData.manage_parameters.pressure_profile || checkData.manage_parameters.brew_temperature_time || checkData.manage_parameters.brew_time || checkData.manage_parameters.coffee_blooming_time || - checkData.manage_parameters.coffee_first_drip_time); + checkData.manage_parameters.coffee_first_drip_time + ); } public showSectionBeforeBrew(_preparation: Preparation): boolean { @@ -365,7 +381,8 @@ export class UIBrewHelper { } else { checkData = this.settings; } - return (checkData.manage_parameters.grind_size || + return ( + checkData.manage_parameters.grind_size || checkData.manage_parameters.grind_weight || checkData.manage_parameters.brew_temperature || checkData.manage_parameters.method_of_preparation || @@ -375,12 +392,13 @@ export class UIBrewHelper { checkData.manage_parameters.mill_timer || checkData.manage_parameters.water || checkData.manage_parameters.bean_weight_in || - checkData.manage_parameters.vessel); - + checkData.manage_parameters.vessel + ); } public showCupping(_data: Brew): boolean { - return (_data.cupping.dry_fragrance > 0 || + return ( + _data.cupping.dry_fragrance > 0 || _data.cupping.wet_aroma > 0 || _data.cupping.brightness > 0 || _data.cupping.flavor > 0 || @@ -389,15 +407,14 @@ export class UIBrewHelper { _data.cupping.sweetness > 0 || _data.cupping.clean_cup > 0 || _data.cupping.complexity > 0 || - _data.cupping.uniformity > 0); + _data.cupping.uniformity > 0 + ); } - public getCuppingChartData(_data: Brew | ICupping) { - let data: any; if (_data instanceof Brew) { - data =_data.cupping; + data = _data.cupping; } else { data = _data; } @@ -430,9 +447,10 @@ export class UIBrewHelper { data.sweetness, data.clean_cup, data.complexity, - data.uniformity - ] - }] + data.uniformity, + ], + }, + ], }; const chartOptions = { responsive: true, @@ -446,12 +464,10 @@ export class UIBrewHelper { }, scale: { - - beginAtZero: true, - max: 10, - min: 0, - step: 0.1 - + beginAtZero: true, + max: 10, + min: 0, + step: 0.1, }, tooltips: { // Disable the on-canvas tooltip @@ -463,30 +479,36 @@ export class UIBrewHelper { const cuppingElementData = { type: 'radar', data: cuppingData, - options: chartOptions + options: chartOptions, }; return cuppingElementData; } - - public async addBrew() { if (this.canBrewIfNotShowMessage()) { - const modal = await this.modalController.create({component: BrewAddComponent,id:BrewAddComponent.COMPONENT_ID}); + const modal = await this.modalController.create({ + component: BrewAddComponent, + id: BrewAddComponent.COMPONENT_ID, + }); await modal.present(); await modal.onWillDismiss(); } } public async brewFlow() { - - const modal = await this.modalController.create({component: BrewFlowComponent,id:BrewFlowComponent.COMPONENT_ID}); - await modal.present(); - await modal.onWillDismiss(); - + const modal = await this.modalController.create({ + component: BrewFlowComponent, + id: BrewFlowComponent.COMPONENT_ID, + }); + await modal.present(); + await modal.onWillDismiss(); } public async repeatBrew(_brew: Brew) { - const modal = await this.modalController.create({component: BrewAddComponent, id: BrewAddComponent.COMPONENT_ID, componentProps: {brew_template: _brew}}); + const modal = await this.modalController.create({ + component: BrewAddComponent, + id: BrewAddComponent.COMPONENT_ID, + componentProps: { brew_template: _brew }, + }); await modal.present(); await modal.onWillDismiss(); } @@ -503,7 +525,10 @@ export class UIBrewHelper { initalBreakpoint = 0.5; } - this.uiAnalytics.trackEvent(BREW_TRACKING.TITLE, BREW_TRACKING.ACTIONS.LONG_PRESS_ADD); + this.uiAnalytics.trackEvent( + BREW_TRACKING.TITLE, + BREW_TRACKING.ACTIONS.LONG_PRESS_ADD + ); const modal = await this.modalController.create({ component: BrewChoosePreparationToBrewComponent, id: BrewChoosePreparationToBrewComponent.COMPONENT_ID, @@ -514,17 +539,15 @@ export class UIBrewHelper { }); await modal.present(); - - const {data} = await modal.onWillDismiss(); + const { data } = await modal.onWillDismiss(); if (data !== undefined && data.preparation) { const modalBrew = await this.modalController.create({ component: BrewAddComponent, - componentProps: {loadSpecificLastPreparation: data.preparation}, - id: BrewAddComponent.COMPONENT_ID + componentProps: { loadSpecificLastPreparation: data.preparation }, + id: BrewAddComponent.COMPONENT_ID, }); await modalBrew.present(); await modalBrew.onWillDismiss(); - } } } @@ -533,7 +556,7 @@ export class UIBrewHelper { const modal = await this.modalController.create({ component: BrewEditComponent, id: BrewEditComponent.COMPONENT_ID, - componentProps: {brew: _brew} + componentProps: { brew: _brew }, }); await modal.present(); await modal.onWillDismiss(); @@ -547,20 +570,22 @@ export class UIBrewHelper { } public async detailBrew(_brew: Brew) { - - const modal = await this.modalController.create({component: BrewDetailComponent, id: BrewDetailComponent.COMPONENT_ID, componentProps: {brew: _brew}}); + const modal = await this.modalController.create({ + component: BrewDetailComponent, + id: BrewDetailComponent.COMPONENT_ID, + componentProps: { brew: _brew }, + }); await modal.present(); await modal.onWillDismiss(); - } public async cupBrew(_brew: Brew) { - - const modal = await this.modalController.create({component: BrewCuppingComponent, id:BrewCuppingComponent.COMPONENT_ID, componentProps: {brew: _brew}}); + const modal = await this.modalController.create({ + component: BrewCuppingComponent, + id: BrewCuppingComponent.COMPONENT_ID, + componentProps: { brew: _brew }, + }); await modal.present(); await modal.onWillDismiss(); - } - - } diff --git a/src/services/uiExcel.ts b/src/services/uiExcel.ts index 47f8ef838..95b7574d8 100755 --- a/src/services/uiExcel.ts +++ b/src/services/uiExcel.ts @@ -1,57 +1,55 @@ /** Core */ -import {Injectable} from '@angular/core'; +import { Injectable } from '@angular/core'; /** Services */ -import {UIHelper} from './uiHelper'; -import {UILog} from './uiLog'; -import {UIStorage} from './uiStorage'; +import { UIHelper } from './uiHelper'; +import { UILog } from './uiLog'; +import { UIStorage } from './uiStorage'; import * as XLSX from 'xlsx'; -import {File, FileEntry} from '@ionic-native/file/ngx'; -import {AlertController, Platform} from '@ionic/angular'; -import {UIBrewStorage} from './uiBrewStorage'; -import {TranslateService} from '@ngx-translate/core'; -import {UIBeanStorage} from './uiBeanStorage'; -import {BEAN_ROASTING_TYPE_ENUM} from '../enums/beans/beanRoastingType'; -import {BEAN_MIX_ENUM} from '../enums/beans/mix'; -import {UIPreparationStorage} from './uiPreparationStorage'; -import {UIAlert} from './uiAlert'; -import {SocialSharing} from '@ionic-native/social-sharing/ngx'; -import {UIFileHelper} from './uiFileHelper'; -import {UIMillStorage} from './uiMillStorage'; -import {BrewFlow} from '../classes/brew/brewFlow'; +import { File, FileEntry } from '@ionic-native/file/ngx'; +import { AlertController, Platform } from '@ionic/angular'; +import { UIBrewStorage } from './uiBrewStorage'; +import { TranslateService } from '@ngx-translate/core'; +import { UIBeanStorage } from './uiBeanStorage'; +import { BEAN_ROASTING_TYPE_ENUM } from '../enums/beans/beanRoastingType'; +import { BEAN_MIX_ENUM } from '../enums/beans/mix'; +import { UIPreparationStorage } from './uiPreparationStorage'; +import { UIAlert } from './uiAlert'; +import { SocialSharing } from '@ionic-native/social-sharing/ngx'; +import { UIFileHelper } from './uiFileHelper'; +import { UIMillStorage } from './uiMillStorage'; +import { BrewFlow } from '../classes/brew/brewFlow'; import moment from 'moment'; - - +import { UISettingsStorage } from './uiSettingsStorage'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class UIExcel { - - constructor(protected uiStorage: UIStorage, - protected uiHelper: UIHelper, - protected uiLog: UILog, - private readonly file: File, - private readonly platform: Platform, - private readonly uiBrewStorage: UIBrewStorage, - private readonly uiBeanStorage: UIBeanStorage, - private readonly uiPreparationStoraage: UIPreparationStorage, - private readonly translate: TranslateService, - private readonly uiAlert: UIAlert, - private readonly socialsharing: SocialSharing, - private readonly uiFileHelper: UIFileHelper, - private readonly uiMillStorage: UIMillStorage, - private readonly alertCtrl: AlertController) { - - } - private write(): XLSX.WorkBook { + constructor( + protected uiStorage: UIStorage, + protected uiHelper: UIHelper, + protected uiLog: UILog, + private readonly file: File, + private readonly platform: Platform, + private readonly uiBrewStorage: UIBrewStorage, + private readonly uiBeanStorage: UIBeanStorage, + private readonly uiPreparationStoraage: UIPreparationStorage, + private readonly translate: TranslateService, + private readonly uiAlert: UIAlert, + private readonly socialsharing: SocialSharing, + private readonly uiFileHelper: UIFileHelper, + private readonly uiMillStorage: UIMillStorage, + private readonly alertCtrl: AlertController, + private readonly uiSettingsStorage: UISettingsStorage + ) {} + private write(): XLSX.WorkBook { /* generate worksheet */ // const ws: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(this.data); /* generate workbook and add the worksheet */ const wb: XLSX.WorkBook = XLSX.utils.book_new(); - this.exportBrews(wb); this.exportBeans(wb); this.exportPreparationMethods(wb); @@ -69,22 +67,24 @@ export class UIExcel { header.push('Actual smoothed weight'); header.push('Old smoothed weight'); - - const wsData: any[][] = [header]; for (const entry of _flow.weight) { const wbEntry: Array = [ - entry.timestamp, - entry.brew_time, - entry.actual_weight, - entry.old_weight, - entry.actual_smoothed_weight, - entry.old_smoothed_weight]; + entry.timestamp, + entry.brew_time, + entry.actual_weight, + entry.old_weight, + entry.actual_smoothed_weight, + entry.old_smoothed_weight, + ]; wsData.push(wbEntry); } const ws: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(wsData); - XLSX.utils.book_append_sheet(wb, ws, this.translate.instant('Flow profile raw')); - + XLSX.utils.book_append_sheet( + wb, + ws, + this.translate.instant('Flow profile raw') + ); const header_flow: Array = []; header.push('Timestamp'); @@ -96,11 +96,16 @@ export class UIExcel { const wbEntry: Array = [ entry.timestamp, entry.brew_time, - entry.value,]; + entry.value, + ]; wsDataFlow.push(wbEntry); } const wsFlow: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(wsDataFlow); - XLSX.utils.book_append_sheet(wb, wsFlow, this.translate.instant('Flow profile calculated')); + XLSX.utils.book_append_sheet( + wb, + wsFlow, + this.translate.instant('Flow profile calculated') + ); if (_flow.hasOwnProperty('realtimeFlow')) { const header_flow_realtime: Array = []; @@ -115,15 +120,20 @@ export class UIExcel { entry.timestamp, entry.brew_time, entry.flow_value, - entry.smoothed_weight]; + entry.smoothed_weight, + ]; wsDataFlowRealtime.push(wbEntry); } - const wsFlowRealtime: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(wsDataFlowRealtime); - XLSX.utils.book_append_sheet(wb, wsFlowRealtime, this.translate.instant('Flow profile realtime')); + const wsFlowRealtime: XLSX.WorkSheet = + XLSX.utils.aoa_to_sheet(wsDataFlowRealtime); + XLSX.utils.book_append_sheet( + wb, + wsFlowRealtime, + this.translate.instant('Flow profile realtime') + ); } if (_flow.hasOwnProperty('pressureFlow')) { - const header_pressure_flow: Array = []; header.push('Timestamp'); header.push('Time'); @@ -136,16 +146,21 @@ export class UIExcel { entry.timestamp, entry.brew_time, entry.actual_pressure, - entry.old_pressure]; + entry.old_pressure, + ]; wsDataPressureFlow.push(wbEntry); } - const wsFlowRealtime: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(wsDataPressureFlow); - XLSX.utils.book_append_sheet(wb, wsFlowRealtime, this.translate.instant('Flow pressure')); + const wsFlowRealtime: XLSX.WorkSheet = + XLSX.utils.aoa_to_sheet(wsDataPressureFlow); + XLSX.utils.book_append_sheet( + wb, + wsFlowRealtime, + this.translate.instant('Flow pressure') + ); } return wb; } - private exportGrinders(_wb: XLSX.WorkBook) { const header: Array = []; @@ -155,15 +170,17 @@ export class UIExcel { header.push(this.translate.instant('EXCEL.GRINDER.CREATION_DATE')); header.push(this.translate.instant('EXCEL.GRINDER.ID')); - const wsData: any[][] = [header]; for (const mill of this.uiMillStorage.getAllEntries()) { const entry: Array = [ mill.name, mill.note, mill.finished, - this.uiHelper.formateDate(mill.config.unix_timestamp, 'DD.MM.YYYY HH:mm:ss'), - mill.config.uuid + this.uiHelper.formateDate( + mill.config.unix_timestamp, + 'DD.MM.YYYY HH:mm:ss' + ), + mill.config.uuid, ]; wsData.push(entry); } @@ -171,8 +188,7 @@ export class UIExcel { const ws: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(wsData); XLSX.utils.book_append_sheet(_wb, ws, this.translate.instant('NAV_MILL')); } - private exportPreparationMethods(_wb: XLSX.WorkBook) - { + private exportPreparationMethods(_wb: XLSX.WorkBook) { const header: Array = []; header.push(this.translate.instant('PREPARATION_TYPE')); @@ -184,7 +200,6 @@ export class UIExcel { header.push(this.translate.instant('EXCEL.PREPARATION.CREATION_DATE')); header.push(this.translate.instant('EXCEL.PREPARATION.ID')); - const wsData: any[][] = [header]; for (const preparation of this.uiPreparationStoraage.getAllEntries()) { const entry: Array = [ @@ -194,22 +209,25 @@ export class UIExcel { preparation.tools.map((e) => e.name).join(','), preparation.note, preparation.finished, - this.uiHelper.formateDate(preparation.config.unix_timestamp, 'DD.MM.YYYY HH:mm:ss'), - preparation.config.uuid + this.uiHelper.formateDate( + preparation.config.unix_timestamp, + 'DD.MM.YYYY HH:mm:ss' + ), + preparation.config.uuid, ]; - wsData.push(entry); } const ws: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(wsData); - XLSX.utils.book_append_sheet(_wb, ws, this.translate.instant('NAV_PREPARATION')); - + XLSX.utils.book_append_sheet( + _wb, + ws, + this.translate.instant('NAV_PREPARATION') + ); } - - private exportBeans(_wb: XLSX.WorkBook) - { + private exportBeans(_wb: XLSX.WorkBook) { const header: Array = []; header.push(this.translate.instant('BEAN_DATA_NAME')); @@ -231,8 +249,6 @@ export class UIExcel { header.push(this.translate.instant('EXCEL.BEAN.ID')); header.push(this.translate.instant('ARCHIVED')); - - const wsData: any[][] = [header]; let maxSortRepeats: number = 1; for (const bean of this.uiBeanStorage.getAllEntries()) { @@ -252,12 +268,14 @@ export class UIExcel { bean.url, bean.ean_article_number, bean.note, - this.uiHelper.formateDate(bean.config.unix_timestamp, 'DD.MM.YYYY HH:mm:ss'), + this.uiHelper.formateDate( + bean.config.unix_timestamp, + 'DD.MM.YYYY HH:mm:ss' + ), bean.config.uuid, - bean.finished + bean.finished, ]; - if (maxSortRepeats < bean.bean_information.length) { maxSortRepeats = bean.bean_information.length; } @@ -277,27 +295,31 @@ export class UIExcel { wsData.push(entry); } - for (let i=0; i < maxSortRepeats; i++) { - header.push((i+1) + '. ' + this.translate.instant('BEAN_DATA_COUNTRY')); - header.push((i+1) + '. ' + this.translate.instant('BEAN_DATA_REGION')); - header.push((i+1) + '. ' + this.translate.instant('BEAN_DATA_FARM')); - header.push((i+1) + '. ' + this.translate.instant('BEAN_DATA_FARMER')); - header.push((i+1) + '. ' + this.translate.instant('BEAN_DATA_ELEVATION')); - header.push((i+1) + '. ' + this.translate.instant('BEAN_DATA_VARIETY')); - header.push((i+1) + '. ' + this.translate.instant('BEAN_DATA_PROCESSING')); - header.push((i+1) + '. ' + this.translate.instant('BEAN_DATA_HARVEST_TIME')); - header.push((i+1) + '. ' + this.translate.instant('BEAN_DATA_PERCENTAGE')); - header.push((i+1) + '. ' + this.translate.instant('BEAN_DATA_CERTIFICATION')); + for (let i = 0; i < maxSortRepeats; i++) { + header.push(i + 1 + '. ' + this.translate.instant('BEAN_DATA_COUNTRY')); + header.push(i + 1 + '. ' + this.translate.instant('BEAN_DATA_REGION')); + header.push(i + 1 + '. ' + this.translate.instant('BEAN_DATA_FARM')); + header.push(i + 1 + '. ' + this.translate.instant('BEAN_DATA_FARMER')); + header.push(i + 1 + '. ' + this.translate.instant('BEAN_DATA_ELEVATION')); + header.push(i + 1 + '. ' + this.translate.instant('BEAN_DATA_VARIETY')); + header.push( + i + 1 + '. ' + this.translate.instant('BEAN_DATA_PROCESSING') + ); + header.push( + i + 1 + '. ' + this.translate.instant('BEAN_DATA_HARVEST_TIME') + ); + header.push( + i + 1 + '. ' + this.translate.instant('BEAN_DATA_PERCENTAGE') + ); + header.push( + i + 1 + '. ' + this.translate.instant('BEAN_DATA_CERTIFICATION') + ); } const ws: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(wsData); XLSX.utils.book_append_sheet(_wb, ws, this.translate.instant('NAV_BEANS')); - } - - private exportBrews(_wb: XLSX.WorkBook) - { - + private exportBrews(_wb: XLSX.WorkBook) { const header: Array = []; header.push(this.translate.instant('BREW_DATA_GRIND_SIZE')); @@ -321,7 +343,9 @@ export class UIExcel { header.push(this.translate.instant('BREW_DATA_NOTES')); header.push(this.translate.instant('BREW_DATA_BREW_BEVERAGE_QUANTITY')); header.push(this.translate.instant('BREW_DATA_TDS')); - header.push(this.translate.instant('BREW_DATA_CALCULATED_EXTRACTION_YIELD')); + header.push( + this.translate.instant('BREW_DATA_CALCULATED_EXTRACTION_YIELD') + ); header.push(this.translate.instant('BREW_CREATION_DATE')); header.push(this.translate.instant('BREW_INFORMATION_BREW_RATIO')); header.push(this.translate.instant('BREW_INFORMATION_BEAN_AGE')); @@ -330,13 +354,24 @@ export class UIExcel { header.push(this.translate.instant('EXCEL.PREPARATION.ID')); header.push(this.translate.instant('EXCEL.GRINDER.ID')); + const millisecondsEnabled: boolean = + this.uiSettingsStorage.getSettings().brew_milliseconds; const wsData: any[][] = [header]; for (const brew of this.uiBrewStorage.getAllEntries()) { - - + let brewTime: string = String(brew.brew_time); + let bloomingTime: string = String(brew.coffee_blooming_time); + let dripTime: string = String(brew.coffee_first_drip_time); + let temperatureTime: string = String(brew.brew_temperature_time); + if (millisecondsEnabled) { + brewTime = brewTime + ',' + brew.brew_time_milliseconds; + bloomingTime = + bloomingTime + ',' + brew.coffee_blooming_time_milliseconds; + dripTime = dripTime + ',' + brew.coffee_first_drip_time_milliseconds; + temperatureTime = + temperatureTime + ',' + brew.brew_temperature_time_milliseconds; + } const entry: Array = [ - brew.grind_size, brew.grind_weight, brew.brew_temperature, @@ -346,12 +381,19 @@ export class UIExcel { brew.mill_speed, brew.mill_timer, brew.pressure_profile, - brew.getPreparation().tools.filter((e)=> brew.method_of_preparation_tools.includes(e.config.uuid) === true).map((e) => e.name).join(','), - brew.brew_temperature_time, - brew.brew_time, - brew.coffee_blooming_time, - brew.coffee_first_drip_time, - brew.brew_quantity , + brew + .getPreparation() + .tools.filter( + (e) => + brew.method_of_preparation_tools.includes(e.config.uuid) === true + ) + .map((e) => e.name) + .join(','), + temperatureTime, + brewTime, + bloomingTime, + dripTime, + brew.brew_quantity, brew.coffee_type, brew.coffee_concentration, brew.rating, @@ -359,53 +401,62 @@ export class UIExcel { brew.brew_beverage_quantity, brew.tds, brew.getExtractionYield(), - this.uiHelper.formateDate(brew.config.unix_timestamp, 'DD.MM.YYYY HH:mm:ss'), + this.uiHelper.formateDate( + brew.config.unix_timestamp, + 'DD.MM.YYYY HH:mm:ss' + ), brew.getBrewRatio(), brew.getCalculatedBeanAge(), brew.getBean().finished, brew.getBean().config.uuid, brew.getPreparation().config.uuid, - brew.getMill().config.uuid + brew.getMill().config.uuid, ]; wsData.push(entry); } const ws: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(wsData); - XLSX.utils.book_append_sheet(_wb, ws, this.translate.instant('NAV_BREWS')); + XLSX.utils.book_append_sheet(_wb, ws, this.translate.instant('NAV_BREWS')); } public async exportBrewFlowProfile(_flow: BrewFlow) { await this.uiAlert.showLoadingSpinner(); const wb: XLSX.WorkBook = this.generateBrewFlowProfileRaw(_flow); - - - const filename: string = 'Beanconqueror_Flowprofile_Raw_' + moment().format('HH_mm_ss_DD_MM_YYYY').toString() + '.xlsx'; + const filename: string = + 'Beanconqueror_Flowprofile_Raw_' + + moment().format('HH_mm_ss_DD_MM_YYYY').toString() + + '.xlsx'; try { /* generate Blob */ - const wbout: ArrayBuffer = XLSX.write(wb, { bookType: 'xlsx', type: 'array' }); - const blob: Blob = new Blob([wbout], {type: 'application/octet-stream'}); + const wbout: ArrayBuffer = XLSX.write(wb, { + bookType: 'xlsx', + type: 'array', + }); + const blob: Blob = new Blob([wbout], { + type: 'application/octet-stream', + }); try { - const downloadFile: FileEntry = await this.uiFileHelper.downloadFile(filename,blob); + const downloadFile: FileEntry = await this.uiFileHelper.downloadFile( + filename, + blob + ); await this.uiAlert.hideLoadingSpinner(); if (this.platform.is('android')) { - const alert = await this.alertCtrl.create({ + const alert = await this.alertCtrl.create({ header: this.translate.instant('DOWNLOADED'), - subHeader: this.translate.instant('FILE_DOWNLOADED_SUCCESSFULLY', {fileName: filename}), - buttons: ['OK'] + subHeader: this.translate.instant('FILE_DOWNLOADED_SUCCESSFULLY', { + fileName: filename, + }), + buttons: ['OK'], }); await alert.present(); } - - } catch (ex) { - - } - - } catch(e) { - if(e.message.match(/It was determined/)) { + } catch (ex) {} + } catch (e) { + if (e.message.match(/It was determined/)) { /* in the browser, use writeFile */ XLSX.writeFile(wb, filename); - } - else { + } else { this.uiAlert.showMessage(e.message); this.uiLog.log(`Excel export - Error occured: ${e.message}`); } @@ -418,42 +469,46 @@ export class UIExcel { await this.uiAlert.showLoadingSpinner(); const wb: XLSX.WorkBook = this.write(); - - const dateTimeStr: string = this.uiHelper.formateDate(new Date().getTime() / 1000, 'DD_MM_YYYY_HH_mm_ss'); + const dateTimeStr: string = this.uiHelper.formateDate( + new Date().getTime() / 1000, + 'DD_MM_YYYY_HH_mm_ss' + ); const filename: string = 'Beanconqueror_export_' + dateTimeStr + '.xlsx'; try { /* generate Blob */ - const wbout: ArrayBuffer = XLSX.write(wb, { bookType: 'xlsx', type: 'array' }); - const blob: Blob = new Blob([wbout], {type: 'application/octet-stream'}); + const wbout: ArrayBuffer = XLSX.write(wb, { + bookType: 'xlsx', + type: 'array', + }); + const blob: Blob = new Blob([wbout], { + type: 'application/octet-stream', + }); try { - const downloadFile: FileEntry = await this.uiFileHelper.downloadFile(filename,blob); + const downloadFile: FileEntry = await this.uiFileHelper.downloadFile( + filename, + blob + ); await this.uiAlert.hideLoadingSpinner(); if (this.platform.is('android')) { - const alert = await this.alertCtrl.create({ + const alert = await this.alertCtrl.create({ header: this.translate.instant('DOWNLOADED'), - subHeader: this.translate.instant('FILE_DOWNLOADED_SUCCESSFULLY', {fileName: filename}), - buttons: ['OK'] + subHeader: this.translate.instant('FILE_DOWNLOADED_SUCCESSFULLY', { + fileName: filename, + }), + buttons: ['OK'], }); await alert.present(); } - - } catch (ex) { - - } - - } catch(e) { - if(e.message.match(/It was determined/)) { + } catch (ex) {} + } catch (e) { + if (e.message.match(/It was determined/)) { /* in the browser, use writeFile */ XLSX.writeFile(wb, filename); - } - else { + } else { this.uiAlert.showMessage(e.message); this.uiLog.log(`Excel export - Error occured: ${e.message}`); } } await this.uiAlert.hideLoadingSpinner(); } - - - } From b97f0eb188722d8f0d96e9f33a02e0e6c12e573f Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Thu, 11 Aug 2022 15:44:53 +0200 Subject: [PATCH 51/78] #397 - Rate beans like brews #399 - fix typos --- .../bean-archive-popover.component.html | 7 +- .../bean-archive-popover.component.ts | 56 ++- .../bean-filter/bean-filter.component.html | 2 +- .../bean-filter/bean-filter.component.ts | 106 ++-- src/app/beans/beans.page.html | 4 +- src/app/beans/beans.page.ts | 463 ++++++++++-------- src/app/brew/brew.page.html | 4 +- src/app/brew/brew.page.ts | 231 +++++---- src/app/settings/settings.page.html | 36 +- src/app/settings/settings.page.ts | 5 + src/assets/i18n/de.json | 6 +- src/assets/i18n/en.json | 6 +- src/assets/i18n/es.json | 6 +- src/assets/i18n/tr.json | 6 +- src/assets/i18n/zh.json | 6 +- src/classes/settings/settings.ts | 7 +- .../bean-information.component.html | 57 ++- .../bean-information.component.ts | 275 ++++++----- .../bean-general-information.component.html | 6 +- .../bean-general-information.component.ts | 15 +- ...reparation-information-card.component.html | 2 +- src/interfaces/settings/iSettings.ts | 2 + 22 files changed, 793 insertions(+), 515 deletions(-) diff --git a/src/app/beans/bean-archive-popover/bean-archive-popover.component.html b/src/app/beans/bean-archive-popover/bean-archive-popover.component.html index a326a7806..c4524e648 100644 --- a/src/app/beans/bean-archive-popover/bean-archive-popover.component.html +++ b/src/app/beans/bean-archive-popover/bean-archive-popover.component.html @@ -9,13 +9,14 @@

{{data.name}}

{{"BREW_DATA_RATING" | translate }} {{data.rating}} + style="vertical-align: top;">{{this.uiHelper.toFixedIfNecessary(data.rating,2)}} - + -
+
+ diff --git a/src/app/beans/bean-archive-popover/bean-archive-popover.component.ts b/src/app/beans/bean-archive-popover/bean-archive-popover.component.ts index b03812720..37616eb42 100644 --- a/src/app/beans/bean-archive-popover/bean-archive-popover.component.ts +++ b/src/app/beans/bean-archive-popover/bean-archive-popover.component.ts @@ -1,10 +1,13 @@ -import {Component, Input, OnInit, ViewChild} from '@angular/core'; -import {IBean} from '../../../interfaces/bean/iBean'; -import {Bean} from '../../../classes/bean/bean'; -import {UIBeanStorage} from '../../../services/uiBeanStorage'; -import {ModalController} from '@ionic/angular'; -import {UIToast} from '../../../services/uiToast'; -import {NgxStarsComponent} from 'ngx-stars'; +import { Component, Input, OnInit, ViewChild } from '@angular/core'; +import { IBean } from '../../../interfaces/bean/iBean'; +import { Bean } from '../../../classes/bean/bean'; +import { UIBeanStorage } from '../../../services/uiBeanStorage'; +import { ModalController } from '@ionic/angular'; +import { UIToast } from '../../../services/uiToast'; +import { NgxStarsComponent } from 'ngx-stars'; +import { Settings } from '../../../classes/settings/settings'; +import { UISettingsStorage } from '../../../services/uiSettingsStorage'; +import { UIHelper } from '../../../services/uiHelper'; @Component({ selector: 'app-bean-archive-popover', @@ -14,27 +17,31 @@ import {NgxStarsComponent} from 'ngx-stars'; export class BeanArchivePopoverComponent implements OnInit { public static COMPONENT_ID = 'bean-archive-popover'; @Input() public bean: IBean; - @ViewChild('beanRating', {read: NgxStarsComponent, static: false}) public beanRating: NgxStarsComponent; + @ViewChild('beanRating', { read: NgxStarsComponent, static: false }) + public beanRating: NgxStarsComponent; public data: Bean = new Bean(); - - constructor(private readonly uiBeanStorage: UIBeanStorage, - private readonly modalController: ModalController, - private readonly uiToast: UIToast) { } - - public ngOnInit() { - + public maxBeanRating: number = 5; + public settings: Settings = undefined; + constructor( + private readonly uiBeanStorage: UIBeanStorage, + private readonly modalController: ModalController, + private readonly uiToast: UIToast, + private readonly uiSettingsStorage: UISettingsStorage, + private readonly uiHelper: UIHelper + ) { + this.settings = this.uiSettingsStorage.getSettings(); + this.maxBeanRating = this.settings.bean_rating; } - public ionViewWillEnter(): void { - + public ngOnInit() {} + public ionViewWillEnter(): void { if (this.bean !== undefined) { this.data.initializeByObject(this.bean); if (this.data.rating > 0) { this.changedRating(); } } - } public async archive() { @@ -45,14 +52,17 @@ export class BeanArchivePopoverComponent implements OnInit { } public dismiss(): void { - this.modalController.dismiss({ - dismissed: true - }, undefined, BeanArchivePopoverComponent.COMPONENT_ID); + this.modalController.dismiss( + { + dismissed: true, + }, + undefined, + BeanArchivePopoverComponent.COMPONENT_ID + ); } public changedRating() { - if (typeof(this.beanRating) !== 'undefined') { + if (typeof this.beanRating !== 'undefined') { this.beanRating.setRating(this.data.rating); } } - } diff --git a/src/app/beans/bean-filter/bean-filter.component.html b/src/app/beans/bean-filter/bean-filter.component.html index 49bdf763c..47d1e299b 100644 --- a/src/app/beans/bean-filter/bean-filter.component.html +++ b/src/app/beans/bean-filter/bean-filter.component.html @@ -47,7 +47,7 @@ {{"BREW_DATA_RATING" | translate }} {{filter.rating.lower}} - {{filter.rating.upper}} - + diff --git a/src/app/beans/bean-filter/bean-filter.component.ts b/src/app/beans/bean-filter/bean-filter.component.ts index ec08aa79f..8cf7e9f8e 100644 --- a/src/app/beans/bean-filter/bean-filter.component.ts +++ b/src/app/beans/bean-filter/bean-filter.component.ts @@ -1,17 +1,18 @@ import { Component, OnInit } from '@angular/core'; -import {Settings} from '../../../classes/settings/settings'; -import {Preparation} from '../../../classes/preparation/preparation'; -import {Bean} from '../../../classes/bean/bean'; -import {Mill} from '../../../classes/mill/mill'; -import {ModalController, NavParams} from '@ionic/angular'; -import {UIBrewHelper} from '../../../services/uiBrewHelper'; -import {UIHelper} from '../../../services/uiHelper'; -import {UISettingsStorage} from '../../../services/uiSettingsStorage'; -import {UIPreparationStorage} from '../../../services/uiPreparationStorage'; -import {UIBeanStorage} from '../../../services/uiBeanStorage'; -import {UIMillStorage} from '../../../services/uiMillStorage'; -import {IBeanPageFilter} from '../../../interfaces/bean/iBeanPageFilter'; -import {BEAN_ROASTING_TYPE_ENUM} from '../../../enums/beans/beanRoastingType'; +import { Settings } from '../../../classes/settings/settings'; +import { Preparation } from '../../../classes/preparation/preparation'; +import { Bean } from '../../../classes/bean/bean'; +import { Mill } from '../../../classes/mill/mill'; +import { ModalController, NavParams } from '@ionic/angular'; +import { UIBrewHelper } from '../../../services/uiBrewHelper'; +import { UIHelper } from '../../../services/uiHelper'; +import { UISettingsStorage } from '../../../services/uiSettingsStorage'; +import { UIPreparationStorage } from '../../../services/uiPreparationStorage'; +import { UIBeanStorage } from '../../../services/uiBeanStorage'; +import { UIMillStorage } from '../../../services/uiMillStorage'; +import { IBeanPageFilter } from '../../../interfaces/bean/iBeanPageFilter'; +import { BEAN_ROASTING_TYPE_ENUM } from '../../../enums/beans/beanRoastingType'; +import { Brew } from '../../../classes/brew/brew'; @Component({ selector: 'app-bean-filter', @@ -19,7 +20,6 @@ import {BEAN_ROASTING_TYPE_ENUM} from '../../../enums/beans/beanRoastingType'; styleUrls: ['./bean-filter.component.scss'], }) export class BeanFilterComponent implements OnInit { - public static COMPONENT_ID = 'bean-filter'; public settings: Settings; @@ -33,20 +33,23 @@ export class BeanFilterComponent implements OnInit { public roasteries: Array = undefined; - constructor(private readonly modalController: ModalController, - private readonly uiBrewHelper: UIBrewHelper, - private readonly navParams: NavParams, - private readonly uiHelper: UIHelper, - private readonly uiSettingsStorage: UISettingsStorage, - private readonly uiPreparationStorage: UIPreparationStorage, - private readonly uiBeanStorage: UIBeanStorage, - private readonly uiMillStorage: UIMillStorage) { - + constructor( + private readonly modalController: ModalController, + private readonly uiBrewHelper: UIBrewHelper, + private readonly navParams: NavParams, + private readonly uiHelper: UIHelper, + private readonly uiSettingsStorage: UISettingsStorage, + private readonly uiPreparationStorage: UIPreparationStorage, + private readonly uiBeanStorage: UIBeanStorage, + private readonly uiMillStorage: UIMillStorage + ) { this.settings = this.uiSettingsStorage.getSettings(); this.filter = this.settings.GET_BEAN_FILTER(); const beans: Array = this.uiBeanStorage.getAllEntries(); this.roasteries = [...new Set(beans.map((e: Bean) => e.roaster))]; - this.roasteries = this.roasteries.filter((name: string)=> name !== '').sort( (a,b) => { + this.roasteries = this.roasteries + .filter((name: string) => name !== '') + .sort((a, b) => { const nameA = a.toUpperCase(); const nameB = b.toUpperCase(); @@ -58,53 +61,80 @@ export class BeanFilterComponent implements OnInit { } return 0; - } - ); + }); } public ngOnInit() { - this.segment = this.navParams.get('segment'); this.filter = this.uiHelper.copyData(this.navParams.get('bean_filter')); this.__reloadFilterSettings(); } + public getMaxBeanRating() { + const maxSettingsRating = this.settings.bean_rating; + const isOpen = this.segment === 'open'; + let beansFiltered: Array = []; + + beansFiltered = this.uiBeanStorage + .getAllEntries() + .filter((e) => e.finished === !isOpen); + + let maxBeanRating = maxSettingsRating; + if (beansFiltered.length > 0) { + const maxRating = beansFiltered.reduce((p, c) => + p.rating > c.rating ? p : c + ); + maxBeanRating = maxRating.rating; + } + + if (maxBeanRating > maxSettingsRating) { + return maxBeanRating; + } + return maxSettingsRating; + } public dismiss(): void { this.modalController.dismiss({ - bean_filter: undefined + bean_filter: undefined, }); } public useFilter() { this.modalController.dismiss({ - bean_filter: this.uiHelper.copyData(this.filter) + bean_filter: this.uiHelper.copyData(this.filter), }); } public resetFilter() { this.filter = this.settings.GET_BEAN_FILTER(); - this.modalController.dismiss({ - bean_filter: this.uiHelper.copyData(this.filter) - },undefined,BeanFilterComponent.COMPONENT_ID); + this.modalController.dismiss( + { + bean_filter: this.uiHelper.copyData(this.filter), + }, + undefined, + BeanFilterComponent.COMPONENT_ID + ); } - private __reloadFilterSettings() { - this.method_of_preparations = this.uiPreparationStorage.getAllEntries() + this.method_of_preparations = this.uiPreparationStorage + .getAllEntries() .sort((a, b) => a.name.localeCompare(b.name)); - this.beans = this.uiBeanStorage.getAllEntries() + this.beans = this.uiBeanStorage + .getAllEntries() .sort((a, b) => a.name.localeCompare(b.name)); - this.mills = this.uiMillStorage.getAllEntries() + this.mills = this.uiMillStorage + .getAllEntries() .sort((a, b) => a.name.localeCompare(b.name)); if (this.segment === 'open') { this.beans = this.beans.filter((e) => e.finished === false); this.mills = this.mills.filter((e) => e.finished === false); - this.method_of_preparations = this.method_of_preparations.filter((e) => e.finished === false); + this.method_of_preparations = this.method_of_preparations.filter( + (e) => e.finished === false + ); } else { this.beans = this.beans.filter((e) => e.finished === true); } } - } diff --git a/src/app/beans/beans.page.html b/src/app/beans/beans.page.html index b76f3fc1a..6a533bc44 100644 --- a/src/app/beans/beans.page.html +++ b/src/app/beans/beans.page.html @@ -31,7 +31,7 @@
-
+
@@ -66,7 +66,7 @@
-
+
diff --git a/src/app/beans/beans.page.ts b/src/app/beans/beans.page.ts index 8c004d05e..d8ea0ce17 100644 --- a/src/app/beans/beans.page.ts +++ b/src/app/beans/beans.page.ts @@ -1,83 +1,97 @@ -import {ChangeDetectorRef, Component, ElementRef, HostListener, OnInit, ViewChild} from '@angular/core'; -import {UIAlert} from '../../services/uiAlert'; -import {UIBeanStorage} from '../../services/uiBeanStorage'; -import {ActionSheetController, ModalController, Platform} from '@ionic/angular'; -import {UIBrewStorage} from '../../services/uiBrewStorage'; -import {Bean} from '../../classes/bean/bean'; -import {UISettingsStorage} from '../../services/uiSettingsStorage'; -import {Settings} from '../../classes/settings/settings'; -import {BEAN_ACTION} from '../../enums/beans/beanAction'; -import {BeanSortComponent} from './bean-sort/bean-sort.component'; -import {IBeanPageSort} from '../../interfaces/bean/iBeanPageSort'; -import {BEAN_SORT_AFTER} from '../../enums/beans/beanSortAfter'; -import {BEAN_SORT_ORDER} from '../../enums/beans/beanSortOrder'; -import {AgVirtualSrollComponent} from 'ag-virtual-scroll'; -import {UIAnalytics} from '../../services/uiAnalytics'; -import {TranslateService} from '@ngx-translate/core'; -import {QrScannerService} from '../../services/qrScanner/qr-scanner.service'; -import {IntentHandlerService} from '../../services/intentHandler/intent-handler.service'; -import {UIBeanHelper} from '../../services/uiBeanHelper'; -import {IBeanPageFilter} from '../../interfaces/bean/iBeanPageFilter'; -import {BeanFilterComponent} from './bean-filter/bean-filter.component'; +import { + ChangeDetectorRef, + Component, + ElementRef, + HostListener, + OnInit, + ViewChild, +} from '@angular/core'; +import { UIAlert } from '../../services/uiAlert'; +import { UIBeanStorage } from '../../services/uiBeanStorage'; +import { + ActionSheetController, + ModalController, + Platform, +} from '@ionic/angular'; +import { UIBrewStorage } from '../../services/uiBrewStorage'; +import { Bean } from '../../classes/bean/bean'; +import { UISettingsStorage } from '../../services/uiSettingsStorage'; +import { Settings } from '../../classes/settings/settings'; +import { BEAN_ACTION } from '../../enums/beans/beanAction'; +import { BeanSortComponent } from './bean-sort/bean-sort.component'; +import { IBeanPageSort } from '../../interfaces/bean/iBeanPageSort'; +import { BEAN_SORT_AFTER } from '../../enums/beans/beanSortAfter'; +import { BEAN_SORT_ORDER } from '../../enums/beans/beanSortOrder'; +import { AgVirtualSrollComponent } from 'ag-virtual-scroll'; +import { UIAnalytics } from '../../services/uiAnalytics'; +import { TranslateService } from '@ngx-translate/core'; +import { QrScannerService } from '../../services/qrScanner/qr-scanner.service'; +import { IntentHandlerService } from '../../services/intentHandler/intent-handler.service'; +import { UIBeanHelper } from '../../services/uiBeanHelper'; +import { IBeanPageFilter } from '../../interfaces/bean/iBeanPageFilter'; +import { BeanFilterComponent } from './bean-filter/bean-filter.component'; import moment from 'moment'; import * as _ from 'lodash'; import BEAN_TRACKING from '../../data/tracking/beanTracking'; -import {BeanPopoverAddComponent} from './bean-popover-add/bean-popover-add.component'; -import {BEAN_POPOVER_ADD_ACTION} from '../../enums/beans/beanPopoverAddAction'; +import { BeanPopoverAddComponent } from './bean-popover-add/bean-popover-add.component'; +import { BEAN_POPOVER_ADD_ACTION } from '../../enums/beans/beanPopoverAddAction'; + @Component({ selector: 'beans', templateUrl: './beans.page.html', styleUrls: ['./beans.page.scss'], }) export class BeansPage implements OnInit { - public beans: Array = []; - public settings: Settings; public openBeans: Array = []; public finishedBeans: Array = []; public openBeansSort: IBeanPageSort = { - sort_after: BEAN_SORT_AFTER.UNKOWN, + sort_after: BEAN_SORT_AFTER.UNKOWN, sort_order: BEAN_SORT_ORDER.UNKOWN, }; - @ViewChild('openScroll', {read: AgVirtualSrollComponent, static: false}) public openScroll: AgVirtualSrollComponent; - @ViewChild('archivedScroll', {read: AgVirtualSrollComponent, static: false}) public archivedScroll: AgVirtualSrollComponent; - @ViewChild('beanContent',{read: ElementRef}) public beanContent: ElementRef; + @ViewChild('openScroll', { read: AgVirtualSrollComponent, static: false }) + public openScroll: AgVirtualSrollComponent; + @ViewChild('archivedScroll', { + read: AgVirtualSrollComponent, + static: false, + }) + public archivedScroll: AgVirtualSrollComponent; + @ViewChild('beanContent', { read: ElementRef }) + public beanContent: ElementRef; public bean_segment: string = 'open'; public archivedBeansSort: IBeanPageSort = { - sort_after: BEAN_SORT_AFTER.UNKOWN, + sort_after: BEAN_SORT_AFTER.UNKOWN, sort_order: BEAN_SORT_ORDER.UNKOWN, }; public archivedBeansFilterText: string = ''; public openBeansFilterText: string = ''; - public archivedBeansFilter: IBeanPageFilter; public openBeansFilter: IBeanPageFilter; - constructor(private readonly modalCtrl: ModalController, - private readonly changeDetectorRef: ChangeDetectorRef, - private readonly uiBeanStorage: UIBeanStorage, - private readonly uiAlert: UIAlert, - private readonly uiBrewStorage: UIBrewStorage, - private readonly uiSettingsStorage: UISettingsStorage, - private readonly uiAnalytics: UIAnalytics, - private readonly translate: TranslateService, - private readonly actionSheetController: ActionSheetController, - private readonly qrScannerService: QrScannerService, - private readonly intenthandler: IntentHandlerService, - private readonly uiBeanHelper: UIBeanHelper, - private readonly platform: Platform, - private readonly modalController: ModalController) { - - - } + constructor( + private readonly modalCtrl: ModalController, + private readonly changeDetectorRef: ChangeDetectorRef, + private readonly uiBeanStorage: UIBeanStorage, + private readonly uiAlert: UIAlert, + private readonly uiBrewStorage: UIBrewStorage, + private readonly uiSettingsStorage: UISettingsStorage, + private readonly uiAnalytics: UIAnalytics, + private readonly translate: TranslateService, + private readonly actionSheetController: ActionSheetController, + private readonly qrScannerService: QrScannerService, + private readonly intenthandler: IntentHandlerService, + private readonly uiBeanHelper: UIBeanHelper, + private readonly platform: Platform, + private readonly modalController: ModalController + ) {} public ionViewWillEnter(): void { this.settings = this.uiSettingsStorage.getSettings(); @@ -89,9 +103,7 @@ export class BeansPage implements OnInit { this.loadBeans(); } - public loadBeans(): void { - this.__initializeBeans(); this.changeDetectorRef.detectChanges(); this.retriggerScroll(); @@ -100,6 +112,7 @@ export class BeansPage implements OnInit { public segmentChanged() { this.retriggerScroll(); } + public async beanAction(action: BEAN_ACTION, bean: Bean): Promise { this.loadBeans(); } @@ -109,71 +122,54 @@ export class BeansPage implements OnInit { public onOrientationChange(event) { this.retriggerScroll(); } - private retriggerScroll() { - - setTimeout(async () =>{ - - const el = this.beanContent.nativeElement; - let scrollComponent: AgVirtualSrollComponent; - if (this.openScroll !== undefined) { - scrollComponent = this.openScroll; - } else { - scrollComponent = this.archivedScroll; - } - - scrollComponent.el.style.height = (el.offsetHeight - scrollComponent.el.offsetTop) + 'px'; - },250); - - } public async showSort() { let beanSort: IBeanPageSort; if (this.bean_segment === 'open') { - beanSort = {...this.openBeansSort}; + beanSort = { ...this.openBeansSort }; } else { - beanSort = {...this.archivedBeansSort}; + beanSort = { ...this.archivedBeansSort }; } const modal = await this.modalCtrl.create({ component: BeanSortComponent, - componentProps: - {bean_sort: beanSort, segment: this.bean_segment}, + componentProps: { bean_sort: beanSort, segment: this.bean_segment }, id: BeanSortComponent.COMPONENT_ID, cssClass: 'popover-actions', - breakpoints: [0, 0.75, 1], + breakpoints: [0, 0.75, 1], initialBreakpoint: 1, }); await modal.present(); const modalData = await modal.onWillDismiss(); - if (modalData !== undefined && modalData.data && modalData.data.bean_sort !== undefined) { + if ( + modalData !== undefined && + modalData.data && + modalData.data.bean_sort !== undefined + ) { if (this.bean_segment === 'open') { this.openBeansSort = modalData.data.bean_sort; - } else { this.archivedBeansSort = modalData.data.bean_sort; } } await this.__saveBeanFilter(); - this.loadBeans(); } - public async showFilter() { let beanFilter: IBeanPageFilter; if (this.bean_segment === 'open') { - beanFilter = {...this.openBeansFilter}; + beanFilter = { ...this.openBeansFilter }; } else { - beanFilter = {...this.archivedBeansFilter}; + beanFilter = { ...this.archivedBeansFilter }; } const modal = await this.modalCtrl.create({ component: BeanFilterComponent, cssClass: 'popover-actions', id: BeanFilterComponent.COMPONENT_ID, - componentProps: - {bean_filter: beanFilter, segment: this.bean_segment}, + componentProps: { bean_filter: beanFilter, segment: this.bean_segment }, breakpoints: [0, 0.75, 1], initialBreakpoint: 1, }); @@ -182,25 +178,26 @@ export class BeansPage implements OnInit { if (modalData !== undefined && modalData.data.bean_filter !== undefined) { if (this.bean_segment === 'open') { this.openBeansFilter = modalData.data.bean_filter; - } else { this.archivedBeansFilter = modalData.data.bean_filter; } } await this.__saveBeanFilter(); - this.loadBeans(); } - public isSortActive(): boolean { if (this.bean_segment === 'open') { - return (this.openBeansSort.sort_order !== BEAN_SORT_ORDER.UNKOWN && - this.openBeansSort.sort_after !== BEAN_SORT_AFTER.UNKOWN); + return ( + this.openBeansSort.sort_order !== BEAN_SORT_ORDER.UNKOWN && + this.openBeansSort.sort_after !== BEAN_SORT_AFTER.UNKOWN + ); } else { - return (this.archivedBeansSort.sort_order !== BEAN_SORT_ORDER.UNKOWN && - this.archivedBeansSort.sort_after !== BEAN_SORT_AFTER.UNKOWN); + return ( + this.archivedBeansSort.sort_order !== BEAN_SORT_ORDER.UNKOWN && + this.archivedBeansSort.sort_after !== BEAN_SORT_AFTER.UNKOWN + ); } } @@ -214,23 +211,130 @@ export class BeansPage implements OnInit { public isFilterActive(): boolean { let isFilterActive: boolean = false; - if (this.settings) { - if (this.bean_segment === 'open') { - isFilterActive = !(_.isEqual( this.settings.GET_BEAN_FILTER(),this.openBeansFilter)); - } else { - isFilterActive = !(_.isEqual( this.settings.GET_BEAN_FILTER(),this.archivedBeansFilter)); - } + if (this.settings) { + let checkingFilter: IBeanPageFilter; + if (this.bean_segment === 'open') { + checkingFilter = this.openBeansFilter; + } else { + checkingFilter = this.archivedBeansFilter; + } + isFilterActive = !_.isEqual( + this.settings?.GET_BEAN_FILTER(), + checkingFilter + ); + /** let didRatingFilterChanged: boolean = false; + if (isFilterActive === false && checkingFilter.rating) { + didRatingFilterChanged = (checkingFilter.rating.upper !== this.settings?.bean_rating || checkingFilter.rating.lower !== -1); + } + if (didRatingFilterChanged === true) { + isFilterActive = true; + } **/ + } + return isFilterActive; + } + public shallBarBeDisplayed() { + let shallBarDisplayed: boolean = false; + if (this.settings) { + const isOpenSegment = this.bean_segment === 'open'; + let checkingEntries: Array = []; + if (isOpenSegment) { + checkingEntries = this.openBeans; + } else { + checkingEntries = this.finishedBeans; + } + if (checkingEntries.length <= 0) { + const entriesExisting = this.uiBeanStorage + .getAllEntries() + .filter((e) => e.finished !== isOpenSegment).length; + if (entriesExisting > 0) { + shallBarDisplayed = true; + } + } } - return isFilterActive; + + return shallBarDisplayed; } public research() { this.__initializeBeansView(this.bean_segment); } + public ngOnInit() {} + + public async add() { + await this.uiBeanHelper.addBean(); + this.loadBeans(); + } + + public async beanPopover() { + this.uiAnalytics.trackEvent( + BEAN_TRACKING.TITLE, + BEAN_TRACKING.ACTIONS.POPOVER_ACTIONS + ); + const popover = await this.modalController.create({ + component: BeanPopoverAddComponent, + componentProps: {}, + id: BeanPopoverAddComponent.COMPONENT_ID, + cssClass: 'popover-actions', + breakpoints: [0, 0.25, 0.5], + initialBreakpoint: 0.25, + }); + await popover.present(); + const data = await popover.onWillDismiss(); + if (data.role !== undefined) { + switch (data.role as BEAN_POPOVER_ADD_ACTION) { + case BEAN_POPOVER_ADD_ACTION.ADD: + await this.add(); + break; + case BEAN_POPOVER_ADD_ACTION.SCAN: + await this.scanBean(); + break; + } + } + } + + public async scanBean() { + if (this.platform.is('cordova')) { + await this.qrScannerService.scan().then( + async (scannedCode) => { + await this.intenthandler.handleQRCodeLink(scannedCode); + }, + () => {} + ); + } else { + // Test sample for development + //await this.intenthandler.handleQRCodeLink('https://beanconqueror.com/?qr=7b761a95'); + } + this.loadBeans(); + return; + } + + public async longPressAdd(event) { + if (event) { + event.stopPropagation(); + event.stopImmediatePropagation(); + } + await this.add(); + } + + private retriggerScroll() { + setTimeout(async () => { + const el = this.beanContent.nativeElement; + let scrollComponent: AgVirtualSrollComponent; + if (this.openScroll !== undefined) { + scrollComponent = this.openScroll; + } else { + scrollComponent = this.archivedScroll; + } + + scrollComponent.el.style.height = + el.offsetHeight - scrollComponent.el.offsetTop + 'px'; + }, 250); + } + private async __saveBeanFilter() { const settings: Settings = this.uiSettingsStorage.getSettings(); settings.bean_sort.OPEN = this.openBeansSort; @@ -242,19 +346,17 @@ export class BeansPage implements OnInit { } private __initializeBeansView(_type: string) { -// sort latest to top. + // sort latest to top. const beansCopy: Array = [...this.beans]; - const isOpen: boolean = (_type === 'open'); + const isOpen: boolean = _type === 'open'; let sort: IBeanPageSort; let filterBeans: Array; if (isOpen) { sort = this.openBeansSort; - filterBeans = beansCopy.filter( - (bean) => !bean.finished); + filterBeans = beansCopy.filter((bean) => !bean.finished); } else { sort = this.archivedBeansSort; - filterBeans = beansCopy.filter( - (bean) => bean.finished); + filterBeans = beansCopy.filter((bean) => bean.finished); } let filter: IBeanPageFilter; @@ -265,51 +367,64 @@ export class BeansPage implements OnInit { } if (filter.favourite) { - filterBeans = filterBeans.filter((e)=>e.favourite === true); + filterBeans = filterBeans.filter((e) => e.favourite === true); } + console.log(filter); // Rating filter is always active - filterBeans = filterBeans.filter((e: Bean)=> e.rating>= filter.rating.lower && e.rating <=filter.rating.upper ); - + filterBeans = filterBeans.filter( + (e: Bean) => + e.rating >= filter.rating.lower && e.rating <= filter.rating.upper + ); if (filter.bean_roasting_type.length > 0) { - filterBeans = filterBeans.filter((e: Bean) => filter.bean_roasting_type.includes(e.bean_roasting_type) === true); + filterBeans = filterBeans.filter( + (e: Bean) => + filter.bean_roasting_type.includes(e.bean_roasting_type) === true + ); } if (filter.bean_roaster) { - filterBeans = filterBeans.filter((e: Bean) => filter.bean_roaster.includes(e.roaster) === true); + filterBeans = filterBeans.filter( + (e: Bean) => filter.bean_roaster.includes(e.roaster) === true + ); } if (filter.roastingDateStart) { - const roastingStart = moment(filter.roastingDateStart).startOf('day').toDate(); + const roastingStart = moment(filter.roastingDateStart) + .startOf('day') + .toDate(); filterBeans = filterBeans.filter((e: Bean) => { if (e.roastingDate === undefined || e.roastingDate === '') { return false; } const beanRoastingDate = moment(e.roastingDate).startOf('day').toDate(); - return beanRoastingDate >=roastingStart; + return beanRoastingDate >= roastingStart; }); } if (filter.roastingDateEnd) { - const roastingDateEnd = moment(filter.roastingDateEnd).startOf('day').toDate(); + const roastingDateEnd = moment(filter.roastingDateEnd) + .startOf('day') + .toDate(); filterBeans = filterBeans.filter((e: Bean) => { if (e.roastingDate === undefined || e.roastingDate === '') { return false; } const beanRoastingDate = moment(e.roastingDate).startOf('day').toDate(); - return beanRoastingDate <=roastingDateEnd; + return beanRoastingDate <= roastingDateEnd; }); } - // Skip if something is unkown, because no filter is active then - if (sort.sort_order !== BEAN_SORT_ORDER.UNKOWN && sort.sort_after !== BEAN_SORT_AFTER.UNKOWN){ - + if ( + sort.sort_order !== BEAN_SORT_ORDER.UNKOWN && + sort.sort_after !== BEAN_SORT_AFTER.UNKOWN + ) { switch (sort.sort_after) { case BEAN_SORT_AFTER.NAME: - filterBeans = filterBeans.sort( (a,b) => { + filterBeans = filterBeans.sort((a, b) => { const nameA = a.name.toUpperCase(); const nameB = b.name.toUpperCase(); @@ -321,11 +436,10 @@ export class BeansPage implements OnInit { } return 0; - } - ); + }); break; case BEAN_SORT_AFTER.ROASTER: - filterBeans = filterBeans.sort( (a,b) => { + filterBeans = filterBeans.sort((a, b) => { const roasterA = a.roaster.toUpperCase(); const roasterB = b.roaster.toUpperCase(); if (roasterA < roasterB) { @@ -336,39 +450,35 @@ export class BeansPage implements OnInit { } return 0; - } - ); + }); break; case BEAN_SORT_AFTER.ROASTING_DATE: - filterBeans = filterBeans.sort( (a,b) => { - if ( a.roastingDate > b.roastingDate ){ - return -1; - } - if ( a.roastingDate < b.roastingDate ){ - return 1; - } - return 0; + filterBeans = filterBeans.sort((a, b) => { + if (a.roastingDate > b.roastingDate) { + return -1; } - ); + if (a.roastingDate < b.roastingDate) { + return 1; + } + return 0; + }); break; case BEAN_SORT_AFTER.RATING: - filterBeans = filterBeans.sort( (a,b) => { - if ( a.rating > b.rating ){ - return -1; - } - if ( a.rating < b.rating ){ - return 1; - } - return 0; + filterBeans = filterBeans.sort((a, b) => { + if (a.rating > b.rating) { + return -1; } - ); + if (a.rating < b.rating) { + return 1; + } + return 0; + }); break; } if (sort.sort_order === BEAN_SORT_ORDER.DESCENDING) { filterBeans.reverse(); } - } let searchText: string = ''; if (isOpen) { @@ -378,25 +488,25 @@ export class BeansPage implements OnInit { } if (searchText) { - filterBeans = filterBeans.filter((e) => e.note?.toLowerCase().includes(searchText) || - e.name?.toLowerCase().includes(searchText) || - e.roaster?.toLowerCase().includes(searchText) || - e.aromatics?.toLowerCase().includes(searchText)); + filterBeans = filterBeans.filter( + (e) => + e.note?.toLowerCase().includes(searchText) || + e.name?.toLowerCase().includes(searchText) || + e.roaster?.toLowerCase().includes(searchText) || + e.aromatics?.toLowerCase().includes(searchText) + ); } if (isOpen) { - this.openBeans = filterBeans; + this.openBeans = filterBeans; } else { - this.finishedBeans = filterBeans; + this.finishedBeans = filterBeans; } this.retriggerScroll(); } - - public ngOnInit() { - } - private __initializeBeans(): void { - this.beans = this.uiBeanStorage.getAllEntries() + this.beans = this.uiBeanStorage + .getAllEntries() .sort((a, b) => a.name.localeCompare(b.name)); this.openBeans = []; @@ -404,63 +514,4 @@ export class BeansPage implements OnInit { this.__initializeBeansView('open'); this.__initializeBeansView('archiv'); } - - public async add() { - await this.uiBeanHelper.addBean(); - this.loadBeans(); - } - - - public async beanPopover() { - - this.uiAnalytics.trackEvent(BEAN_TRACKING.TITLE, BEAN_TRACKING.ACTIONS.POPOVER_ACTIONS); - const popover = await this.modalController.create({ - component: BeanPopoverAddComponent, - componentProps: {}, - id:BeanPopoverAddComponent.COMPONENT_ID, - cssClass: 'popover-actions', - breakpoints: [0, 0.25, 0.5], - initialBreakpoint: 0.25, - }); - await popover.present(); - const data = await popover.onWillDismiss(); - if (data.role !== undefined) { - switch (data.role as BEAN_POPOVER_ADD_ACTION) { - case BEAN_POPOVER_ADD_ACTION.ADD: - await this.add(); - break; - case BEAN_POPOVER_ADD_ACTION.SCAN: - await this.scanBean(); - break; - } - - } - - - } - - public async scanBean() { - - if (this.platform.is('cordova')) { - await this.qrScannerService.scan().then(async (scannedCode) => { - await this.intenthandler.handleQRCodeLink(scannedCode); - },() => {}); - } else { - // Test sample for development - //await this.intenthandler.handleQRCodeLink('https://beanconqueror.com/?qr=7b761a95'); - } - this.loadBeans(); - return; - - } - - public async longPressAdd(event) { - if (event) { - event.stopPropagation(); - event.stopImmediatePropagation(); - } - await this.add(); - } - - } diff --git a/src/app/brew/brew.page.html b/src/app/brew/brew.page.html index 0ba745a3d..167e03dac 100644 --- a/src/app/brew/brew.page.html +++ b/src/app/brew/brew.page.html @@ -26,7 +26,7 @@
-
+
@@ -55,7 +55,7 @@
-
+
diff --git a/src/app/brew/brew.page.ts b/src/app/brew/brew.page.ts index 4d39749d6..9a96fd96e 100644 --- a/src/app/brew/brew.page.ts +++ b/src/app/brew/brew.page.ts @@ -1,19 +1,25 @@ -import {ChangeDetectorRef, Component, ElementRef, HostListener, OnInit, ViewChild} from '@angular/core'; -import { ModalController, Platform} from '@ionic/angular'; -import {UIAlert} from '../../services/uiAlert'; -import {UIHelper} from '../../services/uiHelper'; -import {UIBrewStorage} from '../../services/uiBrewStorage'; -import {UISettingsStorage} from '../../services/uiSettingsStorage'; -import {UIBrewHelper} from '../../services/uiBrewHelper'; -import {Brew} from '../../classes/brew/brew'; -import {IBrewPageFilter} from '../../interfaces/brew/iBrewPageFilter'; -import {BREW_ACTION} from '../../enums/brews/brewAction'; -import {Bean} from '../../classes/bean/bean'; -import {BrewFilterComponent} from './brew-filter/brew-filter.component'; -import {Settings} from '../../classes/settings/settings'; -import {AgVirtualSrollComponent} from 'ag-virtual-scroll'; -import {UIAnalytics} from '../../services/uiAnalytics'; - +import { + ChangeDetectorRef, + Component, + ElementRef, + HostListener, + OnInit, + ViewChild, +} from '@angular/core'; +import { ModalController, Platform } from '@ionic/angular'; +import { UIAlert } from '../../services/uiAlert'; +import { UIHelper } from '../../services/uiHelper'; +import { UIBrewStorage } from '../../services/uiBrewStorage'; +import { UISettingsStorage } from '../../services/uiSettingsStorage'; +import { UIBrewHelper } from '../../services/uiBrewHelper'; +import { Brew } from '../../classes/brew/brew'; +import { IBrewPageFilter } from '../../interfaces/brew/iBrewPageFilter'; +import { BREW_ACTION } from '../../enums/brews/brewAction'; +import { Bean } from '../../classes/bean/bean'; +import { BrewFilterComponent } from './brew-filter/brew-filter.component'; +import { Settings } from '../../classes/settings/settings'; +import { AgVirtualSrollComponent } from 'ag-virtual-scroll'; +import { UIAnalytics } from '../../services/uiAnalytics'; @Component({ selector: 'brew', @@ -21,18 +27,18 @@ import {UIAnalytics} from '../../services/uiAnalytics'; styleUrls: ['./brew.page.scss'], }) export class BrewPage implements OnInit { - - private brews: Array; public openBrewsView: Array = []; public archiveBrewsView: Array = []; - public brew_segment: string = 'open'; - @ViewChild('openScroll', {read: AgVirtualSrollComponent, static: false}) public openScroll: AgVirtualSrollComponent; - @ViewChild('archivedScroll', {read: AgVirtualSrollComponent, static: false}) public archivedScroll: AgVirtualSrollComponent; - @ViewChild('brewContent',{read: ElementRef}) public brewContent: ElementRef; + @ViewChild('openScroll', { read: AgVirtualSrollComponent, static: false }) + public openScroll: AgVirtualSrollComponent; + @ViewChild('archivedScroll', { read: AgVirtualSrollComponent, static: false }) + public archivedScroll: AgVirtualSrollComponent; + @ViewChild('brewContent', { read: ElementRef }) + public brewContent: ElementRef; public openBrewFilterText: string = ''; public archivedBrewFilterText: string = ''; @@ -42,27 +48,27 @@ export class BrewPage implements OnInit { public settings: Settings; - constructor (private readonly modalCtrl: ModalController, - private readonly platform: Platform, - private readonly uiBrewStorage: UIBrewStorage, - private readonly changeDetectorRef: ChangeDetectorRef, - private readonly uiAlert: UIAlert, - public uiHelper: UIHelper, - public uiBrewHelper: UIBrewHelper, - private readonly uiSettingsStorage: UISettingsStorage, - private readonly uiAnalytics: UIAnalytics) { + constructor( + private readonly modalCtrl: ModalController, + private readonly platform: Platform, + private readonly uiBrewStorage: UIBrewStorage, + private readonly changeDetectorRef: ChangeDetectorRef, + private readonly uiAlert: UIAlert, + public uiHelper: UIHelper, + public uiBrewHelper: UIBrewHelper, + private readonly uiSettingsStorage: UISettingsStorage, + private readonly uiAnalytics: UIAnalytics + ) { this.settings = this.uiSettingsStorage.getSettings(); this.archivedBrewsFilter = this.settings.GET_BREW_FILTER(); this.openBrewsFilter = this.settings.GET_BREW_FILTER(); } - public ionViewWillEnter(): void { this.archivedBrewsFilter = this.settings.brew_filter.ARCHIVED; this.openBrewsFilter = this.settings.brew_filter.OPEN; this.loadBrews(); - this.retriggerScroll(); } @@ -71,10 +77,8 @@ export class BrewPage implements OnInit { } private retriggerScroll() { - - setTimeout(async () =>{ - - const el = this.brewContent.nativeElement; + setTimeout(async () => { + const el = this.brewContent.nativeElement; let scrollComponent: AgVirtualSrollComponent; if (this.openScroll !== undefined) { scrollComponent = this.openScroll; @@ -82,9 +86,9 @@ export class BrewPage implements OnInit { scrollComponent = this.archivedScroll; } - scrollComponent.el.style.height = (el.offsetHeight - scrollComponent.el.offsetTop) + 'px'; - },150); - + scrollComponent.el.style.height = + el.offsetHeight - scrollComponent.el.offsetTop + 'px'; + }, 150); } @HostListener('window:resize') @@ -93,7 +97,6 @@ export class BrewPage implements OnInit { this.retriggerScroll(); } public async add() { - await this.uiBrewHelper.addBrew(); this.loadBrews(); } @@ -102,17 +105,12 @@ export class BrewPage implements OnInit { this.loadBrews(); } - public loadBrews(): void { this.__initializeBrews(); this.retriggerScroll(); this.changeDetectorRef.detectChanges(); } - - - - private __initializeBrews(): void { this.brews = this.uiBrewStorage.getAllEntries(); this.openBrewsView = []; @@ -122,26 +120,71 @@ export class BrewPage implements OnInit { this.__initializeBrewView('archiv'); } - public isFilterActive(): boolean { let checkingFilter: IBrewPageFilter; let checkingFilterText: string = ''; if (this.brew_segment === 'open') { checkingFilter = this.openBrewsFilter; checkingFilterText = this.openBrewFilterText; - } else { checkingFilter = this.archivedBrewsFilter; checkingFilterText = this.archivedBrewFilterText; - } let didRatingFilterChanged: boolean = false; if (checkingFilter.rating) { - didRatingFilterChanged = (checkingFilter.rating.upper !== this.settings?.brew_rating || checkingFilter.rating.lower !== -1); + didRatingFilterChanged = + checkingFilter.rating.upper !== this.settings?.brew_rating || + checkingFilter.rating.lower !== -1; } - return (checkingFilter.bean.length > 0 || + return ( + checkingFilter.bean.length > 0 || checkingFilter.method_of_preparation.length > 0 || - checkingFilter.mill.length > 0) || checkingFilter.favourite || didRatingFilterChanged || checkingFilterText !== ''; + checkingFilter.mill.length > 0 || + checkingFilter.favourite || + didRatingFilterChanged || + checkingFilterText !== '' + ); + } + + public shallBarBeDisplayed() { + let shallBarDisplayed: boolean = false; + if (this.settings) { + const isOpen = this.brew_segment === 'open'; + let checkingEntries: Array = []; + if (isOpen) { + checkingEntries = this.openBrewsView; + } else { + checkingEntries = this.archiveBrewsView; + } + if (checkingEntries.length <= 0) { + let entriesExisting: number = 0; + if (isOpen) { + entriesExisting = this.uiBrewStorage + .getAllEntries() + .filter( + (e) => + e.getBean().finished === !isOpen && + e.getMill().finished === !isOpen && + e.getPreparation().finished === !isOpen + ).length; + } else { + entriesExisting = this.uiBrewStorage + .getAllEntries() + .filter( + (e) => + e.getBean().finished === !isOpen || + e.getMill().finished === !isOpen || + e.getPreparation().finished === !isOpen + ).length; + } + + if (entriesExisting > 0) { + shallBarDisplayed = true; + } + } + } + + return shallBarDisplayed; } // Treat the instructor name as the unique identifier for the object @@ -152,18 +195,17 @@ export class BrewPage implements OnInit { public async showFilter() { let brewFilter: IBrewPageFilter; if (this.brew_segment === 'open') { - brewFilter = {...this.openBrewsFilter}; + brewFilter = { ...this.openBrewsFilter }; } else { - brewFilter = {...this.archivedBrewsFilter}; + brewFilter = { ...this.archivedBrewsFilter }; } const modal = await this.modalCtrl.create({ component: BrewFilterComponent, cssClass: 'popover-actions', id: BrewFilterComponent.COMPONENT_ID, - componentProps: - {brew_filter: brewFilter, segment: this.brew_segment}, - breakpoints: [0, 0.75, 1], + componentProps: { brew_filter: brewFilter, segment: this.brew_segment }, + breakpoints: [0, 0.75, 1], initialBreakpoint: 1, }); await modal.present(); @@ -171,19 +213,16 @@ export class BrewPage implements OnInit { if (modalData !== undefined && modalData.data.brew_filter !== undefined) { if (this.brew_segment === 'open') { this.openBrewsFilter = modalData.data.brew_filter; - } else { this.archivedBrewsFilter = modalData.data.brew_filter; } } this.__saveBrewFilter(); - this.loadBrews(); } private async __saveBrewFilter() { - this.settings.brew_filter.OPEN = this.openBrewsFilter; this.settings.brew_filter.ARCHIVED = this.archivedBrewsFilter; await this.uiSettingsStorage.saveSettings(this.settings); @@ -194,27 +233,27 @@ export class BrewPage implements OnInit { this.retriggerScroll(); } private __initializeBrewView(_type: string): void { -// sort latest to top. + // sort latest to top. const brewsCopy: Array = [...this.brews]; let brewsFilters: Array; - const isOpen: boolean = (_type === 'open'); + const isOpen: boolean = _type === 'open'; if (isOpen) { - brewsFilters = brewsCopy.filter((e) => - e.getBean().finished === !isOpen && - e.getMill().finished === !isOpen && - e.getPreparation().finished === !isOpen + brewsFilters = brewsCopy.filter( + (e) => + e.getBean().finished === !isOpen && + e.getMill().finished === !isOpen && + e.getPreparation().finished === !isOpen ); } else { - brewsFilters = brewsCopy.filter((e) => - e.getBean().finished === !isOpen || - e.getMill().finished === !isOpen || - e.getPreparation().finished === !isOpen + brewsFilters = brewsCopy.filter( + (e) => + e.getBean().finished === !isOpen || + e.getMill().finished === !isOpen || + e.getPreparation().finished === !isOpen ); } - - let filter: IBrewPageFilter; if (isOpen) { filter = this.openBrewsFilter; @@ -223,38 +262,58 @@ export class BrewPage implements OnInit { } if (filter.mill.length > 0) { - brewsFilters = brewsFilters.filter((e) => filter.mill.filter((z) => z === e.mill).length > 0); + brewsFilters = brewsFilters.filter( + (e) => filter.mill.filter((z) => z === e.mill).length > 0 + ); } if (filter.bean.length > 0) { - brewsFilters = brewsFilters.filter((e) => filter.bean.filter((z) => z === e.bean).length > 0); + brewsFilters = brewsFilters.filter( + (e) => filter.bean.filter((z) => z === e.bean).length > 0 + ); } if (filter.method_of_preparation.length > 0) { - brewsFilters = brewsFilters.filter((e) => filter.method_of_preparation.filter((z) => z === e.method_of_preparation).length > 0); + brewsFilters = brewsFilters.filter( + (e) => + filter.method_of_preparation.filter( + (z) => z === e.method_of_preparation + ).length > 0 + ); // Tools just can be selected when a preparation method was selected if (filter.method_of_preparation_tools.length > 0) { - brewsFilters = brewsFilters.filter( (e) => filter.method_of_preparation_tools.filter((z) => e.method_of_preparation_tools.includes(z) ).length>0); + brewsFilters = brewsFilters.filter( + (e) => + filter.method_of_preparation_tools.filter((z) => + e.method_of_preparation_tools.includes(z) + ).length > 0 + ); } } if (filter.favourite) { - brewsFilters = brewsFilters.filter((e)=>e.favourite === true); + brewsFilters = brewsFilters.filter((e) => e.favourite === true); } if (filter.rating) { - brewsFilters = brewsFilters.filter((e: Brew)=> e.rating>= filter.rating.lower && e.rating <=filter.rating.upper ); + brewsFilters = brewsFilters.filter( + (e: Brew) => + e.rating >= filter.rating.lower && e.rating <= filter.rating.upper + ); } let sortedBrews: Array = UIBrewHelper.sortBrews(brewsFilters); let searchText: string = ''; if (_type === 'open') { - searchText = this.openBrewFilterText.toLowerCase(); + searchText = this.openBrewFilterText.toLowerCase(); } else { searchText = this.archivedBrewFilterText.toLowerCase(); } if (searchText) { - sortedBrews = sortedBrews.filter((e) => e.note.toLowerCase().includes(searchText) || - e.getPreparation().name.toLowerCase().includes(searchText) || - e.getBean().name.toLowerCase().includes(searchText) || - e.getBean().roaster.toLowerCase().includes(searchText)); + sortedBrews = sortedBrews.filter( + (e) => + e.note.toLowerCase().includes(searchText) || + e.getPreparation().name.toLowerCase().includes(searchText) || + e.getBean().name.toLowerCase().includes(searchText) || + e.getBean().roaster.toLowerCase().includes(searchText) + ); } if (_type === 'open') { @@ -262,11 +321,8 @@ export class BrewPage implements OnInit { } else { this.archiveBrewsView = sortedBrews; } - - } - public ngOnInit() { } - + public ngOnInit() {} public async longPressAdd(_event) { _event.target.blur(); @@ -278,5 +334,4 @@ export class BrewPage implements OnInit { await this.uiBrewHelper.longPressAddBrew(); this.loadBrews(); } - } diff --git a/src/app/settings/settings.page.html b/src/app/settings/settings.page.html index 0afb2dcee..2f57032f8 100644 --- a/src/app/settings/settings.page.html +++ b/src/app/settings/settings.page.html @@ -94,7 +94,6 @@

{{"PAGE_SETTINGS_BREW_RATING" | translate}}

- {{"PAGE_SETTINGS_BREW_RATING_STEPS" | translate}} {{"PAGE_SETTINGS_BREW_RATING" | translate}} + + +

{{"PAGE_SETTINGS_BEAN_RATING" | translate}}

+
+ +
+ + + {{settings.bean_rating}} + + + + + + {{"PAGE_SETTINGS_BEAN_RATING_STEPS" | translate}} + + + 1 + + + 0.75 + + + 0.5 + + + 0.25 + + + 0.1 + + + diff --git a/src/app/settings/settings.page.ts b/src/app/settings/settings.page.ts index 558d49833..36b0c0a69 100644 --- a/src/app/settings/settings.page.ts +++ b/src/app/settings/settings.page.ts @@ -462,6 +462,11 @@ export class SettingsPage implements OnInit { this.settings.resetFilter(); } + public async changeBeanRating() { + await this.saveSettings(); + this.settings.resetFilter(); + } + public async saveSettings() { this.changeDetectorRef.detectChanges(); await this.uiSettingsStorage.saveSettings(this.settings); diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index ce96feae9..a08f7f444 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -1199,5 +1199,9 @@ "PRESSURE_THRESHOLD_BAR": "Schwellenwert Druck", "TIMER_MILLISECONDS": "MS", "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS": "Millisekunden?", - "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Verwende Millisekunden um noch akkurater deine Brühungen zu Analysieren" + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Verwende Millisekunden um noch akkurater deine Brühungen zu Analysieren", + "PAGE_SETTINGS_BEAN_RATING": "Bohnenbewertung", + "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "0 bis 5 sind dir zu wenig zur Bewertung deiner Bohne? Du kannst bis zu 100 'Punkten' vergeben", + "PAGE_SETTINGS_BEAN_RATING_STEPS": "Bohnen Bewertungsschritte", + "COFFEE_GRAMS_BREWED": "Grams gebrüht" } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 400f0ef0e..58316e0e3 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -1199,5 +1199,9 @@ "PRESSURE_THRESHOLD_BAR": "Threshold pressure", "TIMER_MILLISECONDS": "MS", "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS": "Milliseconds?", - "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Use milliseconds to even more accurately analyze your brews" + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Use milliseconds to even more accurately analyze your brews", + "PAGE_SETTINGS_BEAN_RATING": "Bean rating", + "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "Is the default '0 to 5' not the right rating for you? You can instead use a '0 to 100' scale", + "PAGE_SETTINGS_BEAN_RATING_STEPS": "Bean rating steps", + "COFFEE_GRAMS_BREWED": "Grams brewed" } diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index ab141e2f9..c5a501dba 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -1199,5 +1199,9 @@ "PRESSURE_THRESHOLD_BAR": "Threshold pressure", "TIMER_MILLISECONDS": "MS", "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS": "Milliseconds?", - "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Use milliseconds to even more accurately analyze your brews" + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Use milliseconds to even more accurately analyze your brews", + "PAGE_SETTINGS_BEAN_RATING": "Bean rating", + "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "Is the default '0 to 5' not the right rating for you? You can instead use a '0 to 100' scale", + "PAGE_SETTINGS_BEAN_RATING_STEPS": "Bean rating steps", + "COFFEE_GRAMS_BREWED": "Grams brewed" } diff --git a/src/assets/i18n/tr.json b/src/assets/i18n/tr.json index 7d51e0eff..15cf5b68e 100644 --- a/src/assets/i18n/tr.json +++ b/src/assets/i18n/tr.json @@ -1199,5 +1199,9 @@ "PRESSURE_THRESHOLD_BAR": "Threshold pressure", "TIMER_MILLISECONDS": "MS", "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS": "Milliseconds?", - "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Use milliseconds to even more accurately analyze your brews" + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Use milliseconds to even more accurately analyze your brews", + "PAGE_SETTINGS_BEAN_RATING": "Bean rating", + "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "Is the default '0 to 5' not the right rating for you? You can instead use a '0 to 100' scale", + "PAGE_SETTINGS_BEAN_RATING_STEPS": "Bean rating steps", + "COFFEE_GRAMS_BREWED": "Grams brewed" } diff --git a/src/assets/i18n/zh.json b/src/assets/i18n/zh.json index c93de4399..c4a552411 100644 --- a/src/assets/i18n/zh.json +++ b/src/assets/i18n/zh.json @@ -1198,5 +1198,9 @@ "PRESSURE_THRESHOLD_BAR": "Threshold pressure", "TIMER_MILLISECONDS": "MS", "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS": "Milliseconds?", - "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Use milliseconds to even more accurately analyze your brews" + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Use milliseconds to even more accurately analyze your brews", + "PAGE_SETTINGS_BEAN_RATING": "Bean rating", + "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "Is the default '0 to 5' not the right rating for you? You can instead use a '0 to 100' scale", + "PAGE_SETTINGS_BEAN_RATING_STEPS": "Bean rating steps", + "COFFEE_GRAMS_BREWED": "Grams brewed" } diff --git a/src/classes/settings/settings.ts b/src/classes/settings/settings.ts index 2aa796e18..bda6137ce 100755 --- a/src/classes/settings/settings.ts +++ b/src/classes/settings/settings.ts @@ -37,6 +37,8 @@ export class Settings implements ISettings { public image_quality: number; public brew_rating: number; public brew_rating_steps: number; + public bean_rating: number; + public bean_rating_steps: number; public show_archived_beans: boolean; public show_archived_brews: boolean; @@ -100,10 +102,11 @@ export class Settings implements ISettings { public currency: string; public GET_BEAN_FILTER(): IBeanPageFilter { + const upperRating: number = this.bean_rating; return { favourite: false, rating: { - upper: 5, + upper: upperRating, lower: 0, }, bean_roasting_type: [], @@ -199,6 +202,8 @@ export class Settings implements ISettings { this.graph.FILTER.realtime_flow = false; this.brew_rating = 5; this.brew_rating_steps = 1; + this.bean_rating = 5; + this.bean_rating_steps = 1; this.brew_filter.OPEN = this.GET_BREW_FILTER(); this.brew_filter.ARCHIVED = this.GET_BREW_FILTER(); diff --git a/src/components/bean-information/bean-information.component.html b/src/components/bean-information/bean-information.component.html index 483bc92d8..079382d47 100644 --- a/src/components/bean-information/bean-information.component.html +++ b/src/components/bean-information/bean-information.component.html @@ -1,21 +1,31 @@ - +
- - - - {{bean.name}} ({{"BEAN_ROASTING_TYPE_" + bean.bean_roasting_type | translate}}) + + + + {{bean.name}} ({{"BEAN_ROASTING_TYPE_" + bean.bean_roasting_type | translate}})
-
+ +
- - + + +
+ {{this.uiHelper.toFixedIfNecessary(bean.rating,2)}} +
@@ -27,7 +37,7 @@
-
+
@@ -38,7 +48,8 @@ - {{"BEAN_DATA_ROASTING_DATE" | translate}}
+ {{"BEAN_DATA_ROASTING_DATE" | translate}} +
{{bean.roastingDate | formatDate:["DD.MM.YYYY"]}} @@ -47,21 +58,25 @@
- {{"BEAN_DATA_ROASTER" | translate}}
+ {{"BEAN_DATA_ROASTER" | translate}} +
{{bean.roaster}} - + -
- {{"BEAN_DATA_ROAST_NAME" | translate}}
+ {{"BEAN_DATA_ROAST_NAME" | translate}} +
- + {{bean.roast_custom}} - + {{roast_enum[bean.roast]}} @@ -69,17 +84,21 @@
- {{"PAGE_HOME_TOTAL_BREWS" | translate}}
+ {{"PAGE_HOME_TOTAL_BREWS" | translate}} +
{{brewCounts()}}
- {{"ROASTED_BEFORE" | translate}}
+ {{"ROASTED_BEFORE" | translate}} +
{{daysOld()}} {{"DAY_OLD" | translate}} {{daysOld()}} {{"DAYS_OLD" | translate}}
- {{"BEANS_AMOUNT_USED" | translate}}
- {{daysOld()}} + {{"BEANS_AMOUNT_USED" | translate}} +
+ {{daysOld()}}
diff --git a/src/components/bean-information/bean-information.component.ts b/src/components/bean-information/bean-information.component.ts index 4a7dee1ba..6cee3119a 100644 --- a/src/components/bean-information/bean-information.component.ts +++ b/src/components/bean-information/bean-information.component.ts @@ -1,27 +1,35 @@ -import {Component, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core'; -import {Bean} from '../../classes/bean/bean'; -import {Settings} from '../../classes/settings/settings'; -import {UISettingsStorage} from '../../services/uiSettingsStorage'; -import {ModalController} from '@ionic/angular'; -import {BeanPopoverActionsComponent} from '../../app/beans/bean-popover-actions/bean-popover-actions.component'; -import {BEAN_ACTION} from '../../enums/beans/beanAction'; -import {Brew} from '../../classes/brew/brew'; -import {UIBeanHelper} from '../../services/uiBeanHelper'; -import {ROASTS_ENUM} from '../../enums/beans/roasts'; -import {NgxStarsComponent} from 'ngx-stars'; -import {UIAnalytics} from '../../services/uiAnalytics'; -import {UIBrewStorage} from '../../services/uiBrewStorage'; -import {UIAlert} from '../../services/uiAlert'; -import {UIToast} from '../../services/uiToast'; -import {UIImage} from '../../services/uiImage'; -import {UIBeanStorage} from '../../services/uiBeanStorage'; +import { + Component, + EventEmitter, + Input, + OnInit, + Output, + ViewChild, +} from '@angular/core'; +import { Bean } from '../../classes/bean/bean'; +import { Settings } from '../../classes/settings/settings'; +import { UISettingsStorage } from '../../services/uiSettingsStorage'; +import { ModalController } from '@ionic/angular'; +import { BeanPopoverActionsComponent } from '../../app/beans/bean-popover-actions/bean-popover-actions.component'; +import { BEAN_ACTION } from '../../enums/beans/beanAction'; +import { Brew } from '../../classes/brew/brew'; +import { UIBeanHelper } from '../../services/uiBeanHelper'; +import { ROASTS_ENUM } from '../../enums/beans/roasts'; +import { NgxStarsComponent } from 'ngx-stars'; +import { UIAnalytics } from '../../services/uiAnalytics'; +import { UIBrewStorage } from '../../services/uiBrewStorage'; +import { UIAlert } from '../../services/uiAlert'; +import { UIToast } from '../../services/uiToast'; +import { UIImage } from '../../services/uiImage'; +import { UIBeanStorage } from '../../services/uiBeanStorage'; import BEAN_TRACKING from '../../data/tracking/beanTracking'; -import {ShareService} from '../../services/shareService/share-service.service'; -import {BEAN_ROASTING_TYPE_ENUM} from '../../enums/beans/beanRoastingType'; -import {ServerBean} from '../../models/bean/serverBean'; +import { ShareService } from '../../services/shareService/share-service.service'; +import { BEAN_ROASTING_TYPE_ENUM } from '../../enums/beans/beanRoastingType'; +import { ServerBean } from '../../models/bean/serverBean'; import QR_TRACKING from '../../data/tracking/qrTracking'; -import {BeanMapper} from '../../mapper/bean/beanMapper'; -import {ServerCommunicationService} from '../../services/serverCommunication/server-communication.service'; +import { BeanMapper } from '../../mapper/bean/beanMapper'; +import { ServerCommunicationService } from '../../services/serverCommunication/server-communication.service'; +import { UIHelper } from '../../services/uiHelper'; @Component({ selector: 'bean-information', @@ -29,35 +37,37 @@ import {ServerCommunicationService} from '../../services/serverCommunication/ser styleUrls: ['./bean-information.component.scss'], }) export class BeanInformationComponent implements OnInit { - @Input() public bean: Bean; @Input() public showActions: boolean = true; - @ViewChild('beanStars', {read: NgxStarsComponent, static: false}) public beanStars: NgxStarsComponent; - @ViewChild('beanRating', {read: NgxStarsComponent, static: false}) public beanRating: NgxStarsComponent; + @ViewChild('beanStars', { read: NgxStarsComponent, static: false }) + public beanStars: NgxStarsComponent; + @ViewChild('beanRating', { read: NgxStarsComponent, static: false }) + public beanRating: NgxStarsComponent; @Output() public beanAction: EventEmitter = new EventEmitter(); public beanRoastingTypeEnum = BEAN_ROASTING_TYPE_ENUM; public roast_enum = ROASTS_ENUM; - - constructor(private readonly uiSettingsStorage: UISettingsStorage, - private readonly uiBeanHelper: UIBeanHelper, - private readonly modalController: ModalController, - private readonly uiAnalytics: UIAnalytics, - private readonly uiBrewStorage: UIBrewStorage, - private readonly uiAlert: UIAlert, - private readonly uiToast: UIToast, - private readonly uiBeanStorage: UIBeanStorage, - private readonly uiImage: UIImage, - private readonly shareService: ShareService, - private readonly serverCommunicationService: ServerCommunicationService) { - + public settings: Settings = null; + constructor( + private readonly uiSettingsStorage: UISettingsStorage, + private readonly uiBeanHelper: UIBeanHelper, + private readonly modalController: ModalController, + private readonly uiAnalytics: UIAnalytics, + private readonly uiBrewStorage: UIBrewStorage, + private readonly uiAlert: UIAlert, + private readonly uiToast: UIToast, + private readonly uiBeanStorage: UIBeanStorage, + private readonly uiImage: UIImage, + private readonly shareService: ShareService, + private readonly serverCommunicationService: ServerCommunicationService, + private readonly uiHelper: UIHelper + ) { + this.settings = this.uiSettingsStorage.getSettings(); } - - public ngOnInit() { - } + public ngOnInit() {} public ngAfterViewInit() { this.resetRenderingRating(); } @@ -74,25 +84,25 @@ export class BeanInformationComponent implements OnInit { if (this.beanRating && this.bean.rating !== 0) { this.beanRating.setRating(this.bean.rating); } - },250); - + }, 250); } public brewCounts(): number { - - const relatedBrews: Array = this.uiBeanHelper.getAllBrewsForThisBean(this.bean.config.uuid); + const relatedBrews: Array = this.uiBeanHelper.getAllBrewsForThisBean( + this.bean.config.uuid + ); return relatedBrews.length; } public daysOld(): number { - return this.bean.beanAgeInDays(); - } public getUsedWeightCount(): number { let usedWeightCount: number = 0; - const relatedBrews: Array = this.uiBeanHelper.getAllBrewsForThisBean(this.bean.config.uuid); + const relatedBrews: Array = this.uiBeanHelper.getAllBrewsForThisBean( + this.bean.config.uuid + ); for (const brew of relatedBrews) { if (brew.bean_weight_in > 0) { usedWeightCount += brew.bean_weight_in; @@ -106,7 +116,7 @@ export class BeanInformationComponent implements OnInit { public getRoastEnum(_key: ROASTS_ENUM) { for (const key in ROASTS_ENUM) { if (ROASTS_ENUM[key] === _key) { - return (key as ROASTS_ENUM); + return key as ROASTS_ENUM; } } return ''; @@ -125,11 +135,14 @@ export class BeanInformationComponent implements OnInit { public async showBeanActions(event): Promise { event.stopPropagation(); event.stopImmediatePropagation(); - this.uiAnalytics.trackEvent(BEAN_TRACKING.TITLE, BEAN_TRACKING.ACTIONS.POPOVER_ACTIONS); + this.uiAnalytics.trackEvent( + BEAN_TRACKING.TITLE, + BEAN_TRACKING.ACTIONS.POPOVER_ACTIONS + ); const popover = await this.modalController.create({ component: BeanPopoverActionsComponent, - componentProps: {bean: this.bean}, - id:BeanPopoverActionsComponent.COMPONENT_ID, + componentProps: { bean: this.bean }, + id: BeanPopoverActionsComponent.COMPONENT_ID, cssClass: 'popover-actions', breakpoints: [0, 0.75, 1], initialBreakpoint: 1, @@ -142,7 +155,6 @@ export class BeanInformationComponent implements OnInit { } } - public async internalBeanAction(action: BEAN_ACTION): Promise { switch (action) { case BEAN_ACTION.DETAIL: @@ -157,7 +169,7 @@ export class BeanInformationComponent implements OnInit { case BEAN_ACTION.DELETE: try { await this.deleteBean(); - }catch (ex) {} + } catch (ex) {} await this.uiAlert.hideLoadingSpinner(); break; case BEAN_ACTION.BEANS_CONSUMED: @@ -185,11 +197,13 @@ export class BeanInformationComponent implements OnInit { } private async viewPhotos() { - this.uiAnalytics.trackEvent(BEAN_TRACKING.TITLE, BEAN_TRACKING.ACTIONS.PHOTO_VIEW); + this.uiAnalytics.trackEvent( + BEAN_TRACKING.TITLE, + BEAN_TRACKING.ACTIONS.PHOTO_VIEW + ); await this.uiImage.viewPhotos(this.bean); } public async beansConsumed() { - await this.uiBeanHelper.archiveBeanWithRatingQuestion(this.bean); await this.resetSettings(); @@ -199,26 +213,27 @@ export class BeanInformationComponent implements OnInit { await this.uiBeanStorage.update(this.bean); this.uiToast.showInfoToast('TOAST_BEAN_ARCHIVED_SUCCESSFULLY'); */ - - - - } public async toggleFavourite() { if (!this.bean.favourite) { - this.uiAnalytics.trackEvent(BEAN_TRACKING.TITLE, BEAN_TRACKING.ACTIONS.ADD_FAVOURITE); + this.uiAnalytics.trackEvent( + BEAN_TRACKING.TITLE, + BEAN_TRACKING.ACTIONS.ADD_FAVOURITE + ); this.uiToast.showInfoToast('TOAST_BEAN_FAVOURITE_ADDED'); this.bean.favourite = true; } else { - this.uiAnalytics.trackEvent(BEAN_TRACKING.TITLE, BEAN_TRACKING.ACTIONS.REMOVE_FAVOURITE); + this.uiAnalytics.trackEvent( + BEAN_TRACKING.TITLE, + BEAN_TRACKING.ACTIONS.REMOVE_FAVOURITE + ); this.bean.favourite = false; this.uiToast.showInfoToast('TOAST_BEAN_FAVOURITE_REMOVED'); } await this.uiBeanStorage.update(this.bean); } - public async add() { await this.uiBeanHelper.addBean(); } @@ -237,54 +252,65 @@ export class BeanInformationComponent implements OnInit { await this.shareService.shareBean(this.bean); } public async refreshDataFromQRCode() { - await this.uiAlert.showConfirm('QR_CODE_REFRESH_DATA_MESSAGE','CARE',true).then(async () => { - await this.uiAlert.showLoadingSpinner(); - let errorOccured: boolean = false; - try { - - const _scannedQRBean: ServerBean = await this.serverCommunicationService.getBeanInformation(this.bean.qr_code); - if (_scannedQRBean.error === null) { - - this.uiAnalytics.trackEvent(QR_TRACKING.TITLE, QR_TRACKING.ACTIONS.REFRESH_SUCCESSFULLY); - this.uiToast.showInfoToast('QR.BEAN_SUCCESSFULLY_REFRESHED'); + await this.uiAlert + .showConfirm('QR_CODE_REFRESH_DATA_MESSAGE', 'CARE', true) + .then( + async () => { await this.uiAlert.showLoadingSpinner(); - // Get the new bean from server, just save the uuid, all other information will be overwritten - const newMapper = new BeanMapper(); - const newBean: Bean = await newMapper.mapServerToClientBean(_scannedQRBean); - const savedUUID = this.bean.config.uuid; - this.bean = newBean; - this.bean.config.uuid = savedUUID; - await this.uiBeanStorage.update(this.bean); - } else { - errorOccured = true; - - } - } - catch (ex) { - errorOccured = true; - } - await this.uiAlert.hideLoadingSpinner(); - if (errorOccured) { - this.uiAlert.showMessage('QR.SERVER.ERROR_OCCURED','ERROR_OCCURED',undefined,true); - } - - - - },() => { - - }); - - + let errorOccured: boolean = false; + try { + const _scannedQRBean: ServerBean = + await this.serverCommunicationService.getBeanInformation( + this.bean.qr_code + ); + if (_scannedQRBean.error === null) { + this.uiAnalytics.trackEvent( + QR_TRACKING.TITLE, + QR_TRACKING.ACTIONS.REFRESH_SUCCESSFULLY + ); + this.uiToast.showInfoToast('QR.BEAN_SUCCESSFULLY_REFRESHED'); + await this.uiAlert.showLoadingSpinner(); + // Get the new bean from server, just save the uuid, all other information will be overwritten + const newMapper = new BeanMapper(); + const newBean: Bean = await newMapper.mapServerToClientBean( + _scannedQRBean + ); + const savedUUID = this.bean.config.uuid; + this.bean = newBean; + this.bean.config.uuid = savedUUID; + await this.uiBeanStorage.update(this.bean); + } else { + errorOccured = true; + } + } catch (ex) { + errorOccured = true; + } + await this.uiAlert.hideLoadingSpinner(); + if (errorOccured) { + this.uiAlert.showMessage( + 'QR.SERVER.ERROR_OCCURED', + 'ERROR_OCCURED', + undefined, + true + ); + } + }, + () => {} + ); } - public async deleteBean(): Promise { - return new Promise(async (resolve,reject) => { - this.uiAlert.showConfirm('DELETE_BEAN_QUESTION', 'SURE_QUESTION', true) - .then(async () => { + return new Promise(async (resolve, reject) => { + this.uiAlert + .showConfirm('DELETE_BEAN_QUESTION', 'SURE_QUESTION', true) + .then( + async () => { await this.uiAlert.showLoadingSpinner(); // Yes - this.uiAnalytics.trackEvent(BEAN_TRACKING.TITLE, BEAN_TRACKING.ACTIONS.DELETE); + this.uiAnalytics.trackEvent( + BEAN_TRACKING.TITLE, + BEAN_TRACKING.ACTIONS.DELETE + ); await this.__deleteBean(); this.uiToast.showInfoToast('TOAST_BEAN_DELETED_SUCCESSFULLY'); await this.resetSettings(); @@ -293,12 +319,11 @@ export class BeanInformationComponent implements OnInit { () => { // No reject(); - }); + } + ); }); - } - private async resetSettings() { const settings: Settings = this.uiSettingsStorage.getSettings(); settings.resetFilter(); @@ -306,14 +331,15 @@ export class BeanInformationComponent implements OnInit { } public async repeatBean() { - this.uiAnalytics.trackEvent(BEAN_TRACKING.TITLE, BEAN_TRACKING.ACTIONS.REPEAT); + this.uiAnalytics.trackEvent( + BEAN_TRACKING.TITLE, + BEAN_TRACKING.ACTIONS.REPEAT + ); await this.uiBeanHelper.repeatBean(this.bean); - } - private async __deleteBean() { - const brews: Array = this.uiBrewStorage.getAllEntries(); + const brews: Array = this.uiBrewStorage.getAllEntries(); const deletingBrewIndex: Array = []; for (let i = 0; i < brews.length; i++) { @@ -321,18 +347,27 @@ export class BeanInformationComponent implements OnInit { deletingBrewIndex.push(i); } } - for (let i = deletingBrewIndex.length; i--;) { - await this.uiBrewStorage.removeByUUID(brews[deletingBrewIndex[i]].config.uuid); + for (let i = deletingBrewIndex.length; i--; ) { + await this.uiBrewStorage.removeByUUID( + brews[deletingBrewIndex[i]].config.uuid + ); } await this.uiBeanStorage.removeByObject(this.bean); - } public isBeanRoastUnknown() { - return this.bean.bean_roasting_type === 'UNKNOWN' as BEAN_ROASTING_TYPE_ENUM; + return ( + this.bean.bean_roasting_type === ('UNKNOWN' as BEAN_ROASTING_TYPE_ENUM) + ); + } + public hasCustomRatingRange(): boolean { + if (this.settings) { + if (this.settings.bean_rating !== 5) { + return true; + } else if (this.settings.bean_rating_steps !== 1) { + return true; + } + } + return false; } - - - - } diff --git a/src/components/beans/bean-general-information/bean-general-information.component.html b/src/components/beans/bean-general-information/bean-general-information.component.html index 0c222d177..d6d42bcdf 100644 --- a/src/components/beans/bean-general-information/bean-general-information.component.html +++ b/src/components/beans/bean-general-information/bean-general-information.component.html @@ -57,11 +57,11 @@
{{"BREW_DATA_RATING" | translate }} {{data.rating}} + style="vertical-align: top;">{{this.uiHelper.toFixedIfNecessary(data.rating,2)}} - + -
+
diff --git a/src/components/beans/bean-general-information/bean-general-information.component.ts b/src/components/beans/bean-general-information/bean-general-information.component.ts index 1aa973e72..496cb6cb8 100644 --- a/src/components/beans/bean-general-information/bean-general-information.component.ts +++ b/src/components/beans/bean-general-information/bean-general-information.component.ts @@ -20,6 +20,9 @@ import { IBeanInformation } from '../../../interfaces/bean/iBeanInformation'; import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-devices'; import { BluetoothScale } from '@graphefruit/coffee-bluetooth-devices'; +import { Settings } from '../../../classes/settings/settings'; +import { UISettingsStorage } from '../../../services/uiSettingsStorage'; +import { UIHelper } from '../../../services/uiHelper'; declare var cordova; @Component({ @@ -43,15 +46,23 @@ export class BeanGeneralInformationComponent implements OnInit { public roasterResults: string[] = []; public roasterFocused: boolean = false; + public maxBeanRating: number = 5; + public settings: Settings = undefined; + constructor( private readonly platform: Platform, private readonly uiBeanStorage: UIBeanStorage, private readonly translate: TranslateService, private readonly changeDetectorRef: ChangeDetectorRef, - private readonly bleManager: CoffeeBluetoothDevicesService - ) {} + private readonly bleManager: CoffeeBluetoothDevicesService, + private readonly uiSettingsStorage: UISettingsStorage, + private readonly uiHelper: UIHelper + ) { + this.settings = this.uiSettingsStorage.getSettings(); + } public ngOnInit() { + this.maxBeanRating = this.settings.bean_rating; setTimeout(() => { if (this.beanStars && this.beanStars.setRating) { this.beanStars.setRating(this.data.roast_range); diff --git a/src/components/preparation-information-card/preparation-information-card.component.html b/src/components/preparation-information-card/preparation-information-card.component.html index 5f6bd066e..d1f8377d8 100644 --- a/src/components/preparation-information-card/preparation-information-card.component.html +++ b/src/components/preparation-information-card/preparation-information-card.component.html @@ -31,7 +31,7 @@ {{getBrewsCount()| number : '.0'}} - {{"COFFEE_GRAMS_GRINDED" | translate}}
+ {{"COFFEE_GRAMS_BREWED" | translate}}
{{getWeightCount()| number : '.0-2'}}
diff --git a/src/interfaces/settings/iSettings.ts b/src/interfaces/settings/iSettings.ts index 775ed540c..87ef61b4d 100755 --- a/src/interfaces/settings/iSettings.ts +++ b/src/interfaces/settings/iSettings.ts @@ -30,6 +30,8 @@ export interface ISettings { image_quality: number; brew_rating: number; brew_rating_steps: number; + bean_rating: number; + bean_rating_steps: number; show_archived_brews_on_dashboard: boolean; show_archived_beans: boolean; From 86bf13045b41b0fe48b40764eeed4c93226695ba Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Thu, 11 Aug 2022 16:08:30 +0200 Subject: [PATCH 52/78] Added hint for pressure profiling adapter --- src/app/settings/settings.page.html | 2 +- src/assets/i18n/de.json | 5 +++-- src/assets/i18n/en.json | 5 +++-- src/assets/i18n/es.json | 5 +++-- src/assets/i18n/tr.json | 5 +++-- src/assets/i18n/zh.json | 5 +++-- 6 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/app/settings/settings.page.html b/src/app/settings/settings.page.html index 2f57032f8..a184ba49c 100644 --- a/src/app/settings/settings.page.html +++ b/src/app/settings/settings.page.html @@ -421,7 +421,7 @@

{{"IGNORE_ANOMALY_VALUES" | translate}}

-

{{"SCALE.INFORMATION_DESCRIPTION" | translate}}

+

{{"PRESSURE_INFORMATION_DESCRIPTION" | translate}}

diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index a08f7f444..b4d3d543e 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -1111,7 +1111,7 @@ "LOCATION": "Um Bluetooth-Waagen zu finden, muss der Standort freigegeben werden", "BLUETOOTH": "Um Bluetooth-Waagen zu finden, muss Bluetooth freigegeben werden" }, - "INFORMATION_DESCRIPTION": "Unterstütze Waagen sind: Decent Scale sowie Acaia Scales, Felicita Scales und Hiroia Jimmy" + "INFORMATION_DESCRIPTION": "Unterstütze Waagen sind: Decent Scale sowie Acaia Scales, Felicita Scales, Hiroia Jimmy und Eureka Precisa. Achtung: Falls die Eureka Precisa einen negativen Wert bekommt, stoppt der Timer automatisch" }, "QR": { "WRONG_QRCODE_DESCRIPTION": "Falscher QR-Code oder falscher Inhalt", @@ -1203,5 +1203,6 @@ "PAGE_SETTINGS_BEAN_RATING": "Bohnenbewertung", "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "0 bis 5 sind dir zu wenig zur Bewertung deiner Bohne? Du kannst bis zu 100 'Punkten' vergeben", "PAGE_SETTINGS_BEAN_RATING_STEPS": "Bohnen Bewertungsschritte", - "COFFEE_GRAMS_BREWED": "Grams gebrüht" + "COFFEE_GRAMS_BREWED": "Grams gebrüht", + "PRESSURE_INFORMATION_DESCRIPTION": "Aktuell nur das Do It Yourself Projekt 'Popsicle' unterstützt" } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 58316e0e3..feee00dfa 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -1111,7 +1111,7 @@ "LOCATION": "To find bluetooth scales, the app needs access to the location.", "BLUETOOTH": "To find bluetooth scales, the app needs access to bluetooth" }, - "INFORMATION_DESCRIPTION": "Supported scales are: Decent Scale, Acaia Scales, Felicita Scales and Hiroia Jimmy" + "INFORMATION_DESCRIPTION": "Supported scales are: Decent Scale, Acaia Scales, Felicita Scales, Hiroia Jimmy and Eureka Precisa. Care: If the Eureka Precisa recieves a negative value, the timer stops" }, "QR":{ "WRONG_QRCODE_DESCRIPTION": "Wrong qr code or wrong content", @@ -1203,5 +1203,6 @@ "PAGE_SETTINGS_BEAN_RATING": "Bean rating", "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "Is the default '0 to 5' not the right rating for you? You can instead use a '0 to 100' scale", "PAGE_SETTINGS_BEAN_RATING_STEPS": "Bean rating steps", - "COFFEE_GRAMS_BREWED": "Grams brewed" + "COFFEE_GRAMS_BREWED": "Grams brewed", + "PRESSURE_INFORMATION_DESCRIPTION": "Actually just the DIY project 'Popsicle' supported" } diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index c5a501dba..257039bdc 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -1111,7 +1111,7 @@ "LOCATION": "Para encontrar balanzas bluetooth, la aplicación necesita acceder a la ubicación.", "BLUETOOTH": "Para encontrar balanzas bluetooth, la aplicación necesita acceso a bluetooth" }, - "INFORMATION_DESCRIPTION": "Básculas compatibles: Decent Scale y Acaia Scales y Felicita Scales y Hiroia Jimmy." + "INFORMATION_DESCRIPTION": "Básculas compatibles: Decent Scale y Acaia Scales y Felicita Scales y Hiroia Jimmy y Eureka Precisa. Care: If the Eureka Precisa recieves a negative value, the timer stops" }, "QR": { "WRONG_QRCODE_DESCRIPTION": "Código qr incorrecto o contenido incorrecto", @@ -1203,5 +1203,6 @@ "PAGE_SETTINGS_BEAN_RATING": "Bean rating", "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "Is the default '0 to 5' not the right rating for you? You can instead use a '0 to 100' scale", "PAGE_SETTINGS_BEAN_RATING_STEPS": "Bean rating steps", - "COFFEE_GRAMS_BREWED": "Grams brewed" + "COFFEE_GRAMS_BREWED": "Grams brewed", + "PRESSURE_INFORMATION_DESCRIPTION": "Actually just the DIY project 'Popsicle' supported" } diff --git a/src/assets/i18n/tr.json b/src/assets/i18n/tr.json index 15cf5b68e..75c9a90c9 100644 --- a/src/assets/i18n/tr.json +++ b/src/assets/i18n/tr.json @@ -1111,7 +1111,7 @@ "LOCATION": "Bluetooth ile terazisiyi bulmak için uygulamanın konuma erişmesi gerekiyor.", "BLUETOOTH": "Bluetooth ile terazisiyi bulmak için uygulamanın bluetooth erişimi gerekiyor." }, - "INFORMATION_DESCRIPTION": "Desteklenen tartılar: Decent Tartı, Acaia Tartı, Felicita Tartı and Hiroia Jimmy" + "INFORMATION_DESCRIPTION": "Desteklenen tartılar: Decent Tartı, Acaia Tartı, Felicita Tartı, Hiroia Jimmy and Eureka Precisa. Care: If the Eureka Precisa recieves a negative value, the timer stops" }, "QR":{ "WRONG_QRCODE_DESCRIPTION": "Yanlış qr kodu veya yanlış içerik", @@ -1203,5 +1203,6 @@ "PAGE_SETTINGS_BEAN_RATING": "Bean rating", "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "Is the default '0 to 5' not the right rating for you? You can instead use a '0 to 100' scale", "PAGE_SETTINGS_BEAN_RATING_STEPS": "Bean rating steps", - "COFFEE_GRAMS_BREWED": "Grams brewed" + "COFFEE_GRAMS_BREWED": "Grams brewed", + "PRESSURE_INFORMATION_DESCRIPTION": "Actually just the DIY project 'Popsicle' supported" } diff --git a/src/assets/i18n/zh.json b/src/assets/i18n/zh.json index c4a552411..e501d96de 100644 --- a/src/assets/i18n/zh.json +++ b/src/assets/i18n/zh.json @@ -1111,7 +1111,7 @@ "LOCATION": "软件需要位置权限来搜索电子秤", "BLUETOOTH": "软件需要蓝牙权限来搜索电子秤" }, - "INFORMATION_DESCRIPTION": "支持的电子秤: Decent 电子秤, Acaia 电子秤, Felicita 电子秤以及 Hiroia Jimmy" + "INFORMATION_DESCRIPTION": "支持的电子秤: Decent 电子秤, Acaia 电子秤, Felicita 电子秤以及 Hiroia Jimmy and Eureka Precisa. Care: If the Eureka Precisa recieves a negative value, the timer stops" }, "QR": { "WRONG_QRCODE_DESCRIPTION": "错误的二维码或错误的内容", @@ -1202,5 +1202,6 @@ "PAGE_SETTINGS_BEAN_RATING": "Bean rating", "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "Is the default '0 to 5' not the right rating for you? You can instead use a '0 to 100' scale", "PAGE_SETTINGS_BEAN_RATING_STEPS": "Bean rating steps", - "COFFEE_GRAMS_BREWED": "Grams brewed" + "COFFEE_GRAMS_BREWED": "Grams brewed", + "PRESSURE_INFORMATION_DESCRIPTION": "Actually just the DIY project 'Popsicle' supported" } From 41918886bc8b4f4c8f739560e9dccbd3df098911 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 14 Aug 2022 13:12:39 +0200 Subject: [PATCH 53/78] #400, beverage quantity was not taken for calculation --- src/services/uiStatistic.ts | 136 ++++++++++++++++++++---------------- 1 file changed, 74 insertions(+), 62 deletions(-) diff --git a/src/services/uiStatistic.ts b/src/services/uiStatistic.ts index 8e64eb39a..d52d1899b 100755 --- a/src/services/uiStatistic.ts +++ b/src/services/uiStatistic.ts @@ -1,41 +1,40 @@ /** Core */ -import {Injectable} from '@angular/core'; -import {UIBeanStorage} from './uiBeanStorage'; -import {UIBrewStorage} from './uiBrewStorage'; -import {UIHelper} from './uiHelper'; -import {UIPreparationStorage} from './uiPreparationStorage'; +import { Injectable } from '@angular/core'; +import { UIBeanStorage } from './uiBeanStorage'; +import { UIBrewStorage } from './uiBrewStorage'; +import { UIHelper } from './uiHelper'; +import { UIPreparationStorage } from './uiPreparationStorage'; /** Interfaces */ -import {Bean} from '../classes/bean/bean'; -import {IBrew} from '../interfaces/brew/iBrew'; -import {UIMillStorage} from './uiMillStorage'; -import {UISettingsStorage} from './uiSettingsStorage'; -import {TranslateService} from '@ngx-translate/core'; -import {IPreparation} from '../interfaces/preparation/iPreparation'; -import {IMill} from '../interfaces/mill/iMill'; -import {IBean} from '../interfaces/bean/iBean'; -import {IGreenBean} from '../interfaces/green-bean/iGreenBean'; -import {IRoastingMachine} from '../interfaces/roasting-machine/iRoastingMachine'; -import {UIGreenBeanStorage} from './uiGreenBeanStorage'; -import {UIRoastingMachineStorage} from './uiRoastingMachineStorage'; +import { Bean } from '../classes/bean/bean'; +import { IBrew } from '../interfaces/brew/iBrew'; +import { UIMillStorage } from './uiMillStorage'; +import { UISettingsStorage } from './uiSettingsStorage'; +import { TranslateService } from '@ngx-translate/core'; +import { IPreparation } from '../interfaces/preparation/iPreparation'; +import { IMill } from '../interfaces/mill/iMill'; +import { IBean } from '../interfaces/bean/iBean'; +import { IGreenBean } from '../interfaces/green-bean/iGreenBean'; +import { IRoastingMachine } from '../interfaces/roasting-machine/iRoastingMachine'; +import { UIGreenBeanStorage } from './uiGreenBeanStorage'; +import { UIRoastingMachineStorage } from './uiRoastingMachineStorage'; /** Services */ - @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class UIStatistic { - - constructor (private readonly uiPreparationStorage: UIPreparationStorage, - private readonly uiBeanStorage: UIBeanStorage, - private readonly uiBrewStorage: UIBrewStorage, - private readonly uiMillStorage: UIMillStorage, - private readonly uiGreenBeanStorage: UIGreenBeanStorage, - private readonly uiRoastingMachineStorage: UIRoastingMachineStorage, - private readonly uiHelper: UIHelper, - private readonly uiSettings: UISettingsStorage, - private readonly translate: TranslateService) { - } + constructor( + private readonly uiPreparationStorage: UIPreparationStorage, + private readonly uiBeanStorage: UIBeanStorage, + private readonly uiBrewStorage: UIBrewStorage, + private readonly uiMillStorage: UIMillStorage, + private readonly uiGreenBeanStorage: UIGreenBeanStorage, + private readonly uiRoastingMachineStorage: UIRoastingMachineStorage, + private readonly uiHelper: UIHelper, + private readonly uiSettings: UISettingsStorage, + private readonly translate: TranslateService + ) {} public getSpentMoneyForCoffeeBeans(): number { let costs: number = 0; @@ -68,17 +67,21 @@ export class UIStatistic { public getLastDrunkBrewTimestamp(): string { const lastBrew: IBrew = this.getLastBrew(); if (lastBrew !== undefined) { - return this.uiHelper.formateDate(lastBrew.config.unix_timestamp, 'DD.MM.YYYY, HH:mm:ss'); + return this.uiHelper.formateDate( + lastBrew.config.unix_timestamp, + 'DD.MM.YYYY, HH:mm:ss' + ); } return ''; } - public getTimePassedSinceLastBrewMessage(): string { const lastBrew: IBrew = this.getLastBrew(); if (lastBrew !== undefined) { - const timeDiff = this.uiHelper.timeDifference(lastBrew.config.unix_timestamp); + const timeDiff = this.uiHelper.timeDifference( + lastBrew.config.unix_timestamp + ); if (timeDiff.DAYS === 1) { return this.translate.instant('ONE_DAY'); @@ -107,7 +110,9 @@ export class UIStatistic { public getTimePassedSinceLastBrew(): string { const lastBrew: IBrew = this.getLastBrew(); if (lastBrew !== undefined) { - const timeDiff = this.uiHelper.timeDifference(lastBrew.config.unix_timestamp); + const timeDiff = this.uiHelper.timeDifference( + lastBrew.config.unix_timestamp + ); if (timeDiff.DAYS === 1) { return '1'; @@ -136,7 +141,9 @@ export class UIStatistic { public getSloganTimePassedSinceLastBrew(): string { const timePassed = this.getTimePassedSinceLastBrew(); if (timePassed !== '') { - return `${this.getTimePassedSinceLastBrewMessage()} ${this.translate.instant('WITHOUT_COFFEE')}`; + return `${this.getTimePassedSinceLastBrewMessage()} ${this.translate.instant( + 'WITHOUT_COFFEE' + )}`; } return this.translate.instant('NO_COFFEE_DRUNK'); @@ -154,7 +161,9 @@ export class UIStatistic { public getLastPreparationMethodUsed(): string { const lastBrew: IBrew = this.getLastBrew(); if (lastBrew !== undefined) { - return this.uiPreparationStorage.getPreparationNameByUUID(lastBrew.method_of_preparation); + return this.uiPreparationStorage.getPreparationNameByUUID( + lastBrew.method_of_preparation + ); } return this.translate.instant('NOT_FOUND'); @@ -173,23 +182,20 @@ export class UIStatistic { * Returns in KG */ public getTotalGround(): number { - - const brews: Array = this.uiBrewStorage.getAllEntries(); - if (brews.length > 0) { - let sum = 0; - for (const brew of brews) { - if (brew.bean_weight_in > 0 ) { - sum += +brew.bean_weight_in; - } else { - sum += +brew.grind_weight; - } - - + const brews: Array = this.uiBrewStorage.getAllEntries(); + if (brews.length > 0) { + let sum = 0; + for (const brew of brews) { + if (brew.bean_weight_in > 0) { + sum += +brew.bean_weight_in; + } else { + sum += +brew.grind_weight; } - - return Math.round((sum / 1000) * 100) / 100; } + return Math.round((sum / 1000) * 100) / 100; + } + return 0; } @@ -201,7 +207,12 @@ export class UIStatistic { if (brews.length > 0) { let sum = 0; for (const brew of brews) { - sum += brew.brew_quantity; + // # 400 + if (brew.brew_beverage_quantity > 0) { + sum += brew.brew_beverage_quantity; + } else { + sum += brew.brew_quantity; + } } return Math.round((sum / 1000) * 100) / 100; } @@ -215,18 +226,21 @@ export class UIStatistic { for (const brew of brews) { sum += brew.brew_time; } - return sum/60; + return sum / 60; } return 0; } public photosTaken() { - const allEntries: Array = - [...this.uiBrewStorage.getAllEntries(), - ...this.uiMillStorage.getAllEntries(), - ...this.uiPreparationStorage.getAllEntries(), - ...this.uiBeanStorage.getAllEntries(), - ...this.uiGreenBeanStorage.getAllEntries(), - ...this.uiRoastingMachineStorage.getAllEntries()]; + const allEntries: Array< + IBrew | IMill | IPreparation | IBean | IGreenBean | IRoastingMachine + > = [ + ...this.uiBrewStorage.getAllEntries(), + ...this.uiMillStorage.getAllEntries(), + ...this.uiPreparationStorage.getAllEntries(), + ...this.uiBeanStorage.getAllEntries(), + ...this.uiGreenBeanStorage.getAllEntries(), + ...this.uiRoastingMachineStorage.getAllEntries(), + ]; if (allEntries.length > 0) { let sum = 0; @@ -240,7 +254,7 @@ export class UIStatistic { private getLastBrew(): IBrew { const brews: Array = this.uiBrewStorage.getAllEntries(); - const sortedBrews = brews.sort((n1,n2) => { + const sortedBrews = brews.sort((n1, n2) => { if (n1.config.unix_timestamp > n2.config.unix_timestamp) { return 1; } @@ -260,7 +274,5 @@ export class UIStatistic { } return undefined; - } - } From 0c894012f6fdf3d173506460597749824fc63c7f Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sat, 20 Aug 2022 20:58:13 +0200 Subject: [PATCH 54/78] #384 - Added google protobuf as message / thanks mike for the support! --- package-lock.json | 488 +++++++ package.json | 6 +- src/classes/bean/bean.proto | 109 ++ src/classes/bean/bean.ts | 65 +- src/generated/src/classes/bean/bean.ts | 1130 +++++++++++++++++ .../intentHandler/intent-handler.service.ts | 191 +-- .../shareService/share-service.service.ts | 333 +++-- src/services/uiBeanHelper.ts | 185 +-- src/services/uiHelper.ts | 156 ++- tslint.json | 1 + 10 files changed, 2316 insertions(+), 348 deletions(-) create mode 100644 src/classes/bean/bean.proto create mode 100644 src/generated/src/classes/bean/bean.ts diff --git a/package-lock.json b/package-lock.json index 075a8c3a9..1ce8f224c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,6 +66,7 @@ "javascript-color-gradient": "^1.3.2", "jsurl": "^0.1.5", "lodash": "^4.17.21", + "long": "^5.2.0", "luxon": "^2.3.0", "lz-string": "^1.4.4", "moment": "^2.29.1", @@ -91,6 +92,7 @@ "@types/jasminewd2": "~2.0.8", "@types/lodash": "^4.14.178", "@types/node": "^12.20.5", + "@types/protobufjs": "^6.0.0", "@wisdomgarden/cordova-plugin-filepath": "git+https://github.com/wisdom-garden/cordova-plugin-filepath.git", "cordova-android": "^10.1.2", "cordova-ios": "^6.2.0", @@ -135,6 +137,7 @@ "stylelint": "^13.12.0", "stylelint-config-standard": "^20.0.0", "ts-node": "~8.3.0", + "ts-proto": "^1.122.0", "tslint": "~6.1.0", "typescript": "~4.7.4", "webpack-subresource-integrity": "^1.5.2" @@ -8556,6 +8559,70 @@ "node": ">= 8" } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "dev": true + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "dev": true + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "dev": true + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "dev": true + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dev": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "dev": true + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "dev": true + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "dev": true + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "dev": true + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "dev": true + }, "node_modules/@schematics/angular": { "version": "12.2.14", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.14.tgz", @@ -8860,6 +8927,12 @@ "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", "dev": true }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "dev": true + }, "node_modules/@types/mdast": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", @@ -8899,12 +8972,28 @@ "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, + "node_modules/@types/object-hash": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.4.tgz", + "integrity": "sha512-xFdpkAkikBgqBdG9vIlsqffDV8GpvnPEzs0IUtr1v3BEB97ijsFQ4RXVbUZwjFThhB4MDSTUfvmxUD5PGx0wXA==", + "dev": true + }, "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "node_modules/@types/protobufjs": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/protobufjs/-/protobufjs-6.0.0.tgz", + "integrity": "sha512-A27RDExpAf3rdDjIrHKiJK6x8kqqJ4CmoChwtipfhVAn1p7+wviQFFP7dppn8FslSbHtQeVPvi8wNKkDjSYjHw==", + "deprecated": "This is a stub types definition for protobufjs (https://github.com/dcodeIO/ProtoBuf.js). protobufjs provides its own type definitions, so you don't need @types/protobufjs installed!", + "dev": true, + "dependencies": { + "protobufjs": "*" + } + }, "node_modules/@types/q": { "version": "0.0.32", "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", @@ -13157,6 +13246,12 @@ "node": ">= 6" } }, + "node_modules/dataloader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", + "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==", + "dev": true + }, "node_modules/date-format": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.11.tgz", @@ -18424,6 +18519,11 @@ "url": "https://tidelift.com/funding/github/npm/loglevel" } }, + "node_modules/long": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz", + "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w==" + }, "node_modules/longest-streak": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", @@ -20131,6 +20231,15 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -23467,6 +23576,37 @@ "node": ">= 0.3.1" } }, + "node_modules/protobufjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.0.0.tgz", + "integrity": "sha512-ffNIEm+quOcYtQvHdW406v1NQmZSuqVklxsXk076BtuFnlYZfigLU+JOMrTD8TUOyqHYbRI/fSVNvgd25YeN3w==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/@types/node": { + "version": "18.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.5.tgz", + "integrity": "sha512-NcKK6Ts+9LqdHJaW6HQmgr7dT/i3GOHG+pt6BiWv++5SnjtRd4NXeiuN2kA153SjhXPR/AhHIPHPbrsbpUVOww==", + "dev": true + }, "node_modules/protractor": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", @@ -27191,6 +27331,119 @@ "typescript": ">=2.0" } }, + "node_modules/ts-poet": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-4.15.0.tgz", + "integrity": "sha512-sLLR8yQBvHzi9d4R1F4pd+AzQxBfzOSSjfxiJxQhkUoH5bL7RsAC6wgvtVUQdGqiCsyS9rT6/8X2FI7ipdir5g==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15", + "prettier": "^2.5.1" + } + }, + "node_modules/ts-proto": { + "version": "1.122.0", + "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.122.0.tgz", + "integrity": "sha512-TmPKmSxRJjnfrdyncOMfilJDXvyL0BGxM4nDyYgMDVT2EhYZV85J93qEJPBIufwUtDBY8N42UNgja8Z5ObF6IA==", + "dev": true, + "dependencies": { + "@types/object-hash": "^1.3.0", + "dataloader": "^1.4.0", + "object-hash": "^1.3.1", + "protobufjs": "^6.11.3", + "ts-poet": "^4.15.0", + "ts-proto-descriptors": "1.7.1" + }, + "bin": { + "protoc-gen-ts_proto": "protoc-gen-ts_proto" + } + }, + "node_modules/ts-proto-descriptors": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.7.1.tgz", + "integrity": "sha512-oIKUh3K4Xts4v29USGLfUG+2mEk32MsqpgZAOUyUlkrcIdv34yE+k2oZ2Nzngm6cV/JgFdOxRCqeyvmWHuYAyw==", + "dev": true, + "dependencies": { + "long": "^4.0.0", + "protobufjs": "^6.8.8" + } + }, + "node_modules/ts-proto-descriptors/node_modules/@types/node": { + "version": "18.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.5.tgz", + "integrity": "sha512-NcKK6Ts+9LqdHJaW6HQmgr7dT/i3GOHG+pt6BiWv++5SnjtRd4NXeiuN2kA153SjhXPR/AhHIPHPbrsbpUVOww==", + "dev": true + }, + "node_modules/ts-proto-descriptors/node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "node_modules/ts-proto-descriptors/node_modules/protobufjs": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/ts-proto/node_modules/@types/node": { + "version": "18.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.5.tgz", + "integrity": "sha512-NcKK6Ts+9LqdHJaW6HQmgr7dT/i3GOHG+pt6BiWv++5SnjtRd4NXeiuN2kA153SjhXPR/AhHIPHPbrsbpUVOww==", + "dev": true + }, + "node_modules/ts-proto/node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "node_modules/ts-proto/node_modules/protobufjs": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, "node_modules/tslib": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", @@ -34612,6 +34865,70 @@ } } }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "dev": true + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "dev": true + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "dev": true + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "dev": true + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dev": true, + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "dev": true + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "dev": true + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "dev": true + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "dev": true + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "dev": true + }, "@schematics/angular": { "version": "12.2.14", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.14.tgz", @@ -34877,6 +35194,12 @@ "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", "dev": true }, + "@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "dev": true + }, "@types/mdast": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", @@ -34916,12 +35239,27 @@ "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, + "@types/object-hash": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.4.tgz", + "integrity": "sha512-xFdpkAkikBgqBdG9vIlsqffDV8GpvnPEzs0IUtr1v3BEB97ijsFQ4RXVbUZwjFThhB4MDSTUfvmxUD5PGx0wXA==", + "dev": true + }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "@types/protobufjs": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/protobufjs/-/protobufjs-6.0.0.tgz", + "integrity": "sha512-A27RDExpAf3rdDjIrHKiJK6x8kqqJ4CmoChwtipfhVAn1p7+wviQFFP7dppn8FslSbHtQeVPvi8wNKkDjSYjHw==", + "dev": true, + "requires": { + "protobufjs": "*" + } + }, "@types/q": { "version": "0.0.32", "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", @@ -38066,6 +38404,12 @@ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==" }, + "dataloader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", + "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==", + "dev": true + }, "date-format": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.11.tgz", @@ -41990,6 +42334,11 @@ "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", "dev": true }, + "long": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz", + "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w==" + }, "longest-streak": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", @@ -43289,6 +43638,12 @@ } } }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "dev": true + }, "object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -45724,6 +46079,35 @@ "string.prototype.codepointat": "^0.2.0" } }, + "protobufjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.0.0.tgz", + "integrity": "sha512-ffNIEm+quOcYtQvHdW406v1NQmZSuqVklxsXk076BtuFnlYZfigLU+JOMrTD8TUOyqHYbRI/fSVNvgd25YeN3w==", + "dev": true, + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "dependencies": { + "@types/node": { + "version": "18.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.5.tgz", + "integrity": "sha512-NcKK6Ts+9LqdHJaW6HQmgr7dT/i3GOHG+pt6BiWv++5SnjtRd4NXeiuN2kA153SjhXPR/AhHIPHPbrsbpUVOww==", + "dev": true + } + } + }, "protractor": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", @@ -48597,6 +48981,110 @@ "yn": "^3.0.0" } }, + "ts-poet": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-4.15.0.tgz", + "integrity": "sha512-sLLR8yQBvHzi9d4R1F4pd+AzQxBfzOSSjfxiJxQhkUoH5bL7RsAC6wgvtVUQdGqiCsyS9rT6/8X2FI7ipdir5g==", + "dev": true, + "requires": { + "lodash": "^4.17.15", + "prettier": "^2.5.1" + } + }, + "ts-proto": { + "version": "1.122.0", + "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.122.0.tgz", + "integrity": "sha512-TmPKmSxRJjnfrdyncOMfilJDXvyL0BGxM4nDyYgMDVT2EhYZV85J93qEJPBIufwUtDBY8N42UNgja8Z5ObF6IA==", + "dev": true, + "requires": { + "@types/object-hash": "^1.3.0", + "dataloader": "^1.4.0", + "object-hash": "^1.3.1", + "protobufjs": "^6.11.3", + "ts-poet": "^4.15.0", + "ts-proto-descriptors": "1.7.1" + }, + "dependencies": { + "@types/node": { + "version": "18.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.5.tgz", + "integrity": "sha512-NcKK6Ts+9LqdHJaW6HQmgr7dT/i3GOHG+pt6BiWv++5SnjtRd4NXeiuN2kA153SjhXPR/AhHIPHPbrsbpUVOww==", + "dev": true + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "protobufjs": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "dev": true, + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + } + } + } + }, + "ts-proto-descriptors": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.7.1.tgz", + "integrity": "sha512-oIKUh3K4Xts4v29USGLfUG+2mEk32MsqpgZAOUyUlkrcIdv34yE+k2oZ2Nzngm6cV/JgFdOxRCqeyvmWHuYAyw==", + "dev": true, + "requires": { + "long": "^4.0.0", + "protobufjs": "^6.8.8" + }, + "dependencies": { + "@types/node": { + "version": "18.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.5.tgz", + "integrity": "sha512-NcKK6Ts+9LqdHJaW6HQmgr7dT/i3GOHG+pt6BiWv++5SnjtRd4NXeiuN2kA153SjhXPR/AhHIPHPbrsbpUVOww==", + "dev": true + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "protobufjs": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "dev": true, + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + } + } + } + }, "tslib": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", diff --git a/package.json b/package.json index b89444003..86e1b88c8 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "e2e": "ng e2e", "sonar": "sh /Users/larssaalbach/Downloads/sonarqube-7.0/bin/macosx-universal-64/sonar.sh console", "sonar_scan": "/Users/larssaalbach/Downloads/sonar-scanner-4.2.0.1873-macosx/bin/sonar-scanner", - "prepare": "husky install" + "prepare": "husky install", + "generate_proto": "protoc --plugin=node_modules/ts-proto/protoc-gen-ts_proto --ts_proto_opt=snakeToCamel=false --ts_proto_out ./src/generated ./src/classes/bean/bean.proto" }, "private": true, "dependencies": { @@ -74,6 +75,7 @@ "javascript-color-gradient": "^1.3.2", "jsurl": "^0.1.5", "lodash": "^4.17.21", + "long": "^5.2.0", "luxon": "^2.3.0", "lz-string": "^1.4.4", "moment": "^2.29.1", @@ -99,6 +101,7 @@ "@types/jasminewd2": "~2.0.8", "@types/lodash": "^4.14.178", "@types/node": "^12.20.5", + "@types/protobufjs": "^6.0.0", "@wisdomgarden/cordova-plugin-filepath": "git+https://github.com/wisdom-garden/cordova-plugin-filepath.git", "cordova-android": "^10.1.2", "cordova-ios": "^6.2.0", @@ -143,6 +146,7 @@ "stylelint": "^13.12.0", "stylelint-config-standard": "^20.0.0", "ts-node": "~8.3.0", + "ts-proto": "^1.122.0", "tslint": "~6.1.0", "typescript": "~4.7.4", "webpack-subresource-integrity": "^1.5.2" diff --git a/src/classes/bean/bean.proto b/src/classes/bean/bean.proto new file mode 100644 index 000000000..9ac47b0d6 --- /dev/null +++ b/src/classes/bean/bean.proto @@ -0,0 +1,109 @@ +syntax = "proto3"; +package beanconqueror; + +message BeanProto { + string name = 1; + optional string buyDate = 2; + optional string roastingDate = 3; + optional string note = 4; + + optional string roaster = 5; + optional Config config = 6; + optional Roast roast = 7; + optional uint64 roast_range = 8; + optional BeanMix beanMix = 9; + + optional string roast_custom = 10; + optional string aromatics = 11; + optional uint64 weight = 12; + optional bool finished = 13; + optional uint64 cost = 14; + repeated string attachments = 15; + optional string cupping_points = 16; + optional bool decaffeinated = 17; + optional string url = 18; + optional string ean_article_number = 19; + + optional uint32 rating = 20; + + repeated BeanInformation bean_information = 21; + + optional BeanRoastingType bean_roasting_type = 22; + optional BeanRoastInformation bean_roast_information = 23; + + optional string qr_code = 24; + + optional bool favourite = 25; + optional bool shared = 26; +} + +message Config { + string uuid = 1; + uint64 unix_timestamp = 2; +} + +message BeanInformation { + optional string country = 1; + optional string region = 2; + optional string farm = 3; + optional string farmer = 4; + optional string elevation = 5; + optional string harvest_time = 6; + optional string variety = 7; + optional string processing = 8; + optional string certification = 9; + optional uint32 percentage = 10; + optional uint32 purchasing_price = 11; + optional uint32 fob_price = 12; +} + +message BeanRoastInformation { + optional uint32 drop_temperature = 1; + optional uint64 roast_length = 2; + optional string roaster_machine = 3; + optional uint64 green_bean_weight = 4; + optional uint32 outside_temperature = 5; + optional uint32 humidity = 6; + optional string bean_uuid = 7; + optional uint32 first_crack_minute = 8; + optional uint32 first_crack_temperature = 9; + optional uint32 second_crack_minute = 10; + optional uint32 second_crack_temperature = 11; +} + +enum Roast { + // UNKOWN + UNKNOWN_ROAST = 0; + // LIGHT + CINNAMON_ROAST = 1; + AMERICAN_ROAST = 2; + NEW_ENGLAND_ROAST = 3; + HALF_CITY_ROAST = 4; + MODERATE_LIGHT_ROAST = 5; + + // MEDIUM + CITY_ROAST = 6; + CITY_PLUS_ROAST = 7; + FULL_CITY_ROAST = 8; + + // DARK + FULL_CITY_PLUS_ROAST = 9; + ITALIAN_ROAST = 10; + VIEANNA_ROAST = 11; + FRENCH_ROAST = 12; + + CUSTOM_ROAST = 13; +} + +enum BeanMix { + UNKNOWN_BEAN_MIX = 0; + SINGLE_ORIGIN = 1; + BLEND = 2; +} + +enum BeanRoastingType { + UNKNOWN_BEAN_ROASTING_TYPE = 0; + FILTER = 1; + ESPRESSO = 2; + OMNI = 3; +} diff --git a/src/classes/bean/bean.ts b/src/classes/bean/bean.ts index 4a612995b..81a1fa1bb 100755 --- a/src/classes/bean/bean.ts +++ b/src/classes/bean/bean.ts @@ -1,17 +1,18 @@ /** Interfaces */ -import {BEAN_MIX_ENUM} from '../../enums/beans/mix'; +import { BEAN_MIX_ENUM } from '../../enums/beans/mix'; /** Enums */ -import {ROASTS_ENUM} from '../../enums/beans/roasts'; -import {IBean} from '../../interfaces/bean/iBean'; +import { ROASTS_ENUM } from '../../enums/beans/roasts'; +import { IBean } from '../../interfaces/bean/iBean'; /** Classes */ -import {Config} from '../objectConfig/objectConfig'; +import { Config } from '../objectConfig/objectConfig'; import moment from 'moment'; -import {BEAN_ROASTING_TYPE_ENUM} from '../../enums/beans/beanRoastingType'; -import {IBeanInformation} from '../../interfaces/bean/iBeanInformation'; -import {BeanRoastInformation} from './beanRoastInformation'; -import {RoastingMachine} from '../roasting-machine/roasting-machine'; -import {UIRoastingMachineStorage} from '../../services/uiRoastingMachineStorage'; -import {IRoastingMachine} from '../../interfaces/roasting-machine/iRoastingMachine'; +import { BEAN_ROASTING_TYPE_ENUM } from '../../enums/beans/beanRoastingType'; +import { IBeanInformation } from '../../interfaces/bean/iBeanInformation'; +import { BeanRoastInformation } from './beanRoastInformation'; +import { RoastingMachine } from '../roasting-machine/roasting-machine'; +import { UIRoastingMachineStorage } from '../../services/uiRoastingMachineStorage'; +import { IRoastingMachine } from '../../interfaces/roasting-machine/iRoastingMachine'; +import { BeanProto } from '../../generated/src/classes/bean/bean'; export class Bean implements IBean { public name: string; @@ -39,7 +40,6 @@ export class Bean implements IBean { public rating: number; - public bean_information: Array; public bean_roasting_type: BEAN_ROASTING_TYPE_ENUM; @@ -50,7 +50,7 @@ export class Bean implements IBean { public qr_code: string; public favourite: boolean; - public shared:boolean; + public shared: boolean; constructor() { this.name = ''; @@ -99,45 +99,58 @@ export class Bean implements IBean { // Newer version, this information may not exist if (beanObj.bean_roast_information) { this.bean_roast_information = new BeanRoastInformation(); - Object.assign(this.bean_roast_information, beanObj.bean_roast_information); + Object.assign( + this.bean_roast_information, + beanObj.bean_roast_information + ); } + } + public initializeBySharedProtoBean(beanObj: BeanProto): void { + Object.assign(this, beanObj); + // Newer version, this information may not exist + if (beanObj.bean_roast_information) { + this.bean_roast_information = new BeanRoastInformation(); + Object.assign( + this.bean_roast_information, + beanObj.bean_roast_information + ); + } } public fixDataTypes(): boolean { let fixNeeded: boolean = false; - if (Number(this.cost) !== this.cost) { this.cost = Number(this.cost); fixNeeded = true; } - if (Number(this.weight) !== this.weight) { this.weight = Number(this.weight); fixNeeded = true; } - return fixNeeded; } public beanAgeInDays(): number { - if (this.roastingDate !== null && this.roastingDate !== undefined && this.roastingDate !== '') { + if ( + this.roastingDate !== null && + this.roastingDate !== undefined && + this.roastingDate !== '' + ) { const today = moment(Date.now()).startOf('day'); const roastingDate = moment(this.roastingDate).startOf('day'); - return today.diff(roastingDate,'days'); + return today.diff(roastingDate, 'days'); } return 0; - } /** * Get the calculated bean age for this brew */ public getCalculatedBeanAge(): number { - const roastingDate = moment(this.roastingDate); const brewTime = moment.unix(moment().unix()); @@ -165,19 +178,17 @@ export class Bean implements IBean { } public getRoastingMachine(): RoastingMachine { - const iRoastingMachine: IRoastingMachine = this.getRoastingMachineStorage() - .getByUUID(this.bean_roast_information.roaster_machine) as IRoastingMachine; + const iRoastingMachine: IRoastingMachine = + this.getRoastingMachineStorage().getByUUID( + this.bean_roast_information.roaster_machine + ) as IRoastingMachine; const roastingMachine: RoastingMachine = new RoastingMachine(); roastingMachine.initializeByObject(iRoastingMachine); return roastingMachine; - } - public hasPhotos() { - return (this.attachments && this.attachments.length > 0); + return this.attachments && this.attachments.length > 0; } - - } diff --git a/src/generated/src/classes/bean/bean.ts b/src/generated/src/classes/bean/bean.ts new file mode 100644 index 000000000..a6cb9ed55 --- /dev/null +++ b/src/generated/src/classes/bean/bean.ts @@ -0,0 +1,1130 @@ +/* eslint-disable */ +import Long from 'long'; +import * as _m0 from 'protobufjs/minimal'; + +export const protobufPackage = 'beanconqueror'; + +export enum Roast { + /** UNKNOWN_ROAST - UNKOWN */ + UNKNOWN_ROAST = 0, + /** CINNAMON_ROAST - LIGHT */ + CINNAMON_ROAST = 1, + AMERICAN_ROAST = 2, + NEW_ENGLAND_ROAST = 3, + HALF_CITY_ROAST = 4, + MODERATE_LIGHT_ROAST = 5, + /** CITY_ROAST - MEDIUM */ + CITY_ROAST = 6, + CITY_PLUS_ROAST = 7, + FULL_CITY_ROAST = 8, + /** FULL_CITY_PLUS_ROAST - DARK */ + FULL_CITY_PLUS_ROAST = 9, + ITALIAN_ROAST = 10, + VIEANNA_ROAST = 11, + FRENCH_ROAST = 12, + CUSTOM_ROAST = 13, + UNRECOGNIZED = -1, +} + +export function roastFromJSON(object: any): Roast { + switch (object) { + case 0: + case 'UNKNOWN_ROAST': + return Roast.UNKNOWN_ROAST; + case 1: + case 'CINNAMON_ROAST': + return Roast.CINNAMON_ROAST; + case 2: + case 'AMERICAN_ROAST': + return Roast.AMERICAN_ROAST; + case 3: + case 'NEW_ENGLAND_ROAST': + return Roast.NEW_ENGLAND_ROAST; + case 4: + case 'HALF_CITY_ROAST': + return Roast.HALF_CITY_ROAST; + case 5: + case 'MODERATE_LIGHT_ROAST': + return Roast.MODERATE_LIGHT_ROAST; + case 6: + case 'CITY_ROAST': + return Roast.CITY_ROAST; + case 7: + case 'CITY_PLUS_ROAST': + return Roast.CITY_PLUS_ROAST; + case 8: + case 'FULL_CITY_ROAST': + return Roast.FULL_CITY_ROAST; + case 9: + case 'FULL_CITY_PLUS_ROAST': + return Roast.FULL_CITY_PLUS_ROAST; + case 10: + case 'ITALIAN_ROAST': + return Roast.ITALIAN_ROAST; + case 11: + case 'VIEANNA_ROAST': + return Roast.VIEANNA_ROAST; + case 12: + case 'FRENCH_ROAST': + return Roast.FRENCH_ROAST; + case 13: + case 'CUSTOM_ROAST': + return Roast.CUSTOM_ROAST; + case -1: + case 'UNRECOGNIZED': + default: + return Roast.UNRECOGNIZED; + } +} + +export function roastToJSON(object: Roast): string { + switch (object) { + case Roast.UNKNOWN_ROAST: + return 'UNKNOWN_ROAST'; + case Roast.CINNAMON_ROAST: + return 'CINNAMON_ROAST'; + case Roast.AMERICAN_ROAST: + return 'AMERICAN_ROAST'; + case Roast.NEW_ENGLAND_ROAST: + return 'NEW_ENGLAND_ROAST'; + case Roast.HALF_CITY_ROAST: + return 'HALF_CITY_ROAST'; + case Roast.MODERATE_LIGHT_ROAST: + return 'MODERATE_LIGHT_ROAST'; + case Roast.CITY_ROAST: + return 'CITY_ROAST'; + case Roast.CITY_PLUS_ROAST: + return 'CITY_PLUS_ROAST'; + case Roast.FULL_CITY_ROAST: + return 'FULL_CITY_ROAST'; + case Roast.FULL_CITY_PLUS_ROAST: + return 'FULL_CITY_PLUS_ROAST'; + case Roast.ITALIAN_ROAST: + return 'ITALIAN_ROAST'; + case Roast.VIEANNA_ROAST: + return 'VIEANNA_ROAST'; + case Roast.FRENCH_ROAST: + return 'FRENCH_ROAST'; + case Roast.CUSTOM_ROAST: + return 'CUSTOM_ROAST'; + case Roast.UNRECOGNIZED: + default: + return 'UNRECOGNIZED'; + } +} + +export enum BeanMix { + UNKNOWN_BEAN_MIX = 0, + SINGLE_ORIGIN = 1, + BLEND = 2, + UNRECOGNIZED = -1, +} + +export function beanMixFromJSON(object: any): BeanMix { + switch (object) { + case 0: + case 'UNKNOWN_BEAN_MIX': + return BeanMix.UNKNOWN_BEAN_MIX; + case 1: + case 'SINGLE_ORIGIN': + return BeanMix.SINGLE_ORIGIN; + case 2: + case 'BLEND': + return BeanMix.BLEND; + case -1: + case 'UNRECOGNIZED': + default: + return BeanMix.UNRECOGNIZED; + } +} + +export function beanMixToJSON(object: BeanMix): string { + switch (object) { + case BeanMix.UNKNOWN_BEAN_MIX: + return 'UNKNOWN_BEAN_MIX'; + case BeanMix.SINGLE_ORIGIN: + return 'SINGLE_ORIGIN'; + case BeanMix.BLEND: + return 'BLEND'; + case BeanMix.UNRECOGNIZED: + default: + return 'UNRECOGNIZED'; + } +} + +export enum BeanRoastingType { + UNKNOWN_BEAN_ROASTING_TYPE = 0, + FILTER = 1, + ESPRESSO = 2, + OMNI = 3, + UNRECOGNIZED = -1, +} + +export function beanRoastingTypeFromJSON(object: any): BeanRoastingType { + switch (object) { + case 0: + case 'UNKNOWN_BEAN_ROASTING_TYPE': + return BeanRoastingType.UNKNOWN_BEAN_ROASTING_TYPE; + case 1: + case 'FILTER': + return BeanRoastingType.FILTER; + case 2: + case 'ESPRESSO': + return BeanRoastingType.ESPRESSO; + case 3: + case 'OMNI': + return BeanRoastingType.OMNI; + case -1: + case 'UNRECOGNIZED': + default: + return BeanRoastingType.UNRECOGNIZED; + } +} + +export function beanRoastingTypeToJSON(object: BeanRoastingType): string { + switch (object) { + case BeanRoastingType.UNKNOWN_BEAN_ROASTING_TYPE: + return 'UNKNOWN_BEAN_ROASTING_TYPE'; + case BeanRoastingType.FILTER: + return 'FILTER'; + case BeanRoastingType.ESPRESSO: + return 'ESPRESSO'; + case BeanRoastingType.OMNI: + return 'OMNI'; + case BeanRoastingType.UNRECOGNIZED: + default: + return 'UNRECOGNIZED'; + } +} + +export interface BeanProto { + name: string; + buyDate?: string | undefined; + roastingDate?: string | undefined; + note?: string | undefined; + roaster?: string | undefined; + config?: Config | undefined; + roast?: Roast | undefined; + roast_range?: number | undefined; + beanMix?: BeanMix | undefined; + roast_custom?: string | undefined; + aromatics?: string | undefined; + weight?: number | undefined; + finished?: boolean | undefined; + cost?: number | undefined; + attachments: string[]; + cupping_points?: string | undefined; + decaffeinated?: boolean | undefined; + url?: string | undefined; + ean_article_number?: string | undefined; + rating?: number | undefined; + bean_information: BeanInformation[]; + bean_roasting_type?: BeanRoastingType | undefined; + bean_roast_information?: BeanRoastInformation | undefined; + qr_code?: string | undefined; + favourite?: boolean | undefined; + shared?: boolean | undefined; +} + +export interface Config { + uuid: string; + unix_timestamp: number; +} + +export interface BeanInformation { + country?: string | undefined; + region?: string | undefined; + farm?: string | undefined; + farmer?: string | undefined; + elevation?: string | undefined; + harvest_time?: string | undefined; + variety?: string | undefined; + processing?: string | undefined; + certification?: string | undefined; + percentage?: number | undefined; + purchasing_price?: number | undefined; + fob_price?: number | undefined; +} + +export interface BeanRoastInformation { + drop_temperature?: number | undefined; + roast_length?: number | undefined; + roaster_machine?: string | undefined; + green_bean_weight?: number | undefined; + outside_temperature?: number | undefined; + humidity?: number | undefined; + bean_uuid?: string | undefined; + first_crack_minute?: number | undefined; + first_crack_temperature?: number | undefined; + second_crack_minute?: number | undefined; + second_crack_temperature?: number | undefined; +} + +function createBaseBeanProto(): BeanProto { + return { + name: '', + buyDate: undefined, + roastingDate: undefined, + note: undefined, + roaster: undefined, + config: undefined, + roast: undefined, + roast_range: undefined, + beanMix: undefined, + roast_custom: undefined, + aromatics: undefined, + weight: undefined, + finished: undefined, + cost: undefined, + attachments: [], + cupping_points: undefined, + decaffeinated: undefined, + url: undefined, + ean_article_number: undefined, + rating: undefined, + bean_information: [], + bean_roasting_type: undefined, + bean_roast_information: undefined, + qr_code: undefined, + favourite: undefined, + shared: undefined, + }; +} + +export const BeanProto = { + encode( + message: BeanProto, + writer: _m0.Writer = _m0.Writer.create() + ): _m0.Writer { + if (message.name !== '') { + writer.uint32(10).string(message.name); + } + if (message.buyDate !== undefined) { + writer.uint32(18).string(message.buyDate); + } + if (message.roastingDate !== undefined) { + writer.uint32(26).string(message.roastingDate); + } + if (message.note !== undefined) { + writer.uint32(34).string(message.note); + } + if (message.roaster !== undefined) { + writer.uint32(42).string(message.roaster); + } + if (message.config !== undefined) { + Config.encode(message.config, writer.uint32(50).fork()).ldelim(); + } + if (message.roast !== undefined) { + writer.uint32(56).int32(message.roast); + } + if (message.roast_range !== undefined) { + writer.uint32(64).uint64(message.roast_range); + } + if (message.beanMix !== undefined) { + writer.uint32(72).int32(message.beanMix); + } + if (message.roast_custom !== undefined) { + writer.uint32(82).string(message.roast_custom); + } + if (message.aromatics !== undefined) { + writer.uint32(90).string(message.aromatics); + } + if (message.weight !== undefined) { + writer.uint32(96).uint64(message.weight); + } + if (message.finished !== undefined) { + writer.uint32(104).bool(message.finished); + } + if (message.cost !== undefined) { + writer.uint32(112).uint64(message.cost); + } + for (const v of message.attachments) { + writer.uint32(122).string(v!); + } + if (message.cupping_points !== undefined) { + writer.uint32(130).string(message.cupping_points); + } + if (message.decaffeinated !== undefined) { + writer.uint32(136).bool(message.decaffeinated); + } + if (message.url !== undefined) { + writer.uint32(146).string(message.url); + } + if (message.ean_article_number !== undefined) { + writer.uint32(154).string(message.ean_article_number); + } + if (message.rating !== undefined) { + writer.uint32(160).uint32(message.rating); + } + for (const v of message.bean_information) { + BeanInformation.encode(v!, writer.uint32(170).fork()).ldelim(); + } + if (message.bean_roasting_type !== undefined) { + writer.uint32(176).int32(message.bean_roasting_type); + } + if (message.bean_roast_information !== undefined) { + BeanRoastInformation.encode( + message.bean_roast_information, + writer.uint32(186).fork() + ).ldelim(); + } + if (message.qr_code !== undefined) { + writer.uint32(194).string(message.qr_code); + } + if (message.favourite !== undefined) { + writer.uint32(200).bool(message.favourite); + } + if (message.shared !== undefined) { + writer.uint32(208).bool(message.shared); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): BeanProto { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseBeanProto(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.name = reader.string(); + break; + case 2: + message.buyDate = reader.string(); + break; + case 3: + message.roastingDate = reader.string(); + break; + case 4: + message.note = reader.string(); + break; + case 5: + message.roaster = reader.string(); + break; + case 6: + message.config = Config.decode(reader, reader.uint32()); + break; + case 7: + message.roast = reader.int32() as any; + break; + case 8: + message.roast_range = longToNumber(reader.uint64() as Long); + break; + case 9: + message.beanMix = reader.int32() as any; + break; + case 10: + message.roast_custom = reader.string(); + break; + case 11: + message.aromatics = reader.string(); + break; + case 12: + message.weight = longToNumber(reader.uint64() as Long); + break; + case 13: + message.finished = reader.bool(); + break; + case 14: + message.cost = longToNumber(reader.uint64() as Long); + break; + case 15: + message.attachments.push(reader.string()); + break; + case 16: + message.cupping_points = reader.string(); + break; + case 17: + message.decaffeinated = reader.bool(); + break; + case 18: + message.url = reader.string(); + break; + case 19: + message.ean_article_number = reader.string(); + break; + case 20: + message.rating = reader.uint32(); + break; + case 21: + message.bean_information.push( + BeanInformation.decode(reader, reader.uint32()) + ); + break; + case 22: + message.bean_roasting_type = reader.int32() as any; + break; + case 23: + message.bean_roast_information = BeanRoastInformation.decode( + reader, + reader.uint32() + ); + break; + case 24: + message.qr_code = reader.string(); + break; + case 25: + message.favourite = reader.bool(); + break; + case 26: + message.shared = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): BeanProto { + return { + name: isSet(object.name) ? String(object.name) : '', + buyDate: isSet(object.buyDate) ? String(object.buyDate) : undefined, + roastingDate: isSet(object.roastingDate) + ? String(object.roastingDate) + : undefined, + note: isSet(object.note) ? String(object.note) : undefined, + roaster: isSet(object.roaster) ? String(object.roaster) : undefined, + config: isSet(object.config) ? Config.fromJSON(object.config) : undefined, + roast: isSet(object.roast) ? roastFromJSON(object.roast) : undefined, + roast_range: isSet(object.roast_range) + ? Number(object.roast_range) + : undefined, + beanMix: isSet(object.beanMix) + ? beanMixFromJSON(object.beanMix) + : undefined, + roast_custom: isSet(object.roast_custom) + ? String(object.roast_custom) + : undefined, + aromatics: isSet(object.aromatics) ? String(object.aromatics) : undefined, + weight: isSet(object.weight) ? Number(object.weight) : undefined, + finished: isSet(object.finished) ? Boolean(object.finished) : undefined, + cost: isSet(object.cost) ? Number(object.cost) : undefined, + attachments: Array.isArray(object?.attachments) + ? object.attachments.map((e: any) => String(e)) + : [], + cupping_points: isSet(object.cupping_points) + ? String(object.cupping_points) + : undefined, + decaffeinated: isSet(object.decaffeinated) + ? Boolean(object.decaffeinated) + : undefined, + url: isSet(object.url) ? String(object.url) : undefined, + ean_article_number: isSet(object.ean_article_number) + ? String(object.ean_article_number) + : undefined, + rating: isSet(object.rating) ? Number(object.rating) : undefined, + bean_information: Array.isArray(object?.bean_information) + ? object.bean_information.map((e: any) => BeanInformation.fromJSON(e)) + : [], + bean_roasting_type: isSet(object.bean_roasting_type) + ? beanRoastingTypeFromJSON(object.bean_roasting_type) + : undefined, + bean_roast_information: isSet(object.bean_roast_information) + ? BeanRoastInformation.fromJSON(object.bean_roast_information) + : undefined, + qr_code: isSet(object.qr_code) ? String(object.qr_code) : undefined, + favourite: isSet(object.favourite) + ? Boolean(object.favourite) + : undefined, + shared: isSet(object.shared) ? Boolean(object.shared) : undefined, + }; + }, + + toJSON(message: BeanProto): unknown { + const obj: any = {}; + message.name !== undefined && (obj.name = message.name); + message.buyDate !== undefined && (obj.buyDate = message.buyDate); + message.roastingDate !== undefined && + (obj.roastingDate = message.roastingDate); + message.note !== undefined && (obj.note = message.note); + message.roaster !== undefined && (obj.roaster = message.roaster); + message.config !== undefined && + (obj.config = message.config ? Config.toJSON(message.config) : undefined); + message.roast !== undefined && + (obj.roast = + message.roast !== undefined ? roastToJSON(message.roast) : undefined); + message.roast_range !== undefined && + (obj.roast_range = Math.round(message.roast_range)); + message.beanMix !== undefined && + (obj.beanMix = + message.beanMix !== undefined + ? beanMixToJSON(message.beanMix) + : undefined); + message.roast_custom !== undefined && + (obj.roast_custom = message.roast_custom); + message.aromatics !== undefined && (obj.aromatics = message.aromatics); + message.weight !== undefined && (obj.weight = Math.round(message.weight)); + message.finished !== undefined && (obj.finished = message.finished); + message.cost !== undefined && (obj.cost = Math.round(message.cost)); + if (message.attachments) { + obj.attachments = message.attachments.map((e) => e); + } else { + obj.attachments = []; + } + message.cupping_points !== undefined && + (obj.cupping_points = message.cupping_points); + message.decaffeinated !== undefined && + (obj.decaffeinated = message.decaffeinated); + message.url !== undefined && (obj.url = message.url); + message.ean_article_number !== undefined && + (obj.ean_article_number = message.ean_article_number); + message.rating !== undefined && (obj.rating = Math.round(message.rating)); + if (message.bean_information) { + obj.bean_information = message.bean_information.map((e) => + e ? BeanInformation.toJSON(e) : undefined + ); + } else { + obj.bean_information = []; + } + message.bean_roasting_type !== undefined && + (obj.bean_roasting_type = + message.bean_roasting_type !== undefined + ? beanRoastingTypeToJSON(message.bean_roasting_type) + : undefined); + message.bean_roast_information !== undefined && + (obj.bean_roast_information = message.bean_roast_information + ? BeanRoastInformation.toJSON(message.bean_roast_information) + : undefined); + message.qr_code !== undefined && (obj.qr_code = message.qr_code); + message.favourite !== undefined && (obj.favourite = message.favourite); + message.shared !== undefined && (obj.shared = message.shared); + return obj; + }, + + fromPartial, I>>( + object: I + ): BeanProto { + const message = createBaseBeanProto(); + message.name = object.name ?? ''; + message.buyDate = object.buyDate ?? undefined; + message.roastingDate = object.roastingDate ?? undefined; + message.note = object.note ?? undefined; + message.roaster = object.roaster ?? undefined; + message.config = + object.config !== undefined && object.config !== null + ? Config.fromPartial(object.config) + : undefined; + message.roast = object.roast ?? undefined; + message.roast_range = object.roast_range ?? undefined; + message.beanMix = object.beanMix ?? undefined; + message.roast_custom = object.roast_custom ?? undefined; + message.aromatics = object.aromatics ?? undefined; + message.weight = object.weight ?? undefined; + message.finished = object.finished ?? undefined; + message.cost = object.cost ?? undefined; + message.attachments = object.attachments?.map((e) => e) || []; + message.cupping_points = object.cupping_points ?? undefined; + message.decaffeinated = object.decaffeinated ?? undefined; + message.url = object.url ?? undefined; + message.ean_article_number = object.ean_article_number ?? undefined; + message.rating = object.rating ?? undefined; + message.bean_information = + object.bean_information?.map((e) => BeanInformation.fromPartial(e)) || []; + message.bean_roasting_type = object.bean_roasting_type ?? undefined; + message.bean_roast_information = + object.bean_roast_information !== undefined && + object.bean_roast_information !== null + ? BeanRoastInformation.fromPartial(object.bean_roast_information) + : undefined; + message.qr_code = object.qr_code ?? undefined; + message.favourite = object.favourite ?? undefined; + message.shared = object.shared ?? undefined; + return message; + }, +}; + +function createBaseConfig(): Config { + return { uuid: '', unix_timestamp: 0 }; +} + +export const Config = { + encode( + message: Config, + writer: _m0.Writer = _m0.Writer.create() + ): _m0.Writer { + if (message.uuid !== '') { + writer.uint32(10).string(message.uuid); + } + if (message.unix_timestamp !== 0) { + writer.uint32(16).uint64(message.unix_timestamp); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Config { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseConfig(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.uuid = reader.string(); + break; + case 2: + message.unix_timestamp = longToNumber(reader.uint64() as Long); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): Config { + return { + uuid: isSet(object.uuid) ? String(object.uuid) : '', + unix_timestamp: isSet(object.unix_timestamp) + ? Number(object.unix_timestamp) + : 0, + }; + }, + + toJSON(message: Config): unknown { + const obj: any = {}; + message.uuid !== undefined && (obj.uuid = message.uuid); + message.unix_timestamp !== undefined && + (obj.unix_timestamp = Math.round(message.unix_timestamp)); + return obj; + }, + + fromPartial, I>>(object: I): Config { + const message = createBaseConfig(); + message.uuid = object.uuid ?? ''; + message.unix_timestamp = object.unix_timestamp ?? 0; + return message; + }, +}; + +function createBaseBeanInformation(): BeanInformation { + return { + country: undefined, + region: undefined, + farm: undefined, + farmer: undefined, + elevation: undefined, + harvest_time: undefined, + variety: undefined, + processing: undefined, + certification: undefined, + percentage: undefined, + purchasing_price: undefined, + fob_price: undefined, + }; +} + +export const BeanInformation = { + encode( + message: BeanInformation, + writer: _m0.Writer = _m0.Writer.create() + ): _m0.Writer { + if (message.country !== undefined) { + writer.uint32(10).string(message.country); + } + if (message.region !== undefined) { + writer.uint32(18).string(message.region); + } + if (message.farm !== undefined) { + writer.uint32(26).string(message.farm); + } + if (message.farmer !== undefined) { + writer.uint32(34).string(message.farmer); + } + if (message.elevation !== undefined) { + writer.uint32(42).string(message.elevation); + } + if (message.harvest_time !== undefined) { + writer.uint32(50).string(message.harvest_time); + } + if (message.variety !== undefined) { + writer.uint32(58).string(message.variety); + } + if (message.processing !== undefined) { + writer.uint32(66).string(message.processing); + } + if (message.certification !== undefined) { + writer.uint32(74).string(message.certification); + } + if (message.percentage !== undefined) { + writer.uint32(80).uint32(message.percentage); + } + if (message.purchasing_price !== undefined) { + writer.uint32(88).uint32(message.purchasing_price); + } + if (message.fob_price !== undefined) { + writer.uint32(96).uint32(message.fob_price); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): BeanInformation { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseBeanInformation(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.country = reader.string(); + break; + case 2: + message.region = reader.string(); + break; + case 3: + message.farm = reader.string(); + break; + case 4: + message.farmer = reader.string(); + break; + case 5: + message.elevation = reader.string(); + break; + case 6: + message.harvest_time = reader.string(); + break; + case 7: + message.variety = reader.string(); + break; + case 8: + message.processing = reader.string(); + break; + case 9: + message.certification = reader.string(); + break; + case 10: + message.percentage = reader.uint32(); + break; + case 11: + message.purchasing_price = reader.uint32(); + break; + case 12: + message.fob_price = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): BeanInformation { + return { + country: isSet(object.country) ? String(object.country) : undefined, + region: isSet(object.region) ? String(object.region) : undefined, + farm: isSet(object.farm) ? String(object.farm) : undefined, + farmer: isSet(object.farmer) ? String(object.farmer) : undefined, + elevation: isSet(object.elevation) ? String(object.elevation) : undefined, + harvest_time: isSet(object.harvest_time) + ? String(object.harvest_time) + : undefined, + variety: isSet(object.variety) ? String(object.variety) : undefined, + processing: isSet(object.processing) + ? String(object.processing) + : undefined, + certification: isSet(object.certification) + ? String(object.certification) + : undefined, + percentage: isSet(object.percentage) + ? Number(object.percentage) + : undefined, + purchasing_price: isSet(object.purchasing_price) + ? Number(object.purchasing_price) + : undefined, + fob_price: isSet(object.fob_price) ? Number(object.fob_price) : undefined, + }; + }, + + toJSON(message: BeanInformation): unknown { + const obj: any = {}; + message.country !== undefined && (obj.country = message.country); + message.region !== undefined && (obj.region = message.region); + message.farm !== undefined && (obj.farm = message.farm); + message.farmer !== undefined && (obj.farmer = message.farmer); + message.elevation !== undefined && (obj.elevation = message.elevation); + message.harvest_time !== undefined && + (obj.harvest_time = message.harvest_time); + message.variety !== undefined && (obj.variety = message.variety); + message.processing !== undefined && (obj.processing = message.processing); + message.certification !== undefined && + (obj.certification = message.certification); + message.percentage !== undefined && + (obj.percentage = Math.round(message.percentage)); + message.purchasing_price !== undefined && + (obj.purchasing_price = Math.round(message.purchasing_price)); + message.fob_price !== undefined && + (obj.fob_price = Math.round(message.fob_price)); + return obj; + }, + + fromPartial, I>>( + object: I + ): BeanInformation { + const message = createBaseBeanInformation(); + message.country = object.country ?? undefined; + message.region = object.region ?? undefined; + message.farm = object.farm ?? undefined; + message.farmer = object.farmer ?? undefined; + message.elevation = object.elevation ?? undefined; + message.harvest_time = object.harvest_time ?? undefined; + message.variety = object.variety ?? undefined; + message.processing = object.processing ?? undefined; + message.certification = object.certification ?? undefined; + message.percentage = object.percentage ?? undefined; + message.purchasing_price = object.purchasing_price ?? undefined; + message.fob_price = object.fob_price ?? undefined; + return message; + }, +}; + +function createBaseBeanRoastInformation(): BeanRoastInformation { + return { + drop_temperature: undefined, + roast_length: undefined, + roaster_machine: undefined, + green_bean_weight: undefined, + outside_temperature: undefined, + humidity: undefined, + bean_uuid: undefined, + first_crack_minute: undefined, + first_crack_temperature: undefined, + second_crack_minute: undefined, + second_crack_temperature: undefined, + }; +} + +export const BeanRoastInformation = { + encode( + message: BeanRoastInformation, + writer: _m0.Writer = _m0.Writer.create() + ): _m0.Writer { + if (message.drop_temperature !== undefined) { + writer.uint32(8).uint32(message.drop_temperature); + } + if (message.roast_length !== undefined) { + writer.uint32(16).uint64(message.roast_length); + } + if (message.roaster_machine !== undefined) { + writer.uint32(26).string(message.roaster_machine); + } + if (message.green_bean_weight !== undefined) { + writer.uint32(32).uint64(message.green_bean_weight); + } + if (message.outside_temperature !== undefined) { + writer.uint32(40).uint32(message.outside_temperature); + } + if (message.humidity !== undefined) { + writer.uint32(48).uint32(message.humidity); + } + if (message.bean_uuid !== undefined) { + writer.uint32(58).string(message.bean_uuid); + } + if (message.first_crack_minute !== undefined) { + writer.uint32(64).uint32(message.first_crack_minute); + } + if (message.first_crack_temperature !== undefined) { + writer.uint32(72).uint32(message.first_crack_temperature); + } + if (message.second_crack_minute !== undefined) { + writer.uint32(80).uint32(message.second_crack_minute); + } + if (message.second_crack_temperature !== undefined) { + writer.uint32(88).uint32(message.second_crack_temperature); + } + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number + ): BeanRoastInformation { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseBeanRoastInformation(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.drop_temperature = reader.uint32(); + break; + case 2: + message.roast_length = longToNumber(reader.uint64() as Long); + break; + case 3: + message.roaster_machine = reader.string(); + break; + case 4: + message.green_bean_weight = longToNumber(reader.uint64() as Long); + break; + case 5: + message.outside_temperature = reader.uint32(); + break; + case 6: + message.humidity = reader.uint32(); + break; + case 7: + message.bean_uuid = reader.string(); + break; + case 8: + message.first_crack_minute = reader.uint32(); + break; + case 9: + message.first_crack_temperature = reader.uint32(); + break; + case 10: + message.second_crack_minute = reader.uint32(); + break; + case 11: + message.second_crack_temperature = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): BeanRoastInformation { + return { + drop_temperature: isSet(object.drop_temperature) + ? Number(object.drop_temperature) + : undefined, + roast_length: isSet(object.roast_length) + ? Number(object.roast_length) + : undefined, + roaster_machine: isSet(object.roaster_machine) + ? String(object.roaster_machine) + : undefined, + green_bean_weight: isSet(object.green_bean_weight) + ? Number(object.green_bean_weight) + : undefined, + outside_temperature: isSet(object.outside_temperature) + ? Number(object.outside_temperature) + : undefined, + humidity: isSet(object.humidity) ? Number(object.humidity) : undefined, + bean_uuid: isSet(object.bean_uuid) ? String(object.bean_uuid) : undefined, + first_crack_minute: isSet(object.first_crack_minute) + ? Number(object.first_crack_minute) + : undefined, + first_crack_temperature: isSet(object.first_crack_temperature) + ? Number(object.first_crack_temperature) + : undefined, + second_crack_minute: isSet(object.second_crack_minute) + ? Number(object.second_crack_minute) + : undefined, + second_crack_temperature: isSet(object.second_crack_temperature) + ? Number(object.second_crack_temperature) + : undefined, + }; + }, + + toJSON(message: BeanRoastInformation): unknown { + const obj: any = {}; + message.drop_temperature !== undefined && + (obj.drop_temperature = Math.round(message.drop_temperature)); + message.roast_length !== undefined && + (obj.roast_length = Math.round(message.roast_length)); + message.roaster_machine !== undefined && + (obj.roaster_machine = message.roaster_machine); + message.green_bean_weight !== undefined && + (obj.green_bean_weight = Math.round(message.green_bean_weight)); + message.outside_temperature !== undefined && + (obj.outside_temperature = Math.round(message.outside_temperature)); + message.humidity !== undefined && + (obj.humidity = Math.round(message.humidity)); + message.bean_uuid !== undefined && (obj.bean_uuid = message.bean_uuid); + message.first_crack_minute !== undefined && + (obj.first_crack_minute = Math.round(message.first_crack_minute)); + message.first_crack_temperature !== undefined && + (obj.first_crack_temperature = Math.round( + message.first_crack_temperature + )); + message.second_crack_minute !== undefined && + (obj.second_crack_minute = Math.round(message.second_crack_minute)); + message.second_crack_temperature !== undefined && + (obj.second_crack_temperature = Math.round( + message.second_crack_temperature + )); + return obj; + }, + + fromPartial, I>>( + object: I + ): BeanRoastInformation { + const message = createBaseBeanRoastInformation(); + message.drop_temperature = object.drop_temperature ?? undefined; + message.roast_length = object.roast_length ?? undefined; + message.roaster_machine = object.roaster_machine ?? undefined; + message.green_bean_weight = object.green_bean_weight ?? undefined; + message.outside_temperature = object.outside_temperature ?? undefined; + message.humidity = object.humidity ?? undefined; + message.bean_uuid = object.bean_uuid ?? undefined; + message.first_crack_minute = object.first_crack_minute ?? undefined; + message.first_crack_temperature = + object.first_crack_temperature ?? undefined; + message.second_crack_minute = object.second_crack_minute ?? undefined; + message.second_crack_temperature = + object.second_crack_temperature ?? undefined; + return message; + }, +}; + +declare var self: any | undefined; +declare var window: any | undefined; +declare var global: any | undefined; +var globalThis: any = (() => { + if (typeof globalThis !== 'undefined') return globalThis; + if (typeof self !== 'undefined') return self; + if (typeof window !== 'undefined') return window; + if (typeof global !== 'undefined') return global; + throw 'Unable to locate global object'; +})(); + +type Builtin = + | Date + | Function + | Uint8Array + | string + | number + | boolean + | undefined; + +export type DeepPartial = T extends Builtin + ? T + : T extends Array + ? Array> + : T extends ReadonlyArray + ? ReadonlyArray> + : T extends {} + ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin + ? P + : P & { [K in keyof P]: Exact } & { + [K in Exclude>]: never; + }; + +function longToNumber(long: Long): number { + if (long.gt(Number.MAX_SAFE_INTEGER)) { + throw new globalThis.Error('Value is larger than Number.MAX_SAFE_INTEGER'); + } + return long.toNumber(); +} + +// If you get a compile-error about 'Constructor and ... have no overlap', +// add '--ts_proto_opt=esModuleInterop=true' as a flag when calling 'protoc'. +if (_m0.util.Long !== Long) { + _m0.util.Long = Long as any; + _m0.configure(); +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/src/services/intentHandler/intent-handler.service.ts b/src/services/intentHandler/intent-handler.service.ts index d05b63202..f9bcb6a17 100644 --- a/src/services/intentHandler/intent-handler.service.ts +++ b/src/services/intentHandler/intent-handler.service.ts @@ -1,60 +1,63 @@ import { Injectable } from '@angular/core'; -import {UIHelper} from '../uiHelper'; -import {Deeplinks} from '@ionic-native/deeplinks/ngx'; - -import {UILog} from '../uiLog'; -import {ServerCommunicationService} from '../serverCommunication/server-communication.service'; -import {UIBeanHelper} from '../uiBeanHelper'; -import {ServerBean} from '../../models/bean/serverBean'; -import {UIAlert} from '../uiAlert'; +import { UIHelper } from '../uiHelper'; +import { Deeplinks } from '@ionic-native/deeplinks/ngx'; + +import { UILog } from '../uiLog'; +import { ServerCommunicationService } from '../serverCommunication/server-communication.service'; +import { UIBeanHelper } from '../uiBeanHelper'; +import { ServerBean } from '../../models/bean/serverBean'; +import { UIAlert } from '../uiAlert'; import QR_TRACKING from '../../data/tracking/qrTracking'; -import {UIAnalytics} from '../uiAnalytics'; +import { UIAnalytics } from '../uiAnalytics'; declare var window; declare var IonicDeeplink; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class IntentHandlerService { - public static SUPPORTED_INTENTS = { ADD_BEAN_ONLINE: 'ADD_BEAN_ONLINE', - ADD_USER_BEAN: 'ADD_USER_BEAN' + ADD_USER_BEAN: 'ADD_USER_BEAN', }; - constructor(private readonly uiHelper: UIHelper, - private readonly deeplinks: Deeplinks, - private readonly uiLog: UILog, - private readonly serverCommunicationService: ServerCommunicationService, - private readonly uiBeanHelper: UIBeanHelper, - private readonly uiAlert: UIAlert, - private readonly uiAnalytics: UIAnalytics) { } + constructor( + private readonly uiHelper: UIHelper, + private readonly deeplinks: Deeplinks, + private readonly uiLog: UILog, + private readonly serverCommunicationService: ServerCommunicationService, + private readonly uiBeanHelper: UIBeanHelper, + private readonly uiAlert: UIAlert, + private readonly uiAnalytics: UIAnalytics + ) {} public attachOnHandleOpenUrl() { - - IonicDeeplink.route({ - '/NO_LINK_EVER_WILL_WORK_HERE/': '/NO_LINK_EVER_WILL_WORK_HERE/' - }, (match) => { - this.uiLog.log('Deeplink matched ' + JSON.stringify(match)); - this.handleDeepLink(match.$link); - }, (nomatch) => { - this.uiLog.log('Deeplink not matched ' + JSON.stringify(nomatch)); - this.handleDeepLink(nomatch.$link); - }); + IonicDeeplink.route( + { + '/NO_LINK_EVER_WILL_WORK_HERE/': '/NO_LINK_EVER_WILL_WORK_HERE/', + }, + (match) => { + this.uiLog.log('Deeplink matched ' + JSON.stringify(match)); + this.handleDeepLink(match.$link); + }, + (nomatch) => { + this.uiLog.log('Deeplink not matched ' + JSON.stringify(nomatch)); + this.handleDeepLink(nomatch.$link); + } + ); } - private findGetParameter(_url: string,_parameterName: string) { + private findGetParameter(_url: string, _parameterName: string) { let result = null, tmp = []; - _url.split('&') - .forEach( (item) => { - tmp = item.split('='); - if (tmp[0] === _parameterName) { - result = decodeURIComponent(tmp[1]); - } - }); + _url.split('&').forEach((item) => { + tmp = item.split('='); + if (tmp[0] === _parameterName) { + result = decodeURIComponent(tmp[1]); + } + }); return result; } - private findParameterByCompleteUrl(_url,_parameter) { + private findParameterByCompleteUrl(_url, _parameter) { const urlObj: any = new window.URL(_url); const val = urlObj.searchParams.get(_parameter); return val; @@ -64,12 +67,25 @@ export class IntentHandlerService { await this.uiHelper.isBeanconqurorAppReady().then(async () => { const url: string = _url; this.uiLog.log('Handle QR Code Link: ' + url); - if (url.indexOf('https://beanconqueror.com/?qr=') === 0 || url.indexOf('https://beanconqueror.com?qr=') === 0) { - this.uiAnalytics.trackEvent(QR_TRACKING.TITLE, QR_TRACKING.ACTIONS.SCAN); - const qrCodeId: string = String(this.findParameterByCompleteUrl(url,'qr')); + if ( + url.indexOf('https://beanconqueror.com/?qr=') === 0 || + url.indexOf('https://beanconqueror.com?qr=') === 0 + ) { + this.uiAnalytics.trackEvent( + QR_TRACKING.TITLE, + QR_TRACKING.ACTIONS.SCAN + ); + const qrCodeId: string = String( + this.findParameterByCompleteUrl(url, 'qr') + ); await this.addBeanFromServer(qrCodeId); } else { - this.uiAlert.showMessage('QR.WRONG_QRCODE_DESCRIPTION','QR.WRONG_QRCODE_TITLE',undefined,true); + this.uiAlert.showMessage( + 'QR.WRONG_QRCODE_DESCRIPTION', + 'QR.WRONG_QRCODE_TITLE', + undefined, + true + ); } }); } @@ -81,82 +97,109 @@ export class IntentHandlerService { const url: string = _matchLink.url; this.uiLog.log('Handle deeplink: ' + url); - if (url.indexOf('https://beanconqueror.com/?qr=') === 0 || url.indexOf('https://beanconqueror.com?qr=') === 0) { - const qrCodeId: string = String(this.findGetParameter(_matchLink.queryString,'qr')); + if ( + url.indexOf('https://beanconqueror.com/?qr=') === 0 || + url.indexOf('https://beanconqueror.com?qr=') === 0 + ) { + const qrCodeId: string = String( + this.findGetParameter(_matchLink.queryString, 'qr') + ); await this.addBeanFromServer(qrCodeId); } else if (url.indexOf('beanconqueror://ADD_BEAN_ONLINE?') === 0) { - const qrCodeId: string = String(this.findGetParameter(_matchLink.queryString,'id')); + const qrCodeId: string = String( + this.findGetParameter(_matchLink.queryString, 'id') + ); await this.addBeanFromServer(qrCodeId); - } - else if (url.indexOf('https://beanconqueror.com/?shareUserBean0=') === 0 || url.indexOf('https://beanconqueror.com?shareUserBean0=') === 0) { + } else if ( + url.indexOf('https://beanconqueror.com/?shareUserBean0=') === 0 || + url.indexOf('https://beanconqueror.com?shareUserBean0=') === 0 + ) { let userBeanJSON: string = ''; const regex = /((shareUserBean)[0-9]+\=)/gi; const foundJSONParams = url.match(regex); - for (const param of foundJSONParams) { - userBeanJSON += String(this.findGetParameter(_matchLink.queryString,param)); - } - console.log(userBeanJSON); + try { + for (const param of foundJSONParams) { + userBeanJSON += String( + this.findGetParameter(_matchLink.queryString, param) + ); + } + } catch (ex) {} + this.uiLog.log('Found shared bean ' + userBeanJSON); if (userBeanJSON) { await this.addBeanFromUser(userBeanJSON); } - - } - else if (url.indexOf('beanconqueror://ADD_USER_BEAN?') === 0) { + } else if (url.indexOf('beanconqueror://ADD_USER_BEAN?') === 0) { let userBeanJSON: string = ''; const regex = /((shareUserBean)[0-9]+(?=\=))/gi; const foundJSONParams = url.match(regex); for (const param of foundJSONParams) { - userBeanJSON += String(this.findGetParameter(_matchLink.queryString,param)); + userBeanJSON += String( + this.findGetParameter(_matchLink.queryString, param) + ); } console.log(userBeanJSON); if (userBeanJSON) { await this.addBeanFromUser(userBeanJSON); } - } - - else { - this.uiAlert.showMessage('QR.WRONG_LINK_DESCRIPTION','QR.WRONG_LINK_TITLE',undefined,true); + } else { + this.uiAlert.showMessage( + 'QR.WRONG_LINK_DESCRIPTION', + 'QR.WRONG_LINK_TITLE', + undefined, + true + ); } }); } - - } catch (ex) { - - } - + } catch (ex) {} } - private async addBeanFromServer(_qrCodeId: string) { this.uiLog.log('Load bean information from server: ' + _qrCodeId); try { await this.uiAlert.showLoadingSpinner(); - const beanData: ServerBean = await this.serverCommunicationService.getBeanInformation(_qrCodeId); + const beanData: ServerBean = + await this.serverCommunicationService.getBeanInformation(_qrCodeId); await this.uiBeanHelper.addScannedQRBean(beanData); } catch (ex) { - this.uiAnalytics.trackEvent(QR_TRACKING.TITLE, QR_TRACKING.ACTIONS.SCAN_FAILED); + this.uiAnalytics.trackEvent( + QR_TRACKING.TITLE, + QR_TRACKING.ACTIONS.SCAN_FAILED + ); await this.uiAlert.hideLoadingSpinner(); - this.uiAlert.showMessage('QR.SERVER.ERROR_OCCURED','ERROR_OCCURED',undefined,true); + this.uiAlert.showMessage( + 'QR.SERVER.ERROR_OCCURED', + 'ERROR_OCCURED', + undefined, + true + ); } - } private async addBeanFromUser(_userBeanJSON: string) { - this.uiLog.log('Load bean information from shared user context: ' + _userBeanJSON); + this.uiLog.log( + 'Load bean information from shared user context: ' + _userBeanJSON + ); try { await this.uiAlert.showLoadingSpinner(); await this.uiBeanHelper.addUserSharedBean(_userBeanJSON); } catch (ex) { - this.uiAnalytics.trackEvent(QR_TRACKING.TITLE, QR_TRACKING.ACTIONS.SCAN_FAILED); + this.uiAnalytics.trackEvent( + QR_TRACKING.TITLE, + QR_TRACKING.ACTIONS.SCAN_FAILED + ); await this.uiAlert.hideLoadingSpinner(); - this.uiAlert.showMessage('QR.SERVER.ERROR_OCCURED','ERROR_OCCURED',undefined,true); + this.uiAlert.showMessage( + 'QR.SERVER.ERROR_OCCURED', + 'ERROR_OCCURED', + undefined, + true + ); } } - } - diff --git a/src/services/shareService/share-service.service.ts b/src/services/shareService/share-service.service.ts index 46679cfe3..2ead66660 100644 --- a/src/services/shareService/share-service.service.ts +++ b/src/services/shareService/share-service.service.ts @@ -1,37 +1,230 @@ -import {Injectable} from '@angular/core'; -import {SocialSharing} from '@ionic-native/social-sharing/ngx'; -import {Bean} from '../../classes/bean/bean'; -import {TranslateService} from '@ngx-translate/core'; -import {UIHelper} from '../uiHelper'; -import {Brew} from '../../classes/brew/brew'; -import {UIAnalytics} from '../uiAnalytics'; +import { Injectable } from '@angular/core'; +import { SocialSharing } from '@ionic-native/social-sharing/ngx'; +import { Bean } from '../../classes/bean/bean'; + +import { TranslateService } from '@ngx-translate/core'; +import { UIHelper } from '../uiHelper'; +import { Brew } from '../../classes/brew/brew'; +import { UIAnalytics } from '../uiAnalytics'; import BREW_TRACKING from '../../data/tracking/brewTracking'; import BEAN_TRACKING from '../../data/tracking/beanTracking'; -import JSURL from 'jsurl'; -import LZString from 'lz-string'; -import {UILog} from '../uiLog'; + +import { UILog } from '../uiLog'; +import { BeanProto } from '../../generated/src/classes/bean/bean'; +import { Config } from '../../classes/objectConfig/objectConfig'; + @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class ShareService { + constructor( + private readonly socialShare: SocialSharing, + private readonly translate: TranslateService, + private readonly uiHelper: UIHelper, + private readonly uiAnalytics: UIAnalytics, + private readonly uiLog: UILog + ) {} + + public async shareBean(_bean: Bean) { + // try { + + const protoBean: any = BeanProto.fromJSON(_bean); + protoBean.config = new Config(); + protoBean.attachments = []; + protoBean.favourite = false; + protoBean.rating = 0; + protoBean.archived = false; + console.log(protoBean); + + /* protoBean.name = _bean.name; + if (_bean.roastingDate) { + protoBean.roastingDate = _bean.roastingDate; + } + if (_bean.note) { + protoBean.note = _bean.note; + } + if (_bean.roaster) { + protoBean.roaster = _bean.roaster; + } + if (_bean.roast) { + protoBean.roast = _bean.roast; + } + if (_bean.beanMix) { + protoBean.beanMix = _bean.beanMix; + } + if (_bean.buyDate) { + protoBean.buyDate = _bean.buyDate; + } + if (_bean.roast_custom) { + protoBean.roast_custom = _bean.roast_custom; + } + if (_bean.aromatics) { + protoBean.aromatics = _bean.aromatics; + } + if (_bean.weight) { + protoBean.weight = _bean.weight; + } + if (_bean.finished) { + protoBean.finished = _bean.finished; + } + if (_bean.cost) { + protoBean.cost = _bean.cost; + } + if (_bean.bean_roasting_type) { + protoBean.bean_roasting_type = _bean.bean_roasting_type; + } + if (_bean.decaffeinated) { + protoBean.decaffeinated = _bean.decaffeinated; + } + if (_bean.url) { + protoBean.url = _bean.url; + } + if (_bean.url) { + protoBean.url = _bean.url; + } + if (_bean.ean_article_number) { + protoBean.ean_article_number = _bean.ean_article_number; + } + if (_bean.bean_information) { + protoBean.bean_information = []; + + for (const info of _bean.bean_information) { + const beanInformation: any= {}; + if (info.country){ + beanInformation.country = info.country; + } + if (info.region){ + beanInformation.region = info.region; + } + if (info.farm){ + beanInformation.farm = info.farm; + } + if (info.farmer){ + beanInformation.farmer = info.farmer; + } + if (info.elevation){ + beanInformation.elevation = info.elevation; + } + if (info.harvest_time){ + beanInformation.harvest_time = info.harvest_time; + } + if (info.variety){ + beanInformation.variety = info.variety; + } + if (info.processing){ + beanInformation.processing = info.processing; + } + if (info.certification){ + beanInformation.certification = info.certification; + } + if (info.percentage){ + beanInformation.percentage = info.percentage; + } + if (info.purchasing_price){ + beanInformation.purchasingPrice = info.purchasing_price; + } + + if (info.fob_price){ + beanInformation.fob_price = info.fob_price; + } + protoBean.beanInformation.push(beanInformation); + } + + } + + if (_bean.cupping_points) { + protoBean.cupping_points = _bean.cupping_points; + } + if (_bean.roast_range) { + protoBean.roast_range = _bean.roast_range; + } + if (_bean.qr_code) { + protoBean.qr_code = _bean.qr_code; + } + +*/ + + const bytes = BeanProto.encode(protoBean).finish(); + + const base64String = this.uiHelper.encode(bytes); //btoa(String.fromCharCode(...new Uint8Array(bytes))); + + const loops = Math.ceil(base64String.length / 400); + + let jsonParams = ''; + for (let i = 0; i < loops; i++) { + if (jsonParams === '') { + jsonParams = 'shareUserBean' + i + '=' + base64String.substr(0, 400); + } else { + jsonParams += + '&shareUserBean' + i + '=' + base64String.substr(i * 400, 400); + } + } - constructor(private readonly socialShare: SocialSharing, - private readonly translate: TranslateService, - private readonly uiHelper: UIHelper, - private readonly uiAnalytics: UIAnalytics, - private readonly uiLog: UILog) { + const beanMessage: string = 'https://beanconqueror.com?' + jsonParams; + this.uiLog.debug(beanMessage); + this.uiAnalytics.trackEvent( + BEAN_TRACKING.TITLE, + BEAN_TRACKING.ACTIONS.SHARE + ); + //await this.socialShare.share(beanMessage,null,null,null); + //decode + + /** const stringifyBean = JSURL.stringify(_bean); + const compressedBean = LZString.compressToEncodedURIComponent(stringifyBean); + + + const loops = Math.ceil(compressedBean.length / 400); + + let jsonParams = ''; + for (let i=0;i 0) { - message += `${this.translate.instant('BREW_DATA_GRIND_WEIGHT')}: ${_brew.grind_weight}\n`; + message += `${this.translate.instant('BREW_DATA_GRIND_WEIGHT')}: ${ + _brew.grind_weight + }\n`; } - if (_brew.brew_temperature > 0) { - message += `${this.translate.instant('BREW_DATA_BREW_TEMPERATURE')}: ${_brew.brew_temperature}\n`; + message += `${this.translate.instant('BREW_DATA_BREW_TEMPERATURE')}: ${ + _brew.brew_temperature + }\n`; } - if (_brew.getCalculatedBeanAge()>-1) { - message += `${this.translate.instant('BREW_INFORMATION_BEAN_AGE')}: ${_brew.getCalculatedBeanAge()}\n`; + if (_brew.getCalculatedBeanAge() > -1) { + message += `${this.translate.instant( + 'BREW_INFORMATION_BEAN_AGE' + )}: ${_brew.getCalculatedBeanAge()}\n`; } if (_brew.brew_quantity > 0) { - message += `${this.translate.instant('BREW_DATA_BREW_QUANTITY')}: ${_brew.brew_quantity}\n`; + message += `${this.translate.instant('BREW_DATA_BREW_QUANTITY')}: ${ + _brew.brew_quantity + }\n`; } if (_brew.brew_beverage_quantity > 0) { - message += `${this.translate.instant('BREW_DATA_BREW_BEVERAGE_QUANTITY')}: ${_brew.brew_beverage_quantity}\n`; + message += `${this.translate.instant( + 'BREW_DATA_BREW_BEVERAGE_QUANTITY' + )}: ${_brew.brew_beverage_quantity}\n`; } if (_brew.coffee_blooming_time > 0) { - message += `${this.translate.instant('BREW_DATA_COFFEE_BLOOMING_TIME')}: ${_brew.coffee_blooming_time}\n`; + message += `${this.translate.instant( + 'BREW_DATA_COFFEE_BLOOMING_TIME' + )}: ${_brew.coffee_blooming_time}\n`; } if (_brew.coffee_first_drip_time > 0) { - message += `${this.translate.instant('BREW_DATA_COFFEE_FIRST_DRIP_TIME')}: ${_brew.coffee_first_drip_time}\n`; + message += `${this.translate.instant( + 'BREW_DATA_COFFEE_FIRST_DRIP_TIME' + )}: ${_brew.coffee_first_drip_time}\n`; } if (_brew.brew_time > 0) { - message += `${this.translate.instant('BREW_DATA_CALCULATED_COFFEE_BREW_TIME')}: ${_brew.getFormattedCoffeeBrewTime()}\n`; + message += `${this.translate.instant( + 'BREW_DATA_CALCULATED_COFFEE_BREW_TIME' + )}: ${_brew.getFormattedCoffeeBrewTime()}\n`; } if (_brew.note) { - message += `${this.translate.instant('BREW_DATA_NOTES')}: ${_brew.note}\n`; + message += `${this.translate.instant('BREW_DATA_NOTES')}: ${ + _brew.note + }\n`; } return message; } - - public async shareBean(_bean: Bean) { - try { - - const stringifyBean = JSURL.stringify(_bean); - const compressedBean = LZString.compressToEncodedURIComponent(stringifyBean); - - - const loops = Math.ceil(compressedBean.length / 400); - - let jsonParams = ''; - for (let i=0;i = []; private allStoredBeans: Array = []; - constructor (private readonly uiBrewStorage: UIBrewStorage, - private readonly uiBeanStorage: UIBeanStorage, - private readonly uiAnalytics: UIAnalytics, - private readonly modalController: ModalController, - private readonly uiAlert: UIAlert, - private readonly uiToast: UIToast, - private readonly uiSettingsStorage: UISettingsStorage) { + constructor( + private readonly uiBrewStorage: UIBrewStorage, + private readonly uiBeanStorage: UIBeanStorage, + private readonly uiAnalytics: UIAnalytics, + private readonly modalController: ModalController, + private readonly uiAlert: UIAlert, + private readonly uiToast: UIToast, + private readonly uiSettingsStorage: UISettingsStorage, + private readonly uiHelper: UIHelper + ) { this.uiBrewStorage.attachOnEvent().subscribe((_val) => { // If an brew is deleted, we need to reset our array for the next call. this.allStoredBrews = []; @@ -54,13 +56,12 @@ export class UIBeanHelper { this.allStoredBeans = []; }); - if (UIBeanHelper.instance === undefined) { UIBeanHelper.instance = this; } } - public static getInstance (): UIBeanHelper { + public static getInstance(): UIBeanHelper { if (UIBeanHelper.instance) { return UIBeanHelper.instance; } @@ -69,8 +70,7 @@ export class UIBeanHelper { return undefined; } - public getAllBrewsForThisBean (_uuid: string): Array { - + public getAllBrewsForThisBean(_uuid: string): Array { if (this.allStoredBrews.length <= 0) { // Load just if needed, performance reasons this.allStoredBrews = this.uiBrewStorage.getAllEntries(); @@ -85,164 +85,181 @@ export class UIBeanHelper { } } return brewsForBean; - } - public getAllRoastedBeansForThisGreenBean (_uuid: string): Array { - + public getAllRoastedBeansForThisGreenBean(_uuid: string): Array { if (this.allStoredBeans.length <= 0) { // Load just if needed, performance reasons this.allStoredBeans = this.uiBeanStorage.getAllEntries(); } - const roastedBeans = this.allStoredBeans.filter((e) => (e.bean_roast_information && e.bean_roast_information.bean_uuid === _uuid)); + const roastedBeans = this.allStoredBeans.filter( + (e) => + e.bean_roast_information && e.bean_roast_information.bean_uuid === _uuid + ); return roastedBeans; - } - public getAllRoastedBeansForRoastingMachine (_uuid: string) { + public getAllRoastedBeansForRoastingMachine(_uuid: string) { if (this.allStoredBeans.length <= 0) { // Load just if needed, performance reasons this.allStoredBeans = this.uiBeanStorage.getAllEntries(); } - const roastedBeans = this.allStoredBeans.filter((e) => (e.bean_roast_information && e.bean_roast_information.roaster_machine === _uuid)); + const roastedBeans = this.allStoredBeans.filter( + (e) => + e.bean_roast_information && + e.bean_roast_information.roaster_machine === _uuid + ); return roastedBeans; - } - public async __checkQRCodeScannerInformationPage () { - + public async __checkQRCodeScannerInformationPage() { const settings = this.uiSettingsStorage.getSettings(); const qr_scanner_information: boolean = settings.qr_scanner_information; if (qr_scanner_information === false) { const modal = await this.modalController.create({ component: QrCodeScannerPopoverComponent, - id: QrCodeScannerPopoverComponent.POPOVER_ID + id: QrCodeScannerPopoverComponent.POPOVER_ID, }); await modal.present(); await modal.onWillDismiss(); } } - public async addScannedQRBean (_scannedQRBean: ServerBean) { - + public async addScannedQRBean(_scannedQRBean: ServerBean) { if (_scannedQRBean.error === null) { - this.uiAnalytics.trackEvent(QR_TRACKING.TITLE, QR_TRACKING.ACTIONS.SCAN_SUCCESSFULLY); + this.uiAnalytics.trackEvent( + QR_TRACKING.TITLE, + QR_TRACKING.ACTIONS.SCAN_SUCCESSFULLY + ); this.uiToast.showInfoToast('QR.BEAN_SUCCESSFULLY_SCANNED'); await this.uiAlert.showLoadingSpinner(); const newMapper = new BeanMapper(); const bean: Bean = await newMapper.mapServerToClientBean(_scannedQRBean); await this.uiAlert.hideLoadingSpinner(); - //Show the information before the popup would come up await this.__checkQRCodeScannerInformationPage(); if (bean !== null) { - const modal = await this.modalController.create({ component: BeansAddComponent, id: BeansAddComponent.COMPONENT_ID, - componentProps: {bean_template: bean, server_bean: _scannedQRBean} + componentProps: { bean_template: bean, server_bean: _scannedQRBean }, }); await modal.present(); await modal.onWillDismiss(); } else { - this.uiAlert.showMessage('QR.SERVER.ERROR_OCCURED', 'ERROR_OCCURED', undefined, true); + this.uiAlert.showMessage( + 'QR.SERVER.ERROR_OCCURED', + 'ERROR_OCCURED', + undefined, + true + ); } - - } else { this.uiAnalytics.trackEvent(QR_TRACKING.TITLE, QR_TRACKING.ACTIONS.SCAN); await this.uiAlert.hideLoadingSpinner(); - this.uiAlert.showMessage('QR.SERVER.ERROR_OCCURED', 'ERROR_OCCURED', undefined, true); + this.uiAlert.showMessage( + 'QR.SERVER.ERROR_OCCURED', + 'ERROR_OCCURED', + undefined, + true + ); } - } - public async addBean (_hideToastMessage: boolean = false) { + public async addBean(_hideToastMessage: boolean = false) { const modal = await this.modalController.create({ component: BeansAddComponent, id: BeansAddComponent.COMPONENT_ID, - componentProps: {hide_toast_message: _hideToastMessage} + componentProps: { hide_toast_message: _hideToastMessage }, }); await modal.present(); await modal.onWillDismiss(); } - public async repeatBean (_bean: Bean) { + public async repeatBean(_bean: Bean) { const modal = await this.modalController.create({ component: BeansAddComponent, id: BeansAddComponent.COMPONENT_ID, - componentProps: {bean_template: _bean} + componentProps: { bean_template: _bean }, }); await modal.present(); await modal.onWillDismiss(); } - public async addUserSharedBean (_compressedJson: string) { + public async addUserSharedBean(_compressedJson: string) { try { - const decompressedString = LZString.decompressFromEncodedURIComponent(_compressedJson); - const objectedBean = JSURL.parse(decompressedString); - const newMapper = new BeanMapper(); - const bean: Bean = await newMapper.mapSharedUserBean(objectedBean); + const encoded = this.uiHelper.decode(_compressedJson); + + const protoBean = BeanProto.decode(encoded); + + const bean: Bean = new Bean(); + bean.initializeBySharedProtoBean(protoBean); + bean.shared = true; + bean.attachments = []; + bean.favourite = false; + bean.rating = 0; await this.uiAlert.hideLoadingSpinner(); if (bean !== null) { - const modal = await this.modalController.create({ component: BeansAddComponent, id: BeansAddComponent.COMPONENT_ID, - componentProps: {bean_template: bean, user_shared_bean: bean} + componentProps: { bean_template: bean, user_shared_bean: bean }, }); await modal.present(); await modal.onWillDismiss(); } else { - this.uiAlert.showMessage('QR.SERVER.ERROR_OCCURED', 'ERROR_OCCURED', undefined, true); + this.uiAlert.showMessage( + 'USER_BEAN_SHARINGSHARING_ERROR', + 'ERROR_OCCURED', + undefined, + true + ); } - } catch (ex) { - - }finally { + } finally { this.uiAlert.hideLoadingSpinner(); } - } - - public async addRoastedBean (_greenBean: GreenBean) { + public async addRoastedBean(_greenBean: GreenBean) { const modal = await this.modalController.create({ component: BeansAddComponent, - id: BeansAddComponent.COMPONENT_ID, componentProps: {greenBean: _greenBean} + id: BeansAddComponent.COMPONENT_ID, + componentProps: { greenBean: _greenBean }, }); await modal.present(); await modal.onWillDismiss(); } - public async editBean (_bean: Bean) { - + public async editBean(_bean: Bean) { const modal = await this.modalController.create({ component: BeansEditComponent, id: BeansEditComponent.COMPONENT_ID, - componentProps: {bean: _bean} + componentProps: { bean: _bean }, }); await modal.present(); await modal.onWillDismiss(); } - public async detailBean (_bean: Bean) { + public async detailBean(_bean: Bean) { const modal = await this.modalController.create({ component: BeansDetailComponent, id: BeansDetailComponent.COMPONENT_ID, - componentProps: {bean: _bean} + componentProps: { bean: _bean }, }); await modal.present(); await modal.onWillDismiss(); } - public async archiveBeanWithRatingQuestion (_bean: Bean) { - - this.uiAnalytics.trackEvent(BEAN_TRACKING.TITLE, BEAN_TRACKING.ACTIONS.ARCHIVE); + public async archiveBeanWithRatingQuestion(_bean: Bean) { + this.uiAnalytics.trackEvent( + BEAN_TRACKING.TITLE, + BEAN_TRACKING.ACTIONS.ARCHIVE + ); const modal = await this.modalController.create({ component: BeanArchivePopoverComponent, @@ -252,8 +269,8 @@ export class UIBeanHelper { breakpoints: [0, 0.5, 0.75, 1], initialBreakpoint: 0.5, componentProps: { - bean: _bean - } + bean: _bean, + }, }); await modal.present(); await modal.onWillDismiss(); diff --git a/src/services/uiHelper.ts b/src/services/uiHelper.ts index 1a1fc141d..5479ecd90 100755 --- a/src/services/uiHelper.ts +++ b/src/services/uiHelper.ts @@ -1,17 +1,17 @@ /** Core */ -import {Injectable} from '@angular/core'; -import {InAppBrowser} from '@ionic-native/in-app-browser/ngx'; +import { Injectable } from '@angular/core'; +import { InAppBrowser } from '@ionic-native/in-app-browser/ngx'; /** Ionic */ -import {Platform} from '@ionic/angular'; +import { Platform } from '@ionic/angular'; /** Third party */ import moment from 'moment'; // tslint:disable-next-line import 'moment/locale/de'; -import {DomSanitizer, SafeUrl} from '@angular/platform-browser'; -import {File, FileEntry} from '@ionic-native/file/ngx'; -import {UIFileHelper} from './uiFileHelper'; -import {UILog} from './uiLog'; -import {UIAlert} from './uiAlert'; +import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; +import { File, FileEntry } from '@ionic-native/file/ngx'; +import { UIFileHelper } from './uiFileHelper'; +import { UILog } from './uiLog'; +import { UIAlert } from './uiAlert'; declare var cordova: any; declare var device: any; @@ -22,48 +22,44 @@ import { cloneDeep } from 'lodash'; */ @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class UIHelper { - - /** * */ private isAppReady: number = -1; - constructor (private readonly platform: Platform, - private readonly inAppBrowser: InAppBrowser, - private readonly sanitizer: DomSanitizer, - private readonly file: File, - private readonly uiFileHelper: UIFileHelper, - private readonly uiLog: UILog, - private readonly uiAlert: UIAlert) { - - } + constructor( + private readonly platform: Platform, + private readonly inAppBrowser: InAppBrowser, + private readonly sanitizer: DomSanitizer, + private readonly file: File, + private readonly uiFileHelper: UIFileHelper, + private readonly uiLog: UILog, + private readonly uiAlert: UIAlert + ) {} public static generateUUID(): string { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { // tslint:disable - const r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); + const r = (Math.random() * 16) | 0, + v = c === 'x' ? r : (r & 0x3) | 0x8; return v.toString(16); }); } - public static jsonToArray = function(json) - { + public static jsonToArray = function (json) { const str = JSON.stringify(json, null, 0); const ret = new Uint8Array(str.length); for (let i = 0; i < str.length; i++) { ret[i] = str.charCodeAt(i); } - return ret + return ret; }; - public static getUnixTimestamp(): number { - return moment() - .unix(); + return moment().unix(); } /** @@ -82,81 +78,77 @@ export class UIHelper { public copyData(_value: any): any { if (_value) { if (_value.constructor === Array) { - return {...[], ..._value}; + return { ...[], ..._value }; } - return {..._value}; + return { ..._value }; } return undefined; - } public generateUUID(): string { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { // tslint:disable - const r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); + const r = (Math.random() * 16) | 0, + v = c === 'x' ? r : (r & 0x3) | 0x8; return v.toString(16); }); } - public showAlert(_message,_title?:string) { - this.uiAlert.showMessage(_message,_title); + public showAlert(_message, _title?: string) { + this.uiAlert.showMessage(_message, _title); } public getUnixTimestamp(): number { - return moment() - .unix(); + return moment().unix(); } public isToday(_unix: number): boolean { - return moment.unix(moment() - .unix()) - .isSame(moment.unix(_unix), 'd'); + return moment.unix(moment().unix()).isSame(moment.unix(_unix), 'd'); } public formateDatestr(_unix: string, _format?: string): string { - let format: string = 'DD.MM.YYYY, HH:mm:ss'; if (_format) { format = _format; - } - return moment(_unix) - .format(format); + return moment(_unix).format(format); } - - public toFixedIfNecessary( value, dp ){ + public toFixedIfNecessary(value, dp) { const parsedFloat = parseFloat(value); if (isNaN(parsedFloat)) { return 0; } - return +parsedFloat.toFixed( dp ); + return +parsedFloat.toFixed(dp); } + public encode(arrayBuffer) { + return btoa(String.fromCharCode(...new Uint8Array(arrayBuffer))); + } - public formateDate(_unix: number, _format?: string): string { + public decode(str) { + const asciiString = atob(str); + return new Uint8Array([...asciiString].map((char) => char.charCodeAt(0))); + } + public formateDate(_unix: number, _format?: string): string { let format: string = 'DD.MM.YYYY, HH:mm:ss'; if (_format) { format = _format; - } - return moment.unix(_unix) - .format(format); + return moment.unix(_unix).format(format); } - - public formatSeconds(_seconds,_format) { + public formatSeconds(_seconds, _format) { try { - return moment().startOf('day').add('seconds',_seconds).format(_format); + return moment().startOf('day').add('seconds', _seconds).format(_format); } catch (ex) { return 0; } - } public getActualTimeWithMilliseconds() { - return moment(new Date()).format("HH:mm:ss.SSS"); + return moment(new Date()).format('HH:mm:ss.SSS'); } public timeDifference(_unix: number): any { @@ -167,7 +159,7 @@ export class UIHelper { SECONDS: 0, MINUTES: 0, HOURS: 0, - DAYS: 0 + DAYS: 0, }; timeDifference.MILLISECONDS = now.diff(toDiff, 'milliseconds'); @@ -178,7 +170,7 @@ export class UIHelper { return timeDifference; } - public async attachOnPlatformReady (): Promise { + public async attachOnPlatformReady(): Promise { return this.platform.ready(); } @@ -192,7 +184,6 @@ export class UIHelper { public isBeanconqurorAppReady(): Promise { const promise = new Promise((resolve, reject) => { - if (this.isAppReady === 1 || this.isAppReady === 2) { this.uiLog.log('Check app ready - Already loaded, no interval needed'); resolve(undefined); @@ -205,26 +196,25 @@ export class UIHelper { } }, 50); } - }); return promise; } public convertToNumber(event: any): number { - let eventInput:any = event; + let eventInput: any = event; if (eventInput === '') { return eventInput; } if (eventInput.indexOf(',')) { - eventInput = eventInput.replace(/,/g, '.'); + eventInput = eventInput.replace(/,/g, '.'); } return parseFloat(eventInput); } public openExternalWebpage(_url: string) { - let url:string = _url; + let url: string = _url; if (url.indexOf('http') === -1) { // Saftey url = 'http://' + url; @@ -232,37 +222,39 @@ export class UIHelper { this.inAppBrowser.create(url, '_system'); - // window.open(_url, "_system"); - + // window.open(_url, "_system"); } - public sanitizeImagePath (imagePath: string): SafeUrl { + public sanitizeImagePath(imagePath: string): SafeUrl { return this.sanitizer.bypassSecurityTrustUrl(imagePath); } - public getBase64Data (imagePath: string) { + public getBase64Data(imagePath: string) { return this.uiFileHelper.getBase64File(imagePath); } - - public async exportJSON (fileName: string, jsonContent: string,_share: boolean = true): Promise { - const promise = new Promise(async (resolve, reject) => { - - + public async exportJSON( + fileName: string, + jsonContent: string, + _share: boolean = true + ): Promise { + const promise = new Promise(async (resolve, reject) => { // Fixed umlaut issue // Thanks to: https://stackoverflow.com/questions/31959487/utf-8-encoidng-issue-when-exporting-csv-file-javascript - const blob = new Blob([jsonContent], {type: 'application/json;charset=UTF-8;'}); - try { - const file: FileEntry = await this.uiFileHelper.downloadFile(fileName,blob,_share); - resolve(file); - } catch(ex) { - reject(); - } - - - + const blob = new Blob([jsonContent], { + type: 'application/json;charset=UTF-8;', + }); + try { + const file: FileEntry = await this.uiFileHelper.downloadFile( + fileName, + blob, + _share + ); + resolve(file); + } catch (ex) { + reject(); + } }); - return promise; + return promise; } - } diff --git a/tslint.json b/tslint.json index a7c27ec7c..4848d4063 100644 --- a/tslint.json +++ b/tslint.json @@ -140,6 +140,7 @@ "no-string-literal": false, "no-trailing-whitespace": false, "one-line": false, + "allowSyntheticDefaultImports": true, "object-literal-shorthand": false, "variable-name": { "options": [ From 3e99e47ca826bd1a10fc1cbf690e8c62481f0743 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 21 Aug 2022 10:33:38 +0200 Subject: [PATCH 55/78] #401 - Creation date can now be edited by default without need to activate --- src/classes/parameter/manageBrewParameter.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/classes/parameter/manageBrewParameter.ts b/src/classes/parameter/manageBrewParameter.ts index 91c0ccc3e..89535b673 100755 --- a/src/classes/parameter/manageBrewParameter.ts +++ b/src/classes/parameter/manageBrewParameter.ts @@ -1,6 +1,6 @@ /** Interfacdes */ -import {IManageBrewParameter} from '../../interfaces/parameter/iManageBrewParameter'; +import { IManageBrewParameter } from '../../interfaces/parameter/iManageBrewParameter'; export class ManageBrewParameter implements IManageBrewParameter { public brew_time: boolean; @@ -56,7 +56,8 @@ export class ManageBrewParameter implements IManageBrewParameter { this.brew_beverage_quantity = true; this.attachments = false; this.set_last_coffee_brew = false; - this.set_custom_brew_time = false; + // #401 + this.set_custom_brew_time = true; this.method_of_preparation_tool = false; this.water = false; this.bean_weight_in = false; From 248136333d2b9c9655a8e1a90811f272b63c42de Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 21 Aug 2022 10:56:07 +0200 Subject: [PATCH 56/78] #384 - Share bean without server - last enum fixes :< --- .../intentHandler/intent-handler.service.ts | 2 +- .../shareService/share-service.service.ts | 157 +++--------------- src/services/uiBeanHelper.ts | 34 ++++ 3 files changed, 55 insertions(+), 138 deletions(-) diff --git a/src/services/intentHandler/intent-handler.service.ts b/src/services/intentHandler/intent-handler.service.ts index f9bcb6a17..f96363b7a 100644 --- a/src/services/intentHandler/intent-handler.service.ts +++ b/src/services/intentHandler/intent-handler.service.ts @@ -179,7 +179,7 @@ export class IntentHandlerService { } } - private async addBeanFromUser(_userBeanJSON: string) { + public async addBeanFromUser(_userBeanJSON: string) { this.uiLog.log( 'Load bean information from shared user context: ' + _userBeanJSON ); diff --git a/src/services/shareService/share-service.service.ts b/src/services/shareService/share-service.service.ts index 2ead66660..2ad2edfb0 100644 --- a/src/services/shareService/share-service.service.ts +++ b/src/services/shareService/share-service.service.ts @@ -10,8 +10,16 @@ import BREW_TRACKING from '../../data/tracking/brewTracking'; import BEAN_TRACKING from '../../data/tracking/beanTracking'; import { UILog } from '../uiLog'; -import { BeanProto } from '../../generated/src/classes/bean/bean'; +import { + BeanMix, + BeanProto, + BeanRoastingType, + Roast, +} from '../../generated/src/classes/bean/bean'; import { Config } from '../../classes/objectConfig/objectConfig'; +import { BEAN_ROASTING_TYPE_ENUM } from '../../enums/beans/beanRoastingType'; +import { ROASTS_ENUM } from '../../enums/beans/roasts'; +import { BEAN_MIX_ENUM } from '../../enums/beans/mix'; @Injectable({ providedIn: 'root', @@ -34,119 +42,21 @@ export class ShareService { protoBean.favourite = false; protoBean.rating = 0; protoBean.archived = false; - console.log(protoBean); - /* protoBean.name = _bean.name; - if (_bean.roastingDate) { - protoBean.roastingDate = _bean.roastingDate; + if (_bean.bean_roasting_type === ('UNKNOWN' as BEAN_ROASTING_TYPE_ENUM)) { + protoBean.bean_roasting_type = + BeanRoastingType.UNKNOWN_BEAN_ROASTING_TYPE; } - if (_bean.note) { - protoBean.note = _bean.note; + if (_bean.roast === ('UNKNOWN' as ROASTS_ENUM)) { + protoBean.roast = Roast.UNKNOWN_ROAST; } - if (_bean.roaster) { - protoBean.roaster = _bean.roaster; - } - if (_bean.roast) { - protoBean.roast = _bean.roast; - } - if (_bean.beanMix) { - protoBean.beanMix = _bean.beanMix; - } - if (_bean.buyDate) { - protoBean.buyDate = _bean.buyDate; - } - if (_bean.roast_custom) { - protoBean.roast_custom = _bean.roast_custom; - } - if (_bean.aromatics) { - protoBean.aromatics = _bean.aromatics; - } - if (_bean.weight) { - protoBean.weight = _bean.weight; - } - if (_bean.finished) { - protoBean.finished = _bean.finished; - } - if (_bean.cost) { - protoBean.cost = _bean.cost; - } - if (_bean.bean_roasting_type) { - protoBean.bean_roasting_type = _bean.bean_roasting_type; - } - if (_bean.decaffeinated) { - protoBean.decaffeinated = _bean.decaffeinated; - } - if (_bean.url) { - protoBean.url = _bean.url; - } - if (_bean.url) { - protoBean.url = _bean.url; - } - if (_bean.ean_article_number) { - protoBean.ean_article_number = _bean.ean_article_number; - } - if (_bean.bean_information) { - protoBean.bean_information = []; - - for (const info of _bean.bean_information) { - const beanInformation: any= {}; - if (info.country){ - beanInformation.country = info.country; - } - if (info.region){ - beanInformation.region = info.region; - } - if (info.farm){ - beanInformation.farm = info.farm; - } - if (info.farmer){ - beanInformation.farmer = info.farmer; - } - if (info.elevation){ - beanInformation.elevation = info.elevation; - } - if (info.harvest_time){ - beanInformation.harvest_time = info.harvest_time; - } - if (info.variety){ - beanInformation.variety = info.variety; - } - if (info.processing){ - beanInformation.processing = info.processing; - } - if (info.certification){ - beanInformation.certification = info.certification; - } - if (info.percentage){ - beanInformation.percentage = info.percentage; - } - if (info.purchasing_price){ - beanInformation.purchasingPrice = info.purchasing_price; - } - - if (info.fob_price){ - beanInformation.fob_price = info.fob_price; - } - protoBean.beanInformation.push(beanInformation); - } + if (_bean.beanMix === ('UNKNOWN' as BEAN_MIX_ENUM)) { + protoBean.beanMix = BeanMix.UNKNOWN_BEAN_MIX; } - - if (_bean.cupping_points) { - protoBean.cupping_points = _bean.cupping_points; - } - if (_bean.roast_range) { - protoBean.roast_range = _bean.roast_range; - } - if (_bean.qr_code) { - protoBean.qr_code = _bean.qr_code; - } - -*/ - const bytes = BeanProto.encode(protoBean).finish(); - const base64String = this.uiHelper.encode(bytes); //btoa(String.fromCharCode(...new Uint8Array(bytes))); + const base64String = this.uiHelper.encode(bytes); const loops = Math.ceil(base64String.length / 400); @@ -166,36 +76,9 @@ export class ShareService { BEAN_TRACKING.TITLE, BEAN_TRACKING.ACTIONS.SHARE ); - //await this.socialShare.share(beanMessage,null,null,null); - - //decode - - /** const stringifyBean = JSURL.stringify(_bean); - const compressedBean = LZString.compressToEncodedURIComponent(stringifyBean); - - - const loops = Math.ceil(compressedBean.length / 400); - - let jsonParams = ''; - for (let i=0;i Date: Tue, 23 Aug 2022 11:04:20 +0200 Subject: [PATCH 57/78] Update package-json --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1ce8f224c..e5709693c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23567,7 +23567,7 @@ "node_modules/properties-parser": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/properties-parser/-/properties-parser-0.3.1.tgz", - "integrity": "sha1-ExbpU5/7/ZOEXjabIRAiq9R4dxo=", + "integrity": "sha512-AkSQxQAviJ89x4FIxOyHGfO3uund0gvYo7lfD0E+Gp7gFQKrTNgtoYQklu8EhrfHVZUzTwKGZx2r/KDSfnljcA==", "dev": true, "dependencies": { "string.prototype.codepointat": "^0.2.0" @@ -46073,7 +46073,7 @@ "properties-parser": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/properties-parser/-/properties-parser-0.3.1.tgz", - "integrity": "sha1-ExbpU5/7/ZOEXjabIRAiq9R4dxo=", + "integrity": "sha512-AkSQxQAviJ89x4FIxOyHGfO3uund0gvYo7lfD0E+Gp7gFQKrTNgtoYQklu8EhrfHVZUzTwKGZx2r/KDSfnljcA==", "dev": true, "requires": { "string.prototype.codepointat": "^0.2.0" diff --git a/package.json b/package.json index 86e1b88c8..3469108bf 100644 --- a/package.json +++ b/package.json @@ -248,4 +248,4 @@ "*.css": "stylelint --fix", "*.{ts,js,css,md}": "prettier --write" } -} +} \ No newline at end of file From 9c6c928b81f673d2f3e61dd1de45c785da16c0b3 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Wed, 24 Aug 2022 17:00:23 +0200 Subject: [PATCH 58/78] update --- src/app/info/cookie/cookie.component.html | 42 +++--------- src/app/info/privacy/privacy.component.html | 73 ++++----------------- 2 files changed, 21 insertions(+), 94 deletions(-) diff --git a/src/app/info/cookie/cookie.component.html b/src/app/info/cookie/cookie.component.html index cf17b5d9d..62f594f83 100644 --- a/src/app/info/cookie/cookie.component.html +++ b/src/app/info/cookie/cookie.component.html @@ -14,11 +14,11 @@ -
-
-
-
-
-
+ +
+
diff --git a/src/app/info/privacy/privacy.component.html b/src/app/info/privacy/privacy.component.html index b7e3fd787..4fd0d1abc 100644 --- a/src/app/info/privacy/privacy.component.html +++ b/src/app/info/privacy/privacy.component.html @@ -13,12 +13,12 @@ -
-
-
-
-
- -
+
From 08fa91ca8b5402334b28b033d3d650b1b91e718d Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sat, 27 Aug 2022 13:03:41 +0200 Subject: [PATCH 59/78] Update ionic dependency --- package-lock.json | 58 +++++++++---------- package.json | 4 +- src/app/beans/beans.page.ts | 1 - .../intentHandler/intent-handler.service.ts | 1 - 4 files changed, 31 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index e5709693c..c598c075a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "@ionic-native/splash-screen": "^5.33.1", "@ionic-native/status-bar": "^5.33.1", "@ionic-native/three-dee-touch": "^5.33.1", - "@ionic/angular": "^6.1.14", + "@ionic/angular": "^6.2.4", "@ionic/cli": "^6.18.1", "@ionic/storage": "^2.3.1", "@ngx-translate/core": "^11.0.1", @@ -4332,11 +4332,11 @@ } }, "node_modules/@ionic/angular": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.1.14.tgz", - "integrity": "sha512-npkk+/5pic2ZiAY1ev6YDy+NkelMGfjyBT3eWH4twhzX6QgQ1+C6rrJf95Lck9j7Obgb6s5GPAXojyigk/klKw==", + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.2.4.tgz", + "integrity": "sha512-rHjt5nXA6egZ6cyBA46se3u5O0OYZKtOPrgZR49tpnGcCTEpLSxFpRGjxuKLyAaV6z9fR5krnGRybia+Wt1qbw==", "dependencies": { - "@ionic/core": "^6.1.14", + "@ionic/core": "^6.2.4", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" }, @@ -7727,11 +7727,11 @@ } }, "node_modules/@ionic/core": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.1.14.tgz", - "integrity": "sha512-tmhumOD7VM7QV3boh8rwMNYOgqBskOtGJPSEaySEmCUy+Y0nXwb0gBqxZ/M6c0JcGwT17gIB2KiQDvZ4O/J8iA==", + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.2.4.tgz", + "integrity": "sha512-LDRIwG5plwTHELxQ/j3uEfLJ7YkzJzR1V4QGE+X59aE/l7XoXZyLb1NWFjY7glBbFHGQgSuPFWNhXFkyRBxRFQ==", "dependencies": { - "@stencil/core": "^2.16.0", + "@stencil/core": "^2.17.4", "ionicons": "^6.0.2", "tslib": "^2.1.0" } @@ -8703,9 +8703,9 @@ "dev": true }, "node_modules/@stencil/core": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.17.1.tgz", - "integrity": "sha512-ErjQsNALgZQ9SYeBHhqwL1UO+Zbptwl3kwrRJC2tGlc3G/T6UvPuaKr+PGsqI+CZGia+0+R5EELQvFu74mYeIg==", + "version": "2.17.4", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.17.4.tgz", + "integrity": "sha512-SGRlHpjV1RyFvzw6jFMVKpLNox9Eds3VvpbpD2SW9CuxdLonHDSFtQks5zmT4zs1Rse9I6kFc2mFK/dHNTalkg==", "bin": { "stencil": "bin/stencil" }, @@ -16615,9 +16615,9 @@ } }, "node_modules/ionicons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-6.0.2.tgz", - "integrity": "sha512-AyKfFaUKVoBz4eB8XkU7H1R5HFnVsgq5ijqSdbXC0lES9PDK/J6LUQz6XUJq0mVVQF5k9kczSPOLMW3mszG0mQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-6.0.3.tgz", + "integrity": "sha512-kVOWER991EMqLiVShrCSWKMHkgHZP7XfVdyN6YPMuoO33W7pc5CPNVNfR8OMe/I8rYEbaunyBs6dXNYpR6gGZw==", "dependencies": { "@stencil/core": "~2.16.0" } @@ -31753,11 +31753,11 @@ } }, "@ionic/angular": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.1.14.tgz", - "integrity": "sha512-npkk+/5pic2ZiAY1ev6YDy+NkelMGfjyBT3eWH4twhzX6QgQ1+C6rrJf95Lck9j7Obgb6s5GPAXojyigk/klKw==", + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.2.4.tgz", + "integrity": "sha512-rHjt5nXA6egZ6cyBA46se3u5O0OYZKtOPrgZR49tpnGcCTEpLSxFpRGjxuKLyAaV6z9fR5krnGRybia+Wt1qbw==", "requires": { - "@ionic/core": "^6.1.14", + "@ionic/core": "^6.2.4", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" } @@ -34225,11 +34225,11 @@ } }, "@ionic/core": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.1.14.tgz", - "integrity": "sha512-tmhumOD7VM7QV3boh8rwMNYOgqBskOtGJPSEaySEmCUy+Y0nXwb0gBqxZ/M6c0JcGwT17gIB2KiQDvZ4O/J8iA==", + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.2.4.tgz", + "integrity": "sha512-LDRIwG5plwTHELxQ/j3uEfLJ7YkzJzR1V4QGE+X59aE/l7XoXZyLb1NWFjY7glBbFHGQgSuPFWNhXFkyRBxRFQ==", "requires": { - "@stencil/core": "^2.16.0", + "@stencil/core": "^2.17.4", "ionicons": "^6.0.2", "tslib": "^2.1.0" } @@ -34992,9 +34992,9 @@ } }, "@stencil/core": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.17.1.tgz", - "integrity": "sha512-ErjQsNALgZQ9SYeBHhqwL1UO+Zbptwl3kwrRJC2tGlc3G/T6UvPuaKr+PGsqI+CZGia+0+R5EELQvFu74mYeIg==" + "version": "2.17.4", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.17.4.tgz", + "integrity": "sha512-SGRlHpjV1RyFvzw6jFMVKpLNox9Eds3VvpbpD2SW9CuxdLonHDSFtQks5zmT4zs1Rse9I6kFc2mFK/dHNTalkg==" }, "@stylelint/postcss-css-in-js": { "version": "0.37.2", @@ -40899,9 +40899,9 @@ } }, "ionicons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-6.0.2.tgz", - "integrity": "sha512-AyKfFaUKVoBz4eB8XkU7H1R5HFnVsgq5ijqSdbXC0lES9PDK/J6LUQz6XUJq0mVVQF5k9kczSPOLMW3mszG0mQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-6.0.3.tgz", + "integrity": "sha512-kVOWER991EMqLiVShrCSWKMHkgHZP7XfVdyN6YPMuoO33W7pc5CPNVNfR8OMe/I8rYEbaunyBs6dXNYpR6gGZw==", "requires": { "@stencil/core": "~2.16.0" }, diff --git a/package.json b/package.json index 3469108bf..aa3eddb65 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@ionic-native/splash-screen": "^5.33.1", "@ionic-native/status-bar": "^5.33.1", "@ionic-native/three-dee-touch": "^5.33.1", - "@ionic/angular": "^6.1.14", + "@ionic/angular": "^6.2.4", "@ionic/cli": "^6.18.1", "@ionic/storage": "^2.3.1", "@ngx-translate/core": "^11.0.1", @@ -248,4 +248,4 @@ "*.css": "stylelint --fix", "*.{ts,js,css,md}": "prettier --write" } -} \ No newline at end of file +} diff --git a/src/app/beans/beans.page.ts b/src/app/beans/beans.page.ts index d8ea0ce17..46ffd16b2 100644 --- a/src/app/beans/beans.page.ts +++ b/src/app/beans/beans.page.ts @@ -370,7 +370,6 @@ export class BeansPage implements OnInit { filterBeans = filterBeans.filter((e) => e.favourite === true); } - console.log(filter); // Rating filter is always active filterBeans = filterBeans.filter( (e: Bean) => diff --git a/src/services/intentHandler/intent-handler.service.ts b/src/services/intentHandler/intent-handler.service.ts index f96363b7a..cdbe64c32 100644 --- a/src/services/intentHandler/intent-handler.service.ts +++ b/src/services/intentHandler/intent-handler.service.ts @@ -139,7 +139,6 @@ export class IntentHandlerService { this.findGetParameter(_matchLink.queryString, param) ); } - console.log(userBeanJSON); if (userBeanJSON) { await this.addBeanFromUser(userBeanJSON); } From e60769238301da90a17a4caad8613857b5e2b9f2 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sat, 27 Aug 2022 13:07:25 +0200 Subject: [PATCH 60/78] Updating file and ble plugin --- README.md | 2 +- config.xml | 1 - package-lock.json | 33 +++++++++++++++++++-------------- package.json | 10 ++++++---- 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 3d8ec4f25..a29cf72c8 100755 --- a/README.md +++ b/README.md @@ -205,7 +205,7 @@ https://stackoverflow.com/questions/60357663/do-apple-app-site-association-files ### Upgrade Ionic if needed: -`npm install @ionic/angular@6.1.14` +`npm install @ionic/angular@6.2.4` -> Or the actual active version ### Installing AAB on your android (mac) diff --git a/config.xml b/config.xml index 69a73b6fd..4a38f101a 100644 --- a/config.xml +++ b/config.xml @@ -271,7 +271,6 @@ - diff --git a/package-lock.json b/package-lock.json index c598c075a..af2f07f61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,7 +55,6 @@ "cordova-plugin-appminimize": "^1.0.1", "cordova-plugin-device": "^2.0.3", "cordova-plugin-enable-multidex": "^0.2.0", - "cordova-plugin-file": "^6.0.2", "cordova-plugin-filechooser": "^1.2.0", "cordova-plugin-filepicker": "^1.1.6", "cordova-plugin-globalization": "^1.11.0", @@ -101,10 +100,11 @@ "cordova-plugin-androidx-adapter": "^1.1.3", "cordova-plugin-app-version": "^0.1.12", "cordova-plugin-apprate": "^1.7.2", - "cordova-plugin-ble-central": "^1.4.4", + "cordova-plugin-ble-central": "^1.5.2", "cordova-plugin-camera": "^6.0.0", "cordova-plugin-customurlscheme-ng": "^10.0.0", "cordova-plugin-dialogs": "^2.0.2", + "cordova-plugin-file": "^7.0.0", "cordova-plugin-file-transfer": "github:dpa99c/cordova-plugin-file-transfer", "cordova-plugin-geolocation": "^4.1.0", "cordova-plugin-health": "^2.0.0", @@ -12102,9 +12102,9 @@ "dev": true }, "node_modules/cordova-plugin-ble-central": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/cordova-plugin-ble-central/-/cordova-plugin-ble-central-1.4.4.tgz", - "integrity": "sha512-zE2eRsGGJSSKSuIWIhVB7JkGkwbPaAO0NZytUhn7loay6nM4NMvSxhvJkucYea79V5iYoODuZdjiRlSTzfRcew==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-ble-central/-/cordova-plugin-ble-central-1.5.2.tgz", + "integrity": "sha512-B6r1LBTU4kdsShWoFnlAn5oKYI0IGQiqLILcw4wlt9yXXiM+Srl46Nau1Vhwoh/6dAbilwvr7oblGT0AmBOjWw==", "dev": true }, "node_modules/cordova-plugin-camera": { @@ -12185,15 +12185,19 @@ "integrity": "sha512-W/s8FpRdi3kTLtePdvauqKj1qqoxZDJWmEphvAmSmPwNTtfv3CxgnwFYc9aNmR9iDiJk3E0ME+9BRkbyz/4rXw==" }, "node_modules/cordova-plugin-file": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/cordova-plugin-file/-/cordova-plugin-file-6.0.2.tgz", - "integrity": "sha512-m7cughw327CjONN/qjzsTpSesLaeybksQh420/gRuSXJX5Zt9NfgsSbqqKDon6jnQ9Mm7h7imgyO2uJ34XMBtA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-file/-/cordova-plugin-file-7.0.0.tgz", + "integrity": "sha512-mSwy9GE5pHq2ZHhu/wYk/VhrwR5VLk+XQsk3+IiiFmDgcPsrVIyELkM2FZKX09cC6i+bJVTFVKUlwteSStj3ow==", + "dev": true, "engines": { "cordovaDependencies": { "5.0.0": { "cordova-android": ">=6.3.0" }, "7.0.0": { + "cordova-android": ">=10.0.0" + }, + "8.0.0": { "cordova": ">100" } } @@ -37659,9 +37663,9 @@ "dev": true }, "cordova-plugin-ble-central": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/cordova-plugin-ble-central/-/cordova-plugin-ble-central-1.4.4.tgz", - "integrity": "sha512-zE2eRsGGJSSKSuIWIhVB7JkGkwbPaAO0NZytUhn7loay6nM4NMvSxhvJkucYea79V5iYoODuZdjiRlSTzfRcew==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-ble-central/-/cordova-plugin-ble-central-1.5.2.tgz", + "integrity": "sha512-B6r1LBTU4kdsShWoFnlAn5oKYI0IGQiqLILcw4wlt9yXXiM+Srl46Nau1Vhwoh/6dAbilwvr7oblGT0AmBOjWw==", "dev": true }, "cordova-plugin-camera": { @@ -37693,9 +37697,10 @@ "integrity": "sha512-W/s8FpRdi3kTLtePdvauqKj1qqoxZDJWmEphvAmSmPwNTtfv3CxgnwFYc9aNmR9iDiJk3E0ME+9BRkbyz/4rXw==" }, "cordova-plugin-file": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/cordova-plugin-file/-/cordova-plugin-file-6.0.2.tgz", - "integrity": "sha512-m7cughw327CjONN/qjzsTpSesLaeybksQh420/gRuSXJX5Zt9NfgsSbqqKDon6jnQ9Mm7h7imgyO2uJ34XMBtA==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-file/-/cordova-plugin-file-7.0.0.tgz", + "integrity": "sha512-mSwy9GE5pHq2ZHhu/wYk/VhrwR5VLk+XQsk3+IiiFmDgcPsrVIyELkM2FZKX09cC6i+bJVTFVKUlwteSStj3ow==", + "dev": true }, "cordova-plugin-file-transfer": { "version": "git+ssh://git@github.com/dpa99c/cordova-plugin-file-transfer.git#2cdb0403a81821e144998c8d9a00d338d6ece3ee", diff --git a/package.json b/package.json index aa3eddb65..ba8baef9a 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,6 @@ "cordova-plugin-appminimize": "^1.0.1", "cordova-plugin-device": "^2.0.3", "cordova-plugin-enable-multidex": "^0.2.0", - "cordova-plugin-file": "^6.0.2", "cordova-plugin-filechooser": "^1.2.0", "cordova-plugin-filepicker": "^1.1.6", "cordova-plugin-globalization": "^1.11.0", @@ -110,10 +109,11 @@ "cordova-plugin-androidx-adapter": "^1.1.3", "cordova-plugin-app-version": "^0.1.12", "cordova-plugin-apprate": "^1.7.2", - "cordova-plugin-ble-central": "^1.4.4", + "cordova-plugin-ble-central": "^1.5.2", "cordova-plugin-camera": "^6.0.0", "cordova-plugin-customurlscheme-ng": "^10.0.0", "cordova-plugin-dialogs": "^2.0.2", + "cordova-plugin-file": "^7.0.0", "cordova-plugin-file-transfer": "github:dpa99c/cordova-plugin-file-transfer", "cordova-plugin-geolocation": "^4.1.0", "cordova-plugin-health": "^2.0.0", @@ -156,7 +156,6 @@ "plugins": { "cordova-plugin-statusbar": {}, "cordova-plugin-device": {}, - "cordova-plugin-file": {}, "cordova-plugin-filechooser": {}, "cordova-plugin-filepicker": {}, "cordova-plugin-telerik-imagepicker": { @@ -229,6 +228,9 @@ "IOS_INIT_ON_LOAD": "false", "ACCESS_BACKGROUND_LOCATION": "false", "BLUETOOTH_RESTORE_STATE": "false" + }, + "cordova-plugin-file": { + "ANDROIDX_WEBKIT_VERSION": "1.4.0" } }, "platforms": [ @@ -248,4 +250,4 @@ "*.css": "stylelint --fix", "*.{ts,js,css,md}": "prettier --write" } -} +} \ No newline at end of file From 60a95d60d4b35cb3ce134da15175fd9388744c7e Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sat, 27 Aug 2022 13:32:21 +0200 Subject: [PATCH 61/78] Fixing modals after update --- package-lock.json | 14 +++++++------- package.json | 4 ++-- .../bean-roast-information.component.ts | 8 ++++---- src/components/brew-timer/brew-timer.component.ts | 8 ++++---- .../brews/brew-brewing/brew-brewing.component.ts | 8 ++++---- src/components/timer/timer.component.ts | 8 ++++---- .../datetime-popover.component.html | 15 ++++++++------- .../datetime-popover.component.scss | 15 ++++----------- 8 files changed, 37 insertions(+), 43 deletions(-) diff --git a/package-lock.json b/package-lock.json index af2f07f61..7076cc049 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "@ngx-translate/core": "^11.0.1", "@ngx-translate/http-loader": "^4.0.0", "ag-virtual-scroll": "^1.3.0", - "chart.js": "^3.6.0", + "chart.js": "^3.9.1", "chartjs-adapter-luxon": "^1.1.0", "chartjs-plugin-annotation": "^1.3.0", "chartjs-plugin-streaming": "^2.0.0", @@ -10763,9 +10763,9 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "node_modules/chart.js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.6.0.tgz", - "integrity": "sha512-iOzzDKePL+bj+ccIsVAgWQehCXv8xOKGbaU2fO/myivH736zcx535PGJzQGanvcSGVOqX6yuLZsN3ygcQ35UgQ==" + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz", + "integrity": "sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==" }, "node_modules/chartjs-adapter-luxon": { "version": "1.1.0", @@ -36669,9 +36669,9 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "chart.js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.6.0.tgz", - "integrity": "sha512-iOzzDKePL+bj+ccIsVAgWQehCXv8xOKGbaU2fO/myivH736zcx535PGJzQGanvcSGVOqX6yuLZsN3ygcQ35UgQ==" + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz", + "integrity": "sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==" }, "chartjs-adapter-luxon": { "version": "1.1.0", diff --git a/package.json b/package.json index ba8baef9a..d142ddd6a 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "@ngx-translate/core": "^11.0.1", "@ngx-translate/http-loader": "^4.0.0", "ag-virtual-scroll": "^1.3.0", - "chart.js": "^3.6.0", + "chart.js": "^3.9.1", "chartjs-adapter-luxon": "^1.1.0", "chartjs-plugin-annotation": "^1.3.0", "chartjs-plugin-streaming": "^2.0.0", @@ -250,4 +250,4 @@ "*.css": "stylelint --fix", "*.{ts,js,css,md}": "prettier --write" } -} \ No newline at end of file +} diff --git a/src/components/beans/bean-roast-information/bean-roast-information.component.ts b/src/components/beans/bean-roast-information/bean-roast-information.component.ts index 7fda28af2..7cef1d9cd 100644 --- a/src/components/beans/bean-roast-information/bean-roast-information.component.ts +++ b/src/components/beans/bean-roast-information/bean-roast-information.component.ts @@ -53,16 +53,16 @@ export class BeanRoastInformationComponent implements OnInit { const modal = await this.modalCtrl.create({ component: DatetimePopoverComponent, id: 'datetime-popover', - cssClass: 'half-bottom-modal', - showBackdrop: true, - backdropDismiss: true, - swipeToClose: true, + cssClass: 'popover-actions', + breakpoints: [0, 0.5, 0.75, 1], + initialBreakpoint: 0.5, componentProps: { displayingTime: this.displayingTime }, }); await modal.present(); const modalData = await modal.onWillDismiss(); if ( modalData !== undefined && + modalData.data && modalData.data.displayingTime !== undefined ) { this.displayingTime = modalData.data.displayingTime; diff --git a/src/components/brew-timer/brew-timer.component.ts b/src/components/brew-timer/brew-timer.component.ts index 82ba0adee..84e77512b 100644 --- a/src/components/brew-timer/brew-timer.component.ts +++ b/src/components/brew-timer/brew-timer.component.ts @@ -273,16 +273,16 @@ export class BrewTimerComponent implements OnInit, OnDestroy { const modal = await this.modalCtrl.create({ component: DatetimePopoverComponent, id: 'datetime-popover', - cssClass: 'half-bottom-modal', - showBackdrop: true, - backdropDismiss: true, - swipeToClose: true, + cssClass: 'popover-actions', + breakpoints: [0, 0.5, 0.75, 1], + initialBreakpoint: 0.5, componentProps: { displayingTime: this.displayingTime }, }); await modal.present(); const modalData = await modal.onWillDismiss(); if ( modalData !== undefined && + modalData.data && modalData.data.displayingTime !== undefined ) { this.displayingTime = modalData.data.displayingTime; diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index dbe4e3a99..2f16c46ac 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -1254,16 +1254,16 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { const modal = await this.modalController.create({ component: DatetimePopoverComponent, id: 'datetime-popover', - cssClass: 'half-bottom-modal', - showBackdrop: true, - backdropDismiss: true, - swipeToClose: true, + cssClass: 'popover-actions', + breakpoints: [0, 0.5, 0.75, 1], + initialBreakpoint: 0.5, componentProps: { displayingTime: this.displayingBrewTime }, }); await modal.present(); const modalData = await modal.onWillDismiss(); if ( modalData !== undefined && + modalData.data && modalData.data.displayingTime !== undefined ) { this.displayingBrewTime = modalData.data.displayingTime; diff --git a/src/components/timer/timer.component.ts b/src/components/timer/timer.component.ts index 3b2665d8d..c08187391 100644 --- a/src/components/timer/timer.component.ts +++ b/src/components/timer/timer.component.ts @@ -216,16 +216,16 @@ export class TimerComponent implements OnInit, OnDestroy { const modal = await this.modalCtrl.create({ component: DatetimePopoverComponent, id: 'datetime-popover', - cssClass: 'half-bottom-modal', - showBackdrop: true, - backdropDismiss: true, - swipeToClose: true, + cssClass: 'popover-actions', + breakpoints: [0, 0.5, 0.75, 1], + initialBreakpoint: 0.5, componentProps: { displayingTime: this.displayingTime }, }); await modal.present(); const modalData = await modal.onWillDismiss(); if ( modalData !== undefined && + modalData.data && modalData.data.displayingTime !== undefined ) { this.displayingTime = modalData.data.displayingTime; diff --git a/src/popover/datetime-popover/datetime-popover.component.html b/src/popover/datetime-popover/datetime-popover.component.html index d6becb355..9089d33f5 100644 --- a/src/popover/datetime-popover/datetime-popover.component.html +++ b/src/popover/datetime-popover/datetime-popover.component.html @@ -1,20 +1,20 @@ - + + + {{"TIMER_HOUR" | translate}} {{"TIMER_MINUTES" | translate}} {{"TIMER_SECONDS" | translate}} - {{"TIMER_MILLISECONDS" | translate}} + {{"TIMER_MILLISECONDS" | translate}} - + - - - + {{"CHOOSE" | translate}} - + + diff --git a/src/popover/datetime-popover/datetime-popover.component.scss b/src/popover/datetime-popover/datetime-popover.component.scss index f81935467..c2dc22b74 100644 --- a/src/popover/datetime-popover/datetime-popover.component.scss +++ b/src/popover/datetime-popover/datetime-popover.component.scss @@ -1,16 +1,9 @@ :host { - --max-height: 25%; - top: 75%; - position: absolute; - margin-inline-start: 10px; - margin-inline-end: 10px; - border-radius: 6px; - margin-block-end: 10px; + ion-header { + height:40px; + background-color: #ffffff; + } - @media (max-height: 450px) { - --max-height: 50%; - top: 50%; - } ion-col { text-align:center; } From 0433ddd03001e1b1f533ce60edcc7e2597df39b6 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sat, 27 Aug 2022 14:03:58 +0200 Subject: [PATCH 62/78] #394 - Maximize realtime graphic when starting timer. Fixing milliseconds on the realtime graphic --- src/app/app.component.ts | 1 - .../brew/brew-flow/brew-flow.component.html | 3 +- src/app/brew/brew-flow/brew-flow.component.ts | 131 ++++++++++-------- src/app/settings/settings.page.html | 12 +- src/assets/i18n/de.json | 3 +- src/assets/i18n/en.json | 3 +- src/assets/i18n/es.json | 3 +- src/assets/i18n/tr.json | 3 +- src/assets/i18n/zh.json | 3 +- src/classes/settings/settings.ts | 2 + .../brew-brewing/brew-brewing.component.ts | 4 + src/interfaces/settings/iSettings.ts | 1 + src/services/uiHelper.ts | 11 ++ 13 files changed, 117 insertions(+), 63 deletions(-) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 2defce90f..b9cceaf6c 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -320,7 +320,6 @@ export class AppComponent implements AfterViewInit { // Just support deeplinks on devices. this.intentHandlerService.attachOnHandleOpenUrl(); } - // Before we update and show messages, we need atleast to set one default language. this._translate.setDefaultLang('en'); await this._translate.use('en').toPromise(); diff --git a/src/app/brew/brew-flow/brew-flow.component.html b/src/app/brew/brew-flow/brew-flow.component.html index cf22d1ed1..a5220abea 100644 --- a/src/app/brew/brew-flow/brew-flow.component.html +++ b/src/app/brew/brew-flow/brew-flow.component.html @@ -37,7 +37,8 @@ -
{{this.uiHelper.formatSeconds(brew.brew_time,'mm:ss')}}
+
{{this.uiHelper.formatSeconds(brew.brew_time,'mm:ss')}}
+
{{this.uiHelper.formatSecondsAndMilliseconds(brew.brew_time,brew.brew_time_milliseconds,'mm:ss.SSS')}}
{{"BREW_DATA_TIME" | translate}} diff --git a/src/app/brew/brew-flow/brew-flow.component.ts b/src/app/brew/brew-flow/brew-flow.component.ts index 8e0544114..b2c2b52c3 100644 --- a/src/app/brew/brew-flow/brew-flow.component.ts +++ b/src/app/brew/brew-flow/brew-flow.component.ts @@ -1,15 +1,23 @@ -import {AfterViewInit, Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, ViewChild} from '@angular/core'; -import {ModalController, Platform} from '@ionic/angular'; -import {Subscription} from 'rxjs'; -import {Brew} from '../../../classes/brew/brew'; -import {UIHelper} from '../../../services/uiHelper'; -import {ScreenOrientation} from '@ionic-native/screen-orientation/ngx'; -import {UISettingsStorage} from '../../../services/uiSettingsStorage'; -import {UIBrewHelper} from '../../../services/uiBrewHelper'; -import {PREPARATION_STYLE_TYPE} from '../../../enums/preparations/preparationStyleTypes'; -import {Settings} from '../../../classes/settings/settings'; -import {BrewBrewingComponent} from '../../../components/brews/brew-brewing/brew-brewing.component'; - +import { + AfterViewInit, + Component, + ElementRef, + EventEmitter, + Input, + OnDestroy, + OnInit, + ViewChild, +} from '@angular/core'; +import { ModalController, Platform } from '@ionic/angular'; +import { Subscription } from 'rxjs'; +import { Brew } from '../../../classes/brew/brew'; +import { UIHelper } from '../../../services/uiHelper'; +import { ScreenOrientation } from '@ionic-native/screen-orientation/ngx'; +import { UISettingsStorage } from '../../../services/uiSettingsStorage'; +import { UIBrewHelper } from '../../../services/uiBrewHelper'; +import { PREPARATION_STYLE_TYPE } from '../../../enums/preparations/preparationStyleTypes'; +import { Settings } from '../../../classes/settings/settings'; +import { BrewBrewingComponent } from '../../../components/brews/brew-brewing/brew-brewing.component'; @Component({ selector: 'brew-flow', @@ -18,9 +26,12 @@ import {BrewBrewingComponent} from '../../../components/brews/brew-brewing/brew- }) export class BrewFlowComponent implements AfterViewInit, OnDestroy { public static COMPONENT_ID: string = 'brew-flow'; - @ViewChild('smartScaleWeight', {read: ElementRef}) public smartScaleWeightEl: ElementRef; - @ViewChild('smartScaleWeightPerSecond', {read: ElementRef}) public smartScaleWeightPerSecondEl: ElementRef; - @ViewChild('smartScaleAvgFlowPerSecond', {read: ElementRef}) public smartScaleAvgFlowPerSecondEl: ElementRef; + @ViewChild('smartScaleWeight', { read: ElementRef }) + public smartScaleWeightEl: ElementRef; + @ViewChild('smartScaleWeightPerSecond', { read: ElementRef }) + public smartScaleWeightPerSecondEl: ElementRef; + @ViewChild('smartScaleAvgFlowPerSecond', { read: ElementRef }) + public smartScaleAvgFlowPerSecondEl: ElementRef; public showBloomTimer: boolean = false; public showDripTimer: boolean = false; @Input() public flowChart: any; @@ -30,27 +41,30 @@ export class BrewFlowComponent implements AfterViewInit, OnDestroy { @Input() public brewComponent: BrewBrewingComponent; @Input() public isDetail: boolean = false; private brewFlowGraphSubscription: Subscription; - @ViewChild('flowContent',{read: ElementRef}) public flowContent: ElementRef; - constructor (private readonly modalController: ModalController, - private readonly screenOrientation: ScreenOrientation, - private readonly uiHelper: UIHelper, - private readonly uiSettingsStorage: UISettingsStorage, - private readonly uiBrewHelper: UIBrewHelper) { - } - - public async ngAfterViewInit () { - - + @ViewChild('flowContent', { read: ElementRef }) + public flowContent: ElementRef; + public settings: Settings; + constructor( + private readonly modalController: ModalController, + private readonly screenOrientation: ScreenOrientation, + private readonly uiHelper: UIHelper, + private readonly uiSettingsStorage: UISettingsStorage, + private readonly uiBrewHelper: UIBrewHelper + ) {} + + public async ngAfterViewInit() { + this.settings = this.uiSettingsStorage.getSettings(); this.flowChartEl.options.responsive = false; this.flowChartEl.update('quite'); - await new Promise((resolve) => { setTimeout(() => { - document.getElementById('brewFlowContainer').append(this.flowChartEl.ctx.canvas); + document + .getElementById('brewFlowContainer') + .append(this.flowChartEl.ctx.canvas); resolve(undefined); }, 50); - }); + }); await new Promise((resolve) => { setTimeout(() => { @@ -63,31 +77,39 @@ export class BrewFlowComponent implements AfterViewInit, OnDestroy { await new Promise((resolve) => { // Looks funny but we need. if we would not calculate and substract 25px, the actual time graph would not be displayed :< setTimeout(() => { - const el = this.flowContent.nativeElement; - const newHeight = document.getElementById('brewFlowContainer').offsetHeight; - this.flowChartEl.ctx.canvas.style.height = (newHeight - 1) + 'px'; + const el = this.flowContent.nativeElement; + const newHeight = + document.getElementById('brewFlowContainer').offsetHeight; + this.flowChartEl.ctx.canvas.style.height = newHeight - 1 + 'px'; resolve(undefined); }, 100); }); - - - if (this.isDetail===false) { - this.brewFlowGraphSubscription = this.brewFlowGraphEvent.subscribe((_val) => { - this.setActualScaleInformation(_val); - }); + if (this.isDetail === false) { + this.brewFlowGraphSubscription = this.brewFlowGraphEvent.subscribe( + (_val) => { + this.setActualScaleInformation(_val); + } + ); const settings: Settings = this.uiSettingsStorage.getSettings(); - this.showBloomTimer = this.uiBrewHelper.fieldVisible(settings.manage_parameters.coffee_blooming_time, + this.showBloomTimer = this.uiBrewHelper.fieldVisible( + settings.manage_parameters.coffee_blooming_time, this.brew.getPreparation().manage_parameters.coffee_blooming_time, - this.brew.getPreparation().use_custom_parameters); - - this.showDripTimer = (this.uiBrewHelper.fieldVisible(settings.manage_parameters.coffee_first_drip_time, - this.brew.getPreparation().manage_parameters.coffee_first_drip_time, - this.brew.getPreparation().use_custom_parameters) && this.brew.getPreparation().style_type === PREPARATION_STYLE_TYPE.ESPRESSO); - } + this.brew.getPreparation().use_custom_parameters + ); + + this.showDripTimer = + this.uiBrewHelper.fieldVisible( + settings.manage_parameters.coffee_first_drip_time, + this.brew.getPreparation().manage_parameters.coffee_first_drip_time, + this.brew.getPreparation().use_custom_parameters + ) && + this.brew.getPreparation().style_type === + PREPARATION_STYLE_TYPE.ESPRESSO; + } } public startTimer() { @@ -106,18 +128,17 @@ export class BrewFlowComponent implements AfterViewInit, OnDestroy { this.brewComponent.timer.__tareScale(); } - public setCoffeeDripTime (): void { - + public setCoffeeDripTime(): void { this.brew.coffee_first_drip_time = this.brew.brew_time; this.showDripTimer = false; } - public setCoffeeBloomingTime (): void { + public setCoffeeBloomingTime(): void { this.brew.coffee_blooming_time = this.brew.brew_time; this.showBloomTimer = false; } - public setActualScaleInformation (_val: any) { + public setActualScaleInformation(_val: any) { const weightEl = this.smartScaleWeightEl.nativeElement; const flowEl = this.smartScaleWeightPerSecondEl.nativeElement; const avgFlowEl = this.smartScaleAvgFlowPerSecondEl.nativeElement; @@ -134,13 +155,15 @@ export class BrewFlowComponent implements AfterViewInit, OnDestroy { this.flowChartEl.maintainAspectRatio = false; this.flowChartEl.update('quite'); - } public dismiss() { - this.modalController.dismiss({ - dismissed: true - },undefined,BrewFlowComponent.COMPONENT_ID); + this.modalController.dismiss( + { + dismissed: true, + }, + undefined, + BrewFlowComponent.COMPONENT_ID + ); } - } diff --git a/src/app/settings/settings.page.html b/src/app/settings/settings.page.html index a184ba49c..3d136d144 100644 --- a/src/app/settings/settings.page.html +++ b/src/app/settings/settings.page.html @@ -278,7 +278,6 @@

{{"PAGE_SETTINGS_ANALYTICS_INFORMATION" | translate}}

-

{{"SMART_SCALE_STAY_CONNECTED_ON_APP_MINIMIZE" | translate}}

{{"PAGE_SETTINGS_ANALYTICS_INFORMATION" | translate}}
+ +

{{"SMART_SCALE_MAXIMIZE_ON_START_TIMER" | translate}}

+ +

{{"IGNORE_NEGATIVE_VALUES" | translate}}

{{"IGNORE_ANOMALY_VALUES" | translate}} {{this.uiHelper.toFixedIfNecessary(settings.pressure_threshold_bar,1)}}
- + +

{{"SMART_SCALE_MAXIMIZE_ON_START_TIMER" | translate}}

+ +

{{"PRESSURE_LOG" | translate}}

Date: Sat, 3 Sep 2022 21:01:48 +0200 Subject: [PATCH 63/78] #406 Support filtering beans in selection screen --- .../bean-modal-select.component.html | 134 +++++++++++- .../bean-modal-select.component.scss | 4 + .../bean-modal-select.component.ts | 201 +++++++++++++----- 3 files changed, 282 insertions(+), 57 deletions(-) diff --git a/src/app/beans/bean-modal-select/bean-modal-select.component.html b/src/app/beans/bean-modal-select/bean-modal-select.component.html index 65dcf6fed..6ac8458ff 100644 --- a/src/app/beans/bean-modal-select/bean-modal-select.component.html +++ b/src/app/beans/bean-modal-select/bean-modal-select.component.html @@ -26,8 +26,38 @@
- -
+
+ + + + + +
+ + + {{"BEAN_DATA_ROASTING_TYPE" | translate}} + + + {{"BEAN_ROASTING_TYPE_" + key | translate}} + + + + {{"BEAN_DATA_ROASTER" | translate}} + + {{key}} + + +
@@ -57,8 +87,37 @@
{{bean.name}}
- -
+
+ + + + + +
+ + {{"BEAN_DATA_ROASTING_TYPE" | translate}} + + + {{"BEAN_ROASTING_TYPE_" + key | translate}} + + + + {{"BEAN_DATA_ROASTER" | translate}} + + {{key}} + + +
@@ -94,8 +153,38 @@
{{bean.name}}
- -
+
> + + + + + +
+ + + {{"BEAN_DATA_ROASTING_TYPE" | translate}} + + + {{"BEAN_ROASTING_TYPE_" + key | translate}} + + + + {{"BEAN_DATA_ROASTER" | translate}} + + {{key}} + + +
@@ -125,8 +214,37 @@
{{bean.name}}
- -
+
+ + + + + +
+ + {{"BEAN_DATA_ROASTING_TYPE" | translate}} + + + {{"BEAN_ROASTING_TYPE_" + key | translate}} + + + + {{"BEAN_DATA_ROASTER" | translate}} + + {{key}} + + +
diff --git a/src/app/beans/bean-modal-select/bean-modal-select.component.scss b/src/app/beans/bean-modal-select/bean-modal-select.component.scss index 4ee8bf20f..1f36eeba3 100644 --- a/src/app/beans/bean-modal-select/bean-modal-select.component.scss +++ b/src/app/beans/bean-modal-select/bean-modal-select.component.scss @@ -5,4 +5,8 @@ line-height: 12px; font-size: 12px; } + .container { + display: flex; + } + } diff --git a/src/app/beans/bean-modal-select/bean-modal-select.component.ts b/src/app/beans/bean-modal-select/bean-modal-select.component.ts index 2e26f934a..ba44a21fd 100644 --- a/src/app/beans/bean-modal-select/bean-modal-select.component.ts +++ b/src/app/beans/bean-modal-select/bean-modal-select.component.ts @@ -1,10 +1,13 @@ -import {Component, Input, OnInit} from '@angular/core'; -import {ModalController} from '@ionic/angular'; -import {UIBeanStorage} from '../../../services/uiBeanStorage'; -import {Bean} from '../../../classes/bean/bean'; -import {Brew} from '../../../classes/brew/brew'; -import {UIBeanHelper} from '../../../services/uiBeanHelper'; -import {BEAN_ROASTING_TYPE_ENUM} from '../../../enums/beans/beanRoastingType'; +import { Component, Input, OnInit } from '@angular/core'; +import { ModalController } from '@ionic/angular'; +import { UIBeanStorage } from '../../../services/uiBeanStorage'; +import { Bean } from '../../../classes/bean/bean'; +import { Brew } from '../../../classes/brew/brew'; +import { UIBeanHelper } from '../../../services/uiBeanHelper'; +import { BEAN_ROASTING_TYPE_ENUM } from '../../../enums/beans/beanRoastingType'; +import { IBeanPageFilter } from '../../../interfaces/bean/iBeanPageFilter'; +import { UISettingsStorage } from '../../../services/uiSettingsStorage'; +import { Settings } from '../../../classes/settings/settings'; @Component({ selector: 'bean-modal-select', @@ -26,20 +29,76 @@ export class BeanModalSelectComponent implements OnInit { public finishedBeansFilterText: string = ''; public finishedBeans: Array = []; - constructor(private readonly modalController: ModalController, - private readonly uiBeanStorage: UIBeanStorage, - private readonly uiBeanHelper: UIBeanHelper) { + public filter_open: IBeanPageFilter; + public filter_finished: IBeanPageFilter; + public open_roasteries: Array = undefined; + + public finished_roasteries: Array = undefined; + public settings: Settings; + + public filterVisible: any = { + open: false, + archived: false, + }; + + constructor( + private readonly modalController: ModalController, + private readonly uiBeanStorage: UIBeanStorage, + private readonly uiBeanHelper: UIBeanHelper, + private readonly uiSettingsStorage: UISettingsStorage + ) { + this.settings = this.uiSettingsStorage.getSettings(); + this.objs = this.uiBeanStorage.getAllEntries(); + this.filter_open = this.settings.GET_BEAN_FILTER(); + this.filter_finished = this.settings.GET_BEAN_FILTER(); + const beans: Array = this.uiBeanStorage.getAllEntries(); + this.open_roasteries = [ + ...new Set( + beans.filter((e) => e.finished === false).map((e: Bean) => e.roaster) + ), + ]; + this.open_roasteries = this.open_roasteries + .filter((name: string) => name !== '') + .sort((a, b) => { + const nameA = a.toUpperCase(); + const nameB = b.toUpperCase(); + if (nameA < nameB) { + return -1; + } + if (nameA > nameB) { + return 1; + } - this.objs = this.uiBeanStorage.getAllEntries(); + return 0; + }); + this.finished_roasteries = [ + ...new Set( + beans.filter((e) => e.finished === true).map((e: Bean) => e.roaster) + ), + ]; + this.finished_roasteries = this.finished_roasteries + .filter((name: string) => name !== '') + .sort((a, b) => { + const nameA = a.toUpperCase(); + const nameB = b.toUpperCase(); + if (nameA < nameB) { + return -1; + } + if (nameA > nameB) { + return 1; + } + + return 0; + }); } public ionViewDidEnter(): void { if (this.multiple) { for (const obj of this.objs) { - - this.multipleSelection[obj.config.uuid] = this.selectedValues.filter((e) => e === obj.config.uuid).length > 0; + this.multipleSelection[obj.config.uuid] = + this.selectedValues.filter((e) => e === obj.config.uuid).length > 0; } } else { if (this.selectedValues.length > 0) { @@ -51,7 +110,9 @@ export class BeanModalSelectComponent implements OnInit { public getUsedWeightCount(_bean: Bean): number { let usedWeightCount: number = 0; - const relatedBrews: Array = this.uiBeanHelper.getAllBrewsForThisBean(_bean.config.uuid); + const relatedBrews: Array = this.uiBeanHelper.getAllBrewsForThisBean( + _bean.config.uuid + ); for (const brew of relatedBrews) { if (brew.bean_weight_in > 0) { usedWeightCount += brew.bean_weight_in; @@ -62,14 +123,12 @@ export class BeanModalSelectComponent implements OnInit { return usedWeightCount; } - public ngOnInit() { - - } + public ngOnInit() {} public getOpenBeans(): Array { - - return this.objs.filter( - (e) => !e.finished).sort( (a,b) => { + return this.objs + .filter((e) => !e.finished) + .sort((a, b) => { const nameA = a.name.toUpperCase(); const nameB = b.name.toUpperCase(); @@ -81,14 +140,13 @@ export class BeanModalSelectComponent implements OnInit { } return 0; - } - ); + }); } public getFinishedBeans(): Array { - - return this.objs.filter( - (e) => e.finished).sort( (a,b) => { + return this.objs + .filter((e) => e.finished) + .sort((a, b) => { const nameA = a.name.toUpperCase(); const nameB = b.name.toUpperCase(); @@ -100,16 +158,12 @@ export class BeanModalSelectComponent implements OnInit { } return 0; - } - ); + }); } - public async choose(): Promise { const chosenKeys: Array = []; if (this.multiple) { - - for (const key in this.multipleSelection) { if (this.multipleSelection[key] === true) { chosenKeys.push(key); @@ -126,23 +180,45 @@ export class BeanModalSelectComponent implements OnInit { } selected_text = selected_text.substr(0, selected_text.lastIndexOf(', ')); - this.modalController.dismiss({ - selected_values: chosenKeys, - selected_text: selected_text, - },undefined, BeanModalSelectComponent.COMPONENT_ID); + this.modalController.dismiss( + { + selected_values: chosenKeys, + selected_text: selected_text, + }, + undefined, + BeanModalSelectComponent.COMPONENT_ID + ); } public async dismiss(): Promise { - this.modalController.dismiss(undefined,undefined,BeanModalSelectComponent.COMPONENT_ID); + this.modalController.dismiss( + undefined, + undefined, + BeanModalSelectComponent.COMPONENT_ID + ); } public isBeanRoastUnknown(_bean: Bean) { if (_bean) { - return _bean.bean_roasting_type === 'UNKNOWN' as BEAN_ROASTING_TYPE_ENUM; + return ( + _bean.bean_roasting_type === ('UNKNOWN' as BEAN_ROASTING_TYPE_ENUM) + ); } return true; } - + public async showFilter(_type: string) { + if (_type === 'open') { + this.filterVisible.open = !this.filterVisible.open; + } else { + this.filterVisible.archived = !this.filterVisible.archived; + } + } + public isFilterActive(_type: string) { + if (_type === 'open') { + return this.filterVisible.open; + } + return this.filterVisible.archived; + } public research() { this.__initializeBeansView('open'); @@ -150,16 +226,42 @@ export class BeanModalSelectComponent implements OnInit { } private __initializeBeansView(_type: string) { const beansCopy: Array = [...this.objs]; - const isOpen: boolean = (_type === 'open'); + const isOpen: boolean = _type === 'open'; let filterBeans: Array; if (isOpen) { - filterBeans = beansCopy.filter( - (bean) => !bean.finished); - } else { + filterBeans = beansCopy.filter((bean) => !bean.finished); - filterBeans = beansCopy.filter( - (bean) => bean.finished); + if (this.filter_open.bean_roaster?.length > 0) { + filterBeans = filterBeans.filter( + (e: Bean) => + this.filter_open.bean_roaster.includes(e.roaster) === true + ); + } + if (this.filter_open.bean_roasting_type?.length > 0) { + filterBeans = filterBeans.filter( + (e: Bean) => + this.filter_open.bean_roasting_type.includes( + e.bean_roasting_type + ) === true + ); + } + } else { + filterBeans = beansCopy.filter((bean) => bean.finished); + if (this.filter_finished.bean_roaster?.length > 0) { + filterBeans = filterBeans.filter( + (e: Bean) => + this.filter_finished.bean_roaster.includes(e.roaster) === true + ); + } + if (this.filter_finished.bean_roasting_type?.length > 0) { + filterBeans = filterBeans.filter( + (e: Bean) => + this.filter_finished.bean_roasting_type.includes( + e.bean_roasting_type + ) === true + ); + } } let searchText: string = ''; @@ -170,17 +272,18 @@ export class BeanModalSelectComponent implements OnInit { } if (searchText) { - filterBeans = filterBeans.filter((e) => e.note?.toLowerCase().includes(searchText) || - e.name?.toLowerCase().includes(searchText) || - e.roaster?.toLowerCase().includes(searchText) || - e.aromatics?.toLowerCase().includes(searchText)); + filterBeans = filterBeans.filter( + (e) => + e.note?.toLowerCase().includes(searchText) || + e.name?.toLowerCase().includes(searchText) || + e.roaster?.toLowerCase().includes(searchText) || + e.aromatics?.toLowerCase().includes(searchText) + ); } if (isOpen) { this.openBeans = filterBeans; } else { this.finishedBeans = filterBeans; } - } - } From 0481293c1f9ba3fce332d011eb59dde1e82a5b92 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sat, 3 Sep 2022 21:02:48 +0200 Subject: [PATCH 64/78] fix html --- .../beans/bean-modal-select/bean-modal-select.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/beans/bean-modal-select/bean-modal-select.component.html b/src/app/beans/bean-modal-select/bean-modal-select.component.html index 6ac8458ff..e5cee5ef2 100644 --- a/src/app/beans/bean-modal-select/bean-modal-select.component.html +++ b/src/app/beans/bean-modal-select/bean-modal-select.component.html @@ -153,7 +153,7 @@
{{bean.name}}
-
> +
Date: Sat, 3 Sep 2022 21:19:39 +0200 Subject: [PATCH 65/78] update package --- package-lock.json | 34 +++++++++++++++++----------------- package.json | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7076cc049..df8f01fcf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "@ionic-native/splash-screen": "^5.33.1", "@ionic-native/status-bar": "^5.33.1", "@ionic-native/three-dee-touch": "^5.33.1", - "@ionic/angular": "^6.2.4", + "@ionic/angular": "^6.2.5", "@ionic/cli": "^6.18.1", "@ionic/storage": "^2.3.1", "@ngx-translate/core": "^11.0.1", @@ -4332,11 +4332,11 @@ } }, "node_modules/@ionic/angular": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.2.4.tgz", - "integrity": "sha512-rHjt5nXA6egZ6cyBA46se3u5O0OYZKtOPrgZR49tpnGcCTEpLSxFpRGjxuKLyAaV6z9fR5krnGRybia+Wt1qbw==", + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.2.5.tgz", + "integrity": "sha512-J0yjeDjux+Cff2DEH3JsYS8aooyVN2moS53RdpBI11Wq+37KR6AAmcmFLdP8gm4MWs/ZcfUt2calp4sXjUlaOg==", "dependencies": { - "@ionic/core": "^6.2.4", + "@ionic/core": "^6.2.5", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" }, @@ -7727,12 +7727,12 @@ } }, "node_modules/@ionic/core": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.2.4.tgz", - "integrity": "sha512-LDRIwG5plwTHELxQ/j3uEfLJ7YkzJzR1V4QGE+X59aE/l7XoXZyLb1NWFjY7glBbFHGQgSuPFWNhXFkyRBxRFQ==", + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.2.5.tgz", + "integrity": "sha512-PLnG182RYydXB71cjkMk2TLxFVKabvEc9wjeK5SsvxI1/QE9+wPfxDnvKWag8UeXgaGUhby1bitWkV5pniDaXA==", "dependencies": { "@stencil/core": "^2.17.4", - "ionicons": "^6.0.2", + "ionicons": "^6.0.3", "tslib": "^2.1.0" } }, @@ -31757,11 +31757,11 @@ } }, "@ionic/angular": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.2.4.tgz", - "integrity": "sha512-rHjt5nXA6egZ6cyBA46se3u5O0OYZKtOPrgZR49tpnGcCTEpLSxFpRGjxuKLyAaV6z9fR5krnGRybia+Wt1qbw==", + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.2.5.tgz", + "integrity": "sha512-J0yjeDjux+Cff2DEH3JsYS8aooyVN2moS53RdpBI11Wq+37KR6AAmcmFLdP8gm4MWs/ZcfUt2calp4sXjUlaOg==", "requires": { - "@ionic/core": "^6.2.4", + "@ionic/core": "^6.2.5", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" } @@ -34229,12 +34229,12 @@ } }, "@ionic/core": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.2.4.tgz", - "integrity": "sha512-LDRIwG5plwTHELxQ/j3uEfLJ7YkzJzR1V4QGE+X59aE/l7XoXZyLb1NWFjY7glBbFHGQgSuPFWNhXFkyRBxRFQ==", + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.2.5.tgz", + "integrity": "sha512-PLnG182RYydXB71cjkMk2TLxFVKabvEc9wjeK5SsvxI1/QE9+wPfxDnvKWag8UeXgaGUhby1bitWkV5pniDaXA==", "requires": { "@stencil/core": "^2.17.4", - "ionicons": "^6.0.2", + "ionicons": "^6.0.3", "tslib": "^2.1.0" } }, diff --git a/package.json b/package.json index d142ddd6a..a11eba373 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@ionic-native/splash-screen": "^5.33.1", "@ionic-native/status-bar": "^5.33.1", "@ionic-native/three-dee-touch": "^5.33.1", - "@ionic/angular": "^6.2.4", + "@ionic/angular": "^6.2.5", "@ionic/cli": "^6.18.1", "@ionic/storage": "^2.3.1", "@ngx-translate/core": "^11.0.1", From 9e0e08ab12da4286af9a8faa2e340f56609812d8 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Wed, 7 Sep 2022 20:55:57 +0200 Subject: [PATCH 66/78] #375 - Pressure tile added and reset zero button --- install.md | 32 ++++------ package-lock.json | 21 +++++++ package.json | 1 + .../brew/brew-flow/brew-flow.component.html | 15 ++++- src/app/brew/brew-flow/brew-flow.component.ts | 60 +++++++++++++++++-- src/app/shared/shared.module.ts | 2 + .../brew-brewing/brew-brewing.component.ts | 6 +- 7 files changed, 110 insertions(+), 27 deletions(-) diff --git a/install.md b/install.md index 6f463a555..1fec87042 100755 --- a/install.md +++ b/install.md @@ -1,13 +1,12 @@ # Fileplugin + ionic cordova plugin add cordova-plugin-file npm install @ionic-native/file - #In app browser ionic cordova plugin add cordova-plugin-inappbrowser npm install @ionic-native/in-app-browser - #Image picker ionic cordova plugin add cordova-plugin-telerik-imagepicker npm install @ionic-native/image-picker @@ -20,23 +19,22 @@ npm install @ionic-native/camera ionic cordova plugin add cordova-plugin-android-permissions npm install @ionic-native/android-permissions - #Storage ionic cordova plugin add cordova-sqlite-storage npm install --save @ionic/storage - #FileChooser ionic cordova plugin add cordova-plugin-filechooser npm install @ionic-native/file-chooser #FilePath + ### ionic cordova plugin add cordova-plugin-filepath + ionic cordova plugin add https://github.com/wisdom-garden/cordova-plugin-filepath npm install @ionic-native/file-path - #IOSFilePicker ionic cordova plugin add cordova-plugin-filepicker npm install @ionic-native/file-picker @@ -75,16 +73,13 @@ ionic cordova plugin add cordova-android-support-gradle-release ionic cordova plugin add cordova-plugin-globalization npm install @ionic-native/globalization - ##App version ionic cordova plugin add cordova-plugin-app-version npm install @ionic-native/app-version - ##MultiDex support on Android ionic cordova plugin add cordova-plugin-enable-multidex - ###https://github.com/hughjdavey/ngx-stars npm install --save ngx-stars @@ -93,6 +88,7 @@ https://github.com/skwasjer/skwas-cordova-plugin-datetimepicker#readme cordova plugin add skwas-cordova-plugin-datetimepicker ## Geolocation + ionic cordova plugin add cordova-plugin-geolocation npm install @ionic-native/geolocation @@ -114,9 +110,10 @@ cordova plugin add cordova-plugin-health --variable HEALTH_READ_PERMISSION='App ionic cordova plugin add cordova-plugin-insomnia npm install @ionic-native/insomnia - ##https://www.npmjs.com/package/ag-virtual-scroll + ## We need angular 9 compatibility thats we we need to import 1.3.0 + npm install ag-virtual-scroll@1.3.0 ##QRCode Scanner @@ -124,43 +121,38 @@ Prio 1: https://github.com/fttx/phonegap-plugin-barcodescanner ionic cordova plugin add https://github.com/fttx/phonegap-plugin-barcodescanner.git --save-dev (Next possible fallback: https://openbase.com/js/@red-mobile/cordova-plugin-barcodescanner) - ##Custom URL Scheme: // ionic cordova plugin add cordova-plugin-customurlscheme --variable URL_SCHEME=beanconqueror - ionic cordova plugin add ionic-plugin-deeplinks --variable URL_SCHEME=beanconqueror --variable DEEPLINK_SCHEME=https --variable DEEPLINK_HOST=beanconqueror.com --variable ANDROID_PATH_PREFIX=/app/roaster/bean npm install @ionic-native/deeplinks - https://search.google.com/search-console/not-verified?original_url=/search-console/ownership&original_resource_id ##Ionic Cordova Plugin Adapter X ionic cordova plugin add cordova-plugin-androidx-adapter ionic cordova plugin add cordova-plugin-androidx - ##Bluetooth We combine both plugins, because the other plugins asks all of the permissions. //1. ionic cordova plugin add cordova-plugin-bluetoothle -//2. npm install @ionic-native/bluetooth-le -3. https://github.com/don/cordova-plugin-ble-central +//2. npm install @ionic-native/bluetooth-le 3. https://github.com/don/cordova-plugin-ble-central -> ionic cordova plugin add cordova-plugin-ble-central --variable BLUETOOTH_USAGE_DESCRIPTION="Bluetooth access needed to connect smartscales" --variable IOS_INIT_ON_LOAD=false - - ##File download ionic cordova plugin add https://github.com/dpa99c/cordova-plugin-file-transfer (We cant use the other plugin cause of compile issues) npm install @ionic-native/file-transfer - - ##Currency https://github.com/bengourley/currency-symbol-map +## Screen Orientation -## Screen Orientation ionic cordova plugin add cordova-plugin-screen-orientation npm install @ionic-native/screen-orientation + +## Gauge + +https://ashish-chopra.github.io/ngx-gauge/#demos diff --git a/package-lock.json b/package-lock.json index df8f01fcf..362ede79c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -69,6 +69,7 @@ "luxon": "^2.3.0", "lz-string": "^1.4.4", "moment": "^2.29.1", + "ngx-gauge": "^6.0.0", "ngx-stars": "^1.4.3", "postcss": "^8.3.5", "rxjs": "^6.6.6", @@ -19660,6 +19661,18 @@ "node": ">= 0.4.0" } }, + "node_modules/ngx-gauge": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ngx-gauge/-/ngx-gauge-6.0.0.tgz", + "integrity": "sha512-sXegk6qagd9QN1+kcydjDfPfdK2hh73+W2fIhhXuqBQCG3+5j8SdXEN0jog6eeD5LozRCU0LZgjtwovN6Nc4Bw==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": "^14.0.0", + "@angular/core": "^14.0.0" + } + }, "node_modules/ngx-stars": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/ngx-stars/-/ngx-stars-1.4.3.tgz", @@ -43196,6 +43209,14 @@ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==" }, + "ngx-gauge": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ngx-gauge/-/ngx-gauge-6.0.0.tgz", + "integrity": "sha512-sXegk6qagd9QN1+kcydjDfPfdK2hh73+W2fIhhXuqBQCG3+5j8SdXEN0jog6eeD5LozRCU0LZgjtwovN6Nc4Bw==", + "requires": { + "tslib": "^2.0.0" + } + }, "ngx-stars": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/ngx-stars/-/ngx-stars-1.4.3.tgz", diff --git a/package.json b/package.json index a11eba373..3cfba125f 100644 --- a/package.json +++ b/package.json @@ -78,6 +78,7 @@ "luxon": "^2.3.0", "lz-string": "^1.4.4", "moment": "^2.29.1", + "ngx-gauge": "^6.0.0", "ngx-stars": "^1.4.3", "postcss": "^8.3.5", "rxjs": "^6.6.6", diff --git a/src/app/brew/brew-flow/brew-flow.component.html b/src/app/brew/brew-flow/brew-flow.component.html index a5220abea..58817f093 100644 --- a/src/app/brew/brew-flow/brew-flow.component.html +++ b/src/app/brew/brew-flow/brew-flow.component.html @@ -1,7 +1,7 @@ - + @@ -14,7 +14,18 @@ - + + + + +
? g/s
diff --git a/src/app/brew/brew-flow/brew-flow.component.ts b/src/app/brew/brew-flow/brew-flow.component.ts index b2c2b52c3..c41c765b3 100644 --- a/src/app/brew/brew-flow/brew-flow.component.ts +++ b/src/app/brew/brew-flow/brew-flow.component.ts @@ -18,6 +18,11 @@ import { UIBrewHelper } from '../../../services/uiBrewHelper'; import { PREPARATION_STYLE_TYPE } from '../../../enums/preparations/preparationStyleTypes'; import { Settings } from '../../../classes/settings/settings'; import { BrewBrewingComponent } from '../../../components/brews/brew-brewing/brew-brewing.component'; +import { TranslateService } from '@ngx-translate/core'; +import { + CoffeeBluetoothDevicesService, + PressureDevice, +} from '@graphefruit/coffee-bluetooth-devices'; @Component({ selector: 'brew-flow', @@ -34,22 +39,34 @@ export class BrewFlowComponent implements AfterViewInit, OnDestroy { public smartScaleAvgFlowPerSecondEl: ElementRef; public showBloomTimer: boolean = false; public showDripTimer: boolean = false; + public gaugeVisible: boolean = false; @Input() public flowChart: any; @Input() public flowChartEl: any; @Input() private brewFlowGraphEvent: EventEmitter; + @Input() private brewPressureGraphEvent: EventEmitter; + @Input() public brew: Brew; @Input() public brewComponent: BrewBrewingComponent; @Input() public isDetail: boolean = false; private brewFlowGraphSubscription: Subscription; - @ViewChild('flowContent', { read: ElementRef }) - public flowContent: ElementRef; + private brewPressureGraphSubscription: Subscription; + public settings: Settings; + + public gaugeType = 'semi'; + public gaugeValue = 0; + public gaugeLabel = ''; + public gaugeSize = 50; + constructor( private readonly modalController: ModalController, private readonly screenOrientation: ScreenOrientation, private readonly uiHelper: UIHelper, private readonly uiSettingsStorage: UISettingsStorage, - private readonly uiBrewHelper: UIBrewHelper + private readonly uiBrewHelper: UIBrewHelper, + private readonly translate: TranslateService, + private readonly bleManager: CoffeeBluetoothDevicesService, + private readonly platform: Platform ) {} public async ngAfterViewInit() { @@ -57,6 +74,14 @@ export class BrewFlowComponent implements AfterViewInit, OnDestroy { this.flowChartEl.options.responsive = false; this.flowChartEl.update('quite'); + setTimeout(() => { + const offsetWidth = document.getElementById('brewPanel').offsetWidth; + + // -16 because of padding + this.gaugeSize = offsetWidth - 16; + }, 1000); + + this.gaugeLabel = this.translate.instant('BREW_PRESSURE_FLOW'); await new Promise((resolve) => { setTimeout(() => { document @@ -77,7 +102,6 @@ export class BrewFlowComponent implements AfterViewInit, OnDestroy { await new Promise((resolve) => { // Looks funny but we need. if we would not calculate and substract 25px, the actual time graph would not be displayed :< setTimeout(() => { - const el = this.flowContent.nativeElement; const newHeight = document.getElementById('brewFlowContainer').offsetHeight; this.flowChartEl.ctx.canvas.style.height = newHeight - 1 + 'px'; @@ -92,6 +116,10 @@ export class BrewFlowComponent implements AfterViewInit, OnDestroy { this.setActualScaleInformation(_val); } ); + this.brewPressureGraphSubscription = + this.brewPressureGraphEvent.subscribe((_val) => { + this.setActualPressureInformation(_val); + }); const settings: Settings = this.uiSettingsStorage.getSettings(); @@ -111,7 +139,14 @@ export class BrewFlowComponent implements AfterViewInit, OnDestroy { PREPARATION_STYLE_TYPE.ESPRESSO; } } + public pressureDeviceConnected() { + if (!this.platform.is('cordova')) { + return true; + } + const pressureDevice: PressureDevice = this.bleManager.getPressureDevice(); + return !!pressureDevice; + } public startTimer() { this.brewComponent.timer.startTimer(); } @@ -147,16 +182,33 @@ export class BrewFlowComponent implements AfterViewInit, OnDestroy { avgFlowEl.textContent = _val.avgFlow; } + public setActualPressureInformation(_val: any) { + this.gaugeValue = _val.pressure; + } + public ngOnDestroy() { if (this.brewFlowGraphSubscription) { this.brewFlowGraphSubscription.unsubscribe(); this.brewFlowGraphSubscription = undefined; } + if (this.brewPressureGraphSubscription) { + this.brewPressureGraphSubscription.unsubscribe(); + this.brewPressureGraphSubscription = undefined; + } this.flowChartEl.maintainAspectRatio = false; this.flowChartEl.update('quite'); } + public resetPressure() { + if (this.pressureDeviceConnected()) { + const pressureDevice: PressureDevice = + this.bleManager.getPressureDevice(); + try { + pressureDevice.updateZero(); + } catch (ex) {} + } + } public dismiss() { this.modalController.dismiss( { diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index fa1edc25b..2e9249138 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -162,6 +162,7 @@ import { QrCodeScannerPopoverComponent } from '../../popover/qr-code-scanner-pop import { PreparationToolModalSelectComponent } from '../preparation/preparation-tool-modal-select/preparation-tool-modal-select.component'; import { PreparationToolOverlayDirective } from '../../directive/preparation-tool-overlay.directive'; import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-devices'; +import { NgxGaugeModule } from 'ngx-gauge'; @NgModule({ declarations: [ @@ -307,6 +308,7 @@ import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-dev RouterModule, NgxStarsModule, AgVirtualScrollModule, + NgxGaugeModule, ], providers: [ AppVersion, diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index 6a2e07773..bb0b516a6 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -123,7 +123,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { public flowProfileChartEl: any = undefined; private startingFlowTime: number = undefined; private brewFlowGraphSubject: EventEmitter = new EventEmitter(); - + private brewPressureGraphSubject: EventEmitter = new EventEmitter(); public pressureDeviceSubscription: Subscription = undefined; constructor( @@ -425,6 +425,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { brew: this.data, flowChartEl: this.flowProfileChartEl, brewFlowGraphEvent: this.brewFlowGraphSubject, + brewPressureGraphEvent: this.brewPressureGraphSubject, }, }); await modal.present(); @@ -1412,6 +1413,9 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { if (!isSmartScaleConnected) { this.flowSecondTick++; } + this.brewPressureGraphSubject.next({ + pressure: pressureObj.actual, + }); } private __setFlowProfile(_scaleChange: any) { From a2b4841fcb62bc5b27ace853503ee6c8e10718b1 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Fri, 16 Sep 2022 20:51:08 +0200 Subject: [PATCH 67/78] Toast message when scale is connected / unsconnected --- config.xml | 1 + package-lock.json | 24 +-- package.json | 2 +- src/app/app.component.ts | 44 +++++- src/app/beans/beans.page.ts | 2 +- src/app/settings/settings.page.ts | 4 +- src/assets/i18n/de.json | 9 +- src/assets/i18n/en.json | 11 +- src/classes/visualizer/visualizer.ts | 146 ++++++++++++++++++ .../brew-brewing/brew-brewing.component.ts | 15 +- src/environments/environment.ts | 2 +- src/services/uiToast.ts | 32 ++-- 12 files changed, 247 insertions(+), 45 deletions(-) create mode 100755 src/classes/visualizer/visualizer.ts diff --git a/config.xml b/config.xml index 4a38f101a..6b15cdcd4 100644 --- a/config.xml +++ b/config.xml @@ -82,6 +82,7 @@ + diff --git a/package-lock.json b/package-lock.json index 362ede79c..0266c0c63 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@angular/platform-browser": "^14.1.0", "@angular/platform-browser-dynamic": "^14.1.0", "@angular/router": "^14.1.0", - "@graphefruit/coffee-bluetooth-devices": "file:../../graphefruit-coffee-bluetooth-devices-0.0.14.tgz", + "@graphefruit/coffee-bluetooth-devices": "file:../../graphefruit-coffee-bluetooth-devices-0.0.17.tgz", "@ionic-native/android-permissions": "^5.33.1", "@ionic-native/app-minimize": "^5.33.1", "@ionic-native/app-version": "^5.33.1", @@ -4046,9 +4046,9 @@ "dev": true }, "node_modules/@graphefruit/coffee-bluetooth-devices": { - "version": "0.0.14", - "resolved": "file:../../graphefruit-coffee-bluetooth-devices-0.0.14.tgz", - "integrity": "sha512-eePday/7pxBiLbD+RgyvMJaajar8oZSW7Pf+OaRpYmlP3QiHS4z/i3+s7XZ0v9XI7Xnp7mAoNOn9t0ORH+FEiw==", + "version": "0.0.17", + "resolved": "file:../../graphefruit-coffee-bluetooth-devices-0.0.17.tgz", + "integrity": "sha512-8G8PuVo+ZLUsGUe6E75RDMaN/rDaJXjP96S/PIbvVEKN7yoPGjFqFNM0B8iEE4i61v40S6gXyXNYptWbazps1A==", "dependencies": { "tslib": "^2.3.0" }, @@ -9522,9 +9522,9 @@ "dev": true }, "node_modules/android-versions": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-1.7.0.tgz", - "integrity": "sha512-TCy4b8Dk8YS6A23ZPfhSKqK66JHFq0D8avGYiwvYpjno6HrrcI0DRgHx9+jtkvWYmrsE2vQWgbHJhvGGhhOb0g==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-1.8.0.tgz", + "integrity": "sha512-2diLBcg3J4sGesUCl/3wkcHhTUOPDXptlXjj/m48yEC0TuVNaEfzgrXQYpqnqj1b5bId9HsAXvR9HaO/mHDcCw==", "dev": true, "dependencies": { "semver": "^5.7.1" @@ -31579,8 +31579,8 @@ "dev": true }, "@graphefruit/coffee-bluetooth-devices": { - "version": "file:../../graphefruit-coffee-bluetooth-devices-0.0.14.tgz", - "integrity": "sha512-eePday/7pxBiLbD+RgyvMJaajar8oZSW7Pf+OaRpYmlP3QiHS4z/i3+s7XZ0v9XI7Xnp7mAoNOn9t0ORH+FEiw==", + "version": "file:../../graphefruit-coffee-bluetooth-devices-0.0.17.tgz", + "integrity": "sha512-8G8PuVo+ZLUsGUe6E75RDMaN/rDaJXjP96S/PIbvVEKN7yoPGjFqFNM0B8iEE4i61v40S6gXyXNYptWbazps1A==", "requires": { "tslib": "^2.3.0" } @@ -35737,9 +35737,9 @@ "dev": true }, "android-versions": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-1.7.0.tgz", - "integrity": "sha512-TCy4b8Dk8YS6A23ZPfhSKqK66JHFq0D8avGYiwvYpjno6HrrcI0DRgHx9+jtkvWYmrsE2vQWgbHJhvGGhhOb0g==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-1.8.0.tgz", + "integrity": "sha512-2diLBcg3J4sGesUCl/3wkcHhTUOPDXptlXjj/m48yEC0TuVNaEfzgrXQYpqnqj1b5bId9HsAXvR9HaO/mHDcCw==", "dev": true, "requires": { "semver": "^5.7.1" diff --git a/package.json b/package.json index 3cfba125f..706865116 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "@angular/platform-browser": "^14.1.0", "@angular/platform-browser-dynamic": "^14.1.0", "@angular/router": "^14.1.0", - "@graphefruit/coffee-bluetooth-devices": "file:../../graphefruit-coffee-bluetooth-devices-0.0.14.tgz", + "@graphefruit/coffee-bluetooth-devices": "file:../../graphefruit-coffee-bluetooth-devices-0.0.17.tgz", "@ionic-native/android-permissions": "^5.33.1", "@ionic-native/app-minimize": "^5.33.1", "@ionic-native/app-version": "^5.33.1", diff --git a/src/app/app.component.ts b/src/app/app.component.ts index b9cceaf6c..4785ecbc1 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -62,8 +62,13 @@ import ChartStreaming from 'chartjs-plugin-streaming'; import zoomPlugin from 'chartjs-plugin-zoom'; import annotationPlugin from 'chartjs-plugin-annotation'; -import { PressureType, ScaleType } from '@graphefruit/coffee-bluetooth-devices'; +import { + CoffeeBluetoothServiceEvent, + PressureType, + ScaleType, +} from '@graphefruit/coffee-bluetooth-devices'; import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-devices'; +import { UIToast } from '../services/uiToast'; declare var AppRate; declare var window; @@ -229,7 +234,8 @@ export class AppComponent implements AfterViewInit { private readonly cleanupService: CleanupService, private readonly device: Device, private readonly appVersion: AppVersion, - private readonly storage: Storage + private readonly storage: Storage, + private readonly uiToast: UIToast ) { // Dont remove androidPlatformService, we need to initialize it via constructor try { @@ -573,6 +579,36 @@ export class AppComponent implements AfterViewInit { this.__instanceAppRating(); this.__attachOnDevicePause(); this.__attachOnDeviceResume(); + + const bleSubscription = this.bleManager + .attachOnEvent() + .subscribe((_type) => { + if (_type === CoffeeBluetoothServiceEvent.CONNECTED_SCALE) { + this.uiToast.showInfoToast( + this._translate.instant('SCALE.CONNECTED_SUCCESSFULLY') + + ' - ' + + this.bleManager.getScale().device_name + + ' / ' + + this.bleManager.getScale().device_id, + false + ); + } else if (_type === CoffeeBluetoothServiceEvent.DISCONNECTED_SCALE) { + this.uiToast.showInfoToast('SCALE.DISCONNECTED_UNPLANNED'); + } else if (_type === CoffeeBluetoothServiceEvent.CONNECTED_PRESSURE) { + this.uiToast.showInfoToast( + this._translate.instant('PRESSURE.CONNECTED_SUCCESSFULLY') + + ' - ' + + this.bleManager.getPressureDevice().device_name + + ' / ' + + this.bleManager.getPressureDevice().device_id, + false + ); + } else if ( + _type === CoffeeBluetoothServiceEvent.DISCONNECTED_PRESSURE + ) { + this.uiToast.showInfoToast('PRESSURE.DISCONNECTED_UNPLANNED'); + } + }); } private __connectSmartScale() { @@ -582,12 +618,12 @@ export class AppComponent implements AfterViewInit { this.uiLog.log(`Connect smartscale? ${scale_id}`); if (scale_id !== undefined && scale_id !== '') { this.bleManager.autoConnectScale(scale_type, scale_id, true); - setTimeout(() => { + /**setTimeout(() => { this.bleManager.disconnect(scale_id); setTimeout(() => { this.bleManager.autoConnectScale(scale_type, scale_id, true); }, 2000); - }, 10000); + }, 10000);**/ } else { this.uiLog.log('Smartscale not connected, dont try to connect'); } diff --git a/src/app/beans/beans.page.ts b/src/app/beans/beans.page.ts index 46ffd16b2..e8f19f415 100644 --- a/src/app/beans/beans.page.ts +++ b/src/app/beans/beans.page.ts @@ -306,7 +306,7 @@ export class BeansPage implements OnInit { ); } else { // Test sample for development - //await this.intenthandler.handleQRCodeLink('https://beanconqueror.com/?qr=7b761a95'); + // await this.intenthandler.handleQRCodeLink('https://beanconqueror.com/?qr=e7ada0a6'); } this.loadBeans(); return; diff --git a/src/app/settings/settings.page.ts b/src/app/settings/settings.page.ts index 36b0c0a69..2e51c8e55 100644 --- a/src/app/settings/settings.page.ts +++ b/src/app/settings/settings.page.ts @@ -303,7 +303,9 @@ export class SettingsPage implements OnInit { const connectedScale = this.bleManager.getScale(); if (connectedScale !== null && connectedScale !== undefined) { skipLoop = 1; - await connectedScale.setLed(true, true); + try { + await connectedScale.setLed(true, true); + } catch (ex) {} } resolve(undefined); }, 1000); diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index a079999a7..edca4502c 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -1205,5 +1205,12 @@ "PAGE_SETTINGS_BEAN_RATING_STEPS": "Bohnen Bewertungsschritte", "COFFEE_GRAMS_BREWED": "Grams gebrüht", "PRESSURE_INFORMATION_DESCRIPTION": "Aktuell nur das Do It Yourself Projekt 'Popsicle' unterstützt", - "SMART_SCALE_MAXIMIZE_ON_START_TIMER": "Bei Zeitstart Echtzeitgrafik maximieren" + "SMART_SCALE_MAXIMIZE_ON_START_TIMER": "Bei Zeitstart Echtzeitgrafik maximieren", + "PRESSURE": { + "CONNECTION_NOT_ESTABLISHED": "Druckgerät konnte nicht gefunden oder verbunden werden", + "CONNECTED_SUCCESSFULLY": "Druckgerät verbunden", + "DISCONNECTED_SUCCESSFULLY": "Druckgerät getrennt", + "DISCONNECTED_UNPLANNED": "Druckgerät ungeplant getrennt", + "INFORMATION_DESCRIPTION": "Unterstütze Druckgeräte sind Popsicle, sowie PRS" + } } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 55f426669..f02aea069 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -201,7 +201,7 @@ "ADD_BREW": "Add brew", "CHOOSE": "Choose", "CHOOSE_PHOTO_OR_LIBRARY": "Record photo or choose from photo gallery.", - "RECORD": "Record", + "RECORD": "Take photo", "PAGE_BEAN_INFORMATION": "Bean information", "PAGE_BEAN_INFORMATION_GOOD_BREWS": "Good", "PAGE_BEAN_INFORMATION_BAD_BREWS": "Bad", @@ -1205,5 +1205,12 @@ "PAGE_SETTINGS_BEAN_RATING_STEPS": "Bean rating steps", "COFFEE_GRAMS_BREWED": "Grams brewed", "PRESSURE_INFORMATION_DESCRIPTION": "Actually just the DIY project 'Popsicle' supported", - "SMART_SCALE_MAXIMIZE_ON_START_TIMER": "Maximize realtime graphic on timer start" + "SMART_SCALE_MAXIMIZE_ON_START_TIMER": "Maximize realtime graphic on timer start", + "PRESSURE": { + "CONNECTION_NOT_ESTABLISHED": "Pressure device not found found or connection could not be established", + "CONNECTED_SUCCESSFULLY": "Pressure device connected", + "DISCONNECTED_SUCCESSFULLY": "Pressure device disconnected", + "DISCONNECTED_UNPLANNED": "Pressure device disconnected unplanned", + "INFORMATION_DESCRIPTION": "Supported devices are: PRS and Popsicle" + } } diff --git a/src/classes/visualizer/visualizer.ts b/src/classes/visualizer/visualizer.ts new file mode 100755 index 000000000..ad1e2f24b --- /dev/null +++ b/src/classes/visualizer/visualizer.ts @@ -0,0 +1,146 @@ +export class Visualizer { + public version: string; + public clock: string; // "clock": "1654510335", + public date: string; // "date": "Mon Jun 06 12:12:15 CEST 2022", + public timestamp: string; // "timestamp": "1654510335", + public elapsed: Array; // ["0.045","0.248", + public timers: {}; + public pressure: { + pressure: Array; + goal: Array; + }; + + public flow: { + flow: Array; + by_weight: Array; + by_weight_raw: Array; + goal: Array; + }; + + public temperature: { + basket: Array; + mix: Array; + goal: Array; + }; + public scale: {}; + public totals: { + weight: Array; + water_dispensed: Array; + }; + public resistance: { + resistance: Array; + by_weight: Array; + }; + public state_change: Array; + + public profile: { + title: string; + author: string; + notes: string; + beverage_type: string; + steps: Array; + }; + + public meta: { + bean: { + brand: string; + type: string; + notes: string; + roast_level: string; + roast_date: string; + }; + shot: { + enjoyment: string; + notes: string; + tds: string; + ey: string; + }; + grinder: { + model: string; + setting: string; + }; + in: string; + out: string; + time: string; + }; + + public app: { + app_name: string; + app_version: string; + }; + + constructor() { + this.initializeData(); + } + public initializeData() { + this.version = '0'; + this.clock = '0'; + this.date = ''; + this.timestamp = ''; + this.elapsed = []; + this.timers = {}; + this.pressure = { + pressure: [], + goal: [], + }; + + this.flow = { + flow: [], + by_weight: [], + by_weight_raw: [], + goal: [], + }; + + this.temperature = { + basket: [], + mix: [], + goal: [], + }; + this.scale = {}; + this.totals = { + weight: [], + water_dispensed: [], + }; + this.resistance = { + resistance: [], + by_weight: [], + }; + + this.state_change = []; + + this.profile = { + title: '', + author: '', + notes: '', + beverage_type: '', + steps: [], + }; + this.meta = { + bean: { + brand: '', + type: '', + notes: '', + roast_level: '', + roast_date: '', + }, + shot: { + enjoyment: '', + notes: '', + tds: '', + ey: '', + }, + grinder: { + model: '', + setting: '', + }, + in: '', + out: '', + time: '', + }; + + this.app = { + app_name: 'beanconqueror', + app_version: '2', + }; + } +} diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index bb0b516a6..ae5515886 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -52,7 +52,10 @@ import { ScreenOrientation } from '@ionic-native/screen-orientation/ngx'; import { PreparationTool } from '../../../classes/preparation/preparationTool'; import { UIAlert } from '../../../services/uiAlert'; -import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-devices'; +import { + CoffeeBluetoothDevicesService, + CoffeeBluetoothServiceEvent, +} from '@graphefruit/coffee-bluetooth-devices'; import { BluetoothScale } from '@graphefruit/coffee-bluetooth-devices'; import { SCALE_TIMER_COMMAND } from '@graphefruit/coffee-bluetooth-devices'; import { PressureDevice } from '@graphefruit/coffee-bluetooth-devices'; @@ -251,18 +254,20 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { let disconnectTriggered: boolean = false; let connectTriggered: boolean = false; - if (_type && _type.type === 'CONNECT_SCALE') { + if (_type === CoffeeBluetoothServiceEvent.CONNECTED_SCALE) { connectTriggered = true; this.__connectSmartScale(false); - } else if (_type && _type.type === 'DISCONNECT_SCALE') { + } else if (_type === CoffeeBluetoothServiceEvent.DISCONNECTED_SCALE) { this.deattachToWeightChange(); this.deattachToFlowChange(); this.deattachToScaleEvents(); disconnectTriggered = true; - } else if (_type && _type.type === 'CONNECT_PRESSURE') { + } else if (_type === CoffeeBluetoothServiceEvent.CONNECTED_PRESSURE) { connectTriggered = true; this.__connectPressureDevice(false); - } else if (_type && _type.type === 'DISCONNECT_PRESSURE') { + } else if ( + _type === CoffeeBluetoothServiceEvent.DISCONNECTED_PRESSURE + ) { this.deattachToPressureChange(); disconnectTriggered = true; } diff --git a/src/environments/environment.ts b/src/environments/environment.ts index ab3ec9bb0..a177b8b05 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -4,7 +4,7 @@ export const environment = { production: false, - API_URL: 'https://backend.beanconqueror.com/' + API_URL: 'https://localhost:5001/', }; /* diff --git a/src/services/uiToast.ts b/src/services/uiToast.ts index 9a4cdb447..b48c4e461 100755 --- a/src/services/uiToast.ts +++ b/src/services/uiToast.ts @@ -1,23 +1,25 @@ /** Core */ -import {Injectable} from '@angular/core'; +import { Injectable } from '@angular/core'; /** Ionic */ -import {ToastController} from '@ionic/angular'; -import {TranslateService} from '@ngx-translate/core'; - +import { ToastController } from '@ionic/angular'; +import { TranslateService } from '@ngx-translate/core'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class UIToast { - - constructor(private readonly translate: TranslateService, - private readonly toastController: ToastController) { - } - - - public async showInfoToast(_message: string) { + constructor( + private readonly translate: TranslateService, + private readonly toastController: ToastController + ) {} + + public async showInfoToast(_message: string, translate: boolean = true) { + let message = _message; + if (translate === true) { + message = this.translate.instant(_message); + } const toast = await this.toastController.create({ - message: this.translate.instant(_message), + message: message, duration: 2000, position: 'bottom', }); @@ -29,11 +31,7 @@ export class UIToast { message: this.translate.instant(_message), duration: 2000, position: 'bottom', - }); toast.present(); } - - - } From 62e348d26c01a997b00d0391576fdb839c27f4a3 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Fri, 21 Oct 2022 07:16:36 +0200 Subject: [PATCH 68/78] #407 - Reconnect scale/pressure #404 - closed because of fix #370 - Error information if bean was not approved yet #368 - Displays brews for bean #365 - Popsicle & pressure graph supported #359 - Some graph enhancements --- README.md | 2 +- config.xml | 2 +- package-lock.json | 122 +- package.json | 9 +- src/app/app.component.ts | 44 +- .../bean-archive-popover.component.ts | 2 +- .../bean-associated-brews.component.html | 25 + .../bean-associated-brews.component.scss | 0 .../bean-associated-brews.component.spec.ts | 24 + .../bean-associated-brews.component.ts | 72 + .../bean-popover-actions.component.html | 8 + .../beans/beans-add/beans-add.component.ts | 98 +- .../beans-detail/beans-detail.component.html | 2 +- src/app/beans/beans.page.ts | 2 +- src/app/brew/brew-add/brew-add.component.html | 5 + src/app/brew/brew-add/brew-add.component.ts | 263 +- .../brew-cupping/brew-cupping.component.html | 4 +- .../brew-cupping/brew-cupping.component.ts | 132 +- .../brew/brew-edit/brew-edit.component.html | 5 + src/app/brew/brew-edit/brew-edit.component.ts | 13 + .../brew/brew-flow/brew-flow.component.html | 7 +- src/app/brew/brew-flow/brew-flow.component.ts | 18 +- src/app/dashboard/dashboard.page.html | 3 +- src/app/dashboard/dashboard.page.ts | 36 +- src/app/info/log/log.component.ts | 46 +- ...s-popover-bluetooth-actions.component.html | 14 + ...s-popover-bluetooth-actions.component.scss | 6 + ...opover-bluetooth-actions.component.spec.ts | 24 + ...ngs-popover-bluetooth-actions.component.ts | 87 + src/app/settings/settings.page.html | 26 +- src/app/settings/settings.page.ts | 30 +- src/app/shared/shared.module.ts | 6 + src/assets/i18n/de.json | 64 +- src/assets/i18n/en.json | 66 +- src/assets/i18n/es.json | 70 +- src/assets/i18n/tr.json | 121 +- src/assets/i18n/zh.json | 2474 ++++----- src/assets/js/matomo.js | 4798 ++++++++++++++++- src/classes/bean/bean.proto | 25 + src/classes/bean/bean.ts | 56 +- src/classes/settings/settings.ts | 2 + src/classes/version/iVersion.ts | 65 +- src/classes/visualizer/visualizer.ts | 52 +- .../bean-information.component.html | 7 + .../bean-information.component.ts | 28 +- .../bean-general-information.component.html | 14 +- .../bean-general-information.component.ts | 2 +- .../brew-information.component.html | 6 +- .../brew-information.component.scss | 3 + .../brew-information.component.ts | 322 +- .../brew-timer/brew-timer.component.html | 4 +- .../brew-timer/brew-timer.component.ts | 46 +- .../brew-brewing/brew-brewing.component.html | 2 + .../brew-brewing/brew-brewing.component.ts | 1403 ++--- .../mill-information-card.component.html | 8 + .../mill-information-card.component.ts | 172 +- src/data/tracking/beanTracking.ts | 15 +- src/enums/beans/beanAction.ts | 5 +- src/generated/src/classes/bean/bean.ts | 317 ++ src/index.html | 2 + src/interfaces/bean/iBean.ts | 17 +- src/interfaces/flavor/iFlavor.ts | 4 +- src/interfaces/settings/iSettings.ts | 1 + .../custom-popover.component.scss | 19 +- .../intentHandler/intent-handler.service.ts | 13 +- .../server-communication.service.ts | 129 +- .../shareService/share-service.service.ts | 28 + src/services/uiAlert.ts | 97 +- src/services/uiBeanHelper.ts | 75 +- src/services/uiFileHelper.ts | 753 +-- src/services/uiUpdate.ts | 398 +- 71 files changed, 9637 insertions(+), 3183 deletions(-) create mode 100644 src/app/beans/bean-associated-brews/bean-associated-brews.component.html create mode 100644 src/app/beans/bean-associated-brews/bean-associated-brews.component.scss create mode 100644 src/app/beans/bean-associated-brews/bean-associated-brews.component.spec.ts create mode 100644 src/app/beans/bean-associated-brews/bean-associated-brews.component.ts create mode 100644 src/app/settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component.html create mode 100644 src/app/settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component.scss create mode 100644 src/app/settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component.spec.ts create mode 100644 src/app/settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component.ts diff --git a/README.md b/README.md index a29cf72c8..4324cb28f 100755 --- a/README.md +++ b/README.md @@ -205,7 +205,7 @@ https://stackoverflow.com/questions/60357663/do-apple-app-site-association-files ### Upgrade Ionic if needed: -`npm install @ionic/angular@6.2.4` +`npm install @ionic/angular@6.3.1` -> Or the actual active version ### Installing AAB on your android (mac) diff --git a/config.xml b/config.xml index 6b15cdcd4..d5e198084 100644 --- a/config.xml +++ b/config.xml @@ -1,5 +1,5 @@ - + Beanconqueror Lars Saalbach diff --git a/package-lock.json b/package-lock.json index 0266c0c63..55f2431ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@angular/platform-browser": "^14.1.0", "@angular/platform-browser-dynamic": "^14.1.0", "@angular/router": "^14.1.0", - "@graphefruit/coffee-bluetooth-devices": "file:../../graphefruit-coffee-bluetooth-devices-0.0.17.tgz", + "@graphefruit/coffee-bluetooth-devices": "file:../../graphefruit-coffee-bluetooth-devices-0.0.33.tgz", "@ionic-native/android-permissions": "^5.33.1", "@ionic-native/app-minimize": "^5.33.1", "@ionic-native/app-version": "^5.33.1", @@ -38,12 +38,12 @@ "@ionic-native/splash-screen": "^5.33.1", "@ionic-native/status-bar": "^5.33.1", "@ionic-native/three-dee-touch": "^5.33.1", - "@ionic/angular": "^6.2.5", + "@ionic/angular": "^6.3.1", "@ionic/cli": "^6.18.1", "@ionic/storage": "^2.3.1", "@ngx-translate/core": "^11.0.1", "@ngx-translate/http-loader": "^4.0.0", - "ag-virtual-scroll": "^1.3.0", + "ag-virtual-scroll": "^1.5.2", "chart.js": "^3.9.1", "chartjs-adapter-luxon": "^1.1.0", "chartjs-plugin-annotation": "^1.3.0", @@ -62,6 +62,7 @@ "cordova-plugin-statusbar": "^2.4.3", "core-js": "^3.19.3", "currency-symbol-map": "^5.0.1", + "html-to-image": "^1.10.8", "javascript-color-gradient": "^1.3.2", "jsurl": "^0.1.5", "lodash": "^4.17.21", @@ -1581,6 +1582,21 @@ "node": ">=12" } }, + "node_modules/@angular/animations": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-14.1.0.tgz", + "integrity": "sha512-OhEXi1u/M4QyltDCxSqo7YzF7ELgNDWNqbbM7vtWIcrc4c+Yiu1GXhW/GQRosF3WAuQVfdQzEI0VTeNoo98Kvw==", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/core": "14.1.0" + } + }, "node_modules/@angular/cli": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.1.0.tgz", @@ -4046,9 +4062,9 @@ "dev": true }, "node_modules/@graphefruit/coffee-bluetooth-devices": { - "version": "0.0.17", - "resolved": "file:../../graphefruit-coffee-bluetooth-devices-0.0.17.tgz", - "integrity": "sha512-8G8PuVo+ZLUsGUe6E75RDMaN/rDaJXjP96S/PIbvVEKN7yoPGjFqFNM0B8iEE4i61v40S6gXyXNYptWbazps1A==", + "version": "0.0.33", + "resolved": "file:../../graphefruit-coffee-bluetooth-devices-0.0.33.tgz", + "integrity": "sha512-ceUrFrvdTf6fP9UhIRcUxQHBoaRsdQdNsKmeCHCdX4fQfWqqjjsOdyuTLNI4d1atV+u0wL0GOMH/CDk1zoxEZw==", "dependencies": { "tslib": "^2.3.0" }, @@ -4333,11 +4349,11 @@ } }, "node_modules/@ionic/angular": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.2.5.tgz", - "integrity": "sha512-J0yjeDjux+Cff2DEH3JsYS8aooyVN2moS53RdpBI11Wq+37KR6AAmcmFLdP8gm4MWs/ZcfUt2calp4sXjUlaOg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.3.1.tgz", + "integrity": "sha512-hT97StH54ZhefdXDSkEAdBc8ssWBf9W8PrEXEUiYtBpp6AbTu/EL5AjHFIIWyyBXPic0sh5+KeJSu86Xxz5yMA==", "dependencies": { - "@ionic/core": "^6.2.5", + "@ionic/core": "^6.3.1", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" }, @@ -7728,11 +7744,11 @@ } }, "node_modules/@ionic/core": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.2.5.tgz", - "integrity": "sha512-PLnG182RYydXB71cjkMk2TLxFVKabvEc9wjeK5SsvxI1/QE9+wPfxDnvKWag8UeXgaGUhby1bitWkV5pniDaXA==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.1.tgz", + "integrity": "sha512-OpmGQQ/sGtoXW4PQRvRjYa9mTlAmAWwFMu8g/1rcdAPaTQQAlRnfZ62wYYqmChLSFlVbn6mCleeljzR9FaYrAg==", "dependencies": { - "@stencil/core": "^2.17.4", + "@stencil/core": "^2.18.0", "ionicons": "^6.0.3", "tslib": "^2.1.0" } @@ -8704,9 +8720,9 @@ "dev": true }, "node_modules/@stencil/core": { - "version": "2.17.4", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.17.4.tgz", - "integrity": "sha512-SGRlHpjV1RyFvzw6jFMVKpLNox9Eds3VvpbpD2SW9CuxdLonHDSFtQks5zmT4zs1Rse9I6kFc2mFK/dHNTalkg==", + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.18.1.tgz", + "integrity": "sha512-/fXkh1lwZ+X9JQCw50mPjhBogzEHOBvVC5pLoDLZqodVYK0DGWILM2YLV4dcIUBNEK8/HMDpO/Rq81/rS3mNOw==", "bin": { "stencil": "bin/stencil" }, @@ -9370,14 +9386,17 @@ } }, "node_modules/ag-virtual-scroll": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ag-virtual-scroll/-/ag-virtual-scroll-1.3.0.tgz", - "integrity": "sha512-xaydiezPggIH+ukZ6mXGhPsQuDQkTQdQrPekfuSI+iE2Yst/mlk+2FvzsgyS2StWGSYgHm+SyRYZrNi7zVRY4A==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ag-virtual-scroll/-/ag-virtual-scroll-1.5.2.tgz", + "integrity": "sha512-n5z5gbh5DFfn9JxyOW1k7OR6KPp8tKrQwCgD0ICPGqT7BWdonxPxvi7kZsyC+2vl3ckr8fwKAIDGPs5Z+rnVKw==", + "dependencies": { + "tslib": "^2.3.0" + }, "peerDependencies": { - "@angular/animations": "^9.0.4", - "@angular/common": "^9.0.4", - "@angular/compiler": "^9.0.4", - "@angular/core": "^9.0.4" + "@angular/animations": "^14.0.0", + "@angular/common": "^14.0.0", + "@angular/compiler": "^14.0.0", + "@angular/core": "^14.0.0" } }, "node_modules/agent-base": { @@ -15859,6 +15878,11 @@ "node": ">=8" } }, + "node_modules/html-to-image": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.10.8.tgz", + "integrity": "sha512-t+JyFJwKDCp4ZwBp4iC/wqw0meQDDc77Qs8OFl5P7RGlIP3LQMvwpD7VXxqQfC7/TfC+GKYlFP6WDYfXTmXHfw==" + }, "node_modules/htmlparser2": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", @@ -29925,6 +29949,15 @@ } } }, + "@angular/animations": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-14.1.0.tgz", + "integrity": "sha512-OhEXi1u/M4QyltDCxSqo7YzF7ELgNDWNqbbM7vtWIcrc4c+Yiu1GXhW/GQRosF3WAuQVfdQzEI0VTeNoo98Kvw==", + "peer": true, + "requires": { + "tslib": "^2.3.0" + } + }, "@angular/cli": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.1.0.tgz", @@ -31579,8 +31612,8 @@ "dev": true }, "@graphefruit/coffee-bluetooth-devices": { - "version": "file:../../graphefruit-coffee-bluetooth-devices-0.0.17.tgz", - "integrity": "sha512-8G8PuVo+ZLUsGUe6E75RDMaN/rDaJXjP96S/PIbvVEKN7yoPGjFqFNM0B8iEE4i61v40S6gXyXNYptWbazps1A==", + "version": "file:../../graphefruit-coffee-bluetooth-devices-0.0.33.tgz", + "integrity": "sha512-ceUrFrvdTf6fP9UhIRcUxQHBoaRsdQdNsKmeCHCdX4fQfWqqjjsOdyuTLNI4d1atV+u0wL0GOMH/CDk1zoxEZw==", "requires": { "tslib": "^2.3.0" } @@ -31770,11 +31803,11 @@ } }, "@ionic/angular": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.2.5.tgz", - "integrity": "sha512-J0yjeDjux+Cff2DEH3JsYS8aooyVN2moS53RdpBI11Wq+37KR6AAmcmFLdP8gm4MWs/ZcfUt2calp4sXjUlaOg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.3.1.tgz", + "integrity": "sha512-hT97StH54ZhefdXDSkEAdBc8ssWBf9W8PrEXEUiYtBpp6AbTu/EL5AjHFIIWyyBXPic0sh5+KeJSu86Xxz5yMA==", "requires": { - "@ionic/core": "^6.2.5", + "@ionic/core": "^6.3.1", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" } @@ -34242,11 +34275,11 @@ } }, "@ionic/core": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.2.5.tgz", - "integrity": "sha512-PLnG182RYydXB71cjkMk2TLxFVKabvEc9wjeK5SsvxI1/QE9+wPfxDnvKWag8UeXgaGUhby1bitWkV5pniDaXA==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.1.tgz", + "integrity": "sha512-OpmGQQ/sGtoXW4PQRvRjYa9mTlAmAWwFMu8g/1rcdAPaTQQAlRnfZ62wYYqmChLSFlVbn6mCleeljzR9FaYrAg==", "requires": { - "@stencil/core": "^2.17.4", + "@stencil/core": "^2.18.0", "ionicons": "^6.0.3", "tslib": "^2.1.0" } @@ -35009,9 +35042,9 @@ } }, "@stencil/core": { - "version": "2.17.4", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.17.4.tgz", - "integrity": "sha512-SGRlHpjV1RyFvzw6jFMVKpLNox9Eds3VvpbpD2SW9CuxdLonHDSFtQks5zmT4zs1Rse9I6kFc2mFK/dHNTalkg==" + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.18.1.tgz", + "integrity": "sha512-/fXkh1lwZ+X9JQCw50mPjhBogzEHOBvVC5pLoDLZqodVYK0DGWILM2YLV4dcIUBNEK8/HMDpO/Rq81/rS3mNOw==" }, "@stylelint/postcss-css-in-js": { "version": "0.37.2", @@ -35623,10 +35656,12 @@ "dev": true }, "ag-virtual-scroll": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ag-virtual-scroll/-/ag-virtual-scroll-1.3.0.tgz", - "integrity": "sha512-xaydiezPggIH+ukZ6mXGhPsQuDQkTQdQrPekfuSI+iE2Yst/mlk+2FvzsgyS2StWGSYgHm+SyRYZrNi7zVRY4A==", - "requires": {} + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ag-virtual-scroll/-/ag-virtual-scroll-1.5.2.tgz", + "integrity": "sha512-n5z5gbh5DFfn9JxyOW1k7OR6KPp8tKrQwCgD0ICPGqT7BWdonxPxvi7kZsyC+2vl3ckr8fwKAIDGPs5Z+rnVKw==", + "requires": { + "tslib": "^2.3.0" + } }, "agent-base": { "version": "4.3.0", @@ -40344,6 +40379,11 @@ "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", "dev": true }, + "html-to-image": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.10.8.tgz", + "integrity": "sha512-t+JyFJwKDCp4ZwBp4iC/wqw0meQDDc77Qs8OFl5P7RGlIP3LQMvwpD7VXxqQfC7/TfC+GKYlFP6WDYfXTmXHfw==" + }, "htmlparser2": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", diff --git a/package.json b/package.json index 706865116..60ccf88c4 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,6 @@ "test": "ng test", "lint": "ng lint", "e2e": "ng e2e", - "sonar": "sh /Users/larssaalbach/Downloads/sonarqube-7.0/bin/macosx-universal-64/sonar.sh console", - "sonar_scan": "/Users/larssaalbach/Downloads/sonar-scanner-4.2.0.1873-macosx/bin/sonar-scanner", "prepare": "husky install", "generate_proto": "protoc --plugin=node_modules/ts-proto/protoc-gen-ts_proto --ts_proto_opt=snakeToCamel=false --ts_proto_out ./src/generated ./src/classes/bean/bean.proto" }, @@ -23,7 +21,7 @@ "@angular/platform-browser": "^14.1.0", "@angular/platform-browser-dynamic": "^14.1.0", "@angular/router": "^14.1.0", - "@graphefruit/coffee-bluetooth-devices": "file:../../graphefruit-coffee-bluetooth-devices-0.0.17.tgz", + "@graphefruit/coffee-bluetooth-devices": "file:../../graphefruit-coffee-bluetooth-devices-0.0.33.tgz", "@ionic-native/android-permissions": "^5.33.1", "@ionic-native/app-minimize": "^5.33.1", "@ionic-native/app-version": "^5.33.1", @@ -47,12 +45,12 @@ "@ionic-native/splash-screen": "^5.33.1", "@ionic-native/status-bar": "^5.33.1", "@ionic-native/three-dee-touch": "^5.33.1", - "@ionic/angular": "^6.2.5", + "@ionic/angular": "^6.3.1", "@ionic/cli": "^6.18.1", "@ionic/storage": "^2.3.1", "@ngx-translate/core": "^11.0.1", "@ngx-translate/http-loader": "^4.0.0", - "ag-virtual-scroll": "^1.3.0", + "ag-virtual-scroll": "^1.5.2", "chart.js": "^3.9.1", "chartjs-adapter-luxon": "^1.1.0", "chartjs-plugin-annotation": "^1.3.0", @@ -71,6 +69,7 @@ "cordova-plugin-statusbar": "^2.4.3", "core-js": "^3.19.3", "currency-symbol-map": "^5.0.1", + "html-to-image": "^1.10.8", "javascript-color-gradient": "^1.3.2", "jsurl": "^0.1.5", "lodash": "^4.17.21", diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 4785ecbc1..41d9e9f80 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -64,6 +64,7 @@ import annotationPlugin from 'chartjs-plugin-annotation'; import { CoffeeBluetoothServiceEvent, + Logger, PressureType, ScaleType, } from '@graphefruit/coffee-bluetooth-devices'; @@ -280,6 +281,22 @@ export class AppComponent implements AfterViewInit { this.uiLog.log(`Storage-Driver: ${this.storage.driver}`); } } catch (ex) {} + try { + Logger.attachOnLog().subscribe((_msg) => { + if (_msg.type === 'LOG') { + this.uiLog.log(_msg.log); + } + if (_msg.type === 'INFO') { + this.uiLog.info(_msg.log); + } + if (_msg.type === 'ERROR') { + this.uiLog.error(_msg.log); + } + if (_msg.type === 'DEBUG') { + this.uiLog.debug(_msg.log); + } + }); + } catch (ex) {} // Okay, so the platform is ready and our plugins are available. // Here you can do any higher level native things you might need. @@ -292,6 +309,7 @@ export class AppComponent implements AfterViewInit { // When we're in cordova, disable the log messages this.uiLog.disable(); } + Logger.disableLog(); if (this.platform.is('ios')) { this.uiLog.log(`iOS Device - attach to home icon pressed`); @@ -575,6 +593,13 @@ export class AppComponent implements AfterViewInit { this.__connectPressureDevice(); }, 5000); + const settings = this.uiSettingsStorage.getSettings(); + if (settings.scale_log === true || settings.pressure_log === true) { + Logger.enableLog(); + } else { + Logger.disableLog(); + } + await this.__checkStartupView(); this.__instanceAppRating(); this.__attachOnDevicePause(); @@ -618,12 +643,6 @@ export class AppComponent implements AfterViewInit { this.uiLog.log(`Connect smartscale? ${scale_id}`); if (scale_id !== undefined && scale_id !== '') { this.bleManager.autoConnectScale(scale_type, scale_id, true); - /**setTimeout(() => { - this.bleManager.disconnect(scale_id); - setTimeout(() => { - this.bleManager.autoConnectScale(scale_type, scale_id, true); - }, 2000); - }, 10000);**/ } else { this.uiLog.log('Smartscale not connected, dont try to connect'); } @@ -655,6 +674,16 @@ export class AppComponent implements AfterViewInit { this.bleManager.disconnect(settings.scale_id, false); } } + + if (settings.pressure_stay_connected === false) { + const pressure_id: string = settings.pressure_id; + if (pressure_id !== undefined && pressure_id !== '') { + // Don't show message on device pause. + this.bleManager.disconnect(settings.pressure_id, false); + } + } + + /// Add pressure profile. }); } private __attachOnDeviceResume() { @@ -663,6 +692,9 @@ export class AppComponent implements AfterViewInit { if (settings.bluetooth_scale_stay_connected === false) { this.__connectSmartScale(); } + if (settings.pressure_stay_connected === false) { + this.__connectPressureDevice(); + } }); } diff --git a/src/app/beans/bean-archive-popover/bean-archive-popover.component.ts b/src/app/beans/bean-archive-popover/bean-archive-popover.component.ts index 37616eb42..e78f742e3 100644 --- a/src/app/beans/bean-archive-popover/bean-archive-popover.component.ts +++ b/src/app/beans/bean-archive-popover/bean-archive-popover.component.ts @@ -28,7 +28,7 @@ export class BeanArchivePopoverComponent implements OnInit { private readonly modalController: ModalController, private readonly uiToast: UIToast, private readonly uiSettingsStorage: UISettingsStorage, - private readonly uiHelper: UIHelper + public readonly uiHelper: UIHelper ) { this.settings = this.uiSettingsStorage.getSettings(); this.maxBeanRating = this.settings.bean_rating; diff --git a/src/app/beans/bean-associated-brews/bean-associated-brews.component.html b/src/app/beans/bean-associated-brews/bean-associated-brews.component.html new file mode 100644 index 000000000..4867721f2 --- /dev/null +++ b/src/app/beans/bean-associated-brews/bean-associated-brews.component.html @@ -0,0 +1,25 @@ + + + {{"NAV_BREWS" | translate}} + + + + + + + + +
+
+ +
+
+ {{"PAGE_BREWS_NO_ENTRIES" | translate}} +
+
+
+ +
+ +
diff --git a/src/app/beans/bean-associated-brews/bean-associated-brews.component.scss b/src/app/beans/bean-associated-brews/bean-associated-brews.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/beans/bean-associated-brews/bean-associated-brews.component.spec.ts b/src/app/beans/bean-associated-brews/bean-associated-brews.component.spec.ts new file mode 100644 index 000000000..dbd1734ef --- /dev/null +++ b/src/app/beans/bean-associated-brews/bean-associated-brews.component.spec.ts @@ -0,0 +1,24 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { BeanAssociatedBrewsComponent } from './bean-associated-brews.component'; + +describe('BeanAssociatedBrewsComponent', () => { + let component: BeanAssociatedBrewsComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [BeanAssociatedBrewsComponent], + imports: [IonicModule.forRoot()], + }).compileComponents(); + + fixture = TestBed.createComponent(BeanAssociatedBrewsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/beans/bean-associated-brews/bean-associated-brews.component.ts b/src/app/beans/bean-associated-brews/bean-associated-brews.component.ts new file mode 100644 index 000000000..c968ee01e --- /dev/null +++ b/src/app/beans/bean-associated-brews/bean-associated-brews.component.ts @@ -0,0 +1,72 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { Bean } from '../../../classes/bean/bean'; +import { ModalController, NavParams, Platform } from '@ionic/angular'; +import { UIBeanStorage } from '../../../services/uiBeanStorage'; +import { UIImage } from '../../../services/uiImage'; +import { UIHelper } from '../../../services/uiHelper'; +import { UIFileHelper } from '../../../services/uiFileHelper'; +import { UIToast } from '../../../services/uiToast'; +import { UIAnalytics } from '../../../services/uiAnalytics'; +import { UIAlert } from '../../../services/uiAlert'; +import BEAN_TRACKING from '../../../data/tracking/beanTracking'; +import { BREW_ACTION } from '../../../enums/brews/brewAction'; +import { Brew } from '../../../classes/brew/brew'; +import { UIBeanHelper } from '../../../services/uiBeanHelper'; +import { UIBrewHelper } from '../../../services/uiBrewHelper'; + +@Component({ + selector: 'app-bean-associated-brews', + templateUrl: './bean-associated-brews.component.html', + styleUrls: ['./bean-associated-brews.component.scss'], +}) +export class BeanAssociatedBrewsComponent implements OnInit { + public static COMPONENT_ID = 'bean-associated-brews'; + public data: Bean = new Bean(); + @Input() private readonly bean: Bean; + + public beanBrews: Array = []; + constructor( + private readonly modalController: ModalController, + private readonly navParams: NavParams, + private readonly uiBeanStorage: UIBeanStorage, + private readonly uiBeanHelper: UIBeanHelper, + private readonly uiImage: UIImage, + private readonly uiHelper: UIHelper, + private readonly uiFileHelper: UIFileHelper, + private readonly uiToast: UIToast, + private readonly uiAnalytics: UIAnalytics + ) {} + + public async ionViewWillEnter() { + this.uiAnalytics.trackEvent( + BEAN_TRACKING.TITLE, + BEAN_TRACKING.ACTIONS.SHOW_BREWS + ); + + this.loadBrews(); + } + + public loadBrews() { + const relatedBrews: Array = this.uiBeanHelper.getAllBrewsForThisBean( + this.bean.config.uuid + ); + + this.beanBrews = UIBrewHelper.sortBrews(relatedBrews); + } + + public async brewAction(action: BREW_ACTION, brew: Brew): Promise { + this.loadBrews(); + } + + public dismiss(): void { + this.modalController.dismiss( + { + dismissed: true, + }, + undefined, + BeanAssociatedBrewsComponent.COMPONENT_ID + ); + } + + public ngOnInit() {} +} diff --git a/src/app/beans/bean-popover-actions/bean-popover-actions.component.html b/src/app/beans/bean-popover-actions/bean-popover-actions.component.html index 31c965c07..7e62a9dad 100644 --- a/src/app/beans/bean-popover-actions/bean-popover-actions.component.html +++ b/src/app/beans/bean-popover-actions/bean-popover-actions.component.html @@ -14,6 +14,14 @@ {{"EDIT" | translate}} + + + {{"POPOVER_SHOW_BREWS" | translate}} + + + + {{"POPOVER_BREWS_OPTION_CUPPING" | translate}} + {{"POPOVER_QR_CODE_REFRESH" | translate}} diff --git a/src/app/beans/beans-add/beans-add.component.ts b/src/app/beans/beans-add/beans-add.component.ts index 5c48a672b..f71c0b0ce 100644 --- a/src/app/beans/beans-add/beans-add.component.ts +++ b/src/app/beans/beans-add/beans-add.component.ts @@ -1,19 +1,19 @@ -import {Component, Input, OnInit} from '@angular/core'; -import {UIBeanStorage} from '../../../services/uiBeanStorage'; -import {UIHelper} from '../../../services/uiHelper'; -import {UIImage} from '../../../services/uiImage'; -import {Bean} from '../../../classes/bean/bean'; -import {ModalController, NavParams, Platform} from '@ionic/angular'; -import {UIFileHelper} from '../../../services/uiFileHelper'; -import {UIToast} from '../../../services/uiToast'; -import {IBeanInformation} from '../../../interfaces/bean/iBeanInformation'; -import {GreenBean} from '../../../classes/green-bean/green-bean'; -import {BEAN_MIX_ENUM} from '../../../enums/beans/mix'; +import { Component, Input, OnInit } from '@angular/core'; +import { UIBeanStorage } from '../../../services/uiBeanStorage'; +import { UIHelper } from '../../../services/uiHelper'; +import { UIImage } from '../../../services/uiImage'; +import { Bean } from '../../../classes/bean/bean'; +import { ModalController, NavParams, Platform } from '@ionic/angular'; +import { UIFileHelper } from '../../../services/uiFileHelper'; +import { UIToast } from '../../../services/uiToast'; +import { IBeanInformation } from '../../../interfaces/bean/iBeanInformation'; +import { GreenBean } from '../../../classes/green-bean/green-bean'; +import { BEAN_MIX_ENUM } from '../../../enums/beans/mix'; import moment from 'moment'; import BEAN_TRACKING from '../../../data/tracking/beanTracking'; -import {UIAnalytics} from '../../../services/uiAnalytics'; -import {ServerBean} from '../../../models/bean/serverBean'; -import {UIAlert} from '../../../services/uiAlert'; +import { UIAnalytics } from '../../../services/uiAnalytics'; +import { ServerBean } from '../../../models/bean/serverBean'; +import { UIAlert } from '../../../services/uiAlert'; @Component({ selector: 'beans-add', @@ -21,32 +21,29 @@ import {UIAlert} from '../../../services/uiAlert'; styleUrls: ['./beans-add.component.scss'], }) export class BeansAddComponent implements OnInit { - public static COMPONENT_ID = 'bean-add'; public data: Bean = new Bean(); @Input() private readonly bean_template: Bean; @Input() private readonly server_bean: ServerBean; @Input() private readonly user_shared_bean: Bean; - - @Input() private hide_toast_message: boolean; @Input() private greenBean: GreenBean; public bean_segment = 'general'; - constructor (private readonly modalController: ModalController, - private readonly navParams: NavParams, - private readonly uiBeanStorage: UIBeanStorage, - private readonly uiImage: UIImage, - private readonly uiHelper: UIHelper, - private readonly uiFileHelper: UIFileHelper, - private readonly uiToast: UIToast, - private readonly uiAnalytics: UIAnalytics, - private readonly uiAlert: UIAlert, - private readonly platform: Platform) { - - } + constructor( + private readonly modalController: ModalController, + private readonly navParams: NavParams, + private readonly uiBeanStorage: UIBeanStorage, + private readonly uiImage: UIImage, + private readonly uiHelper: UIHelper, + private readonly uiFileHelper: UIFileHelper, + private readonly uiToast: UIToast, + private readonly uiAnalytics: UIAnalytics, + private readonly uiAlert: UIAlert, + private readonly platform: Platform + ) {} public async ionViewWillEnter() { this.uiAnalytics.trackEvent(BEAN_TRACKING.TITLE, BEAN_TRACKING.ACTIONS.ADD); @@ -57,7 +54,6 @@ export class BeansAddComponent implements OnInit { await this.__loadBean(this.bean_template); } - // Download images after loading the bean, else they would be copied :O if (this.server_bean && this.platform.is('cordova')) { if (this.server_bean.attachment.length > 0) { @@ -68,11 +64,10 @@ export class BeansAddComponent implements OnInit { // await newMapper.downloadAndAttachAttachments(this.data, this.server_bean.attachment); // await this.uiAlert.hideLoadingSpinner(); } - } // Add one empty bean information, rest is being updated on start - if (this.data.bean_information.length <=0) { + if (this.data.bean_information.length <= 0) { const beanInformation: IBeanInformation = {} as IBeanInformation; this.data.bean_information.push(beanInformation); } @@ -83,7 +78,6 @@ export class BeansAddComponent implements OnInit { } public async addBean() { - if (this.__formValid()) { await this.__addBean(); } @@ -94,7 +88,6 @@ export class BeansAddComponent implements OnInit { this.data.bean_roast_information.bean_uuid = this.greenBean.config.uuid; this.data.bean_information = this.greenBean.bean_information; - this.data.name = this.greenBean.name; this.data.cupping_points = this.greenBean.cupping_points; this.data.ean_article_number = this.greenBean.ean_article_number; @@ -109,7 +102,10 @@ export class BeansAddComponent implements OnInit { public async __addBean() { await this.uiBeanStorage.add(this.data); - this.uiAnalytics.trackEvent(BEAN_TRACKING.TITLE, BEAN_TRACKING.ACTIONS.ADD_FINISH); + this.uiAnalytics.trackEvent( + BEAN_TRACKING.TITLE, + BEAN_TRACKING.ACTIONS.ADD_FINISH + ); this.dismiss(); if (!this.hide_toast_message) { this.uiToast.showInfoToast('TOAST_BEAN_ADDED_SUCCESSFULLY'); @@ -117,9 +113,13 @@ export class BeansAddComponent implements OnInit { } public dismiss(): void { - this.modalController.dismiss({ - dismissed: true - },undefined, BeansAddComponent.COMPONENT_ID); + this.modalController.dismiss( + { + dismissed: true, + }, + undefined, + BeansAddComponent.COMPONENT_ID + ); } private async __loadBean(_bean: Bean) { @@ -142,26 +142,28 @@ export class BeansAddComponent implements OnInit { this.data.url = _bean.url; this.data.ean_article_number = _bean.ean_article_number; - this.data.bean_information = this.uiHelper.cloneData(_bean.bean_information); + this.data.bean_information = this.uiHelper.cloneData( + _bean.bean_information + ); this.data.cupping_points = _bean.cupping_points; this.data.roast_range = _bean.roast_range; - const copyAttachments = []; for (const attachment of _bean.attachments) { try { const newPath: string = await this.uiFileHelper.copyFile(attachment); copyAttachments.push(newPath); - } catch (ex) { - - } - + } catch (ex) {} } this.data.attachments = copyAttachments; + if (_bean.cupped_flavor) { + this.data.cupped_flavor = _bean.cupped_flavor; + } + if (_bean.cupping) { + this.data.cupping = _bean.cupping; + } this.data.qr_code = _bean.qr_code; - - } private __formValid(): boolean { @@ -175,8 +177,4 @@ export class BeansAddComponent implements OnInit { } public ngOnInit() {} - - - - } diff --git a/src/app/beans/beans-detail/beans-detail.component.html b/src/app/beans/beans-detail/beans-detail.component.html index 356819107..45e5705ac 100644 --- a/src/app/beans/beans-detail/beans-detail.component.html +++ b/src/app/beans/beans-detail/beans-detail.component.html @@ -238,7 +238,7 @@

{{"FINISHED" | translate}}?:

-

{{"NOTES" | translate}}?:

+

{{"NOTES" | translate}}:

{{data.note}}
diff --git a/src/app/beans/beans.page.ts b/src/app/beans/beans.page.ts index e8f19f415..38622d77b 100644 --- a/src/app/beans/beans.page.ts +++ b/src/app/beans/beans.page.ts @@ -306,7 +306,7 @@ export class BeansPage implements OnInit { ); } else { // Test sample for development - // await this.intenthandler.handleQRCodeLink('https://beanconqueror.com/?qr=e7ada0a6'); + //await this.intenthandler.handleQRCodeLink('https://beanconqueror.com/?qr=e7ada0a6'); } this.loadBeans(); return; diff --git a/src/app/brew/brew-add/brew-add.component.html b/src/app/brew/brew-add/brew-add.component.html index e32c74a43..1db409206 100644 --- a/src/app/brew/brew-add/brew-add.component.html +++ b/src/app/brew/brew-add/brew-add.component.html @@ -6,6 +6,11 @@
+ + + + + diff --git a/src/app/brew/brew-add/brew-add.component.ts b/src/app/brew/brew-add/brew-add.component.ts index 181edfd01..29c740325 100644 --- a/src/app/brew/brew-add/brew-add.component.ts +++ b/src/app/brew/brew-add/brew-add.component.ts @@ -1,27 +1,34 @@ -import {Component, Input, OnInit, ViewChild} from '@angular/core'; -import {UIBeanStorage} from '../../../services/uiBeanStorage'; -import {UIBrewStorage} from '../../../services/uiBrewStorage'; -import {UISettingsStorage} from '../../../services/uiSettingsStorage'; -import {LoadingController, ModalController, NavParams, Platform} from '@ionic/angular'; -import {UIMillStorage} from '../../../services/uiMillStorage'; -import {UIPreparationStorage} from '../../../services/uiPreparationStorage'; -import {Brew} from '../../../classes/brew/brew'; +import { Component, Input, OnInit, ViewChild } from '@angular/core'; +import { UIBeanStorage } from '../../../services/uiBeanStorage'; +import { UIBrewStorage } from '../../../services/uiBrewStorage'; +import { UISettingsStorage } from '../../../services/uiSettingsStorage'; +import { + LoadingController, + ModalController, + NavParams, + Platform, +} from '@ionic/angular'; +import { UIMillStorage } from '../../../services/uiMillStorage'; +import { UIPreparationStorage } from '../../../services/uiPreparationStorage'; +import { Brew } from '../../../classes/brew/brew'; import moment from 'moment'; -import {UIToast} from '../../../services/uiToast'; -import {TranslateService} from '@ngx-translate/core'; -import {Geolocation} from '@ionic-native/geolocation/ngx'; -import {Preparation} from '../../../classes/preparation/preparation'; -import {UILog} from '../../../services/uiLog'; -import {UIBrewHelper} from '../../../services/uiBrewHelper'; -import {Settings} from '../../../classes/settings/settings'; -import {UIHealthKit} from '../../../services/uiHealthKit'; -import {Insomnia} from '@ionic-native/insomnia/ngx'; -import {BrewBrewingComponent} from '../../../components/brews/brew-brewing/brew-brewing.component'; -import {UIAlert} from '../../../services/uiAlert'; -import {BrewTrackingService} from '../../../services/brewTracking/brew-tracking.service'; +import { UIToast } from '../../../services/uiToast'; +import { TranslateService } from '@ngx-translate/core'; +import { Geolocation } from '@ionic-native/geolocation/ngx'; +import { Preparation } from '../../../classes/preparation/preparation'; +import { UILog } from '../../../services/uiLog'; +import { UIBrewHelper } from '../../../services/uiBrewHelper'; +import { Settings } from '../../../classes/settings/settings'; +import { UIHealthKit } from '../../../services/uiHealthKit'; +import { Insomnia } from '@ionic-native/insomnia/ngx'; +import { BrewBrewingComponent } from '../../../components/brews/brew-brewing/brew-brewing.component'; +import { UIAlert } from '../../../services/uiAlert'; +import { BrewTrackingService } from '../../../services/brewTracking/brew-tracking.service'; import BREW_TRACKING from '../../../data/tracking/brewTracking'; -import {UIAnalytics} from '../../../services/uiAnalytics'; - +import { UIAnalytics } from '../../../services/uiAnalytics'; +import { BrewPopoverActionsComponent } from '../brew-popover-actions/brew-popover-actions.component'; +import { BREW_ACTION } from '../../../enums/brews/brewAction'; +import { SettingsPopoverBluetoothActionsComponent } from '../../settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component'; @Component({ selector: 'brew-add', @@ -29,7 +36,6 @@ import {UIAnalytics} from '../../../services/uiAnalytics'; styleUrls: ['./brew-add.component.scss'], }) export class BrewAddComponent implements OnInit { - public static COMPONENT_ID: string = 'brew-add'; public brew_template: Brew; public data: Brew = new Brew(); @@ -37,122 +43,147 @@ export class BrewAddComponent implements OnInit { public loadSpecificLastPreparation: Preparation; - @ViewChild('brewBrewing', {read: BrewBrewingComponent, static: false}) public brewBrewing: BrewBrewingComponent; + @ViewChild('brewBrewing', { read: BrewBrewingComponent, static: false }) + public brewBrewing: BrewBrewingComponent; @Input() private hide_toast_message: boolean; - constructor (private readonly modalController: ModalController, - private readonly navParams: NavParams, - private readonly uiBeanStorage: UIBeanStorage, - private readonly uiPreparationStorage: UIPreparationStorage, - private readonly uiBrewStorage: UIBrewStorage, - private readonly uiSettingsStorage: UISettingsStorage, - private readonly uiMillStorage: UIMillStorage, - private readonly uiToast: UIToast, - private readonly translate: TranslateService, - private readonly platform: Platform, - private readonly geolocation: Geolocation, - private readonly loadingController: LoadingController, - private readonly uiLog: UILog, - private readonly uiBrewHelper: UIBrewHelper, - private readonly uiHealthKit: UIHealthKit, - private readonly insomnia: Insomnia, - private readonly uiAlert: UIAlert, - private readonly brewTracking: BrewTrackingService, - private readonly uiAnalytics: UIAnalytics) { + constructor( + private readonly modalController: ModalController, + private readonly navParams: NavParams, + private readonly uiBeanStorage: UIBeanStorage, + private readonly uiPreparationStorage: UIPreparationStorage, + private readonly uiBrewStorage: UIBrewStorage, + private readonly uiSettingsStorage: UISettingsStorage, + private readonly uiMillStorage: UIMillStorage, + private readonly uiToast: UIToast, + private readonly translate: TranslateService, + private readonly platform: Platform, + private readonly geolocation: Geolocation, + private readonly loadingController: LoadingController, + private readonly uiLog: UILog, + private readonly uiBrewHelper: UIBrewHelper, + private readonly uiHealthKit: UIHealthKit, + private readonly insomnia: Insomnia, + private readonly uiAlert: UIAlert, + private readonly brewTracking: BrewTrackingService, + private readonly uiAnalytics: UIAnalytics + ) { // Initialize to standard in drop down this.settings = this.uiSettingsStorage.getSettings(); this.brew_template = this.navParams.get('brew_template'); - this.loadSpecificLastPreparation = this.navParams.get('loadSpecificLastPreparation'); + this.loadSpecificLastPreparation = this.navParams.get( + 'loadSpecificLastPreparation' + ); // Get first entry - this.data.bean = this.uiBeanStorage.getAllEntries() + this.data.bean = this.uiBeanStorage + .getAllEntries() .filter((bean) => !bean.finished) .sort((a, b) => a.name.localeCompare(b.name))[0].config.uuid; - this.data.method_of_preparation = this.uiPreparationStorage.getAllEntries() + this.data.method_of_preparation = this.uiPreparationStorage + .getAllEntries() .filter((e) => !e.finished) .sort((a, b) => a.name.localeCompare(b.name))[0].config.uuid; - this.data.mill = this.uiMillStorage.getAllEntries() + this.data.mill = this.uiMillStorage + .getAllEntries() .filter((e) => !e.finished) .sort((a, b) => a.name.localeCompare(b.name))[0].config.uuid; - } public ionViewDidEnter(): void { this.uiAnalytics.trackEvent(BREW_TRACKING.TITLE, BREW_TRACKING.ACTIONS.ADD); if (this.settings.wake_lock) { - this.insomnia.keepAwake() - .then( - () =>{}, - () => {} - ); + this.insomnia.keepAwake().then( + () => {}, + () => {} + ); } this.getCoordinates(true); - - } public ionViewWillLeave() { if (this.settings.wake_lock) { - this.insomnia.allowSleepAgain() - .then( - () => {}, - () => {} - ); + this.insomnia.allowSleepAgain().then( + () => {}, + () => {} + ); } - } private getCoordinates(_highAccuracy: boolean) { if (this.settings.track_brew_coordinates) { - this.geolocation.getCurrentPosition({ maximumAge: 3000, timeout: 5000, enableHighAccuracy:_highAccuracy}).then((resp) => { - this.data.coordinates.latitude = resp.coords.latitude; - this.data.coordinates.accuracy = resp.coords.accuracy; - this.data.coordinates.altitude = resp.coords.altitude; - this.data.coordinates.altitudeAccuracy = resp.coords.altitudeAccuracy; - this.data.coordinates.heading = resp.coords.heading; - this.data.coordinates.speed = resp.coords.speed; - this.data.coordinates.longitude = resp.coords.longitude; - this.uiLog.info('BREW - Coordinates found - ' + JSON.stringify(this.data.coordinates)); - }).catch((error) => { - // Couldn't get coordinates sorry. - this.uiLog.error('BREW - No Coordinates found'); - if (_highAccuracy === true) { - this.uiLog.error('BREW - Try to get coordinates with low accuracy'); - this.getCoordinates(false); - } - - }); + this.geolocation + .getCurrentPosition({ + maximumAge: 3000, + timeout: 5000, + enableHighAccuracy: _highAccuracy, + }) + .then((resp) => { + this.data.coordinates.latitude = resp.coords.latitude; + this.data.coordinates.accuracy = resp.coords.accuracy; + this.data.coordinates.altitude = resp.coords.altitude; + this.data.coordinates.altitudeAccuracy = resp.coords.altitudeAccuracy; + this.data.coordinates.heading = resp.coords.heading; + this.data.coordinates.speed = resp.coords.speed; + this.data.coordinates.longitude = resp.coords.longitude; + this.uiLog.info( + 'BREW - Coordinates found - ' + + JSON.stringify(this.data.coordinates) + ); + }) + .catch((error) => { + // Couldn't get coordinates sorry. + this.uiLog.error('BREW - No Coordinates found'); + if (_highAccuracy === true) { + this.uiLog.error('BREW - Try to get coordinates with low accuracy'); + this.getCoordinates(false); + } + }); } } - public async dismiss() { - this.modalController.dismiss({ - dismissed: true - },undefined,BrewAddComponent.COMPONENT_ID); - + public async popoverActionsBrew() { + const popover = await this.modalController.create({ + component: SettingsPopoverBluetoothActionsComponent, + componentProps: {}, + id: SettingsPopoverBluetoothActionsComponent.COMPONENT_ID, + cssClass: 'popover-actions', + breakpoints: [0, 0.5], + initialBreakpoint: 0.5, + }); + await popover.present(); + await popover.onWillDismiss(); + } + public async dismiss() { + this.modalController.dismiss( + { + dismissed: true, + }, + undefined, + BrewAddComponent.COMPONENT_ID + ); } public async finish() { - await this.uiAlert.showLoadingSpinner(); try { this.uiBrewHelper.cleanInvisibleBrewData(this.data); - const addedBrewObj: Brew = await this.uiBrewStorage.add(this.data); + const addedBrewObj: Brew = await this.uiBrewStorage.add(this.data); if (this.brewBrewing.flow_profile_raw.weight.length > 0) { - const savedPath = this.brewBrewing.saveFlowProfile(addedBrewObj.config.uuid); + const savedPath = this.brewBrewing.saveFlowProfile( + addedBrewObj.config.uuid + ); addedBrewObj.flow_profile = savedPath; await this.uiBrewStorage.update(addedBrewObj); } - - let checkData: Settings | Preparation; if (this.getPreparation().use_custom_parameters === true) { checkData = this.getPreparation(); @@ -161,54 +192,42 @@ export class BrewAddComponent implements OnInit { } if (checkData.manage_parameters.set_custom_brew_time) { - - addedBrewObj.config.unix_timestamp = moment(this.brewBrewing.customCreationDate).unix(); + addedBrewObj.config.unix_timestamp = moment( + this.brewBrewing.customCreationDate + ).unix(); await this.uiBrewStorage.update(addedBrewObj); } - - - - - if (this.settings.track_caffeine_consumption && this.data.grind_weight > 0 && this.data.getBean().decaffeinated === false) { - this.uiHealthKit.trackCaffeineConsumption(this.data.getCaffeineAmount(), moment(this.brewBrewing.customCreationDate).toDate()); + if ( + this.settings.track_caffeine_consumption && + this.data.grind_weight > 0 && + this.data.getBean().decaffeinated === false + ) { + this.uiHealthKit.trackCaffeineConsumption( + this.data.getCaffeineAmount(), + moment(this.brewBrewing.customCreationDate).toDate() + ); } if (!this.hide_toast_message) { this.uiToast.showInfoToast('TOAST_BREW_ADDED_SUCCESSFULLY'); } this.brewTracking.trackBrew(addedBrewObj); - - - - - } - catch (ex) { - - } + } catch (ex) {} await this.uiAlert.hideLoadingSpinner(); - await this.uiBrewHelper.checkIfBeanPackageIsConsumedTriggerMessageAndArchive(this.data.getBean()); - this.uiAnalytics.trackEvent(BREW_TRACKING.TITLE, BREW_TRACKING.ACTIONS.ADD_FINISH); + await this.uiBrewHelper.checkIfBeanPackageIsConsumedTriggerMessageAndArchive( + this.data.getBean() + ); + this.uiAnalytics.trackEvent( + BREW_TRACKING.TITLE, + BREW_TRACKING.ACTIONS.ADD_FINISH + ); this.dismiss(); - - - } - public getPreparation(): Preparation { return this.uiPreparationStorage.getByUUID(this.data.method_of_preparation); } - - public ngOnInit() { - - } - - - - - - - + public ngOnInit() {} } diff --git a/src/app/brew/brew-cupping/brew-cupping.component.html b/src/app/brew/brew-cupping/brew-cupping.component.html index e0ac92956..9f0fc8121 100644 --- a/src/app/brew/brew-cupping/brew-cupping.component.html +++ b/src/app/brew/brew-cupping/brew-cupping.component.html @@ -31,7 +31,7 @@ {{"CUSTOM_FLAVORS_AROMAS" | translate }} - + {{customFlavor}} @@ -42,7 +42,7 @@ {{"PREDEFINED_FLAVORS_AROMAS" | translate }} - + {{'CUPPING_' + item.key | translate}} diff --git a/src/app/brew/brew-cupping/brew-cupping.component.ts b/src/app/brew/brew-cupping/brew-cupping.component.ts index b1479bb94..24423a916 100644 --- a/src/app/brew/brew-cupping/brew-cupping.component.ts +++ b/src/app/brew/brew-cupping/brew-cupping.component.ts @@ -1,17 +1,21 @@ -import {Component, OnInit, ViewChild} from '@angular/core'; -import {ModalController, NavParams} from '@ionic/angular'; -import {Brew} from '../../../classes/brew/brew'; -import {Settings} from '../../../classes/settings/settings'; -import {IBrew} from '../../../interfaces/brew/iBrew'; -import {UIHelper} from '../../../services/uiHelper'; -import {UISettingsStorage} from '../../../services/uiSettingsStorage'; - -import {UIToast} from '../../../services/uiToast'; -import {UIBrewStorage} from '../../../services/uiBrewStorage'; -import {CuppingRadarComponent} from '../../../components/cupping-radar/cupping-radar.component'; -import {BrewFlavorPickerComponent} from '../brew-flavor-picker/brew-flavor-picker.component'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ModalController, NavParams } from '@ionic/angular'; +import { Brew } from '../../../classes/brew/brew'; +import { Settings } from '../../../classes/settings/settings'; +import { IBrew } from '../../../interfaces/brew/iBrew'; +import { UIHelper } from '../../../services/uiHelper'; +import { UISettingsStorage } from '../../../services/uiSettingsStorage'; + +import { UIToast } from '../../../services/uiToast'; +import { UIBrewStorage } from '../../../services/uiBrewStorage'; +import { CuppingRadarComponent } from '../../../components/cupping-radar/cupping-radar.component'; +import { BrewFlavorPickerComponent } from '../brew-flavor-picker/brew-flavor-picker.component'; import BREW_TRACKING from '../../../data/tracking/brewTracking'; -import {UIAnalytics} from '../../../services/uiAnalytics'; +import { UIAnalytics } from '../../../services/uiAnalytics'; +import { IBean } from '../../../interfaces/bean/iBean'; +import { UIBeanStorage } from '../../../services/uiBeanStorage'; +import { Bean } from '../../../classes/bean/bean'; +import BEAN_TRACKING from '../../../data/tracking/beanTracking'; @Component({ selector: 'brew-cupping', @@ -20,38 +24,39 @@ import {UIAnalytics} from '../../../services/uiAnalytics'; }) export class BrewCuppingComponent implements OnInit { public static COMPONENT_ID = 'brew-cup'; - public segment: string ='flavor'; + public segment: string = 'flavor'; + + public data: Bean | Brew = undefined; - public data: Brew = new Brew(); public settings: Settings; - @ViewChild('radar', {static: false}) public radar: CuppingRadarComponent; + @ViewChild('radar', { static: false }) public radar: CuppingRadarComponent; private brew: IBrew; - - constructor(private readonly modalController: ModalController, - private readonly navParams: NavParams, - public uiHelper: UIHelper, - private readonly uiSettingsStorage: UISettingsStorage, - private readonly uiBrewStorage: UIBrewStorage, - private readonly uiToast: UIToast, - private readonly uiAnalytics: UIAnalytics) { - + private bean: IBean; + + constructor( + private readonly modalController: ModalController, + private readonly navParams: NavParams, + public uiHelper: UIHelper, + private readonly uiSettingsStorage: UISettingsStorage, + private readonly uiBrewStorage: UIBrewStorage, + private readonly uiToast: UIToast, + private readonly uiAnalytics: UIAnalytics, + private readonly uiBeanStorage: UIBeanStorage + ) { this.settings = this.uiSettingsStorage.getSettings(); // Moved from ionViewDidEnter, because of Ionic issues with ion-range - } public segmentChanged() { // Timeout else the viewchilds are not ready. - setTimeout( () => { + setTimeout(() => { if (this.segment === 'cupping') { this.loadCupping(); } else { - } - },50); - + }, 50); } public saveCuppingValues() { this.data.cupping = this.radar.getCuppingValues(); @@ -65,50 +70,69 @@ export class BrewCuppingComponent implements OnInit { this.data.cupped_flavor.custom_flavors.splice(_index, 1); } public deletePredefinedFlavor(_key) { - delete this.data.cupped_flavor.predefined_flavors[_key]; - } public async tasteFlavors() { - const modal = await this.modalController.create({component: BrewFlavorPickerComponent, - id: BrewFlavorPickerComponent.COMPONENT_ID, - componentProps: {flavor: this.data.cupped_flavor}}); - await modal.present(); - const {data} = await modal.onWillDismiss(); - if (data !== undefined && data.hasOwnProperty('customFlavors')) { - this.data.cupped_flavor.custom_flavors = data.customFlavors; - this.data.cupped_flavor.predefined_flavors = data.selectedFlavors; - - } + const modal = await this.modalController.create({ + component: BrewFlavorPickerComponent, + id: BrewFlavorPickerComponent.COMPONENT_ID, + componentProps: { flavor: this.data.cupped_flavor }, + }); + await modal.present(); + const { data } = await modal.onWillDismiss(); + if (data !== undefined && data.hasOwnProperty('customFlavors')) { + this.data.cupped_flavor.custom_flavors = data.customFlavors; + this.data.cupped_flavor.predefined_flavors = data.selectedFlavors; + } } - public ionViewWillEnter() { - this.uiAnalytics.trackEvent(BREW_TRACKING.TITLE, BREW_TRACKING.ACTIONS.CUPPING); this.brew = this.navParams.get('brew'); if (this.brew) { - const copy: IBrew = this.uiHelper.cloneData(this.uiBrewStorage.getByUUID(this.brew.config.uuid)); + this.uiAnalytics.trackEvent( + BREW_TRACKING.TITLE, + BREW_TRACKING.ACTIONS.CUPPING + ); + this.data = new Brew(); + const copy: IBrew = this.uiHelper.cloneData( + this.uiBrewStorage.getByUUID(this.brew.config.uuid) + ); this.data.initializeByObject(copy); + } else { + this.uiAnalytics.trackEvent( + BEAN_TRACKING.TITLE, + BEAN_TRACKING.ACTIONS.CUPPING + ); + this.bean = this.navParams.get('bean'); + this.data = new Bean(); + const copyBean: IBean = this.uiHelper.cloneData( + this.uiBeanStorage.getByUUID(this.bean.config.uuid) + ); + this.data.initializeByObject(copyBean); } } - public ngOnInit(): void { - } + public ngOnInit(): void {} public async updateBrew() { + if (this.data instanceof Brew) { + await this.uiBrewStorage.update(this.data); + } else { + await this.uiBeanStorage.update(this.data); + } - - await this.uiBrewStorage.update(this.data); this.uiToast.showInfoToast('TOAST_BREW_EDITED_SUCCESSFULLY'); this.dismiss(); } public async dismiss() { - this.modalController.dismiss({ - dismissed: true - },undefined,BrewCuppingComponent.COMPONENT_ID); - - + this.modalController.dismiss( + { + dismissed: true, + }, + undefined, + BrewCuppingComponent.COMPONENT_ID + ); } } diff --git a/src/app/brew/brew-edit/brew-edit.component.html b/src/app/brew/brew-edit/brew-edit.component.html index 014bde8fb..9121ed8d5 100644 --- a/src/app/brew/brew-edit/brew-edit.component.html +++ b/src/app/brew/brew-edit/brew-edit.component.html @@ -6,6 +6,11 @@ + + + + + diff --git a/src/app/brew/brew-edit/brew-edit.component.ts b/src/app/brew/brew-edit/brew-edit.component.ts index 287ee9ec3..c94cb5305 100644 --- a/src/app/brew/brew-edit/brew-edit.component.ts +++ b/src/app/brew/brew-edit/brew-edit.component.ts @@ -14,6 +14,7 @@ import { UIAnalytics } from '../../../services/uiAnalytics'; import { UISettingsStorage } from '../../../services/uiSettingsStorage'; import { Insomnia } from '@ionic-native/insomnia/ngx'; import { Settings } from '../../../classes/settings/settings'; +import { SettingsPopoverBluetoothActionsComponent } from '../../settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component'; @Component({ selector: 'brew-edit', @@ -98,6 +99,18 @@ export class BrewEditComponent implements OnInit { ); this.dismiss(); } + public async popoverActionsBrew() { + const popover = await this.modalController.create({ + component: SettingsPopoverBluetoothActionsComponent, + componentProps: {}, + id: SettingsPopoverBluetoothActionsComponent.COMPONENT_ID, + cssClass: 'popover-actions', + breakpoints: [0, 0.5], + initialBreakpoint: 0.5, + }); + await popover.present(); + await popover.onWillDismiss(); + } public ngOnInit() { this.uiAnalytics.trackEvent( diff --git a/src/app/brew/brew-flow/brew-flow.component.html b/src/app/brew/brew-flow/brew-flow.component.html index 58817f093..a8437cf5f 100644 --- a/src/app/brew/brew-flow/brew-flow.component.html +++ b/src/app/brew/brew-flow/brew-flow.component.html @@ -12,7 +12,7 @@
- + @@ -23,10 +23,11 @@ min="0" max="12" duration="1" - thick="5" > + thick="5" + [animate]="false"> - +
? g/s
? g/s
diff --git a/src/app/brew/brew-flow/brew-flow.component.ts b/src/app/brew/brew-flow/brew-flow.component.ts index c41c765b3..c6e5e0115 100644 --- a/src/app/brew/brew-flow/brew-flow.component.ts +++ b/src/app/brew/brew-flow/brew-flow.component.ts @@ -147,8 +147,20 @@ export class BrewFlowComponent implements AfterViewInit, OnDestroy { const pressureDevice: PressureDevice = this.bleManager.getPressureDevice(); return !!pressureDevice; } - public startTimer() { - this.brewComponent.timer.startTimer(); + public async startTimer() { + await this.brewComponent.timerStartPressed(undefined); + + // Looks funny but we need. if we would not calculate and substract 25px, the actual time graph would not be displayed :< + setTimeout(() => { + try { + const newHeight = + document.getElementById('brewFlowContainer').offsetHeight; + document + .getElementById('brewFlowContainer') + .getElementsByTagName('canvas')[0].style.height = + newHeight - 1 + 'px'; + } catch (ex) {} + }, 250); } public pauseTimer() { this.brewComponent.timer.pauseTimer(); @@ -157,7 +169,7 @@ export class BrewFlowComponent implements AfterViewInit, OnDestroy { this.brewComponent.timer.reset(); } public resumeTimer() { - this.brewComponent.timer.resumeTimer(); + this.brewComponent.timerResumedPressed(undefined); } public __tareScale() { this.brewComponent.timer.__tareScale(); diff --git a/src/app/dashboard/dashboard.page.html b/src/app/dashboard/dashboard.page.html index 3eeb90b7f..4affd9852 100644 --- a/src/app/dashboard/dashboard.page.html +++ b/src/app/dashboard/dashboard.page.html @@ -14,7 +14,8 @@ - shit + + diff --git a/src/app/dashboard/dashboard.page.ts b/src/app/dashboard/dashboard.page.ts index e0dfc404f..b8d33195a 100644 --- a/src/app/dashboard/dashboard.page.ts +++ b/src/app/dashboard/dashboard.page.ts @@ -9,10 +9,8 @@ import { Router } from '@angular/router'; import { UIBeanStorage } from '../../services/uiBeanStorage'; import { Bean } from '../../classes/bean/bean'; import { UIBeanHelper } from '../../services/uiBeanHelper'; -import { Chart } from 'chart.js'; -import moment from 'moment'; + import { UISettingsStorage } from '../../services/uiSettingsStorage'; -import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-devices'; @Component({ selector: 'dashboard', @@ -22,8 +20,7 @@ import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-dev export class DashboardPage implements OnInit { public brews: Array = []; private leftOverBeansWeight: number = undefined; - /*public flowProfileChartEl: any = undefined; - @ViewChild('flowProfileChart', { static: false }) public flowProfileChart;*/ + constructor( public uiStatistic: UIStatistic, private readonly modalCtrl: ModalController, @@ -33,36 +30,9 @@ export class DashboardPage implements OnInit { private readonly router: Router, private readonly uiBeanStorage: UIBeanStorage, private readonly uiBeanHelper: UIBeanHelper, - private readonly uiSettingsStorage: UISettingsStorage, - private readonly bleManager: CoffeeBluetoothDevicesService + private readonly uiSettingsStorage: UISettingsStorage ) {} - private scale: any = undefined; - public async doShit() { - if (this.scale) { - this.bleManager.disconnect(this.scale.id); - setTimeout(() => { - this.scale = null; - }, 150); - } else { - this.scale = await this.bleManager.tryToFindScale(); - if (this.scale) { - try { - // We don't need to retry for iOS, because we just did scan before. - - // NEVER!!! Await here, else the bluetooth logic will get broken. - this.bleManager.autoConnectScale( - this.scale.type, - this.scale.id, - false - ); - } catch (ex) {} - } - } - } - public getRandomInt(min, max) { - return Math.floor(Math.random() * (max - min + 1)) + min; - } public ngOnInit() { this.uiBrewStorage.attachOnEvent().subscribe((_val) => { // If an brew is deleted, we need to reset our array for the next call. diff --git a/src/app/info/log/log.component.ts b/src/app/info/log/log.component.ts index e116e3e08..636cd726a 100644 --- a/src/app/info/log/log.component.ts +++ b/src/app/info/log/log.component.ts @@ -1,10 +1,13 @@ -import {Component, OnInit} from '@angular/core'; -import {UILog} from '../../../services/uiLog'; -import {ILogInterface} from '../../../interfaces/log/iLog'; +import { Component, OnInit } from '@angular/core'; +import { UILog } from '../../../services/uiLog'; +import { ILogInterface } from '../../../interfaces/log/iLog'; -import {LOGS_ENUM} from '../../../enums/logs/logs'; -import {ModalController} from '@ionic/angular'; -import {LogTextComponent} from './log-text/log-text.component'; +import { LOGS_ENUM } from '../../../enums/logs/logs'; +import { ModalController } from '@ionic/angular'; +import { LogTextComponent } from './log-text/log-text.component'; +import { ShareService } from '../../../services/shareService/share-service.service'; +import { UIFileHelper } from '../../../services/uiFileHelper'; +import { UIHelper } from '../../../services/uiHelper'; @Component({ selector: 'log', @@ -12,22 +15,37 @@ import {LogTextComponent} from './log-text/log-text.component'; styleUrls: ['./log.component.scss'], }) export class LogComponent implements OnInit { - public logs: Array = []; public LOG_ENUM = LOGS_ENUM; - constructor(private readonly uiLog: UILog, private readonly modalCtrl: ModalController) { - } + constructor( + private readonly uiLog: UILog, + private readonly modalCtrl: ModalController, + private shareService: ShareService, + private readonly uiHelper: UIHelper + ) {} public ngOnInit() { this.logs = this.uiLog.getLogs(); } public async send(): Promise { - const modal = await this.modalCtrl.create({component: LogTextComponent}); - await modal.present(); - await modal.onWillDismiss(); + const stringifiedJSON = JSON.stringify(this.logs); + const blob = new Blob([stringifiedJSON], { + type: 'application/json', + }); + const reader = new FileReader(); + reader.readAsDataURL(blob); + reader.onloadend = () => { + const base64data = reader.result as string; + this.shareService.shareFile('Beanconqueror_logs', base64data); + }; + reader.onerror = async () => { + const modal = await this.modalCtrl.create({ + component: LogTextComponent, + }); + await modal.present(); + await modal.onWillDismiss(); + }; } - - } diff --git a/src/app/settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component.html b/src/app/settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component.html new file mode 100644 index 000000000..745f59313 --- /dev/null +++ b/src/app/settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component.html @@ -0,0 +1,14 @@ + + + + + + + {{"POPOVER_BLUETOOTH_ACTION_RECONNECT_SCALE" | translate}} + + + + {{"POPOVER_BLUETOOTH_ACTION_RECONNECT_PRESSURE_DEVICE" | translate}} + + + diff --git a/src/app/settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component.scss b/src/app/settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component.scss new file mode 100644 index 000000000..c0edcfbf3 --- /dev/null +++ b/src/app/settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component.scss @@ -0,0 +1,6 @@ +:host{ + ion-header { + height:40px; + background-color: #ffffff; + } +} diff --git a/src/app/settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component.spec.ts b/src/app/settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component.spec.ts new file mode 100644 index 000000000..d96d3b8dc --- /dev/null +++ b/src/app/settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component.spec.ts @@ -0,0 +1,24 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { SettingsPopoverBluetoothActionsComponent } from './settings-popover-bluetooth-actions.component'; + +describe('SettingsPopoverBluetoothActionsComponent', () => { + let component: SettingsPopoverBluetoothActionsComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [SettingsPopoverBluetoothActionsComponent], + imports: [IonicModule.forRoot()], + }).compileComponents(); + + fixture = TestBed.createComponent(SettingsPopoverBluetoothActionsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component.ts b/src/app/settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component.ts new file mode 100644 index 000000000..248fae76b --- /dev/null +++ b/src/app/settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component.ts @@ -0,0 +1,87 @@ +import { Component, OnInit } from '@angular/core'; +import { Settings } from '../../../classes/settings/settings'; +import { ModalController, NavParams } from '@ionic/angular'; +import { UIHelper } from '../../../services/uiHelper'; +import { UISettingsStorage } from '../../../services/uiSettingsStorage'; +import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-devices'; +import { UIAlert } from '../../../services/uiAlert'; + +@Component({ + selector: 'app-settings-popover-bluetooth-actions', + templateUrl: './settings-popover-bluetooth-actions.component.html', + styleUrls: ['./settings-popover-bluetooth-actions.component.scss'], +}) +export class SettingsPopoverBluetoothActionsComponent implements OnInit { + public static COMPONENT_ID = 'settings-popover-bluetooth-actions'; + + public settings: Settings; + + constructor( + private readonly modalController: ModalController, + private readonly navParams: NavParams, + private readonly uiHelper: UIHelper, + private readonly uiSettings: UISettingsStorage, + private readonly bluetoothService: CoffeeBluetoothDevicesService, + private readonly uiAlert: UIAlert + ) { + this.settings = this.uiSettings.getSettings(); + } + + public ionViewDidEnter(): void {} + public ngOnInit() {} + + public reconnectScale() { + let timeoutVar: any = null; + const scaleId = this.settings.scale_id; + const scaleType = this.settings.scale_type; + if (scaleId && scaleType) { + this.uiAlert.showLoadingSpinner(); + this.bluetoothService.reconnectScale( + scaleType, + scaleId, + () => { + this.uiAlert.hideLoadingSpinner(); + clearTimeout(timeoutVar); + timeoutVar = null; + }, + () => { + this.uiAlert.hideLoadingSpinner(); + clearTimeout(timeoutVar); + timeoutVar = null; + } + ); + } + + timeoutVar = setTimeout(async () => { + this.uiAlert.hideLoadingSpinner(); + }, 60000); + } + public reconnectPressureDevice() { + let timeoutVar: any = null; + const pressureId = this.settings.pressure_id; + const pressureType = this.settings.pressure_type; + if (pressureId && pressureType) { + this.uiAlert.showLoadingSpinner(); + this.bluetoothService.reconnectPressureDevice( + pressureType, + pressureId, + () => { + this.uiAlert.hideLoadingSpinner(); + clearTimeout(timeoutVar); + timeoutVar = null; + }, + () => { + this.uiAlert.hideLoadingSpinner(); + clearTimeout(timeoutVar); + timeoutVar = null; + } + ); + } + + timeoutVar = setTimeout(async () => { + this.uiAlert.hideLoadingSpinner(); + }, 60000); + } + + public async choose(_type: string): Promise {} +} diff --git a/src/app/settings/settings.page.html b/src/app/settings/settings.page.html index 3d136d144..0fab2ffd7 100644 --- a/src/app/settings/settings.page.html +++ b/src/app/settings/settings.page.html @@ -98,19 +98,19 @@

{{"PAGE_SETTINGS_BREW_RATING" | translate}}

{{"PAGE_SETTINGS_BREW_RATING_STEPS" | translate}} - + 1 - + 0.75 - + 0.5 - + 0.25 - + 0.1 @@ -133,19 +133,19 @@

{{"PAGE_SETTINGS_BEAN_RATING" | translate}}

{{"PAGE_SETTINGS_BEAN_RATING_STEPS" | translate}} - + 1 - + 0.75 - + 0.5 - + 0.25 - + 0.1 @@ -327,7 +327,7 @@

{{"IGNORE_ANOMALY_VALUES" | translate}}

{{"SMART_SCALE_LOG" | translate}}

-
@@ -422,14 +422,14 @@

{{"IGNORE_ANOMALY_VALUES" | translate}}

{{"PRESSURE_LOG" | translate}}

-
-

{{"PRESSURE_INFORMATION_DESCRIPTION" | translate}}

+

{{"PRESSURE.INFORMATION_DESCRIPTION" | translate}}

diff --git a/src/app/settings/settings.page.ts b/src/app/settings/settings.page.ts index 2e51c8e55..f1b15692e 100644 --- a/src/app/settings/settings.page.ts +++ b/src/app/settings/settings.page.ts @@ -63,7 +63,10 @@ import { Water } from '../../classes/water/water'; import { AppEvent } from '../../classes/appEvent/appEvent'; import { AppEventType } from '../../enums/appEvent/appEvent'; import { EventQueueService } from '../../services/queueService/queue-service.service'; -import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-devices'; +import { + CoffeeBluetoothDevicesService, + Logger, +} from '@graphefruit/coffee-bluetooth-devices'; declare var cordova: any; declare var device: any; @@ -174,7 +177,7 @@ export class SettingsPage implements OnInit { await this.bleManager.hasLocationPermission(); if (!hasLocationPermission) { await this.uiAlert.showMessage( - 'SCALE.REQUEST_PERMISSION.LOCATION', + 'PRESSURE.REQUEST_PERMISSION.LOCATION', undefined, undefined, true @@ -186,7 +189,7 @@ export class SettingsPage implements OnInit { await this.bleManager.hasBluetoothPermission(); if (!hasBluetoothPermission) { await this.uiAlert.showMessage( - 'SCALE.REQUEST_PERMISSION.BLUETOOTH', + 'PRESSURE.REQUEST_PERMISSION.BLUETOOTH', undefined, undefined, true @@ -197,7 +200,7 @@ export class SettingsPage implements OnInit { const bleEnabled: boolean = await this.bleManager.isBleEnabled(); if (bleEnabled === false) { await this.uiAlert.showMessage( - 'SCALE.BLUETOOTH_NOT_ENABLED', + 'PRESSURE.BLUETOOTH_NOT_ENABLED', undefined, undefined, true @@ -206,7 +209,10 @@ export class SettingsPage implements OnInit { } await this.uiAlert.showLoadingSpinner(); - this.uiAlert.setLoadingSpinnerMessage('SCALE.BLUETOOTH_SCAN_RUNNING', true); + this.uiAlert.setLoadingSpinnerMessage( + 'PRESSURE.BLUETOOTH_SCAN_RUNNING', + true + ); const pressureDevice = await this.bleManager.tryToFindPressureDevice(); if (pressureDevice) { await this.uiAlert.hideLoadingSpinner(); @@ -230,7 +236,7 @@ export class SettingsPage implements OnInit { } else { await this.uiAlert.hideLoadingSpinner(); this.uiAlert.showMessage( - 'SCALE.CONNECTION_NOT_ESTABLISHED', + 'PRESSURE.CONNECTION_NOT_ESTABLISHED', undefined, undefined, true @@ -474,6 +480,18 @@ export class SettingsPage implements OnInit { await this.uiSettingsStorage.saveSettings(this.settings); } + public async toggleLog() { + if ( + this.settings.scale_log === true || + this.settings.pressure_log === true + ) { + Logger.enableLog(); + } else { + Logger.disableLog(); + } + await this.uiSettingsStorage.saveSettings(this.settings); + } + public async showAnalyticsInformation() { const modal = await this.modalCtrl.create({ component: AnalyticsPopoverComponent, diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 2e9249138..6018cc07e 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -163,6 +163,8 @@ import { PreparationToolModalSelectComponent } from '../preparation/preparation- import { PreparationToolOverlayDirective } from '../../directive/preparation-tool-overlay.directive'; import { CoffeeBluetoothDevicesService } from '@graphefruit/coffee-bluetooth-devices'; import { NgxGaugeModule } from 'ngx-gauge'; +import { SettingsPopoverBluetoothActionsComponent } from '../settings/settings-popover-bluetooth-actions/settings-popover-bluetooth-actions.component'; +import { BeanAssociatedBrewsComponent } from '../beans/bean-associated-brews/bean-associated-brews.component'; @NgModule({ declarations: [ @@ -267,11 +269,13 @@ import { NgxGaugeModule } from 'ngx-gauge'; PhotoPopoverComponent, WaterPopoverActionsComponent, BrewPopoverActionsComponent, + SettingsPopoverBluetoothActionsComponent, BeanPopoverActionsComponent, BeanPopoverAddComponent, BeanArchivePopoverComponent, MillPopoverActionsComponent, BeanModalSelectComponent, + BeanAssociatedBrewsComponent, WaterModalSelectComponent, RoastingMachineModalSelectComponent, MillModalSelectComponent, @@ -450,11 +454,13 @@ import { NgxGaugeModule } from 'ngx-gauge'; BrewEditComponent, PhotoPopoverComponent, BrewPopoverActionsComponent, + SettingsPopoverBluetoothActionsComponent, WaterPopoverActionsComponent, BeanPopoverActionsComponent, BeanPopoverAddComponent, BeanArchivePopoverComponent, BeanModalSelectComponent, + BeanAssociatedBrewsComponent, WaterModalSelectComponent, RoastingMachineModalSelectComponent, MillModalSelectComponent, diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index edca4502c..396d155d6 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -737,6 +737,51 @@ "Nach Aufnahme eines Bildes war der Ladebalken nicht verschwunden", "Kleinere Fehlerbehebungen" ] + }, + "6.2.0": { + "TITLE": "Version 6.2.0: Das ist neu", + "DESCRIPTION": [ + "Druckgeräte", + "Unterstützung von 'Do it yourself' Popsicle - Sensor - Danke an Mike und Shay ", + "Autostart Timer bei einem Gewissen Wasserdruck - Editierbar in den Einstellungen", + "Drücken der Druck-Anzeige setzt den Druck auf '0' zurück", + "Anzeige des Druckgerättypes und der Mac-Adresse beim Verbinden", + "", + "Bluetooth Waage", + "Unterstützung von Eureka Precisa - Danke an Mimoja", + "Bestimmte das Verhalten der Bluetooth Waage bei einer neuen Brühung - Editierbar in den Einstellungen", + "Bestimmte welche Graphen bei Filter oder Espresso angezeigt werden sollen - Editierbar in den Einstellungen", + "Sequenzielle Abarbeitung von Bluetooth-Befehlen um Fehlerfälle zu reduzieren", + "Anzeige des Waagentypes und der Mac-Adresse beim Verbinden", + "", + "Brühungen", + "Unterstützung von Millisekunden - Aktivierbar in den Einstellungen", + "Filtersystem erweitert, damit man bei Bohnen auch Rösttyp und Röster suchen kann", + "Bei einer verbundenen Bluetoothwaage sowie Druckgerät kann nun auf der Brühseite, die Verbindung erneut aufgebaut werden", + "", + "Bohnen", + "Teile deine Bohnen (ohne Server) - Danke an Mike", + "Zeige alle Brühungen zu der Bohne", + "Unterstützung der Bohnenbewertung - wie bei Brühungen - Editierbar in den Einstellungen", + "", + "Weitere Sprachen", + "Unterstützung von Türkisch - Danke an Halil Portakal", + "Unterstützung von Chinesisch - Danke an Jiageng", + "", + "Mühlen", + "Anzeige des letztens Mahlgrades sowie der letzten Bohne", + "", + "Verbesserungen", + "Fehlermeldung beim Scannen einer Bohne, wenn diese noch nicht Freigegeben wurde", + "Die Editierung des Brühdatums ist nun Standardmäßig aktiviert", + "", + "Sonstiges:", + "Typo fehler behoben", + "Behebung eines Fehlers, dass Sternbewertungen nicht mehr zu sehen waren, trotz Grundeinstellungen", + "Ältere Brühgraphen durch eine Bluetoothwaage können wieder exportiert werden", + "Aktualisierung auf Ionic 6.3.0", + "Kleinere Fehlerbehebungen" + ] } }, "CUSTOM_PARAMETERS": "Parameter individualisieren", @@ -1119,7 +1164,8 @@ "WRONG_LINK_DESCRIPTION": "Falsche App-Verlinkung", "WRONG_LINK_TITLE": "Fehler", "SERVER": { - "ERROR_OCCURED": "Ein Fehler ist aufgetreten, QR-Code konnte nicht ausgelesen werden, bitte versuche es erneut." + "ERROR_OCCURED": "Ein Fehler ist aufgetreten, QR-Code konnte nicht ausgelesen werden, bitte versuche es erneut.", + "BEAN_NOT_APPROVED": "Bohne wurde noch nicht freigegeben, bitte versuche es später erneut" }, "BEAN_SUCCESSFULLY_SCANNED": "Bohne erfolgreich gescannt", "BEAN_SUCCESSFULLY_REFRESHED": "Bohne erfolgreich aktualisiert", @@ -1204,13 +1250,23 @@ "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "0 bis 5 sind dir zu wenig zur Bewertung deiner Bohne? Du kannst bis zu 100 'Punkten' vergeben", "PAGE_SETTINGS_BEAN_RATING_STEPS": "Bohnen Bewertungsschritte", "COFFEE_GRAMS_BREWED": "Grams gebrüht", - "PRESSURE_INFORMATION_DESCRIPTION": "Aktuell nur das Do It Yourself Projekt 'Popsicle' unterstützt", "SMART_SCALE_MAXIMIZE_ON_START_TIMER": "Bei Zeitstart Echtzeitgrafik maximieren", "PRESSURE": { "CONNECTION_NOT_ESTABLISHED": "Druckgerät konnte nicht gefunden oder verbunden werden", "CONNECTED_SUCCESSFULLY": "Druckgerät verbunden", "DISCONNECTED_SUCCESSFULLY": "Druckgerät getrennt", "DISCONNECTED_UNPLANNED": "Druckgerät ungeplant getrennt", - "INFORMATION_DESCRIPTION": "Unterstütze Druckgeräte sind Popsicle, sowie PRS" - } + "INFORMATION_DESCRIPTION": "Unterstütze Druckgeräte sind Popsicle", + "BLUETOOTH_SCAN_RUNNING": "Druckgeräte werden für 60 Sekunden versucht zu finden, bitte warten", + "BLUETOOTH_NOT_ENABLED": "Bluetooth ist nicht aktiviert, bitte aktiviere dies in den Einstellungen", + "REQUEST_PERMISSION": { + "LOCATION": "Um Druckgeräte zu finden, muss der Standort freigegeben werden", + "BLUETOOTH": "Um Druckgeräte zu finden, muss Bluetooth freigegeben werden" + } + }, + "POPOVER_BLUETOOTH_ACTION_RECONNECT_SCALE": "Waage neu verbinden", + "POPOVER_BLUETOOTH_ACTION_RECONNECT_PRESSURE_DEVICE": "Druckgerät neu verbinden", + "POPOVER_SHOW_BREWS": "Zugehörige Brühungen", + "LAST_USED_GRIND_SIZE_SETTING": "Letzter Mahlgrad", + "LAST_USED_BEAN": "Letzte Bohne" } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index f02aea069..51689f030 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -57,7 +57,7 @@ "PAGE_SETTINGS_LANGUAGE_ENGLISH": "English", "PAGE_SETTINGS_LANGUAGE_SPANISH": "Spanish", "PAGE_SETTINGS_LANGUAGE_TURKISH": "Turkish", - "PAGE_SETTINGS_LANGUAGE_CHINESE": "Basitleştirilmiş Çince", + "PAGE_SETTINGS_LANGUAGE_CHINESE": "Chinese", "PAGE_SETTINGS_GENERAL_SETTINGS": "General Settings", "PAGE_SETTINGS_TRANSFER": "Data Transfer", "PAGE_SETTINGS_PRESET_LAST_BREW": "Preset Values?", @@ -737,6 +737,51 @@ "After taking a picture, the loading spinner didn't disappear", "Smaller bugfixes" ] + }, + "6.2.0": { + "TITLE": "Version 6.2.0: Thats new", + "DESCRIPTION": [ + "Pressure devices", + "Support of 'Do it yourself' Popsicle - Sensor - Thanks to Mike and Shay", + "Autostart timer on a specific pressure - editable in settings", + "Press of pressure gauge, will reset pressure to 0", + "Display name of pressure device and mac-address on connect", + "", + "Bluetooth scales", + "Support of Eureka Precisa - Thanks to Mimoja", + "Define the behavior of the bluetooth scale on a new brew - editable in settings", + "Define which graphs should be displayed on filter or espresso - editable in settings", + "Sequential processing of bluetooth commands to reduce issues", + "Display name of bluetooth scale and mac-address on connect", + "", + "Brews", + "Supports now milliseconds - Activate in settings", + "Filtersystem expanded, search for roast type and roastery", + "You can reconnect your bluetooth scale or pressure device on the brew add/edit page", + "", + "Beans", + "Share your bean (without server needed) - Thanks to Mike", + "Show all brews to your bean", + "Support bean rating like for brews - editable in settings", + "", + "More languages", + "Support of Turkish - Thanks to Halil Portakal", + "Support of Chinese - Thanks to Jiageng", + "", + "Mills", + "Display of the last used grind setting, aswell as the last used bean", + "", + "Improvements", + "Error message when a bean is scanned, which has not been approved yet", + "The edit of the brew-date is not activated by default", + "", + "Others", + "Typos fixed", + "Fixed an issue that you didn't see the star-rating even with normal settings", + "Older brew graphics can now be exported again", + "Update to Ionic 6.3.0", + "Smaller bug fixes" + ] } }, "CUSTOM_PARAMETERS": "Customize parameter", @@ -1119,7 +1164,8 @@ "WRONG_LINK_DESCRIPTION": "Wrong app link", "WRONG_LINK_TITLE": "Error", "SERVER": { - "ERROR_OCCURED": "An error is occured, qr code could not be read, please try again." + "ERROR_OCCURED": "An error is occured, qr code could not be read, please try again.", + "BEAN_NOT_APPROVED": "Bean has not been approved yet, please try later again" }, "BEAN_SUCCESSFULLY_SCANNED": "Bean successfully scanned", "BEAN_SUCCESSFULLY_REFRESHED": "Bean successfully updated", @@ -1204,13 +1250,23 @@ "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "Is the default '0 to 5' not the right rating for you? You can instead use a '0 to 100' scale", "PAGE_SETTINGS_BEAN_RATING_STEPS": "Bean rating steps", "COFFEE_GRAMS_BREWED": "Grams brewed", - "PRESSURE_INFORMATION_DESCRIPTION": "Actually just the DIY project 'Popsicle' supported", "SMART_SCALE_MAXIMIZE_ON_START_TIMER": "Maximize realtime graphic on timer start", "PRESSURE": { "CONNECTION_NOT_ESTABLISHED": "Pressure device not found found or connection could not be established", "CONNECTED_SUCCESSFULLY": "Pressure device connected", "DISCONNECTED_SUCCESSFULLY": "Pressure device disconnected", "DISCONNECTED_UNPLANNED": "Pressure device disconnected unplanned", - "INFORMATION_DESCRIPTION": "Supported devices are: PRS and Popsicle" - } + "INFORMATION_DESCRIPTION": "Supported devices are: Popsicle", + "BLUETOOTH_SCAN_RUNNING": "Pressure device will be searched for 60 seconds, please wait", + "BLUETOOTH_NOT_ENABLED": "Bluetooth not activated, please activate to work properly", + "REQUEST_PERMISSION": { + "LOCATION": "To find pressure devices, the app needs access to the location.", + "BLUETOOTH": "To find pressure devices, the app needs access to bluetooth" + } + }, + "POPOVER_BLUETOOTH_ACTION_RECONNECT_SCALE": "Reconnect scale", + "POPOVER_BLUETOOTH_ACTION_RECONNECT_PRESSURE_DEVICE": "Reconnect pressure device", + "POPOVER_SHOW_BREWS": "Show brews", + "LAST_USED_GRIND_SIZE_SETTING": "Last grind setting", + "LAST_USED_BEAN": "Last bean" } diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index a90008500..a63563dde 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -737,6 +737,52 @@ "Después de tomar una foto, la rueda giratoria de carga no desapareció.", "Pequeñas correcciones de errores" ] + }, + "6.2.0": { + "TITLE": "Version 6.2.0: Thats new", + "DESCRIPTION": [ + "Pressure devices", + "Support of PRS - Sensor", + "Support of 'Do it yourself' Popsicle - Sensor - Thanks to Mike and Shay", + "Autostart timer on a specific pressure - editable in settings", + "Press of pressure gauge, will reset pressure to 0", + "Display name of pressure device and mac-address on connect", + "", + "Bluetooth scales", + "Support of Eureka Precisa - Thanks to Mimoja", + "Define the behavior of the bluetooth scale on a new brew - editable in settings", + "Define which graphs should be displayed on filter or espresso - editable in settings", + "Sequential processing of bluetooth commands to reduce issues", + "Display name of bluetooth scale and mac-address on connect", + "", + "Brews", + "Supports now milliseconds - Activate in settings", + "Filtersystem expanded, search for roast type and roastery", + "You can reconnect your bluetooth scale or pressure device on the brew add/edit page", + "", + "Beans", + "Share your bean (without server needed) - Thanks to Mike", + "Show all brews to your bean", + "Support bean rating like for brews - editable in settings", + "", + "More languages", + "Support of Turkish - Thanks to Halil Portakal", + "Support of Chinese - Thanks to Jiageng", + "", + "Mills", + "Display of the last used grind setting, aswell as the last used bean", + "", + "Improvements", + "Error message when a bean is scanned, which has not been approved yet", + "The edit of the brew-date is not activated by default", + "", + "Others", + "Typos fixed", + "Fixed an issue that you didn't see the star-rating even with normal settings", + "Older brew graphics can now be exported again", + "Update to Ionic 6.3.0", + "Smaller bug fixes" + ] } }, "CUSTOM_PARAMETERS": "Personalizar parámetros", @@ -1119,7 +1165,8 @@ "WRONG_LINK_DESCRIPTION": "Enlace de aplicación incorrecto", "WRONG_LINK_TITLE": "Error", "SERVER": { - "ERROR_OCCURED": "Se ha producido un error, no se pudo leer el código qr, inténtalo de nuevo." + "ERROR_OCCURED": "Se ha producido un error, no se pudo leer el código qr, inténtalo de nuevo.", + "BEAN_NOT_APPROVED": "Bean has not been approved yet,please try later again" }, "BEAN_SUCCESSFULLY_SCANNED": "Grano escaneado correctamente", "BEAN_SUCCESSFULLY_REFRESHED": "Grano actualizado con éxito", @@ -1204,6 +1251,23 @@ "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "Is the default '0 to 5' not the right rating for you? You can instead use a '0 to 100' scale", "PAGE_SETTINGS_BEAN_RATING_STEPS": "Bean rating steps", "COFFEE_GRAMS_BREWED": "Grams brewed", - "PRESSURE_INFORMATION_DESCRIPTION": "Actually just the DIY project 'Popsicle' supported", - "SMART_SCALE_MAXIMIZE_ON_START_TIMER": "Maximize realtime graphic on timer start" + "SMART_SCALE_MAXIMIZE_ON_START_TIMER": "Maximize realtime graphic on timer start", + "PRESSURE": { + "CONNECTION_NOT_ESTABLISHED": "Pressure device not found found or connection could not be established", + "CONNECTED_SUCCESSFULLY": "Pressure device connected", + "DISCONNECTED_SUCCESSFULLY": "Pressure device disconnected", + "DISCONNECTED_UNPLANNED": "Pressure device disconnected unplanned", + "INFORMATION_DESCRIPTION": "Supported devices are: Popsicle", + "BLUETOOTH_SCAN_RUNNING": "Pressure device will be searched for 60 seconds, please wait", + "BLUETOOTH_NOT_ENABLED": "Bluetooth not activated, please activate to work properly", + "REQUEST_PERMISSION": { + "LOCATION": "To find pressure devices, the app needs access to the location.", + "BLUETOOTH": "To find pressure devices, the app needs access to bluetooth" + } + }, + "POPOVER_BLUETOOTH_ACTION_RECONNECT_SCALE": "Reconnect scale", + "POPOVER_BLUETOOTH_ACTION_RECONNECT_PRESSURE_DEVICE": "Reconnect pressure device", + "POPOVER_SHOW_BREWS": "Show brews", + "LAST_USED_GRIND_SIZE_SETTING": "Last grind setting", + "LAST_USED_BEAN": "Last bean" } diff --git a/src/assets/i18n/tr.json b/src/assets/i18n/tr.json index 476f29707..9a262b908 100644 --- a/src/assets/i18n/tr.json +++ b/src/assets/i18n/tr.json @@ -737,6 +737,51 @@ "Nach Aufnahme eines Bildes war der Ladebalken nicht verschwunden", "Kleinere Fehlerbehebungen" ] + }, + "6.2.0": { + "TITLE": "Version 6.2.0: Yenilikler", + "DESCRIPTION": [ + "Basınç cihazları", + "Kendin yap - Popsicle Sensörünün desteği - Mike ve Shay desteğin için teşekkürler", + "Belirli bir basınçta otomatik başlatma zamanlayıcısı - ayarlardan düzenlenebilir", + "Basınç göstergesine basın, basıncı 0'a sıfırlayacaktır", + "Bağlantıda basınç aygıtının ve mac adresinin görünen adı", + "", + "Bluetooth tartılar", + "Eureka Precisa Desteği - Mimoja desteğin için teşekkürler", + "Bluetooth tartının davranışını yeni bir demleme üzerinde tanımlayın - ayarlarda düzenlenebilir", + "Filtre veya espresso'da hangi grafiklerin görüntülenmesi gerektiğini tanımlayın - ayarlardan düzenlenebilir", + "Sorunları azaltmak için bluetooth komutlarının sıralı işlenmesi sağlandı", + "Bağlandığında bluetooth ölçeğinin ve mac adresinin görünen adı", + "", + "Demlemeler", + "Milisaniye desteği - Ayarlarda etkinleştirilebilir", + "Filtre sistemi genişletildi, kavurma türü ve kavurucu için arama yapılabilir", + "Demleme ekle / düzenle sayfasından bluetooth tartınızı veya basınç cihazınızı yeniden bağlayabilirsiniz", + "", + "Çekirdekler", + "Çekirdeğinizi paylaşın (ayrı bir sunucu gerektirmeden) - Mike desteğin için teşekkürler", + "Çekirdeğinizle yapılan tüm demlemeleri gösterin", + "Demlemede kullandığınız çekirdekleri derecelendirin - ayarlardan düzenlenebilir", + "", + "Daha fazla dil", + "Türkçe Desteği - Halil Portakal desteğin için teşekkürler", + "Çince Desteği - Jiageng desteğin için teşekkürler", + "", + "Değirmenler", + "Son kullanılan öğütme ayarının yanı sıra son kullanılan çekirdeğin görüntülenmesi", + "", + "Geliştirmeler", + "Henüz onaylanmamış bir çekirdek tarandığında hata iletisi (bu bağlantı, bir kısmı veya tamamı ingilizce olan içeriğe işaret edebilir)", + "Demleme tarihinin düzenlenmesi varsayılan olarak etkin değildir", + "", + "Diğer", + "Yazım hataları düzeltildi", + "Normal ayarlarda bile yıldız derecelendirmesini görmemenize neden olan bir hata düzeltildi", + "Eski demleme grafikleri artık tekrar dışa aktarılabilir", + "Ionic 6.3.0 güncellendi", + "Daha küçük hata düzeltmeleri" + ] } }, "CUSTOM_PARAMETERS": "Parametreyi özelleştir", @@ -1119,7 +1164,8 @@ "WRONG_LINK_DESCRIPTION": "Yanlış uygulama bağlantısı", "WRONG_LINK_TITLE": "Hata", "SERVER": { - "ERROR_OCCURED": "Bir hata oluştu, qr kodu okunamadı, lütfen tekrar deneyin." + "ERROR_OCCURED": "Bir hata oluştu, qr kodu okunamadı, lütfen tekrar deneyin.", + "BEAN_NOT_APPROVED": "Bean has not been approved yet, please try later again" }, "BEAN_SUCCESSFULLY_SCANNED": "Çekirdek başarıyla tarandı", "BEAN_SUCCESSFULLY_REFRESHED": "Çekirdek başarıyla güncellendi", @@ -1176,34 +1222,51 @@ "PAGE_SETTINGS_HIDE_ARCHIVED_BREWS_DASHBOARD_DESCRIPTION": "Arşivlenmiş demlemeler ana sayfada gösterilmeli mi?", "COPY": "Kopyala", "TOAST_PREPARATION_METHOD_REPEATED_SUCCESSFULLY": "Hazırlama yöntemi başarıyla kopyalandı", - "PREPARATION_TYPE_CAFEC_FLOWER": "Cafec Flower", - "PREPARATION_TYPE_DECEMBER_DRIPPER": "December Dripper", - "PREPARATION_TYPE_DECENT_ESPRESSO": "Decent Espresso", - "PREPARATION_TYPE_HARIO_SWITCH": "Hario Switch", - "PREPARATION_TYPE_HARIO_WOODNECK": "Hario Woodneck", - "PREPARATION_TYPE_RATIO_SIX_COFFEE_BREWER": "Ratio Six Coffee Brewer", - "PREPARATION_TYPE_ROK": "ROK", - "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo", - "PREPARATION_TYPE_TRICOLATE": "Tricolate", + "PREPARATION_TYPE_CAFEC_FLOWER": "Cafec Flower Demleyici", + "PREPARATION_TYPE_DECEMBER_DRIPPER": "December Demleyici", + "PREPARATION_TYPE_DECENT_ESPRESSO": "Decent Espresso Demleyici", + "PREPARATION_TYPE_HARIO_SWITCH": "Hario Switch Demleyici", + "PREPARATION_TYPE_HARIO_WOODNECK": "Hario Woodneck Demleyici", + "PREPARATION_TYPE_RATIO_SIX_COFFEE_BREWER": "Ratio Six Kahve Demleyici", + "PREPARATION_TYPE_ROK": "ROK Demleyici", + "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo Demleyici", + "PREPARATION_TYPE_TRICOLATE": "Tricolate Demleyici", "QR_CODE_REFRESH_DATA_MESSAGE": "Çekirdeğin tüm bilgilerinin üzerine yazılacak, şimdi başlasın mı?", - "POPOVER_QR_CODE_REFRESH": "Reload data", - "BREW_FLOW_WEIGHT_REALTIME": "Flow (Realtime)", - "SMART_SCALE_STOP_TIMER_ON_BREW": "Stop scale timer on new brew", - "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew", - "BREW_PRESSURE_FLOW": "Pressure", - "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_FILTER": "Show graphs for filter", - "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_ESPRESSO": "Show graphs for espresso", - "PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE": "Pressure device", - "PRESSURE_LOG": "Activate logfiles for pressure device", - "PRESSURE_THRESHOLD_ACTIVE": "Start timer with predefined pressure", - "PRESSURE_THRESHOLD_BAR": "Threshold pressure", + "POPOVER_QR_CODE_REFRESH": "Verileri yeniden yükle", + "BREW_FLOW_WEIGHT_REALTIME": "Akış (Gerçek Zamanlı)", + "SMART_SCALE_STOP_TIMER_ON_BREW": "Yeni demlemede tartı zamanlayıcısını durdur", + "SMART_SCALE_RESET_TIMER_ON_BREW": "Yeni demlemede tartı zamanlayıcısını sıfırla", + "BREW_PRESSURE_FLOW": "Basınç", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_FILTER": "Filtre için grafikleri göster", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_ESPRESSO": "Espresso için grafikleri göster", + "PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE": "Basınç cihazı", + "PRESSURE_LOG": "Basınç cihazı için günlük dosyalarını etkinleştirme", + "PRESSURE_THRESHOLD_ACTIVE": "Zamanlayıcıyı önceden tanımlanmış basınçla başlat", + "PRESSURE_THRESHOLD_BAR": "Eşik basıncı", "TIMER_MILLISECONDS": "MS", - "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS": "Milliseconds?", - "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Use milliseconds to even more accurately analyze your brews", - "PAGE_SETTINGS_BEAN_RATING": "Bean rating", - "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "Is the default '0 to 5' not the right rating for you? You can instead use a '0 to 100' scale", - "PAGE_SETTINGS_BEAN_RATING_STEPS": "Bean rating steps", - "COFFEE_GRAMS_BREWED": "Grams brewed", - "PRESSURE_INFORMATION_DESCRIPTION": "Actually just the DIY project 'Popsicle' supported", - "SMART_SCALE_MAXIMIZE_ON_START_TIMER": "Maximize realtime graphic on timer start" + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS": "Milisaniye?", + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Demlemelerinizi daha doğru analiz etmek için milisaniye kullanın", + "PAGE_SETTINGS_BEAN_RATING": "Çekirdek derecelendirme", + "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "Varsayılan 0 dan 5 e sizin için doğru derecelendirme değil mi? Bunun yerine '0 ila 100' ölçeğini kullanabilirsiniz", + "PAGE_SETTINGS_BEAN_RATING_STEPS": "Çekirdek derecelendirme adımları", + "COFFEE_GRAMS_BREWED": "Demlenen çekirdek miktarı", + "SMART_SCALE_MAXIMIZE_ON_START_TIMER": "Zamanlayıcı başlangıcında gerçek zamanlı grafiği en üst düzeye çıkarın", + "PRESSURE": { + "CONNECTION_NOT_ESTABLISHED": "Basınç cihazı bulunamadı veya bağlantı kurulamadı", + "CONNECTED_SUCCESSFULLY": "Basınç cihazı bağlı", + "DISCONNECTED_SUCCESSFULLY": "Basınç cihazı bağlantısı kesildi", + "DISCONNECTED_UNPLANNED": "Basınç cihazının bağlantısı beklenmeyen bir şekilde kesildi ", + "INFORMATION_DESCRIPTION": "Desteklenen cihazlar şunlardır: Popsicle", + "BLUETOOTH_SCAN_RUNNING": "Basınç cihazı 60 saniye aranacak, lütfen bekleyin", + "BLUETOOTH_NOT_ENABLED": "Bluetooth aktif değil, lütfen düzgün çalışması için etkinleştirin", + "REQUEST_PERMISSION": { + "LOCATION": "Basınç cihazlarını bulmak için uygulamanın konuma erişmesi gerekir.", + "BLUETOOTH": "Basınç cihazlarını bulmak için uygulamanın bluetooth'a erişmesi gerekir" + } + }, + "POPOVER_BLUETOOTH_ACTION_RECONNECT_SCALE": "Tartıyı yeniden bağla", + "POPOVER_BLUETOOTH_ACTION_RECONNECT_PRESSURE_DEVICE": "Basınç cihazını yeniden bağla", + "POPOVER_SHOW_BREWS": "Demlemeleri göster", + "LAST_USED_GRIND_SIZE_SETTING": "Son öğütüm ayarı", + "LAST_USED_BEAN": "Son çekirdek" } diff --git a/src/assets/i18n/zh.json b/src/assets/i18n/zh.json index e8ee8e05b..b7c084e8f 100644 --- a/src/assets/i18n/zh.json +++ b/src/assets/i18n/zh.json @@ -1,1208 +1,1270 @@ { - "NAV_MENU": "菜单", - "NAV_HOME": "主页", - "NAV_SETTINGS": "设置", - "NAV_BREWS": "冲泡", - "NAV_BEANS": "咖啡豆", - "NAV_PREPARATION": "冲泡方法", - "NAV_MILL": "磨豆机", - "NAV_ABOUT_US": "关于我们", - "NAV_CONTACT": "联系方式", - "NAV_PRIVACY": "隐私", - "NAV_CREDITS": "Credits", - "NAV_TERMS": "团队和贡献者", - "NAV_THANKS": "谢谢!", - "NAV_LICENCES": "开源许可证", - "NAV_STATISTICS": "数据统计", - "NAV_IMPRESSUM": "公司信息", - "NAV_COOKIE": "缓存文件", - "NAV_LOGS": "日志", - "NAV_BREW_PARAMS": "冲泡参数", - "NAV_INFORMATION_TO_APP": "关于软件", - "NAV_WATER_SECTION": "水质", - "NAV_HELPER": "计算", - "POPOVER_BREWS_OPTION_REPEAT": "复制", - "POPOVER_BREWS_OPTION_DETAIL": "详情", - "DETAIL": "详情", - "POPOVER_BREWS_OPTION_EDIT": "编辑", - "POPOVER_BREWS_OPTION_DELETE": "删除", - "POPOVER_BREWS_OPTION_PHOTO_GALLERY": "图库", - "POPOVER_BREWS_OPTION_CUPPING": "品尝", - "POPOVER_BREWS_OPTION_MAP_COORDINATES": "在地图上展示", - "POPOVER_BREWS_OPTION_FAST_REPEAT": "快速复制", - "PAGE_BREWS_NO_ENTRIES": "目前还没有添加冲泡方式", - "PAGE_BREWS_NO_ARCHIVED_ENTRIES": "目前还没有完成过一次冲泡", - "CANT_START_NEW_BREW_TITLE": "这儿少了点什么 ...", - "CANT_START_NEW_BREW_DESCRIPTION": "使用软件前,请至少添加一种咖啡豆、一种冲泡方式和一个研磨机。 你可以使用菜单跳转到不同的类别以添加上述信息。", - "PAGE_HOME_WELCOME_GREETINGS": "终于等到你来了!", - "PAGE_HOME_TOTAL_BREW": "冲泡", - "PAGE_HOME_TOTAL_BREWS": "冲泡次数", - "PAGE_HOME_BEAN_EXPLORED": "款咖啡豆", - "PAGE_HOME_BEANS_EXPLORED": "款咖啡豆", - "PAGE_HOME_LAST_BREWS": "冲泡记录", - "PAGE_HOME_LAST_BREW": "上一次冲泡", - "PAGE_HOME_DIFFERENT_PREPARATION_METHODS": "不同的冲泡方式", - "PAGE_HOME_DIFFERENT_MILLS": "不同的磨豆机", - "PAGE_HOME_SUPPORTER": "软件支持", - "PAGE_HOME_START_BREW": "开始冲泡", - "PAGE_BEANS_LIST_OBTAINABLE": "可用", - "PAGE_BEANS_LIST_YOU_GOT_NO_FRESH_BEANS": "咖啡豆没货啦,快买一点新的吧!", - "PAGE_BEANS_LIST_YOU_GOT_NO_FINISHED_BEANS": "目前还没有一包已经喝完的咖啡。", - "PAGE_MILL_LIST_NO_MILL_EXISTING": "你还没有添加任何一个磨豆机", - "PAGE_PREPARATION_LIST_NO_PREPARATION_EXISTING": "你还没有添加任何一个冲泡方式", - "PAGE_CONTACT_SUGGESTIONS_QUESTIONS_WISHES": "建议、问题或请求?", - "PAGE_THANKS_THANKS_FOR_YOUR_SUPPORT": "感谢你的支持", - "PAGE_SETTINGS_LANGUAGE": "语言偏好", - "PAGE_SETTINGS_LANGUAGE_GERMAN": "German", - "PAGE_SETTINGS_LANGUAGE_ENGLISH": "English", - "PAGE_SETTINGS_LANGUAGE_SPANISH": "Spanish", - "PAGE_SETTINGS_LANGUAGE_TURKISH": "土耳其", - "PAGE_SETTINGS_LANGUAGE_CHINESE": "中国人", - "PAGE_SETTINGS_GENERAL_SETTINGS": "常规设置", - "PAGE_SETTINGS_TRANSFER": "数据转移", - "PAGE_SETTINGS_PRESET_LAST_BREW": "使用预设值?", - "PAGE_SETTINGS_DISPLAY": "显示方式", - "PAGE_SETTINGS_DISPLAY_SINGLE_PAGE": "单页", - "PAGE_SETTINGS_DISPLAY_PAGING": "连续页面", - "PAGE_SETTINGS_STARTUP_VIEW": "起始页", - "PAGE_SETTINGS_ANALYTICS_INFORMATION": "分析", - "PAGE_SETTINGS_ANALYTICS_INFORMATION_TOOLTIP": "按 i 了解更多信息", - "PAGE_SETTINGS_TRACK_BREW_COORDINATES": "保存冲泡经纬度", - "PAGE_SETTINGS_FAST_REPEAT": "快速复制", - "PAGE_SETTINGS_TRACK_CAFFEINE_CONSUMPTION": "保存咖啡因信息", - "PAGE_SETTINGS_WAKE_LOCK": "冲泡时屏幕保持常亮", - "PAGE_SETTINGS_CURRENCY": "货币单位", - "PAGE_STATISTICS_DIFFERENT_PREPARATION_METHOD": "冲泡器具", - "PAGE_STATISTICS_TOTAL_GROUND_BEANS": "研磨的咖啡豆总计", - "PAGE_STATISTICS_MONEY_SPENT_FOR_COFFEE": "购买咖啡豆总费用", - "PAGE_STATISTICS_DRUNKEN_BREWS": "冲泡总数", - "PAGE_STATISTICS_BREW_PROCESSES": "总冲泡次数", - "PAGE_STATISTICS_DRUNKEN_QUANTITY": "咖啡豆消耗量", - "PAGE_STATISTICS_BEAN_WEIGHT_USED": "咖啡豆研磨总量", - "PAGE_BREW_TEXT_INFORMATION_FROM_ROASTER": "烘焙信息", - "PAGE_ABOUT_NO_VERSION_AVAILABLE": "没有可用的版本", - "PAGE_ABOUT_APP_VERSION": "软件版本", - "PAGE_LICENCES_WEBSITE": "网站", - "BEAN_DATA_ROAST_NAME": "烘焙程度", - "BEAN_DATA_CUSTOM_ROAST_NAME": "自定义烘焙温度", - "BEAN_DATA_ROASTING_DATE": "烘焙日期", - "BEAN_DATA_ROASTER": "烘焙者", - "BEAN_DATA_VARIETY": "品种", - "BEAN_DATA_PROCESSING": "处理法", - "BEAN_DATA_COUNTRY": "国家", - "BEAN_DATA_MIX": "单一产地/拼配", - "BEAN_DATA_AROMATICS": "风味味谱", - "BEAN_DATA_WEIGHT": "重量", - "BEAN_DATA_COST": "花销", - "BEAN_DATA_NAME": "咖啡豆名称", - "BEAN_DATA_REGION": "地区", - "BEAN_DATA_FARM": "庄园", - "BEAN_DATA_FARMER": "农场主", - "BEAN_DATA_ELEVATION": "海拔", - "BEAN_DATA_HARVEST_TIME": "收获日期", - "BEAN_DATA_PERCENTAGE": "百分比", - "BEAN_DATA_CERTIFICATION": "咖啡豆认证", - "BEAN_DATA_ROASTING_TYPE": "烘焙用于", - "BEAN_DATA_DECAFFEINATED": "无咖啡因", - "BEAN_DATA_URL": "网站", - "BEAN_DATA_EAN": "条形码", - "BEAN_DATA_PURCHASING_PRICE": "购买价格", - "BEAN_DATA_FOB_PRICE": "离岸价", - "BEAN_DATA_CUPPING_POINTS": "杯测分数", - "BREW_DATA_CUSTOM_BREW_TIME": "自定义冲泡时间", - "BREW_CREATION_DATE": "创建日期", - "REPEAT": "重复", - "EDIT": "编辑", - "DELETE": "删除", - "FINISHED": "归档", - "NOTES": "笔记", - "ADD_PHOTO": "添加照片", - "CANCEL": "取消", - "GENERATE": "生成", - "SAVE": "保存", - "ADD_SOMETHING": "添加", - "CONTACT": "联系", - "NAME": "名称", - "IMPORT": "导入", - "EXPORT": "导出", - "VIEW": "查看", - "ARCHIVE": "归档", - "CURRENT": "当前", - "BACK": "返回", - "CLOSE": "关闭", - "DAY": "日", - "BREW_DATA_TEMPERATURE_TIME": "温度时间", - "BREW_DATA_SURF_TIME": "冲泡时间", - "BREW_DATA_TIME": "时间", - "BREW_DATA_GRIND_SIZE": "研磨设置", - "BREW_DATA_GRIND_WEIGHT": "咖啡粉 (gr)", - "BREW_DATA_IN_OUT_BR": "入/出 (BR)", - "BREW_DATA_NOTES": "笔记", - "BREW_DATA_PREPARATION_METHOD": "冲泡器具", - "BREW_DATA_MILL": "磨豆机", - "BREW_DATA_MILL_SPEED": "研磨速度 (rpm)", - "BREW_DATA_MILL_TIMER": "研磨时间", - "BREW_DATA_BREW_QUANTITY": "水量", - "BREW_DATA_BEAN_TYPE": "咖啡豆类型", - "BREW_DATA_BREW_TEMPERATURE": "冲泡温度", - "BREW_DATA_PRESSURE_PROFILE": "冲泡参数", - "BREW_DATA_COFFEE_TYPE": "咖啡类型", - "BREW_DATA_COFFEE_CONCENTRATION": "咖啡浓度", - "BREW_DATA_COFFEE_FIRST_DRIP_TIME": "第一滴咖啡落下", - "BREW_DATA_COFFEE_BLOOMING_TIME": "闷蒸/预浸泡时间", - "BREW_DATA_ATTACHMENTS": "附件/照片", - "BREW_DATA_RATING": "评分", - "BREW_DATA_CALCULATED_COFFEE_BREW_TIME": "萃取时间", - "BREW_DATA_TDS": "总溶解固体", - "BREW_DATA_CALCULATED_EXTRACTION_YIELD": "萃取率 %", - "BREW_INFORMATION_BREW_RATIO": "冲泡率", - "BREW_INFORMATION_BEAN_AGE": "豆龄", - "BREW_INFORMATION_BREW_QUANTITY_TYPE_NAME": "计数类型", - "BREW_DATA_TDS_EY": "TDS / %EY", - "BREW_DATA_BREW_BEVERAGE_QUANTITY": "冲泡出的咖啡", - "BREW_DATA_PREPARATION_METHOD_TOOL": "冲泡器具", - "BREW_DATA_WATER": "水质", - "BREW_DATA_BEAN_WEIGHT_IN": "咖啡豆数量 (gr)", - "BREW_DATA_VESSEL": "Server", - "BREW_DATA_VESSEL_WEIGHT": "Server weight", - "BREW_DATA_VESSEL_NAME": "Server name", - "BREW_DATA_FLAVOR": "风味", - "BREW_DATA_FLOW_PROFILE": "Flow", - "ONE_DAY": "天", - "DAYS": "天", - "ONE_HOUR": "小时", - "HOURS": "小时", - "ONE_MINUTE": "分钟", - "MINUTES": "分钟", - "WITHOUT_COFFEE": "没冲咖啡", - "NOT_FOUND": "未找到", - "INVALID_FILE_FORMAT": "文件格式无效", - "FILE_NOT_FOUND_INFORMATION": "文件未找到", - "ERROR_ON_FILE_READING": "读取文件数据时出错", - "IMPORT_SUCCESSFULLY": "导入成功", - "IMPORT_UNSUCCESSFULLY_DATA_NOT_CHANGED": "导入不成功,没有数据被更改", - "INVALID_FILE_DATA": "无效的文件内容", - "DOWNLOADED": "下载", - "FILE_DOWNLOADED_SUCCESSFULLY": "文件 '{{fileName}}' 已成功下载到您的下载文件夹!", - "NO": "不", - "YES": "是", - "SURE_QUESTION": "确定吗?", - "DELETE_BREW_QUESTION": "删除本次冲泡?", - "DELETE_BEAN_QUESTION": "确定要删除这款咖啡豆吗? 所有相关的冲泡数据也将被删除!", - "DELETE_GREEN_BEAN_QUESTION": "确定要删除这款生豆吗? 所有相关的咖啡豆以及冲泡数据都将被删除!", - "DELETE_MILL_QUESTION": "确定要删除这个研磨机吗? 所有相关的冲泡数据也将被删除!", - "DELETE_PREPARATION_METHOD_QUESTION": "确定要删除这个器具吗? 所有相关的冲泡数据也将被删除!", - "DELETE_PREPARATION_TOOL_QUESTION": "确定要删除这个工具吗? 所有相关的冲泡数据也将被删除。", - "APP_COULD_NOT_STARTED_CORRECTLY_BECAUSE_MISSING_FILESYSTEM": "由于缺少文件系统,应用程序无法正确启动", - "CARE": "关心", - "ERROR_OCCURED": "出现错误", - "CSV_FILE_NOT_DOWNLOADED": "CSV 文件无法下载!", - "CSV_FILE_DOWNLOADED_SUCCESSFULLY": "CSV 文件 '{{fileName}}' 已成功下载到您的下载文件夹!", - "ADD_BREW": "添加冲泡", - "CHOOSE": "选择", - "CHOOSE_PHOTO_OR_LIBRARY": "拍摄照片或从相册选择", - "RECORD": "拍摄", - "PAGE_BEAN_INFORMATION": "咖啡豆信息", - "PAGE_BEAN_INFORMATION_GOOD_BREWS": "好的", - "PAGE_BEAN_INFORMATION_BAD_BREWS": "差的", - "PAGE_BEAN_INFORMATION_COUNT_BREWS": "总冲泡次数", - "INFORMATION": "信息", - "PAGE_BEAN_BREW_CHART_TITLE": "该款咖啡豆的冲泡概述", - "PAGE_BEAN_INFORMATION_AWESOME_BREWS": "令人惊叹", - "PAGE_BEAN_INFORMATION_NORMAL_BREWS": "感觉普通", - "PAGE_BEAN_INFORMATION_NOT_RATED_BREWS": "不做评价", - "PAGE_PREPARATION_INFORMATION_BREWS_DONE": "用这种器具冲泡", - "PAGE_PREPARATION_INFORMATION_BREWED_QUANTITY": "冲泡数量", - "PAGE_PREPARATION_INFORMATION_GRIND_WEIGHT": "消耗的豆子重量", - "PAGE_PREPARATION_INFORMATION_TIME_SPENT_BREWING": "总冲泡时间", - "PAGE_PREPARATION_INFORMATION": "器具信息", - "SECONDS": "秒", - "PAGE_MILL_INFORMATION": "磨豆机信息", - "PAGE_MILL_INFORMATION_BREWS_DONE": "使用这个磨豆机", - "PAGE_MILL_INFORMATION_GRIND_WEIGHT": "消耗的豆子重量", - "PAGE_HELPER_WATER_HARDNESS": "水的硬度", - "PAGE_HELPER_WATER_HARDNESS_CA_CONTENTS": "钙含量 mg/l", - "PAGE_HELPER_WATER_HARDNESS_MG_CONTENTS": "镁含量 mg/l", - "PAGE_HELPER_WATER_HARDNESS_GERMAN_HARDNESS": "°dH", - "PAGE_HELPER_WATER_HARDNESS_TOTAL_HARDNESS": "总硬度", - "PAGE_HELPER_BREW_RATIO": "粉液比", - "PAGE_HELPER_BREW_RATIO_GROUND_COFFEE": "咖啡粉重 (gr)", - "PAGE_HELPER_BREW_RATIO_WATER": "液体 (gr/ml)", - "PAGE_HELPER_BREW_RATIO_CALCULATED": "计算出的粉液比", - "PAGE_SETTINGS_SHOW_ARCHIVED_BREWS": "显示已经归档的冲泡", - "PAGE_SETTINGS_SHOW_ARCHIVED_BEANS": "显示已经归档的咖啡豆", - "PAGE_SETTINGS_SHOW_ARCHIVED_GREEN_BEANS": "显示已经归档的生豆", - "CUPPING_SCORE": "分数", - "CUPPING_SCORE_DRY_FRAGRANCE": "干香", - "CUPPING_SCORE_WET_AROMA": "湿香", - "CUPPING_SCORE_BRIGHTNESS": "明亮度", - "CUPPING_SCORE_FLAVOR": "风味", - "CUPPING_SCORE_BODY": "醇厚度", - "CUPPING_SCORE_FINISH": "尾韵", - "CUPPING_SCORE_SWEETNESS": "甜度", - "CUPPING_SCORE_CLEAN_CUP": "干净度", - "CUPPING_SCORE_COMPLEXITY": "复杂度", - "CUPPING_SCORE_UNIFORMITY": "一致性", - "CUPPING_SCORE_CUPPERS_CORRECTION": "杯测矫正", - "CUPPING_SCORE_DRY_FRAGRANCE_TOOLTIP": "指加入热水前,干磨咖啡的气味", - "CUPPING_SCORE_WET_AROMA_TOOLTIP": "指加入热水后,湿咖啡研磨的气味。", - "CUPPING_SCORE_BRIGHTNESS_TOOLTIP": "酸度是由一组绿原酸、柠檬酸、奎宁酸、乙酸等引起的咖啡中尖锐的高调味道,主要在口腔和舌头的前部感觉到。 (质量很好;与咖啡的苦味无关,也不会直接导致胃部不适)。 酸度受到许多杯测者的重视,并且直接关系到杯子的质量,因为酸度是高海拔种植的产物。", - "CUPPING_SCORE_FLAVOR_TOOLTIP": "这是口中的整体印象,包括所有其他评级。 有 4 种“主要味道”组(酸、甜、咸、苦)和许多“次要味道”。", - "CUPPING_SCORE_BODY_TOOLTIP": "通常被称为“口感”,主体是冲泡咖啡的重量和厚度感,由杯子中可溶性固体的百分比引起,包括提取的所有有机化合物(冲泡方法和使用的磨碎咖啡量会影响这一点 大大)。 我们对 Body 的评分较低,因为清淡的咖啡肯定不错,而且在某些原产地,较轻的酒体最适合整体杯子的特性。", - "CUPPING_SCORE_FINISH_TOOLTIP": "口腔清洁后的挥之不去的或新出现的味道。 这包括咖啡从嘴里流出到几分钟后的时间……这就是为什么你会发现很多杯测者在一两分钟后仍然体验到积极的味道时会修改回味分数的原因。", - "CUPPING_SCORE_SWEETNESS_TOOLTIP": "甜味几乎总是咖啡的理想品质,即使它被委婉地描述为“质朴的甜味”或“苦乐参半”。你可能会注意到精致的甜味(想想欧洲糕点、精美的糖果、白糖、 纯甜味)得分高,以及来自水果糖(果糖)的复杂甜味。 麦芽甜味(麦芽糖)不太传统,但非常令人向往,蜂蜜的范围从非常纯净干净到复杂、质朴的几乎是酵母味。 基本上,如果甜度是杯子的关键,它会被评为很好。", - "CUPPING_SCORE_CLEAN_CUP_TOOLTIP": "请注意,“干净的杯子”并不意味着咖啡上没有污垢。 它只是关于风味和“不干净”的原始、时髦的咖啡,而且风味也可能非常理想,例如来自苏门答腊的湿法去壳印度尼西亚咖啡,或干加工的埃塞俄比亚和也门类型。", - "CUPPING_SCORE_COMPLEXITY_TOOLTIP": "复杂性与“风味”和“完成”分数相得益彰,以传达多种风味的多样性或层次感。 这意味着在杯子里有很多发现。 再说一次,简单的咖啡可以在过度暴露于许多强大的、强烈的、复杂的咖啡后得到解脱。", - "CUPPING_SCORE_UNIFORMITY_TOOLTIP": "均匀度是指杯与杯之间的差异。 干法咖啡在本质上可能不如湿法咖啡均匀。 如果偶尔放弃的话,我们永远不会避免很多味道很好的东西。 这是在杯测方案中进行评分的,其中每个被审查的批次都制作了多个杯子。", - "CUPPING_SCORE_CUPPERS_CORRECTION_TOOLTIP": "这改编自 SCAA 系统和卓越杯评分(他们有时称其为“总分”)。 它允许杯测者确保总分正确传达杯子的整体印象。 你可能会批评这种方法,并认为它是“捏造”的。 在某种程度上,你是对的......但是改变类别分数以达到所需的总分(当你知道它是 7 时,给咖啡的酸度为 9)会更糟糕,或者相反,有一个 绝对值得 90 分的咖啡最终以 84 分结束。具体的 Cupper 校正数无关紧要,无论是 5 还是 8 ......这个想法是总分给出了咖啡质量的正确印象。", - "CUPPING_SCORE_TOOLTIP": "100-95 = 令人震惊,90-94 = 杰出,85-89 = 非常好,80-84 = 好,75-79 = 一般,70-74 = 差", - "DETAIL_BREW": "冲泡详情", - "DETAIL_BEAN": "咖啡豆详情", - "DETAIL_MILL": "研磨机详情", - "DETAIL_PREPARATION": "准备冲泡", - "EDIT_BREW": "编辑冲泡", - "ADD_BEAN": "添加咖啡豆", - "EDIT_BEAN": "编辑咖啡豆", - "ADD_PREPARATION": "添加冲泡器具", - "EDIT_PREPARATION": "编辑冲泡器具", - "ADD_MILL": "新增研磨机", - "EDIT_MILL": "编辑研磨机", - "USE_FILTER": "应用筛选", - "RESET_FILTER": "重置筛选", - "COFFEE_GRAMS_GRINDED": "研磨咖啡豆总克数", - "BEANS_USED": "研磨咖啡豆种类", - "BREW_HEADER_BEFORE_BREW": "冲泡前", - "BREW_HEADER_WHILE_BREW": "冲泡时", - "BREW_HEADER_AFTER_BREW": "冲泡后", - "BREW_HEADER_CUPPING": "品尝", - "BEANS_CONSUMED": "归档", - "NAV_MANAGE_PARAMETERS": "管理参数", - "NAV_SORT_PARAMETERS": "参数排序", - "NAV_DEFAULT_PARAMETERS": "定义默认参数", - "PAGE_SORT_PARAMETERS_DESCRIPTION": "拖放参数以定义它们将显示的顺序", - "PAGE_MANAGE_PARAMETERS_DESCRIPTION": "编辑冲泡信息时要显示的数据", - "PAGE_DEFAULT_PARAMETERS_DESCRIPTION": "标记哪些参数应默认为最后使用的值", - "SORT_PARAMETERS_BEFORE": "冲泡前", - "SORT_PARAMETERS_MEANWHILE": "冲泡时", - "SORT_PARAMETERS_AFTER": "冲泡后", - "MORE_INFORMATION": "更多信息", - "UNDERSTOOD": "了解", - "WELCOME_PAGE_ACTIVATE_ANALYTICS_TITLE": "分析和跟踪", - "WELCOME_PAGE_ACTIVATE_ANALYTICS_DESCRIPTION": "我们希望不断改进应用程序、网站和我们未来为您提供的服务。 为此,我们需要跟踪您如何使用该应用程序及其功能的一些数据。 但我们承诺,我们永远不会追踪任何个人数据。 为了确保这些承诺,我们使用 Matomo,一个以数据安全和隐私为中心的开源服务,该服务托管在我们自己的服务器上 - 这确保只有我们拥有数据所有权。 我们的网站提供有关我们跟踪的参数的所有信息,此外,您可以查看 100% 开源的源代码。 如果你有任何问题,请随时与我们联系。", - "ANALYTICS_INFORMATION_TITLE": "分析和跟踪", - "ANALYTICS_INFORMATION_DESCRIPTION": "如您所知,您的数据和隐私的安全是我们的首要任务。

因此,我们已从 Google Analytics 切换到以数据安全和隐私为重点的开源服务 Matomo,该服务由托管 在我们自己的服务器上 - 这意味着我们拥有完整的数据所有权。

跟踪的参数没有改变,我们仍然承诺永远不会跟踪任何个人数据。
我们的网站提供了我们跟踪的参数的所有信息,此外您可以查看100%开源的源代码。

您有问题吗?

联系我们。", - "ACTIVATE": "分析", - "DO_NOT_ACTIVE": "停止分析", - "WELCOME_PAGE_BEAN_TITLE": "咖啡豆", - "WELCOME_PAGE_BEAN_DESCRIPTION": "用咖啡豆来冲泡咖啡有点复杂。 请添加您的第一种咖啡豆以开始使用!", - "WELCOME_PAGE_BEAN_ADD": "添加咖啡豆", - "SKIP": "跳过", - "WELCOME_PAGE_PREPARATION_TITLE": "冲泡器具", - "WELCOME_PAGE_PREPARATION_DESCRIPTION": "V60滤杯, 爱乐压, 手冲式 - 冲泡咖啡的方式有很多种。请添加至少一个冲泡器具", - "WELCOME_PAGE_PREPARATION_ADD": "添加冲泡器具", - "WELCOME_PAGE_MILL_TITLE": "研磨机", - "WELCOME_PAGE_MILL_DESCRIPTION": "就快要完成了,但你需要一些东西来研磨咖啡豆!请添加至少一台研磨机", - "WELCOME_PAGE_MILL_ADD": "新增研磨机", - "WELCOME_PAGE_TITLE": "欢迎!", - "WELCOME_PAGE_BEAN_HEADLINE": "第一款咖啡豆", - "WELCOME_PAGE_PREPARATION_HEADLINE": "添加冲泡器具", - "WELCOME_PAGE_MILL_HEADLINE": "第一个研磨机", - "WELCOME_PAGE_LETS_START_HEADLINE": "现在我们开始吧!", - "WELCOME_PAGE_LETS_START_TITLE": "现在我们开始吧!", - "WELCOME_PAGE_LETS_START_DESCRIPTION": "恭喜,你已经准备好做你一生中最好的咖啡了。玩得开心,传播对好咖啡的热爱!", - "PREPARATION_TYPE": "制作类型", - "PREPARATION_TYPE_NAME": "名称", - "ARCHIVED": "归档", - "PAGE_SETTINGS_SHOW_ARCHIVED_PREPARATIONS": "显示归档的冲泡器具", - "PAGE_SETTINGS_SHOW_ARCHIVED_MILLS": "显示归档的冲泡研磨机", - "PAGE_MILL_LIST_NO_ARCHIVED_MILL_EXISTING": "你还没有归档任何一个研磨机", - "PAGE_PREPARATION_LIST_NO_ARCHIVED_PREPARATION_EXISTING": "你还没有归档任何一种器具", - "TOAST_BREW_ADDED_SUCCESSFULLY": "冲泡添加成功", - "TOAST_BREW_REPEATED_SUCCESSFULLY": "冲泡复制成功", - "TOAST_BEAN_ADDED_SUCCESSFULLY": "咖啡豆添加成功", - "TOAST_MILL_ADDED_SUCCESSFULLY": "新的研磨机已添加成功", - "TOAST_PREPARATION_ADDED_SUCCESSFULLY": "冲泡器具添加成功", - "TOAST_WATER_ADDED_SUCCESSFULLY": "水质添加成功", - "TOAST_BREW_DELETED_SUCCESSFULLY": "冲泡记录已被删除", - "TOAST_BEAN_DELETED_SUCCESSFULLY": "咖啡豆已被删除", - "TOAST_GREEN_BEAN_DELETED_SUCCESSFULLY": "生豆已被删除", - "TOAST_MILL_DELETED_SUCCESSFULLY": "研磨机已被删除", - "TOAST_WATER_DELETED_SUCCESSFULLY": "水质已被删除", - "TOAST_PREPARATION_DELETED_SUCCESSFULLY": "冲泡器具已被删除", - "TOAST_BREW_EDITED_SUCCESSFULLY": "冲泡记录已被编辑", - "TOAST_BEAN_EDITED_SUCCESSFULLY": "咖啡豆已被编辑", - "TOAST_MILL_EDITED_SUCCESSFULLY": "研磨机已被编辑", - "TOAST_PREPARATION_EDITED_SUCCESSFULLY": "器具已被编辑", - "TOAST_WATER_EDITED_SUCCESSFULLY": "水质已被编辑", - "TOAST_BEAN_ARCHIVED_SUCCESSFULLY": "咖啡豆已经归档", - "TOAST_MILL_ARCHIVED_SUCCESSFULLY": "研磨机已经归档", - "TOAST_PREPARATION_ARCHIVED_SUCCESSFULLY": "冲泡器具已经归档", - "TOAST_WATER_ARCHIVED_SUCCESSFULLY": "水质已被编辑", - "BEAN_WEIGHT_ALREADY_USED": "{{gramUsed}}g of {{gramTotal}}g", - "PREPARATION_TYPE_CUSTOM_PREPARATION": "自定义冲泡器具", - "PREPARATION_TYPE_AEROPRESS": "爱乐压", - "PREPARATION_TYPE_V60": "V60滤杯", - "PREPARATION_TYPE_CHEMEX": "Chemex", - "PREPARATION_TYPE_BIALETTI": "比乐蒂/摩卡壶", - "PREPARATION_TYPE_PORTAFILTER": "过滤手柄", - "PREPARATION_TYPE_KALITA_WAVE": "蛋糕杯", - "PREPARATION_TYPE_FRENCH_PRESS": "法压壶", - "PREPARATION_TYPE_SWANNECK": "Swanneck", - "PREPARATION_TYPE_DRIPPER": "聪明杯", - "PREPARATION_TYPE_DELTER_PRESS": "D特压(Delder Press)", - "PREPARATION_TYPE_COLD_BREW": "冷萃", - "PREPARATION_TYPE_AEROPRESS_INVERTED": "爱乐压倒压法", - "PREPARATION_TYPE_TURKISH": "极细研磨", - "PREPARATION_TYPE_BLUE_DRIPPER": "蓝瓶子滤杯", - "PREPARATION_TYPE_ADD_CUSTOM": "添加自定义器具", - "PREPARATION_TYPE_GINA": "Gina智能咖啡机", - "PREPARATION_TYPE_KONO": "KONO滤杯", - "PREPARATION_TYPE_ORIGAMI": "折纸滤杯", - "PREPARATION_TYPE_CAFELAT": "Cafelat拉杆咖啡机", - "PREPARATION_TYPE_OREA": "Orea滤杯", - "PREPARATION_TYPE_COLD_DRIP": "冰滴", - "PREPARATION_TYPE_HAND_LEVER": "手压式", - "PREPARATION_TYPE_FLAIR": "Flair手压意式咖啡机", - "PREPARATION_TYPE_APRIL_BREWER": "April Brewer滤杯", - "PREPARATION_TYPE_ESPRO_BLOOM": "Espro Bloom滤杯", - "PREPARATION_TYPE_FELLOW_STAGG": "Fellow Stagg温控咖啡壶", - "PREPARATION_TYPE_HSIAO_50": "Hsiao 50滤杯", - "PREPARATION_TYPE_KARLSBADER_KANNE": "Karlsbader", - "PREPARATION_TYPE_MOCCA_MASTER": "Mocca Master滴漏式咖啡机", - "PREPARATION_TYPE_SIPHON": "虹吸式", - "CHOOSE_BEANS": "选择咖啡豆", - "CHOOSE_BEAN": "选择咖啡豆", - "CHOOSE_WATERS": "选择水质", - "CHOOSE_WATER": "选择水质", - "CHOOSE_PREPARATIONS": "选择冲泡器具", - "CHOOSE_PREPARATION": "选择冲泡器具", - "CHOOSE_MILLS": "选择研磨机", - "CHOOSE_MILL": "选择研磨机", - "BEAN": { - "PLACE_HOLDER": { - "BEAN_DATA_NAME": "添加咖啡豆的名称", - "BEAN_DATA_ROAST_NAME": "添加烘焙温度", - "BEAN_DATA_ROASTING_DATE": "请输入咖啡豆的烘焙日期", - "BEAN_DATA_ROASTER": "请输入烘焙者的名称", - "BEAN_DATA_VARIETY": "添加咖啡品种", - "BEAN_DATA_PROCESSING": "请输入咖啡豆的处理方法,如:水洗", - "BEAN_DATA_COUNTRY": "它起源于哪儿?", - "BEAN_DATA_MIX": "什么是混合比例?", - "BEAN_DATA_AROMATICS": "描述它的风味吧", - "BEAN_DATA_WEIGHT": "咖啡豆的总重量", - "BEAN_DATA_COST": "购入这款咖啡豆花费了多少钱?", - "BEAN_DATA_REGION": "添加它的产区", - "BEAN_DATA_FARM": "添加它的庄园/农场", - "BEAN_DATA_FARMER": "添加它的种植者名称", - "BEAN_DATA_ELEVATION": "请输入咖啡豆的生长海拔", - "BEAN_DATA_HARVEST_TIME": "请输入咖啡豆的收获日期", - "BEAN_DATA_BUY_DATE": "请输入咖啡豆的购买日期", - "BEAN_DATA_PERCENTAGE": "添加该款咖啡豆在此包装中的占比(主要用于拼配包装填写)", - "BEAN_DATA_CERTIFICATION": "添加豆类认证 (例如:fair trade, bio)", - "BEAN_DATA_ROASTING_TYPE": "添加烘焙类型", - "BEAN_DATA_DECAFFEINATED": "这款咖啡不含咖啡因", - "BEAN_DATA_URL": "添加网站链接", - "BEAN_DATA_EAN": "添加条形码", - "BEAN_DATA_CUPPING_POINTS": "添加它的杯测分数", - "BEAN_DATA_PURCHASING_PRICE": "添加购买价格", - "BEAN_DATA_FOB_PRICE": "添加离岸价格", - "NOTES": "为咖啡豆添加注释", - "CHOOSE_DATA_ROASTER": "添加烘焙机", - "CHOOSE_DATA_ROASTING_TYPE": "选择烘焙类型" - } - }, - "PREPARATION": { - "PLACE_HOLDER": { - "PREPARATION_TYPE_NAME": "添加名称", - "NOTES": "为冲泡器具添加注释" - } - }, - "MILL": { - "PLACE_HOLDER": { - "NAME": "添加名称", - "NOTES": "为研磨机添加注释" - } - }, - "BREW": { - "PLACE_HOLDER": { - "BREW_DATA_GRIND_SIZE": "输入研磨设置,如:5", - "BREW_DATA_GRIND_WEIGHT": "输入此次冲泡咖啡的咖啡粉克数 (gr)", - "BREW_DATA_BREW_TEMPERATURE": "输入冲泡温度", - "BREW_DATA_PREPARATION_METHOD": "选择冲泡器具", - "BREW_DATA_BEAN_TYPE": "选择咖啡豆", - "BREW_DATA_MILL": "选择一个研磨机", - "BREW_DATA_MILL_SPEED": "输入研磨机的研磨速度", - "BREW_DATA_MILL_TIMER": "输入研磨所花费的时间", - "BREW_DATA_PRESSURE_PROFILE": "压力/流量曲线,冲泡建议等", - "BREW_DATA_TEMPERATURE_TIME": "请输入加热器具的时间", - "BREW_DATA_COFFEE_BLOOMING_TIME": "请输入闷蒸/预浸泡所花费的时间", - "BREW_DATA_COFFEE_FIRST_DRIP_TIME": "咖啡的第一滴水是什么时候出现的?", - "BREW_DATA_BREW_QUANTITY": "冲泡时用了多少水?", - "BREW_DATA_COFFEE_TYPE": "输入咖啡类型 (e.g. ristretto)", - "BREW_DATA_COFFEE_CONCENTRATION": "输入咖啡浓度", - "BREW_DATA_TDS": "总共溶解了多少固体?", - "BREW_DATA_NOTES": "为这次冲泡添加注释", - "BREW_DATA_BREW_BEVERAGE_QUANTITY": "冲泡完成以后,得到了多少的咖啡液?", - "BREW_DATA_PREPARATION_METHOD_TOOL": "请选择你的冲泡器具", - "BREW_DATA_WATER": "选择此次使用的水质", - "BREW_DATA_BEAN_WEIGHT_IN": "你使用了多少咖啡豆?(gr)" - } - }, - "ROASTED_BEFORE": "烘焙在", - "DAY_OLD": "天前", - "DAYS_OLD": "天前", - "BEANS_AMOUNT_USED": "已使用", - "CUPPING_BREW": "品尝", - "COFFEE_DRUNKEN_QUANTITY": "咖啡液", - "IMAGE_DELETED": "图片已删除", - "IMAGE_NOT_DELETED": "图片无法删除", - "EXTERNAL_STORAGE_NOT_SUPPORTED": "抱歉,不支持外部故事", - "BEANS_ARCHIVED": "已归档", - "TAB_ARCHIVE": "归档", - "TODAY": "今日", - "PLEASE_WAIT": "请稍等...", - "PREPARATION_STYLE_POUR_OVER": "手冲咖啡", - "PREPARATION_STYLE_ESPRESSO": "意式浓缩", - "PREPARATION_STYLE_FULL_IMMERSION": "全浸泡", - "PREPARATION_STYLE_PERCOLATION": "渗滤式", - "PREPARATION_TYPE_STYLE": "冲泡方式", - "PAGE_SETTINGS_FAST_REPEAT_DESCRIPTION": "开启一个新的菜单条目 - 使用它您可以直接复制冲泡。", - "PAGE_SETTINGS_TRACK_BREW_COORDINATES_DESCRIPTION": "保存每次冲泡时的经纬度", - "PAGE_SETTINGS_TRACK_CAFFEINE_CONSUMPTION_DESCRIPTION": "节省消耗的咖啡因量", - "UPDATE_TITLE": "有什么新玩意儿?", - "NEXT": "下一个", - "UPDATE_TEXT_TITLE_TITLE": { - "5.0.0": { - "TITLE": "版本 5.0: 新玩意儿!", - "DESCRIPTION": [ - "新布局,新图标,新颜色,新标志", - "新的冲泡器具", - "现在可以对冲泡进行分类(渗透、浓缩咖啡、全浸)", - "冲泡工作现在可以继承工具(例如不同的过滤器)", - "现在可以自定义冲泡参数,为每个冲泡定义自己的冲泡流程", - "添加了更多可编辑的咖啡豆信息,现在可以添加不同的排序", - "水量可渗透/全浸", - "你在哪里冲泡最好的咖啡? 主动设置经纬度保存", - "启用快速复制以立即添加冲泡", - "添加了更新屏幕以显示最新更改", - "在25次使用后向用户请求评分", - "为豆类添加了排序", - "添加了冲泡、咖啡豆的搜索面板", - "冲泡详细信息中添加了杯测图", - "在主页上显示剩余的豆子重量", - "为烘焙机添加了预输入", - "评级改为星级而不是图标" - ] - }, - "5.1.0": { - "TITLE": "版本 5.1: 新玩意儿!", - "DESCRIPTION": [ - "新的冲泡时间选择器", - "现在可以在 iOS 上再次选择烘焙日期", - "可以在 iPad 上再次选择图像", - "TDS 计算现在再次显示在饮料量上", - "为 iOS 设备添加了安全区域" - ] - }, - "5.2.0": { - "TITLE": "版本 5.2: 新玩意儿!", - "DESCRIPTION": [ - "冲泡:", - "冲泡计时器将在后台继续计时", - "可以将冲泡设为喜爱", - "添加和编辑咖啡豆的界面现在看起来几乎完全相同了", - "屏幕在冲泡期间可以保持亮屏(可以在设置菜单中启用)", - "最近的冲泡列表现在还能显示归档的冲泡", - "", - "咖啡豆:", - "咖啡豆照片显示在概览中", - "咖啡豆可以评级", - "", - "互动:", - "长按卡片会进入编辑视图", - "可以通过点击卡片访问详细视图", - "Github / Facebook / Instagram 帐户已关联", - "", - "修复:", - "咖啡豆信息复制不正确", - "新用户默认启用冲泡量", - "", - "其它:", - "Apple Healthkit 集成(可在设置菜单中启用)", - "清理", - "布局更改", - "统计扩展", - "启动检查已修改", - "支持冲泡和咖啡豆的不同卡片大小" - ] - }, - "5.3.1": { - "TITLE": "Version 5.3: Thats new!", - "DESCRIPTION": [ - "Brew methods:", - "Changes to the card view", - "Custom images can be attached in the edit screen", - "Brew tools will be saved in edit screen, even when '+' is not pressed", - "", - "Grinders:", - "Custom images can be attached in the edit screen", - "", - "Brews:", - "Parameter 'Attachments' renamed in 'Attachments / Photos'", - "", - "Dashboard:", - "If bean amount is less then 1000g, the number will be written as a whole", - "", - "Bug fixes:", - "Editing via a long-press, does not change information any more", - "Information on the dashboard are updated after made changes", - "Multiple variety information with blends can be saved again", - "Added startup error message if app-data is missing" - ] - }, - "5.4.0": { - "TITLE": "Version 5.4: Thats new!", - "DESCRIPTION": [ - "烘焙选项:", - "Manage all of your green beans and roasters (can be activated in the settings menu)", - "Save all of your green beans and transfer them into roasted onces", - "Add your roaster and connect them with your different kind of roasted beans", - "", - "Website:", - "Go live of our new website! -> https://beanconqueror.com", - "", - "Support us:", - "You've always wanted to support Beanconqueror? We've added a new 'Buy me a coffee' connection", - "", - "iOS - iCloud:", - "The first step into iCloud support was made. At the very first start all of your existing app data will be moved into the support iCloud directory.", - "You have to activate this option in the iCloud Settings first in order to save Beanconqueror on iCloud", - "", - "Android/iOS - Automated file-export:", - "Automated Beanconqueror.json-File is saved for a maximum of 7 days, after that they will be automated deleted again", - "Android: Download/Beanconqueror_export/Beanconqueror_automatic_export_DAY.json", - "iOS: Files/Download/Beanconqueror_export/Beanconqueror_automatic_export_FILE.json", - "", - "Settings:", - "Excel - Export all of your data to excel to work with it even further", - "Define your own image quality between 50% to 100% (default 100%)", - "Brew rating - Define how much stars/points you'd like to set for each brew. Minimum 5, maximum 100", - "", - "New tracking:", - "We've changed to our open source service Matomo, which will be hosted on our own server", - "Removed Google Analytics / Firebase", - "", - "Bug fixes:", - "Apple Healthkit - Settings were not saved", - "Sometimes brew rating stars weren't filled (Brew add/edit)", - "Edit via long tap, screen wasn't scrollable", - "Import of bigger files on iOS led to misconduct", - "Delete procedure of beans / preparations or mills were not consistent and lead to graphical issues", - "Wrong calculation of beverage quantity in statistics and list views", - "", - "分享:", - "与所有咖啡爱好者分享您的咖啡和咖啡豆!", - "", - "Other:", - "Clean ups", - "Layout changes", - "Extension of statistics", - "Startup check revised, added please wait window", - "Some label changes", - "Changed data access / order inside app to reduce problems" - ] - }, - "6.0.0": { - "TITLE": "Version 6.0: Thats new!", - "DESCRIPTION": [ - "蓝牙电子秤", - "Support of the first bluetooth scale - Decent-Scale - Big thanks to Decent Espresso", - "Support of Acaia Lunar", - "", - "Aroma cupping", - "Cup each brew with the different aromatics and flavors", - "", - "Water section", - "Add your own water, activate this section in the settings", - "", - "Support of more languages", - "Support for spanish - Big thanks to Frank!", - "", - "Improvements", - "Support of long press '+' on brews", - "Added new brew parameters", - "Support of different currencies", - "Edit brew while in detail view", - "Choose multiple images at once", - "Support of brix to TDS conversion", - "If bean package is empty, you'll be asked if you want to archive the package on the last brew", - "Reset of roastdate supported", - "Support of detail views on beans, grinders and preparation methods", - "Added brew ratio (g/l)", - "", - "iOS", - "Support of safe areas", - "", - "Bug fixes", - "Apple Healthkit - Decaffeinated coffee was saved", - "Copy of beans led to misconduct", - "Added brew time to excel export", - "Small bug fixes", - "", - "Others", - "Beans, grinders and preparation methods are now sorted alphabetic in dropdowns" - ] - }, - "6.1.0": { - "TITLE": "版本 6.1: 这些是新东西!", - "DESCRIPTION": [ - "二维码", - "扫描你的咖啡包装! 所有咖啡信息都将从烘焙店中插入。", - "", - "蓝牙电子秤", - "支持 Acaia Pearl 2021 - 感谢 Micah 和 Mike", - "支持 Acaia Lunar 2021 - 感谢 Micah 和 Mike", - "支持 Acaia Pyxis - 感谢 Micah 和 Mike", - "支持Hiroia Jimmy - 感谢 Silas", - "支持 Felicita Arc - 感谢 Herman", - "注意:目前不支持 Acaia Pearl 2021 以下的电子秤", - "咖啡豆页面现在可以使用蓝牙电子秤获得的重量信息", - "现在无需通过计时器开始冲泡即可看到重量变化", - "", - "冲泡概述", - "自定义概览中的可见冲煮参数或针对每种冲泡方法", - "准备图像现在在列表视图中可见", - "", - "冲泡视图", - "重制了冲泡视图,相比以往更加平滑", - "冲泡视图现在可以最大化", - "冲泡视图现在可以在冲泡细节视图中放大以及导出", - "现在显示平均流量", - "", - "咖啡豆", - "添加字段:购买日期、离岸价格、采购价格", - "现在可以收藏和筛选咖啡豆", - "如果咖啡豆被归档,您现在也可以对它进行评分", - "按+,您现在可以选择添加或扫描新的咖啡豆包装", - "长按+,直接添加新的咖啡豆", - "", - "预处理方法", - "预处理方法现在可以重复所有设置", - "支持更多的预处理方法 - 感谢 Nicola", - "选择一个预处理方法并展示图片", - "", - "设置", - "评级现在可以阶梯式进行(1、0.75、0.5、0.25、0.1)", - "蓝牙电子秤 - 定义在开始新的冲泡或启动计时器时是否应将秤设置为零重量", - "蓝牙电子秤 - 定义是否要忽略异常或负值 - 如果是,则无法生成实时图表", - "现在选择, 如果您想在主页上查看存档的咖啡豆", - "导出现在还导出保存的蓝牙值的原始数据", - "", - "改进", - "删除冲泡方法和工具时,不会再删除与其相关的咖啡豆", - "制备方法工具现在可以编辑和存档", - "", - "Bug修复:", - "发现更多可能导致数据丢失的问题", - "小错误修复", - "", - "其它:", - "更新到 Ionic-Framework 6,因此发生了一些小的视觉变化" - ] - }, - "6.1.3": { - "TITLE": "版本 6.1.3: 这些是新东西!", - "DESCRIPTION": [ - "Android - 注意", - "首先:对不起!", - "遗憾的是,数据库在 Android Play 商店中从 APK 格式重置为 AAB 格式,您的应用程序可能会在没有数据的情况下启动。", - "我无法调试或控制这种情况,虽然开发工作都按预期进行。", - "如果您的应用显示空白,请进入设置并导入下面的文件 'Download/Beanconqueror_export/Beanconqueror_automatic_export_*.json' * 代表最新的数据备份。", - "然后所有数据都应该恢复正常,如果没有,请给我写一封电子邮件:info@beanconqueror.com。" - ] - }, - "6.1.5": { - "TITLE": "Version 6.1.5: Das ist neu", - "DESCRIPTION": [ - "QR Codes", - "Lade die QR-Code Daten der Rösterei nun erneut", - "", - "Brühgraph", - "Wasserfluss wird nun in Echtzeit berechnet", - "", - "Bohnen", - "Suchfeld bei der Auswahl der Bohnen", - "", - "Fehlerbehebungen:", - "Nach Aufnahme eines Bildes war der Ladebalken nicht verschwunden", - "Kleinere Fehlerbehebungen" - ] - } - }, - "CUSTOM_PARAMETERS": "自定义参数", - "CUSTOM_DEFAULT_PARAMETERS": "默认", - "CUSTOM_MANAGE_PARAMETERS": "管理", - "CUSTOM_SORT_PARAMETERS": "种类", - "BREW_PARAMETER_CUSTOMIZE_TITLE": "自定义每种冲泡器具的参数", - "BREW_PARAMETER_CUSTOMIZE_DESCRIPTION": "您想为每种冲泡器具选择自定义参数吗?跳转到“器具”,打开具体冲泡器具的选项,选择“自定义参数”。现在您可以选择将用于此准备的参数!", - "BREW_DATA_BREW_QUANTITY_TOOLTIP": "不能用于意式浓缩咖啡的水量", - "BREW_DATA_COFFEE_FIRST_DRIP_TIME_TOOLTIP": "第一个可用于意式浓缩咖啡的滴漏咖啡o", - "BREW_DATA_PREPARATION_METHOD_TOOLTIP": "冲泡活动时可自定义", - "PAGE_SETTINGS_GENERAL": "常规设置", - "EDIT_PREPARATION_CUSTOM_PARAMETERS": "自定义参数", - "ENABLE_PREPARATION_CUSTOM_PARAMETERS": "使用个人参数", - "BEAN_ADD_ANOTHER_SORT": "添加另一种类", - "BEAN_SORT": "种类", - "BEAN_SORT_INFORMATION": "变化信息", - "BEAN_SORT_MORE_INFORMATION": "更多信息", - "NAVIGATE_TO_PREPARATION_METHODS": "跳转到冲泡页面", - "PREPARATION_TOOLS": "冲泡器具", - "PREPARATION_TOOLS_INFORMATION": "为您的过滤器添加不同的容器. 对于 V60 滤杯 或 123 添加例如 布、纸或网状过滤器", - "PREPARATION_TOOLS_PLACEHOLDER": "纸或布过滤器、VST-20g、14g-Basket等。", - "PREPARATION_PARAMETERS_CUSTOMIZED": "参数自定义", - "BEANS_WEIGHT_AVAILABLE": "可用的咖啡豆", - "SORT_ORDER": "改变顺序", - "ASCENDING": "升序", - "DESCENDING": "倒序", - "SORT_AFTER": "排序", - "BEAN_SORT_NAME_OF_BEAN": "咖啡豆名称", - "BEAN_SORT_ROASTER": "烘焙机", - "BEAN_SORT_ROASTING_DATE": "烘焙日期", - "BEAN_TAB_ROAST_INFORMATION": "烘焙信息", - "BEAN_TAB_GENERAL_INFORMATION": "常规", - "BEAN_TAB_SORT_INFORMATION": "品种信息", - "PAGE_SETTINGS_MANAGE_ARCHIVE": "管理归档", - "LAST_USE": "上一次使用在", - "SEARCH": "搜索", - "OVERVIEW": "概览", - "BEAN_HEADER_ADDITIONALE_INFORMATION": "附加信息", - "THREE_DEE_TOUCH_ACTION_BREW": "冲泡", - "THREE_DEE_TOUCH_ACTION_BEAN": "咖啡豆", - "THREE_DEE_TOUCH_ACTION_PREPARATION": "冲泡器具", - "THREE_DEE_TOUCH_ACTION_MILL": "研磨机", - "PAGE_CREDITS_NOT_EXISTING": "无内容", - "TIMER_HOUR": "小时", - "TIMER_MINUTES": "分钟", - "TIMER_SECONDS": "秒", - "EXCEL": { - "BEAN": { - "CREATION_DATE": "创建日期", - "ID": "咖啡豆编号" - }, - "PREPARATION": { - "CREATION_DATE": "创建日期", - "ID": "器具编号" - }, - "GRINDER": { - "CREATION_DATE": "创建日期", - "ID": "工厂编号" - } - }, - "EXCEL_EXPORT": "导出为Excel", - "HEALTH_KIT_QUESTION_TITLE": "节省咖啡因消耗", - "HEALTH_KIT_QUESTION_MESSAGE": "通过启用,每次冲泡中占用的咖啡因将自动保存在 Apple Health 中", - "NAV_ROASTING_SECTION": "烘焙", - "ROASTING_SECTION": { - "NAV_GREEN_BEANS": "生豆", - "NAV_ROASTING_MACHINE": "烘焙机", - "ROASTING_MACHINE": { - "TOTAL_ROAST_QUANTITY": "烘焙出的咖啡豆", - "TOTAL_ROAST_COUNT": "烘焙次数" - }, - "GREEN_BEAN": { - "ADD": "添加", - "EDIT": "编辑", - "DETAIL": "生豆详情", - "ROASTABLE": "待烘焙", - "NO_ROASTS_YET": "目前还没有烘焙" - }, - "BEAN": { - "DROP_TEMPERATURE": "烘焙的最终温度", - "ROAST_LENGTH": "烘焙时长", - "ROASTER_MACHINE": "烘焙机", - "GREEN_BEAN_WEIGHT": "生豆重量", - "OUTSIDE_TEMPERATURE": "气温", - "HUMIDITY": "湿度", - "FIRST_CRACK_MINUTE": "一爆分钟", - "FIRST_CRACK_TEMPERATURE": "一爆温度", - "SECOND_CRACK_MINUTE": "二爆分钟", - "SECOND_CRACK_TEMPERATURE": "二爆温度", - "PLACE_HOLDER": { - "DROP_TEMPERATURE": "烘焙的最终温度", - "ROAST_LENGTH": "烘焙时长", - "ROASTER_MACHINE": "烘焙机", - "GREEN_BEAN_WEIGHT": "生豆重量", - "OUTSIDE_TEMPERATURE": "气温", - "HUMIDITY": "湿度", - "FIRST_CRACK_MINUTE": "一爆分钟", - "FIRST_CRACK_TEMPERATURE": "一爆温度", - "SECOND_CRACK_TEMPERATURE": "二爆温度", - "SECOND_CRACK_MINUTE": "二爆分钟" - } - } - }, - "PAGE_SETTINGS_MANAGE_SECTIONS": "更多选项卡", - "PAGE_SETTINGS_SHOW_ROASTING_SECTION": "启用烘焙选项卡", - "PAGE_SETTINGS_SHOW_WATER_SECTION": "启用水质选项卡", - "PAGE_SETTINGS_SHOW_CUPPING_SECTION": "启用杯测选项", - "BEAN_DATA_BUY_DATE": "购买日期", - "BEAN_SORT_CREATION_DATE": "创建日期", - "BEAN_SORT_PURCHASE_DATE": "购买日期", - "BEAN_ROAST_COUNT": "烘焙度", - "TRANSFER_ROAST": "烘焙", - "BEAN_TAB_LINKED_ROASTS": "烘焙", - "BEAN_DATA_WEIGHT_AFTER_ROASTING": "烘焙后的重量", - "TOAST_GREEN_BEAN_ADDED_SUCCESSFULLY": "生豆已添加成功", - "TOAST_GREEN_BEAN_EDITED_SUCCESSFULLY": "生豆已编辑成功", - "TOAST_GREEN_BEAN_ARCHIVED_SUCCESSFULLY": "生豆已归档成功", - "TOAST_ROASTING_MACHINE_ADDED_SUCCESSFULLY": "烘焙机已添加成功", - "TOAST_ROASTING_MACHINE_EDITED_SUCCESSFULLY": "烘焙机已编辑成功", - "TOAST_ROASTING_MACHINE_ARCHIVED_SUCCESSFULLY": "烘焙机已归档成功", - "DELETE_ROASTING_MACHINE_QUESTION": "删除烘焙机?所有相关已经烘焙后的咖啡豆都将更新,不会被删除", - "TOAST_ROASTING_MACHINE_DELETED_SUCCESSFULLY": "烘焙机已删除成功", - "EDIT_ROASTING_MACHINE": "编辑", - "DETAIL_ROASTING_MACHINE": "烘焙详情", - "DELETE_WATER_QUESTION": "删除水质?所有相关已经烘焙后的咖啡豆都将更新,不会被删除", - "ROASTING_MACHINE": { - "PLACE_HOLDER": { - "NAME": "添加名称", - "NOTES": "为烘焙机添加注释" - } - }, - "NAV_ROASTING_MACHINE": "烘焙机", - "PAGE_ROASTING_MACHINE_LIST_NO_MACHINES_EXISTING": "您没有添加任何烘焙机", - "PAGE_ROASTING_MACHINE_LIST_NO_ARCHIVED_MACHINES_EXISTING": "您没有归档任何烘焙机", - "CHOOSE_ROASTING_MACHINES": "选择烘焙机", - "CHOOSE_ROASTING_MACHINE": "选择烘焙机", - "POPOVER_BREWS_OPTION_TOGGLE_FAVOURITE": "喜爱", - "TOAST_BREW_FAVOURITE_ADDED": "已添加为喜爱", - "TOAST_BREW_FAVOURITE_REMOVED": "已从喜爱中删除", - "BREW_FILTER_JUST_FAVOURITE": "喜爱", - "STATISTICS_PREPARATION_USAGES": "器具用途", - "STATISTICS_PREPARATION_TIMELINE_USAGES": "器具的使用历史", - "STATISTICS_GRINDER_TIMELINE_USAGES": "研磨机的使用历史", - "ACCEPT": "接受", - "STATISTIC_TAB_GENERAL": "常规", - "STATISTIC_TAB_BREWS": "冲泡", - "STATISTIC_TAB_BEANS": "咖啡豆", - "STATISTIC_TAB_PREPARATIONS": "冲泡器具", - "STATISTIC_TAB_GRINDERS": "研磨机", - "PAGE_STATISTICS_BREW_PER_DAYPROCESSES": "每天冲泡", - "PAGE_STATISTICS_BREW_TIME": "冲泡时间", - "PAGE_STATISTICS_PHOTOS_TAKEN": "拍摄的照片", - "PAGE_SETTINGS_IMAGE_QUALITY": "图像质量", - "PAGE_SETTINGS_IMAGE_QUALITY_TOOLTIP": "定义图像加载质量,这可以降低您的数据使用量。", - "PAGE_SETTINGS_BREW_RATING": "冲泡评分", - "PAGE_SETTINGS_BREW_RATING_TOOLTIP": "对冲泡进行-1到5分的评分太少了吗?你最高可以设置到100的评分区间", - "UPDATE_ENTRY_OF": "Update entry {{index}} of {{count}}", - "WEBSITE": "网站", - "SHARE": "分享", - "ANDROID_FILE_ACCESS_NEEDED_TITLE": "需要授权文件访问权限", - "ANDROID_FILE_ACCESS_NEEDED_DESCRIPTION": "为了让应用程序充分发挥作用,我们需要您授权文件访问。 否则应用程序内会有部分功能受限。 这是自动备份功能所需要的权限。", - "COULD_NOT_ACCESS_FILE": "我们无法访问所选文件", - "WRONG_FILE_FORMAT": "您选择了不受支持的文件格式", - "SCAN_BEAN": "扫描包", - "CLEAR": "清除", - "BEAN_LOOKS_LIKE_CONSUMED": "这包咖啡豆看起来已经完全消耗了,要将它归档吗?", - "CUPPING_1": "水果(Fruit)", - "CUPPING_2": "柑橘类(Citrus)", - "CUPPING_3": "柠檬和柠檬水(Lemo)", - "CUPPING_4": "酸橙(Lime)", - "CUPPING_5": "西柚(Grapefruit)", - "CUPPING_6": "小柑橘(Clementine)", - "CUPPING_7": "柑橘(Tangerine)", - "CUPPING_8": "砂糖橘(Mandarin orange)", - "CUPPING_9": "橙子(Orange)", - "CUPPING_10": "苹果/梨(Apple/pear)", - "CUPPING_11": "绿苹果(Green apple)", - "CUPPING_12": "红苹果(Red apple)", - "CUPPING_13": "瓜(Melon)", - "CUPPING_14": "西瓜(Watermelon)", - "CUPPING_15": "甜瓜(Honeydew)", - "CUPPING_16": "哈密瓜(Cantaloupe)", - "CUPPING_17": "葡萄(Grape)", - "CUPPING_18": "白葡萄(White grape)", - "CUPPING_19": "绿葡萄(Green grape)", - "CUPPING_20": "红葡萄(Red grape)", - "CUPPING_21": "康科德葡萄(Concord grape)", - "CUPPING_22": "热带水果(Tropical fruit)", - "CUPPING_23": "荔枝(Lychee)", - "CUPPING_24": "杨桃(Star fruit)", - "CUPPING_25": "酸角(Tamarind)", - "CUPPING_26": "百香果(Passion fruit)", - "CUPPING_27": "菠萝(Pineapple)", - "CUPPING_28": "芒果(Mango)", - "CUPPING_29": "木瓜(Papaya)", - "CUPPING_30": "猕猴桃(Kiwi)", - "CUPPING_31": "香蕉(Banana)", - "CUPPING_32": "椰子(Coconut)", - "CUPPING_33": "核果(Stone fruit)", - "CUPPING_34": "桃子(Peach)", - "CUPPING_35": "油桃(Nectarine)", - "CUPPING_36": "杏(Apricot)", - "CUPPING_37": "李子(Plum)", - "CUPPING_38": "樱桃(Cherry)", - "CUPPING_39": "黑樱桃(Black cherry)", - "CUPPING_40": "浆果类(Berry)", - "CUPPING_41": "蔓越莓(Cranberry)", - "CUPPING_42": "覆盆子(Raspberry)", - "CUPPING_43": "草莓(Strawberry)", - "CUPPING_44": "蓝莓(Blueberry)", - "CUPPING_45": "红加仑(Red currant)", - "CUPPING_46": "黑加仑(Black currant)", - "CUPPING_47": "干果类(Dried fruit)", - "CUPPING_48": "红葡萄干(Golden raisin)", - "CUPPING_49": "葡萄干(Raisin)", - "CUPPING_50": "无花果干(Dried fig)", - "CUPPING_51": "枣干(ried dates)", - "CUPPING_52": "梅干(Prune)", - "CUPPING_53": "甜味和烘培(Sweet & Roasting Notes)", - "CUPPING_54": "巧克力(Chocolate)", - "CUPPING_55": "可可碎(Cacao nibs)", - "CUPPING_56": "黑巧(Dark chocolate)", - "CUPPING_57": "贝克巧克力(Bakers chocolate)", - "CUPPING_58": "Bittersweet chocolate", - "CUPPING_59": "可可粉(Cocoa powder)", - "CUPPING_60": "牛奶巧克力(Milk chocolate)", - "CUPPING_61": "坚果类(Nut)", - "CUPPING_62": "核桃(Walnut)", - "CUPPING_63": "花生(Peanut)", - "CUPPING_64": "腰果(Cashew)", - "CUPPING_65": "山核桃(Pecan)", - "CUPPING_66": "榛子(Hazelnut)", - "CUPPING_67": "杏仁(Almond)", - "CUPPING_68": "谷物(Grain & Cereal)", - "CUPPING_69": "Sweet bread pastry", - "CUPPING_70": "格兰诺拉麦片(Granola)", - "CUPPING_71": "全麦饼干(Graham cracker)", - "CUPPING_72": "黑麦(Rye)", - "CUPPING_73": "小麦(Wheat)", - "CUPPING_74": "大麦(Barley)", - "CUPPING_75": "新鲜面包(Fresh bread)", - "CUPPING_76": "甜味和糖类(Sweet & Sugary)", - "CUPPING_77": "香草(Vanila)", - "CUPPING_78": "牛轧糖(Nougat)", - "CUPPING_79": "蜂蜜(Honey)", - "CUPPING_80": "黄油(Butter)", - "CUPPING_81": "奶油(Cream)", - "CUPPING_82": "棉花糖(Marshmallow)", - "CUPPING_83": "甘蔗(Sugarcane)", - "CUPPING_84": "红糖(Brown sugar)", - "CUPPING_85": "焦糖(Caramel)", - "CUPPING_86": "枫糖浆(Maple syrup)", - "CUPPING_87": "糖浆(Molasses)", - "CUPPING_88": "可乐(Cola)", - "CUPPING_89": "烘焙(Roast)", - "CUPPING_90": "吐司(Toast)", - "CUPPING_91": "焦糖(Burnt sugar)", - "CUPPING_92": "烟熏(Smokey)", - "CUPPING_93": "木炭(Carbon)", - "CUPPING_94": "植物、咸味食物和香料(Vegetal, Savory & Spices)", - "CUPPING_95": "香料(Spice)", - "CUPPING_96": "黑胡椒(Black pepper)", - "CUPPING_97": "白胡椒(White pepper)", - "CUPPING_98": "肉桂(Cinnamon)", - "CUPPING_99": "芫荽、香菜(Coriander)", - "CUPPING_100": "生姜(Ginger)", - "CUPPING_101": "肉豆蔻(Nutmeg)", - "CUPPING_102": "咖喱(Curry)", - "CUPPING_103": "甘草-茴香Licorice-anise", - "CUPPING_104": "丁香(Clove)", - "CUPPING_105": "咸味食物(Savory)", - "CUPPING_106": "Leathery", - "CUPPING_107": "Meat-like", - "CUPPING_108": "酱油(Soy sauce)", - "CUPPING_109": "番茄干(Sundried tomato)", - "CUPPING_110": "番茄(Tomato)", - "CUPPING_111": "植物泥土草药(Vegetal Earthy Herb)", - "CUPPING_112": "土壤(Soil)", - "CUPPING_113": "新鲜木材(Fresh wood)", - "CUPPING_114": "雪松(Cedar)", - "CUPPING_115": "烟草(Tobacco)", - "CUPPING_116": "干草/稻草(Hay / straw)", - "CUPPING_117": "绿叶蔬菜(Leafy greens)", - "CUPPING_118": "橄榄(Olive)", - "CUPPING_119": "青椒(Green pepper)", - "CUPPING_120": "南瓜(Squash)", - "CUPPING_121": "蘑菇(Mushroom)", - "CUPPING_122": "甜豌豆(Sweet pea)", - "CUPPING_123": "荷兰豆(Snow pea)", - "CUPPING_124": "草(Grassy)", - "CUPPING_125": "茴香(Dill)", - "CUPPING_126": "鼠尾草(Sage)", - "CUPPING_127": "薄荷(Mint)", - "CUPPING_128": "绿茶(Green tea)", - "CUPPING_129": "红茶(Black tea)", - "CUPPING_130": "啤酒花(Hops)", - "CUPPING_131": "佛手柑(Bergamot)", - "CUPPING_132": "花类(Flowery)", - "CUPPING_133": "花(Floral)", - "CUPPING_134": "木槿花(Hibiscus)", - "CUPPING_135": "蔷薇果(Rose hips)", - "CUPPING_136": "薰衣草(Lavender)", - "CUPPING_137": "木兰花(Magnolia)", - "CUPPING_138": "茉莉、金银花(Jasmine honeysuckle)", - "CUPPING_139": "橙花(Orange blossom)", - "CUPPING_140": "香茅(Lemongrass)", - "WATER_SECTION": { - "NAV_WATER": "水质", - "YOU_GOT_NO_ARCHIVED_WATER": "你还没有归档任何水质", - "YOU_GOT_NO_WATER": "你还没有添加任何水质", - "CATEGORY_INFORMATION": "水质信息", - "CATEGORY_GENERAL": "常规", - "WATER_BOTTLE_EXPLANATION": "水质通常以 ppm = mg/L 为单位表示浓度", - "USED_TIMES": "使用次数", - "AMOUNT": "使用量", - "WATER": { - "GENERAL_HARDNESS": "一般硬度 (GH)", - "TOTAL_ALKALINITY": "总碱度 (KH)", - "CALCIUM": "钙 (Ca)", - "MAGNESIUM": "镁 (Mg)", - "SODIUM": "钠 (Na)", - "TDS": "总溶解固体 (TDS)", - "UNITS": "单位", - "PLACE_HOLDER": { - "GENERAL_HARDNESS": "一般硬度", - "TOTAL_ALKALINITY": "总碱度", - "CALCIUM": "钙 (Ca)", - "MAGNESIUM": "镁 (Mg)", - "SODIUM": "钠 (Na)", - "TDS": "总溶解固体 (TDS)", - "NAME": "添加水的名称", - "NOTES": "为水质添加注释" - }, - "WATER_UNIT": { - "UNKNOWN": "不清楚", - "PPM": "以CaCO3计量ppm", - "MG_L": "mg/L", - "MMOL_L": "mmol/L", - "DH": "°dH" - } - } - }, - "BREW_BRIX_CALCULATION": "白利糖度", - "SET_TDS": "设置 tds", - "TOTAL_WEIGHT": "总重量", - "CALCULATED_WEIGHT": "计算重量", - "SET_WEIGHT": "设置重量", - "ADD_FLAVORS_AROMAS_TITLE": "香气/风味", - "CUSTOM_FLAVORS_AROMAS": "自定义香气", - "CUSTOM_FLAVORS_AROMAS_PLACEHOLDER": "以自己的语言描述它的香气", - "PREDEFINED_FLAVORS_AROMAS": "常见的香气", - "ADD_AROMA_FLAVOR": "添加香气/风味", - "BEAN_WEIGHT_IN_PLACEHOLDER": "从咖啡包装中取出的咖啡豆", - "VESSEL_PLACEHOLDER": "容器名和净重", - "GRIND_WEIGHT_PLACEHOLDER": "用于冲泡的咖啡粉的重量", - "PRESET_BREW_TITLE": "使用最后一次冲泡作为预设", - "CUPPING_BREW_TAB_AROMA": "香气", - "CUPPING_BREW_TAB_TASTING": "评分", - "WATER_PLACEHOLDER": "如需完整功能,请在设置菜单中激活水质部分", - "PAGE_SETTINGS_SCALES": "电子秤", - "CONNECT": "连接", - "DISCONNECT": "断开连接", - "SCALE": { - "BLUETOOTH_SCAN_RUNNING": "正在搜索附件的电子秤,请稍等60秒", - "BLUETOOTH_NOT_ENABLED": "未开启蓝牙,请开启蓝牙以进行搜索", - "CONNECTION_NOT_ESTABLISHED": "附近找不到电子秤或是无法建立连接", - "CONNECTED_SUCCESSFULLY": "电子秤已连接", - "DISCONNECTED_SUCCESSFULLY": "电子秤已断开连接", - "DISCONNECTED_UNPLANNED": "电子秤意外断开", - "REQUEST_PERMISSION": { - "LOCATION": "软件需要位置权限来搜索电子秤", - "BLUETOOTH": "软件需要蓝牙权限来搜索电子秤" - }, - "INFORMATION_DESCRIPTION": "支持的电子秤: Decent 电子秤, Acaia 电子秤, Felicita 电子秤以及 Hiroia Jimmy and Eureka Precisa. Care: If the Eureka Precisa recieves a negative value, the timer stops" - }, - "QR": { - "WRONG_QRCODE_DESCRIPTION": "错误的二维码或错误的内容", - "WRONG_QRCODE_TITLE": "错误", - "WRONG_LINK_DESCRIPTION": "错误的应用链接", - "WRONG_LINK_TITLE": "错误", - "SERVER": { - "ERROR_OCCURED": "出现错误,无法读取二维码,请重试。" - }, - "BEAN_SUCCESSFULLY_SCANNED": "咖啡豆扫描成功", - "IMAGES_GETTING_DOWNLOADED": "正在下载的图像" - }, - "RETRY_CONNECT": "重试连接", - "SMART_SCALE_STAY_CONNECTED_ON_APP_MINIMIZE": "即使应用程序被最小化/非活动状态,也让电子秤连接", - "BREW_FLOW_WEIGHT": "重量", - "BREW_FLOW_WEIGHT_PER_SECOND": "流速", - "ROAST_TYPE_UNKNOWN": "不清楚", - "ROAST_TYPE_CINNAMON_ROAST": "浅烘焙(Cimon Roast)", - "ROAST_TYPE_AMERICAN_ROAST": "美式烘焙(American Roast)", - "ROAST_TYPE_NEW_ENGLAND_ROAST": "新英格兰烘焙(New England Roast)", - "ROAST_TYPE_HALF_CITY_ROAST": "半城市烘焙(Half City Roast)", - "ROAST_TYPE_MODERATE_LIGHT_ROAST": "Moderate-Light Roast", - "ROAST_TYPE_CITY_ROAST": "中深度烘焙(City Roast)", - "ROAST_TYPE_CITY_PLUS_ROAST": "City+ Roast", - "ROAST_TYPE_FULL_CITY_ROAST": "微深度烘焙(Full City Roast)", - "ROAST_TYPE_FULL_CITY_PLUS_ROAST": "深度烘焙(Full City + Roast)", - "ROAST_TYPE_ITALIAN_ROAST": "极深度烘焙(Italian Roast)", - "ROAST_TYPE_VIEANNA_ROAST": "维也纳烘焙(Vienna Roast)", - "ROAST_TYPE_FRENCH_ROAST": "法式烘焙(French Roast)", - "ROAST_TYPE_CUSTOM_ROAST": "自定义", - "BEAN_MIX_UNKNOWN": "不清楚", - "BEAN_MIX_SINGLE_ORIGIN": "单一产地", - "BEAN_MIX_BLEND": "拼配", - "BEAN_ROASTING_TYPE_FILTER": "滴滤式/Filter", - "BEAN_ROASTING_TYPE_ESPRESSO": "意式浓缩/Espresso", - "BEAN_ROASTING_TYPE_OMNI": "均可/Omni", - "BEAN_ROASTING_TYPE_UNKNOWN": "不清楚", - "SMART_SCALE_LOG": "为智能电子秤激活日志文件(仅用于发送日志进行调试)", - "TOAST_PREPARATION_TOOL_EDITED_SUCCESSFULLY": "杯测工具编辑", - "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE": "蓝牙电子秤", - "PAGE_SETTINGS_TAB_GENERAL": "常规", - "SMART_SCALE_TARE_ON_BREW": "在开始新的冲泡时去皮", - "SMART_SCALE_TARE_ON_START_TIMER": "当定时器启动时去皮", - "PAGE_SETTINGS_BREW_RATING_STEPS": "评级步骤", - "BREW_AVG_FLOW_WEIGHT_PER_SECOND": "Ø 流速", - "CUSTOM_LIST_VIEW_PARAMETERS": "列表视图参数", - "NAV_LIST_VIEW_CUSTOM_PARAMETERS": "列表视图参数", - "PAGE_LIST_VIEW_CUSTOM_PARAMETERS_DESCRIPTION": "决定你的咖啡冲泡的哪个参数,应该显示在列表视图上", - "BREW_DATA_VESSEL_NAME_WEIGHT": "容器 名称/重量", - "IGNORE_NEGATIVE_VALUES": "忽略负重量值", - "IGNORE_ANOMALY_VALUES": "忽略异常值", - "IGNORE_ANOMALY_VALUES_TOOLTIP": "例如:在秤上旋转杯子", - "TOAST_BEAN_FAVOURITE_ADDED": "喜爱已添加", - "TOAST_BEAN_FAVOURITE_REMOVED": "喜爱已移除", - "QR_CODE_SCANNER_INFORMATION_TITLE": "二维码", - "QR_CODE_SCANNER_INFORMATION_DESCRIPTION": "所有扫描的咖啡豆信息都直接来自烘焙店。
如果您发现错误或误导性信息,请通过电子邮件通知我: info@beanconqueror.com.", - "DONT_SHOW_AGAIN": "不再显示", - "ARCHIVED_TOOLS": "归档工具", - "UNARCHIVE": "取消归档", - "PAGE_SETTINGS_HIDE_ARCHIVED_BREWS_DASHBOARD": "在仪表盘上显示已归档的冲泡", - "PAGE_SETTINGS_HIDE_ARCHIVED_BREWS_DASHBOARD_DESCRIPTION": "已归档的冲泡应该显示在主页上吗?", - "COPY": "复制", - "TOAST_PREPARATION_METHOD_REPEATED_SUCCESSFULLY": "杯测方法复制成功", - "PREPARATION_TYPE_CAFEC_FLOWER": "Cafec 花辦滤杯(Cafec Flower)", - "PREPARATION_TYPE_DECEMBER_DRIPPER": "December 可调咖啡滤杯(December Dripper)", - "PREPARATION_TYPE_DECENT_ESPRESSO": "Decent Espresso", - "PREPARATION_TYPE_HARIO_SWITCH": "Hario Switch 聪明杯", - "PREPARATION_TYPE_HARIO_WOODNECK": "Hario Woodneck 滤布", - "PREPARATION_TYPE_RATIO_SIX_COFFEE_BREWER": "Ratio Six Coffee Brewer", - "PREPARATION_TYPE_ROK": "ROK 手压咖啡机", - "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo", - "PREPARATION_TYPE_TRICOLATE": "Tricolate 聪明杯", - "QR_CODE_REFRESH_DATA_MESSAGE": "All information of the bean will be overwritten, start now?", - "POPOVER_QR_CODE_REFRESH": "Reload data", - "BREW_FLOW_WEIGHT_REALTIME": "Flow (Realtime)", - "SMART_SCALE_STOP_TIMER_ON_BREW": "Stop scale timer on new brew", - "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew", - "BREW_PRESSURE_FLOW": "Pressure", - "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_FILTER": "Show graphs for filter", - "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_ESPRESSO": "Show graphs for espresso", - "PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE": "Pressure device", - "PRESSURE_LOG": "Activate logfiles for pressure device", - "PRESSURE_THRESHOLD_ACTIVE": "Start timer with predefined pressure", - "PRESSURE_THRESHOLD_BAR": "Threshold pressure", - "TIMER_MILLISECONDS": "MS", - "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS": "Milliseconds?", - "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Use milliseconds to even more accurately analyze your brews", - "PAGE_SETTINGS_BEAN_RATING": "Bean rating", - "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "Is the default '0 to 5' not the right rating for you? You can instead use a '0 to 100' scale", - "PAGE_SETTINGS_BEAN_RATING_STEPS": "Bean rating steps", - "COFFEE_GRAMS_BREWED": "Grams brewed", - "PRESSURE_INFORMATION_DESCRIPTION": "Actually just the DIY project 'Popsicle' supported", - "SMART_SCALE_MAXIMIZE_ON_START_TIMER": "Maximize realtime graphic on timer start" + "NAV_MENU": "菜单", + "NAV_HOME": "主页", + "NAV_SETTINGS": "设置", + "NAV_BREWS": "冲泡", + "NAV_BEANS": "咖啡豆", + "NAV_PREPARATION": "冲泡方法", + "NAV_MILL": "磨豆机", + "NAV_ABOUT_US": "关于我们", + "NAV_CONTACT": "联系方式", + "NAV_PRIVACY": "隐私", + "NAV_CREDITS": "Credits", + "NAV_TERMS": "团队和贡献者", + "NAV_THANKS": "谢谢!", + "NAV_LICENCES": "开源许可证", + "NAV_STATISTICS": "数据统计", + "NAV_IMPRESSUM": "公司信息", + "NAV_COOKIE": "缓存文件", + "NAV_LOGS": "日志", + "NAV_BREW_PARAMS": "冲泡参数", + "NAV_INFORMATION_TO_APP": "关于软件", + "NAV_WATER_SECTION": "水质", + "NAV_HELPER": "计算", + "POPOVER_BREWS_OPTION_REPEAT": "复制", + "POPOVER_BREWS_OPTION_DETAIL": "详情", + "DETAIL": "详情", + "POPOVER_BREWS_OPTION_EDIT": "编辑", + "POPOVER_BREWS_OPTION_DELETE": "删除", + "POPOVER_BREWS_OPTION_PHOTO_GALLERY": "图库", + "POPOVER_BREWS_OPTION_CUPPING": "品尝", + "POPOVER_BREWS_OPTION_MAP_COORDINATES": "在地图上展示", + "POPOVER_BREWS_OPTION_FAST_REPEAT": "快速复制", + "PAGE_BREWS_NO_ENTRIES": "目前还没有添加冲泡方式", + "PAGE_BREWS_NO_ARCHIVED_ENTRIES": "目前还没有完成过一次冲泡", + "CANT_START_NEW_BREW_TITLE": "这儿少了点什么 ...", + "CANT_START_NEW_BREW_DESCRIPTION": "使用软件前,请至少添加一种咖啡豆、一种冲泡方式和一个研磨机。 你可以使用菜单跳转到不同的类别以添加上述信息。", + "PAGE_HOME_WELCOME_GREETINGS": "终于等到你来了!", + "PAGE_HOME_TOTAL_BREW": "冲泡", + "PAGE_HOME_TOTAL_BREWS": "冲泡次数", + "PAGE_HOME_BEAN_EXPLORED": "款咖啡豆", + "PAGE_HOME_BEANS_EXPLORED": "款咖啡豆", + "PAGE_HOME_LAST_BREWS": "冲泡记录", + "PAGE_HOME_LAST_BREW": "上一次冲泡", + "PAGE_HOME_DIFFERENT_PREPARATION_METHODS": "不同的冲泡方式", + "PAGE_HOME_DIFFERENT_MILLS": "不同的磨豆机", + "PAGE_HOME_SUPPORTER": "软件支持", + "PAGE_HOME_START_BREW": "开始冲泡", + "PAGE_BEANS_LIST_OBTAINABLE": "可用", + "PAGE_BEANS_LIST_YOU_GOT_NO_FRESH_BEANS": "咖啡豆没货啦,快买一点新的吧!", + "PAGE_BEANS_LIST_YOU_GOT_NO_FINISHED_BEANS": "目前还没有一包已经喝完的咖啡。", + "PAGE_MILL_LIST_NO_MILL_EXISTING": "你还没有添加任何一个磨豆机", + "PAGE_PREPARATION_LIST_NO_PREPARATION_EXISTING": "你还没有添加任何一个冲泡方式", + "PAGE_CONTACT_SUGGESTIONS_QUESTIONS_WISHES": "建议、问题或请求?", + "PAGE_THANKS_THANKS_FOR_YOUR_SUPPORT": "感谢你的支持", + "PAGE_SETTINGS_LANGUAGE": "语言偏好", + "PAGE_SETTINGS_LANGUAGE_GERMAN": "German", + "PAGE_SETTINGS_LANGUAGE_ENGLISH": "English", + "PAGE_SETTINGS_LANGUAGE_SPANISH": "Spanish", + "PAGE_SETTINGS_LANGUAGE_TURKISH": "土耳其", + "PAGE_SETTINGS_LANGUAGE_CHINESE": "中国人", + "PAGE_SETTINGS_GENERAL_SETTINGS": "常规设置", + "PAGE_SETTINGS_TRANSFER": "数据转移", + "PAGE_SETTINGS_PRESET_LAST_BREW": "使用预设值?", + "PAGE_SETTINGS_DISPLAY": "显示方式", + "PAGE_SETTINGS_DISPLAY_SINGLE_PAGE": "单页", + "PAGE_SETTINGS_DISPLAY_PAGING": "连续页面", + "PAGE_SETTINGS_STARTUP_VIEW": "起始页", + "PAGE_SETTINGS_ANALYTICS_INFORMATION": "分析", + "PAGE_SETTINGS_ANALYTICS_INFORMATION_TOOLTIP": "按 i 了解更多信息", + "PAGE_SETTINGS_TRACK_BREW_COORDINATES": "保存冲泡经纬度", + "PAGE_SETTINGS_FAST_REPEAT": "快速复制", + "PAGE_SETTINGS_TRACK_CAFFEINE_CONSUMPTION": "保存咖啡因信息", + "PAGE_SETTINGS_WAKE_LOCK": "冲泡时屏幕保持常亮", + "PAGE_SETTINGS_CURRENCY": "货币单位", + "PAGE_STATISTICS_DIFFERENT_PREPARATION_METHOD": "冲泡器具", + "PAGE_STATISTICS_TOTAL_GROUND_BEANS": "研磨的咖啡豆总计", + "PAGE_STATISTICS_MONEY_SPENT_FOR_COFFEE": "购买咖啡豆总费用", + "PAGE_STATISTICS_DRUNKEN_BREWS": "冲泡总数", + "PAGE_STATISTICS_BREW_PROCESSES": "总冲泡次数", + "PAGE_STATISTICS_DRUNKEN_QUANTITY": "咖啡豆消耗量", + "PAGE_STATISTICS_BEAN_WEIGHT_USED": "咖啡豆研磨总量", + "PAGE_BREW_TEXT_INFORMATION_FROM_ROASTER": "烘焙信息", + "PAGE_ABOUT_NO_VERSION_AVAILABLE": "没有可用的版本", + "PAGE_ABOUT_APP_VERSION": "软件版本", + "PAGE_LICENCES_WEBSITE": "网站", + "BEAN_DATA_ROAST_NAME": "烘焙程度", + "BEAN_DATA_CUSTOM_ROAST_NAME": "自定义烘焙温度", + "BEAN_DATA_ROASTING_DATE": "烘焙日期", + "BEAN_DATA_ROASTER": "烘焙者", + "BEAN_DATA_VARIETY": "品种", + "BEAN_DATA_PROCESSING": "处理法", + "BEAN_DATA_COUNTRY": "国家", + "BEAN_DATA_MIX": "单一产地/拼配", + "BEAN_DATA_AROMATICS": "风味味谱", + "BEAN_DATA_WEIGHT": "重量", + "BEAN_DATA_COST": "花销", + "BEAN_DATA_NAME": "咖啡豆名称", + "BEAN_DATA_REGION": "地区", + "BEAN_DATA_FARM": "庄园", + "BEAN_DATA_FARMER": "农场主", + "BEAN_DATA_ELEVATION": "海拔", + "BEAN_DATA_HARVEST_TIME": "收获日期", + "BEAN_DATA_PERCENTAGE": "百分比", + "BEAN_DATA_CERTIFICATION": "咖啡豆认证", + "BEAN_DATA_ROASTING_TYPE": "烘焙用于", + "BEAN_DATA_DECAFFEINATED": "无咖啡因", + "BEAN_DATA_URL": "网站", + "BEAN_DATA_EAN": "条形码", + "BEAN_DATA_PURCHASING_PRICE": "购买价格", + "BEAN_DATA_FOB_PRICE": "离岸价", + "BEAN_DATA_CUPPING_POINTS": "杯测分数", + "BREW_DATA_CUSTOM_BREW_TIME": "自定义冲泡时间", + "BREW_CREATION_DATE": "创建日期", + "REPEAT": "重复", + "EDIT": "编辑", + "DELETE": "删除", + "FINISHED": "归档", + "NOTES": "笔记", + "ADD_PHOTO": "添加照片", + "CANCEL": "取消", + "GENERATE": "生成", + "SAVE": "保存", + "ADD_SOMETHING": "添加", + "CONTACT": "联系", + "NAME": "名称", + "IMPORT": "导入", + "EXPORT": "导出", + "VIEW": "查看", + "ARCHIVE": "归档", + "CURRENT": "当前", + "BACK": "返回", + "CLOSE": "关闭", + "DAY": "日", + "BREW_DATA_TEMPERATURE_TIME": "温度时间", + "BREW_DATA_SURF_TIME": "冲泡时间", + "BREW_DATA_TIME": "时间", + "BREW_DATA_GRIND_SIZE": "研磨设置", + "BREW_DATA_GRIND_WEIGHT": "咖啡粉 (gr)", + "BREW_DATA_IN_OUT_BR": "入/出 (BR)", + "BREW_DATA_NOTES": "笔记", + "BREW_DATA_PREPARATION_METHOD": "冲泡器具", + "BREW_DATA_MILL": "磨豆机", + "BREW_DATA_MILL_SPEED": "研磨速度 (rpm)", + "BREW_DATA_MILL_TIMER": "研磨时间", + "BREW_DATA_BREW_QUANTITY": "水量", + "BREW_DATA_BEAN_TYPE": "咖啡豆类型", + "BREW_DATA_BREW_TEMPERATURE": "冲泡温度", + "BREW_DATA_PRESSURE_PROFILE": "冲泡参数", + "BREW_DATA_COFFEE_TYPE": "咖啡类型", + "BREW_DATA_COFFEE_CONCENTRATION": "咖啡浓度", + "BREW_DATA_COFFEE_FIRST_DRIP_TIME": "第一滴咖啡落下", + "BREW_DATA_COFFEE_BLOOMING_TIME": "闷蒸/预浸泡时间", + "BREW_DATA_ATTACHMENTS": "附件/照片", + "BREW_DATA_RATING": "评分", + "BREW_DATA_CALCULATED_COFFEE_BREW_TIME": "萃取时间", + "BREW_DATA_TDS": "总溶解固体", + "BREW_DATA_CALCULATED_EXTRACTION_YIELD": "萃取率 %", + "BREW_INFORMATION_BREW_RATIO": "冲泡率", + "BREW_INFORMATION_BEAN_AGE": "豆龄", + "BREW_INFORMATION_BREW_QUANTITY_TYPE_NAME": "计数类型", + "BREW_DATA_TDS_EY": "TDS / %EY", + "BREW_DATA_BREW_BEVERAGE_QUANTITY": "冲泡出的咖啡", + "BREW_DATA_PREPARATION_METHOD_TOOL": "冲泡器具", + "BREW_DATA_WATER": "水质", + "BREW_DATA_BEAN_WEIGHT_IN": "咖啡豆数量 (gr)", + "BREW_DATA_VESSEL": "Server", + "BREW_DATA_VESSEL_WEIGHT": "Server weight", + "BREW_DATA_VESSEL_NAME": "Server name", + "BREW_DATA_FLAVOR": "风味", + "BREW_DATA_FLOW_PROFILE": "Flow", + "ONE_DAY": "天", + "DAYS": "天", + "ONE_HOUR": "小时", + "HOURS": "小时", + "ONE_MINUTE": "分钟", + "MINUTES": "分钟", + "WITHOUT_COFFEE": "没冲咖啡", + "NOT_FOUND": "未找到", + "INVALID_FILE_FORMAT": "文件格式无效", + "FILE_NOT_FOUND_INFORMATION": "文件未找到", + "ERROR_ON_FILE_READING": "读取文件数据时出错", + "IMPORT_SUCCESSFULLY": "导入成功", + "IMPORT_UNSUCCESSFULLY_DATA_NOT_CHANGED": "导入不成功,没有数据被更改", + "INVALID_FILE_DATA": "无效的文件内容", + "DOWNLOADED": "下载", + "FILE_DOWNLOADED_SUCCESSFULLY": "文件 '{{fileName}}' 已成功下载到您的下载文件夹!", + "NO": "不", + "YES": "是", + "SURE_QUESTION": "确定吗?", + "DELETE_BREW_QUESTION": "删除本次冲泡?", + "DELETE_BEAN_QUESTION": "确定要删除这款咖啡豆吗? 所有相关的冲泡数据也将被删除!", + "DELETE_GREEN_BEAN_QUESTION": "确定要删除这款生豆吗? 所有相关的咖啡豆以及冲泡数据都将被删除!", + "DELETE_MILL_QUESTION": "确定要删除这个研磨机吗? 所有相关的冲泡数据也将被删除!", + "DELETE_PREPARATION_METHOD_QUESTION": "确定要删除这个器具吗? 所有相关的冲泡数据也将被删除!", + "DELETE_PREPARATION_TOOL_QUESTION": "确定要删除这个工具吗? 所有相关的冲泡数据也将被删除。", + "APP_COULD_NOT_STARTED_CORRECTLY_BECAUSE_MISSING_FILESYSTEM": "由于缺少文件系统,应用程序无法正确启动", + "CARE": "关心", + "ERROR_OCCURED": "出现错误", + "CSV_FILE_NOT_DOWNLOADED": "CSV 文件无法下载!", + "CSV_FILE_DOWNLOADED_SUCCESSFULLY": "CSV 文件 '{{fileName}}' 已成功下载到您的下载文件夹!", + "ADD_BREW": "添加冲泡", + "CHOOSE": "选择", + "CHOOSE_PHOTO_OR_LIBRARY": "拍摄照片或从相册选择", + "RECORD": "拍摄", + "PAGE_BEAN_INFORMATION": "咖啡豆信息", + "PAGE_BEAN_INFORMATION_GOOD_BREWS": "好的", + "PAGE_BEAN_INFORMATION_BAD_BREWS": "差的", + "PAGE_BEAN_INFORMATION_COUNT_BREWS": "总冲泡次数", + "INFORMATION": "信息", + "PAGE_BEAN_BREW_CHART_TITLE": "该款咖啡豆的冲泡概述", + "PAGE_BEAN_INFORMATION_AWESOME_BREWS": "令人惊叹", + "PAGE_BEAN_INFORMATION_NORMAL_BREWS": "感觉普通", + "PAGE_BEAN_INFORMATION_NOT_RATED_BREWS": "不做评价", + "PAGE_PREPARATION_INFORMATION_BREWS_DONE": "用这种器具冲泡", + "PAGE_PREPARATION_INFORMATION_BREWED_QUANTITY": "冲泡数量", + "PAGE_PREPARATION_INFORMATION_GRIND_WEIGHT": "消耗的豆子重量", + "PAGE_PREPARATION_INFORMATION_TIME_SPENT_BREWING": "总冲泡时间", + "PAGE_PREPARATION_INFORMATION": "器具信息", + "SECONDS": "秒", + "PAGE_MILL_INFORMATION": "磨豆机信息", + "PAGE_MILL_INFORMATION_BREWS_DONE": "使用这个磨豆机", + "PAGE_MILL_INFORMATION_GRIND_WEIGHT": "消耗的豆子重量", + "PAGE_HELPER_WATER_HARDNESS": "水的硬度", + "PAGE_HELPER_WATER_HARDNESS_CA_CONTENTS": "钙含量 mg/l", + "PAGE_HELPER_WATER_HARDNESS_MG_CONTENTS": "镁含量 mg/l", + "PAGE_HELPER_WATER_HARDNESS_GERMAN_HARDNESS": "°dH", + "PAGE_HELPER_WATER_HARDNESS_TOTAL_HARDNESS": "总硬度", + "PAGE_HELPER_BREW_RATIO": "粉液比", + "PAGE_HELPER_BREW_RATIO_GROUND_COFFEE": "咖啡粉重 (gr)", + "PAGE_HELPER_BREW_RATIO_WATER": "液体 (gr/ml)", + "PAGE_HELPER_BREW_RATIO_CALCULATED": "计算出的粉液比", + "PAGE_SETTINGS_SHOW_ARCHIVED_BREWS": "显示已经归档的冲泡", + "PAGE_SETTINGS_SHOW_ARCHIVED_BEANS": "显示已经归档的咖啡豆", + "PAGE_SETTINGS_SHOW_ARCHIVED_GREEN_BEANS": "显示已经归档的生豆", + "CUPPING_SCORE": "分数", + "CUPPING_SCORE_DRY_FRAGRANCE": "干香", + "CUPPING_SCORE_WET_AROMA": "湿香", + "CUPPING_SCORE_BRIGHTNESS": "明亮度", + "CUPPING_SCORE_FLAVOR": "风味", + "CUPPING_SCORE_BODY": "醇厚度", + "CUPPING_SCORE_FINISH": "尾韵", + "CUPPING_SCORE_SWEETNESS": "甜度", + "CUPPING_SCORE_CLEAN_CUP": "干净度", + "CUPPING_SCORE_COMPLEXITY": "复杂度", + "CUPPING_SCORE_UNIFORMITY": "一致性", + "CUPPING_SCORE_CUPPERS_CORRECTION": "杯测矫正", + "CUPPING_SCORE_DRY_FRAGRANCE_TOOLTIP": "指加入热水前,干磨咖啡的气味", + "CUPPING_SCORE_WET_AROMA_TOOLTIP": "指加入热水后,湿咖啡研磨的气味。", + "CUPPING_SCORE_BRIGHTNESS_TOOLTIP": "酸度是由一组绿原酸、柠檬酸、奎宁酸、乙酸等引起的咖啡中尖锐的高调味道,主要在口腔和舌头的前部感觉到。 (质量很好;与咖啡的苦味无关,也不会直接导致胃部不适)。 酸度受到许多杯测者的重视,并且直接关系到杯子的质量,因为酸度是高海拔种植的产物。", + "CUPPING_SCORE_FLAVOR_TOOLTIP": "这是口中的整体印象,包括所有其他评级。 有 4 种“主要味道”组(酸、甜、咸、苦)和许多“次要味道”。", + "CUPPING_SCORE_BODY_TOOLTIP": "通常被称为“口感”,主体是冲泡咖啡的重量和厚度感,由杯子中可溶性固体的百分比引起,包括提取的所有有机化合物(冲泡方法和使用的磨碎咖啡量会影响这一点 大大)。 我们对 Body 的评分较低,因为清淡的咖啡肯定不错,而且在某些原产地,较轻的酒体最适合整体杯子的特性。", + "CUPPING_SCORE_FINISH_TOOLTIP": "口腔清洁后的挥之不去的或新出现的味道。 这包括咖啡从嘴里流出到几分钟后的时间……这就是为什么你会发现很多杯测者在一两分钟后仍然体验到积极的味道时会修改回味分数的原因。", + "CUPPING_SCORE_SWEETNESS_TOOLTIP": "甜味几乎总是咖啡的理想品质,即使它被委婉地描述为“质朴的甜味”或“苦乐参半”。你可能会注意到精致的甜味(想想欧洲糕点、精美的糖果、白糖、 纯甜味)得分高,以及来自水果糖(果糖)的复杂甜味。 麦芽甜味(麦芽糖)不太传统,但非常令人向往,蜂蜜的范围从非常纯净干净到复杂、质朴的几乎是酵母味。 基本上,如果甜度是杯子的关键,它会被评为很好。", + "CUPPING_SCORE_CLEAN_CUP_TOOLTIP": "请注意,“干净的杯子”并不意味着咖啡上没有污垢。 它只是关于风味和“不干净”的原始、时髦的咖啡,而且风味也可能非常理想,例如来自苏门答腊的湿法去壳印度尼西亚咖啡,或干加工的埃塞俄比亚和也门类型。", + "CUPPING_SCORE_COMPLEXITY_TOOLTIP": "复杂性与“风味”和“完成”分数相得益彰,以传达多种风味的多样性或层次感。 这意味着在杯子里有很多发现。 再说一次,简单的咖啡可以在过度暴露于许多强大的、强烈的、复杂的咖啡后得到解脱。", + "CUPPING_SCORE_UNIFORMITY_TOOLTIP": "均匀度是指杯与杯之间的差异。 干法咖啡在本质上可能不如湿法咖啡均匀。 如果偶尔放弃的话,我们永远不会避免很多味道很好的东西。 这是在杯测方案中进行评分的,其中每个被审查的批次都制作了多个杯子。", + "CUPPING_SCORE_CUPPERS_CORRECTION_TOOLTIP": "这改编自 SCAA 系统和卓越杯评分(他们有时称其为“总分”)。 它允许杯测者确保总分正确传达杯子的整体印象。 你可能会批评这种方法,并认为它是“捏造”的。 在某种程度上,你是对的......但是改变类别分数以达到所需的总分(当你知道它是 7 时,给咖啡的酸度为 9)会更糟糕,或者相反,有一个 绝对值得 90 分的咖啡最终以 84 分结束。具体的 Cupper 校正数无关紧要,无论是 5 还是 8 ......这个想法是总分给出了咖啡质量的正确印象。", + "CUPPING_SCORE_TOOLTIP": "100-95 = 令人震惊,90-94 = 杰出,85-89 = 非常好,80-84 = 好,75-79 = 一般,70-74 = 差", + "DETAIL_BREW": "冲泡详情", + "DETAIL_BEAN": "咖啡豆详情", + "DETAIL_MILL": "研磨机详情", + "DETAIL_PREPARATION": "准备冲泡", + "EDIT_BREW": "编辑冲泡", + "ADD_BEAN": "添加咖啡豆", + "EDIT_BEAN": "编辑咖啡豆", + "ADD_PREPARATION": "添加冲泡器具", + "EDIT_PREPARATION": "编辑冲泡器具", + "ADD_MILL": "新增研磨机", + "EDIT_MILL": "编辑研磨机", + "USE_FILTER": "应用筛选", + "RESET_FILTER": "重置筛选", + "COFFEE_GRAMS_GRINDED": "研磨咖啡豆总克数", + "BEANS_USED": "研磨咖啡豆种类", + "BREW_HEADER_BEFORE_BREW": "冲泡前", + "BREW_HEADER_WHILE_BREW": "冲泡时", + "BREW_HEADER_AFTER_BREW": "冲泡后", + "BREW_HEADER_CUPPING": "品尝", + "BEANS_CONSUMED": "归档", + "NAV_MANAGE_PARAMETERS": "管理参数", + "NAV_SORT_PARAMETERS": "参数排序", + "NAV_DEFAULT_PARAMETERS": "定义默认参数", + "PAGE_SORT_PARAMETERS_DESCRIPTION": "拖放参数以定义它们将显示的顺序", + "PAGE_MANAGE_PARAMETERS_DESCRIPTION": "编辑冲泡信息时要显示的数据", + "PAGE_DEFAULT_PARAMETERS_DESCRIPTION": "标记哪些参数应默认为最后使用的值", + "SORT_PARAMETERS_BEFORE": "冲泡前", + "SORT_PARAMETERS_MEANWHILE": "冲泡时", + "SORT_PARAMETERS_AFTER": "冲泡后", + "MORE_INFORMATION": "更多信息", + "UNDERSTOOD": "了解", + "WELCOME_PAGE_ACTIVATE_ANALYTICS_TITLE": "分析和跟踪", + "WELCOME_PAGE_ACTIVATE_ANALYTICS_DESCRIPTION": "我们希望不断改进应用程序、网站和我们未来为您提供的服务。 为此,我们需要跟踪您如何使用该应用程序及其功能的一些数据。 但我们承诺,我们永远不会追踪任何个人数据。 为了确保这些承诺,我们使用 Matomo,一个以数据安全和隐私为中心的开源服务,该服务托管在我们自己的服务器上 - 这确保只有我们拥有数据所有权。 我们的网站提供有关我们跟踪的参数的所有信息,此外,您可以查看 100% 开源的源代码。 如果你有任何问题,请随时与我们联系。", + "ANALYTICS_INFORMATION_TITLE": "分析和跟踪", + "ANALYTICS_INFORMATION_DESCRIPTION": "如您所知,您的数据和隐私的安全是我们的首要任务。

因此,我们已从 Google Analytics 切换到以数据安全和隐私为重点的开源服务 Matomo,该服务由托管 在我们自己的服务器上 - 这意味着我们拥有完整的数据所有权。

跟踪的参数没有改变,我们仍然承诺永远不会跟踪任何个人数据。
我们的网站提供了我们跟踪的参数的所有信息,此外您可以查看100%开源的源代码。

您有问题吗?

联系我们。", + "ACTIVATE": "分析", + "DO_NOT_ACTIVE": "停止分析", + "WELCOME_PAGE_BEAN_TITLE": "咖啡豆", + "WELCOME_PAGE_BEAN_DESCRIPTION": "用咖啡豆来冲泡咖啡有点复杂。 请添加您的第一种咖啡豆以开始使用!", + "WELCOME_PAGE_BEAN_ADD": "添加咖啡豆", + "SKIP": "跳过", + "WELCOME_PAGE_PREPARATION_TITLE": "冲泡器具", + "WELCOME_PAGE_PREPARATION_DESCRIPTION": "V60滤杯, 爱乐压, 手冲式 - 冲泡咖啡的方式有很多种。请添加至少一个冲泡器具", + "WELCOME_PAGE_PREPARATION_ADD": "添加冲泡器具", + "WELCOME_PAGE_MILL_TITLE": "研磨机", + "WELCOME_PAGE_MILL_DESCRIPTION": "就快要完成了,但你需要一些东西来研磨咖啡豆!请添加至少一台研磨机", + "WELCOME_PAGE_MILL_ADD": "新增研磨机", + "WELCOME_PAGE_TITLE": "欢迎!", + "WELCOME_PAGE_BEAN_HEADLINE": "第一款咖啡豆", + "WELCOME_PAGE_PREPARATION_HEADLINE": "添加冲泡器具", + "WELCOME_PAGE_MILL_HEADLINE": "第一个研磨机", + "WELCOME_PAGE_LETS_START_HEADLINE": "现在我们开始吧!", + "WELCOME_PAGE_LETS_START_TITLE": "现在我们开始吧!", + "WELCOME_PAGE_LETS_START_DESCRIPTION": "恭喜,你已经准备好做你一生中最好的咖啡了。玩得开心,传播对好咖啡的热爱!", + "PREPARATION_TYPE": "制作类型", + "PREPARATION_TYPE_NAME": "名称", + "ARCHIVED": "归档", + "PAGE_SETTINGS_SHOW_ARCHIVED_PREPARATIONS": "显示归档的冲泡器具", + "PAGE_SETTINGS_SHOW_ARCHIVED_MILLS": "显示归档的冲泡研磨机", + "PAGE_MILL_LIST_NO_ARCHIVED_MILL_EXISTING": "你还没有归档任何一个研磨机", + "PAGE_PREPARATION_LIST_NO_ARCHIVED_PREPARATION_EXISTING": "你还没有归档任何一种器具", + "TOAST_BREW_ADDED_SUCCESSFULLY": "冲泡添加成功", + "TOAST_BREW_REPEATED_SUCCESSFULLY": "冲泡复制成功", + "TOAST_BEAN_ADDED_SUCCESSFULLY": "咖啡豆添加成功", + "TOAST_MILL_ADDED_SUCCESSFULLY": "新的研磨机已添加成功", + "TOAST_PREPARATION_ADDED_SUCCESSFULLY": "冲泡器具添加成功", + "TOAST_WATER_ADDED_SUCCESSFULLY": "水质添加成功", + "TOAST_BREW_DELETED_SUCCESSFULLY": "冲泡记录已被删除", + "TOAST_BEAN_DELETED_SUCCESSFULLY": "咖啡豆已被删除", + "TOAST_GREEN_BEAN_DELETED_SUCCESSFULLY": "生豆已被删除", + "TOAST_MILL_DELETED_SUCCESSFULLY": "研磨机已被删除", + "TOAST_WATER_DELETED_SUCCESSFULLY": "水质已被删除", + "TOAST_PREPARATION_DELETED_SUCCESSFULLY": "冲泡器具已被删除", + "TOAST_BREW_EDITED_SUCCESSFULLY": "冲泡记录已被编辑", + "TOAST_BEAN_EDITED_SUCCESSFULLY": "咖啡豆已被编辑", + "TOAST_MILL_EDITED_SUCCESSFULLY": "研磨机已被编辑", + "TOAST_PREPARATION_EDITED_SUCCESSFULLY": "器具已被编辑", + "TOAST_WATER_EDITED_SUCCESSFULLY": "水质已被编辑", + "TOAST_BEAN_ARCHIVED_SUCCESSFULLY": "咖啡豆已经归档", + "TOAST_MILL_ARCHIVED_SUCCESSFULLY": "研磨机已经归档", + "TOAST_PREPARATION_ARCHIVED_SUCCESSFULLY": "冲泡器具已经归档", + "TOAST_WATER_ARCHIVED_SUCCESSFULLY": "水质已被编辑", + "BEAN_WEIGHT_ALREADY_USED": "{{gramUsed}}g of {{gramTotal}}g", + "PREPARATION_TYPE_CUSTOM_PREPARATION": "自定义冲泡器具", + "PREPARATION_TYPE_AEROPRESS": "爱乐压", + "PREPARATION_TYPE_V60": "V60滤杯", + "PREPARATION_TYPE_CHEMEX": "Chemex", + "PREPARATION_TYPE_BIALETTI": "比乐蒂/摩卡壶", + "PREPARATION_TYPE_PORTAFILTER": "过滤手柄", + "PREPARATION_TYPE_KALITA_WAVE": "蛋糕杯", + "PREPARATION_TYPE_FRENCH_PRESS": "法压壶", + "PREPARATION_TYPE_SWANNECK": "Swanneck", + "PREPARATION_TYPE_DRIPPER": "聪明杯", + "PREPARATION_TYPE_DELTER_PRESS": "D特压(Delder Press)", + "PREPARATION_TYPE_COLD_BREW": "冷萃", + "PREPARATION_TYPE_AEROPRESS_INVERTED": "爱乐压倒压法", + "PREPARATION_TYPE_TURKISH": "极细研磨", + "PREPARATION_TYPE_BLUE_DRIPPER": "蓝瓶子滤杯", + "PREPARATION_TYPE_ADD_CUSTOM": "添加自定义器具", + "PREPARATION_TYPE_GINA": "Gina智能咖啡机", + "PREPARATION_TYPE_KONO": "KONO滤杯", + "PREPARATION_TYPE_ORIGAMI": "折纸滤杯", + "PREPARATION_TYPE_CAFELAT": "Cafelat拉杆咖啡机", + "PREPARATION_TYPE_OREA": "Orea滤杯", + "PREPARATION_TYPE_COLD_DRIP": "冰滴", + "PREPARATION_TYPE_HAND_LEVER": "手压式", + "PREPARATION_TYPE_FLAIR": "Flair手压意式咖啡机", + "PREPARATION_TYPE_APRIL_BREWER": "April Brewer滤杯", + "PREPARATION_TYPE_ESPRO_BLOOM": "Espro Bloom滤杯", + "PREPARATION_TYPE_FELLOW_STAGG": "Fellow Stagg温控咖啡壶", + "PREPARATION_TYPE_HSIAO_50": "Hsiao 50滤杯", + "PREPARATION_TYPE_KARLSBADER_KANNE": "Karlsbader", + "PREPARATION_TYPE_MOCCA_MASTER": "Mocca Master滴漏式咖啡机", + "PREPARATION_TYPE_SIPHON": "虹吸式", + "CHOOSE_BEANS": "选择咖啡豆", + "CHOOSE_BEAN": "选择咖啡豆", + "CHOOSE_WATERS": "选择水质", + "CHOOSE_WATER": "选择水质", + "CHOOSE_PREPARATIONS": "选择冲泡器具", + "CHOOSE_PREPARATION": "选择冲泡器具", + "CHOOSE_MILLS": "选择研磨机", + "CHOOSE_MILL": "选择研磨机", + "BEAN": { + "PLACE_HOLDER": { + "BEAN_DATA_NAME": "添加咖啡豆的名称", + "BEAN_DATA_ROAST_NAME": "添加烘焙温度", + "BEAN_DATA_ROASTING_DATE": "请输入咖啡豆的烘焙日期", + "BEAN_DATA_ROASTER": "请输入烘焙者的名称", + "BEAN_DATA_VARIETY": "添加咖啡品种", + "BEAN_DATA_PROCESSING": "请输入咖啡豆的处理方法,如:水洗", + "BEAN_DATA_COUNTRY": "它起源于哪儿?", + "BEAN_DATA_MIX": "什么是混合比例?", + "BEAN_DATA_AROMATICS": "描述它的风味吧", + "BEAN_DATA_WEIGHT": "咖啡豆的总重量", + "BEAN_DATA_COST": "购入这款咖啡豆花费了多少钱?", + "BEAN_DATA_REGION": "添加它的产区", + "BEAN_DATA_FARM": "添加它的庄园/农场", + "BEAN_DATA_FARMER": "添加它的种植者名称", + "BEAN_DATA_ELEVATION": "请输入咖啡豆的生长海拔", + "BEAN_DATA_HARVEST_TIME": "请输入咖啡豆的收获日期", + "BEAN_DATA_BUY_DATE": "请输入咖啡豆的购买日期", + "BEAN_DATA_PERCENTAGE": "添加该款咖啡豆在此包装中的占比(主要用于拼配包装填写)", + "BEAN_DATA_CERTIFICATION": "添加豆类认证 (例如:fair trade, bio)", + "BEAN_DATA_ROASTING_TYPE": "添加烘焙类型", + "BEAN_DATA_DECAFFEINATED": "这款咖啡不含咖啡因", + "BEAN_DATA_URL": "添加网站链接", + "BEAN_DATA_EAN": "添加条形码", + "BEAN_DATA_CUPPING_POINTS": "添加它的杯测分数", + "BEAN_DATA_PURCHASING_PRICE": "添加购买价格", + "BEAN_DATA_FOB_PRICE": "添加离岸价格", + "NOTES": "为咖啡豆添加注释", + "CHOOSE_DATA_ROASTER": "添加烘焙机", + "CHOOSE_DATA_ROASTING_TYPE": "选择烘焙类型" + } + }, + "PREPARATION": { + "PLACE_HOLDER": { + "PREPARATION_TYPE_NAME": "添加名称", + "NOTES": "为冲泡器具添加注释" + } + }, + "MILL": { + "PLACE_HOLDER": { + "NAME": "添加名称", + "NOTES": "为研磨机添加注释" + } + }, + "BREW": { + "PLACE_HOLDER": { + "BREW_DATA_GRIND_SIZE": "输入研磨设置,如:5", + "BREW_DATA_GRIND_WEIGHT": "输入此次冲泡咖啡的咖啡粉克数 (gr)", + "BREW_DATA_BREW_TEMPERATURE": "输入冲泡温度", + "BREW_DATA_PREPARATION_METHOD": "选择冲泡器具", + "BREW_DATA_BEAN_TYPE": "选择咖啡豆", + "BREW_DATA_MILL": "选择一个研磨机", + "BREW_DATA_MILL_SPEED": "输入研磨机的研磨速度", + "BREW_DATA_MILL_TIMER": "输入研磨所花费的时间", + "BREW_DATA_PRESSURE_PROFILE": "压强/流量曲线,冲泡建议等", + "BREW_DATA_TEMPERATURE_TIME": "请输入加热器具的时间", + "BREW_DATA_COFFEE_BLOOMING_TIME": "请输入闷蒸/预浸泡所花费的时间", + "BREW_DATA_COFFEE_FIRST_DRIP_TIME": "咖啡的第一滴水是什么时候出现的?", + "BREW_DATA_BREW_QUANTITY": "冲泡时用了多少水?", + "BREW_DATA_COFFEE_TYPE": "输入咖啡类型 (e.g. ristretto)", + "BREW_DATA_COFFEE_CONCENTRATION": "输入咖啡浓度", + "BREW_DATA_TDS": "总共溶解了多少固体?", + "BREW_DATA_NOTES": "为这次冲泡添加注释", + "BREW_DATA_BREW_BEVERAGE_QUANTITY": "冲泡完成以后,得到了多少的咖啡液?", + "BREW_DATA_PREPARATION_METHOD_TOOL": "请选择你的冲泡器具", + "BREW_DATA_WATER": "选择此次使用的水质", + "BREW_DATA_BEAN_WEIGHT_IN": "你使用了多少咖啡豆?(gr)" + } + }, + "ROASTED_BEFORE": "烘焙在", + "DAY_OLD": "天前", + "DAYS_OLD": "天前", + "BEANS_AMOUNT_USED": "已使用", + "CUPPING_BREW": "品尝", + "COFFEE_DRUNKEN_QUANTITY": "咖啡液", + "IMAGE_DELETED": "图片已删除", + "IMAGE_NOT_DELETED": "图片无法删除", + "EXTERNAL_STORAGE_NOT_SUPPORTED": "抱歉,不支持外部故事", + "BEANS_ARCHIVED": "已归档", + "TAB_ARCHIVE": "归档", + "TODAY": "今日", + "PLEASE_WAIT": "请稍等...", + "PREPARATION_STYLE_POUR_OVER": "手冲咖啡", + "PREPARATION_STYLE_ESPRESSO": "意式浓缩", + "PREPARATION_STYLE_FULL_IMMERSION": "全浸泡", + "PREPARATION_STYLE_PERCOLATION": "渗滤式", + "PREPARATION_TYPE_STYLE": "冲泡方式", + "PAGE_SETTINGS_FAST_REPEAT_DESCRIPTION": "开启一个新的菜单条目 - 使用它您可以直接复制冲泡。", + "PAGE_SETTINGS_TRACK_BREW_COORDINATES_DESCRIPTION": "保存每次冲泡时的经纬度", + "PAGE_SETTINGS_TRACK_CAFFEINE_CONSUMPTION_DESCRIPTION": "节省消耗的咖啡因量", + "UPDATE_TITLE": "有什么新玩意儿?", + "NEXT": "下一个", + "UPDATE_TEXT_TITLE_TITLE": { + "5.0.0": { + "TITLE": "版本 5.0: 新玩意儿!", + "DESCRIPTION": [ + "新布局,新图标,新颜色,新标志", + "新的冲泡器具", + "现在可以对冲泡进行分类(渗透、浓缩咖啡、全浸)", + "冲泡工作现在可以继承工具(例如不同的过滤器)", + "现在可以自定义冲泡参数,为每个冲泡定义自己的冲泡流程", + "添加了更多可编辑的咖啡豆信息,现在可以添加不同的排序", + "水量可渗透/全浸", + "你在哪里冲泡最好的咖啡? 主动设置经纬度保存", + "启用快速复制以立即添加冲泡", + "添加了更新屏幕以显示最新更改", + "在25次使用后向用户请求评分", + "为豆类添加了排序", + "添加了冲泡、咖啡豆的搜索面板", + "冲泡详细信息中添加了杯测图", + "在主页上显示剩余的豆子重量", + "为烘焙机添加了预输入", + "评级改为星级而不是图标" + ] + }, + "5.1.0": { + "TITLE": "版本 5.1: 新玩意儿!", + "DESCRIPTION": [ + "新的冲泡时间选择器", + "现在可以在 iOS 上再次选择烘焙日期", + "可以在 iPad 上再次选择图像", + "TDS 计算现在再次显示在饮料量上", + "为 iOS 设备添加了安全区域" + ] + }, + "5.2.0": { + "TITLE": "版本 5.2: 新玩意儿!", + "DESCRIPTION": [ + "冲泡:", + "冲泡计时器将在后台继续计时", + "可以将冲泡设为喜爱", + "添加和编辑咖啡豆的界面现在看起来几乎完全相同了", + "屏幕在冲泡期间可以保持亮屏(可以在设置菜单中启用)", + "最近的冲泡列表现在还能显示归档的冲泡", + "", + "咖啡豆:", + "咖啡豆照片显示在概览中", + "咖啡豆可以评级", + "", + "互动:", + "长按卡片会进入编辑视图", + "可以通过点击卡片访问详细视图", + "Github / Facebook / Instagram 帐户已关联", + "", + "修复:", + "咖啡豆信息复制不正确", + "新用户默认启用冲泡量", + "", + "其它:", + "Apple Healthkit 集成(可在设置菜单中启用)", + "清理", + "布局更改", + "统计扩展", + "启动检查已修改", + "支持冲泡和咖啡豆的不同卡片大小" + ] + }, + "5.3.1": { + "TITLE": "Version 5.3: Thats new!", + "DESCRIPTION": [ + "Brew methods:", + "Changes to the card view", + "Custom images can be attached in the edit screen", + "Brew tools will be saved in edit screen, even when '+' is not pressed", + "", + "Grinders:", + "Custom images can be attached in the edit screen", + "", + "Brews:", + "Parameter 'Attachments' renamed in 'Attachments / Photos'", + "", + "Dashboard:", + "If bean amount is less then 1000g, the number will be written as a whole", + "", + "Bug fixes:", + "Editing via a long-press, does not change information any more", + "Information on the dashboard are updated after made changes", + "Multiple variety information with blends can be saved again", + "Added startup error message if app-data is missing" + ] + }, + "5.4.0": { + "TITLE": "Version 5.4: Thats new!", + "DESCRIPTION": [ + "烘焙选项:", + "Manage all of your green beans and roasters (can be activated in the settings menu)", + "Save all of your green beans and transfer them into roasted onces", + "Add your roaster and connect them with your different kind of roasted beans", + "", + "Website:", + "Go live of our new website! -> https://beanconqueror.com", + "", + "Support us:", + "You've always wanted to support Beanconqueror? We've added a new 'Buy me a coffee' connection", + "", + "iOS - iCloud:", + "The first step into iCloud support was made. At the very first start all of your existing app data will be moved into the support iCloud directory.", + "You have to activate this option in the iCloud Settings first in order to save Beanconqueror on iCloud", + "", + "Android/iOS - Automated file-export:", + "Automated Beanconqueror.json-File is saved for a maximum of 7 days, after that they will be automated deleted again", + "Android: Download/Beanconqueror_export/Beanconqueror_automatic_export_DAY.json", + "iOS: Files/Download/Beanconqueror_export/Beanconqueror_automatic_export_FILE.json", + "", + "Settings:", + "Excel - Export all of your data to excel to work with it even further", + "Define your own image quality between 50% to 100% (default 100%)", + "Brew rating - Define how much stars/points you'd like to set for each brew. Minimum 5, maximum 100", + "", + "New tracking:", + "We've changed to our open source service Matomo, which will be hosted on our own server", + "Removed Google Analytics / Firebase", + "", + "Bug fixes:", + "Apple Healthkit - Settings were not saved", + "Sometimes brew rating stars weren't filled (Brew add/edit)", + "Edit via long tap, screen wasn't scrollable", + "Import of bigger files on iOS led to misconduct", + "Delete procedure of beans / preparations or mills were not consistent and lead to graphical issues", + "Wrong calculation of beverage quantity in statistics and list views", + "", + "分享:", + "与所有咖啡爱好者分享您的咖啡和咖啡豆!", + "", + "Other:", + "Clean ups", + "Layout changes", + "Extension of statistics", + "Startup check revised, added please wait window", + "Some label changes", + "Changed data access / order inside app to reduce problems" + ] + }, + "6.0.0": { + "TITLE": "Version 6.0: Thats new!", + "DESCRIPTION": [ + "蓝牙电子秤", + "Support of the first bluetooth scale - Decent-Scale - Big thanks to Decent Espresso", + "Support of Acaia Lunar", + "", + "Aroma cupping", + "Cup each brew with the different aromatics and flavors", + "", + "Water section", + "Add your own water, activate this section in the settings", + "", + "Support of more languages", + "Support for spanish - Big thanks to Frank!", + "", + "Improvements", + "Support of long press '+' on brews", + "Added new brew parameters", + "Support of different currencies", + "Edit brew while in detail view", + "Choose multiple images at once", + "Support of brix to TDS conversion", + "If bean package is empty, you'll be asked if you want to archive the package on the last brew", + "Reset of roastdate supported", + "Support of detail views on beans, grinders and preparation methods", + "Added brew ratio (g/l)", + "", + "iOS", + "Support of safe areas", + "", + "Bug fixes", + "Apple Healthkit - Decaffeinated coffee was saved", + "Copy of beans led to misconduct", + "Added brew time to excel export", + "Small bug fixes", + "", + "Others", + "Beans, grinders and preparation methods are now sorted alphabetic in dropdowns" + ] + }, + "6.1.0": { + "TITLE": "版本 6.1: 这些是新东西!", + "DESCRIPTION": [ + "二维码", + "扫描你的咖啡包装! 所有咖啡信息都将从烘焙店中插入。", + "", + "蓝牙电子秤", + "支持 Acaia Pearl 2021 - 感谢 Micah 和 Mike", + "支持 Acaia Lunar 2021 - 感谢 Micah 和 Mike", + "支持 Acaia Pyxis - 感谢 Micah 和 Mike", + "支持Hiroia Jimmy - 感谢 Silas", + "支持 Felicita Arc - 感谢 Herman", + "注意:目前不支持 Acaia Pearl 2021 以下的电子秤", + "咖啡豆页面现在可以使用蓝牙电子秤获得的重量信息", + "现在无需通过计时器开始冲泡即可看到重量变化", + "", + "冲泡概述", + "自定义概览中的可见冲煮参数或针对每种冲泡方法", + "准备图像现在在列表视图中可见", + "", + "冲泡视图", + "重制了冲泡视图,相比以往更加平滑", + "冲泡视图现在可以最大化", + "冲泡视图现在可以在冲泡细节视图中放大以及导出", + "现在显示平均流量", + "", + "咖啡豆", + "添加字段:购买日期、离岸价格、采购价格", + "现在可以收藏和筛选咖啡豆", + "如果咖啡豆被归档,您现在也可以对它进行评分", + "按+,您现在可以选择添加或扫描新的咖啡豆包装", + "长按+,直接添加新的咖啡豆", + "", + "预处理方法", + "预处理方法现在可以重复所有设置", + "支持更多的预处理方法 - 感谢 Nicola", + "选择一个预处理方法并展示图片", + "", + "设置", + "评级现在可以阶梯式进行(1、0.75、0.5、0.25、0.1)", + "蓝牙电子秤 - 定义在开始新的冲泡或启动计时器时是否应将秤设置为零重量", + "蓝牙电子秤 - 定义是否要忽略异常或负值 - 如果是,则无法生成实时图表", + "现在选择, 如果您想在主页上查看存档的咖啡豆", + "导出现在还导出保存的蓝牙值的原始数据", + "", + "改进", + "删除冲泡方法和工具时,不会再删除与其相关的咖啡豆", + "制备方法工具现在可以编辑和存档", + "", + "Bug修复:", + "发现更多可能导致数据丢失的问题", + "小错误修复", + "", + "其它:", + "更新到 Ionic-Framework 6,因此发生了一些小的视觉变化" + ] + }, + "6.1.3": { + "TITLE": "版本 6.1.3: 这些是新东西!", + "DESCRIPTION": [ + "Android - 注意", + "首先:对不起!", + "遗憾的是,数据库在 Android Play 商店中从 APK 格式重置为 AAB 格式,您的应用程序可能会在没有数据的情况下启动。", + "我无法调试或控制这种情况,虽然开发工作都按预期进行。", + "如果您的应用显示空白,请进入设置并导入下面的文件 'Download/Beanconqueror_export/Beanconqueror_automatic_export_*.json' * 代表最新的数据备份。", + "然后所有数据都应该恢复正常,如果没有,请给我写一封电子邮件:info@beanconqueror.com。" + ] + }, + "6.1.5": { + "TITLE": "Version 6.1.5: Das ist neu", + "DESCRIPTION": [ + "二维码", + "Lade die QR-Code Daten der Rösterei nun erneut", + "", + "Brühgraph", + "Wasserfluss wird nun in Echtzeit berechnet", + "", + "Bohnen", + "Suchfeld bei der Auswahl der Bohnen", + "", + "Fehlerbehebungen:", + "Nach Aufnahme eines Bildes war der Ladebalken nicht verschwunden", + "Kleinere Fehlerbehebungen" + ] + }, + "6.2.0": { + "TITLE": "版本 6.2.0: 这是新东西!", + "DESCRIPTION": [ + "压强设备", + "支持 '自己去做' Popsicle - 传感器 - 感谢 Mike 和 Shay", + "在特定的压强开始自动计时 - 设置中可以修改", + "按压压强计重置压强为 0", + "连接时显示压强设备的名字和 mac 地址", + "", + "蓝牙电子秤", + "支持 Eureka Precisa - 感谢 Mimoja", + "在新的冲泡中定义蓝牙电子秤的行为 - 可以在设置中修改", + "在手冲或意式浓缩中定义哪个图应该被显示 - 可以在设置中修改", + "顺序处理蓝牙命令以减少问题", + "连接时显示蓝牙电子秤的名字和 mac 地址", + "", + "冲泡", + "支持毫秒 - 在设置中启用", + "支持搜索烘焙类型和烘焙器具", + "可以在冲泡添加或修改页面重连压强设备或电子秤", + "", + "咖啡豆", + "分享咖啡豆(不需要服务器)- 感谢 Mike", + "展示你咖啡豆的所有冲泡", + "支持像冲泡评分一样的咖啡豆评分 - 可以在设置中修改", + "", + "多语言", + "支持土耳其语 - 感谢 Halil Portakal", + "支持简体中文 - 感谢 家赓", + "", + "研磨", + "显示上次的研磨设置", + "", + "提升", + "尚未批准扫描咖啡豆时的错误信息", + "冲泡日期的编辑默认不激活", + "其他", + "修复排版错误", + "修复设置不显示评分时却在启动时显示的问题", + "旧的冲泡图现在可以再次导出", + "更新到 Ionic 6.3.0", + "小错误修复" + ] + } + }, + "CUSTOM_PARAMETERS": "自定义参数", + "CUSTOM_DEFAULT_PARAMETERS": "默认", + "CUSTOM_MANAGE_PARAMETERS": "管理", + "CUSTOM_SORT_PARAMETERS": "种类", + "BREW_PARAMETER_CUSTOMIZE_TITLE": "自定义每种冲泡器具的参数", + "BREW_PARAMETER_CUSTOMIZE_DESCRIPTION": "您想为每种冲泡器具选择自定义参数吗?跳转到“器具”,打开具体冲泡器具的选项,选择“自定义参数”。现在您可以选择将用于此准备的参数!", + "BREW_DATA_BREW_QUANTITY_TOOLTIP": "不能用于意式浓缩咖啡的水量", + "BREW_DATA_COFFEE_FIRST_DRIP_TIME_TOOLTIP": "第一个可用于意式浓缩咖啡的滴漏咖啡o", + "BREW_DATA_PREPARATION_METHOD_TOOLTIP": "冲泡活动时可自定义", + "PAGE_SETTINGS_GENERAL": "常规设置", + "EDIT_PREPARATION_CUSTOM_PARAMETERS": "自定义参数", + "ENABLE_PREPARATION_CUSTOM_PARAMETERS": "使用个人参数", + "BEAN_ADD_ANOTHER_SORT": "添加另一种类", + "BEAN_SORT": "种类", + "BEAN_SORT_INFORMATION": "变化信息", + "BEAN_SORT_MORE_INFORMATION": "更多信息", + "NAVIGATE_TO_PREPARATION_METHODS": "跳转到冲泡页面", + "PREPARATION_TOOLS": "冲泡器具", + "PREPARATION_TOOLS_INFORMATION": "为您的过滤器添加不同的容器. 对于 V60 滤杯 或 123 添加例如 布、纸或网状过滤器", + "PREPARATION_TOOLS_PLACEHOLDER": "纸或布过滤器、VST-20g、14g-Basket等。", + "PREPARATION_PARAMETERS_CUSTOMIZED": "参数自定义", + "BEANS_WEIGHT_AVAILABLE": "可用的咖啡豆", + "SORT_ORDER": "改变顺序", + "ASCENDING": "升序", + "DESCENDING": "倒序", + "SORT_AFTER": "排序", + "BEAN_SORT_NAME_OF_BEAN": "咖啡豆名称", + "BEAN_SORT_ROASTER": "烘焙机", + "BEAN_SORT_ROASTING_DATE": "烘焙日期", + "BEAN_TAB_ROAST_INFORMATION": "烘焙信息", + "BEAN_TAB_GENERAL_INFORMATION": "常规", + "BEAN_TAB_SORT_INFORMATION": "品种信息", + "PAGE_SETTINGS_MANAGE_ARCHIVE": "管理归档", + "LAST_USE": "上一次使用在", + "SEARCH": "搜索", + "OVERVIEW": "概览", + "BEAN_HEADER_ADDITIONALE_INFORMATION": "附加信息", + "THREE_DEE_TOUCH_ACTION_BREW": "冲泡", + "THREE_DEE_TOUCH_ACTION_BEAN": "咖啡豆", + "THREE_DEE_TOUCH_ACTION_PREPARATION": "冲泡器具", + "THREE_DEE_TOUCH_ACTION_MILL": "研磨机", + "PAGE_CREDITS_NOT_EXISTING": "无内容", + "TIMER_HOUR": "小时", + "TIMER_MINUTES": "分钟", + "TIMER_SECONDS": "秒", + "EXCEL": { + "BEAN": { + "CREATION_DATE": "创建日期", + "ID": "咖啡豆编号" + }, + "PREPARATION": { + "CREATION_DATE": "创建日期", + "ID": "器具编号" + }, + "GRINDER": { + "CREATION_DATE": "创建日期", + "ID": "工厂编号" + } + }, + "EXCEL_EXPORT": "导出为Excel", + "HEALTH_KIT_QUESTION_TITLE": "节省咖啡因消耗", + "HEALTH_KIT_QUESTION_MESSAGE": "通过启用,每次冲泡中占用的咖啡因将自动保存在 Apple Health 中", + "NAV_ROASTING_SECTION": "烘焙", + "ROASTING_SECTION": { + "NAV_GREEN_BEANS": "生豆", + "NAV_ROASTING_MACHINE": "烘焙机", + "ROASTING_MACHINE": { + "TOTAL_ROAST_QUANTITY": "烘焙出的咖啡豆", + "TOTAL_ROAST_COUNT": "烘焙次数" + }, + "GREEN_BEAN": { + "ADD": "添加", + "EDIT": "编辑", + "DETAIL": "生豆详情", + "ROASTABLE": "待烘焙", + "NO_ROASTS_YET": "目前还没有烘焙" + }, + "BEAN": { + "DROP_TEMPERATURE": "烘焙的最终温度", + "ROAST_LENGTH": "烘焙时长", + "ROASTER_MACHINE": "烘焙机", + "GREEN_BEAN_WEIGHT": "生豆重量", + "OUTSIDE_TEMPERATURE": "气温", + "HUMIDITY": "湿度", + "FIRST_CRACK_MINUTE": "一爆分钟", + "FIRST_CRACK_TEMPERATURE": "一爆温度", + "SECOND_CRACK_MINUTE": "二爆分钟", + "SECOND_CRACK_TEMPERATURE": "二爆温度", + "PLACE_HOLDER": { + "DROP_TEMPERATURE": "烘焙的最终温度", + "ROAST_LENGTH": "烘焙时长", + "ROASTER_MACHINE": "烘焙机", + "GREEN_BEAN_WEIGHT": "生豆重量", + "OUTSIDE_TEMPERATURE": "气温", + "HUMIDITY": "湿度", + "FIRST_CRACK_MINUTE": "一爆分钟", + "FIRST_CRACK_TEMPERATURE": "一爆温度", + "SECOND_CRACK_TEMPERATURE": "二爆温度", + "SECOND_CRACK_MINUTE": "二爆分钟" + } + } + }, + "PAGE_SETTINGS_MANAGE_SECTIONS": "更多选项卡", + "PAGE_SETTINGS_SHOW_ROASTING_SECTION": "启用烘焙选项卡", + "PAGE_SETTINGS_SHOW_WATER_SECTION": "启用水质选项卡", + "PAGE_SETTINGS_SHOW_CUPPING_SECTION": "启用杯测选项", + "BEAN_DATA_BUY_DATE": "购买日期", + "BEAN_SORT_CREATION_DATE": "创建日期", + "BEAN_SORT_PURCHASE_DATE": "购买日期", + "BEAN_ROAST_COUNT": "烘焙度", + "TRANSFER_ROAST": "烘焙", + "BEAN_TAB_LINKED_ROASTS": "烘焙", + "BEAN_DATA_WEIGHT_AFTER_ROASTING": "烘焙后的重量", + "TOAST_GREEN_BEAN_ADDED_SUCCESSFULLY": "生豆已添加成功", + "TOAST_GREEN_BEAN_EDITED_SUCCESSFULLY": "生豆已编辑成功", + "TOAST_GREEN_BEAN_ARCHIVED_SUCCESSFULLY": "生豆已归档成功", + "TOAST_ROASTING_MACHINE_ADDED_SUCCESSFULLY": "烘焙机已添加成功", + "TOAST_ROASTING_MACHINE_EDITED_SUCCESSFULLY": "烘焙机已编辑成功", + "TOAST_ROASTING_MACHINE_ARCHIVED_SUCCESSFULLY": "烘焙机已归档成功", + "DELETE_ROASTING_MACHINE_QUESTION": "删除烘焙机?所有相关已经烘焙后的咖啡豆都将更新,不会被删除", + "TOAST_ROASTING_MACHINE_DELETED_SUCCESSFULLY": "烘焙机已删除成功", + "EDIT_ROASTING_MACHINE": "编辑", + "DETAIL_ROASTING_MACHINE": "烘焙详情", + "DELETE_WATER_QUESTION": "删除水质?所有相关已经烘焙后的咖啡豆都将更新,不会被删除", + "ROASTING_MACHINE": { + "PLACE_HOLDER": { + "NAME": "添加名称", + "NOTES": "为烘焙机添加注释" + } + }, + "NAV_ROASTING_MACHINE": "烘焙机", + "PAGE_ROASTING_MACHINE_LIST_NO_MACHINES_EXISTING": "您没有添加任何烘焙机", + "PAGE_ROASTING_MACHINE_LIST_NO_ARCHIVED_MACHINES_EXISTING": "您没有归档任何烘焙机", + "CHOOSE_ROASTING_MACHINES": "选择烘焙机", + "CHOOSE_ROASTING_MACHINE": "选择烘焙机", + "POPOVER_BREWS_OPTION_TOGGLE_FAVOURITE": "喜爱", + "TOAST_BREW_FAVOURITE_ADDED": "已添加为喜爱", + "TOAST_BREW_FAVOURITE_REMOVED": "已从喜爱中删除", + "BREW_FILTER_JUST_FAVOURITE": "喜爱", + "STATISTICS_PREPARATION_USAGES": "器具用途", + "STATISTICS_PREPARATION_TIMELINE_USAGES": "器具的使用历史", + "STATISTICS_GRINDER_TIMELINE_USAGES": "研磨机的使用历史", + "ACCEPT": "接受", + "STATISTIC_TAB_GENERAL": "常规", + "STATISTIC_TAB_BREWS": "冲泡", + "STATISTIC_TAB_BEANS": "咖啡豆", + "STATISTIC_TAB_PREPARATIONS": "冲泡器具", + "STATISTIC_TAB_GRINDERS": "研磨机", + "PAGE_STATISTICS_BREW_PER_DAYPROCESSES": "每天冲泡", + "PAGE_STATISTICS_BREW_TIME": "冲泡时间", + "PAGE_STATISTICS_PHOTOS_TAKEN": "拍摄的照片", + "PAGE_SETTINGS_IMAGE_QUALITY": "图像质量", + "PAGE_SETTINGS_IMAGE_QUALITY_TOOLTIP": "定义图像加载质量,这可以降低您的数据使用量。", + "PAGE_SETTINGS_BREW_RATING": "冲泡评分", + "PAGE_SETTINGS_BREW_RATING_TOOLTIP": "对冲泡进行-1到5分的评分太少了吗?你最高可以设置到100的评分区间", + "UPDATE_ENTRY_OF": "Update entry {{index}} of {{count}}", + "WEBSITE": "网站", + "SHARE": "分享", + "ANDROID_FILE_ACCESS_NEEDED_TITLE": "需要授权文件访问权限", + "ANDROID_FILE_ACCESS_NEEDED_DESCRIPTION": "为了让应用程序充分发挥作用,我们需要您授权文件访问。 否则应用程序内会有部分功能受限。 这是自动备份功能所需要的权限。", + "COULD_NOT_ACCESS_FILE": "我们无法访问所选文件", + "WRONG_FILE_FORMAT": "您选择了不受支持的文件格式", + "SCAN_BEAN": "扫描包", + "CLEAR": "清除", + "BEAN_LOOKS_LIKE_CONSUMED": "这包咖啡豆看起来已经完全消耗了,要将它归档吗?", + "CUPPING_1": "水果(Fruit)", + "CUPPING_2": "柑橘类(Citrus)", + "CUPPING_3": "柠檬和柠檬水(Lemo)", + "CUPPING_4": "酸橙(Lime)", + "CUPPING_5": "西柚(Grapefruit)", + "CUPPING_6": "小柑橘(Clementine)", + "CUPPING_7": "柑橘(Tangerine)", + "CUPPING_8": "砂糖橘(Mandarin orange)", + "CUPPING_9": "橙子(Orange)", + "CUPPING_10": "苹果/梨(Apple/pear)", + "CUPPING_11": "绿苹果(Green apple)", + "CUPPING_12": "红苹果(Red apple)", + "CUPPING_13": "瓜(Melon)", + "CUPPING_14": "西瓜(Watermelon)", + "CUPPING_15": "甜瓜(Honeydew)", + "CUPPING_16": "哈密瓜(Cantaloupe)", + "CUPPING_17": "葡萄(Grape)", + "CUPPING_18": "白葡萄(White grape)", + "CUPPING_19": "绿葡萄(Green grape)", + "CUPPING_20": "红葡萄(Red grape)", + "CUPPING_21": "康科德葡萄(Concord grape)", + "CUPPING_22": "热带水果(Tropical fruit)", + "CUPPING_23": "荔枝(Lychee)", + "CUPPING_24": "杨桃(Star fruit)", + "CUPPING_25": "酸角(Tamarind)", + "CUPPING_26": "百香果(Passion fruit)", + "CUPPING_27": "菠萝(Pineapple)", + "CUPPING_28": "芒果(Mango)", + "CUPPING_29": "木瓜(Papaya)", + "CUPPING_30": "猕猴桃(Kiwi)", + "CUPPING_31": "香蕉(Banana)", + "CUPPING_32": "椰子(Coconut)", + "CUPPING_33": "核果(Stone fruit)", + "CUPPING_34": "桃子(Peach)", + "CUPPING_35": "油桃(Nectarine)", + "CUPPING_36": "杏(Apricot)", + "CUPPING_37": "李子(Plum)", + "CUPPING_38": "樱桃(Cherry)", + "CUPPING_39": "黑樱桃(Black cherry)", + "CUPPING_40": "浆果类(Berry)", + "CUPPING_41": "蔓越莓(Cranberry)", + "CUPPING_42": "覆盆子(Raspberry)", + "CUPPING_43": "草莓(Strawberry)", + "CUPPING_44": "蓝莓(Blueberry)", + "CUPPING_45": "红加仑(Red currant)", + "CUPPING_46": "黑加仑(Black currant)", + "CUPPING_47": "干果类(Dried fruit)", + "CUPPING_48": "红葡萄干(Golden raisin)", + "CUPPING_49": "葡萄干(Raisin)", + "CUPPING_50": "无花果干(Dried fig)", + "CUPPING_51": "枣干(ried dates)", + "CUPPING_52": "梅干(Prune)", + "CUPPING_53": "甜味和烘培(Sweet & Roasting Notes)", + "CUPPING_54": "巧克力(Chocolate)", + "CUPPING_55": "可可碎(Cacao nibs)", + "CUPPING_56": "黑巧(Dark chocolate)", + "CUPPING_57": "贝克巧克力(Bakers chocolate)", + "CUPPING_58": "Bittersweet chocolate", + "CUPPING_59": "可可粉(Cocoa powder)", + "CUPPING_60": "牛奶巧克力(Milk chocolate)", + "CUPPING_61": "坚果类(Nut)", + "CUPPING_62": "核桃(Walnut)", + "CUPPING_63": "花生(Peanut)", + "CUPPING_64": "腰果(Cashew)", + "CUPPING_65": "山核桃(Pecan)", + "CUPPING_66": "榛子(Hazelnut)", + "CUPPING_67": "杏仁(Almond)", + "CUPPING_68": "谷物(Grain & Cereal)", + "CUPPING_69": "Sweet bread pastry", + "CUPPING_70": "格兰诺拉麦片(Granola)", + "CUPPING_71": "全麦饼干(Graham cracker)", + "CUPPING_72": "黑麦(Rye)", + "CUPPING_73": "小麦(Wheat)", + "CUPPING_74": "大麦(Barley)", + "CUPPING_75": "新鲜面包(Fresh bread)", + "CUPPING_76": "甜味和糖类(Sweet & Sugary)", + "CUPPING_77": "香草(Vanila)", + "CUPPING_78": "牛轧糖(Nougat)", + "CUPPING_79": "蜂蜜(Honey)", + "CUPPING_80": "黄油(Butter)", + "CUPPING_81": "奶油(Cream)", + "CUPPING_82": "棉花糖(Marshmallow)", + "CUPPING_83": "甘蔗(Sugarcane)", + "CUPPING_84": "红糖(Brown sugar)", + "CUPPING_85": "焦糖(Caramel)", + "CUPPING_86": "枫糖浆(Maple syrup)", + "CUPPING_87": "糖浆(Molasses)", + "CUPPING_88": "可乐(Cola)", + "CUPPING_89": "烘焙(Roast)", + "CUPPING_90": "吐司(Toast)", + "CUPPING_91": "焦糖(Burnt sugar)", + "CUPPING_92": "烟熏(Smokey)", + "CUPPING_93": "木炭(Carbon)", + "CUPPING_94": "植物、咸味食物和香料(Vegetal, Savory & Spices)", + "CUPPING_95": "香料(Spice)", + "CUPPING_96": "黑胡椒(Black pepper)", + "CUPPING_97": "白胡椒(White pepper)", + "CUPPING_98": "肉桂(Cinnamon)", + "CUPPING_99": "芫荽、香菜(Coriander)", + "CUPPING_100": "生姜(Ginger)", + "CUPPING_101": "肉豆蔻(Nutmeg)", + "CUPPING_102": "咖喱(Curry)", + "CUPPING_103": "甘草-茴香Licorice-anise", + "CUPPING_104": "丁香(Clove)", + "CUPPING_105": "咸味食物(Savory)", + "CUPPING_106": "Leathery", + "CUPPING_107": "Meat-like", + "CUPPING_108": "酱油(Soy sauce)", + "CUPPING_109": "番茄干(Sundried tomato)", + "CUPPING_110": "番茄(Tomato)", + "CUPPING_111": "植物泥土草药(Vegetal Earthy Herb)", + "CUPPING_112": "土壤(Soil)", + "CUPPING_113": "新鲜木材(Fresh wood)", + "CUPPING_114": "雪松(Cedar)", + "CUPPING_115": "烟草(Tobacco)", + "CUPPING_116": "干草/稻草(Hay / straw)", + "CUPPING_117": "绿叶蔬菜(Leafy greens)", + "CUPPING_118": "橄榄(Olive)", + "CUPPING_119": "青椒(Green pepper)", + "CUPPING_120": "南瓜(Squash)", + "CUPPING_121": "蘑菇(Mushroom)", + "CUPPING_122": "甜豌豆(Sweet pea)", + "CUPPING_123": "荷兰豆(Snow pea)", + "CUPPING_124": "草(Grassy)", + "CUPPING_125": "茴香(Dill)", + "CUPPING_126": "鼠尾草(Sage)", + "CUPPING_127": "薄荷(Mint)", + "CUPPING_128": "绿茶(Green tea)", + "CUPPING_129": "红茶(Black tea)", + "CUPPING_130": "啤酒花(Hops)", + "CUPPING_131": "佛手柑(Bergamot)", + "CUPPING_132": "花类(Flowery)", + "CUPPING_133": "花(Floral)", + "CUPPING_134": "木槿花(Hibiscus)", + "CUPPING_135": "蔷薇果(Rose hips)", + "CUPPING_136": "薰衣草(Lavender)", + "CUPPING_137": "木兰花(Magnolia)", + "CUPPING_138": "茉莉、金银花(Jasmine honeysuckle)", + "CUPPING_139": "橙花(Orange blossom)", + "CUPPING_140": "香茅(Lemongrass)", + "WATER_SECTION": { + "NAV_WATER": "水质", + "YOU_GOT_NO_ARCHIVED_WATER": "你还没有归档任何水质", + "YOU_GOT_NO_WATER": "你还没有添加任何水质", + "CATEGORY_INFORMATION": "水质信息", + "CATEGORY_GENERAL": "常规", + "WATER_BOTTLE_EXPLANATION": "水质通常以 ppm = mg/L 为单位表示浓度", + "USED_TIMES": "使用次数", + "AMOUNT": "使用量", + "WATER": { + "GENERAL_HARDNESS": "一般硬度 (GH)", + "TOTAL_ALKALINITY": "总碱度 (KH)", + "CALCIUM": "钙 (Ca)", + "MAGNESIUM": "镁 (Mg)", + "SODIUM": "钠 (Na)", + "TDS": "总溶解固体 (TDS)", + "UNITS": "单位", + "PLACE_HOLDER": { + "GENERAL_HARDNESS": "一般硬度", + "TOTAL_ALKALINITY": "总碱度", + "CALCIUM": "钙 (Ca)", + "MAGNESIUM": "镁 (Mg)", + "SODIUM": "钠 (Na)", + "TDS": "总溶解固体 (TDS)", + "NAME": "添加水的名称", + "NOTES": "为水质添加注释" + }, + "WATER_UNIT": { + "UNKNOWN": "不清楚", + "PPM": "以CaCO3计量ppm", + "MG_L": "mg/L", + "MMOL_L": "mmol/L", + "DH": "°dH" + } + } + }, + "BREW_BRIX_CALCULATION": "白利糖度", + "SET_TDS": "设置 tds", + "TOTAL_WEIGHT": "总重量", + "CALCULATED_WEIGHT": "计算重量", + "SET_WEIGHT": "设置重量", + "ADD_FLAVORS_AROMAS_TITLE": "香气/风味", + "CUSTOM_FLAVORS_AROMAS": "自定义香气", + "CUSTOM_FLAVORS_AROMAS_PLACEHOLDER": "以自己的语言描述它的香气", + "PREDEFINED_FLAVORS_AROMAS": "常见的香气", + "ADD_AROMA_FLAVOR": "添加香气/风味", + "BEAN_WEIGHT_IN_PLACEHOLDER": "从咖啡包装中取出的咖啡豆", + "VESSEL_PLACEHOLDER": "容器名和净重", + "GRIND_WEIGHT_PLACEHOLDER": "用于冲泡的咖啡粉的重量", + "PRESET_BREW_TITLE": "使用最后一次冲泡作为预设", + "CUPPING_BREW_TAB_AROMA": "香气", + "CUPPING_BREW_TAB_TASTING": "评分", + "WATER_PLACEHOLDER": "如需完整功能,请在设置菜单中激活水质部分", + "PAGE_SETTINGS_SCALES": "电子秤", + "CONNECT": "连接", + "DISCONNECT": "断开连接", + "SCALE": { + "BLUETOOTH_SCAN_RUNNING": "正在搜索附件的电子秤,请稍等60秒", + "BLUETOOTH_NOT_ENABLED": "未开启蓝牙,请开启蓝牙以进行搜索", + "CONNECTION_NOT_ESTABLISHED": "附近找不到电子秤或是无法建立连接", + "CONNECTED_SUCCESSFULLY": "电子秤已连接", + "DISCONNECTED_SUCCESSFULLY": "电子秤已断开连接", + "DISCONNECTED_UNPLANNED": "电子秤意外断开", + "REQUEST_PERMISSION": { + "LOCATION": "软件需要位置权限来搜索电子秤", + "BLUETOOTH": "软件需要蓝牙权限来搜索电子秤" + }, + "INFORMATION_DESCRIPTION": "支持的电子秤: Decent 电子秤, Acaia 电子秤, Felicita 电子秤以及 Hiroia Jimmy and Eureka Precisa. Care: If the Eureka Precisa recieves a negative value, the timer stops" + }, + "QR": { + "WRONG_QRCODE_DESCRIPTION": "错误的二维码或错误的内容", + "WRONG_QRCODE_TITLE": "错误", + "WRONG_LINK_DESCRIPTION": "错误的应用链接", + "WRONG_LINK_TITLE": "错误", + "SERVER": { + "ERROR_OCCURED": "出现错误,无法读取二维码,请重试。", + "BEAN_NOT_APPROVED": "Bean has not been approved yet, please try later again" + }, + "BEAN_SUCCESSFULLY_SCANNED": "咖啡豆扫描成功", + "IMAGES_GETTING_DOWNLOADED": "正在下载的图像" + }, + "RETRY_CONNECT": "重试连接", + "SMART_SCALE_STAY_CONNECTED_ON_APP_MINIMIZE": "即使应用程序被最小化/非活动状态,也让电子秤连接", + "BREW_FLOW_WEIGHT": "重量", + "BREW_FLOW_WEIGHT_PER_SECOND": "流速", + "ROAST_TYPE_UNKNOWN": "不清楚", + "ROAST_TYPE_CINNAMON_ROAST": "浅烘焙(Cimon Roast)", + "ROAST_TYPE_AMERICAN_ROAST": "美式烘焙(American Roast)", + "ROAST_TYPE_NEW_ENGLAND_ROAST": "新英格兰烘焙(New England Roast)", + "ROAST_TYPE_HALF_CITY_ROAST": "半城市烘焙(Half City Roast)", + "ROAST_TYPE_MODERATE_LIGHT_ROAST": "Moderate-Light Roast", + "ROAST_TYPE_CITY_ROAST": "中深度烘焙(City Roast)", + "ROAST_TYPE_CITY_PLUS_ROAST": "City+ Roast", + "ROAST_TYPE_FULL_CITY_ROAST": "微深度烘焙(Full City Roast)", + "ROAST_TYPE_FULL_CITY_PLUS_ROAST": "深度烘焙(Full City + Roast)", + "ROAST_TYPE_ITALIAN_ROAST": "极深度烘焙(Italian Roast)", + "ROAST_TYPE_VIEANNA_ROAST": "维也纳烘焙(Vienna Roast)", + "ROAST_TYPE_FRENCH_ROAST": "法式烘焙(French Roast)", + "ROAST_TYPE_CUSTOM_ROAST": "自定义", + "BEAN_MIX_UNKNOWN": "不清楚", + "BEAN_MIX_SINGLE_ORIGIN": "单一产地", + "BEAN_MIX_BLEND": "拼配", + "BEAN_ROASTING_TYPE_FILTER": "滴滤式/Filter", + "BEAN_ROASTING_TYPE_ESPRESSO": "意式浓缩/Espresso", + "BEAN_ROASTING_TYPE_OMNI": "均可/Omni", + "BEAN_ROASTING_TYPE_UNKNOWN": "不清楚", + "SMART_SCALE_LOG": "为智能电子秤激活日志文件(仅用于发送日志进行调试)", + "TOAST_PREPARATION_TOOL_EDITED_SUCCESSFULLY": "杯测工具编辑", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE": "蓝牙电子秤", + "PAGE_SETTINGS_TAB_GENERAL": "常规", + "SMART_SCALE_TARE_ON_BREW": "在开始新的冲泡时去皮", + "SMART_SCALE_TARE_ON_START_TIMER": "当定时器启动时去皮", + "PAGE_SETTINGS_BREW_RATING_STEPS": "评级步骤", + "BREW_AVG_FLOW_WEIGHT_PER_SECOND": "Ø 流速", + "CUSTOM_LIST_VIEW_PARAMETERS": "列表视图参数", + "NAV_LIST_VIEW_CUSTOM_PARAMETERS": "列表视图参数", + "PAGE_LIST_VIEW_CUSTOM_PARAMETERS_DESCRIPTION": "决定你的咖啡冲泡的哪个参数,应该显示在列表视图上", + "BREW_DATA_VESSEL_NAME_WEIGHT": "容器 名称/重量", + "IGNORE_NEGATIVE_VALUES": "忽略负重量值", + "IGNORE_ANOMALY_VALUES": "忽略异常值", + "IGNORE_ANOMALY_VALUES_TOOLTIP": "例如:在秤上旋转杯子", + "TOAST_BEAN_FAVOURITE_ADDED": "喜爱已添加", + "TOAST_BEAN_FAVOURITE_REMOVED": "喜爱已移除", + "QR_CODE_SCANNER_INFORMATION_TITLE": "二维码", + "QR_CODE_SCANNER_INFORMATION_DESCRIPTION": "所有扫描的咖啡豆信息都直接来自烘焙店。
如果您发现错误或误导性信息,请通过电子邮件通知我: info@beanconqueror.com.", + "DONT_SHOW_AGAIN": "不再显示", + "ARCHIVED_TOOLS": "归档工具", + "UNARCHIVE": "取消归档", + "PAGE_SETTINGS_HIDE_ARCHIVED_BREWS_DASHBOARD": "在仪表盘上显示已归档的冲泡", + "PAGE_SETTINGS_HIDE_ARCHIVED_BREWS_DASHBOARD_DESCRIPTION": "已归档的冲泡应该显示在主页上吗?", + "COPY": "复制", + "TOAST_PREPARATION_METHOD_REPEATED_SUCCESSFULLY": "杯测方法复制成功", + "PREPARATION_TYPE_CAFEC_FLOWER": "Cafec 花辦滤杯(Cafec Flower)", + "PREPARATION_TYPE_DECEMBER_DRIPPER": "December 可调咖啡滤杯(December Dripper)", + "PREPARATION_TYPE_DECENT_ESPRESSO": "Decent Espresso", + "PREPARATION_TYPE_HARIO_SWITCH": "Hario Switch 聪明杯", + "PREPARATION_TYPE_HARIO_WOODNECK": "Hario Woodneck 滤布", + "PREPARATION_TYPE_RATIO_SIX_COFFEE_BREWER": "Ratio Six Coffee Brewer", + "PREPARATION_TYPE_ROK": "ROK 手压咖啡机", + "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo", + "PREPARATION_TYPE_TRICOLATE": "Tricolate 聪明杯", + "QR_CODE_REFRESH_DATA_MESSAGE": "咖啡豆的所有信息将会被修改,现在开始?", + "POPOVER_QR_CODE_REFRESH": "重载数据", + "BREW_FLOW_WEIGHT_REALTIME": "Flow (真实时间)", + "SMART_SCALE_STOP_TIMER_ON_BREW": "在新的冲泡时停止电子秤计时", + "SMART_SCALE_RESET_TIMER_ON_BREW": "在新的冲泡时重置电子秤计时", + "BREW_PRESSURE_FLOW": "压强设备", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_FILTER": "展示手冲图表", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_ESPRESSO": "展示意式浓缩图表", + "PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE": "压强设备", + "PRESSURE_LOG": "启用压强设备日志", + "PRESSURE_THRESHOLD_ACTIVE": "在预定义压强开始计时", + "PRESSURE_THRESHOLD_BAR": "压强阈值", + "TIMER_MILLISECONDS": "毫秒", + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS": "毫秒?", + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "使用毫秒更精准的分析每次冲泡", + "PAGE_SETTINGS_BEAN_RATING": "咖啡豆评分", + "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "五分制不适合你的话可以使用百分制", + "PAGE_SETTINGS_BEAN_RATING_STEPS": "咖啡豆评分间隔", + "COFFEE_GRAMS_BREWED": "冲泡克数", + "SMART_SCALE_MAXIMIZE_ON_START_TIMER": "开始计时图表中的最大真实时间", + "PRESSURE": { + "CONNECTION_NOT_ESTABLISHED": "没找到压强设备或者没有建立连接", + "CONNECTED_SUCCESSFULLY": "压强设备已连接", + "DISCONNECTED_SUCCESSFULLY": "压强设备未连接", + "DISCONNECTED_UNPLANNED": "压强设备意外断开连接", + "INFORMATION_DESCRIPTION": "支持设备:Popsicle", + "BLUETOOTH_SCAN_RUNNING": "压强设备搜索将会花费60秒,稍等", + "BLUETOOTH_NOT_ENABLED": "蓝牙未开启,请开启以正常工作", + "REQUEST_PERMISSION": { + "LOCATION": "应用需要位置权限以搜索压强设备", + "BLUETOOTH": "应用需要蓝牙权限以搜索压强设备" + } + }, + "POPOVER_BLUETOOTH_ACTION_RECONNECT_SCALE": "重连电子秤", + "POPOVER_BLUETOOTH_ACTION_RECONNECT_PRESSURE_DEVICE": "重连压强设备", + "POPOVER_SHOW_BREWS": "显示冲泡", + "LAST_USED_GRIND_SIZE_SETTING": "上次研磨设置", + "LAST_USED_BEAN": "上次的咖啡豆" } diff --git a/src/assets/js/matomo.js b/src/assets/js/matomo.js index e68f5c41e..6457319b2 100644 --- a/src/assets/js/matomo.js +++ b/src/assets/js/matomo.js @@ -8,67 +8,4739 @@ * @license https://piwik.org/free-software/bsd/ BSD-3 Clause (also in js/LICENSE.txt) * @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause */ -;if(typeof _paq!=="object"){_paq=[]}if(typeof window.Matomo!=="object"){window.Matomo=window.Piwik=(function(){var r,b={},z={},J=document,g=navigator,ab=screen,W=window,h=W.performance||W.mozPerformance||W.msPerformance||W.webkitPerformance,t=W.encodeURIComponent,V=W.decodeURIComponent,k=unescape,L=[],H,u,al=[],y=0,af=0,X=0,m=false;function p(at){try{return V(at)}catch(au){return unescape(at)}}function M(au){var at=typeof au;return at!=="undefined"}function C(at){return typeof at==="function"}function Z(at){return typeof at==="object"}function x(at){return typeof at==="string"||at instanceof String}function ak(at){return typeof at==="number"||at instanceof Number -}function ac(at){return M(at)&&(ak(at)||(x(at)&&at.length))}function D(au){if(!au){return true}var at;var av=true;for(at in au){if(Object.prototype.hasOwnProperty.call(au,at)){av=false}}return av}function ao(at){var au=typeof console;if(au!=="undefined"&&console&&console.error){console.error(at)}}function aj(){var ay,ax,aA,au,at;for(ay=0;ay0;if(aw){az=aA.split("::");av=az[0];aA=az[1];if("object"===typeof u[av]&&"function"===typeof u[av][aA]){u[av][aA].apply(u[av],au)}else{if(at){al.push(at)}}}else{for(ax=0;ax0;if(aB){az=aA.split(".");if(av&&"object"===typeof av[az[0]]){av=av[az[0]];aA=az[1]}else{if(at){al.push(at);break}}}if(av[aA]){av[aA].apply(av,au)}else{var aC="The method '"+aA+'\' was not found in "_paq" variable. Please have a look at the Matomo tracker documentation: https://developer.matomo.org/api-reference/tracking-javascript'; - ao(aC);if(!aB){throw new TypeError(aC)}}if(aA==="addTracker"){break}if(aA==="setTrackerUrl"||aA==="setSiteId"){break}}else{aA.apply(L[ax],au)}}}}}function ar(aw,av,au,at){if(aw.addEventListener){aw.addEventListener(av,au,at);return true}if(aw.attachEvent){return aw.attachEvent("on"+av,au)}aw["on"+av]=au}function n(at){if(J.readyState==="complete"){at()}else{if(W.addEventListener){W.addEventListener("load",at,false)}else{if(W.attachEvent){W.attachEvent("onload",at)}}}}function q(aw){var at=false;if(J.attachEvent){at=J.readyState==="complete"}else{at=J.readyState!=="loading"}if(at){aw();return}var av;if(J.addEventListener){ar(J,"DOMContentLoaded",function au(){J.removeEventListener("DOMContentLoaded",au,false);if(!at){at=true;aw()}})}else{if(J.attachEvent){J.attachEvent("onreadystatechange",function au(){if(J.readyState==="complete"){J.detachEvent("onreadystatechange",au);if(!at){at=true;aw()}}});if(J.documentElement.doScroll&&W===W.top){(function au(){if(!at){try{J.documentElement.doScroll("left") -}catch(ax){setTimeout(au,0);return}at=true;aw()}}())}}}ar(W,"load",function(){if(!at){at=true;aw()}},false)}function ag(au,az,aA){if(!au){return""}var at="",aw,av,ax,ay;for(aw in b){if(Object.prototype.hasOwnProperty.call(b,aw)){ay=b[aw]&&"function"===typeof b[aw][au];if(ay){av=b[aw][au];ax=av(az||{},aA);if(ax){at+=ax}}}}return at}function am(au){var at;m=true;ag("unload");at=new Date();var av=at.getTimeAlias();if((r-av)>3000){r=av+3000}if(r){do{at=new Date()}while(at.getTimeAlias()=0;ay--){ax=az[ay].split("=")[0];if(ax===av){az.splice(ay,1)}}var aC=az.join("&");if(aC){aA=aA+"?"+aC}if(aB){aA+="#"+aB}}return aA}function e(av,au){var at="[\\?&#]"+au+"=([^&#]*)";var ax=new RegExp(at);var aw=ax.exec(av);return aw?p(aw[1]):""}function a(at){if(at&&String(at)===at){return at.replace(/^\s+|\s+$/g,"")}return at}function F(at){return unescape(t(at))}function aq(aI){var av=function(aO,aN){return(aO<>>(32-aN))},aJ=function(aQ){var aO="",aP,aN;for(aP=7;aP>=0;aP--){aN=(aQ>>>(aP*4))&15; - aO+=aN.toString(16)}return aO},ay,aL,aK,au=[],aC=1732584193,aA=4023233417,az=2562383102,ax=271733878,aw=3285377520,aH,aG,aF,aE,aD,aM,at,aB=[];aI=F(aI);at=aI.length;for(aL=0;aL>>29);aB.push((at<<3)&4294967295);for(ay=0;ayay.offsetWidth+ay.scrollLeft||aA+aD-aEay.offsetHeight+ay.scrollTop||aF+aB-aEaB?-1:1});if(at.length<=1){return at}var au=0;var aw=0;var ax=[];var av;av=at[au++];while(av){if(av===at[au]){aw=ax.push(au)}av=at[au++]||null}while(aw--){at.splice(ax[aw],1)}return at},getAttributeValueFromNode:function(ax,av){if(!this.hasNodeAttribute(ax,av)){return}if(ax&&ax.getAttribute){return ax.getAttribute(av)}if(!ax||!ax.attributes){return}var aw=(typeof ax.attributes[av]);if("undefined"===aw){return}if(ax.attributes[av].value){return ax.attributes[av].value}if(ax.attributes[av].nodeValue){return ax.attributes[av].nodeValue}var au;var at=ax.attributes;if(!at){return}for(au=0;au1000){break}at++}},findPieceNode:function(au){var at; - at=ai.findFirstNodeHavingAttribute(au,this.CONTENT_PIECE_ATTR);if(!at){at=ai.findFirstNodeHavingClass(au,this.CONTENT_PIECE_CLASS)}if(!at){at=ai.findFirstNodeHavingClass(au,this.LEGACY_CONTENT_PIECE_CLASS)}if(at){return at}return au},findTargetNodeNoDefault:function(at){if(!at){return}var au=ai.findFirstNodeHavingAttributeWithValue(at,this.CONTENT_TARGET_ATTR);if(au){return au}au=ai.findFirstNodeHavingAttribute(at,this.CONTENT_TARGET_ATTR);if(au){return au}au=ai.findFirstNodeHavingClass(at,this.CONTENT_TARGET_CLASS);if(au){return au}au=ai.findFirstNodeHavingClass(at,this.LEGACY_CONTENT_TARGET_CLASS);if(au){return au}},findTargetNode:function(at){var au=this.findTargetNodeNoDefault(at);if(au){return au}return at},findContentName:function(au){if(!au){return}var ax=ai.findFirstNodeHavingAttributeWithValue(au,this.CONTENT_NAME_ATTR);if(ax){return ai.getAttributeValueFromNode(ax,this.CONTENT_NAME_ATTR)}var at=this.findContentPiece(au);if(at){return this.removeDomainIfIsInLink(at)}if(ai.hasNodeAttributeWithValue(au,"title")){return ai.getAttributeValueFromNode(au,"title") - }var av=this.findPieceNode(au);if(ai.hasNodeAttributeWithValue(av,"title")){return ai.getAttributeValueFromNode(av,"title")}var aw=this.findTargetNode(au);if(ai.hasNodeAttributeWithValue(aw,"title")){return ai.getAttributeValueFromNode(aw,"title")}},findContentPiece:function(au){if(!au){return}var aw=ai.findFirstNodeHavingAttributeWithValue(au,this.CONTENT_PIECE_ATTR);if(aw){return ai.getAttributeValueFromNode(aw,this.CONTENT_PIECE_ATTR)}var at=this.findPieceNode(au);var av=this.findMediaUrlInNode(at);if(av){return this.toAbsoluteUrl(av)}},findContentTarget:function(av){if(!av){return}var aw=this.findTargetNode(av);if(ai.hasNodeAttributeWithValue(aw,this.CONTENT_TARGET_ATTR)){return ai.getAttributeValueFromNode(aw,this.CONTENT_TARGET_ATTR)}var au;if(ai.hasNodeAttributeWithValue(aw,"href")){au=ai.getAttributeValueFromNode(aw,"href");return this.toAbsoluteUrl(au)}var at=this.findPieceNode(av);if(ai.hasNodeAttributeWithValue(at,"href")){au=ai.getAttributeValueFromNode(at,"href");return this.toAbsoluteUrl(au) - }},isSameDomain:function(at){if(!at||!at.indexOf){return false}if(0===at.indexOf(this.getLocation().origin)){return true}var au=at.indexOf(this.getLocation().host);if(8>=au&&0<=au){return true}return false},removeDomainIfIsInLink:function(av){var au="^https?://[^/]+";var at="^.*//[^/]+";if(av&&av.search&&-1!==av.search(new RegExp(au))&&this.isSameDomain(av)){av=av.replace(new RegExp(at),"");if(!av){av="/"}}return av},findMediaUrlInNode:function(ax){if(!ax){return}var av=["img","embed","video","audio"];var at=ax.nodeName.toLowerCase();if(-1!==P(av,at)&&ai.findFirstNodeHavingAttributeWithValue(ax,"src")){var aw=ai.findFirstNodeHavingAttributeWithValue(ax,"src");return ai.getAttributeValueFromNode(aw,"src")}if(at==="object"&&ai.hasNodeAttributeWithValue(ax,"data")){return ai.getAttributeValueFromNode(ax,"data")}if(at==="object"){var ay=ai.findNodesByTagName(ax,"param");if(ay&&ay.length){var au;for(au=0;au0}var au=aw.clientWidth;if(W.innerWidth&&au>W.innerWidth){au=W.innerWidth}var at=aw.clientHeight;if(W.innerHeight&&at>W.innerHeight){at=W.innerHeight}return((ax.bottom>0||av)&&ax.right>0&&ax.left=0)&&aH(dx)!==String(dy)){var dt="There was an error setting cookie `"+dx+"`. Please check domain and path.";ao(dt)}}function b8(dt){var dv,du;dt=j(dt,az);for(du=0;du=0){dv=dv.slice(0,du)}du=dv.lastIndexOf("/");if(du!==dv.length-1){dv=dv.slice(0,du+1)}return dv+dt}function cP(dv,dt){var du;dv=String(dv).toLowerCase();dt=String(dt).toLowerCase(); - if(dv===dt){return true}if(dt.slice(0,1)==="."){if(dv===dt.slice(1)){return true}du=dv.length-dt.length;if((du>0)&&(dv.slice(du)===dt)){return true}}return false}function cr(dt){var du=document.createElement("a");if(dt.indexOf("//")!==0&&dt.indexOf("http")!==0){if(dt.indexOf("*")===0){dt=dt.substr(1)}if(dt.indexOf(".")===0){dt=dt.substr(1)}dt="http://"+dt}du.href=w.toAbsoluteUrl(dt);if(du.pathname){return du.pathname}return""}function a9(du,dt){if(!an(dt,"/")){dt="/"+dt}if(!an(du,"/")){du="/"+du}var dv=(dt==="/"||dt==="/*");if(dv){return true}if(du===dt){return true}dt=String(dt).toLowerCase();du=String(du).toLowerCase();if(U(dt,"*")){dt=dt.slice(0,-1);dv=(!dt||dt==="/");if(dv){return true}if(du===dt){return true}return du.indexOf(dt)===0}if(!U(du,"/")){du+="/"}if(!U(dt,"/")){dt+="/"}return du.indexOf(dt)===0}function aw(dx,dz){var du,dt,dv,dw,dy;for(du=0;du0)&&(dw.slice(dv)===dt)){return true}}}return false}function cv(dt,dv){dt=dt.replace("send_image=0","send_image=1");var du=new Image(1,1);du.onload=function(){H=0;if(typeof dv==="function"){dv({request:dt,trackerUrl:aI,success:true})}};du.onerror=function(){if(typeof dv==="function"){dv({request:dt,trackerUrl:aI,success:false})}};du.src=aI+(aI.indexOf("?")<0?"?":"&")+dt}function cM(dt){if(dj==="POST"){return true}return dt&&(dt.length>2000||dt.indexOf('{"requests"')===0)}function aP(){return"object"===typeof g&&"function"===typeof g.sendBeacon&&"function"===typeof Blob}function bc(dx,dA,dz){var dv=aP();if(!dv){return false}var dw={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dB=false;var du=aI;try{var dt=new Blob([dx],dw);if(dz&&!cM(dx)){dt=new Blob([],dw);du=du+(du.indexOf("?")<0?"?":"&")+dx}dB=g.sendBeacon(du,dt)}catch(dy){return false - }if(dB&&typeof dA==="function"){dA({request:dx,trackerUrl:aI,success:true,isSendBeacon:true})}return dB}function de(du,dv,dt){if(!M(dt)||null===dt){dt=true}if(m&&bc(du,dv,dt)){return}setTimeout(function(){if(m&&bc(du,dv,dt)){return}var dy;try{var dx=W.XMLHttpRequest?new W.XMLHttpRequest():W.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dx.open("POST",aI,true);dx.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dz=m&&bc(du,dv,dt);if(!dz&&dt){cv(du,dv)}else{if(typeof dv==="function"){dv({request:du,trackerUrl:aI,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dv==="function")){dv({request:du,trackerUrl:aI,success:true,xhr:this})}}};dx.setRequestHeader("Content-Type",cE);dx.withCredentials=true;dx.send(du)}catch(dw){dy=m&&bc(du,dv,dt);if(!dy&&dt){cv(du,dv)}else{if(typeof dv==="function"){dv({request:du,trackerUrl:aI,success:false})}}}},50)}function cl(du){var dt=new Date();var dv=dt.getTime()+du;if(!r||dv>r){r=dv}}function bg(){bi=true; - cF=new Date().getTime()}function dm(){var dt=new Date().getTime();return !cF||(dt-cF)>bb}function aD(){if(dm()){bX()}}function a0(){if(J.visibilityState==="hidden"&&dm()){bX()}else{if(J.visibilityState==="visible"){cF=new Date().getTime()}}}function dq(){if(aS||!bb){return}aS=true;ar(W,"focus",bg);ar(W,"blur",aD);ar(W,"visibilitychange",a0);af++;u.addPlugin("HeartBeat"+af,{unload:function(){if(aS&&dm()){bX()}}})}function cK(dx){var du=new Date();var dt=du.getTime();c8=dt;if(cJ&&dt=dt.length){return[dt]}var du=0;var dv=dt.length;var dw=[]; - for(du;du=du&&dt<=(du+a5)){return true}}return false}function dr(dt){if(!cV){return""}var dx=e(dt,az);if(!dx){return""}dx=String(dx);var dv=new RegExp("^[a-zA-Z0-9]+$");if(dx.length===32&&dv.test(dx)){var du=dx.substr(16,32);if(dc(du)){var dw=dx.substr(0,16);return dw}}return""}function cW(){if(!bU){bU=dr(bT)}var dv=new Date(),dt=Math.round(dv.getTime()/1000),du=aY("id"),dy=aH(du),dx,dw;if(dy){dx=dy.split(".");dx.unshift("0");if(bU.length){dx[1]=bU}return dx}if(bU.length){dw=bU}else{if("0"===cb()){dw=""}else{dw=cZ()}}dx=["1",dw,dt];return dx}function a4(){var dw=cW(),du=dw[0],dv=dw[1],dt=dw[2];return{newVisitor:du,uuid:dv,createTs:dt}}function aL(){var dw=new Date(),du=dw.getTime(),dx=a4().createTs;var dt=parseInt(dx,10);var dv=(dt*1000)+cS-du;return dv}function aR(dt){if(!cc){return}var dv=new Date(),du=Math.round(dv.getTime()/1000);if(!M(dt)){dt=a4()}var dw=dt.uuid+"."+dt.createTs+".";dn(aY("id"),dw,aL(),bw,c7,bY,aN) - }function bS(){var dt=aH(aY("ref"));if(dt.length){try{dt=W.JSON.parse(dt);if(Z(dt)){return dt}}catch(du){}}return["","",0,""]}function bD(dv){var du=bq+"testcookie_domain";var dt="testvalue";dn(du,dt,10000,null,dv,bY,aN);if(aH(du)===dt){b5(du,null,dv);return true}return false}function aJ(){var du=bs;bs=false;var dt,dv;for(dt=0;dt0){dx=parseInt(dx,10);dA(dx)}})}var bK={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var dt=this.requests;this.requests=[];if(dt.length===1){bM(dt[0],bQ)}else{dp(dt,bQ)}},canQueue:function(){return !m&&this.enabled},pushMultiple:function(du){if(!this.canQueue()){dp(du,bQ);return}var dt;for(dt=0;dt0){if(!M(du)){du=""}if(!x(du)){du=String(du)}bt[dt]=du}};this.getCustomDimension=function(dt){dt=parseInt(dt,10);if(dt>0&&Object.prototype.hasOwnProperty.call(bt,dt)){return bt[dt]}};this.deleteCustomDimension=function(dt){dt=parseInt(dt,10);if(dt>0){delete bt[dt]}};this.setCustomVariable=function(du,dt,dx,dv){var dw;if(!M(dv)){dv="visit"}if(!M(dt)){return}if(!M(dx)){dx=""}if(du>0){dt=!x(dt)?String(dt):dt;dx=!x(dx)?String(dx):dx;dw=[dt.slice(0,bA),dx.slice(0,bA)];if(dv==="visit"||dv===2){cN();aV[du]=dw}else{if(dv==="page"||dv===3){b2[du]=dw}else{if(dv==="event"){cs[du]=dw}}}}};this.getCustomVariable=function(du,dv){var dt;if(!M(dv)){dv="visit"}if(dv==="page"||dv===3){dt=b2[du]}else{if(dv==="event"){dt=cs[du]}else{if(dv==="visit"||dv===2){cN(); - dt=aV[du]}}}if(!M(dt)||(dt&&dt[0]==="")){return false}return dt};this.deleteCustomVariable=function(dt,du){if(this.getCustomVariable(dt,du)){this.setCustomVariable(dt,"","",du)}};this.deleteCustomVariables=function(dt){if(dt==="page"||dt===3){b2={}}else{if(dt==="event"){cs={}}else{if(dt==="visit"||dt===2){aV={}}}}};this.storeCustomVariablesInCookie=function(){bW=true};this.setLinkTrackingTimer=function(dt){bQ=dt};this.getLinkTrackingTimer=function(){return bQ};this.setDownloadExtensions=function(dt){if(x(dt)){dt=dt.split("|")}dg=dt};this.addDownloadExtensions=function(du){var dt;if(x(du)){du=du.split("|")}for(dt=0;dt1&&au!=="addTracker"&&au!=="enableLinkTracking"){ao("The method "+au+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Matomo trackers documentation: https://developer.matomo.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}az[au]++}}}}return ay}var E=["addTracker","forgetCookieConsentGiven","requireCookieConsent","disableBrowserFeatureDetection","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setCookieNamePrefix","setCookieSameSite","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setVisitorId","setSiteId","alwaysUseSendBeacon","disableAlwaysUseSendBeacon","enableLinkTracking","setCookieConsentGiven","requireConsent","setConsentGiven","disablePerformanceTracking","setPagePerformanceTiming","setExcludedQueryParams"]; - function ah(av,au){var at=new T(av,au);L.push(at);_paq=c(_paq,E);for(H=0;H<_paq.length;H++){if(_paq[H]){aj(_paq[H])}}_paq=new K();u.trigger("TrackerAdded",[at]);return at}ar(W,"beforeunload",am,false);ar(W,"visibilitychange",function(){if(m){return}if(J.visibilityState==="hidden"){ag("unload")}},false);ar(W,"online",function(){if(M(g.serviceWorker)){g.serviceWorker.ready.then(function(at){if(at&&at.sync){return at.sync.register("matomoSync")}},function(){})}},false);ar(W,"message",function(ay){if(!ay||!ay.origin){return}var aA,aw,au;var aB=d(ay.origin);var ax=u.getAsyncTrackers();for(aw=0;aw 0; + if (aw) { + az = aA.split('::'); + av = az[0]; + aA = az[1]; + if ('object' === typeof u[av] && 'function' === typeof u[av][aA]) { + u[av][aA].apply(u[av], au); + } else { + if (at) { + al.push(at); + } + } + } else { + for (ax = 0; ax < L.length; ax++) { + if (x(aA)) { + av = L[ax]; + var aB = aA.indexOf('.') > 0; + if (aB) { + az = aA.split('.'); + if (av && 'object' === typeof av[az[0]]) { + av = av[az[0]]; + aA = az[1]; + } else { + if (at) { + al.push(at); + break; + } + } + } + if (av[aA]) { + av[aA].apply(av, au); + } else { + var aC = + "The method '" + + aA + + '\' was not found in "_paq" variable. Please have a look at the Matomo tracker documentation: https://developer.matomo.org/api-reference/tracking-javascript'; + ao(aC); + if (!aB) { + throw new TypeError(aC); + } + } + if (aA === 'addTracker') { + break; + } + if (aA === 'setTrackerUrl' || aA === 'setSiteId') { + break; + } + } else { + aA.apply(L[ax], au); + } + } + } + } + } + function ar(aw, av, au, at) { + if (aw.addEventListener) { + aw.addEventListener(av, au, at); + return true; + } + if (aw.attachEvent) { + return aw.attachEvent('on' + av, au); + } + aw['on' + av] = au; + } + function n(at) { + if (J.readyState === 'complete') { + at(); + } else { + if (W.addEventListener) { + W.addEventListener('load', at, false); + } else { + if (W.attachEvent) { + W.attachEvent('onload', at); + } + } + } + } + function q(aw) { + var at = false; + if (J.attachEvent) { + at = J.readyState === 'complete'; + } else { + at = J.readyState !== 'loading'; + } + if (at) { + aw(); + return; + } + var av; + if (J.addEventListener) { + ar(J, 'DOMContentLoaded', function au() { + J.removeEventListener('DOMContentLoaded', au, false); + if (!at) { + at = true; + aw(); + } + }); + } else { + if (J.attachEvent) { + J.attachEvent('onreadystatechange', function au() { + if (J.readyState === 'complete') { + J.detachEvent('onreadystatechange', au); + if (!at) { + at = true; + aw(); + } + } + }); + if (J.documentElement.doScroll && W === W.top) { + (function au() { + if (!at) { + try { + J.documentElement.doScroll('left'); + } catch (ax) { + setTimeout(au, 0); + return; + } + at = true; + aw(); + } + })(); + } + } + } + ar( + W, + 'load', + function () { + if (!at) { + at = true; + aw(); + } + }, + false + ); + } + function ag(au, az, aA) { + if (!au) { + return ''; + } + var at = '', + aw, + av, + ax, + ay; + for (aw in b) { + if (Object.prototype.hasOwnProperty.call(b, aw)) { + ay = b[aw] && 'function' === typeof b[aw][au]; + if (ay) { + av = b[aw][au]; + ax = av(az || {}, aA); + if (ax) { + at += ax; + } + } + } + } + return at; + } + function am(au) { + var at; + m = true; + ag('unload'); + at = new Date(); + var av = at.getTimeAlias(); + if (r - av > 3000) { + r = av + 3000; + } + if (r) { + do { + at = new Date(); + } while (at.getTimeAlias() < r); + } + } + function o(av, au) { + var at = J.createElement('script'); + at.type = 'text/javascript'; + at.src = av; + if (at.readyState) { + at.onreadystatechange = function () { + var aw = this.readyState; + if (aw === 'loaded' || aw === 'complete') { + at.onreadystatechange = null; + au(); + } + }; + } else { + at.onload = au; + } + J.getElementsByTagName('head')[0].appendChild(at); + } + function N() { + var at = ''; + try { + at = W.top.document.referrer; + } catch (av) { + if (W.parent) { + try { + at = W.parent.document.referrer; + } catch (au) { + at = ''; + } + } + } + if (at === '') { + at = J.referrer; + } + return at; + } + function s(at) { + var av = new RegExp('^([a-z]+):'), + au = av.exec(at); + return au ? au[1] : null; + } + function d(at) { + var av = new RegExp('^(?:(?:https?|ftp):)/*(?:[^@]+@)?([^:/#]+)'), + au = av.exec(at); + return au ? au[1] : at; + } + function G(at) { + return /^[0-9][0-9]*(\.[0-9]+)?$/.test(at); + } + function Q(av, aw) { + var at = {}, + au; + for (au in av) { + if (av.hasOwnProperty(au) && aw(av[au])) { + at[au] = av[au]; + } + } + return at; + } + function B(av) { + var at = {}, + au; + for (au in av) { + if (av.hasOwnProperty(au)) { + if (G(av[au])) { + at[au] = Math.round(av[au]); + } else { + throw new Error( + 'Parameter "' + + au + + '" provided value "' + + av[au] + + '" is not valid. Please provide a numeric value.' + ); + } + } + } + return at; + } + function l(au) { + var av = '', + at; + for (at in au) { + if (au.hasOwnProperty(at)) { + av += '&' + t(at) + '=' + t(au[at]); + } + } + return av; + } + function an(au, at) { + au = String(au); + return au.lastIndexOf(at, 0) === 0; + } + function U(au, at) { + au = String(au); + return au.indexOf(at, au.length - at.length) !== -1; + } + function A(au, at) { + au = String(au); + return au.indexOf(at) !== -1; + } + function f(au, at) { + au = String(au); + return au.substr(0, au.length - at); + } + function I(aw, av, ay) { + aw = String(aw); + if (!ay) { + ay = ''; + } + var at = aw.indexOf('#'); + var az = aw.length; + if (at === -1) { + at = az; + } + var ax = aw.substr(0, at); + var au = aw.substr(at, az - at); + if (ax.indexOf('?') === -1) { + ax += '?'; + } else { + if (!U(ax, '?')) { + ax += '&'; + } + } + return ax + t(av) + '=' + t(ay) + au; + } + function j(au, av) { + au = String(au); + if ( + au.indexOf('?' + av + '=') === -1 && + au.indexOf('&' + av + '=') === -1 + ) { + return au; + } + var aw = au.indexOf('?'); + if (aw === -1) { + return au; + } + var at = au.substr(aw + 1); + var aA = au.substr(0, aw); + if (at) { + var aB = ''; + var aD = at.indexOf('#'); + if (aD !== -1) { + aB = at.substr(aD + 1); + at = at.substr(0, aD); + } + var ax; + var az = at.split('&'); + var ay = az.length - 1; + for (ay; ay >= 0; ay--) { + ax = az[ay].split('=')[0]; + if (ax === av) { + az.splice(ay, 1); + } + } + var aC = az.join('&'); + if (aC) { + aA = aA + '?' + aC; + } + if (aB) { + aA += '#' + aB; + } + } + return aA; + } + function e(av, au) { + var at = '[\\?&#]' + au + '=([^&#]*)'; + var ax = new RegExp(at); + var aw = ax.exec(av); + return aw ? p(aw[1]) : ''; + } + function a(at) { + if (at && String(at) === at) { + return at.replace(/^\s+|\s+$/g, ''); + } + return at; + } + function F(at) { + return unescape(t(at)); + } + function aq(aI) { + var av = function (aO, aN) { + return (aO << aN) | (aO >>> (32 - aN)); + }, + aJ = function (aQ) { + var aO = '', + aP, + aN; + for (aP = 7; aP >= 0; aP--) { + aN = (aQ >>> (aP * 4)) & 15; + aO += aN.toString(16); + } + return aO; + }, + ay, + aL, + aK, + au = [], + aC = 1732584193, + aA = 4023233417, + az = 2562383102, + ax = 271733878, + aw = 3285377520, + aH, + aG, + aF, + aE, + aD, + aM, + at, + aB = []; + aI = F(aI); + at = aI.length; + for (aL = 0; aL < at - 3; aL += 4) { + aK = + (aI.charCodeAt(aL) << 24) | + (aI.charCodeAt(aL + 1) << 16) | + (aI.charCodeAt(aL + 2) << 8) | + aI.charCodeAt(aL + 3); + aB.push(aK); + } + switch (at & 3) { + case 0: + aL = 2147483648; + break; + case 1: + aL = (aI.charCodeAt(at - 1) << 24) | 8388608; + break; + case 2: + aL = + (aI.charCodeAt(at - 2) << 24) | + (aI.charCodeAt(at - 1) << 16) | + 32768; + break; + case 3: + aL = + (aI.charCodeAt(at - 3) << 24) | + (aI.charCodeAt(at - 2) << 16) | + (aI.charCodeAt(at - 1) << 8) | + 128; + break; + } + aB.push(aL); + while ((aB.length & 15) !== 14) { + aB.push(0); + } + aB.push(at >>> 29); + aB.push((at << 3) & 4294967295); + for (ay = 0; ay < aB.length; ay += 16) { + for (aL = 0; aL < 16; aL++) { + au[aL] = aB[ay + aL]; + } + for (aL = 16; aL <= 79; aL++) { + au[aL] = av(au[aL - 3] ^ au[aL - 8] ^ au[aL - 14] ^ au[aL - 16], 1); + } + aH = aC; + aG = aA; + aF = az; + aE = ax; + aD = aw; + for (aL = 0; aL <= 19; aL++) { + aM = + (av(aH, 5) + ((aG & aF) | (~aG & aE)) + aD + au[aL] + 1518500249) & + 4294967295; + aD = aE; + aE = aF; + aF = av(aG, 30); + aG = aH; + aH = aM; + } + for (aL = 20; aL <= 39; aL++) { + aM = + (av(aH, 5) + (aG ^ aF ^ aE) + aD + au[aL] + 1859775393) & + 4294967295; + aD = aE; + aE = aF; + aF = av(aG, 30); + aG = aH; + aH = aM; + } + for (aL = 40; aL <= 59; aL++) { + aM = + (av(aH, 5) + + ((aG & aF) | (aG & aE) | (aF & aE)) + + aD + + au[aL] + + 2400959708) & + 4294967295; + aD = aE; + aE = aF; + aF = av(aG, 30); + aG = aH; + aH = aM; + } + for (aL = 60; aL <= 79; aL++) { + aM = + (av(aH, 5) + (aG ^ aF ^ aE) + aD + au[aL] + 3395469782) & + 4294967295; + aD = aE; + aE = aF; + aF = av(aG, 30); + aG = aH; + aH = aM; + } + aC = (aC + aH) & 4294967295; + aA = (aA + aG) & 4294967295; + az = (az + aF) & 4294967295; + ax = (ax + aE) & 4294967295; + aw = (aw + aD) & 4294967295; + } + aM = aJ(aC) + aJ(aA) + aJ(az) + aJ(ax) + aJ(aw); + return aM.toLowerCase(); + } + function ae(av, at, au) { + if (!av) { + av = ''; + } + if (!at) { + at = ''; + } + if (av === 'translate.googleusercontent.com') { + if (au === '') { + au = at; + } + at = e(at, 'u'); + av = d(at); + } else { + if ( + av === 'cc.bingj.com' || + av === 'webcache.googleusercontent.com' || + av.slice(0, 5) === '74.6.' + ) { + at = J.links[0].href; + av = d(at); + } + } + return [av, at, au]; + } + function O(au) { + var at = au.length; + if (au.charAt(--at) === '.') { + au = au.slice(0, at); + } + if (au.slice(0, 2) === '*.') { + au = au.slice(1); + } + if (au.indexOf('/') !== -1) { + au = au.substr(0, au.indexOf('/')); + } + return au; + } + function ap(au) { + au = au && au.text ? au.text : au; + if (!x(au)) { + var at = J.getElementsByTagName('title'); + if (at && M(at[0])) { + au = at[0].text; + } + } + return au; + } + function S(at) { + if (!at) { + return []; + } + if (!M(at.children) && M(at.childNodes)) { + return at.children; + } + if (M(at.children)) { + return at.children; + } + return []; + } + function Y(au, at) { + if (!au || !at) { + return false; + } + if (au.contains) { + return au.contains(at); + } + if (au === at) { + return true; + } + if (au.compareDocumentPosition) { + return !!(au.compareDocumentPosition(at) & 16); + } + return false; + } + function P(av, aw) { + if (av && av.indexOf) { + return av.indexOf(aw); + } + if (!M(av) || av === null) { + return -1; + } + if (!av.length) { + return -1; + } + var at = av.length; + if (at === 0) { + return -1; + } + var au = 0; + while (au < at) { + if (av[au] === aw) { + return au; + } + au++; + } + return -1; + } + function i(av) { + if (!av) { + return false; + } + function at(ax, ay) { + if (W.getComputedStyle) { + return J.defaultView.getComputedStyle(ax, null)[ay]; + } + if (ax.currentStyle) { + return ax.currentStyle[ay]; + } + } + function aw(ax) { + ax = ax.parentNode; + while (ax) { + if (ax === J) { + return true; + } + ax = ax.parentNode; + } + return false; + } + function au(az, aF, ax, aC, aA, aD, aB) { + var ay = az.parentNode, + aE = 1; + if (!aw(az)) { + return false; + } + if (9 === ay.nodeType) { + return true; + } + if ( + '0' === at(az, 'opacity') || + 'none' === at(az, 'display') || + 'hidden' === at(az, 'visibility') + ) { + return false; + } + if (!M(aF) || !M(ax) || !M(aC) || !M(aA) || !M(aD) || !M(aB)) { + aF = az.offsetTop; + aA = az.offsetLeft; + aC = aF + az.offsetHeight; + ax = aA + az.offsetWidth; + aD = az.offsetWidth; + aB = az.offsetHeight; + } + if ( + av === az && + (0 === aB || 0 === aD) && + 'hidden' === at(az, 'overflow') + ) { + return false; + } + if (ay) { + if ( + 'hidden' === at(ay, 'overflow') || + 'scroll' === at(ay, 'overflow') + ) { + if ( + aA + aE > ay.offsetWidth + ay.scrollLeft || + aA + aD - aE < ay.scrollLeft || + aF + aE > ay.offsetHeight + ay.scrollTop || + aF + aB - aE < ay.scrollTop + ) { + return false; + } + } + if (az.offsetParent === ay) { + aA += ay.offsetLeft; + aF += ay.offsetTop; + } + return au(ay, aF, ax, aC, aA, aD, aB); + } + return true; + } + return au(av); + } + var ai = { + htmlCollectionToArray: function (av) { + var at = [], + au; + if (!av || !av.length) { + return at; + } + for (au = 0; au < av.length; au++) { + at.push(av[au]); + } + return at; + }, + find: function (at) { + if (!document.querySelectorAll || !at) { + return []; + } + var au = document.querySelectorAll(at); + return this.htmlCollectionToArray(au); + }, + findMultiple: function (av) { + if (!av || !av.length) { + return []; + } + var au, aw; + var at = []; + for (au = 0; au < av.length; au++) { + aw = this.find(av[au]); + at = at.concat(aw); + } + at = this.makeNodesUnique(at); + return at; + }, + findNodesByTagName: function (au, at) { + if (!au || !at || !au.getElementsByTagName) { + return []; + } + var av = au.getElementsByTagName(at); + return this.htmlCollectionToArray(av); + }, + makeNodesUnique: function (at) { + var ay = [].concat(at); + at.sort(function (aA, az) { + if (aA === az) { + return 0; + } + var aC = P(ay, aA); + var aB = P(ay, az); + if (aC === aB) { + return 0; + } + return aC > aB ? -1 : 1; + }); + if (at.length <= 1) { + return at; + } + var au = 0; + var aw = 0; + var ax = []; + var av; + av = at[au++]; + while (av) { + if (av === at[au]) { + aw = ax.push(au); + } + av = at[au++] || null; + } + while (aw--) { + at.splice(ax[aw], 1); + } + return at; + }, + getAttributeValueFromNode: function (ax, av) { + if (!this.hasNodeAttribute(ax, av)) { + return; + } + if (ax && ax.getAttribute) { + return ax.getAttribute(av); + } + if (!ax || !ax.attributes) { + return; + } + var aw = typeof ax.attributes[av]; + if ('undefined' === aw) { + return; + } + if (ax.attributes[av].value) { + return ax.attributes[av].value; + } + if (ax.attributes[av].nodeValue) { + return ax.attributes[av].nodeValue; + } + var au; + var at = ax.attributes; + if (!at) { + return; + } + for (au = 0; au < at.length; au++) { + if (at[au].nodeName === av) { + return at[au].nodeValue; + } + } + return null; + }, + hasNodeAttributeWithValue: function (au, at) { + var av = this.getAttributeValueFromNode(au, at); + return !!av; + }, + hasNodeAttribute: function (av, at) { + if (av && av.hasAttribute) { + return av.hasAttribute(at); + } + if (av && av.attributes) { + var au = typeof av.attributes[at]; + return 'undefined' !== au; + } + return false; + }, + hasNodeCssClass: function (av, at) { + if (av && at && av.className) { + var au = + typeof av.className === 'string' ? av.className.split(' ') : []; + if (-1 !== P(au, at)) { + return true; + } + } + return false; + }, + findNodesHavingAttribute: function (ax, av, at) { + if (!at) { + at = []; + } + if (!ax || !av) { + return at; + } + var aw = S(ax); + if (!aw || !aw.length) { + return at; + } + var au, ay; + for (au = 0; au < aw.length; au++) { + ay = aw[au]; + if (this.hasNodeAttribute(ay, av)) { + at.push(ay); + } + at = this.findNodesHavingAttribute(ay, av, at); + } + return at; + }, + findFirstNodeHavingAttribute: function (av, au) { + if (!av || !au) { + return; + } + if (this.hasNodeAttribute(av, au)) { + return av; + } + var at = this.findNodesHavingAttribute(av, au); + if (at && at.length) { + return at[0]; + } + }, + findFirstNodeHavingAttributeWithValue: function (aw, av) { + if (!aw || !av) { + return; + } + if (this.hasNodeAttributeWithValue(aw, av)) { + return aw; + } + var at = this.findNodesHavingAttribute(aw, av); + if (!at || !at.length) { + return; + } + var au; + for (au = 0; au < at.length; au++) { + if (this.getAttributeValueFromNode(at[au], av)) { + return at[au]; + } + } + }, + findNodesHavingCssClass: function (ax, aw, at) { + if (!at) { + at = []; + } + if (!ax || !aw) { + return at; + } + if (ax.getElementsByClassName) { + var ay = ax.getElementsByClassName(aw); + return this.htmlCollectionToArray(ay); + } + var av = S(ax); + if (!av || !av.length) { + return []; + } + var au, az; + for (au = 0; au < av.length; au++) { + az = av[au]; + if (this.hasNodeCssClass(az, aw)) { + at.push(az); + } + at = this.findNodesHavingCssClass(az, aw, at); + } + return at; + }, + findFirstNodeHavingClass: function (av, au) { + if (!av || !au) { + return; + } + if (this.hasNodeCssClass(av, au)) { + return av; + } + var at = this.findNodesHavingCssClass(av, au); + if (at && at.length) { + return at[0]; + } + }, + isLinkElement: function (au) { + if (!au) { + return false; + } + var at = String(au.nodeName).toLowerCase(); + var aw = ['a', 'area']; + var av = P(aw, at); + return av !== -1; + }, + setAnyAttribute: function (au, at, av) { + if (!au || !at) { + return; + } + if (au.setAttribute) { + au.setAttribute(at, av); + } else { + au[at] = av; + } + }, + }; + var w = { + CONTENT_ATTR: 'data-track-content', + CONTENT_CLASS: 'matomoTrackContent', + LEGACY_CONTENT_CLASS: 'piwikTrackContent', + CONTENT_NAME_ATTR: 'data-content-name', + CONTENT_PIECE_ATTR: 'data-content-piece', + CONTENT_PIECE_CLASS: 'matomoContentPiece', + LEGACY_CONTENT_PIECE_CLASS: 'piwikContentPiece', + CONTENT_TARGET_ATTR: 'data-content-target', + CONTENT_TARGET_CLASS: 'matomoContentTarget', + LEGACY_CONTENT_TARGET_CLASS: 'piwikContentTarget', + CONTENT_IGNOREINTERACTION_ATTR: 'data-content-ignoreinteraction', + CONTENT_IGNOREINTERACTION_CLASS: 'matomoContentIgnoreInteraction', + LEGACY_CONTENT_IGNOREINTERACTION_CLASS: 'piwikContentIgnoreInteraction', + location: undefined, + findContentNodes: function () { + var au = '.' + this.CONTENT_CLASS; + var av = '.' + this.LEGACY_CONTENT_CLASS; + var at = '[' + this.CONTENT_ATTR + ']'; + var aw = ai.findMultiple([au, av, at]); + return aw; + }, + findContentNodesWithinNode: function (aw) { + if (!aw) { + return []; + } + var au = ai.findNodesHavingCssClass(aw, this.CONTENT_CLASS); + au = ai.findNodesHavingCssClass(aw, this.LEGACY_CONTENT_CLASS, au); + var at = ai.findNodesHavingAttribute(aw, this.CONTENT_ATTR); + if (at && at.length) { + var av; + for (av = 0; av < at.length; av++) { + au.push(at[av]); + } + } + if (ai.hasNodeAttribute(aw, this.CONTENT_ATTR)) { + au.push(aw); + } else { + if (ai.hasNodeCssClass(aw, this.CONTENT_CLASS)) { + au.push(aw); + } else { + if (ai.hasNodeCssClass(aw, this.LEGACY_CONTENT_CLASS)) { + au.push(aw); + } + } + } + au = ai.makeNodesUnique(au); + return au; + }, + findParentContentNode: function (au) { + if (!au) { + return; + } + var av = au; + var at = 0; + while (av && av !== J && av.parentNode) { + if (ai.hasNodeAttribute(av, this.CONTENT_ATTR)) { + return av; + } + if (ai.hasNodeCssClass(av, this.CONTENT_CLASS)) { + return av; + } + if (ai.hasNodeCssClass(av, this.LEGACY_CONTENT_CLASS)) { + return av; + } + av = av.parentNode; + if (at > 1000) { + break; + } + at++; + } + }, + findPieceNode: function (au) { + var at; + at = ai.findFirstNodeHavingAttribute(au, this.CONTENT_PIECE_ATTR); + if (!at) { + at = ai.findFirstNodeHavingClass(au, this.CONTENT_PIECE_CLASS); + } + if (!at) { + at = ai.findFirstNodeHavingClass(au, this.LEGACY_CONTENT_PIECE_CLASS); + } + if (at) { + return at; + } + return au; + }, + findTargetNodeNoDefault: function (at) { + if (!at) { + return; + } + var au = ai.findFirstNodeHavingAttributeWithValue( + at, + this.CONTENT_TARGET_ATTR + ); + if (au) { + return au; + } + au = ai.findFirstNodeHavingAttribute(at, this.CONTENT_TARGET_ATTR); + if (au) { + return au; + } + au = ai.findFirstNodeHavingClass(at, this.CONTENT_TARGET_CLASS); + if (au) { + return au; + } + au = ai.findFirstNodeHavingClass(at, this.LEGACY_CONTENT_TARGET_CLASS); + if (au) { + return au; + } + }, + findTargetNode: function (at) { + var au = this.findTargetNodeNoDefault(at); + if (au) { + return au; + } + return at; + }, + findContentName: function (au) { + if (!au) { + return; + } + var ax = ai.findFirstNodeHavingAttributeWithValue( + au, + this.CONTENT_NAME_ATTR + ); + if (ax) { + return ai.getAttributeValueFromNode(ax, this.CONTENT_NAME_ATTR); + } + var at = this.findContentPiece(au); + if (at) { + return this.removeDomainIfIsInLink(at); + } + if (ai.hasNodeAttributeWithValue(au, 'title')) { + return ai.getAttributeValueFromNode(au, 'title'); + } + var av = this.findPieceNode(au); + if (ai.hasNodeAttributeWithValue(av, 'title')) { + return ai.getAttributeValueFromNode(av, 'title'); + } + var aw = this.findTargetNode(au); + if (ai.hasNodeAttributeWithValue(aw, 'title')) { + return ai.getAttributeValueFromNode(aw, 'title'); + } + }, + findContentPiece: function (au) { + if (!au) { + return; + } + var aw = ai.findFirstNodeHavingAttributeWithValue( + au, + this.CONTENT_PIECE_ATTR + ); + if (aw) { + return ai.getAttributeValueFromNode(aw, this.CONTENT_PIECE_ATTR); + } + var at = this.findPieceNode(au); + var av = this.findMediaUrlInNode(at); + if (av) { + return this.toAbsoluteUrl(av); + } + }, + findContentTarget: function (av) { + if (!av) { + return; + } + var aw = this.findTargetNode(av); + if (ai.hasNodeAttributeWithValue(aw, this.CONTENT_TARGET_ATTR)) { + return ai.getAttributeValueFromNode(aw, this.CONTENT_TARGET_ATTR); + } + var au; + if (ai.hasNodeAttributeWithValue(aw, 'href')) { + au = ai.getAttributeValueFromNode(aw, 'href'); + return this.toAbsoluteUrl(au); + } + var at = this.findPieceNode(av); + if (ai.hasNodeAttributeWithValue(at, 'href')) { + au = ai.getAttributeValueFromNode(at, 'href'); + return this.toAbsoluteUrl(au); + } + }, + isSameDomain: function (at) { + if (!at || !at.indexOf) { + return false; + } + if (0 === at.indexOf(this.getLocation().origin)) { + return true; + } + var au = at.indexOf(this.getLocation().host); + if (8 >= au && 0 <= au) { + return true; + } + return false; + }, + removeDomainIfIsInLink: function (av) { + var au = '^https?://[^/]+'; + var at = '^.*//[^/]+'; + if ( + av && + av.search && + -1 !== av.search(new RegExp(au)) && + this.isSameDomain(av) + ) { + av = av.replace(new RegExp(at), ''); + if (!av) { + av = '/'; + } + } + return av; + }, + findMediaUrlInNode: function (ax) { + if (!ax) { + return; + } + var av = ['img', 'embed', 'video', 'audio']; + var at = ax.nodeName.toLowerCase(); + if ( + -1 !== P(av, at) && + ai.findFirstNodeHavingAttributeWithValue(ax, 'src') + ) { + var aw = ai.findFirstNodeHavingAttributeWithValue(ax, 'src'); + return ai.getAttributeValueFromNode(aw, 'src'); + } + if (at === 'object' && ai.hasNodeAttributeWithValue(ax, 'data')) { + return ai.getAttributeValueFromNode(ax, 'data'); + } + if (at === 'object') { + var ay = ai.findNodesByTagName(ax, 'param'); + if (ay && ay.length) { + var au; + for (au = 0; au < ay.length; au++) { + if ( + 'movie' === ai.getAttributeValueFromNode(ay[au], 'name') && + ai.hasNodeAttributeWithValue(ay[au], 'value') + ) { + return ai.getAttributeValueFromNode(ay[au], 'value'); + } + } + } + var az = ai.findNodesByTagName(ax, 'embed'); + if (az && az.length) { + return this.findMediaUrlInNode(az[0]); + } + } + }, + trim: function (at) { + return a(at); + }, + isOrWasNodeInViewport: function (ay) { + if (!ay || !ay.getBoundingClientRect || ay.nodeType !== 1) { + return true; + } + var ax = ay.getBoundingClientRect(); + var aw = J.documentElement || {}; + var av = ax.top < 0; + if (av && ay.offsetTop) { + av = ay.offsetTop + ax.height > 0; + } + var au = aw.clientWidth; + if (W.innerWidth && au > W.innerWidth) { + au = W.innerWidth; + } + var at = aw.clientHeight; + if (W.innerHeight && at > W.innerHeight) { + at = W.innerHeight; + } + return ( + (ax.bottom > 0 || av) && + ax.right > 0 && + ax.left < au && + (ax.top < at || av) + ); + }, + isNodeVisible: function (au) { + var at = i(au); + var av = this.isOrWasNodeInViewport(au); + return at && av; + }, + buildInteractionRequestParams: function (at, au, av, aw) { + var ax = ''; + if (at) { + ax += 'c_i=' + t(at); + } + if (au) { + if (ax) { + ax += '&'; + } + ax += 'c_n=' + t(au); + } + if (av) { + if (ax) { + ax += '&'; + } + ax += 'c_p=' + t(av); + } + if (aw) { + if (ax) { + ax += '&'; + } + ax += 'c_t=' + t(aw); + } + if (ax) { + ax += '&ca=1'; + } + return ax; + }, + buildImpressionRequestParams: function (at, au, av) { + var aw = 'c_n=' + t(at) + '&c_p=' + t(au); + if (av) { + aw += '&c_t=' + t(av); + } + if (aw) { + aw += '&ca=1'; + } + return aw; + }, + buildContentBlock: function (av) { + if (!av) { + return; + } + var at = this.findContentName(av); + var au = this.findContentPiece(av); + var aw = this.findContentTarget(av); + at = this.trim(at); + au = this.trim(au); + aw = this.trim(aw); + return { + name: at || 'Unknown', + piece: au || 'Unknown', + target: aw || '', + }; + }, + collectContent: function (aw) { + if (!aw || !aw.length) { + return []; + } + var av = []; + var at, au; + for (at = 0; at < aw.length; at++) { + au = this.buildContentBlock(aw[at]); + if (M(au)) { + av.push(au); + } + } + return av; + }, + setLocation: function (at) { + this.location = at; + }, + getLocation: function () { + var at = this.location || W.location; + if (!at.origin) { + at.origin = + at.protocol + '//' + at.hostname + (at.port ? ':' + at.port : ''); + } + return at; + }, + toAbsoluteUrl: function (au) { + if ((!au || String(au) !== au) && au !== '') { + return au; + } + if ('' === au) { + return this.getLocation().href; + } + if (au.search(/^\/\//) !== -1) { + return this.getLocation().protocol + au; + } + if (au.search(/:\/\//) !== -1) { + return au; + } + if (0 === au.indexOf('#')) { + return this.getLocation().origin + this.getLocation().pathname + au; + } + if (0 === au.indexOf('?')) { + return this.getLocation().origin + this.getLocation().pathname + au; + } + if (0 === au.search('^[a-zA-Z]{2,11}:')) { + return au; + } + if (au.search(/^\//) !== -1) { + return this.getLocation().origin + au; + } + var at = '(.*/)'; + var av = + this.getLocation().origin + + this.getLocation().pathname.match(new RegExp(at))[0]; + return av + au; + }, + isUrlToCurrentDomain: function (au) { + var av = this.toAbsoluteUrl(au); + if (!av) { + return false; + } + var at = this.getLocation().origin; + if (at === av) { + return true; + } + if (0 === String(av).indexOf(at)) { + if (':' === String(av).substr(at.length, 1)) { + return false; + } + return true; + } + return false; + }, + setHrefAttribute: function (au, at) { + if (!au || !at) { + return; + } + ai.setAnyAttribute(au, 'href', at); + }, + shouldIgnoreInteraction: function (at) { + if (ai.hasNodeAttribute(at, this.CONTENT_IGNOREINTERACTION_ATTR)) { + return true; + } + if (ai.hasNodeCssClass(at, this.CONTENT_IGNOREINTERACTION_CLASS)) { + return true; + } + if ( + ai.hasNodeCssClass(at, this.LEGACY_CONTENT_IGNOREINTERACTION_CLASS) + ) { + return true; + } + return false; + }, + }; + function aa(au, ax) { + if (ax) { + return ax; + } + au = w.toAbsoluteUrl(au); + if (A(au, '?')) { + var aw = au.indexOf('?'); + au = au.slice(0, aw); + } + if (U(au, 'matomo.php')) { + au = f(au, 'matomo.php'.length); + } else { + if (U(au, 'piwik.php')) { + au = f(au, 'piwik.php'.length); + } else { + if (U(au, '.php')) { + var at = au.lastIndexOf('/'); + var av = 1; + au = au.slice(0, at + av); + } + } + } + if (U(au, '/js/')) { + au = f(au, 'js/'.length); + } + return au; + } + function R(az) { + var aB = 'Matomo_Overlay'; + var au = new RegExp( + 'index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=[^&]*)?' + ); + var av = au.exec(J.referrer); + if (av) { + var ax = av[1]; + if (ax !== String(az)) { + return false; + } + var ay = av[2], + at = av[3], + aw = av[4]; + if (!aw) { + aw = ''; + } else { + if (aw.indexOf('&segment=') === 0) { + aw = aw.substr('&segment='.length); + } + } + W.name = aB + '###' + ay + '###' + at + '###' + aw; + } + var aA = W.name.split('###'); + return aA.length === 4 && aA[0] === aB; + } + function ad(au, az, av) { + var ay = W.name.split('###'), + ax = ay[1], + at = ay[2], + aw = ay[3], + aA = aa(au, az); + o(aA + 'plugins/Overlay/client/client.js?v=1', function () { + Matomo_Overlay_Client.initialize(aA, av, ax, at, aw); + }); + } + function v() { + var av; + try { + av = W.frameElement; + } catch (au) { + return true; + } + if (M(av)) { + return av && String(av.nodeName).toLowerCase() === 'iframe' + ? true + : false; + } + try { + return W.self !== W.top; + } catch (at) { + return true; + } + } + function T(co, ci) { + var bR = this, + bk = 'mtm_consent', + cT = 'mtm_cookie_consent', + c2 = 'mtm_consent_removed', + cd = ae(J.domain, W.location.href, N()), + da = O(cd[0]), + bW = p(cd[1]), + bw = p(cd[2]), + c8 = false, + cs = 'GET', + dt = cs, + aM = 'application/x-www-form-urlencoded; charset=UTF-8', + cL = aM, + aI = co || '', + bQ = '', + dh = '', + cy = '', + cf = ci || '', + bH = '', + bX = '', + bb, + bq = '', + dp = [ + '7z', + 'aac', + 'apk', + 'arc', + 'arj', + 'asf', + 'asx', + 'avi', + 'azw3', + 'bin', + 'csv', + 'deb', + 'dmg', + 'doc', + 'docx', + 'epub', + 'exe', + 'flv', + 'gif', + 'gz', + 'gzip', + 'hqx', + 'ibooks', + 'jar', + 'jpg', + 'jpeg', + 'js', + 'mobi', + 'mp2', + 'mp3', + 'mp4', + 'mpg', + 'mpeg', + 'mov', + 'movie', + 'msi', + 'msp', + 'odb', + 'odf', + 'odg', + 'ods', + 'odt', + 'ogg', + 'ogv', + 'pdf', + 'phps', + 'png', + 'ppt', + 'pptx', + 'qt', + 'qtm', + 'ra', + 'ram', + 'rar', + 'rpm', + 'rtf', + 'sea', + 'sit', + 'tar', + 'tbz', + 'tbz2', + 'bz', + 'bz2', + 'tgz', + 'torrent', + 'txt', + 'wav', + 'wma', + 'wmv', + 'wpd', + 'xls', + 'xlsx', + 'xml', + 'z', + 'zip', + ], + aC = [da], + bI = [], + cM = ['.paypal.com'], + ct = [], + bU = [], + bf = [], + bS = 500, + dd = true, + cZ, + bc, + b0, + bY, + at, + cC = [ + 'pk_campaign', + 'mtm_campaign', + 'piwik_campaign', + 'matomo_campaign', + 'utm_campaign', + 'utm_source', + 'utm_medium', + ], + bP = ['pk_kwd', 'mtm_kwd', 'piwik_kwd', 'matomo_kwd', 'utm_term'], + br = '_pk_', + az = 'pk_vid', + a6 = 180, + df, + by, + b1 = false, + aN = 'Lax', + bt = false, + c6, + bl, + bE, + c0 = 33955200000, + cz = 1800000, + dn = 15768000000, + a9 = true, + bN = false, + bo = false, + bZ = false, + aV = false, + cl, + b5 = {}, + cx = {}, + bv = {}, + bC = 200, + cH = {}, + di = {}, + dq = {}, + aZ = {}, + cj = [], + bu = false, + ck = [], + cp = false, + cR = false, + au = false, + dr = false, + c3 = false, + aS = false, + bj = v(), + cN = null, + dg = null, + aW, + bK, + cg = aq, + bx, + aQ, + bJ = false, + cE = 0, + bD = ['id', 'ses', 'cvar', 'ref'], + cQ = false, + bL = null, + c1 = [], + cG = [], + aB = X++, + aA = false, + de = true; + try { + bq = J.title; + } catch (cO) { + bq = ''; + } + function aH(dE) { + if (bt && dE !== c2) { + return 0; + } + var dC = new RegExp('(^|;)[ ]*' + dE + '=([^;]*)'), + dD = dC.exec(J.cookie); + return dD ? V(dD[2]) : 0; + } + bL = !aH(c2); + function dx(dG, dH, dK, dJ, dE, dF, dI) { + if (bt && dG !== c2) { + return; + } + var dD; + if (dK) { + dD = new Date(); + dD.setTime(dD.getTime() + dK); + } + if (!dI) { + dI = 'Lax'; + } + J.cookie = + dG + + '=' + + t(dH) + + (dK ? ';expires=' + dD.toGMTString() : '') + + ';path=' + + (dJ || '/') + + (dE ? ';domain=' + dE : '') + + (dF ? ';secure' : '') + + ';SameSite=' + + dI; + if ((!dK || dK >= 0) && aH(dG) !== String(dH)) { + var dC = + 'There was an error setting cookie `' + + dG + + '`. Please check domain and path.'; + ao(dC); + } + } + function cb(dC) { + var dE, dD; + dC = j(dC, az); + dC = j(dC, 'ignore_referrer'); + dC = j(dC, 'ignore_referer'); + for (dD = 0; dD < ct.length; dD++) { + dC = j(dC, ct[dD]); + } + if (bY) { + dE = new RegExp('#.*'); + return dC.replace(dE, ''); + } + return dC; + } + function b4(dE, dC) { + var dF = s(dC), + dD; + if (dF) { + return dC; + } + if (dC.slice(0, 1) === '/') { + return s(dE) + '://' + d(dE) + dC; + } + dE = cb(dE); + dD = dE.indexOf('?'); + if (dD >= 0) { + dE = dE.slice(0, dD); + } + dD = dE.lastIndexOf('/'); + if (dD !== dE.length - 1) { + dE = dE.slice(0, dD + 1); + } + return dE + dC; + } + function cX(dE, dC) { + var dD; + dE = String(dE).toLowerCase(); + dC = String(dC).toLowerCase(); + if (dE === dC) { + return true; + } + if (dC.slice(0, 1) === '.') { + if (dE === dC.slice(1)) { + return true; + } + dD = dE.length - dC.length; + if (dD > 0 && dE.slice(dD) === dC) { + return true; + } + } + return false; + } + function cw(dC) { + var dD = document.createElement('a'); + if (dC.indexOf('//') !== 0 && dC.indexOf('http') !== 0) { + if (dC.indexOf('*') === 0) { + dC = dC.substr(1); + } + if (dC.indexOf('.') === 0) { + dC = dC.substr(1); + } + dC = 'http://' + dC; + } + dD.href = w.toAbsoluteUrl(dC); + if (dD.pathname) { + return dD.pathname; + } + return ''; + } + function ba(dD, dC) { + if (!an(dC, '/')) { + dC = '/' + dC; + } + if (!an(dD, '/')) { + dD = '/' + dD; + } + var dE = dC === '/' || dC === '/*'; + if (dE) { + return true; + } + if (dD === dC) { + return true; + } + dC = String(dC).toLowerCase(); + dD = String(dD).toLowerCase(); + if (U(dC, '*')) { + dC = dC.slice(0, -1); + dE = !dC || dC === '/'; + if (dE) { + return true; + } + if (dD === dC) { + return true; + } + return dD.indexOf(dC) === 0; + } + if (!U(dD, '/')) { + dD += '/'; + } + if (!U(dC, '/')) { + dC += '/'; + } + return dD.indexOf(dC) === 0; + } + function aw(dG, dI) { + var dD, dC, dE, dF, dH; + for (dD = 0; dD < aC.length; dD++) { + dF = O(aC[dD]); + dH = cw(aC[dD]); + if (cX(dG, dF) && ba(dI, dH)) { + return true; + } + } + return false; + } + function a2(dF) { + var dD, dC, dE; + for (dD = 0; dD < aC.length; dD++) { + dC = O(aC[dD].toLowerCase()); + if (dF === dC) { + return true; + } + if (dC.slice(0, 1) === '.') { + if (dF === dC.slice(1)) { + return true; + } + dE = dF.length - dC.length; + if (dE > 0 && dF.slice(dE) === dC) { + return true; + } + } + } + return false; + } + function cD(dC) { + var dD, dF, dH, dE, dG; + if (!dC.length || !cM.length) { + return false; + } + dF = d(dC); + dH = cw(dC); + if (dF.indexOf('www.') === 0) { + dF = dF.substr(4); + } + for (dD = 0; dD < cM.length; dD++) { + dE = O(cM[dD]); + dG = cw(cM[dD]); + if (dE.indexOf('www.') === 0) { + dE = dE.substr(4); + } + if (cX(dF, dE) && ba(dH, dG)) { + return true; + } + } + return false; + } + function cA(dC, dE) { + dC = dC.replace('send_image=0', 'send_image=1'); + var dD = new Image(1, 1); + dD.onload = function () { + H = 0; + if (typeof dE === 'function') { + dE({ request: dC, trackerUrl: aI, success: true }); + } + }; + dD.onerror = function () { + if (typeof dE === 'function') { + dE({ request: dC, trackerUrl: aI, success: false }); + } + }; + dD.src = aI + (aI.indexOf('?') < 0 ? '?' : '&') + dC; + } + function cU(dC) { + if (dt === 'POST') { + return true; + } + return dC && (dC.length > 2000 || dC.indexOf('{"requests"') === 0); + } + function aP() { + return ( + 'object' === typeof g && + 'function' === typeof g.sendBeacon && + 'function' === typeof Blob + ); + } + function bd(dG, dJ, dI) { + var dE = aP(); + if (!dE) { + return false; + } + var dF = { type: 'application/x-www-form-urlencoded; charset=UTF-8' }; + var dK = false; + var dD = aI; + try { + var dC = new Blob([dG], dF); + if (dI && !cU(dG)) { + dC = new Blob([], dF); + dD = dD + (dD.indexOf('?') < 0 ? '?' : '&') + dG; + } + dK = g.sendBeacon(dD, dC); + } catch (dH) { + return false; + } + if (dK && typeof dJ === 'function') { + dJ({ + request: dG, + trackerUrl: aI, + success: true, + isSendBeacon: true, + }); + } + return dK; + } + function dm(dD, dE, dC) { + if (!M(dC) || null === dC) { + dC = true; + } + if (m && bd(dD, dE, dC)) { + return; + } + setTimeout(function () { + if (m && bd(dD, dE, dC)) { + return; + } + var dH; + try { + var dG = W.XMLHttpRequest + ? new W.XMLHttpRequest() + : W.ActiveXObject + ? new ActiveXObject('Microsoft.XMLHTTP') + : null; + dG.open('POST', aI, true); + dG.onreadystatechange = function () { + if ( + this.readyState === 4 && + !(this.status >= 200 && this.status < 300) + ) { + var dI = m && bd(dD, dE, dC); + if (!dI && dC) { + cA(dD, dE); + } else { + if (typeof dE === 'function') { + dE({ + request: dD, + trackerUrl: aI, + success: false, + xhr: this, + }); + } + } + } else { + if (this.readyState === 4 && typeof dE === 'function') { + dE({ request: dD, trackerUrl: aI, success: true, xhr: this }); + } + } + }; + dG.setRequestHeader('Content-Type', cL); + dG.withCredentials = true; + dG.send(dD); + } catch (dF) { + dH = m && bd(dD, dE, dC); + if (!dH && dC) { + cA(dD, dE); + } else { + if (typeof dE === 'function') { + dE({ request: dD, trackerUrl: aI, success: false }); + } + } + } + }, 50); + } + function cq(dD) { + var dC = new Date(); + var dE = dC.getTime() + dD; + if (!r || dE > r) { + r = dE; + } + } + function bh() { + bj = true; + cN = new Date().getTime(); + } + function dw() { + var dC = new Date().getTime(); + return !cN || dC - cN > bc; + } + function aD() { + if (dw()) { + b0(); + } + } + function a1() { + if (J.visibilityState === 'hidden' && dw()) { + b0(); + } else { + if (J.visibilityState === 'visible') { + cN = new Date().getTime(); + } + } + } + function dz() { + if (aS || !bc) { + return; + } + aS = true; + ar(W, 'focus', bh); + ar(W, 'blur', aD); + ar(W, 'visibilitychange', a1); + af++; + u.addPlugin('HeartBeat' + af, { + unload: function () { + if (aS && dw()) { + b0(); + } + }, + }); + } + function cS(dG) { + var dD = new Date(); + var dC = dD.getTime(); + dg = dC; + if (cR && dC < cR) { + var dE = cR - dC; + setTimeout(dG, dE); + cq(dE + 50); + cR += 50; + return; + } + if (cR === false) { + var dF = 800; + cR = dC + dF; + } + dG(); + } + function aT() { + if (aH(c2)) { + bL = false; + } else { + if (aH(bk)) { + bL = true; + } + } + } + function bT(dE) { + if (!aZ) { + return dE; + } + var dD, + dC = '&uadata=' + t(W.JSON.stringify(aZ)); + if (dE instanceof Array) { + for (dD = 0; dD < dE.length; dD++) { + dE[dD] += dC; + } + } else { + dE += dC; + } + return dE; + } + function cB(dC) { + if ( + !de || + !M(g.userAgentData) || + !C(g.userAgentData.getHighEntropyValues) + ) { + dC(); + return; + } + aZ = { + brands: g.userAgentData.brands, + platform: g.userAgentData.platform, + }; + g.userAgentData + .getHighEntropyValues([ + 'brands', + 'model', + 'platform', + 'platformVersion', + 'uaFullVersion', + 'fullVersionList', + ]) + .then( + function (dE) { + var dD; + if (dE.fullVersionList) { + delete dE.brands; + delete dE.uaFullVersion; + } + aZ = dE; + dC(); + }, + function (dD) { + dC(); + } + ); + } + function bO(dD, dC, dE) { + if (!bu) { + cj.push(dD); + return; + } + aT(); + if (!bL) { + c1.push(dD); + return; + } + aA = true; + if (!c6 && dD) { + if (cQ && bL) { + dD += '&consent=1'; + } + dD = bT(dD); + cS(function () { + if (dd && bd(dD, dE, true)) { + cq(100); + return; + } + if (cU(dD)) { + dm(dD, dE); + } else { + cA(dD, dE); + } + cq(dC); + }); + } + if (!aS) { + dz(); + } + } + function cv(dC) { + if (c6) { + return false; + } + return dC && dC.length; + } + function dl(dC, dG) { + if (!dG || dG >= dC.length) { + return [dC]; + } + var dD = 0; + var dE = dC.length; + var dF = []; + for (dD; dD < dE; dD += dG) { + dF.push(dC.slice(dD, dD + dG)); + } + return dF; + } + function dy(dD, dC) { + if (!cv(dD)) { + return; + } + if (!bu) { + cj.push(dD); + return; + } + if (!bL) { + c1.push(dD); + return; + } + aA = true; + cS(function () { + var dG = dl(dD, 50); + var dE = 0, + dF; + for (dE; dE < dG.length; dE++) { + dF = + '{"requests":["?' + + bT(dG[dE]).join('","?') + + '"],"send_image":0}'; + if (dd && bd(dF, null, false)) { + cq(100); + } else { + dm(dF, null, false); + } + } + cq(dC); + }); + } + function aY(dC) { + return br + dC + '.' + cf + '.' + bx; + } + function b8(dE, dD, dC) { + dx(dE, '', -129600000, dD, dC); + } + function ce() { + if (bt) { + return '0'; + } + if (!M(W.showModalDialog) && M(g.cookieEnabled)) { + return g.cookieEnabled ? '1' : '0'; + } + var dC = br + 'testcookie'; + dx(dC, '1', undefined, by, df, b1, aN); + var dD = aH(dC) === '1' ? '1' : '0'; + b8(dC); + return dD; + } + function bp() { + bx = cg((df || da) + (by || '/')).slice(0, 4); + } + function cY() { + cB(function () { + var dI, dH; + bu = true; + for (dI = 0; dI < cj.length; dI++) { + dH = typeof cj[dI]; + if (dH === 'string') { + bO(cj[dI], bS); + } else { + if (dH === 'object') { + dy(cj[dI], bS); + } + } + } + cj = []; + }); + if (!de) { + return {}; + } + if (M(dq.res)) { + return dq; + } + var dD, + dF, + dG = { + pdf: 'application/pdf', + qt: 'video/quicktime', + realp: 'audio/x-pn-realaudio-plugin', + wma: 'application/x-mplayer2', + fla: 'application/x-shockwave-flash', + java: 'application/x-java-vm', + ag: 'application/x-silverlight', + }; + if (!new RegExp('MSIE').test(g.userAgent)) { + if (g.mimeTypes && g.mimeTypes.length) { + for (dD in dG) { + if (Object.prototype.hasOwnProperty.call(dG, dD)) { + dF = g.mimeTypes[dG[dD]]; + dq[dD] = dF && dF.enabledPlugin ? '1' : '0'; + } + } + } + if ( + !new RegExp('Edge[ /](\\d+[\\.\\d]+)').test(g.userAgent) && + typeof navigator.javaEnabled !== 'unknown' && + M(g.javaEnabled) && + g.javaEnabled() + ) { + dq.java = '1'; + } + if (!M(W.showModalDialog) && M(g.cookieEnabled)) { + dq.cookie = g.cookieEnabled ? '1' : '0'; + } else { + dq.cookie = ce(); + } + } + var dE = parseInt(ab.width, 10); + var dC = parseInt(ab.height, 10); + dq.res = parseInt(dE, 10) + 'x' + parseInt(dC, 10); + return dq; + } + function b6() { + var dD = aY('cvar'), + dC = aH(dD); + if (dC && dC.length) { + dC = W.JSON.parse(dC); + if (Z(dC)) { + return dC; + } + } + return {}; + } + function cV() { + if (aV === false) { + aV = b6(); + } + } + function c7() { + var dC = cY(); + return cg( + (g.userAgent || '') + + (g.platform || '') + + W.JSON.stringify(dC) + + new Date().getTime() + + Math.random() + ).slice(0, 16); + } + function aF() { + var dC = cY(); + return cg( + (g.userAgent || '') + (g.platform || '') + W.JSON.stringify(dC) + ).slice(0, 6); + } + function bm() { + return Math.floor(new Date().getTime() / 1000); + } + function aO() { + var dD = bm(); + var dE = aF(); + var dC = String(dD) + dE; + return dC; + } + function dk(dE) { + dE = String(dE); + var dH = aF(); + var dF = dH.length; + var dG = dE.substr(-1 * dF, dF); + var dD = parseInt(dE.substr(0, dE.length - dF), 10); + if (dD && dG && dG === dH) { + var dC = bm(); + if (a6 <= 0) { + return true; + } + if (dC >= dD && dC <= dD + a6) { + return true; + } + } + return false; + } + function dA(dC) { + if (!c3) { + return ''; + } + var dG = e(dC, az); + if (!dG) { + return ''; + } + dG = String(dG); + var dE = new RegExp('^[a-zA-Z0-9]+$'); + if (dG.length === 32 && dE.test(dG)) { + var dD = dG.substr(16, 32); + if (dk(dD)) { + var dF = dG.substr(0, 16); + return dF; + } + } + return ''; + } + function c4() { + if (!bX) { + bX = dA(bW); + } + var dE = new Date(), + dC = Math.round(dE.getTime() / 1000), + dD = aY('id'), + dH = aH(dD), + dG, + dF; + if (dH) { + dG = dH.split('.'); + dG.unshift('0'); + if (bX.length) { + dG[1] = bX; + } + return dG; + } + if (bX.length) { + dF = bX; + } else { + if ('0' === ce()) { + dF = ''; + } else { + dF = c7(); + } + } + dG = ['1', dF, dC]; + return dG; + } + function a5() { + var dF = c4(), + dD = dF[0], + dE = dF[1], + dC = dF[2]; + return { newVisitor: dD, uuid: dE, createTs: dC }; + } + function aL() { + var dF = new Date(), + dD = dF.getTime(), + dG = a5().createTs; + var dC = parseInt(dG, 10); + var dE = dC * 1000 + c0 - dD; + return dE; + } + function aR(dC) { + if (!cf) { + return; + } + var dE = new Date(), + dD = Math.round(dE.getTime() / 1000); + if (!M(dC)) { + dC = a5(); + } + var dF = dC.uuid + '.' + dC.createTs + '.'; + dx(aY('id'), dF, aL(), by, df, b1, aN); + } + function bV() { + var dC = aH(aY('ref')); + if (dC.length) { + try { + dC = W.JSON.parse(dC); + if (Z(dC)) { + return dC; + } + } catch (dD) {} + } + return ['', '', 0, '']; + } + function bF(dE) { + var dD = br + 'testcookie_domain'; + var dC = 'testvalue'; + dx(dD, dC, 10000, null, dE, b1, aN); + if (aH(dD) === dC) { + b8(dD, null, dE); + return true; + } + return false; + } + function aJ() { + var dD = bt; + bt = false; + var dC, dE; + for (dC = 0; dC < bD.length; dC++) { + dE = aY(bD[dC]); + if (dE !== c2 && dE !== bk && 0 !== aH(dE)) { + b8(dE, by, df); + } + } + bt = dD; + } + function cc(dC) { + cf = dC; + } + function dB(dG) { + if (!dG || !Z(dG)) { + return; + } + var dF = []; + var dE; + for (dE in dG) { + if (Object.prototype.hasOwnProperty.call(dG, dE)) { + dF.push(dE); + } + } + var dH = {}; + dF.sort(); + var dC = dF.length; + var dD; + for (dD = 0; dD < dC; dD++) { + dH[dF[dD]] = dG[dF[dD]]; + } + return dH; + } + function cn() { + dx(aY('ses'), '1', cz, by, df, b1, aN); + } + function bn() { + var dF = ''; + var dD = + 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + var dE = dD.length; + var dC; + for (dC = 0; dC < 6; dC++) { + dF += dD.charAt(Math.floor(Math.random() * dE)); + } + return dF; + } + function aE(dD) { + if (cy !== '') { + dD += cy; + bo = true; + return dD; + } + if (!h) { + return dD; + } + var dE = + typeof h.timing === 'object' && h.timing ? h.timing : undefined; + if (!dE) { + dE = + typeof h.getEntriesByType === 'function' && + h.getEntriesByType('navigation') + ? h.getEntriesByType('navigation')[0] + : undefined; + } + if (!dE) { + return dD; + } + var dC = ''; + if (dE.connectEnd && dE.fetchStart) { + if (dE.connectEnd < dE.fetchStart) { + return dD; + } + dC += '&pf_net=' + Math.round(dE.connectEnd - dE.fetchStart); + } + if (dE.responseStart && dE.requestStart) { + if (dE.responseStart < dE.requestStart) { + return dD; + } + dC += '&pf_srv=' + Math.round(dE.responseStart - dE.requestStart); + } + if (dE.responseStart && dE.responseEnd) { + if (dE.responseEnd < dE.responseStart) { + return dD; + } + dC += '&pf_tfr=' + Math.round(dE.responseEnd - dE.responseStart); + } + if (M(dE.domLoading)) { + if (dE.domInteractive && dE.domLoading) { + if (dE.domInteractive < dE.domLoading) { + return dD; + } + dC += '&pf_dm1=' + Math.round(dE.domInteractive - dE.domLoading); + } + } else { + if (dE.domInteractive && dE.responseEnd) { + if (dE.domInteractive < dE.responseEnd) { + return dD; + } + dC += '&pf_dm1=' + Math.round(dE.domInteractive - dE.responseEnd); + } + } + if (dE.domComplete && dE.domInteractive) { + if (dE.domComplete < dE.domInteractive) { + return dD; + } + dC += '&pf_dm2=' + Math.round(dE.domComplete - dE.domInteractive); + } + if (dE.loadEventEnd && dE.loadEventStart) { + if (dE.loadEventEnd < dE.loadEventStart) { + return dD; + } + dC += '&pf_onl=' + Math.round(dE.loadEventEnd - dE.loadEventStart); + } + return dD + dC; + } + function cm(dC) { + return ( + e(dC, 'ignore_referrer') === '1' || e(dC, 'ignore_referer') === '1' + ); + } + function ds() { + var dM, + dF = new Date(), + dG = Math.round(dF.getTime() / 1000), + dR, + dE, + dH = 1024, + dO, + dI, + dD = aY('ses'), + dL = aY('ref'), + dK = aH(dD), + dC = bV(), + dQ = bb || bW, + dN, + dJ, + dP = {}; + dN = dC[0]; + dJ = dC[1]; + dR = dC[2]; + dE = dC[3]; + if (!cm(dQ) && !dK) { + if (!bE || !dN.length) { + for (dM in cC) { + if (Object.prototype.hasOwnProperty.call(cC, dM)) { + dN = e(dQ, cC[dM]); + if (dN.length) { + break; + } + } + } + for (dM in bP) { + if (Object.prototype.hasOwnProperty.call(bP, dM)) { + dJ = e(dQ, bP[dM]); + if (dJ.length) { + break; + } + } + } + } + dO = d(bw); + dI = dE.length ? d(dE) : ''; + if ( + dO.length && + !a2(dO) && + !cD(bw) && + (!bE || !dI.length || a2(dI) || cD(dE)) + ) { + dE = bw; + } + if (dE.length || dN.length) { + dR = dG; + dC = [dN, dJ, dR, cb(dE.slice(0, dH))]; + dx(dL, W.JSON.stringify(dC), dn, by, df, b1, aN); + } + } + if (dN.length) { + dP._rcn = t(dN); + } + if (dJ.length) { + dP._rck = t(dJ); + } + dP._refts = dR; + if (String(dE).length) { + dP._ref = t(cb(dE.slice(0, dH))); + } + return dP; + } + function cF(dD, dP, dQ) { + var dO, + dC = new Date(), + dN = aV, + dJ = aY('cvar'), + dR = bb || bW, + dE = cm(dR); + if (bt) { + aJ(); + } + if (c6) { + return ''; + } + var dK = a5(); + var dH = J.characterSet || J.charset; + if (!dH || dH.toLowerCase() === 'utf-8') { + dH = null; + } + dD += + '&idsite=' + + cf + + '&rec=1&r=' + + String(Math.random()).slice(2, 8) + + '&h=' + + dC.getHours() + + '&m=' + + dC.getMinutes() + + '&s=' + + dC.getSeconds() + + '&url=' + + t(cb(dR)) + + (bw.length && !cD(bw) && !dE ? '&urlref=' + t(cb(bw)) : '') + + (ac(bH) ? '&uid=' + t(bH) : '') + + '&_id=' + + dK.uuid + + '&_idn=' + + dK.newVisitor + + (dH ? '&cs=' + t(dH) : '') + + '&send_image=0'; + var dM = ds(); + for (dO in dM) { + if (Object.prototype.hasOwnProperty.call(dM, dO)) { + dD += '&' + dO + '=' + dM[dO]; + } + } + var dT = cY(); + for (dO in dT) { + if (Object.prototype.hasOwnProperty.call(dT, dO)) { + dD += '&' + dO + '=' + dT[dO]; + } + } + var dU = []; + if (dP) { + for (dO in dP) { + if ( + Object.prototype.hasOwnProperty.call(dP, dO) && + /^dimension\d+$/.test(dO) + ) { + var dF = dO.replace('dimension', ''); + dU.push(parseInt(dF, 10)); + dU.push(String(dF)); + dD += '&' + dO + '=' + t(dP[dO]); + delete dP[dO]; + } + } + } + if (dP && D(dP)) { + dP = null; + } + for (dO in cH) { + if (Object.prototype.hasOwnProperty.call(cH, dO)) { + dD += '&' + dO + '=' + t(cH[dO]); + } + } + for (dO in bv) { + if (Object.prototype.hasOwnProperty.call(bv, dO)) { + var dI = -1 === P(dU, dO); + if (dI) { + dD += '&dimension' + dO + '=' + t(bv[dO]); + } + } + } + if (dP) { + dD += '&data=' + t(W.JSON.stringify(dP)); + } else { + if (at) { + dD += '&data=' + t(W.JSON.stringify(at)); + } + } + function dG(dV, dW) { + var dX = W.JSON.stringify(dV); + if (dX.length > 2) { + return '&' + dW + '=' + t(dX); + } + return ''; + } + var dS = dB(b5); + var dL = dB(cx); + dD += dG(dS, 'cvar'); + dD += dG(dL, 'e_cvar'); + if (aV) { + dD += dG(aV, '_cvar'); + for (dO in dN) { + if (Object.prototype.hasOwnProperty.call(dN, dO)) { + if (aV[dO][0] === '' || aV[dO][1] === '') { + delete aV[dO]; + } + } + } + if (bZ) { + dx(dJ, W.JSON.stringify(aV), cz, by, df, b1, aN); + } + } + if (a9 && bN && !bo) { + dD = aE(dD); + bo = true; + } + if (aQ) { + dD += '&pv_id=' + aQ; + } + aR(dK); + cn(); + dD += ag(dQ, { tracker: bR, request: dD }); + if (dh.length) { + dD += '&' + dh; + } + if (C(cl)) { + dD = cl(dD); + } + return dD; + } + b0 = function be() { + var dC = new Date(); + dC = dC.getTime(); + if (!dg) { + return false; + } + if (dg + bc <= dC) { + bR.ping(); + return true; + } + return false; + }; + function bz(dF, dE, dJ, dG, dC, dM) { + var dI = 'idgoal=0', + dD = new Date(), + dK = [], + dL, + dH = String(dF).length; + if (dH) { + dI += '&ec_id=' + t(dF); + } + dI += '&revenue=' + dE; + if (String(dJ).length) { + dI += '&ec_st=' + dJ; + } + if (String(dG).length) { + dI += '&ec_tx=' + dG; + } + if (String(dC).length) { + dI += '&ec_sh=' + dC; + } + if (String(dM).length) { + dI += '&ec_dt=' + dM; + } + if (di) { + for (dL in di) { + if (Object.prototype.hasOwnProperty.call(di, dL)) { + if (!M(di[dL][1])) { + di[dL][1] = ''; + } + if (!M(di[dL][2])) { + di[dL][2] = ''; + } + if (!M(di[dL][3]) || String(di[dL][3]).length === 0) { + di[dL][3] = 0; + } + if (!M(di[dL][4]) || String(di[dL][4]).length === 0) { + di[dL][4] = 1; + } + dK.push(di[dL]); + } + } + dI += '&ec_items=' + t(W.JSON.stringify(dK)); + } + dI = cF(dI, at, 'ecommerce'); + bO(dI, bS); + if (dH) { + di = {}; + } + } + function b7(dC, dG, dF, dE, dD, dH) { + if (String(dC).length && M(dG)) { + bz(dC, dG, dF, dE, dD, dH); + } + } + function bB(dC) { + if (M(dC)) { + bz('', dC, '', '', '', ''); + } + } + function b9(dD, dF, dE) { + if (!bJ) { + aQ = bn(); + } + var dC = cF('action_name=' + t(ap(dD || bq)), dF, 'log'); + if (a9 && !bo) { + dC = aE(dC); + } + bO(dC, bS, dE); + } + function a7(dE, dD) { + var dF, + dC = '(^| )(piwik[_-]' + dD + '|matomo[_-]' + dD; + if (dE) { + for (dF = 0; dF < dE.length; dF++) { + dC += '|' + dE[dF]; + } + } + dC += ')( |$)'; + return new RegExp(dC); + } + function a0(dC) { + return aI && dC && 0 === String(dC).indexOf(aI); + } + function cJ(dG, dC, dH, dD) { + if (a0(dC)) { + return 0; + } + var dF = a7(bU, 'download'), + dE = a7(bf, 'link'), + dI = new RegExp('\\.(' + dp.join('|') + ')([?&#]|$)', 'i'); + if (dE.test(dG)) { + return 'link'; + } + if (dD || dF.test(dG) || dI.test(dC)) { + return 'download'; + } + if (dH) { + return 0; + } + return 'link'; + } + function ay(dD) { + var dC; + dC = dD.parentNode; + while (dC !== null && M(dC)) { + if (ai.isLinkElement(dD)) { + break; + } + dD = dC; + dC = dD.parentNode; + } + return dD; + } + function dv(dH) { + dH = ay(dH); + if (!ai.hasNodeAttribute(dH, 'href')) { + return; + } + if (!M(dH.href)) { + return; + } + var dG = ai.getAttributeValueFromNode(dH, 'href'); + var dD = dH.pathname || cw(dH.href); + var dI = dH.hostname || d(dH.href); + var dJ = dI.toLowerCase(); + var dE = dH.href.replace(dI, dJ); + var dF = new RegExp( + '^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):', + 'i' + ); + if (!dF.test(dE)) { + var dC = cJ( + dH.className, + dE, + aw(dJ, dD), + ai.hasNodeAttribute(dH, 'download') + ); + if (dC) { + return { type: dC, href: dE }; + } + } + } + function aU(dC, dD, dE, dF) { + var dG = w.buildInteractionRequestParams(dC, dD, dE, dF); + if (!dG) { + return; + } + return cF(dG, null, 'contentInteraction'); + } + function bi(dC, dD) { + if (!dC || !dD) { + return false; + } + var dE = w.findTargetNode(dC); + if (w.shouldIgnoreInteraction(dE)) { + return false; + } + dE = w.findTargetNodeNoDefault(dC); + if (dE && !Y(dE, dD)) { + return false; + } + return true; + } + function cI(dE, dD, dG) { + if (!dE) { + return; + } + var dC = w.findParentContentNode(dE); + if (!dC) { + return; + } + if (!bi(dC, dE)) { + return; + } + var dF = w.buildContentBlock(dC); + if (!dF) { + return; + } + if (!dF.target && dG) { + dF.target = dG; + } + return w.buildInteractionRequestParams( + dD, + dF.name, + dF.piece, + dF.target + ); + } + function a3(dD) { + if (!ck || !ck.length) { + return false; + } + var dC, dE; + for (dC = 0; dC < ck.length; dC++) { + dE = ck[dC]; + if ( + dE && + dE.name === dD.name && + dE.piece === dD.piece && + dE.target === dD.target + ) { + return true; + } + } + return false; + } + function a4(dC) { + return function (dG) { + if (!dC) { + return; + } + var dE = w.findParentContentNode(dC); + var dD; + if (dG) { + dD = dG.target || dG.srcElement; + } + if (!dD) { + dD = dC; + } + if (!bi(dE, dD)) { + return; + } + if (!dE) { + return false; + } + var dH = w.findTargetNode(dE); + if (!dH || w.shouldIgnoreInteraction(dH)) { + return false; + } + var dF = dv(dH); + if (dr && dF && dF.type) { + return dF.type; + } + return bR.trackContentInteractionNode(dD, 'click'); + }; + } + function ca(dE) { + if (!dE || !dE.length) { + return; + } + var dC, dD; + for (dC = 0; dC < dE.length; dC++) { + dD = w.findTargetNode(dE[dC]); + if (dD && !dD.contentInteractionTrackingSetupDone) { + dD.contentInteractionTrackingSetupDone = true; + ar(dD, 'click', a4(dD)); + } + } + } + function bG(dE, dF) { + if (!dE || !dE.length) { + return []; + } + var dC, dD; + for (dC = 0; dC < dE.length; dC++) { + if (a3(dE[dC])) { + dE.splice(dC, 1); + dC--; + } else { + ck.push(dE[dC]); + } + } + if (!dE || !dE.length) { + return []; + } + ca(dF); + var dG = []; + for (dC = 0; dC < dE.length; dC++) { + dD = cF( + w.buildImpressionRequestParams( + dE[dC].name, + dE[dC].piece, + dE[dC].target + ), + undefined, + 'contentImpressions' + ); + if (dD) { + dG.push(dD); + } + } + return dG; + } + function cP(dD) { + var dC = w.collectContent(dD); + return bG(dC, dD); + } + function bg(dD) { + if (!dD || !dD.length) { + return []; + } + var dC; + for (dC = 0; dC < dD.length; dC++) { + if (!w.isNodeVisible(dD[dC])) { + dD.splice(dC, 1); + dC--; + } + } + if (!dD || !dD.length) { + return []; + } + return cP(dD); + } + function aK(dE, dC, dD) { + var dF = w.buildImpressionRequestParams(dE, dC, dD); + return cF(dF, null, 'contentImpression'); + } + function du(dF, dD) { + if (!dF) { + return; + } + var dC = w.findParentContentNode(dF); + var dE = w.buildContentBlock(dC); + if (!dE) { + return; + } + if (!dD) { + dD = 'Unknown'; + } + return aU(dD, dE.name, dE.piece, dE.target); + } + function c5(dD, dF, dC, dE) { + return ( + 'e_c=' + + t(dD) + + '&e_a=' + + t(dF) + + (M(dC) ? '&e_n=' + t(dC) : '') + + (M(dE) ? '&e_v=' + t(dE) : '') + + '&ca=1' + ); + } + function ax(dE, dG, dC, dF, dI, dH) { + if (!ac(dE) || !ac(dG)) { + ao( + 'Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces' + ); + return false; + } + var dD = cF(c5(dE, dG, dC, dF), dI, 'event'); + bO(dD, bS, dH); + } + function ch(dC, dF, dD, dG) { + var dE = cF( + 'search=' + + t(dC) + + (dF ? '&search_cat=' + t(dF) : '') + + (M(dD) ? '&search_count=' + dD : ''), + dG, + 'sitesearch' + ); + bO(dE, bS); + } + function c9(dC, dG, dF, dE) { + var dD = cF('idgoal=' + dC + (dG ? '&revenue=' + dG : ''), dF, 'goal'); + bO(dD, bS, dE); + } + function dj(dF, dC, dJ, dI, dE) { + var dH = dC + '=' + t(cb(dF)); + var dD = cI(dE, 'click', dF); + if (dD) { + dH += '&' + dD; + } + var dG = cF(dH, dJ, 'link'); + bO(dG, bS, dI); + } + function b3(dD, dC) { + if (dD !== '') { + return dD + dC.charAt(0).toUpperCase() + dC.slice(1); + } + return dC; + } + function cr(dH) { + var dG, + dC, + dF = ['', 'webkit', 'ms', 'moz'], + dE; + if (!bl) { + for (dC = 0; dC < dF.length; dC++) { + dE = dF[dC]; + if (Object.prototype.hasOwnProperty.call(J, b3(dE, 'hidden'))) { + if (J[b3(dE, 'visibilityState')] === 'prerender') { + dG = true; + } + break; + } + } + } + if (dG) { + ar(J, dE + 'visibilitychange', function dD() { + J.removeEventListener(dE + 'visibilitychange', dD, false); + dH(); + }); + return; + } + dH(); + } + function bA() { + var dD = bR.getVisitorId(); + var dC = aO(); + return dD + dC; + } + function cu(dC) { + if (!dC) { + return; + } + if (!ai.hasNodeAttribute(dC, 'href')) { + return; + } + var dD = ai.getAttributeValueFromNode(dC, 'href'); + if (!dD || a0(dD)) { + return; + } + if (!bR.getVisitorId()) { + return; + } + dD = j(dD, az); + var dE = bA(); + dD = I(dD, az, dE); + ai.setAnyAttribute(dC, 'href', dD); + } + function bs(dF) { + var dG = ai.getAttributeValueFromNode(dF, 'href'); + if (!dG) { + return false; + } + dG = String(dG); + var dD = + dG.indexOf('//') === 0 || + dG.indexOf('http://') === 0 || + dG.indexOf('https://') === 0; + if (!dD) { + return false; + } + var dC = dF.pathname || cw(dF.href); + var dE = (dF.hostname || d(dF.href)).toLowerCase(); + if (aw(dE, dC)) { + if (!cX(da, O(dE))) { + return true; + } + return false; + } + return false; + } + function cW(dC) { + var dD = dv(dC); + if (dD && dD.type) { + dD.href = p(dD.href); + dj(dD.href, dD.type, undefined, null, dC); + return; + } + if (c3) { + dC = ay(dC); + if (bs(dC)) { + cu(dC); + } + } + } + function cK() { + return J.all && !J.addEventListener; + } + function db(dC) { + var dE = dC.which; + var dD = typeof dC.button; + if (!dE && dD !== 'undefined') { + if (cK()) { + if (dC.button & 1) { + dE = 1; + } else { + if (dC.button & 2) { + dE = 3; + } else { + if (dC.button & 4) { + dE = 2; + } + } + } + } else { + if (dC.button === 0 || dC.button === '0') { + dE = 1; + } else { + if (dC.button & 1) { + dE = 2; + } else { + if (dC.button & 2) { + dE = 3; + } + } + } + } + } + return dE; + } + function b2(dC) { + switch (db(dC)) { + case 1: + return 'left'; + case 2: + return 'middle'; + case 3: + return 'right'; + } + } + function a8(dC) { + return dC.target || dC.srcElement; + } + function dc(dC) { + return dC === 'A' || dC === 'AREA'; + } + function aG(dC) { + function dD(dF) { + var dG = a8(dF); + var dH = dG.nodeName; + var dE = a7(bI, 'ignore'); + while (!dc(dH) && dG && dG.parentNode) { + dG = dG.parentNode; + dH = dG.nodeName; + } + if (dG && dc(dH) && !dE.test(dG.className)) { + return dG; + } + } + return function (dG) { + dG = dG || W.event; + var dH = dD(dG); + if (!dH) { + return; + } + var dF = b2(dG); + if (dG.type === 'click') { + var dE = false; + if (dC && dF === 'middle') { + dE = true; + } + if (dH && !dE) { + cW(dH); + } + } else { + if (dG.type === 'mousedown') { + if (dF === 'middle' && dH) { + aW = dF; + bK = dH; + } else { + aW = bK = null; + } + } else { + if (dG.type === 'mouseup') { + if (dF === aW && dH === bK) { + cW(dH); + } + aW = bK = null; + } else { + if (dG.type === 'contextmenu') { + cW(dH); + } + } + } + } + }; + } + function av(dF, dE, dC) { + var dD = typeof dE; + if (dD === 'undefined') { + dE = true; + } + ar(dF, 'click', aG(dE), dC); + if (dE) { + ar(dF, 'mouseup', aG(dE), dC); + ar(dF, 'mousedown', aG(dE), dC); + ar(dF, 'contextmenu', aG(dE), dC); + } + } + function aX(dD, dG, dH) { + if (cp) { + return true; + } + cp = true; + var dI = false; + var dF, dE; + function dC() { + dI = true; + } + n(function () { + function dJ(dL) { + setTimeout(function () { + if (!cp) { + return; + } + dI = false; + dH.trackVisibleContentImpressions(); + dJ(dL); + }, dL); + } + function dK(dL) { + setTimeout(function () { + if (!cp) { + return; + } + if (dI) { + dI = false; + dH.trackVisibleContentImpressions(); + } + dK(dL); + }, dL); + } + if (dD) { + dF = ['scroll', 'resize']; + for (dE = 0; dE < dF.length; dE++) { + if (J.addEventListener) { + J.addEventListener(dF[dE], dC, false); + } else { + W.attachEvent('on' + dF[dE], dC); + } + } + dK(100); + } + if (dG && dG > 0) { + dG = parseInt(dG, 10); + dJ(dG); + } + }); + } + var bM = { + enabled: true, + requests: [], + timeout: null, + interval: 2500, + sendRequests: function () { + var dC = this.requests; + this.requests = []; + if (dC.length === 1) { + bO(dC[0], bS); + } else { + dy(dC, bS); + } + }, + canQueue: function () { + return !m && this.enabled; + }, + pushMultiple: function (dD) { + if (!this.canQueue()) { + dy(dD, bS); + return; + } + var dC; + for (dC = 0; dC < dD.length; dC++) { + this.push(dD[dC]); + } + }, + push: function (dC) { + if (!dC) { + return; + } + if (!this.canQueue()) { + bO(dC, bS); + return; + } + bM.requests.push(dC); + if (this.timeout) { + clearTimeout(this.timeout); + this.timeout = null; + } + this.timeout = setTimeout(function () { + bM.timeout = null; + bM.sendRequests(); + }, bM.interval); + var dD = 'RequestQueue' + aB; + if (!Object.prototype.hasOwnProperty.call(b, dD)) { + b[dD] = { + unload: function () { + if (bM.timeout) { + clearTimeout(bM.timeout); + } + bM.sendRequests(); + }, + }; + } + }, + }; + bp(); + this.hasConsent = function () { + return bL; + }; + this.getVisitorInfo = function () { + if (!aH(aY('id'))) { + aR(); + } + return c4(); + }; + this.getVisitorId = function () { + return this.getVisitorInfo()[1]; + }; + this.getAttributionInfo = function () { + return bV(); + }; + this.getAttributionCampaignName = function () { + return bV()[0]; + }; + this.getAttributionCampaignKeyword = function () { + return bV()[1]; + }; + this.getAttributionReferrerTimestamp = function () { + return bV()[2]; + }; + this.getAttributionReferrerUrl = function () { + return bV()[3]; + }; + this.setTrackerUrl = function (dC) { + aI = dC; + }; + this.getTrackerUrl = function () { + return aI; + }; + this.getMatomoUrl = function () { + return aa(this.getTrackerUrl(), bQ); + }; + this.getPiwikUrl = function () { + return this.getMatomoUrl(); + }; + this.addTracker = function (dE, dD) { + if (!M(dE) || null === dE) { + dE = this.getTrackerUrl(); + } + var dC = new T(dE, dD); + L.push(dC); + u.trigger('TrackerAdded', [this]); + return dC; + }; + this.getSiteId = function () { + return cf; + }; + this.setSiteId = function (dC) { + cc(dC); + }; + this.resetUserId = function () { + bH = ''; + }; + this.setUserId = function (dC) { + if (ac(dC)) { + bH = dC; + } + }; + this.setVisitorId = function (dD) { + var dC = /[0-9A-Fa-f]{16}/g; + if (x(dD) && dC.test(dD)) { + bX = dD; + } else { + ao('Invalid visitorId set' + dD); + } + }; + this.getUserId = function () { + return bH; + }; + this.setCustomData = function (dC, dD) { + if (Z(dC)) { + at = dC; + } else { + if (!at) { + at = {}; + } + at[dC] = dD; + } + }; + this.getCustomData = function () { + return at; + }; + this.setCustomRequestProcessing = function (dC) { + cl = dC; + }; + this.appendToTrackingUrl = function (dC) { + dh = dC; + }; + this.getRequest = function (dC) { + return cF(dC); + }; + this.addPlugin = function (dC, dD) { + b[dC] = dD; + }; + this.setCustomDimension = function (dC, dD) { + dC = parseInt(dC, 10); + if (dC > 0) { + if (!M(dD)) { + dD = ''; + } + if (!x(dD)) { + dD = String(dD); + } + bv[dC] = dD; + } + }; + this.getCustomDimension = function (dC) { + dC = parseInt(dC, 10); + if (dC > 0 && Object.prototype.hasOwnProperty.call(bv, dC)) { + return bv[dC]; + } + }; + this.deleteCustomDimension = function (dC) { + dC = parseInt(dC, 10); + if (dC > 0) { + delete bv[dC]; + } + }; + this.setCustomVariable = function (dD, dC, dG, dE) { + var dF; + if (!M(dE)) { + dE = 'visit'; + } + if (!M(dC)) { + return; + } + if (!M(dG)) { + dG = ''; + } + if (dD > 0) { + dC = !x(dC) ? String(dC) : dC; + dG = !x(dG) ? String(dG) : dG; + dF = [dC.slice(0, bC), dG.slice(0, bC)]; + if (dE === 'visit' || dE === 2) { + cV(); + aV[dD] = dF; + } else { + if (dE === 'page' || dE === 3) { + b5[dD] = dF; + } else { + if (dE === 'event') { + cx[dD] = dF; + } + } + } + } + }; + this.getCustomVariable = function (dD, dE) { + var dC; + if (!M(dE)) { + dE = 'visit'; + } + if (dE === 'page' || dE === 3) { + dC = b5[dD]; + } else { + if (dE === 'event') { + dC = cx[dD]; + } else { + if (dE === 'visit' || dE === 2) { + cV(); + dC = aV[dD]; + } + } + } + if (!M(dC) || (dC && dC[0] === '')) { + return false; + } + return dC; + }; + this.deleteCustomVariable = function (dC, dD) { + if (this.getCustomVariable(dC, dD)) { + this.setCustomVariable(dC, '', '', dD); + } + }; + this.deleteCustomVariables = function (dC) { + if (dC === 'page' || dC === 3) { + b5 = {}; + } else { + if (dC === 'event') { + cx = {}; + } else { + if (dC === 'visit' || dC === 2) { + aV = {}; + } + } + } + }; + this.storeCustomVariablesInCookie = function () { + bZ = true; + }; + this.setLinkTrackingTimer = function (dC) { + bS = dC; + }; + this.getLinkTrackingTimer = function () { + return bS; + }; + this.setDownloadExtensions = function (dC) { + if (x(dC)) { + dC = dC.split('|'); + } + dp = dC; + }; + this.addDownloadExtensions = function (dD) { + var dC; + if (x(dD)) { + dD = dD.split('|'); + } + for (dC = 0; dC < dD.length; dC++) { + dp.push(dD[dC]); + } + }; + this.removeDownloadExtensions = function (dE) { + var dD, + dC = []; + if (x(dE)) { + dE = dE.split('|'); + } + for (dD = 0; dD < dp.length; dD++) { + if (P(dE, dp[dD]) === -1) { + dC.push(dp[dD]); + } + } + dp = dC; + }; + this.setDomains = function (dC) { + aC = x(dC) ? [dC] : dC; + var dG = false, + dE = 0, + dD; + for (dE; dE < aC.length; dE++) { + dD = String(aC[dE]); + if (cX(da, O(dD))) { + dG = true; + break; + } + var dF = cw(dD); + if (dF && dF !== '/' && dF !== '/*') { + dG = true; + break; + } + } + if (!dG) { + aC.push(da); + } + }; + this.setExcludedReferrers = function (dC) { + cM = x(dC) ? [dC] : dC; + }; + this.enableCrossDomainLinking = function () { + c3 = true; + }; + this.disableCrossDomainLinking = function () { + c3 = false; + }; + this.isCrossDomainLinkingEnabled = function () { + return c3; + }; + this.setCrossDomainLinkingTimeout = function (dC) { + a6 = dC; + }; + this.getCrossDomainLinkingUrlParameter = function () { + return t(az) + '=' + t(bA()); + }; + this.setIgnoreClasses = function (dC) { + bI = x(dC) ? [dC] : dC; + }; + this.setRequestMethod = function (dC) { + if (dC) { + dt = String(dC).toUpperCase(); + } else { + dt = cs; + } + if (dt === 'GET') { + this.disableAlwaysUseSendBeacon(); + } + }; + this.setRequestContentType = function (dC) { + cL = dC || aM; + }; + this.setGenerationTimeMs = function (dC) { + ao( + 'setGenerationTimeMs is no longer supported since Matomo 4. The call will be ignored. The replacement is setPagePerformanceTiming.' + ); + }; + this.setPagePerformanceTiming = function (dG, dI, dH, dD, dJ, dE) { + var dF = { + pf_net: dG, + pf_srv: dI, + pf_tfr: dH, + pf_dm1: dD, + pf_dm2: dJ, + pf_onl: dE, + }; + try { + dF = Q(dF, M); + dF = B(dF); + cy = l(dF); + if (cy === '') { + ao( + 'setPagePerformanceTiming() called without parameters. This function needs to be called with at least one performance parameter.' + ); + return; + } + bo = false; + bN = true; + } catch (dC) { + ao('setPagePerformanceTiming: ' + dC.toString()); + } + }; + this.setReferrerUrl = function (dC) { + bw = dC; + }; + this.setCustomUrl = function (dC) { + bb = b4(bW, dC); + }; + this.getCurrentUrl = function () { + return bb || bW; + }; + this.setDocumentTitle = function (dC) { + bq = dC; + }; + this.setPageViewId = function (dC) { + aQ = dC; + bJ = true; + }; + this.setAPIUrl = function (dC) { + bQ = dC; + }; + this.setDownloadClasses = function (dC) { + bU = x(dC) ? [dC] : dC; + }; + this.setLinkClasses = function (dC) { + bf = x(dC) ? [dC] : dC; + }; + this.setCampaignNameKey = function (dC) { + cC = x(dC) ? [dC] : dC; + }; + this.setCampaignKeywordKey = function (dC) { + bP = x(dC) ? [dC] : dC; + }; + this.discardHashTag = function (dC) { + bY = dC; + }; + this.setCookieNamePrefix = function (dC) { + br = dC; + if (aV) { + aV = b6(); + } + }; + this.setCookieDomain = function (dC) { + var dD = O(dC); + if (!bt && !bF(dD)) { + ao("Can't write cookie on domain " + dC); + } else { + df = dD; + bp(); + } + }; + this.setExcludedQueryParams = function (dC) { + ct = x(dC) ? [dC] : dC; + }; + this.getCookieDomain = function () { + return df; + }; + this.hasCookies = function () { + return '1' === ce(); + }; + this.setSessionCookie = function (dE, dD, dC) { + if (!dE) { + throw new Error('Missing cookie name'); + } + if (!M(dC)) { + dC = cz; + } + bD.push(dE); + dx(aY(dE), dD, dC, by, df, b1, aN); + }; + this.getCookie = function (dD) { + var dC = aH(aY(dD)); + if (dC === 0) { + return null; + } + return dC; + }; + this.setCookiePath = function (dC) { + by = dC; + bp(); + }; + this.getCookiePath = function (dC) { + return by; + }; + this.setVisitorCookieTimeout = function (dC) { + c0 = dC * 1000; + }; + this.setSessionCookieTimeout = function (dC) { + cz = dC * 1000; + }; + this.getSessionCookieTimeout = function () { + return cz; + }; + this.setReferralCookieTimeout = function (dC) { + dn = dC * 1000; + }; + this.setConversionAttributionFirstReferrer = function (dC) { + bE = dC; + }; + this.setSecureCookie = function (dC) { + if (dC && location.protocol !== 'https:') { + ao('Error in setSecureCookie: You cannot use `Secure` on http.'); + return; + } + b1 = dC; + }; + this.setCookieSameSite = function (dC) { + dC = String(dC); + dC = dC.charAt(0).toUpperCase() + dC.toLowerCase().slice(1); + if (dC !== 'None' && dC !== 'Lax' && dC !== 'Strict') { + ao( + 'Ignored value for sameSite. Please use either Lax, None, or Strict.' + ); + return; + } + if (dC === 'None') { + if (location.protocol === 'https:') { + this.setSecureCookie(true); + } else { + ao( + 'sameSite=None cannot be used on http, reverted to sameSite=Lax.' + ); + dC = 'Lax'; + } + } + aN = dC; + }; + this.disableCookies = function () { + bt = true; + if (cf) { + aJ(); + } + }; + this.areCookiesEnabled = function () { + return !bt; + }; + this.setCookieConsentGiven = function () { + if (bt && !c6) { + bt = false; + de = true; + if (cf && aA) { + aR(); + var dC = cF('ping=1', null, 'ping'); + bO(dC, bS); + } + } + }; + this.requireCookieConsent = function () { + if (this.getRememberedCookieConsent()) { + return false; + } + this.disableCookies(); + return true; + }; + this.getRememberedCookieConsent = function () { + return aH(cT); + }; + this.forgetCookieConsentGiven = function () { + b8(cT, by, df); + this.disableCookies(); + }; + this.rememberCookieConsentGiven = function (dD) { + if (dD) { + dD = dD * 60 * 60 * 1000; + } else { + dD = 30 * 365 * 24 * 60 * 60 * 1000; + } + this.setCookieConsentGiven(); + var dC = new Date().getTime(); + dx(cT, dC, dD, by, df, b1, aN); + }; + this.deleteCookies = function () { + aJ(); + }; + this.setDoNotTrack = function (dD) { + var dC = g.doNotTrack || g.msDoNotTrack; + c6 = dD && (dC === 'yes' || dC === '1'); + if (c6) { + this.disableCookies(); + } + }; + this.alwaysUseSendBeacon = function () { + dd = true; + }; + this.disableAlwaysUseSendBeacon = function () { + dd = false; + }; + this.addListener = function (dD, dC) { + av(dD, dC, false); + }; + this.enableLinkTracking = function (dD) { + if (dr) { + return; + } + dr = true; + var dC = this; + q(function () { + au = true; + var dE = J.body; + av(dE, dD, true); + }); + }; + this.enableJSErrorTracking = function () { + if (c8) { + return; + } + c8 = true; + var dC = W.onerror; + W.onerror = function (dH, dF, dE, dG, dD) { + cr(function () { + var dI = 'JavaScript Errors'; + var dJ = dF + ':' + dE; + if (dG) { + dJ += ':' + dG; + } + if (P(cG, dI + dJ + dH) === -1) { + cG.push(dI + dJ + dH); + ax(dI, dJ, dH); + } + }); + if (dC) { + return dC(dH, dF, dE, dG, dD); + } + return false; + }; + }; + this.disablePerformanceTracking = function () { + a9 = false; + }; + this.enableHeartBeatTimer = function (dC) { + dC = Math.max(dC || 15, 5); + bc = dC * 1000; + if (dg !== null) { + dz(); + } + }; + this.disableHeartBeatTimer = function () { + if (bc || aS) { + if (W.removeEventListener) { + W.removeEventListener('focus', bh); + W.removeEventListener('blur', aD); + W.removeEventListener('visibilitychange', a1); + } else { + if (W.detachEvent) { + W.detachEvent('onfocus', bh); + W.detachEvent('onblur', aD); + W.detachEvent('visibilitychange', a1); + } + } + } + bc = null; + aS = false; + }; + this.killFrame = function () { + if (W.location !== W.top.location) { + W.top.location = W.location; + } + }; + this.redirectFile = function (dC) { + if (W.location.protocol === 'file:') { + W.location = dC; + } + }; + this.setCountPreRendered = function (dC) { + bl = dC; + }; + this.trackGoal = function (dC, dF, dE, dD) { + cr(function () { + c9(dC, dF, dE, dD); + }); + }; + this.trackLink = function (dD, dC, dF, dE) { + cr(function () { + dj(dD, dC, dF, dE); + }); + }; + this.getNumTrackedPageViews = function () { + return cE; + }; + this.trackPageView = function (dC, dE, dD) { + ck = []; + c1 = []; + cG = []; + if (R(cf)) { + cr(function () { + ad(aI, bQ, cf); + }); + } else { + cr(function () { + cE++; + b9(dC, dE, dD); + }); + } + }; + this.disableBrowserFeatureDetection = function () { + de = false; + }; + this.enableBrowserFeatureDetection = function () { + de = true; + }; + this.trackAllContentImpressions = function () { + if (R(cf)) { + return; + } + cr(function () { + q(function () { + var dC = w.findContentNodes(); + var dD = cP(dC); + bM.pushMultiple(dD); + }); + }); + }; + this.trackVisibleContentImpressions = function (dC, dD) { + if (R(cf)) { + return; + } + if (!M(dC)) { + dC = true; + } + if (!M(dD)) { + dD = 750; + } + aX(dC, dD, this); + cr(function () { + n(function () { + var dE = w.findContentNodes(); + var dF = bg(dE); + bM.pushMultiple(dF); + }); + }); + }; + this.trackContentImpression = function (dE, dC, dD) { + if (R(cf)) { + return; + } + dE = a(dE); + dC = a(dC); + dD = a(dD); + if (!dE) { + return; + } + dC = dC || 'Unknown'; + cr(function () { + var dF = aK(dE, dC, dD); + bM.push(dF); + }); + }; + this.trackContentImpressionsWithinNode = function (dC) { + if (R(cf) || !dC) { + return; + } + cr(function () { + if (cp) { + n(function () { + var dD = w.findContentNodesWithinNode(dC); + var dE = bg(dD); + bM.pushMultiple(dE); + }); + } else { + q(function () { + var dD = w.findContentNodesWithinNode(dC); + var dE = cP(dD); + bM.pushMultiple(dE); + }); + } + }); + }; + this.trackContentInteraction = function (dE, dF, dC, dD) { + if (R(cf)) { + return; + } + dE = a(dE); + dF = a(dF); + dC = a(dC); + dD = a(dD); + if (!dE || !dF) { + return; + } + dC = dC || 'Unknown'; + cr(function () { + var dG = aU(dE, dF, dC, dD); + if (dG) { + bM.push(dG); + } + }); + }; + this.trackContentInteractionNode = function (dE, dD) { + if (R(cf) || !dE) { + return; + } + var dC = null; + cr(function () { + dC = du(dE, dD); + if (dC) { + bM.push(dC); + } + }); + return dC; + }; + this.logAllContentBlocksOnPage = function () { + var dE = w.findContentNodes(); + var dC = w.collectContent(dE); + var dD = typeof console; + if (dD !== 'undefined' && console && console.log) { + console.log(dC); + } + }; + this.trackEvent = function (dD, dF, dC, dE, dH, dG) { + cr(function () { + ax(dD, dF, dC, dE, dH, dG); + }); + }; + this.trackSiteSearch = function (dC, dE, dD, dF) { + ck = []; + cr(function () { + ch(dC, dE, dD, dF); + }); + }; + this.setEcommerceView = function (dG, dC, dE, dD) { + cH = {}; + if (ac(dE)) { + dE = String(dE); + } + if (!M(dE) || dE === null || dE === false || !dE.length) { + dE = ''; + } else { + if (dE instanceof Array) { + dE = W.JSON.stringify(dE); + } + } + var dF = '_pkc'; + cH[dF] = dE; + if (M(dD) && dD !== null && dD !== false && String(dD).length) { + dF = '_pkp'; + cH[dF] = dD; + } + if (!ac(dG) && !ac(dC)) { + return; + } + if (ac(dG)) { + dF = '_pks'; + cH[dF] = dG; + } + if (!ac(dC)) { + dC = ''; + } + dF = '_pkn'; + cH[dF] = dC; + }; + this.getEcommerceItems = function () { + return JSON.parse(JSON.stringify(di)); + }; + this.addEcommerceItem = function (dG, dC, dE, dD, dF) { + if (ac(dG)) { + di[dG] = [String(dG), dC, dE, dD, dF]; + } + }; + this.removeEcommerceItem = function (dC) { + if (ac(dC)) { + dC = String(dC); + delete di[dC]; + } + }; + this.clearEcommerceCart = function () { + di = {}; + }; + this.trackEcommerceOrder = function (dC, dG, dF, dE, dD, dH) { + b7(dC, dG, dF, dE, dD, dH); + }; + this.trackEcommerceCartUpdate = function (dC) { + bB(dC); + }; + this.trackRequest = function (dD, dF, dE, dC) { + cr(function () { + var dG = cF(dD, dF, dC); + bO(dG, bS, dE); + }); + }; + this.ping = function () { + this.trackRequest('ping=1', null, null, 'ping'); + }; + this.disableQueueRequest = function () { + bM.enabled = false; + }; + this.setRequestQueueInterval = function (dC) { + if (dC < 1000) { + throw new Error('Request queue interval needs to be at least 1000ms'); + } + bM.interval = dC; + }; + this.queueRequest = function (dC) { + cr(function () { + var dD = cF(dC); + bM.push(dD); + }); + }; + this.isConsentRequired = function () { + return cQ; + }; + this.getRememberedConsent = function () { + var dC = aH(bk); + if (aH(c2)) { + if (dC) { + b8(bk, by, df); + } + return null; + } + if (!dC || dC === 0) { + return null; + } + return dC; + }; + this.hasRememberedConsent = function () { + return !!this.getRememberedConsent(); + }; + this.requireConsent = function () { + cQ = true; + bL = this.hasRememberedConsent(); + if (!bL) { + bt = true; + } + y++; + b['CoreConsent' + y] = { + unload: function () { + if (!bL) { + aJ(); + } + }, + }; + }; + this.setConsentGiven = function (dD) { + bL = true; + de = true; + b8(c2, by, df); + var dE, dC; + for (dE = 0; dE < c1.length; dE++) { + dC = typeof c1[dE]; + if (dC === 'string') { + bO(c1[dE], bS); + } else { + if (dC === 'object') { + dy(c1[dE], bS); + } + } + } + c1 = []; + if (!M(dD) || dD) { + this.setCookieConsentGiven(); + } + }; + this.rememberConsentGiven = function (dE) { + if (dE) { + dE = dE * 60 * 60 * 1000; + } else { + dE = 30 * 365 * 24 * 60 * 60 * 1000; + } + var dC = true; + this.setConsentGiven(dC); + var dD = new Date().getTime(); + dx(bk, dD, dE, by, df, b1, aN); + }; + this.forgetConsentGiven = function (dC) { + if (dC) { + dC = dC * 60 * 60 * 1000; + } else { + dC = 30 * 365 * 24 * 60 * 60 * 1000; + } + b8(bk, by, df); + dx(c2, new Date().getTime(), dC, by, df, b1, aN); + this.forgetCookieConsentGiven(); + this.requireConsent(); + }; + this.isUserOptedOut = function () { + return !bL; + }; + this.optUserOut = this.forgetConsentGiven; + this.forgetUserOptOut = function () { + this.setConsentGiven(false); + }; + n(function () { + setTimeout(function () { + bN = true; + }, 0); + }); + u.trigger('TrackerSetup', [this]); + u.addPlugin('TrackerVisitorIdCookie' + aB, { + unload: function () { + if (!aA) { + aR(); + ds(); + } + }, + }); + } + function K() { + return { push: aj }; + } + function c(ay, ax) { + var az = {}; + var av, aw; + for (av = 0; av < ax.length; av++) { + var at = ax[av]; + az[at] = 1; + for (aw = 0; aw < ay.length; aw++) { + if (ay[aw] && ay[aw][0]) { + var au = ay[aw][0]; + if (at === au) { + aj(ay[aw]); + delete ay[aw]; + if ( + az[au] > 1 && + au !== 'addTracker' && + au !== 'enableLinkTracking' + ) { + ao( + 'The method ' + + au + + ' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Matomo trackers documentation: https://developer.matomo.org/guides/tracking-javascript-guide#multiple-piwik-trackers' + ); + } + az[au]++; + } + } + } + } + return ay; + } + var E = [ + 'addTracker', + 'forgetCookieConsentGiven', + 'requireCookieConsent', + 'disableBrowserFeatureDetection', + 'disableCookies', + 'setTrackerUrl', + 'setAPIUrl', + 'enableCrossDomainLinking', + 'setCrossDomainLinkingTimeout', + 'setSessionCookieTimeout', + 'setVisitorCookieTimeout', + 'setCookieNamePrefix', + 'setCookieSameSite', + 'setSecureCookie', + 'setCookiePath', + 'setCookieDomain', + 'setDomains', + 'setUserId', + 'setVisitorId', + 'setSiteId', + 'alwaysUseSendBeacon', + 'disableAlwaysUseSendBeacon', + 'enableLinkTracking', + 'setCookieConsentGiven', + 'requireConsent', + 'setConsentGiven', + 'disablePerformanceTracking', + 'setPagePerformanceTiming', + 'setExcludedQueryParams', + 'setExcludedReferrers', + ]; + function ah(av, au) { + var at = new T(av, au); + L.push(at); + _paq = c(_paq, E); + for (H = 0; H < _paq.length; H++) { + if (_paq[H]) { + aj(_paq[H]); + } + } + _paq = new K(); + u.trigger('TrackerAdded', [at]); + return at; + } + ar(W, 'beforeunload', am, false); + ar( + W, + 'visibilitychange', + function () { + if (m) { + return; + } + if (J.visibilityState === 'hidden') { + ag('unload'); + } + }, + false + ); + ar( + W, + 'online', + function () { + if (M(g.serviceWorker)) { + g.serviceWorker.ready.then( + function (at) { + if (at && at.sync) { + return at.sync.register('matomoSync'); + } + }, + function () {} + ); + } + }, + false + ); + ar( + W, + 'message', + function (ay) { + if (!ay || !ay.origin) { + return; + } + var aA, aw, au; + var aB = d(ay.origin); + var ax = u.getAsyncTrackers(); + for (aw = 0; aw < ax.length; aw++) { + au = d(ax[aw].getMatomoUrl()); + if (au === aB) { + aA = ax[aw]; + break; + } + } + if (!aA) { + return; + } + var av = null; + try { + av = JSON.parse(ay.data); + } catch (az) { + return; + } + if (!av) { + return; + } + function at(aE) { + var aG = J.getElementsByTagName('iframe'); + for (aw = 0; aw < aG.length; aw++) { + var aF = aG[aw]; + var aC = d(aF.src); + if ( + aF.contentWindow && + M(aF.contentWindow.postMessage) && + aC === aB + ) { + var aD = JSON.stringify(aE); + aF.contentWindow.postMessage(aD, ay.origin); + } + } + } + if (M(av.maq_initial_value)) { + at({ + maq_opted_in: av.maq_initial_value && aA.hasConsent(), + maq_url: aA.getMatomoUrl(), + maq_optout_by_default: aA.isConsentRequired(), + }); + } else { + if (M(av.maq_opted_in)) { + ax = u.getAsyncTrackers(); + for (aw = 0; aw < ax.length; aw++) { + aA = ax[aw]; + if (av.maq_opted_in) { + aA.rememberConsentGiven(); + } else { + aA.forgetConsentGiven(); + } + } + at({ + maq_confirm_opted_in: aA.hasConsent(), + maq_url: aA.getMatomoUrl(), + maq_optout_by_default: aA.isConsentRequired(), + }); + } + } + }, + false + ); + Date.prototype.getTimeAlias = Date.prototype.getTime; + u = { + initialized: false, + JSON: W.JSON, + DOM: { + addEventListener: function (aw, av, au, at) { + var ax = typeof at; + if (ax === 'undefined') { + at = false; + } + ar(aw, av, au, at); + }, + onLoad: n, + onReady: q, + isNodeVisible: i, + isOrWasNodeVisible: w.isNodeVisible, + }, + on: function (au, at) { + if (!z[au]) { + z[au] = []; + } + z[au].push(at); + }, + off: function (av, au) { + if (!z[av]) { + return; + } + var at = 0; + for (at; at < z[av].length; at++) { + if (z[av][at] === au) { + z[av].splice(at, 1); + } + } + }, + trigger: function (av, aw, au) { + if (!z[av]) { + return; + } + var at = 0; + for (at; at < z[av].length; at++) { + z[av][at].apply(au || W, aw); + } + }, + addPlugin: function (at, au) { + b[at] = au; + }, + getTracker: function (au, at) { + if (!M(at)) { + at = this.getAsyncTracker().getSiteId(); + } + if (!M(au)) { + au = this.getAsyncTracker().getTrackerUrl(); + } + return new T(au, at); + }, + getAsyncTrackers: function () { + return L; + }, + addTracker: function (av, au) { + var at; + if (!L.length) { + at = ah(av, au); + } else { + at = L[0].addTracker(av, au); + } + return at; + }, + getAsyncTracker: function (ax, aw) { + var av; + if (L && L.length && L[0]) { + av = L[0]; + } else { + return ah(ax, aw); + } + if (!aw && !ax) { + return av; + } + if ((!M(aw) || null === aw) && av) { + aw = av.getSiteId(); + } + if ((!M(ax) || null === ax) && av) { + ax = av.getTrackerUrl(); + } + var au, + at = 0; + for (at; at < L.length; at++) { + au = L[at]; + if ( + au && + String(au.getSiteId()) === String(aw) && + au.getTrackerUrl() === ax + ) { + return au; + } + } + }, + retryMissedPluginCalls: function () { + var au = al; + al = []; + var at = 0; + for (at; at < au.length; at++) { + aj(au[at]); + } + }, + }; + if (typeof define === 'function' && define.amd) { + define('piwik', [], function () { + return u; + }); + define('matomo', [], function () { + return u; + }); + } + return u; + })(); +} /*!!! pluginTrackerHook */ -(function(){function b(){if("object"!==typeof _paq){return false}var c=typeof _paq.length;if("undefined"===c){return false}return !!_paq.length}if(window&&"object"===typeof window.matomoPluginAsyncInit&&window.matomoPluginAsyncInit.length){var a=0; - for(a;a 0; + } + public hasPredefinedFlavors(): boolean { + return Object.keys(this.cupped_flavor.predefined_flavors).length > 0; + } public fixDataTypes(): boolean { let fixNeeded: boolean = false; diff --git a/src/classes/settings/settings.ts b/src/classes/settings/settings.ts index fffe7fe2a..a97c91f48 100755 --- a/src/classes/settings/settings.ts +++ b/src/classes/settings/settings.ts @@ -99,6 +99,7 @@ export class Settings implements ISettings { public pressure_log: boolean; public pressure_threshold_active: boolean; public pressure_threshold_bar: number; + public pressure_stay_connected: boolean; public currency: string; @@ -252,6 +253,7 @@ export class Settings implements ISettings { this.pressure_log = false; this.pressure_threshold_active = false; this.pressure_threshold_bar = 0.5; + this.pressure_stay_connected = false; this.currency = 'EUR'; } diff --git a/src/classes/version/iVersion.ts b/src/classes/version/iVersion.ts index c8d058f28..cb6af0c12 100755 --- a/src/classes/version/iVersion.ts +++ b/src/classes/version/iVersion.ts @@ -1,17 +1,14 @@ /** Interfaces */ /** Enums */ /** Classes */ -import {Config} from '../objectConfig/objectConfig'; -import {IVersion} from '../../interfaces/version/iVersion'; - +import { Config } from '../objectConfig/objectConfig'; +import { IVersion } from '../../interfaces/version/iVersion'; export class Version implements IVersion { - public config: Config; public alreadyDisplayedVersions: Array; public updatedDataVersions: Array; - constructor() { this.alreadyDisplayedVersions = []; this.updatedDataVersions = []; @@ -22,18 +19,22 @@ export class Version implements IVersion { Object.assign(this, versionObj); } - public whichUpdateScreensShallBeDisplayed(actualAppVersion: string): Array { - const versionCode: string = actualAppVersion; - const filteredVersions = this.getUpdatedVersions().filter((e)=> this.alreadyDisplayedVersions.filter((b) => b === e).length === 0); - - const displayVersions: Array = []; - for (const v of filteredVersions) { - const compare = this.versionCompare(versionCode,v); - if (compare >=0) { - displayVersions.push(v); - } + public whichUpdateScreensShallBeDisplayed( + actualAppVersion: string + ): Array { + const versionCode: string = actualAppVersion; + const filteredVersions = this.getUpdatedVersions().filter( + (e) => this.alreadyDisplayedVersions.filter((b) => b === e).length === 0 + ); + + const displayVersions: Array = []; + for (const v of filteredVersions) { + const compare = this.versionCompare(versionCode, v); + if (compare >= 0) { + displayVersions.push(v); } - return displayVersions; + } + return displayVersions; } public pushUpdatedVersion(updatedVersion: string) { @@ -45,11 +46,13 @@ export class Version implements IVersion { } public checkIfDataVersionWasUpdated(_updatedDataVersion: string) { - const foundEntries= this.updatedDataVersions.find((e)=> e === _updatedDataVersion); - if (foundEntries && foundEntries.length > 0) { + const foundEntries = this.updatedDataVersions.find( + (e) => e === _updatedDataVersion + ); + if (foundEntries && foundEntries.length > 0) { return true; - } - return false; + } + return false; } /** @@ -57,21 +60,27 @@ export class Version implements IVersion { * We dont set this to a variable, else it would be stored in DB and wrongly overwritten */ private getUpdatedVersions() { - return ['5.0.0','5.1.0','5.2.0','5.3.1','5.4.0','6.0.0','6.1.0','6.1.5']; + return [ + '5.0.0', + '5.1.0', + '5.2.0', + '5.3.1', + '5.4.0', + '6.0.0', + '6.1.0', + '6.1.5', + '6.2.0', + ]; } - private versionCompare(_actualAppVersion, _updateVersion) { - const actualVersion = parseInt(_actualAppVersion.replace(/[.]/g,''),0); - const replacedVersion = parseInt(_updateVersion.replace(/[.]/g,''),0); + private versionCompare(_actualAppVersion, _updateVersion) { + const actualVersion = parseInt(_actualAppVersion.replace(/[.]/g, ''), 0); + const replacedVersion = parseInt(_updateVersion.replace(/[.]/g, ''), 0); if (actualVersion > replacedVersion) { return -1; } else if (actualVersion === replacedVersion) { return 0; } return 1; - - } - - } diff --git a/src/classes/visualizer/visualizer.ts b/src/classes/visualizer/visualizer.ts index ad1e2f24b..48737893b 100755 --- a/src/classes/visualizer/visualizer.ts +++ b/src/classes/visualizer/visualizer.ts @@ -7,14 +7,11 @@ export class Visualizer { public timers: {}; public pressure: { pressure: Array; - goal: Array; }; public flow: { flow: Array; by_weight: Array; - by_weight_raw: Array; - goal: Array; }; public temperature: { @@ -27,10 +24,6 @@ export class Visualizer { weight: Array; water_dispensed: Array; }; - public resistance: { - resistance: Array; - by_weight: Array; - }; public state_change: Array; public profile: { @@ -38,7 +31,7 @@ export class Visualizer { author: string; notes: string; beverage_type: string; - steps: Array; + version: string; }; public meta: { @@ -67,6 +60,22 @@ export class Visualizer { public app: { app_name: string; app_version: string; + data: { + settings: { + my_name: string; + beverage_type: string; + bean_brand: string; + bean_type: string; + roast_date: string; + grinder_dose_weight: string; + running_weight: string; + drink_weight: string; + preinfusion_stop_timeout: string; + language: string; + grinder_setting: string; + drink_tds: string; + }; + }; }; constructor() { @@ -81,14 +90,11 @@ export class Visualizer { this.timers = {}; this.pressure = { pressure: [], - goal: [], }; this.flow = { flow: [], by_weight: [], - by_weight_raw: [], - goal: [], }; this.temperature = { @@ -101,10 +107,6 @@ export class Visualizer { weight: [], water_dispensed: [], }; - this.resistance = { - resistance: [], - by_weight: [], - }; this.state_change = []; @@ -113,7 +115,7 @@ export class Visualizer { author: '', notes: '', beverage_type: '', - steps: [], + version: '2', }; this.meta = { bean: { @@ -139,8 +141,24 @@ export class Visualizer { }; this.app = { - app_name: 'beanconqueror', + app_name: 'Beanconqueror', app_version: '2', + data: { + settings: { + my_name: 'Beanconqueror', + beverage_type: '', + bean_brand: '', + bean_type: '', + roast_date: '', + grinder_dose_weight: '', + running_weight: '', + drink_weight: '', + preinfusion_stop_timeout: '', + language: '', + grinder_setting: '', + drink_tds: '', + }, + }, }; } } diff --git a/src/components/bean-information/bean-information.component.html b/src/components/bean-information/bean-information.component.html index 079382d47..2681a4714 100644 --- a/src/components/bean-information/bean-information.component.html +++ b/src/components/bean-information/bean-information.component.html @@ -8,6 +8,9 @@ *ngIf="bean.isSelfRoasted()"> + + {{bean.name}} {{daysOld()}}
+ + {{'BREW_DATA_FLAVOR' | translate}}
+ {{getCuppedBrewFlavors()}} +
diff --git a/src/components/bean-information/bean-information.component.ts b/src/components/bean-information/bean-information.component.ts index 6cee3119a..097c01887 100644 --- a/src/components/bean-information/bean-information.component.ts +++ b/src/components/bean-information/bean-information.component.ts @@ -30,6 +30,7 @@ import QR_TRACKING from '../../data/tracking/qrTracking'; import { BeanMapper } from '../../mapper/bean/beanMapper'; import { ServerCommunicationService } from '../../services/serverCommunication/server-communication.service'; import { UIHelper } from '../../services/uiHelper'; +import { TranslateService } from '@ngx-translate/core'; @Component({ selector: 'bean-information', @@ -62,7 +63,8 @@ export class BeanInformationComponent implements OnInit { private readonly uiImage: UIImage, private readonly shareService: ShareService, private readonly serverCommunicationService: ServerCommunicationService, - private readonly uiHelper: UIHelper + private readonly uiHelper: UIHelper, + private readonly translate: TranslateService ) { this.settings = this.uiSettingsStorage.getSettings(); } @@ -94,6 +96,16 @@ export class BeanInformationComponent implements OnInit { return relatedBrews.length; } + public getCuppedBrewFlavors(): Array { + const flavors: Array = [...this.bean.cupped_flavor.custom_flavors]; + for (const key in this.bean.cupped_flavor.predefined_flavors) { + if (this.bean.cupped_flavor.predefined_flavors.hasOwnProperty(key)) { + flavors.push(this.translate.instant('CUPPING_' + key)); + } + } + return flavors; + } + public daysOld(): number { return this.bean.beanAgeInDays(); } @@ -178,6 +190,9 @@ export class BeanInformationComponent implements OnInit { case BEAN_ACTION.PHOTO_GALLERY: await this.viewPhotos(); break; + case BEAN_ACTION.CUPPING: + await this.cupBean(); + break; case BEAN_ACTION.TOGGLE_FAVOURITE: await this.toggleFavourite(); break; @@ -187,6 +202,9 @@ export class BeanInformationComponent implements OnInit { case BEAN_ACTION.REFRESH_DATA_FROM_QR_CODE: await this.refreshDataFromQRCode(); break; + case BEAN_ACTION.SHOW_BREWS: + await this.showBrews(); + break; default: break; } @@ -195,7 +213,9 @@ export class BeanInformationComponent implements OnInit { public async detailBean() { await this.uiBeanHelper.detailBean(this.bean); } - + public async cupBean() { + await this.uiBeanHelper.cupBean(this.bean); + } private async viewPhotos() { this.uiAnalytics.trackEvent( BEAN_TRACKING.TITLE, @@ -251,6 +271,10 @@ export class BeanInformationComponent implements OnInit { public async shareBean() { await this.shareService.shareBean(this.bean); } + + public async showBrews() { + await this.uiBeanHelper.showAssociatedBrewsForBean(this.bean); + } public async refreshDataFromQRCode() { await this.uiAlert .showConfirm('QR_CODE_REFRESH_DATA_MESSAGE', 'CARE', true) diff --git a/src/components/beans/bean-general-information/bean-general-information.component.html b/src/components/beans/bean-general-information/bean-general-information.component.html index d6d42bcdf..1150755ef 100644 --- a/src/components/beans/bean-general-information/bean-general-information.component.html +++ b/src/components/beans/bean-general-information/bean-general-information.component.html @@ -55,6 +55,13 @@ {{"ROAST_TYPE_" + key | translate}} + + {{"BEAN_DATA_CUSTOM_ROAST_NAME" | translate}} + + + {{"BREW_DATA_RATING" | translate }} {{this.uiHelper.toFixedIfNecessary(data.rating,2)}} @@ -66,13 +73,6 @@
- - {{"BEAN_DATA_CUSTOM_ROAST_NAME" | translate}} - - - {{"BEAN_DATA_MIX" | translate}} - + @@ -78,7 +78,7 @@ {{'BREW_DATA_FLAVOR' | translate}}
- {{getCuppedBrewFlavors()}} + {{getCuppedBrewFlavors()}}
+ @@ -219,4 +220,5 @@ + diff --git a/src/components/brew-information/brew-information.component.scss b/src/components/brew-information/brew-information.component.scss index b240731ce..655feba5f 100644 --- a/src/components/brew-information/brew-information.component.scss +++ b/src/components/brew-information/brew-information.component.scss @@ -1,5 +1,8 @@ :host { + ion-card-content { + background:#FFFFFF; + } .full-sized-icon { width: 100%; height: 100%; diff --git a/src/components/brew-information/brew-information.component.ts b/src/components/brew-information/brew-information.component.ts index e0fe3907b..82e3815f4 100644 --- a/src/components/brew-information/brew-information.component.ts +++ b/src/components/brew-information/brew-information.component.ts @@ -1,40 +1,53 @@ -import {Component, EventEmitter, Input, OnInit, Output, SimpleChange, ViewChild} from '@angular/core'; -import {Brew} from '../../classes/brew/brew'; -import {UISettingsStorage} from '../../services/uiSettingsStorage'; -import {ModalController} from '@ionic/angular'; -import {BREW_ACTION} from '../../enums/brews/brewAction'; -import {BrewPopoverActionsComponent} from '../../app/brew/brew-popover-actions/brew-popover-actions.component'; -import {Bean} from '../../classes/bean/bean'; -import {Preparation} from '../../classes/preparation/preparation'; -import {Mill} from '../../classes/mill/mill'; -import {BREW_QUANTITY_TYPES_ENUM} from '../../enums/brews/brewQuantityTypes'; -import {PREPARATION_STYLE_TYPE} from '../../enums/preparations/preparationStyleTypes'; -import {NgxStarsComponent} from 'ngx-stars'; -import {UIBrewHelper} from '../../services/uiBrewHelper'; -import {UIBrewStorage} from '../../services/uiBrewStorage'; -import {UIToast} from '../../services/uiToast'; -import {UIAnalytics} from '../../services/uiAnalytics'; -import {UIAlert} from '../../services/uiAlert'; -import {UIImage} from '../../services/uiImage'; -import {UIHelper} from '../../services/uiHelper'; +import { + Component, + ElementRef, + EventEmitter, + Input, + OnInit, + Output, + SimpleChange, + ViewChild, +} from '@angular/core'; +import { Brew } from '../../classes/brew/brew'; +import { UISettingsStorage } from '../../services/uiSettingsStorage'; +import { ModalController, Platform } from '@ionic/angular'; +import { BREW_ACTION } from '../../enums/brews/brewAction'; +import { BrewPopoverActionsComponent } from '../../app/brew/brew-popover-actions/brew-popover-actions.component'; +import { Bean } from '../../classes/bean/bean'; +import { Preparation } from '../../classes/preparation/preparation'; +import { Mill } from '../../classes/mill/mill'; +import { BREW_QUANTITY_TYPES_ENUM } from '../../enums/brews/brewQuantityTypes'; +import { PREPARATION_STYLE_TYPE } from '../../enums/preparations/preparationStyleTypes'; +import { NgxStarsComponent } from 'ngx-stars'; +import { UIBrewHelper } from '../../services/uiBrewHelper'; +import { UIBrewStorage } from '../../services/uiBrewStorage'; +import { UIToast } from '../../services/uiToast'; +import { UIAnalytics } from '../../services/uiAnalytics'; +import { UIAlert } from '../../services/uiAlert'; +import { UIImage } from '../../services/uiImage'; +import { UIHelper } from '../../services/uiHelper'; import BREW_TRACKING from '../../data/tracking/brewTracking'; -import {Settings} from '../../classes/settings/settings'; -import {ShareService} from '../../services/shareService/share-service.service'; -import {TranslateService} from '@ngx-translate/core'; -import {BrewTrackingService} from '../../services/brewTracking/brew-tracking.service'; -import {UIHealthKit} from '../../services/uiHealthKit'; - +import { Settings } from '../../classes/settings/settings'; +import { ShareService } from '../../services/shareService/share-service.service'; +import { TranslateService } from '@ngx-translate/core'; +import { BrewTrackingService } from '../../services/brewTracking/brew-tracking.service'; +import { UIHealthKit } from '../../services/uiHealthKit'; +import * as htmlToImage from 'html-to-image'; +import { Visualizer } from '../../classes/visualizer/visualizer'; +import moment from 'moment'; +declare var window; @Component({ selector: 'brew-information', templateUrl: './brew-information.component.html', styleUrls: ['./brew-information.component.scss'], - }) export class BrewInformationComponent implements OnInit { @Input() public brew: Brew; @Input() public layout: string = 'brew'; - - @ViewChild('brewStars', {read: NgxStarsComponent, static: false}) public brewStars: NgxStarsComponent; + @ViewChild('card', { read: ElementRef }) + public cardEl: ElementRef; + @ViewChild('brewStars', { read: NgxStarsComponent, static: false }) + public brewStars: NgxStarsComponent; @Output() public brewAction: EventEmitter = new EventEmitter(); public PREPARATION_STYLE_TYPE = PREPARATION_STYLE_TYPE; @@ -44,42 +57,40 @@ export class BrewInformationComponent implements OnInit { public mill: Mill; public brewQuantityEnum = BREW_QUANTITY_TYPES_ENUM; - public settings: Settings = null; - constructor(private readonly uiSettingsStorage: UISettingsStorage, - public readonly uiBrewHelper: UIBrewHelper, - private readonly uiBrewStorage: UIBrewStorage, - private readonly uiToast: UIToast, - private readonly uiAnalytics: UIAnalytics, - private readonly uiAlert: UIAlert, - private readonly uiImage: UIImage, - private readonly modalCtrl: ModalController, - private readonly uiHelper: UIHelper, - private readonly shareService: ShareService, - private readonly translate: TranslateService, - private readonly brewTracking: BrewTrackingService, - private readonly uiHealthKit: UIHealthKit) { - - } + constructor( + private readonly uiSettingsStorage: UISettingsStorage, + public readonly uiBrewHelper: UIBrewHelper, + private readonly uiBrewStorage: UIBrewStorage, + private readonly uiToast: UIToast, + private readonly uiAnalytics: UIAnalytics, + private readonly uiAlert: UIAlert, + private readonly uiImage: UIImage, + private readonly modalCtrl: ModalController, + private readonly uiHelper: UIHelper, + private readonly shareService: ShareService, + private readonly translate: TranslateService, + private readonly brewTracking: BrewTrackingService, + private readonly uiHealthKit: UIHealthKit, + private readonly platform: Platform + ) {} public ngOnInit() { if (this.brew) { - this.settings = this.uiSettingsStorage.getSettings(); + this.settings = this.uiSettingsStorage.getSettings(); this.bean = this.brew.getBean(); this.preparation = this.brew.getPreparation(); this.mill = this.brew.getMill(); } - } public hasCustomRatingRange(): boolean { if (this.settings) { - // #379 - if (this.settings.brew_rating !== 5) { + if (Number(this.settings.brew_rating) !== 5) { return true; - } else if (this.settings.brew_rating_steps !== 1) { + } else if (Number(this.settings.brew_rating_steps) !== 1) { return true; } } @@ -96,9 +107,7 @@ export class BrewInformationComponent implements OnInit { public ngOnChanges(changes: SimpleChange) { // changes.prop contains the old and the new value... - this.resetRenderingRating(); - - + this.resetRenderingRating(); } private resetRenderingRating() { if (this.brewStars && this.brew.rating > 0) { @@ -114,11 +123,14 @@ export class BrewInformationComponent implements OnInit { public async showBrewActions(event): Promise { event.stopPropagation(); event.stopImmediatePropagation(); - this.uiAnalytics.trackEvent(BREW_TRACKING.TITLE, BREW_TRACKING.ACTIONS.POPOVER_ACTIONS); + this.uiAnalytics.trackEvent( + BREW_TRACKING.TITLE, + BREW_TRACKING.ACTIONS.POPOVER_ACTIONS + ); const popover = await this.modalCtrl.create({ component: BrewPopoverActionsComponent, - componentProps: {brew: this.brew}, + componentProps: { brew: this.brew }, id: BrewPopoverActionsComponent.COMPONENT_ID, cssClass: 'popover-actions', breakpoints: [0, 0.75, 1], @@ -132,7 +144,6 @@ export class BrewInformationComponent implements OnInit { } } - private async internalBrewAction(action: BREW_ACTION) { switch (action) { case BREW_ACTION.REPEAT: @@ -147,7 +158,7 @@ export class BrewInformationComponent implements OnInit { case BREW_ACTION.DELETE: try { await this.deleteBrew(); - }catch (ex) {} + } catch (ex) {} break; case BREW_ACTION.PHOTO_GALLERY: await this.viewPhotos(); @@ -174,19 +185,31 @@ export class BrewInformationComponent implements OnInit { public async fastRepeatBrew() { if (this.uiBrewHelper.canBrewIfNotShowMessage()) { - this.uiAnalytics.trackEvent(BREW_TRACKING.TITLE, BREW_TRACKING.ACTIONS.FAST_REPEAT); + this.uiAnalytics.trackEvent( + BREW_TRACKING.TITLE, + BREW_TRACKING.ACTIONS.FAST_REPEAT + ); const repeatBrew = this.uiBrewHelper.copyBrewToRepeat(this.brew); await this.uiBrewStorage.add(repeatBrew); this.brewTracking.trackBrew(repeatBrew); - if (this.settings.track_caffeine_consumption && repeatBrew.grind_weight > 0 && repeatBrew.getBean().decaffeinated === false) { - this.uiHealthKit.trackCaffeineConsumption(repeatBrew.getCaffeineAmount(),new Date()); + if ( + this.settings.track_caffeine_consumption && + repeatBrew.grind_weight > 0 && + repeatBrew.getBean().decaffeinated === false + ) { + this.uiHealthKit.trackCaffeineConsumption( + repeatBrew.getCaffeineAmount(), + new Date() + ); } this.uiToast.showInfoToast('TOAST_BREW_REPEATED_SUCCESSFULLY'); // If fast repeat is used, also recheck if bean package is consumed - await this.uiBrewHelper.checkIfBeanPackageIsConsumedTriggerMessageAndArchive(this.brew.getBean()); + await this.uiBrewHelper.checkIfBeanPackageIsConsumedTriggerMessageAndArchive( + this.brew.getBean() + ); } } @@ -201,47 +224,171 @@ export class BrewInformationComponent implements OnInit { } public async repeatBrew() { if (this.uiBrewHelper.canBrewIfNotShowMessage()) { - this.uiAnalytics.trackEvent(BREW_TRACKING.TITLE, BREW_TRACKING.ACTIONS.REPEAT); + this.uiAnalytics.trackEvent( + BREW_TRACKING.TITLE, + BREW_TRACKING.ACTIONS.REPEAT + ); await this.uiBrewHelper.repeatBrew(this.brew); } } public async toggleFavourite() { if (!this.brew.favourite) { - this.uiAnalytics.trackEvent(BREW_TRACKING.TITLE, BREW_TRACKING.ACTIONS.ADD_FAVOURITE); + this.uiAnalytics.trackEvent( + BREW_TRACKING.TITLE, + BREW_TRACKING.ACTIONS.ADD_FAVOURITE + ); this.uiToast.showInfoToast('TOAST_BREW_FAVOURITE_ADDED'); this.brew.favourite = true; } else { - this.uiAnalytics.trackEvent(BREW_TRACKING.TITLE, BREW_TRACKING.ACTIONS.REMOVE_FAVOURITE); + this.uiAnalytics.trackEvent( + BREW_TRACKING.TITLE, + BREW_TRACKING.ACTIONS.REMOVE_FAVOURITE + ); this.brew.favourite = false; this.uiToast.showInfoToast('TOAST_BREW_FAVOURITE_REMOVED'); } await this.uiBrewStorage.update(this.brew); } - public async detailBrew() { await this.uiBrewHelper.detailBrew(this.brew); } public async cupBrew() { await this.uiBrewHelper.cupBrew(this.brew); - } public async showMapCoordinates() { - this.uiAnalytics.trackEvent(BREW_TRACKING.TITLE, BREW_TRACKING.ACTIONS.SHOW_MAP); + this.uiAnalytics.trackEvent( + BREW_TRACKING.TITLE, + BREW_TRACKING.ACTIONS.SHOW_MAP + ); this.uiHelper.openExternalWebpage(this.brew.getCoordinateMapLink()); } - public async viewPhotos() { - this.uiAnalytics.trackEvent(BREW_TRACKING.TITLE, BREW_TRACKING.ACTIONS.PHOTO_VIEW); + this.uiAnalytics.trackEvent( + BREW_TRACKING.TITLE, + BREW_TRACKING.ACTIONS.PHOTO_VIEW + ); await this.uiImage.viewPhotos(this.brew); } + public shareToVisualizer() { + const t: Visualizer = new Visualizer(); + t.meta.in = this.brew.grind_weight.toString(); + if ( + this.brew.getPreparation().getPresetStyleType() === + PREPARATION_STYLE_TYPE.ESPRESSO + ) { + t.meta.out = this.brew.brew_beverage_quantity.toString(); + } else { + t.meta.out = this.brew.brew_quantity.toString(); + } + + t.meta.time = + this.brew.brew_time.toString() + + '.' + + this.brew.brew_time_milliseconds.toString(); + t.meta.bean.brand = this.brew.getBean().roaster; + t.meta.bean.type = this.brew.getBean().name; + //t.meta.bean.roast_level = "medium-light"; + //t.meta.bean.roast_date = "2022-05"; + t.meta.shot.enjoyment = this.brew.rating.toString(); + t.meta.shot.tds = this.brew.tds.toString(); + t.meta.shot.ey = this.brew.getExtractionYield(); + t.meta.grinder.setting = this.brew.grind_size.toString(); + t.version = '2'; + t.profile.title = 'Beanconqueror'; + t.profile.author = 'Beanconqueror'; + t.profile.beverage_type = 'espresso'; + t.timestamp = this.brew.config.unix_timestamp.toString(); + t.clock = this.brew.config.unix_timestamp.toString(); + t.date = moment.unix(this.brew.config.unix_timestamp).toDate().toString(); + t.elapsed.push('0.045'); + t.elapsed.push('0.248'); + t.elapsed.push('0.552'); + t.elapsed.push('0.761'); + t.elapsed.push('1.0'); + t.totals.weight.push('1'); + t.totals.weight.push('2'); + t.totals.weight.push('3'); + t.totals.weight.push('4'); + t.totals.weight.push('5'); + + //console.log(JSON.stringify(t)); + + // this.saveTemplateAsFile('bla.json',t); + } + public saveTemplateAsFile(filename, dataObjToWrite) { + const blob = new Blob([JSON.stringify(dataObjToWrite)], { + type: 'text/json', + }); + const link = document.createElement('a'); + + link.download = filename; + link.href = window.URL.createObjectURL(blob); + link.dataset.downloadurl = ['text/json', link.download, link.href].join( + ':' + ); + + const evt = new MouseEvent('click', { + view: window, + bubbles: true, + cancelable: true, + }); + + link.dispatchEvent(evt); + link.remove(); + } + public async share() { - await this.shareService.shareBrew(this.brew); + this.uiAnalytics.trackEvent( + BREW_TRACKING.TITLE, + BREW_TRACKING.ACTIONS.SHARE + ); + this.uiAlert.showLoadingSpinner(); + if (this.platform.is('ios')) { + htmlToImage + .toJpeg(this.cardEl.nativeElement) + .then((_dataURL) => { + // On iOS we need to do this a second time, because the rendering doesn't render everything (strange thing) + setTimeout(() => { + htmlToImage + .toJpeg(this.cardEl.nativeElement) + .then((_dataURLSecond) => { + this.uiAlert.hideLoadingSpinner(); + setTimeout(() => { + this.shareService.shareImage(_dataURLSecond); + }, 50); + }) + .catch((error) => { + this.uiAlert.hideLoadingSpinner(); + console.error('oops, something went wrong!', error); + }); + }, 500); + }) + .catch((error) => { + this.uiAlert.hideLoadingSpinner(); + console.error('oops, something went wrong!', error); + }); + } else { + htmlToImage + .toJpeg(this.cardEl.nativeElement) + .then((_dataURL) => { + this.uiAlert.hideLoadingSpinner(); + setTimeout(() => { + this.shareService.shareImage(_dataURL); + }, 50); + }) + .catch((error) => { + this.uiAlert.hideLoadingSpinner(); + console.error('oops, something went wrong!', error); + }); + } + + //await this.shareService.shareBrew(this.brew); } public getCuppedBrewFlavors(): Array { @@ -254,26 +401,29 @@ export class BrewInformationComponent implements OnInit { return flavors; } public deleteBrew(): Promise { - - return new Promise(async (resolve,reject) => { - this.uiAlert.showConfirm('DELETE_BREW_QUESTION', 'SURE_QUESTION', true).then(async () => { - // Yes - this.uiAnalytics.trackEvent(BREW_TRACKING.TITLE, BREW_TRACKING.ACTIONS.DELETE); - await this.__deleteBrew(); - this.uiToast.showInfoToast('TOAST_BREW_DELETED_SUCCESSFULLY'); - resolve(undefined); - }, - () => { - // No - reject(); - }); - } - ); + return new Promise(async (resolve, reject) => { + this.uiAlert + .showConfirm('DELETE_BREW_QUESTION', 'SURE_QUESTION', true) + .then( + async () => { + // Yes + this.uiAnalytics.trackEvent( + BREW_TRACKING.TITLE, + BREW_TRACKING.ACTIONS.DELETE + ); + await this.__deleteBrew(); + this.uiToast.showInfoToast('TOAST_BREW_DELETED_SUCCESSFULLY'); + resolve(undefined); + }, + () => { + // No + reject(); + } + ); + }); } private async __deleteBrew() { await this.uiBrewStorage.removeByObject(this.brew); } - - } diff --git a/src/components/brew-timer/brew-timer.component.html b/src/components/brew-timer/brew-timer.component.html index 24004d4af..6800169ac 100644 --- a/src/components/brew-timer/brew-timer.component.html +++ b/src/components/brew-timer/brew-timer.component.html @@ -21,11 +21,11 @@ - - + diff --git a/src/components/brew-timer/brew-timer.component.ts b/src/components/brew-timer/brew-timer.component.ts index 84e77512b..c37a211d1 100644 --- a/src/components/brew-timer/brew-timer.component.ts +++ b/src/components/brew-timer/brew-timer.component.ts @@ -33,6 +33,9 @@ export class BrewTimerComponent implements OnInit, OnDestroy { @Output() public dripTimer = new EventEmitter(); @Output() public tareScale = new EventEmitter(); + @Output() public timerStartPressed = new EventEmitter(); + @Output() public timerResumedPressed = new EventEmitter(); + public displayingTime: string = moment().startOf('day').toISOString(); private _dripTimerVisible: boolean; @@ -116,11 +119,27 @@ export class BrewTimerComponent implements OnInit, OnDestroy { .toISOString(); } + public __startTimer() { + if (this.timerStartPressed.observers.length > 0) { + this.timerStartPressed.emit(); + } else { + this.startTimer(); + } + } + public startTimer(_resumed: boolean = false): void { if (_resumed === false) { const startingDate = new Date(); this.startingDay = moment(startingDate).startOf('day'); - this.startedTimer = moment(startingDate); + if (this.timer.seconds > 0 || this.timer.milliseconds > 0) { + // We need to subtract, if the time is already given on start (like repeat or preset) + this.startedTimer = moment(startingDate) + .subtract(this.timer.seconds, 'seconds') + .subtract(this.timer.milliseconds, 'milliseconds'); + } else { + this.startedTimer = moment(startingDate); + } + this.startedOffset = this.startedTimer.diff(this.startingDay); } else { const restartTimer = moment(new Date()); @@ -129,13 +148,17 @@ export class BrewTimerComponent implements OnInit, OnDestroy { } this.timer.hasStarted = true; this.timer.runTimer = true; - this.timerTick(); + if (this.settings?.brew_milliseconds) { this.millisecondTick(); + } else { + this.timerTick(); } if (_resumed === false) { - this.timerStarted.emit(); + if (this.timerStartPressed.observers.length <= 0) { + this.timerStarted.emit(); + } } this.changeEvent(); @@ -163,9 +186,19 @@ export class BrewTimerComponent implements OnInit, OnDestroy { this.dripTimer.emit(this.getSeconds()); } + public __resumeTimer() { + if (this.timerResumedPressed.observers.length > 0) { + this.timerResumedPressed.emit(); + } else { + this.resumeTimer(); + } + } + public resumeTimer(): void { this.startTimer(true); - this.timerResumed.emit(); + if (this.timerResumedPressed.observers.length <= 0) { + this.timerResumed.emit(); + } } public millisecondTick(): void { @@ -176,6 +209,8 @@ export class BrewTimerComponent implements OnInit, OnDestroy { const milliSecondTimer = moment(new Date()).subtract(this.startedOffset); this.timer.milliseconds = milliSecondTimer.milliseconds(); + const passedSeconds = milliSecondTimer.diff(this.startingDay, 'seconds'); + this.timer.seconds = passedSeconds; this.displayingTime = moment(this.displayingTime) .startOf('day') @@ -183,6 +218,7 @@ export class BrewTimerComponent implements OnInit, OnDestroy { .add('milliseconds', this.timer.milliseconds) .toISOString(); this.millisecondTick(); + this.changeEvent(); }, 10); } public timerTick(): void { @@ -206,7 +242,7 @@ export class BrewTimerComponent implements OnInit, OnDestroy { this.timerTick(); this.changeEvent(); - }, 10); + }, 1000); } public getSeconds(): number { diff --git a/src/components/brews/brew-brewing/brew-brewing.component.html b/src/components/brews/brew-brewing/brew-brewing.component.html index 299bc2650..4c5def014 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.html +++ b/src/components/brews/brew-brewing/brew-brewing.component.html @@ -331,6 +331,8 @@ (bloomTimer)="setCoffeeBloomingTime($event)" (dripTimer)="setCoffeeDripTime($event)" (timerTicked)="brewTimeTicked($event)" + (timerStartPressed)="timerStartPressed($event)" + (timerResumedPressed)="timerResumedPressed($event)" (timerStarted)="timerStarted($event)" (timerResumed)="timerResumed($event)" (timerPaused)="timerPaused($event)" diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index ae5515886..0c4e9033d 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -113,21 +113,20 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { public scaleTareSubscription: Subscription = undefined; public scaleFlowSubscription: Subscription = undefined; public bluetoothSubscription: Subscription = undefined; + public flow_profile_raw: BrewFlow = new BrewFlow(); + @ViewChild('flowProfileChart', { static: false }) public flowProfileChart; + public flowProfileChartEl: any = undefined; + public pressureDeviceSubscription: Subscription = undefined; private scaleFlowChangeSubscription: Subscription = undefined; private flowProfileArr = []; private flowProfileArrObjs = []; private flowProfileArrCalculated = []; private flowTime: number = undefined; private flowSecondTick: number = 0; - public flow_profile_raw: BrewFlow = new BrewFlow(); - - @ViewChild('flowProfileChart', { static: false }) public flowProfileChart; - - public flowProfileChartEl: any = undefined; private startingFlowTime: number = undefined; private brewFlowGraphSubject: EventEmitter = new EventEmitter(); private brewPressureGraphSubject: EventEmitter = new EventEmitter(); - public pressureDeviceSubscription: Subscription = undefined; + private maximizeFlowGraphIsShown: boolean = false; constructor( private readonly platform: Platform, @@ -296,112 +295,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { }); } - private async __connectSmartScale(_firstStart: boolean) { - if (this.smartScaleConnected()) { - this.deattachToWeightChange(); - this.deattachToScaleEvents(); - - const scale: BluetoothScale = this.bleManager.getScale(); - if (scale && !this.scaleTimerSubscription) { - this.scaleTimerSubscription = scale.timerEvent.subscribe((event) => { - // Timer pressed - if (event) { - switch (event.command) { - case SCALE_TIMER_COMMAND.START: - this.timer.startTimer(); - break; - case SCALE_TIMER_COMMAND.STOP: - this.timer.pauseTimer(); - break; - case SCALE_TIMER_COMMAND.RESET: - this.timer.reset(); - break; - } - } else { - if (this.timer.isTimerRunning() === true) { - this.timer.pauseTimer(); - } else { - this.timer.startTimer(); - } - } - this.checkChanges(); - }); - } - if (scale && !this.scaleTareSubscription) { - this.scaleTareSubscription = scale.tareEvent.subscribe(() => { - // Timer pressed - if ( - this.data.getPreparation().style_type !== - PREPARATION_STYLE_TYPE.ESPRESSO - ) { - this.data.brew_quantity = 0; - } else { - this.data.brew_beverage_quantity = 0; - } - - this.checkChanges(); - }); - } - - if (_firstStart) { - if (this.settings.bluetooth_scale_tare_on_brew === true) { - if (scale) { - await scale.tare(); - } - } - - if (this.settings.bluetooth_scale_stop_timer_on_brew === true) { - await new Promise((resolve) => { - setTimeout(async () => { - if (scale) { - await scale.setTimer(SCALE_TIMER_COMMAND.STOP); - } - - resolve(undefined); - }, 50); - }); - } - - if (this.settings.bluetooth_scale_reset_timer_on_brew === true) { - await new Promise((resolve) => { - setTimeout(async () => { - if (scale) { - await scale.setTimer(SCALE_TIMER_COMMAND.RESET); - } - resolve(undefined); - }, 50); - }); - } - } - if (this.timer.isTimerRunning() === true && _firstStart === false) { - this.attachToScaleWeightChange(); - this.attachToFlowChange(); - } - - this.checkChanges(); - } - } - - private async __connectPressureDevice(_firstStart: boolean) { - if (this.pressureDeviceConnected()) { - this.deattachToPressureChange(); - - if (_firstStart) { - const pressureDevice: PressureDevice = - this.bleManager.getPressureDevice(); - if (pressureDevice) { - await pressureDevice.updateZero(); - } - } - if (this.timer.isTimerRunning() === true && _firstStart === false) { - this.attachToPressureChange(); - } else if (this.settings.pressure_threshold_active) { - this.attachToPressureChange(); - } - - this.checkChanges(); - } - } public async maximizeFlowGraph() { let actualOrientation; if (this.platform.is('cordova')) { @@ -433,8 +326,10 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { brewPressureGraphEvent: this.brewPressureGraphSubject, }, }); + this.maximizeFlowGraphIsShown = true; await modal.present(); await modal.onWillDismiss().then(async () => { + this.maximizeFlowGraphIsShown = false; // If responsive would be true, the add of the container would result into 0 width 0 height, therefore the hack this.flowProfileChartEl.options.responsive = false; this.flowProfileChartEl.update('quite'); @@ -485,11 +380,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { }); } - private checkChanges() { - this.changeDetectorRef.detectChanges(); - window.getComputedStyle(window.document.getElementsByTagName('body')[0]); - } - public ngOnDestroy() { // We don't deattach the timer subscription in the deattach toscale events, else we couldn't start anymore. @@ -584,15 +474,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } } - private getActualBluetoothWeight() { - try { - const scale: BluetoothScale = this.bleManager.getScale(); - return this.uiHelper.toFixedIfNecessary(scale.getWeight(), 1); - } catch (ex) { - return 0; - } - } - public bluetoothScaleSetGrindWeight() { this.data.grind_weight = this.getActualBluetoothWeight(); } @@ -616,287 +497,59 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { ); } - private initializeFlowChart(): void { - setTimeout(() => { - if (this.flowProfileChartEl) { - this.flowProfileChartEl.destroy(); - this.flowProfileChartEl = undefined; - this.flowTime = undefined; - this.flowSecondTick = 0; - this.flowProfileArr = []; - this.flowProfileArrObjs = []; - this.flowProfileArrCalculated = []; - } - if (this.flowProfileChartEl === undefined) { - let graphSettings = this.settings.graph.FILTER; - if ( - this.data.getPreparation().style_type === - PREPARATION_STYLE_TYPE.ESPRESSO - ) { - graphSettings = this.settings.graph.ESPRESSO; - } + public deattachToWeightChange() { + if (this.scaleFlowSubscription) { + this.scaleFlowSubscription.unsubscribe(); + this.scaleFlowSubscription = undefined; + } + } - const drinkingData = { - labels: [], - datasets: [ - { - label: this.translate.instant('BREW_FLOW_WEIGHT'), - data: [], - borderColor: 'rgb(159,140,111)', - backgroundColor: 'rgb(205,194,172)', - yAxisID: 'y', - pointRadius: 0, - tension: 0, - hidden: !graphSettings.weight, - }, - { - label: this.translate.instant('BREW_FLOW_WEIGHT_PER_SECOND'), - data: [], - borderColor: 'rgb(96,125,139)', - backgroundColor: 'rgb(127,151,162)', - yAxisID: 'y1', - spanGaps: true, - pointRadius: 0, - tension: 0, - hidden: !graphSettings.calc_flow, - }, - { - label: this.translate.instant('BREW_FLOW_WEIGHT_REALTIME'), - data: [], - borderColor: 'rgb(144,60,99)', - backgroundColor: 'rgb(191,101,143)', - yAxisID: 'y2', - spanGaps: true, - pointRadius: 0, - tension: 0, - hidden: !graphSettings.calc_flow, - }, - ], - }; + public deattachToFlowChange() { + if (this.scaleFlowChangeSubscription) { + this.scaleFlowChangeSubscription.unsubscribe(); + this.scaleFlowChangeSubscription = undefined; + } + } - const pressureDevice = this.bleManager.getPressureDevice(); - if (pressureDevice != null || !this.platform.is('cordova')) { - drinkingData.datasets.push({ - label: this.translate.instant('BREW_PRESSURE_FLOW'), - data: [], - borderColor: 'rgb(132,42,37)', - backgroundColor: 'rgb(189,61,53)', - yAxisID: 'y3', - spanGaps: true, - pointRadius: 0, - tension: 0, - hidden: !graphSettings.pressure, - }); - } + public deattachToPressureChange() { + if (this.pressureDeviceSubscription) { + this.pressureDeviceSubscription.unsubscribe(); + this.pressureDeviceSubscription = undefined; + } + } - const startingDay = moment(new Date()).startOf('day'); - // IF brewtime has some seconds, we add this to the delay directly. - if (this.data.brew_time > 0) { - startingDay.add('seconds', this.data.brew_time); - } - const delay = Date.now() - startingDay.toDate().getTime(); + public shallFlowProfileBeHidden(): boolean { + if ( + this.smartScaleConnected() === true || + this.pressureDeviceConnected() === true + ) { + return false; + } + if (this.isEdit === true && this.data.flow_profile !== '') { + return false; + } + if (this.flow_profile_raw.weight.length > 0) { + return false; + } - const suggestedMinFlow: number = 0; - let suggestedMaxFlow: number = 20; + return true; + } - const suggestedMinWeight: number = 0; - let suggestedMaxWeight: number = 300; - if ( - this.data.getPreparation().style_type === - PREPARATION_STYLE_TYPE.ESPRESSO - ) { - suggestedMaxFlow = 2.5; - suggestedMaxWeight = 30; - } - - const chartOptions = { - animation: false, // disa - scales: { - x: { - type: 'realtime', - display: true, - realtime: { - // How much timeseconds do we want to show - duration: 20000, - delay: delay, - // data will be automatically deleted as it disappears off the chart - ttl: undefined, - pause: true, - onRefresh: (chart) => {}, - }, - time: { - displayFormats: { - millisecond: 'mm:ss', - second: 'mm:ss', - minute: 'mm:ss', - hour: 'mm:ss', - day: 'mm:ss', - week: 'mm:ss', - month: 'mm:ss', - quarter: 'mm:ss', - year: 'mm:ss', - }, - }, - }, - - y: { - type: 'linear', - display: true, - position: 'left', - suggestedMin: suggestedMinWeight, - suggestedMax: suggestedMaxWeight, - }, - y1: { - type: 'linear', - display: true, - position: 'right', - // grid line settings - grid: { - drawOnChartArea: false, // only want the grid lines for one axis to show up - }, - suggestedMin: suggestedMinFlow, - suggestedMax: suggestedMaxFlow, - }, - y2: { - // Real time flow - type: 'linear', - display: false, - position: 'right', - // grid line settings - grid: { - drawOnChartArea: false, // only want the grid lines for one axis to show up - }, - suggestedMin: suggestedMinFlow, - suggestedMax: suggestedMaxFlow, - }, - }, - interaction: { - intersect: false, - }, - }; - - if (pressureDevice != null || !this.platform.is('cordova')) { - chartOptions.scales['y3'] = { - type: 'linear', - display: true, - position: 'right', - // grid line settings - grid: { - drawOnChartArea: false, // only want the grid lines for one axis to show up - }, - // More then 12 bar should be strange. - suggestedMin: 0, - suggestedMax: 12, - }; - } - - this.flowProfileChartEl = new Chart( - this.flowProfileChart.nativeElement, - { - type: 'line', - data: drinkingData, - options: chartOptions, - } as any - ); - if (this.flow_profile_raw.weight.length > 0) { - for (const data of this.flow_profile_raw.weight) { - const dataDay = moment(new Date()).startOf('day'); - dataDay.add('seconds', data.brew_time); - this.flowProfileChartEl.data.datasets[0].data.push({ - x: dataDay.toDate().getTime(), - y: data.actual_weight, - }); - } - for (const data of this.flow_profile_raw.waterFlow) { - const dataDay = moment(new Date()).startOf('day'); - dataDay.add('seconds', data.brew_time); - - this.flowProfileChartEl.data.datasets[1].data.push({ - x: dataDay.toDate().getTime(), - y: data.value, - }); - } - if (this.flow_profile_raw.realtimeFlow) { - for (const data of this.flow_profile_raw.realtimeFlow) { - const dataDay = moment(new Date()).startOf('day'); - dataDay.add('seconds', data.brew_time); - this.flowProfileChartEl.data.datasets[2].data.push({ - x: dataDay.toDate().getTime(), - y: data.flow_value, - }); - } - } - if (this.flow_profile_raw.pressureFlow) { - for (const data of this.flow_profile_raw.pressureFlow) { - const dataDay = moment(new Date()).startOf('day'); - dataDay.add('seconds', data.brew_time); - this.flowProfileChartEl.data.datasets[3].data.push({ - x: dataDay.toDate().getTime(), - y: data.actual_pressure, - }); - } - } - } - this.flowProfileChartEl.update('quite'); - } - // Check changes after all is done - this.checkChanges(); - }, 250); - } - - public deattachToWeightChange() { - if (this.scaleFlowSubscription) { - this.scaleFlowSubscription.unsubscribe(); - this.scaleFlowSubscription = undefined; - } - } - - public deattachToFlowChange() { - if (this.scaleFlowChangeSubscription) { - this.scaleFlowChangeSubscription.unsubscribe(); - this.scaleFlowChangeSubscription = undefined; - } - } - - public deattachToPressureChange() { - if (this.pressureDeviceSubscription) { - this.pressureDeviceSubscription.unsubscribe(); - this.pressureDeviceSubscription = undefined; - } - } - - public shallFlowProfileBeHidden(): boolean { - if ( - this.smartScaleConnected() === true || - this.pressureDeviceConnected() === true - ) { - return false; - } - if (this.isEdit === true && this.data.flow_profile !== '') { - return false; - } - if (this.flow_profile_raw.weight.length > 0) { - return false; - } - - return true; - } - - public getAvgFlow(): number { - const waterFlows: Array = this.flow_profile_raw.waterFlow; - let calculatedFlow: number = 0; - let foundEntries: number = 0; - for (const water of waterFlows) { - if (water.value > 0) { - calculatedFlow += water.value; - foundEntries += 1; - } - } - if (calculatedFlow > 0) { - return calculatedFlow / foundEntries; - } - return 0; - } + public getAvgFlow(): number { + const waterFlows: Array = this.flow_profile_raw.waterFlow; + let calculatedFlow: number = 0; + let foundEntries: number = 0; + for (const water of waterFlows) { + if (water.value > 0) { + calculatedFlow += water.value; + foundEntries += 1; + } + } + if (calculatedFlow > 0) { + return calculatedFlow / foundEntries; + } + return 0; + } public deattachToScaleEvents() { if (this.scaleTimerSubscription) { @@ -966,76 +619,84 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } } else { this.data.brew_time = 0; + if (this.settings.brew_milliseconds) { + this.data.brew_time_milliseconds = 0; + } } } + public async timerStartPressed(_event) { + await this.timerStarted(_event); + this.timer.startTimer(); + } + public async timerStarted(_event) { const scale: BluetoothScale = this.bleManager.getScale(); const pressureDevice: PressureDevice = this.bleManager.getPressureDevice(); - /** - let weight=0; - let realtime_flow = 0; - let flow = 0; - let pressure = 0; - this.startingFlowTime = Date.now(); - this.flowProfileChartEl.options.scales.x.realtime.pause = false; - const startingDay = moment(new Date()).startOf('day'); - //IF brewtime has some seconds, we add this to the delay directly. - if (this.data.brew_time > 0) { - startingDay.add('seconds',this.data.brew_time); - } - const delay = Date.now() - startingDay.toDate().getTime(); - this.flowProfileChartEl.options.scales.x.realtime.delay = delay; - this.flowProfileChartEl.update('quiet'); - setInterval(() => { + + /*let weight = 0; + let realtime_flow = 0; + let flow = 0; + let pressure = 0; + this.startingFlowTime = Date.now(); + this.flowProfileChartEl.options.scales.x.realtime.pause = false; + const startingDay = moment(new Date()).startOf('day'); + //IF brewtime has some seconds, we add this to the delay directly. + if (this.data.brew_time > 0) { + startingDay.add('seconds', this.data.brew_time); + } + const delay = Date.now() - startingDay.toDate().getTime(); + this.flowProfileChartEl.options.scales.x.realtime.delay = delay; + this.flowProfileChartEl.update('quiet'); + setInterval(() => { flow = Math.floor(Math.random() * 11); realtime_flow = Math.floor(Math.random() * 11); weight = weight + Math.floor(Math.random() * 11); pressure = Math.floor(Math.random() * 11); - const flowObj= { - unixTime: moment(new Date()).startOf('day').add('milliseconds',Date.now() - this.startingFlowTime).toDate().getTime(), + const flowObj = { + unixTime: moment(new Date()).startOf('day').add('milliseconds', Date.now() - this.startingFlowTime).toDate().getTime(), weight: weight, realtime_flow: realtime_flow, flow: flow }; - this.flowProfileChartEl.data.datasets[0].data.push( - {x: flowObj.unixTime, y: flowObj.weight} - ); - this.flowProfileChartEl.data.datasets[1].data.push( - {x: flowObj.unixTime, y: flowObj.flow} - ); - this.flowProfileChartEl.data.datasets[2].data.push( - {x: flowObj.unixTime, y: flowObj.realtime_flow} - ); - this.flowProfileChartEl.data.datasets[3].data.push( - {x: flowObj.unixTime, y: pressure} - ); + this.__setPressureFlow({actual: pressure, old: pressure}); + this.__setFlowProfile({actual: weight, old: 1, smoothed: 1, oldSmoothed: 1}); + + this.brewPressureGraphSubject.next({ + pressure: pressure, + }); this.flowProfileChartEl.update('quite'); - },100); - **/ + }, 100);*/ + if (scale || pressureDevice) { + if ( + this.settings.bluetooth_scale_maximize_on_start_timer === true && + this.maximizeFlowGraphIsShown === false + ) { + //If maximizeFlowGraphIsShown===true, we already started once and resetted, don't show overlay again + // First maximize, then go on with the timer, else it will lag hard. + + this.maximizeFlowGraph(); + } + if (scale) { if (this.settings.bluetooth_scale_tare_on_start_timer === true) { await new Promise((resolve) => { setTimeout(async () => { - await scale.tare(); + scale.tare(); resolve(undefined); }, 50); }); } await new Promise((resolve) => { setTimeout(async () => { - await scale.setTimer(SCALE_TIMER_COMMAND.START); + scale.setTimer(SCALE_TIMER_COMMAND.START); resolve(undefined); }, 50); }); } if (pressureDevice) { - await pressureDevice.updateZero(); - } - - if (this.settings.bluetooth_scale_maximize_on_start_timer === true) { - this.maximizeFlowGraph(); + pressureDevice.updateZero(); } this.startingFlowTime = Date.now(); @@ -1060,13 +721,18 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } } + public async timerResumedPressed(_event) { + await this.timerResumed(_event); + this.timer.resumeTimer(); + } + public async timerResumed(_event) { const scale: BluetoothScale = this.bleManager.getScale(); const pressureDevice: PressureDevice = this.bleManager.getPressureDevice(); if (scale || pressureDevice) { if (scale) { - await scale.setTimer(SCALE_TIMER_COMMAND.START); + scale.setTimer(SCALE_TIMER_COMMAND.START); } this.startingFlowTime = Date.now(); @@ -1100,7 +766,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { const pressureDevice: PressureDevice = this.bleManager.getPressureDevice(); if (scale || pressureDevice) { if (scale) { - await scale.setTimer(SCALE_TIMER_COMMAND.STOP); + scale.setTimer(SCALE_TIMER_COMMAND.STOP); this.deattachToWeightChange(); this.deattachToFlowChange(); } @@ -1115,7 +781,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { public async tareScale(_event) { const scale: BluetoothScale = this.bleManager.getScale(); if (scale) { - await scale.tare(); + scale.tare(); } } @@ -1125,18 +791,18 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { if (scale || pressureDevice) { await this.uiAlert.showLoadingSpinner(); if (scale) { - await scale.tare(); + scale.tare(); await new Promise((resolve) => { setTimeout(async () => { - await scale.setTimer(SCALE_TIMER_COMMAND.STOP); + scale.setTimer(SCALE_TIMER_COMMAND.STOP); resolve(undefined); }, 50); }); await new Promise((resolve) => { setTimeout(async () => { - await scale.setTimer(SCALE_TIMER_COMMAND.RESET); + scale.setTimer(SCALE_TIMER_COMMAND.RESET); resolve(undefined); }, 50); }); @@ -1193,6 +859,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.data.coffee_blooming_time_milliseconds = 0; } } + public coffeeFirstDripTimeChanged(_event): void { if (this.brewTemperatureTime) { this.data.coffee_first_drip_time = this.brewFirstDripTime.getSeconds(); @@ -1287,6 +954,600 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } } + /** + * This function is triggered outside of add/edit component, because the uuid is not existing on adding at start + * @param _uuid + */ + public saveFlowProfile(_uuid: string): string { + const random = Math.floor(Math.random() * 10) + 1; + + const t = []; + for (let i = 0; i < random; i++) { + t.push(i); + } + const savingPath = 'brews/' + _uuid + '_flow_profile.json'; + this.uiFileHelper.saveJSONFile( + savingPath, + JSON.stringify(this.flow_profile_raw) + ); + return savingPath; + } + + public setActualSmartInformation() { + try { + const weightEl = this.smartScaleWeightEl.nativeElement; + const flowEl = this.smartScaleWeightPerSecondEl.nativeElement; + const avgFlowEl = this.smartScaleAvgFlowPerSecondEl.nativeElement; + + const actualScaleWeight = this.getActualScaleWeight(); + const actualSmoothedWeightPerSecond = + this.getActualSmoothedWeightPerSecond(); + const avgFlow = this.uiHelper.toFixedIfNecessary(this.getAvgFlow(), 2); + weightEl.textContent = actualScaleWeight + ' g'; + flowEl.textContent = actualSmoothedWeightPerSecond + ' g/s'; + avgFlowEl.textContent = 'Ø ' + avgFlow + ' g/s'; + + this.brewFlowGraphSubject.next({ + scaleWeight: actualScaleWeight + ' g', + smoothedWeight: actualSmoothedWeightPerSecond + ' g/s', + avgFlow: 'Ø ' + avgFlow + ' g/s', + }); + } catch (ex) {} + } + + public getActualScaleWeight() { + try { + return this.uiHelper.toFixedIfNecessary( + this.bleManager.getScale().getWeight(), + 1 + ); + } catch (ex) { + return 0; + } + } + + public getActualSmoothedWeightPerSecond(): number { + try { + const lastflow = + this.flow_profile_raw.weight[this.flow_profile_raw.weight.length - 1]; + const smoothedWeight = lastflow.actual_smoothed_weight; + const oldSmoothedWeight = lastflow.old_smoothed_weight; + const flowValue: number = (smoothedWeight - oldSmoothedWeight) * 10; + return this.uiHelper.toFixedIfNecessary(flowValue, 2); + } catch (ex) { + return 0; + } + } + + public async downloadFlowProfile() { + await this.uiExcel.exportBrewFlowProfile(this.flow_profile_raw); + } + + public onProfileSearchChange(event: any) { + if (!this.profileFocused) { + return; + } + let actualSearchValue = event.target.value; + this.profileResults = []; + this.profileResultsAvailable = false; + if (actualSearchValue === undefined || actualSearchValue === '') { + return; + } + + actualSearchValue = actualSearchValue.toLowerCase(); + const filteredEntries = this.uiBrewStorage + .getAllEntries() + .filter((e) => + e.pressure_profile.toLowerCase().includes(actualSearchValue) + ); + + for (const entry of filteredEntries) { + this.profileResults.push(entry.pressure_profile); + } + // Distinct values + this.profileResults = Array.from( + new Set(this.profileResults.map((e) => e)) + ); + + if (this.profileResults.length > 0) { + this.profileResultsAvailable = true; + } else { + this.profileResultsAvailable = false; + } + } + + public onProfileSearchLeave($event) { + setTimeout(() => { + this.profileResultsAvailable = false; + this.profileResults = []; + this.profileFocused = false; + }, 150); + } + + public onProfileSearchFocus($event) { + this.profileFocused = true; + } + + public profileSelected(selected: string): void { + this.data.pressure_profile = selected; + this.profileResults = []; + this.profileResultsAvailable = false; + this.profileFocused = false; + } + + public onVesselSearchChange(event: any) { + if (!this.vesselFocused) { + return; + } + let actualSearchValue = event.target.value; + this.vesselResults = []; + this.vesselResultsAvailable = false; + if (actualSearchValue === undefined || actualSearchValue === '') { + return; + } + + actualSearchValue = actualSearchValue.toLowerCase(); + const filteredEntries = this.uiBrewStorage + .getAllEntries() + .filter( + (e) => + e.vessel_name !== '' && + e.vessel_name.toLowerCase().includes(actualSearchValue) + ); + + for (const entry of filteredEntries) { + if ( + this.vesselResults.filter( + (e) => + e.name === entry.vessel_name && e.weight === entry.vessel_weight + ).length <= 0 + ) { + this.vesselResults.push({ + name: entry.vessel_name, + weight: entry.vessel_weight, + }); + } + } + // Distinct values + if (this.vesselResults.length > 0) { + this.vesselResultsAvailable = true; + } else { + this.vesselResultsAvailable = false; + } + } + + public onVesselSearchLeave($event) { + setTimeout(() => { + this.vesselResults = []; + this.vesselResultsAvailable = false; + this.vesselFocused = false; + }, 150); + } + + public onVesselSearchFocus($event) { + this.vesselFocused = true; + } + + public vesselSelected(selected: string): void { + this.data.vessel_name = selected['name']; + this.data.vessel_weight = selected['weight']; + this.vesselResults = []; + this.vesselResultsAvailable = false; + this.vesselFocused = false; + } + + public hasWaterEntries(): boolean { + if (this.isEdit) { + // When its edit, it doesn't matter when we don't have any active water + return this.uiWaterStorage.getAllEntries().length > 0; + } + return ( + this.uiWaterStorage.getAllEntries().filter((e) => !e.finished).length > 0 + ); + } + + public async calculateBrixToTds() { + const modal = await this.modalController.create({ + component: BrewBrixCalculatorComponent, + cssClass: 'popover-actions', + breakpoints: [0, 0.25], + initialBreakpoint: 0.25, + id: BrewBrixCalculatorComponent.COMPONENT_ID, + }); + await modal.present(); + + const { data } = await modal.onWillDismiss(); + if (data !== undefined) { + this.data.tds = data.tds; + } + } + + public async calculateBrewBeverageQuantity() { + let vesselWeight: number = 0; + if (this.data.vessel_weight > 0) { + vesselWeight = this.data.vessel_weight; + } + const modal = await this.modalController.create({ + component: BrewBeverageQuantityCalculatorComponent, + cssClass: 'popover-actions', + breakpoints: [0, 0.5], + initialBreakpoint: 0.5, + componentProps: { + vesselWeight: vesselWeight, + }, + id: BrewBeverageQuantityCalculatorComponent.COMPONENT_ID, + }); + await modal.present(); + + const { data } = await modal.onWillDismiss(); + if (data !== undefined && data.brew_beverage_quantity > 0) { + this.data.brew_beverage_quantity = this.uiHelper.toFixedIfNecessary( + data.brew_beverage_quantity, + 1 + ); + } + } + + private async __connectSmartScale(_firstStart: boolean) { + if (this.smartScaleConnected()) { + this.deattachToWeightChange(); + this.deattachToScaleEvents(); + + const scale: BluetoothScale = this.bleManager.getScale(); + if (scale && !this.scaleTimerSubscription) { + this.scaleTimerSubscription = scale.timerEvent.subscribe((event) => { + // Timer pressed + if (event) { + switch (event.command) { + case SCALE_TIMER_COMMAND.START: + this.timer.startTimer(); + break; + case SCALE_TIMER_COMMAND.STOP: + this.timer.pauseTimer(); + break; + case SCALE_TIMER_COMMAND.RESET: + this.timer.reset(); + break; + } + } else { + if (this.timer.isTimerRunning() === true) { + this.timer.pauseTimer(); + } else { + this.timer.startTimer(); + } + } + this.checkChanges(); + }); + } + if (scale && !this.scaleTareSubscription) { + this.scaleTareSubscription = scale.tareEvent.subscribe(() => { + // Timer pressed + if ( + this.data.getPreparation().style_type !== + PREPARATION_STYLE_TYPE.ESPRESSO + ) { + this.data.brew_quantity = 0; + } else { + this.data.brew_beverage_quantity = 0; + } + + this.checkChanges(); + }); + } + + if (_firstStart) { + if (this.settings.bluetooth_scale_tare_on_brew === true) { + await new Promise((resolve) => { + setTimeout(async () => { + if (scale) { + scale.tare(); + } + + resolve(undefined); + }, 50); + }); + } + + if (this.settings.bluetooth_scale_stop_timer_on_brew === true) { + await new Promise((resolve) => { + setTimeout(async () => { + if (scale) { + scale.setTimer(SCALE_TIMER_COMMAND.STOP); + } + + resolve(undefined); + }, 50); + }); + } + + if (this.settings.bluetooth_scale_reset_timer_on_brew === true) { + await new Promise((resolve) => { + setTimeout(async () => { + if (scale) { + scale.setTimer(SCALE_TIMER_COMMAND.RESET); + } + resolve(undefined); + }, 50); + }); + } + } + if (this.timer.isTimerRunning() === true && _firstStart === false) { + this.attachToScaleWeightChange(); + } + // Always attach flow. + this.attachToFlowChange(); + + this.checkChanges(); + } + } + + private async __connectPressureDevice(_firstStart: boolean) { + if (this.pressureDeviceConnected()) { + this.deattachToPressureChange(); + + if (_firstStart) { + const pressureDevice: PressureDevice = + this.bleManager.getPressureDevice(); + if (pressureDevice) { + pressureDevice.updateZero(); + } + } + if (this.timer.isTimerRunning() === true && _firstStart === false) { + this.attachToPressureChange(); + } else if (this.settings.pressure_threshold_active) { + this.attachToPressureChange(); + } + + this.checkChanges(); + } + } + + private checkChanges() { + this.changeDetectorRef.detectChanges(); + window.getComputedStyle(window.document.getElementsByTagName('body')[0]); + } + + private getActualBluetoothWeight() { + try { + const scale: BluetoothScale = this.bleManager.getScale(); + return this.uiHelper.toFixedIfNecessary(scale.getWeight(), 1); + } catch (ex) { + return 0; + } + } + + private initializeFlowChart(): void { + setTimeout(() => { + if (this.flowProfileChartEl) { + this.flowProfileChartEl.destroy(); + this.flowProfileChartEl = undefined; + this.flowTime = undefined; + this.flowSecondTick = 0; + this.flowProfileArr = []; + this.flowProfileArrObjs = []; + this.flowProfileArrCalculated = []; + } + if (this.flowProfileChartEl === undefined) { + let graphSettings = this.settings.graph.FILTER; + if ( + this.data.getPreparation().style_type === + PREPARATION_STYLE_TYPE.ESPRESSO + ) { + graphSettings = this.settings.graph.ESPRESSO; + } + + const drinkingData = { + labels: [], + datasets: [ + { + label: this.translate.instant('BREW_FLOW_WEIGHT'), + data: [], + borderColor: 'rgb(205,194,172)', + backgroundColor: 'rgb(205,194,172)', + yAxisID: 'y', + pointRadius: 0, + tension: 0, + borderWidth: 2, + hidden: !graphSettings.weight, + }, + { + label: this.translate.instant('BREW_FLOW_WEIGHT_PER_SECOND'), + data: [], + borderColor: 'rgb(127,151,162)', + backgroundColor: 'rgb(127,151,162)', + yAxisID: 'y1', + spanGaps: true, + pointRadius: 0, + tension: 0, + borderWidth: 2, + hidden: !graphSettings.calc_flow, + }, + { + label: this.translate.instant('BREW_FLOW_WEIGHT_REALTIME'), + data: [], + borderColor: 'rgb(9,72,93)', + backgroundColor: 'rgb(9,72,93)', + yAxisID: 'y2', + spanGaps: true, + pointRadius: 0, + borderWidth: 2, + tension: 0, + hidden: !graphSettings.realtime_flow, + }, + ], + }; + + const pressureDevice = this.bleManager.getPressureDevice(); + if (pressureDevice != null || !this.platform.is('cordova')) { + drinkingData.datasets.push({ + label: this.translate.instant('BREW_PRESSURE_FLOW'), + data: [], + borderColor: 'rgb(5,199,147)', + backgroundColor: 'rgb(5,199,147)', + yAxisID: 'y3', + spanGaps: true, + pointRadius: 0, + tension: 0, + borderWidth: 2, + hidden: !graphSettings.pressure, + }); + } + + const startingDay = moment(new Date()).startOf('day'); + // IF brewtime has some seconds, we add this to the delay directly. + if (this.data.brew_time > 0) { + startingDay.add('seconds', this.data.brew_time); + } + const delay = Date.now() - startingDay.toDate().getTime(); + + const suggestedMinFlow: number = 0; + let suggestedMaxFlow: number = 20; + + const suggestedMinWeight: number = 0; + let suggestedMaxWeight: number = 300; + if ( + this.data.getPreparation().style_type === + PREPARATION_STYLE_TYPE.ESPRESSO + ) { + suggestedMaxFlow = 2.5; + suggestedMaxWeight = 30; + } + + const chartOptions = { + animation: false, // disa + scales: { + x: { + type: 'realtime', + display: true, + realtime: { + // How much timeseconds do we want to show + duration: 20000, + delay: delay, + // data will be automatically deleted as it disappears off the chart + ttl: undefined, + pause: true, + onRefresh: (chart) => {}, + }, + time: { + displayFormats: { + millisecond: 'mm:ss', + second: 'mm:ss', + minute: 'mm:ss', + hour: 'mm:ss', + day: 'mm:ss', + week: 'mm:ss', + month: 'mm:ss', + quarter: 'mm:ss', + year: 'mm:ss', + }, + }, + }, + + y: { + type: 'linear', + display: true, + position: 'left', + suggestedMin: suggestedMinWeight, + suggestedMax: suggestedMaxWeight, + }, + y1: { + type: 'linear', + display: true, + position: 'right', + // grid line settings + grid: { + drawOnChartArea: false, // only want the grid lines for one axis to show up + }, + suggestedMin: suggestedMinFlow, + suggestedMax: suggestedMaxFlow, + }, + y2: { + // Real time flow + type: 'linear', + display: false, + position: 'right', + // grid line settings + grid: { + drawOnChartArea: false, // only want the grid lines for one axis to show up + }, + suggestedMin: suggestedMinFlow, + suggestedMax: suggestedMaxFlow, + }, + }, + interaction: { + intersect: false, + }, + }; + + if (pressureDevice != null || !this.platform.is('cordova')) { + chartOptions.scales['y3'] = { + type: 'linear', + display: true, + position: 'right', + // grid line settings + grid: { + drawOnChartArea: false, // only want the grid lines for one axis to show up + }, + // More then 12 bar should be strange. + suggestedMin: 0, + suggestedMax: 12, + }; + } + + this.flowProfileChartEl = new Chart( + this.flowProfileChart.nativeElement, + { + type: 'line', + data: drinkingData, + options: chartOptions, + } as any + ); + if (this.flow_profile_raw.weight.length > 0) { + for (const data of this.flow_profile_raw.weight) { + const dataDay = moment(new Date()).startOf('day'); + dataDay.add('seconds', data.brew_time); + this.flowProfileChartEl.data.datasets[0].data.push({ + x: dataDay.toDate().getTime(), + y: data.actual_weight, + }); + } + for (const data of this.flow_profile_raw.waterFlow) { + const dataDay = moment(new Date()).startOf('day'); + dataDay.add('seconds', data.brew_time); + + this.flowProfileChartEl.data.datasets[1].data.push({ + x: dataDay.toDate().getTime(), + y: data.value, + }); + } + if (this.flow_profile_raw.realtimeFlow) { + for (const data of this.flow_profile_raw.realtimeFlow) { + const dataDay = moment(new Date()).startOf('day'); + dataDay.add('seconds', data.brew_time); + this.flowProfileChartEl.data.datasets[2].data.push({ + x: dataDay.toDate().getTime(), + y: data.flow_value, + }); + } + } + if (this.flow_profile_raw.pressureFlow) { + for (const data of this.flow_profile_raw.pressureFlow) { + const dataDay = moment(new Date()).startOf('day'); + dataDay.add('seconds', data.brew_time); + this.flowProfileChartEl.data.datasets[3].data.push({ + x: dataDay.toDate().getTime(), + y: data.actual_pressure, + }); + } + } + } + this.flowProfileChartEl.update(); + } + // Check changes after all is done + this.checkChanges(); + }, 250); + } + // tslint:disable-next-line private __loadLastBrew(): void { if ( @@ -1333,25 +1594,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } } - /** - * This function is triggered outside of add/edit component, because the uuid is not existing on adding at start - * @param _uuid - */ - public saveFlowProfile(_uuid: string): string { - const random = Math.floor(Math.random() * 10) + 1; - - const t = []; - for (let i = 0; i < random; i++) { - t.push(i); - } - const savingPath = 'brews/' + _uuid + '_flow_profile.json'; - this.uiFileHelper.saveJSONFile( - savingPath, - JSON.stringify(this.flow_profile_raw) - ); - return savingPath; - } - private async readFlowProfile() { const flowProfilePath = 'brews/' + this.data.config.uuid + '_flow_profile.json'; @@ -1378,10 +1620,9 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { // If no smartscale is connected, the set pressure flow needs to be the master to set flowtime and flowtime seconds, else we just retrieve from the scale. const isSmartScaleConnected = this.smartScaleConnected(); - if (!isSmartScaleConnected) { - if (this.flowTime === undefined) { - this.flowTime = this.getTime(); - } + if (this.flowTime === undefined) { + this.flowTime = this.getTime(); + this.flowSecondTick = 0; } const actualUnixTime: number = moment(new Date()) @@ -1731,11 +1972,8 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { ) ) { // The first time we set the weight, we have one sec delay, because of this do it -1 second - this.data.coffee_first_drip_time = this.timer.getSeconds(); - if (this.settings.brew_milliseconds) { - this.data.coffee_first_drip_time_milliseconds = - this.timer.getMilliseconds(); - } + + this.setCoffeeDripTime(undefined); this.checkChanges(); } } @@ -1796,56 +2034,6 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.flow_profile_raw.pressureFlow.push(pressureFlow); } - public setActualSmartInformation() { - try { - const weightEl = this.smartScaleWeightEl.nativeElement; - const flowEl = this.smartScaleWeightPerSecondEl.nativeElement; - const avgFlowEl = this.smartScaleAvgFlowPerSecondEl.nativeElement; - - const actualScaleWeight = this.getActualScaleWeight(); - const actualSmoothedWeightPerSecond = - this.getActualSmoothedWeightPerSecond(); - const avgFlow = this.uiHelper.toFixedIfNecessary(this.getAvgFlow(), 2); - weightEl.textContent = actualScaleWeight + ' g'; - flowEl.textContent = actualSmoothedWeightPerSecond + ' g/s'; - avgFlowEl.textContent = 'Ø ' + avgFlow + ' g/s'; - - this.brewFlowGraphSubject.next({ - scaleWeight: actualScaleWeight + ' g', - smoothedWeight: actualSmoothedWeightPerSecond + ' g/s', - avgFlow: 'Ø ' + avgFlow + ' g/s', - }); - } catch (ex) {} - } - - public getActualScaleWeight() { - try { - return this.uiHelper.toFixedIfNecessary( - this.bleManager.getScale().getWeight(), - 1 - ); - } catch (ex) { - return 0; - } - } - - public getActualSmoothedWeightPerSecond(): number { - try { - const lastflow = - this.flow_profile_raw.weight[this.flow_profile_raw.weight.length - 1]; - const smoothedWeight = lastflow.actual_smoothed_weight; - const oldSmoothedWeight = lastflow.old_smoothed_weight; - const flowValue: number = (smoothedWeight - oldSmoothedWeight) * 10; - return this.uiHelper.toFixedIfNecessary(flowValue, 2); - } catch (ex) { - return 0; - } - } - - public async downloadFlowProfile() { - await this.uiExcel.exportBrewFlowProfile(this.flow_profile_raw); - } - private __loadBrew(brew: Brew, _template: boolean) { if ( this.settings.default_last_coffee_parameters.method_of_preparation || @@ -2065,169 +2253,4 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { this.data.flow_profile = ''; } - - public onProfileSearchChange(event: any) { - if (!this.profileFocused) { - return; - } - let actualSearchValue = event.target.value; - this.profileResults = []; - this.profileResultsAvailable = false; - if (actualSearchValue === undefined || actualSearchValue === '') { - return; - } - - actualSearchValue = actualSearchValue.toLowerCase(); - const filteredEntries = this.uiBrewStorage - .getAllEntries() - .filter((e) => - e.pressure_profile.toLowerCase().includes(actualSearchValue) - ); - - for (const entry of filteredEntries) { - this.profileResults.push(entry.pressure_profile); - } - // Distinct values - this.profileResults = Array.from( - new Set(this.profileResults.map((e) => e)) - ); - - if (this.profileResults.length > 0) { - this.profileResultsAvailable = true; - } else { - this.profileResultsAvailable = false; - } - } - - public onProfileSearchLeave($event) { - setTimeout(() => { - this.profileResultsAvailable = false; - this.profileResults = []; - this.profileFocused = false; - }, 150); - } - - public onProfileSearchFocus($event) { - this.profileFocused = true; - } - - public profileSelected(selected: string): void { - this.data.pressure_profile = selected; - this.profileResults = []; - this.profileResultsAvailable = false; - this.profileFocused = false; - } - - public onVesselSearchChange(event: any) { - if (!this.vesselFocused) { - return; - } - let actualSearchValue = event.target.value; - this.vesselResults = []; - this.vesselResultsAvailable = false; - if (actualSearchValue === undefined || actualSearchValue === '') { - return; - } - - actualSearchValue = actualSearchValue.toLowerCase(); - const filteredEntries = this.uiBrewStorage - .getAllEntries() - .filter( - (e) => - e.vessel_name !== '' && - e.vessel_name.toLowerCase().includes(actualSearchValue) - ); - - for (const entry of filteredEntries) { - if ( - this.vesselResults.filter( - (e) => - e.name === entry.vessel_name && e.weight === entry.vessel_weight - ).length <= 0 - ) { - this.vesselResults.push({ - name: entry.vessel_name, - weight: entry.vessel_weight, - }); - } - } - // Distinct values - if (this.vesselResults.length > 0) { - this.vesselResultsAvailable = true; - } else { - this.vesselResultsAvailable = false; - } - } - - public onVesselSearchLeave($event) { - setTimeout(() => { - this.vesselResults = []; - this.vesselResultsAvailable = false; - this.vesselFocused = false; - }, 150); - } - - public onVesselSearchFocus($event) { - this.vesselFocused = true; - } - - public vesselSelected(selected: string): void { - this.data.vessel_name = selected['name']; - this.data.vessel_weight = selected['weight']; - this.vesselResults = []; - this.vesselResultsAvailable = false; - this.vesselFocused = false; - } - - public hasWaterEntries(): boolean { - if (this.isEdit) { - // When its edit, it doesn't matter when we don't have any active water - return this.uiWaterStorage.getAllEntries().length > 0; - } - return ( - this.uiWaterStorage.getAllEntries().filter((e) => !e.finished).length > 0 - ); - } - - public async calculateBrixToTds() { - const modal = await this.modalController.create({ - component: BrewBrixCalculatorComponent, - cssClass: 'popover-actions', - breakpoints: [0, 0.25], - initialBreakpoint: 0.25, - id: BrewBrixCalculatorComponent.COMPONENT_ID, - }); - await modal.present(); - - const { data } = await modal.onWillDismiss(); - if (data !== undefined) { - this.data.tds = data.tds; - } - } - - public async calculateBrewBeverageQuantity() { - let vesselWeight: number = 0; - if (this.data.vessel_weight > 0) { - vesselWeight = this.data.vessel_weight; - } - const modal = await this.modalController.create({ - component: BrewBeverageQuantityCalculatorComponent, - cssClass: 'popover-actions', - breakpoints: [0, 0.5], - initialBreakpoint: 0.5, - componentProps: { - vesselWeight: vesselWeight, - }, - id: BrewBeverageQuantityCalculatorComponent.COMPONENT_ID, - }); - await modal.present(); - - const { data } = await modal.onWillDismiss(); - if (data !== undefined && data.brew_beverage_quantity > 0) { - this.data.brew_beverage_quantity = this.uiHelper.toFixedIfNecessary( - data.brew_beverage_quantity, - 1 - ); - } - } } diff --git a/src/components/mill-information-card/mill-information-card.component.html b/src/components/mill-information-card/mill-information-card.component.html index 23d609424..e6fed49df 100644 --- a/src/components/mill-information-card/mill-information-card.component.html +++ b/src/components/mill-information-card/mill-information-card.component.html @@ -41,6 +41,14 @@ {{lastUsed() | formatDate:["DD.MM.YYYY"]}} - + + {{"LAST_USED_GRIND_SIZE_SETTING" | translate}}
+ {{getLastUsedGrindSizeForBrew()}} +
+ + {{"LAST_USED_BEAN" | translate}}
+ {{getLastUsedBean()}} +
diff --git a/src/components/mill-information-card/mill-information-card.component.ts b/src/components/mill-information-card/mill-information-card.component.ts index beefe0a4d..dda0e8ac9 100644 --- a/src/components/mill-information-card/mill-information-card.component.ts +++ b/src/components/mill-information-card/mill-information-card.component.ts @@ -1,21 +1,21 @@ -import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; -import {Settings} from '../../classes/settings/settings'; -import {UISettingsStorage} from '../../services/uiSettingsStorage'; -import {ModalController} from '@ionic/angular'; -import {Mill} from '../../classes/mill/mill'; -import {MILL_ACTION} from '../../enums/mills/millActions'; -import {MillPopoverActionsComponent} from '../../app/mill/mill-popover-actions/mill-popover-actions.component'; -import {Brew} from '../../classes/brew/brew'; -import {UIMillHelper} from '../../services/uiMillHelper'; -import {UIBrewHelper} from '../../services/uiBrewHelper'; -import {MillEditComponent} from '../../app/mill/mill-edit/mill-edit.component'; -import {MillDetailComponent} from '../../app/mill/mill-detail/mill-detail.component'; -import {UIToast} from '../../services/uiToast'; -import {UIAlert} from '../../services/uiAlert'; -import {UIMillStorage} from '../../services/uiMillStorage'; -import {UIBrewStorage} from '../../services/uiBrewStorage'; -import {UIAnalytics} from '../../services/uiAnalytics'; -import {UIImage} from '../../services/uiImage'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { Settings } from '../../classes/settings/settings'; +import { UISettingsStorage } from '../../services/uiSettingsStorage'; +import { ModalController } from '@ionic/angular'; +import { Mill } from '../../classes/mill/mill'; +import { MILL_ACTION } from '../../enums/mills/millActions'; +import { MillPopoverActionsComponent } from '../../app/mill/mill-popover-actions/mill-popover-actions.component'; +import { Brew } from '../../classes/brew/brew'; +import { UIMillHelper } from '../../services/uiMillHelper'; +import { UIBrewHelper } from '../../services/uiBrewHelper'; +import { MillEditComponent } from '../../app/mill/mill-edit/mill-edit.component'; +import { MillDetailComponent } from '../../app/mill/mill-detail/mill-detail.component'; +import { UIToast } from '../../services/uiToast'; +import { UIAlert } from '../../services/uiAlert'; +import { UIMillStorage } from '../../services/uiMillStorage'; +import { UIBrewStorage } from '../../services/uiBrewStorage'; +import { UIAnalytics } from '../../services/uiAnalytics'; +import { UIImage } from '../../services/uiImage'; import MILL_TRACKING from '../../data/tracking/millTracking'; @Component({ selector: 'mill-information-card', @@ -23,38 +23,35 @@ import MILL_TRACKING from '../../data/tracking/millTracking'; styleUrls: ['./mill-information-card.component.scss'], }) export class MillInformationCardComponent implements OnInit { - @Input() public mill: Mill; - @Output() public millAction: EventEmitter = new EventEmitter(); - constructor(private readonly uiSettingsStorage: UISettingsStorage, - private readonly modalController: ModalController, - private readonly uiMillHelper: UIMillHelper, - private readonly uiToast: UIToast, - private readonly uiAlert: UIAlert, - private readonly uiMillStorage: UIMillStorage, - private readonly uiBrewStorage: UIBrewStorage, - private readonly uiAnalytics: UIAnalytics, - private readonly uiImage: UIImage) { - - } - - public ngOnInit() { - + constructor( + private readonly uiSettingsStorage: UISettingsStorage, + private readonly modalController: ModalController, + private readonly uiMillHelper: UIMillHelper, + private readonly uiToast: UIToast, + private readonly uiAlert: UIAlert, + private readonly uiMillStorage: UIMillStorage, + private readonly uiBrewStorage: UIBrewStorage, + private readonly uiAnalytics: UIAnalytics, + private readonly uiImage: UIImage + ) {} - } + public ngOnInit() {} public getBrewsCount(): number { - - const relatedBrews: Array = this.uiMillHelper.getAllBrewsForThisMill(this.mill.config.uuid); + const relatedBrews: Array = this.uiMillHelper.getAllBrewsForThisMill( + this.mill.config.uuid + ); return relatedBrews.length; } public getWeightCount(): number { - - const relatedBrews: Array = this.uiMillHelper.getAllBrewsForThisMill(this.mill.config.uuid); + const relatedBrews: Array = this.uiMillHelper.getAllBrewsForThisMill( + this.mill.config.uuid + ); let grindWeight: number = 0; for (const brew of relatedBrews) { grindWeight += brew.grind_weight; @@ -63,26 +60,45 @@ export class MillInformationCardComponent implements OnInit { } public getBeansCount(): number { - - const relatedBrews: Array = this.uiMillHelper.getAllBrewsForThisMill(this.mill.config.uuid); + const relatedBrews: Array = this.uiMillHelper.getAllBrewsForThisMill( + this.mill.config.uuid + ); const distinctBeans = relatedBrews.filter((bean, i, arr) => { return arr.indexOf(arr.find((t) => t.bean === bean.bean)) === i; }); return distinctBeans.length; - } public lastUsed(): number { - - let relatedBrews: Array = this.uiMillHelper.getAllBrewsForThisMill(this.mill.config.uuid); + let relatedBrews: Array = this.uiMillHelper.getAllBrewsForThisMill( + this.mill.config.uuid + ); if (relatedBrews.length > 0) { relatedBrews = UIBrewHelper.sortBrews(relatedBrews); return relatedBrews[0].config.unix_timestamp; } return -1; + } - - + public getLastUsedGrindSizeForBrew(): string { + let relatedBrews: Array = this.uiMillHelper.getAllBrewsForThisMill( + this.mill.config.uuid + ); + if (relatedBrews.length > 0) { + relatedBrews = UIBrewHelper.sortBrews(relatedBrews); + return relatedBrews[0].grind_size; + } + return '-'; + } + public getLastUsedBean(): string { + let relatedBrews: Array = this.uiMillHelper.getAllBrewsForThisMill( + this.mill.config.uuid + ); + if (relatedBrews.length > 0) { + relatedBrews = UIBrewHelper.sortBrews(relatedBrews); + return relatedBrews[0].getBean().name; + } + return '-'; } public async show() { @@ -96,23 +112,22 @@ export class MillInformationCardComponent implements OnInit { } private async viewPhotos() { - this.uiAnalytics.trackEvent(MILL_TRACKING.TITLE, MILL_TRACKING.ACTIONS.PHOTO_VIEW); + this.uiAnalytics.trackEvent( + MILL_TRACKING.TITLE, + MILL_TRACKING.ACTIONS.PHOTO_VIEW + ); await this.uiImage.viewPhotos(this.mill); } - public async internalMillAction(action: MILL_ACTION) { switch (action) { case MILL_ACTION.EDIT: await this.edit(); break; case MILL_ACTION.DELETE: - try { await this.delete(); - } catch (ex) { - - } + } catch (ex) {} await this.uiAlert.hideLoadingSpinner(); break; case MILL_ACTION.ARCHIVE: @@ -150,37 +165,47 @@ export class MillInformationCardComponent implements OnInit { } public async delete() { - await this.uiAlert.showConfirm('DELETE_MILL_QUESTION', 'SURE_QUESTION', true).then(async () => { - await this.uiAlert.showLoadingSpinner(); - // Yes - this.uiAnalytics.trackEvent(MILL_TRACKING.TITLE, MILL_TRACKING.ACTIONS.DELETE); - await this.__deleteMill(); - this.uiToast.showInfoToast('TOAST_MILL_DELETED_SUCCESSFULLY'); - await this.resetSettings(); - }, - () => { - // No - }); - + await this.uiAlert + .showConfirm('DELETE_MILL_QUESTION', 'SURE_QUESTION', true) + .then( + async () => { + await this.uiAlert.showLoadingSpinner(); + // Yes + this.uiAnalytics.trackEvent( + MILL_TRACKING.TITLE, + MILL_TRACKING.ACTIONS.DELETE + ); + await this.__deleteMill(); + this.uiToast.showInfoToast('TOAST_MILL_DELETED_SUCCESSFULLY'); + await this.resetSettings(); + }, + () => { + // No + } + ); } private async __deleteMill() { - const brews: Array = this.uiBrewStorage.getAllEntries(); + const brews: Array = this.uiBrewStorage.getAllEntries(); const deletingBrewIndex: Array = []; for (let i = 0; i < brews.length; i++) { if (brews[i].mill === this.mill.config.uuid) { deletingBrewIndex.push(i); } } - for (let i = deletingBrewIndex.length; i--;) { - await this.uiBrewStorage.removeByUUID(brews[deletingBrewIndex[i]].config.uuid); + for (let i = deletingBrewIndex.length; i--; ) { + await this.uiBrewStorage.removeByUUID( + brews[deletingBrewIndex[i]].config.uuid + ); } await this.uiMillStorage.removeByObject(this.mill); } - public async archive() { - this.uiAnalytics.trackEvent(MILL_TRACKING.TITLE, MILL_TRACKING.ACTIONS.ARCHIVE); + this.uiAnalytics.trackEvent( + MILL_TRACKING.TITLE, + MILL_TRACKING.ACTIONS.ARCHIVE + ); this.mill.finished = true; await this.uiMillStorage.update(this.mill); this.uiToast.showInfoToast('TOAST_MILL_ARCHIVED_SUCCESSFULLY'); @@ -190,13 +215,16 @@ export class MillInformationCardComponent implements OnInit { public async showMillActions(event): Promise { event.stopPropagation(); event.stopImmediatePropagation(); - this.uiAnalytics.trackEvent(MILL_TRACKING.TITLE, MILL_TRACKING.ACTIONS.POPOVER_ACTIONS); + this.uiAnalytics.trackEvent( + MILL_TRACKING.TITLE, + MILL_TRACKING.ACTIONS.POPOVER_ACTIONS + ); const popover = await this.modalController.create({ component: MillPopoverActionsComponent, - componentProps: {mill: this.mill}, + componentProps: { mill: this.mill }, id: MillPopoverActionsComponent.COMPONENT_ID, cssClass: 'popover-actions', - breakpoints: [0, 0.75, 1], + breakpoints: [0, 0.75, 1], initialBreakpoint: 0.75, }); await popover.present(); diff --git a/src/data/tracking/beanTracking.ts b/src/data/tracking/beanTracking.ts index 71ae512b2..2abe6ec18 100644 --- a/src/data/tracking/beanTracking.ts +++ b/src/data/tracking/beanTracking.ts @@ -1,19 +1,20 @@ export default { - - TITLE:'BEAN', + TITLE: 'BEAN', ACTIONS: { POPOVER_ACTIONS: 'POPOVER_ACTIONS', DETAIL: 'DETAIL', ADD: 'ADD', ADD_FINISH: 'ADD_FINISH', EDIT: 'EDIT', - EDIT_FINISH:'EDIT_FINISH', + EDIT_FINISH: 'EDIT_FINISH', DELETE: 'DELETE', REPEAT: 'REPEAT', ARCHIVE: 'ARCHIVE', PHOTO_VIEW: 'PHOTO_VIEW', ADD_FAVOURITE: 'ADD_FAVOURITE', - REMOVE_FAVOURITE:'REMOVE_FAVOURITE', - SHARE: 'SHARE' - } -} + REMOVE_FAVOURITE: 'REMOVE_FAVOURITE', + SHARE: 'SHARE', + SHOW_BREWS: 'SHOW_BREWS', + CUPPING: 'CUPPING', + }, +}; diff --git a/src/enums/beans/beanAction.ts b/src/enums/beans/beanAction.ts index 4d4023d9c..f8a6200d9 100755 --- a/src/enums/beans/beanAction.ts +++ b/src/enums/beans/beanAction.ts @@ -1,5 +1,4 @@ export enum BEAN_ACTION { - DETAIL = 'DETAIL', REPEAT = 'REPEAT', EDIT = 'EDIT', @@ -8,5 +7,7 @@ export enum BEAN_ACTION { PHOTO_GALLERY = 'PHOTO_GALLERY', TOGGLE_FAVOURITE = 'TOGGLE_FAVOURITE', SHARE = 'SHARE', - REFRESH_DATA_FROM_QR_CODE = 'REFRESH_DATA_FROM_QR_CODE' + REFRESH_DATA_FROM_QR_CODE = 'REFRESH_DATA_FROM_QR_CODE', + SHOW_BREWS = 'SHOW_BREWS', + CUPPING = 'CUPPING', } diff --git a/src/generated/src/classes/bean/bean.ts b/src/generated/src/classes/bean/bean.ts index a6cb9ed55..991c705e5 100644 --- a/src/generated/src/classes/bean/bean.ts +++ b/src/generated/src/classes/bean/bean.ts @@ -224,6 +224,8 @@ export interface BeanProto { qr_code?: string | undefined; favourite?: boolean | undefined; shared?: boolean | undefined; + cupping?: ICupping | undefined; + cupped_flavor?: IFlavor | undefined; } export interface Config { @@ -260,6 +262,25 @@ export interface BeanRoastInformation { second_crack_temperature?: number | undefined; } +export interface ICupping { + dry_fragrance?: number | undefined; + wet_aroma?: number | undefined; + brightness?: number | undefined; + flavor?: number | undefined; + body?: number | undefined; + finish?: number | undefined; + sweetness?: number | undefined; + clean_cup?: number | undefined; + complexity?: number | undefined; + uniformity?: number | undefined; + cuppers_correction?: number | undefined; +} + +export interface IFlavor { + predefined_flavors: number[]; + custom_flavors: string[]; +} + function createBaseBeanProto(): BeanProto { return { name: '', @@ -288,6 +309,8 @@ function createBaseBeanProto(): BeanProto { qr_code: undefined, favourite: undefined, shared: undefined, + cupping: undefined, + cupped_flavor: undefined, }; } @@ -377,6 +400,12 @@ export const BeanProto = { if (message.shared !== undefined) { writer.uint32(208).bool(message.shared); } + if (message.cupping !== undefined) { + ICupping.encode(message.cupping, writer.uint32(218).fork()).ldelim(); + } + if (message.cupped_flavor !== undefined) { + IFlavor.encode(message.cupped_flavor, writer.uint32(226).fork()).ldelim(); + } return writer; }, @@ -470,6 +499,12 @@ export const BeanProto = { case 26: message.shared = reader.bool(); break; + case 27: + message.cupping = ICupping.decode(reader, reader.uint32()); + break; + case 28: + message.cupped_flavor = IFlavor.decode(reader, reader.uint32()); + break; default: reader.skipType(tag & 7); break; @@ -530,6 +565,12 @@ export const BeanProto = { ? Boolean(object.favourite) : undefined, shared: isSet(object.shared) ? Boolean(object.shared) : undefined, + cupping: isSet(object.cupping) + ? ICupping.fromJSON(object.cupping) + : undefined, + cupped_flavor: isSet(object.cupped_flavor) + ? IFlavor.fromJSON(object.cupped_flavor) + : undefined, }; }, @@ -591,6 +632,14 @@ export const BeanProto = { message.qr_code !== undefined && (obj.qr_code = message.qr_code); message.favourite !== undefined && (obj.favourite = message.favourite); message.shared !== undefined && (obj.shared = message.shared); + message.cupping !== undefined && + (obj.cupping = message.cupping + ? ICupping.toJSON(message.cupping) + : undefined); + message.cupped_flavor !== undefined && + (obj.cupped_flavor = message.cupped_flavor + ? IFlavor.toJSON(message.cupped_flavor) + : undefined); return obj; }, @@ -632,6 +681,14 @@ export const BeanProto = { message.qr_code = object.qr_code ?? undefined; message.favourite = object.favourite ?? undefined; message.shared = object.shared ?? undefined; + message.cupping = + object.cupping !== undefined && object.cupping !== null + ? ICupping.fromPartial(object.cupping) + : undefined; + message.cupped_flavor = + object.cupped_flavor !== undefined && object.cupped_flavor !== null + ? IFlavor.fromPartial(object.cupped_flavor) + : undefined; return message; }, }; @@ -1074,6 +1131,266 @@ export const BeanRoastInformation = { }, }; +function createBaseICupping(): ICupping { + return { + dry_fragrance: undefined, + wet_aroma: undefined, + brightness: undefined, + flavor: undefined, + body: undefined, + finish: undefined, + sweetness: undefined, + clean_cup: undefined, + complexity: undefined, + uniformity: undefined, + cuppers_correction: undefined, + }; +} + +export const ICupping = { + encode( + message: ICupping, + writer: _m0.Writer = _m0.Writer.create() + ): _m0.Writer { + if (message.dry_fragrance !== undefined) { + writer.uint32(8).uint64(message.dry_fragrance); + } + if (message.wet_aroma !== undefined) { + writer.uint32(16).uint64(message.wet_aroma); + } + if (message.brightness !== undefined) { + writer.uint32(24).uint64(message.brightness); + } + if (message.flavor !== undefined) { + writer.uint32(32).uint64(message.flavor); + } + if (message.body !== undefined) { + writer.uint32(40).uint64(message.body); + } + if (message.finish !== undefined) { + writer.uint32(48).uint64(message.finish); + } + if (message.sweetness !== undefined) { + writer.uint32(56).uint64(message.sweetness); + } + if (message.clean_cup !== undefined) { + writer.uint32(64).uint64(message.clean_cup); + } + if (message.complexity !== undefined) { + writer.uint32(72).uint64(message.complexity); + } + if (message.uniformity !== undefined) { + writer.uint32(80).uint64(message.uniformity); + } + if (message.cuppers_correction !== undefined) { + writer.uint32(88).uint64(message.cuppers_correction); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ICupping { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseICupping(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.dry_fragrance = longToNumber(reader.uint64() as Long); + break; + case 2: + message.wet_aroma = longToNumber(reader.uint64() as Long); + break; + case 3: + message.brightness = longToNumber(reader.uint64() as Long); + break; + case 4: + message.flavor = longToNumber(reader.uint64() as Long); + break; + case 5: + message.body = longToNumber(reader.uint64() as Long); + break; + case 6: + message.finish = longToNumber(reader.uint64() as Long); + break; + case 7: + message.sweetness = longToNumber(reader.uint64() as Long); + break; + case 8: + message.clean_cup = longToNumber(reader.uint64() as Long); + break; + case 9: + message.complexity = longToNumber(reader.uint64() as Long); + break; + case 10: + message.uniformity = longToNumber(reader.uint64() as Long); + break; + case 11: + message.cuppers_correction = longToNumber(reader.uint64() as Long); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): ICupping { + return { + dry_fragrance: isSet(object.dry_fragrance) + ? Number(object.dry_fragrance) + : undefined, + wet_aroma: isSet(object.wet_aroma) ? Number(object.wet_aroma) : undefined, + brightness: isSet(object.brightness) + ? Number(object.brightness) + : undefined, + flavor: isSet(object.flavor) ? Number(object.flavor) : undefined, + body: isSet(object.body) ? Number(object.body) : undefined, + finish: isSet(object.finish) ? Number(object.finish) : undefined, + sweetness: isSet(object.sweetness) ? Number(object.sweetness) : undefined, + clean_cup: isSet(object.clean_cup) ? Number(object.clean_cup) : undefined, + complexity: isSet(object.complexity) + ? Number(object.complexity) + : undefined, + uniformity: isSet(object.uniformity) + ? Number(object.uniformity) + : undefined, + cuppers_correction: isSet(object.cuppers_correction) + ? Number(object.cuppers_correction) + : undefined, + }; + }, + + toJSON(message: ICupping): unknown { + const obj: any = {}; + message.dry_fragrance !== undefined && + (obj.dry_fragrance = Math.round(message.dry_fragrance)); + message.wet_aroma !== undefined && + (obj.wet_aroma = Math.round(message.wet_aroma)); + message.brightness !== undefined && + (obj.brightness = Math.round(message.brightness)); + message.flavor !== undefined && (obj.flavor = Math.round(message.flavor)); + message.body !== undefined && (obj.body = Math.round(message.body)); + message.finish !== undefined && (obj.finish = Math.round(message.finish)); + message.sweetness !== undefined && + (obj.sweetness = Math.round(message.sweetness)); + message.clean_cup !== undefined && + (obj.clean_cup = Math.round(message.clean_cup)); + message.complexity !== undefined && + (obj.complexity = Math.round(message.complexity)); + message.uniformity !== undefined && + (obj.uniformity = Math.round(message.uniformity)); + message.cuppers_correction !== undefined && + (obj.cuppers_correction = Math.round(message.cuppers_correction)); + return obj; + }, + + fromPartial, I>>(object: I): ICupping { + const message = createBaseICupping(); + message.dry_fragrance = object.dry_fragrance ?? undefined; + message.wet_aroma = object.wet_aroma ?? undefined; + message.brightness = object.brightness ?? undefined; + message.flavor = object.flavor ?? undefined; + message.body = object.body ?? undefined; + message.finish = object.finish ?? undefined; + message.sweetness = object.sweetness ?? undefined; + message.clean_cup = object.clean_cup ?? undefined; + message.complexity = object.complexity ?? undefined; + message.uniformity = object.uniformity ?? undefined; + message.cuppers_correction = object.cuppers_correction ?? undefined; + return message; + }, +}; + +function createBaseIFlavor(): IFlavor { + return { predefined_flavors: [], custom_flavors: [] }; +} + +export const IFlavor = { + encode( + message: IFlavor, + writer: _m0.Writer = _m0.Writer.create() + ): _m0.Writer { + writer.uint32(10).fork(); + for (const v of message.predefined_flavors) { + writer.uint64(v); + } + writer.ldelim(); + for (const v of message.custom_flavors) { + writer.uint32(18).string(v!); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): IFlavor { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseIFlavor(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if ((tag & 7) === 2) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.predefined_flavors.push( + longToNumber(reader.uint64() as Long) + ); + } + } else { + message.predefined_flavors.push( + longToNumber(reader.uint64() as Long) + ); + } + break; + case 2: + message.custom_flavors.push(reader.string()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): IFlavor { + return { + predefined_flavors: Array.isArray(object?.predefined_flavors) + ? object.predefined_flavors.map((e: any) => Number(e)) + : [], + custom_flavors: Array.isArray(object?.custom_flavors) + ? object.custom_flavors.map((e: any) => String(e)) + : [], + }; + }, + + toJSON(message: IFlavor): unknown { + const obj: any = {}; + if (message.predefined_flavors) { + obj.predefined_flavors = message.predefined_flavors.map((e) => + Math.round(e) + ); + } else { + obj.predefined_flavors = []; + } + if (message.custom_flavors) { + obj.custom_flavors = message.custom_flavors.map((e) => e); + } else { + obj.custom_flavors = []; + } + return obj; + }, + + fromPartial, I>>(object: I): IFlavor { + const message = createBaseIFlavor(); + message.predefined_flavors = object.predefined_flavors?.map((e) => e) || []; + message.custom_flavors = object.custom_flavors?.map((e) => e) || []; + return message; + }, +}; + declare var self: any | undefined; declare var window: any | undefined; declare var global: any | undefined; diff --git a/src/index.html b/src/index.html index b27e49bec..3b546daa9 100644 --- a/src/index.html +++ b/src/index.html @@ -17,6 +17,7 @@ + + diff --git a/src/interfaces/bean/iBean.ts b/src/interfaces/bean/iBean.ts index 5d2a0783b..15ff6b8eb 100755 --- a/src/interfaces/bean/iBean.ts +++ b/src/interfaces/bean/iBean.ts @@ -1,13 +1,15 @@ /** * Created by lars on 10/18/2017. */ -import {IConfig} from '../objectConfig/iObjectConfig'; +import { IConfig } from '../objectConfig/iObjectConfig'; /** Enums */ -import {BEAN_MIX_ENUM} from '../../enums/beans/mix'; -import {ROASTS_ENUM} from '../../enums/beans/roasts'; -import {BEAN_ROASTING_TYPE_ENUM} from '../../enums/beans/beanRoastingType'; -import {IBeanInformation} from './iBeanInformation'; -import {IBeanRoastInformation} from './iBeanRoastInformation'; +import { BEAN_MIX_ENUM } from '../../enums/beans/mix'; +import { ROASTS_ENUM } from '../../enums/beans/roasts'; +import { BEAN_ROASTING_TYPE_ENUM } from '../../enums/beans/beanRoastingType'; +import { IBeanInformation } from './iBeanInformation'; +import { IBeanRoastInformation } from './iBeanRoastInformation'; +import { IFlavor } from '../flavor/iFlavor'; +import { ICupping } from '../cupping/iCupping'; export interface IBean { name: string; @@ -16,7 +18,6 @@ export interface IBean { // Blend / Single Origin. beanMix: BEAN_MIX_ENUM; - // Aromatics aromatics: string; note: string; @@ -47,4 +48,6 @@ export interface IBean { rating: number; qr_code: string; shared: boolean; + cupping: ICupping; + cupped_flavor: IFlavor; } diff --git a/src/interfaces/flavor/iFlavor.ts b/src/interfaces/flavor/iFlavor.ts index 5c8bdc1d2..4ed4dd493 100755 --- a/src/interfaces/flavor/iFlavor.ts +++ b/src/interfaces/flavor/iFlavor.ts @@ -1,4 +1,4 @@ export interface IFlavor { - predefined_flavors:{}, - custom_flavors: Array + predefined_flavors: {}; + custom_flavors: Array; } diff --git a/src/interfaces/settings/iSettings.ts b/src/interfaces/settings/iSettings.ts index 447a75f09..c19942b6b 100755 --- a/src/interfaces/settings/iSettings.ts +++ b/src/interfaces/settings/iSettings.ts @@ -95,6 +95,7 @@ export interface ISettings { pressure_log: boolean; pressure_threshold_active: boolean; pressure_threshold_bar: number; + pressure_stay_connected: boolean; currency: string; } diff --git a/src/popover/custom-popover/custom-popover.component.scss b/src/popover/custom-popover/custom-popover.component.scss index 9a0056a91..bcf796505 100644 --- a/src/popover/custom-popover/custom-popover.component.scss +++ b/src/popover/custom-popover/custom-popover.component.scss @@ -1,25 +1,14 @@ :host { --max-height: 40%; - top: 60%; - position: absolute; + position:absolute!important; + height:40%!important; + bottom:0!important; + margin: auto 0!important; margin-inline-start: 10px; margin-inline-end: 10px; border-radius: 6px; margin-block-end: 10px; - @media (max-height: 450px) { - --max-height: 75%; - top: 25%; - } - @media (min-height: 451px) and (max-height: 568px) { - --max-height: 60%; - top: 40%; - } - - @media (min-height: 569px) and (max-height: 667px) { - --max-height: 40%; - top: 60%; - } .ion-title{ line-height: 24px; diff --git a/src/services/intentHandler/intent-handler.service.ts b/src/services/intentHandler/intent-handler.service.ts index cdbe64c32..88f206f15 100644 --- a/src/services/intentHandler/intent-handler.service.ts +++ b/src/services/intentHandler/intent-handler.service.ts @@ -50,7 +50,10 @@ export class IntentHandlerService { tmp = []; _url.split('&').forEach((item) => { tmp = item.split('='); - if (tmp[0] === _parameterName) { + if ( + tmp[0] === _parameterName || + tmp[0] === _parameterName.replace('=', '') + ) { result = decodeURIComponent(tmp[1]); } }); @@ -99,7 +102,8 @@ export class IntentHandlerService { this.uiLog.log('Handle deeplink: ' + url); if ( url.indexOf('https://beanconqueror.com/?qr=') === 0 || - url.indexOf('https://beanconqueror.com?qr=') === 0 + url.indexOf('https://beanconqueror.com?qr=') === 0 || + url.indexOf('?qr=') >= 0 ) { const qrCodeId: string = String( this.findGetParameter(_matchLink.queryString, 'qr') @@ -112,11 +116,12 @@ export class IntentHandlerService { await this.addBeanFromServer(qrCodeId); } else if ( url.indexOf('https://beanconqueror.com/?shareUserBean0=') === 0 || - url.indexOf('https://beanconqueror.com?shareUserBean0=') === 0 + url.indexOf('https://beanconqueror.com?shareUserBean0=') === 0 || + url.indexOf('?shareUserBean0=') >= 0 ) { let userBeanJSON: string = ''; - const regex = /((shareUserBean)[0-9]+\=)/gi; + const regex = /((shareUserBean)[0-9]+(?=\=))/gi; const foundJSONParams = url.match(regex); try { for (const param of foundJSONParams) { diff --git a/src/services/serverCommunication/server-communication.service.ts b/src/services/serverCommunication/server-communication.service.ts index fa8ba8790..82016e5dd 100644 --- a/src/services/serverCommunication/server-communication.service.ts +++ b/src/services/serverCommunication/server-communication.service.ts @@ -1,61 +1,116 @@ import { Injectable } from '@angular/core'; -import {HttpClient} from '@angular/common/http'; -import {environment} from '../../environments/environment'; -import {ServerBean} from '../../models/bean/serverBean'; -import {UILog} from '../uiLog'; -import {ServerBrew} from '../../classes/server/brew/brew'; -import {catchError, timeout} from 'rxjs/operators'; -import {of} from 'rxjs'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { environment } from '../../environments/environment'; +import { ServerBean } from '../../models/bean/serverBean'; +import { UILog } from '../uiLog'; +import { ServerBrew } from '../../classes/server/brew/brew'; +import { catchError, timeout } from 'rxjs/operators'; +import { of } from 'rxjs'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class ServerCommunicationService { - constructor(private http: HttpClient, private readonly uiLog: UILog) {} - + public uploadShot() { + const promise = new Promise((resolve, reject) => { + const httpOptions = { + headers: new HttpHeaders({ + 'Content-Type': 'application/json', + Authorization: + 'Basic ' + btoa('account@beanconqueror.com:q5gsZM9Pbte2FEb'), + }), + }; + this.http + .post('https://visualizer.coffee/api/shots/upload', {}, httpOptions) + .pipe( + timeout(10000), + catchError((e) => { + return of(null); + }) + ) + .toPromise() + .then( + (data: any) => { + console.log(data); + }, + (error) => { + console.log(error); + reject(); + } + ) + .catch((error) => { + console.log(error); + reject(); + }); + }); + return promise; + } public getBeanInformation(_qrCodeId: string): Promise { const promise = new Promise((resolve, reject) => { - this.http.get(environment.API_URL + 'Roaster/GetBeanFromQrCodeId?id=' + _qrCodeId, {}).pipe(timeout(10000),catchError((e)=>{ - return of(null); - })).toPromise() - .then((data: ServerBean) => { - if (data === null) { - // Timeout was triggered. + this.http + .get( + environment.API_URL + 'Roaster/GetBeanFromQrCodeId?id=' + _qrCodeId, + {} + ) + .pipe( + timeout(10000), + catchError((e) => { + return of(null); + }) + ) + .toPromise() + .then( + (data: ServerBean) => { + if (data === null) { + // Timeout was triggered. + reject(); + } else { + this.uiLog.log( + `getBeanInformation - data received - ${JSON.stringify(data)}` + ); + resolve(data); + } + }, + (error) => { + this.uiLog.log( + `getBeanInformation - error received - ${JSON.stringify(error)}` + ); reject(); - } else { - this.uiLog.log(`getBeanInformation - data received - ${JSON.stringify(data)}`); - resolve(data); } - - },(error) => { - this.uiLog.log(`getBeanInformation - error received - ${JSON.stringify(error)}`); - reject(); - }) + ) .catch((error) => { - reject(); + reject(); }); }); return promise; } - public trackBrew(brew: ServerBrew) { const promise = new Promise((resolve, reject) => { - this.http.put(environment.API_URL + 'Roaster/TrackBrew', brew).pipe(timeout(10000),catchError((e)=>{ - return of(null); - })).toPromise() - .then((data) => { - if (data === null) { - // Timeout was triggered. + this.http + .put(environment.API_URL + 'Roaster/TrackBrew', brew) + .pipe( + timeout(10000), + catchError((e) => { + return of(null); + }) + ) + .toPromise() + .then( + (data) => { + if (data === null) { + // Timeout was triggered. + reject(); + } else { + resolve(data); + } + }, + () => { reject(); - } else { - resolve(data); } - },() => { - reject(); - }) + ) .catch((error) => { reject(); }); diff --git a/src/services/shareService/share-service.service.ts b/src/services/shareService/share-service.service.ts index 2ad2edfb0..5fad952b7 100644 --- a/src/services/shareService/share-service.service.ts +++ b/src/services/shareService/share-service.service.ts @@ -30,9 +30,21 @@ export class ShareService { private readonly translate: TranslateService, private readonly uiHelper: UIHelper, private readonly uiAnalytics: UIAnalytics, + private readonly uiLog: UILog ) {} + public async shareImage(_dataUrl: string) { + try { + await this.socialShare.share('', '', _dataUrl, null); + } catch (ex) {} + } + public async shareFile(_filename: string, _dataUrl: string) { + try { + await this.socialShare.share('', _filename, _dataUrl, null); + } catch (ex) {} + } + public async shareBean(_bean: Bean) { // try { @@ -54,6 +66,16 @@ export class ShareService { if (_bean.beanMix === ('UNKNOWN' as BEAN_MIX_ENUM)) { protoBean.beanMix = BeanMix.UNKNOWN_BEAN_MIX; } + + // We need to get the key/value pairing to a simple int list. + if ( + 'cupped_flavor' in _bean && + 'predefined_flavors' in _bean.cupped_flavor + ) { + const keys = Object.keys(_bean.cupped_flavor.predefined_flavors); + protoBean.cupped_flavor.predefined_flavors = keys; + } + const bytes = BeanProto.encode(protoBean).finish(); const base64String = this.uiHelper.encode(bytes); @@ -92,6 +114,12 @@ export class ShareService { } catch (ex) {} } + public async shareText(_text: string) { + try { + await this.socialShare.share(_text, null, null, null); + } catch (ex) {} + } + private generateBeanMessage(_bean: Bean) { let message: string = ''; message += `${this.translate.instant('BEAN_DATA_NAME')}: ${_bean.name}\n`; diff --git a/src/services/uiAlert.ts b/src/services/uiAlert.ts index dbfef710e..c79192970 100755 --- a/src/services/uiAlert.ts +++ b/src/services/uiAlert.ts @@ -1,22 +1,25 @@ /** Core */ -import {Injectable} from '@angular/core'; +import { Injectable } from '@angular/core'; /** Ionic */ -import {AlertController, LoadingController, ModalController} from '@ionic/angular'; -import {TranslateService} from '@ngx-translate/core'; -import {CustomPopoverComponent} from '../popover/custom-popover/custom-popover.component'; -import {FilesystemErrorPopoverComponent} from '../popover/filesystem-error-popover/filesystem-error-popover.component'; +import { + AlertController, + LoadingController, + ModalController, +} from '@ionic/angular'; +import { TranslateService } from '@ngx-translate/core'; +import { CustomPopoverComponent } from '../popover/custom-popover/custom-popover.component'; +import { FilesystemErrorPopoverComponent } from '../popover/filesystem-error-popover/filesystem-error-popover.component'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class UIAlert { - - constructor(private readonly alertController: AlertController, - private readonly translate: TranslateService, - private readonly modalController: ModalController, - private readonly loadingController: LoadingController) { - } - + constructor( + private readonly alertController: AlertController, + private readonly translate: TranslateService, + private readonly modalController: ModalController, + private readonly loadingController: LoadingController + ) {} private loadingSpinner; @@ -25,11 +28,9 @@ export class UIAlert { await this.hideLoadingSpinner(); } this.loadingSpinner = await this.loadingController.create({ - message: this.translate.instant('PLEASE_WAIT') + message: this.translate.instant('PLEASE_WAIT'), }); this.loadingSpinner.present(); - - } public setLoadingSpinnerMessage(message: string, translate: boolean = false) { @@ -39,9 +40,7 @@ export class UIAlert { } else { this.loadingSpinner.message = this.translate.instant(message); } - } - } public async hideLoadingSpinner() { @@ -49,20 +48,17 @@ export class UIAlert { await this.loadingSpinner.dismiss(); this.loadingSpinner = undefined; } - } /** * @method showMessage */ public async showAppShetItSelfMessage() { - - const modal = await this.modalController.create( - { - component: FilesystemErrorPopoverComponent, - cssClass: 'half-bottom-modal', - showBackdrop: true, - }); + const modal = await this.modalController.create({ + component: FilesystemErrorPopoverComponent, + cssClass: 'half-bottom-modal', + showBackdrop: true, + }); await modal.present(); await modal.onWillDismiss(); } @@ -70,7 +66,12 @@ export class UIAlert { /** * @method showMessage */ - public async showMessage(_message: string, _title?: string, _ok?: string, _translate?: boolean): Promise { + public async showMessage( + _message: string, + _title?: string, + _ok?: string, + _translate?: boolean + ): Promise { if (_translate === true) { _message = this.translate.instant(_message); @@ -95,16 +96,20 @@ export class UIAlert { text: okText, handler: () => { resolve(undefined); - } - } - ] + }, + }, + ], }); await alert.present(); }); return promise; } - public async showConfirm(_message: string, _title?: string, _translate?: boolean): Promise { + public async showConfirm( + _message: string, + _title?: string, + _translate?: boolean + ): Promise { if (_translate === true) { _message = this.translate.instant(_message); @@ -124,35 +129,25 @@ export class UIAlert { role: 'cancel', handler: () => { reject(); - } + }, }, { text: this.translate.instant('YES'), handler: () => { resolve(undefined); - } - } - ] + }, + }, + ], }); await alert.present(); }); } - public async presentCustomPopover(_title: string, _description: string, _okText: string) { - - const modal = await this.modalController.create( - { - component: CustomPopoverComponent, - cssClass: 'half-bottom-modal', - showBackdrop: true, - componentProps: { - title: _title, - description: _description, - okText: _okText - } - }); - await modal.present(); - await modal.onWillDismiss(); + public async presentCustomPopover( + _title: string, + _description: string, + _okText: string + ) { + await this.showMessage(_description, _title, _okText, true); } - } diff --git a/src/services/uiBeanHelper.ts b/src/services/uiBeanHelper.ts index 49aab4afb..373f51fd4 100644 --- a/src/services/uiBeanHelper.ts +++ b/src/services/uiBeanHelper.ts @@ -26,6 +26,8 @@ import { UIHelper } from './uiHelper'; import { BEAN_MIX_ENUM } from '../enums/beans/mix'; import { ROASTS_ENUM } from '../enums/beans/roasts'; import { BEAN_ROASTING_TYPE_ENUM } from '../enums/beans/beanRoastingType'; +import { BeanAssociatedBrewsComponent } from '../app/beans/bean-associated-brews/bean-associated-brews.component'; +import { BrewCuppingComponent } from '../app/brew/brew-cupping/brew-cupping.component'; /** * Handles every helping functionalities @@ -131,6 +133,7 @@ export class UIBeanHelper { } public async addScannedQRBean(_scannedQRBean: ServerBean) { + console.log(_scannedQRBean.error); if (_scannedQRBean.error === null) { this.uiAnalytics.trackEvent( QR_TRACKING.TITLE, @@ -162,14 +165,26 @@ export class UIBeanHelper { ); } } else { - this.uiAnalytics.trackEvent(QR_TRACKING.TITLE, QR_TRACKING.ACTIONS.SCAN); - await this.uiAlert.hideLoadingSpinner(); - this.uiAlert.showMessage( - 'QR.SERVER.ERROR_OCCURED', - 'ERROR_OCCURED', - undefined, - true + this.uiAnalytics.trackEvent( + QR_TRACKING.TITLE, + QR_TRACKING.ACTIONS.SCAN_FAILED ); + await this.uiAlert.hideLoadingSpinner(); + if (_scannedQRBean.error.errorCode === 'beannotapproved') { + this.uiAlert.showMessage( + 'QR.SERVER.BEAN_NOT_APPROVED', + 'ERROR_OCCURED', + undefined, + true + ); + } else { + this.uiAlert.showMessage( + 'QR.SERVER.ERROR_OCCURED', + 'ERROR_OCCURED', + undefined, + true + ); + } } } @@ -183,6 +198,16 @@ export class UIBeanHelper { await modal.onWillDismiss(); } + public async showAssociatedBrewsForBean(_bean: Bean) { + const modal = await this.modalController.create({ + component: BeanAssociatedBrewsComponent, + id: BeanAssociatedBrewsComponent.COMPONENT_ID, + componentProps: { bean: _bean }, + }); + await modal.present(); + await modal.onWillDismiss(); + } + public async repeatBean(_bean: Bean) { const modal = await this.modalController.create({ component: BeansAddComponent, @@ -206,6 +231,24 @@ export class UIBeanHelper { bean.favourite = false; bean.rating = 0; + // Empty it. + const newPredefinedFlavors = {}; + if ( + 'cupped_flavor' in protoBean && + 'predefined_flavors' in protoBean.cupped_flavor && + protoBean.cupped_flavor.predefined_flavors.length > 0 + ) { + for (const flavKey of protoBean.cupped_flavor.predefined_flavors) { + newPredefinedFlavors[flavKey] = true; + } + } + bean.cupped_flavor.predefined_flavors = newPredefinedFlavors; + + if (bean.bean_information && Object.keys(bean.bean_information)) { + } else { + bean.bean_information = []; + } + bean.beanMix = { 0: 'UNKNOWN' as BEAN_MIX_ENUM, 1: 'SINGLE_ORIGIN' as BEAN_MIX_ENUM, @@ -230,10 +273,10 @@ export class UIBeanHelper { }[protoBean.roast]; bean.bean_roasting_type = { - 0: 'FILTER' as BEAN_ROASTING_TYPE_ENUM, - 1: 'ESPRESSO' as BEAN_ROASTING_TYPE_ENUM, - 2: 'OMNI' as BEAN_ROASTING_TYPE_ENUM, - 3: 'UNKNOWN' as BEAN_ROASTING_TYPE_ENUM, + 0: 'UNKNOWN' as BEAN_ROASTING_TYPE_ENUM, + 1: 'FILTER' as BEAN_ROASTING_TYPE_ENUM, + 2: 'ESPRESSO' as BEAN_ROASTING_TYPE_ENUM, + 3: 'OMNI' as BEAN_ROASTING_TYPE_ENUM, }[protoBean.bean_roasting_type]; await this.uiAlert.hideLoadingSpinner(); @@ -309,4 +352,14 @@ export class UIBeanHelper { await modal.present(); await modal.onWillDismiss(); } + + public async cupBean(_bean: Bean) { + const modal = await this.modalController.create({ + component: BrewCuppingComponent, + id: BrewCuppingComponent.COMPONENT_ID, + componentProps: { bean: _bean }, + }); + await modal.present(); + await modal.onWillDismiss(); + } } diff --git a/src/services/uiFileHelper.ts b/src/services/uiFileHelper.ts index d924016f5..555986fa2 100644 --- a/src/services/uiFileHelper.ts +++ b/src/services/uiFileHelper.ts @@ -1,81 +1,91 @@ /** Core */ -import {Injectable} from '@angular/core'; -import {DirectoryEntry, Entry, File, FileEntry} from '@ionic-native/file/ngx'; -import {Platform} from '@ionic/angular'; -import {DomSanitizer} from '@angular/platform-browser'; -import {UILog} from './uiLog'; -import {SocialSharing} from '@ionic-native/social-sharing/ngx'; +import { Injectable } from '@angular/core'; +import { DirectoryEntry, Entry, File, FileEntry } from '@ionic-native/file/ngx'; +import { Platform } from '@ionic/angular'; +import { DomSanitizer } from '@angular/platform-browser'; +import { UILog } from './uiLog'; +import { SocialSharing } from '@ionic-native/social-sharing/ngx'; import moment from 'moment'; -import {FileTransfer, FileTransferObject} from '@ionic-native/file-transfer/ngx'; -import {InstanceClass} from './instanceClass'; +import { + FileTransfer, + FileTransferObject, +} from '@ionic-native/file-transfer/ngx'; +import { InstanceClass } from './instanceClass'; /** * Handles every helping functionalities */ declare var navigator: any; declare var window; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class UIFileHelper extends InstanceClass { - private cachedBase64: any = {}; private cachedInternalUrls: any = {}; - - - constructor (private readonly file: File, - private readonly uiLog: UILog, - private readonly platform: Platform, - private readonly domSanitizer: DomSanitizer, - private readonly socialSharing: SocialSharing, - private readonly fileTransfer: FileTransfer) { - + constructor( + private readonly file: File, + private readonly uiLog: UILog, + private readonly platform: Platform, + private readonly domSanitizer: DomSanitizer, + private readonly socialSharing: SocialSharing, + private readonly fileTransfer: FileTransfer + ) { super(); } private getFileDirectory(): string { if (this.platform.is('ios') && this.platform.is('cordova')) { return this.file.documentsDirectory; - } else{ + } else { return this.file.dataDirectory; } - } - - public async saveJSONFile(_fileName: string, _jsonContent: string): Promise { + public async saveJSONFile( + _fileName: string, + _jsonContent: string + ): Promise { return new Promise(async (resolve, reject) => { - const blob = new Blob([_jsonContent], {type: 'application/json;charset=UTF-8;'}); + const blob = new Blob([_jsonContent], { + type: 'application/json;charset=UTF-8;', + }); try { await this.createFolder(_fileName); } catch (ex) { - this.uiLog.error('UILog - saveJSONFile - We could not create folders ' + _fileName); + this.uiLog.error( + 'UILog - saveJSONFile - We could not create folders ' + _fileName + ); } - this.file.createFile(this.getFileDirectory(),_fileName,true).then((_fileEntry: FileEntry) => { - _fileEntry.createWriter((writer) => { - writer.onwriteend = () => { - resolve(undefined); - this.uiLog.info('UILog - saveJSONFile - File saved successfully - ' + _fileName); - }; - writer.onerror = () => { - reject(); - }; - writer.seek(0); - writer.write(blob); // You need to put the file, blob or base64 representation here. - }); - },() => { - reject(); - this.uiLog.error('Could not save file'); - }); + this.file.createFile(this.getFileDirectory(), _fileName, true).then( + (_fileEntry: FileEntry) => { + _fileEntry.createWriter((writer) => { + writer.onwriteend = () => { + resolve(undefined); + this.uiLog.info( + 'UILog - saveJSONFile - File saved successfully - ' + _fileName + ); + }; + writer.onerror = () => { + reject(); + }; + writer.seek(0); + writer.write(blob); // You need to put the file, blob or base64 representation here. + }); + }, + () => { + reject(); + this.uiLog.error('Could not save file'); + } + ); }); - }; + } public async getJSONFile(_fileName: string): Promise { return new Promise(async (resolve, reject) => { if (this.platform.is('cordova')) { - // let filePath: string; // filePath = _filePath; // filePath.slice(0, filePath.lastIndexOf('/')); @@ -87,54 +97,61 @@ export class UIFileHelper extends InstanceClass { fileName = fileName.slice(1); } - this.file.readAsText(path, fileName).then((_text: string) => { - try { - const parsedJSON: any = JSON.parse(_text); - resolve(parsedJSON); - }catch(ex) { - this.uiLog.error('We could not read json file ' + ex.message); + this.file.readAsText(path, fileName).then( + (_text: string) => { + try { + const parsedJSON: any = JSON.parse(_text); + resolve(parsedJSON); + } catch (ex) { + this.uiLog.error('We could not read json file ' + ex.message); + reject(); + } + }, + () => { reject(); } - - },() => { - reject(); - }); + ); } else { reject(); } - }); - }; - - + } - public async saveBase64File (_fileName: string, _fileExtension: string, _base64: string): Promise { + public async saveBase64File( + _fileName: string, + _fileExtension: string, + _base64: string + ): Promise { return new Promise(async (resolve, reject) => { - this.generateFileName(this.getFileDirectory(), _fileName, _fileExtension).then((_newName) => { + this.generateFileName( + this.getFileDirectory(), + _fileName, + _fileExtension + ).then((_newName) => { // console.log('New Filename' + _newName); - const newBlob: Blob = this.dataURItoBlob(_base64); + let newBlob: Blob = this.dataURItoBlob(_base64); if (newBlob === undefined) { reject(); } else { - this.file.writeFile(this.getFileDirectory(), _newName, newBlob).then((_t) => { - this.uiLog.log('Save file below: ' +_t.fullPath); - resolve(_t.fullPath); - }, (e) => { - this.uiLog.error('Cant save file: ' + JSON.stringify(e)); - reject(); - }); + this.file.writeFile(this.getFileDirectory(), _newName, newBlob).then( + (_t) => { + newBlob = null; + this.uiLog.log('Save file below: ' + _t.fullPath); + resolve(_t.fullPath); + }, + (e) => { + this.uiLog.error('Cant save file: ' + JSON.stringify(e)); + reject(); + } + ); } }); - }); } public async deleteJSONBackupsOlderThenSevenDays(): Promise { - const promise: Promise = new Promise(async (resolve, reject) => { - + const promise: Promise = new Promise(async (resolve, reject) => { if (this.platform.is('cordova')) { - - let storageLocation: string = ''; if (this.platform.is('android')) { storageLocation = this.file.externalRootDirectory; @@ -143,57 +160,80 @@ export class UIFileHelper extends InstanceClass { } const lastSevenDays: Array = []; - for (let i=0;i<8;i++) { - const day: string = moment().subtract(i,'days').format('DD_MM_YYYY'); - const automatedBackupFileName: string = 'Beanconqueror_automatic_export_' + day + '.json'; + for (let i = 0; i < 8; i++) { + const day: string = moment().subtract(i, 'days').format('DD_MM_YYYY'); + const automatedBackupFileName: string = + 'Beanconqueror_automatic_export_' + day + '.json'; lastSevenDays.push(automatedBackupFileName); } - window.resolveLocalFileSystemURL(storageLocation, + window.resolveLocalFileSystemURL( + storageLocation, (fileSystem) => { - - fileSystem.getDirectory('Download', { + fileSystem.getDirectory( + 'Download', + { create: true, - exclusive: false + exclusive: false, }, (directory) => { - directory.getDirectory('Beanconqueror_export', { + directory.getDirectory( + 'Beanconqueror_export', + { create: true, - exclusive: false + exclusive: false, }, (directory_export: DirectoryEntry) => { const directoryReader = directory_export.createReader(); - directoryReader.readEntries((entries: Entry[]) => { - for (const entry of entries) { - if (entry.isFile) { - if (lastSevenDays.indexOf(entry.name) === -1 && entry.name.indexOf('Beanconqueror_automatic_export_') === 0) { - const filename: string = entry.name; - entry.remove(() =>{ - this.uiLog.log('Removed automated backup file ' +filename); - - },()=> { - this.uiLog.log('Could not remove automated backup file ' +filename); - }); - } else if (lastSevenDays.indexOf(entry.name)>-1) { - this.uiLog.log('We found a backup file not older then 7 days, so dont delete it'); + directoryReader.readEntries( + (entries: Entry[]) => { + for (const entry of entries) { + if (entry.isFile) { + if ( + lastSevenDays.indexOf(entry.name) === -1 && + entry.name.indexOf( + 'Beanconqueror_automatic_export_' + ) === 0 + ) { + const filename: string = entry.name; + entry.remove( + () => { + this.uiLog.log( + 'Removed automated backup file ' + filename + ); + }, + () => { + this.uiLog.log( + 'Could not remove automated backup file ' + + filename + ); + } + ); + } else if (lastSevenDays.indexOf(entry.name) > -1) { + this.uiLog.log( + 'We found a backup file not older then 7 days, so dont delete it' + ); + } } } - } - - },() => { - - }); - }, () => { + }, + () => {} + ); + }, + () => { reject(); - }); - - - }, () => { + } + ); + }, + () => { reject(); - }); - }, () => { + } + ); + }, + () => { reject(); - }); + } + ); } else { reject(undefined); } @@ -201,30 +241,41 @@ export class UIFileHelper extends InstanceClass { return promise; } - public async downloadExternalFile(_url: string, _fileName: string = 'beanconqueror_image', _fileExtension: string ='.png'): Promise { - const promise: Promise = new Promise(async (resolve, reject) => { - const url: string = _url; - const fileTransferObj: FileTransferObject = this.fileTransfer.create(); - await this.generateFileName(this.getFileDirectory(), _fileName, _fileExtension).then(async (_newName) => { - fileTransferObj.download(url, this.getFileDirectory() + _newName).then(async (_entry) => { + public async downloadExternalFile( + _url: string, + _fileName: string = 'beanconqueror_image', + _fileExtension: string = '.png' + ): Promise { + const promise: Promise = new Promise(async (resolve, reject) => { + const url: string = _url; + const fileTransferObj: FileTransferObject = this.fileTransfer.create(); + await this.generateFileName( + this.getFileDirectory(), + _fileName, + _fileExtension + ).then(async (_newName) => { + fileTransferObj.download(url, this.getFileDirectory() + _newName).then( + async (_entry) => { this.uiLog.log('File download completed: ' + _entry.fullPath); resolve(_entry.fullPath); - }, (error) => { + }, + (error) => { // handle error resolve(undefined); - }); - }); + } + ); }); - return promise; - - } - - public async downloadFile(_filename,_blob,_share: boolean = true): Promise { - const promise: Promise = new Promise(async (resolve, reject) => { - - if (this.platform.is('cordova')) { - + }); + return promise; + } + public async downloadFile( + _filename, + _blob, + _share: boolean = true + ): Promise { + const promise: Promise = new Promise(async (resolve, reject) => { + if (this.platform.is('cordova')) { let storageLocation: string = ''; if (this.platform.is('android')) { storageLocation = this.file.externalRootDirectory; @@ -232,139 +283,167 @@ export class UIFileHelper extends InstanceClass { storageLocation = this.file.documentsDirectory; } - window.resolveLocalFileSystemURL(storageLocation, + window.resolveLocalFileSystemURL( + storageLocation, (fileSystem) => { - - fileSystem.getDirectory('Download', { + fileSystem.getDirectory( + 'Download', + { create: true, - exclusive: false + exclusive: false, }, (directory) => { - directory.getDirectory('Beanconqueror_export', { + directory.getDirectory( + 'Beanconqueror_export', + { create: true, - exclusive: false + exclusive: false, }, (directory_export) => { // You need to put the name you would like to use for the file here. - directory_export.getFile(_filename, { + directory_export.getFile( + _filename, + { create: true, - exclusive: false + exclusive: false, }, (fileEntry: FileEntry) => { - - fileEntry.createWriter((writer) => { - writer.onwriteend = () => { - - if (this.platform.is('ios') && _share === true) { - this.socialSharing.share(undefined,undefined,fileEntry.nativeURL); - } - resolve(fileEntry); - }; - - writer.seek(0); - writer.write(_blob); // You need to put the file, blob or base64 representation here. - - }, () => { - reject(); - }); - }, () => { + fileEntry.createWriter( + (writer) => { + writer.onwriteend = () => { + if (this.platform.is('ios') && _share === true) { + this.socialSharing.share( + undefined, + undefined, + fileEntry.nativeURL + ); + } + resolve(fileEntry); + }; + + writer.seek(0); + writer.write(_blob); // You need to put the file, blob or base64 representation here. + }, + () => { + reject(); + } + ); + }, + () => { reject(); - }); - - }, () => { + } + ); + }, + () => { reject(); - }); - - - }, () => { + } + ); + }, + () => { reject(); - }); - }, () => { - reject(); - }); - } else { - resolve(undefined); - setTimeout(() => { - if (navigator.msSaveBlob) { // IE 10+ - navigator.msSaveBlob(_blob, _filename); - } else { - const link = document.createElement('a'); - if (link.download !== undefined) { // feature detection - // Browsers that support HTML5 download attribute - const url = URL.createObjectURL(_blob); - link.setAttribute('href', url); - link.setAttribute('download', _filename); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); } + ); + }, + () => { + reject(); + } + ); + } else { + resolve(undefined); + setTimeout(() => { + if (navigator.msSaveBlob) { + // IE 10+ + navigator.msSaveBlob(_blob, _filename); + } else { + const link = document.createElement('a'); + if (link.download !== undefined) { + // feature detection + // Browsers that support HTML5 download attribute + const url = URL.createObjectURL(_blob); + link.setAttribute('href', url); + link.setAttribute('download', _filename); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); } - }, 250); - } - }); - return promise; - } + } + }, 250); + } + }); + return promise; + } public createFolder(_path) { const promise: Promise = new Promise(async (resolve, reject) => { - const folders = _path.split('/'); - this.file.resolveDirectoryUrl(this.getFileDirectory()).then((_rootDir: DirectoryEntry) => { - - this.createFolderInternal(_rootDir, folders, - ()=> { - - resolve(undefined); - }, - () => { - - reject(); - }); - },() => { - reject(); - }); - - + this.file.resolveDirectoryUrl(this.getFileDirectory()).then( + (_rootDir: DirectoryEntry) => { + this.createFolderInternal( + _rootDir, + folders, + () => { + resolve(undefined); + }, + () => { + reject(); + } + ); + }, + () => { + reject(); + } + ); }); return promise; - }; - - private createFolderInternal(_rootDirEntry: DirectoryEntry, _folders, _resolve, _reject) { - - + } + private createFolderInternal( + _rootDirEntry: DirectoryEntry, + _folders, + _resolve, + _reject + ) { // Throw out './' or '/' and move on to prevent something like '/foo/.//bar'. if (_folders[0] === '.' || _folders[0] === '') { _folders = _folders.slice(1); } - if (_folders === undefined || _folders.length === 0 || _folders[0].indexOf('.') >=0) { + if ( + _folders === undefined || + _folders.length === 0 || + _folders[0].indexOf('.') >= 0 + ) { // _folders[0].indexOf('.') -> Means we got a file with a extension. _resolve(undefined); + } else { + this.file + .getDirectory(_rootDirEntry, _folders[0], { + create: true, + exclusive: false, + }) + .then( + (dirEntry) => { + // Recursively add the new subfolder (if we still have another to create). + + if (_folders.length) { + this.createFolderInternal( + dirEntry, + _folders.slice(1), + _resolve, + _reject + ); + } else { + // All folders were created + _resolve(undefined); + } + }, + () => { + _reject(); + } + ); } - else { - - - this.file.getDirectory(_rootDirEntry, _folders[0], {create: true, exclusive: false}).then((dirEntry) => { - // Recursively add the new subfolder (if we still have another to create). - - if (_folders.length) { - this.createFolderInternal(dirEntry, _folders.slice(1), _resolve, _reject); - } - else { - // All folders were created - _resolve(undefined); - } - - }, () => { - _reject(); - }); - } - - - }; - + } public async deleteFile(_filePath): Promise { return new Promise(async (resolve, reject) => { @@ -379,107 +458,142 @@ export class UIFileHelper extends InstanceClass { fileObj.FILE_PATH = fileObj.FILE_PATH.substr(1); } if (fileObj.FILE_PATH.endsWith('/')) { - fileObj.FILE_PATH = fileObj.FILE_PATH.substr(0,fileObj.FILE_PATH.length-1); + fileObj.FILE_PATH = fileObj.FILE_PATH.substr( + 0, + fileObj.FILE_PATH.length - 1 + ); } if (fileObj.FILE_PATH.length > 0) { filePath = filePath + fileObj.FILE_PATH; } - this.file.removeFile(filePath, fileObj.FILE_NAME + fileObj.EXTENSION).then(() => { - this.uiLog.log('Deleted file: ' + _filePath); - resolve(undefined); - - }, (e) => { - this.uiLog.error('Cant delete file: ' + JSON.stringify(e)); - reject(); - }); + this.file + .removeFile(filePath, fileObj.FILE_NAME + fileObj.EXTENSION) + .then( + () => { + this.uiLog.log('Deleted file: ' + _filePath); + resolve(undefined); + }, + (e) => { + this.uiLog.error('Cant delete file: ' + JSON.stringify(e)); + reject(); + } + ); } else { resolve(undefined); } - }); } - public moveFile(_oldPath, _newPath,_oldFilename,_newFilename): Promise { + public moveFile( + _oldPath, + _newPath, + _oldFilename, + _newFilename + ): Promise { return new Promise(async (resolve, reject) => { - this.file.moveFile(_oldPath, _oldFilename, _newPath, _newFilename).then((_entry) => { - - resolve(_entry.fullPath); - }, () => { - reject(); - }); + this.file.moveFile(_oldPath, _oldFilename, _newPath, _newFilename).then( + (_entry) => { + resolve(_entry.fullPath); + }, + () => { + reject(); + } + ); }); } - public async copyFileWithSpecificName(_filePath: string, _fileName: string = 'beanconqueror_image'): Promise { - - + public async copyFileWithSpecificName( + _filePath: string, + _fileName: string = 'beanconqueror_image' + ): Promise { return new Promise(async (resolve, reject) => { if (this.platform.is('cordova')) { - - - const fileObj = this.__splitFilePath(_filePath); - this.generateFileName(this.getFileDirectory(), _fileName, fileObj.EXTENSION).then(async (_newName) => { - // console.log('New Filename' + _newName); - - this.file.copyFile(fileObj.FILE_PATH, fileObj.FILE_NAME + fileObj.EXTENSION, - this.getFileDirectory(), _newName).then(async (_t) => { - resolve(_t.fullPath); - }, (e) => { - reject(); + const fileObj = this.__splitFilePath(_filePath); + this.generateFileName( + this.getFileDirectory(), + _fileName, + fileObj.EXTENSION + ).then(async (_newName) => { + // console.log('New Filename' + _newName); + + this.file + .copyFile( + fileObj.FILE_PATH, + fileObj.FILE_NAME + fileObj.EXTENSION, + this.getFileDirectory(), + _newName + ) + .then( + async (_t) => { + resolve(_t.fullPath); + }, + (e) => { + reject(); + } + ); }); - - }); - } - else { + } else { reject(); } }); } public async copyFile(_filePath: string): Promise { - - return new Promise(async (resolve, reject) => { if (this.platform.is('cordova')) { - - - const fileObj = this.__splitFilePath(_filePath); - this.generateFileName(this.getFileDirectory(), fileObj.FILE_NAME, fileObj.EXTENSION).then((_newName) => { - // console.log('New Filename' + _newName); - - this.file.copyFile(this.getFileDirectory(), fileObj.FILE_NAME + fileObj.EXTENSION, - this.getFileDirectory(), _newName).then((_t) => { - resolve(_t.fullPath); - }, (e) => { - reject(); + const fileObj = this.__splitFilePath(_filePath); + this.generateFileName( + this.getFileDirectory(), + fileObj.FILE_NAME, + fileObj.EXTENSION + ).then((_newName) => { + // console.log('New Filename' + _newName); + + this.file + .copyFile( + this.getFileDirectory(), + fileObj.FILE_NAME + fileObj.EXTENSION, + this.getFileDirectory(), + _newName + ) + .then( + (_t) => { + resolve(_t.fullPath); + }, + (e) => { + reject(); + } + ); }); - - }); } else { reject(); } }); } - private __splitFilePath(_filePath: string): { FILE_NAME: string; FILE_PATH: string; EXTENSION: string; } { + private __splitFilePath(_filePath: string): { + FILE_NAME: string; + FILE_PATH: string; + EXTENSION: string; + } { // TODO If we have folders, this won't work. because we're ignoring foldesrs i all subfunctions try { - - let filePath: string = _filePath.substr(0, _filePath.lastIndexOf('/')); if (filePath === '') { filePath = '/'; } - const fileName: string = _filePath.substr(_filePath.lastIndexOf('/') + 1, _filePath.lastIndexOf('.') - _filePath.lastIndexOf('/') - 1); + const fileName: string = _filePath.substr( + _filePath.lastIndexOf('/') + 1, + _filePath.lastIndexOf('.') - _filePath.lastIndexOf('/') - 1 + ); const exstension: string = _filePath.substr(_filePath.lastIndexOf('.')); - return { FILE_NAME: fileName, FILE_PATH: filePath, - EXTENSION: exstension + EXTENSION: exstension, }; } catch (ex) { return { @@ -488,14 +602,16 @@ export class UIFileHelper extends InstanceClass { EXTENSION: '', }; } - } - public async getInternalFileSrc (_filePath: string,_addTimeStamp: boolean = false): Promise { + public async getInternalFileSrc( + _filePath: string, + _addTimeStamp: boolean = false + ): Promise { return new Promise(async (resolve, reject) => { if (this.platform.is('cordova')) { if (this.cachedInternalUrls[_filePath]) { //resolve(this.cachedInternalUrls[_filePath]); - // return; + // return; } // let filePath: string; // filePath = _filePath; @@ -512,39 +628,43 @@ export class UIFileHelper extends InstanceClass { // After switching to iOS cloud, the fullPath saves the Cloud path actualy with, so we need to delete this one :) const searchForCloud: string = 'Cloud/'; if (fileName.startsWith(searchForCloud)) { - fileName = fileName.substring(searchForCloud.length); + fileName = fileName.substring(searchForCloud.length); } } - this.file.resolveLocalFilesystemUrl(path + fileName).then((fileEntry: FileEntry) => { - - - fileEntry.file( - (meta) => { - let convertedURL = window.Ionic.WebView.convertFileSrc(fileEntry.nativeURL); - if (_addTimeStamp) { - convertedURL +='?' + moment().unix(); + this.file.resolveLocalFilesystemUrl(path + fileName).then( + (fileEntry: FileEntry) => { + fileEntry.file( + (meta) => { + let convertedURL = window.Ionic.WebView.convertFileSrc( + fileEntry.nativeURL + ); + if (_addTimeStamp) { + convertedURL += '?' + moment().unix(); + } + convertedURL = + this.domSanitizer.bypassSecurityTrustResourceUrl( + convertedURL + ); + this.cachedInternalUrls[_filePath] = convertedURL; + resolve(convertedURL); + }, + () => { + resolve(''); } - convertedURL = this.domSanitizer.bypassSecurityTrustResourceUrl(convertedURL); - this.cachedInternalUrls[_filePath] = convertedURL; - resolve(convertedURL); - }, () => { - resolve(''); - } - ); - - },() => { - resolve(''); - }); - + ); + }, + () => { + resolve(''); + } + ); } else { resolve(''); } - }); } - public async getBase64File (_filePath: string): Promise { + public async getBase64File(_filePath: string): Promise { return new Promise(async (resolve, reject) => { if (this.platform.is('cordova')) { if (this.cachedBase64[_filePath]) { @@ -569,11 +689,14 @@ export class UIFileHelper extends InstanceClass { } else { resolve(''); } - }); } - private async generateFileName (_path: string, _fileName: string, _fileExtension: string): Promise { + private async generateFileName( + _path: string, + _fileName: string, + _fileExtension: string + ): Promise { return new Promise(async (resolve, reject) => { let counter: number = 1; let doesExist: boolean = false; @@ -588,6 +711,7 @@ export class UIFileHelper extends InstanceClass { if (!doesExist) { resolve(fileName); + doesExist = false; } else { fileName = `${passedFilename}${counter}${passedExtension}`; counter++; @@ -595,12 +719,13 @@ export class UIFileHelper extends InstanceClass { } } catch (ex) { resolve(fileName); + doesExist = false; } } while (doesExist); }); } - private dataURItoBlob (dataURI: any): any { + private dataURItoBlob(dataURI: any): any { try { // convert base64/URLEncoded data component to raw binary data held in a string let byteString; @@ -614,12 +739,14 @@ export class UIFileHelper extends InstanceClass { // separate out the mime component const mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // write the bytes of the string to a typed array - const ia = new Uint8Array(byteString.length); + let ia = new Uint8Array(byteString.length); for (let i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } - return new Blob([ia], {type: mimeString}); + const newBlob = new Blob([ia], { type: mimeString }); + ia = null; + return newBlob; } catch (ex) { return undefined; } diff --git a/src/services/uiUpdate.ts b/src/services/uiUpdate.ts index 9d91e3382..d28b6bf57 100755 --- a/src/services/uiUpdate.ts +++ b/src/services/uiUpdate.ts @@ -1,61 +1,63 @@ /** Core */ -import {Injectable} from '@angular/core'; -import {Mill} from '../classes/mill/mill'; -import {Brew} from '../classes/brew/brew'; -import {Bean} from '../classes/bean/bean'; -import {Preparation} from '../classes/preparation/preparation'; -import {PREPARATION_STYLE_TYPE} from '../enums/preparations/preparationStyleTypes'; -import {Settings} from '../classes/settings/settings'; -import {UIBrewStorage} from './uiBrewStorage'; -import {UIMillStorage} from './uiMillStorage'; -import {UIBeanStorage} from './uiBeanStorage'; -import {UIPreparationStorage} from './uiPreparationStorage'; -import {UISettingsStorage} from './uiSettingsStorage'; -import {UILog} from './uiLog'; -import {UiVersionStorage} from './uiVersionStorage'; -import {Version} from '../classes/version/iVersion'; -import {AppVersion} from '@ionic-native/app-version/ngx'; -import {ModalController, Platform} from '@ionic/angular'; -import {UpdatePopoverComponent} from '../popover/update-popover/update-popover.component'; -import {IBeanInformation} from '../interfaces/bean/iBeanInformation'; -import {UIFileHelper} from './uiFileHelper'; -import {File} from '@ionic-native/file/ngx'; -import {UIAlert} from './uiAlert'; -import {TranslateService} from '@ngx-translate/core'; -import {UIStorage} from './uiStorage'; +import { Injectable } from '@angular/core'; +import { Mill } from '../classes/mill/mill'; +import { Brew } from '../classes/brew/brew'; +import { Bean } from '../classes/bean/bean'; +import { Preparation } from '../classes/preparation/preparation'; +import { PREPARATION_STYLE_TYPE } from '../enums/preparations/preparationStyleTypes'; +import { Settings } from '../classes/settings/settings'; +import { UIBrewStorage } from './uiBrewStorage'; +import { UIMillStorage } from './uiMillStorage'; +import { UIBeanStorage } from './uiBeanStorage'; +import { UIPreparationStorage } from './uiPreparationStorage'; +import { UISettingsStorage } from './uiSettingsStorage'; +import { UILog } from './uiLog'; +import { UiVersionStorage } from './uiVersionStorage'; +import { Version } from '../classes/version/iVersion'; +import { AppVersion } from '@ionic-native/app-version/ngx'; +import { ModalController, Platform } from '@ionic/angular'; +import { UpdatePopoverComponent } from '../popover/update-popover/update-popover.component'; +import { IBeanInformation } from '../interfaces/bean/iBeanInformation'; +import { UIFileHelper } from './uiFileHelper'; +import { File } from '@ionic-native/file/ngx'; +import { UIAlert } from './uiAlert'; +import { TranslateService } from '@ngx-translate/core'; +import { UIStorage } from './uiStorage'; import { maxBy, keys } from 'lodash'; -import {UIHelper} from './uiHelper'; +import { UIHelper } from './uiHelper'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class UIUpdate { - - constructor(private readonly uiBrewStorage: UIBrewStorage, - private readonly uiMillStorage: UIMillStorage, - private readonly uiBeanStorage: UIBeanStorage, - private readonly uiPreparationStorage: UIPreparationStorage, - private readonly uiSettingsStorage: UISettingsStorage, - private readonly uiLog: UILog, - private readonly uiVersionStorage: UiVersionStorage, - private readonly appVersion: AppVersion, - private readonly platform: Platform, - private readonly modalCtrl: ModalController, - private readonly uiFileHelper: UIFileHelper, - private readonly file: File, - private readonly uiAlert: UIAlert, - private readonly translate: TranslateService, - private readonly uiStorage: UIStorage, - private readonly uiHelper: UIHelper) { - } + constructor( + private readonly uiBrewStorage: UIBrewStorage, + private readonly uiMillStorage: UIMillStorage, + private readonly uiBeanStorage: UIBeanStorage, + private readonly uiPreparationStorage: UIPreparationStorage, + private readonly uiSettingsStorage: UISettingsStorage, + private readonly uiLog: UILog, + private readonly uiVersionStorage: UiVersionStorage, + private readonly appVersion: AppVersion, + private readonly platform: Platform, + private readonly modalCtrl: ModalController, + private readonly uiFileHelper: UIFileHelper, + private readonly file: File, + private readonly uiAlert: UIAlert, + private readonly translate: TranslateService, + private readonly uiStorage: UIStorage, + private readonly uiHelper: UIHelper + ) {} private async __updateDataVersion(_version): Promise { const promise: Promise = new Promise(async (resolve, reject) => { try { switch (_version) { case 'UPDATE_1': - - if (this.uiBrewStorage.getAllEntries().length > 0 && this.uiMillStorage.getAllEntries().length <= 0) { + if ( + this.uiBrewStorage.getAllEntries().length > 0 && + this.uiMillStorage.getAllEntries().length <= 0 + ) { // We got an update and we got no mills yet, therefore we add a Standard mill. const data: Mill = new Mill(); data.name = 'Standard'; @@ -72,16 +74,29 @@ export class UIUpdate { const beans: Array = this.uiBeanStorage.getAllEntries(); let needsUpdate: boolean = false; for (const bean of beans) { - if (bean.filePath !== undefined && bean.filePath !== null && bean.filePath !== '') { + if ( + bean.filePath !== undefined && + bean.filePath !== null && + bean.filePath !== '' + ) { bean.attachments.push(bean.filePath); delete bean.filePath; needsUpdate = true; - } else if (bean.filePath !== undefined && bean.filePath !== null && bean.filePath === '') { + } else if ( + bean.filePath !== undefined && + bean.filePath !== null && + bean.filePath === '' + ) { delete bean.filePath; needsUpdate = true; } - const beanInformation: IBeanInformation = {} as IBeanInformation; - if ((bean.variety || bean.country || bean.processing && bean.bean_information.length <= 0)) { + const beanInformation: IBeanInformation = + {} as IBeanInformation; + if ( + bean.variety || + bean.country || + (bean.processing && bean.bean_information.length <= 0) + ) { beanInformation.country = bean.country; beanInformation.variety = bean.variety; beanInformation.processing = bean.processing; @@ -89,7 +104,11 @@ export class UIUpdate { bean.bean_information.push(beanInformation); needsUpdate = true; } - if ('variety' in bean || 'country' in bean || 'processing' in bean) { + if ( + 'variety' in bean || + 'country' in bean || + 'processing' in bean + ) { delete bean.country; delete bean.variety; delete bean.processing; @@ -107,7 +126,8 @@ export class UIUpdate { } if (this.uiPreparationStorage.getAllEntries().length > 0) { - const preparations: Array = this.uiPreparationStorage.getAllEntries(); + const preparations: Array = + this.uiPreparationStorage.getAllEntries(); let needsUpdate: boolean = false; for (const preparation of preparations) { if (preparation.style_type === undefined) { @@ -115,16 +135,24 @@ export class UIUpdate { needsUpdate = true; } if (needsUpdate) { - const preparationBrews: Array = this.uiBrewStorage.getAllEntries() - .filter((e) => e.method_of_preparation === preparation.config.uuid); - if (preparation.style_type === PREPARATION_STYLE_TYPE.ESPRESSO) { + const preparationBrews: Array = this.uiBrewStorage + .getAllEntries() + .filter( + (e) => e.method_of_preparation === preparation.config.uuid + ); + if ( + preparation.style_type === PREPARATION_STYLE_TYPE.ESPRESSO + ) { for (const brew of preparationBrews) { - if (brew.brew_beverage_quantity === 0 && brew.brew_quantity > 0) { + if ( + brew.brew_beverage_quantity === 0 && + brew.brew_quantity > 0 + ) { brew.brew_beverage_quantity = brew.brew_quantity; - brew.brew_beverage_quantity_type = brew.brew_quantity_type; + brew.brew_beverage_quantity_type = + brew.brew_quantity_type; await this.uiBrewStorage.update(brew); } - } } await this.uiPreparationStorage.update(preparation); @@ -138,70 +166,96 @@ export class UIUpdate { if (brew.fixDataTypes()) { await this.uiBrewStorage.update(brew); } - } } const settings: any = this.uiSettingsStorage.getSettings(); - if (settings.brew_order.after.tds === null || settings.brew_order.after.tds === undefined) { + if ( + settings.brew_order.after.tds === null || + settings.brew_order.after.tds === undefined + ) { const settingsAfter = settings.brew_order.after; - const maxKey = maxBy(keys(settingsAfter), (o) => settingsAfter[o]); + const maxKey = maxBy( + keys(settingsAfter), + (o) => settingsAfter[o] + ); const highestNumber = settingsAfter[maxKey]; - settings.brew_order.after.tds = highestNumber +1; + settings.brew_order.after.tds = highestNumber + 1; await this.uiSettingsStorage.saveSettings(settings); - } - if (settings.brew_order.after.brew_beverage_quantity === null || - settings.brew_order.after.brew_beverage_quantity === undefined) { + if ( + settings.brew_order.after.brew_beverage_quantity === null || + settings.brew_order.after.brew_beverage_quantity === undefined + ) { const settingsAfter = settings.brew_order.after; - const maxKey = maxBy(keys(settingsAfter), (o) => settingsAfter[o]); + const maxKey = maxBy( + keys(settingsAfter), + (o) => settingsAfter[o] + ); const highestNumber = settingsAfter[maxKey]; - settings.brew_order.after.brew_beverage_quantity = highestNumber+1; + settings.brew_order.after.brew_beverage_quantity = + highestNumber + 1; await this.uiSettingsStorage.saveSettings(settings); } - if (settings.brew_order.before.method_of_preparation_tool === null || - settings.brew_order.before.method_of_preparation_tool === undefined) { + if ( + settings.brew_order.before.method_of_preparation_tool === null || + settings.brew_order.before.method_of_preparation_tool === + undefined + ) { const settingsBefore = settings.brew_order.before; - const maxKey = maxBy(keys(settingsBefore), (o) => settingsBefore[o]); + const maxKey = maxBy( + keys(settingsBefore), + (o) => settingsBefore[o] + ); const highestNumber = settingsBefore[maxKey]; - settings.brew_order.before.method_of_preparation_tool = highestNumber+1; + settings.brew_order.before.method_of_preparation_tool = + highestNumber + 1; settings.manage_parameters.brew_time = settings.brew_time; - settings.manage_parameters.brew_temperature_time = settings.brew_temperature_time; + settings.manage_parameters.brew_temperature_time = + settings.brew_temperature_time; settings.manage_parameters.grind_size = settings.grind_size; settings.manage_parameters.grind_weight = settings.grind_weight; settings.manage_parameters.mill = settings.mill; settings.manage_parameters.mill_speed = settings.mill_speed; settings.manage_parameters.mill_timer = settings.mill_timer; - settings.manage_parameters.pressure_profile = settings.pressure_profile; + settings.manage_parameters.pressure_profile = + settings.pressure_profile; // This will be fixed value settings.manage_parameters.method_of_preparation = true; settings.manage_parameters.bean_type = true; settings.manage_parameters.mill = true; settings.manage_parameters.brew_quantity = settings.brew_quantity; - settings.manage_parameters.brew_temperature = settings.brew_temperature; + settings.manage_parameters.brew_temperature = + settings.brew_temperature; settings.manage_parameters.note = settings.note; settings.manage_parameters.attachments = settings.attachments; settings.manage_parameters.rating = settings.rating; settings.manage_parameters.coffee_type = settings.coffee_type; - settings.manage_parameters.coffee_concentration = settings.coffee_concentration; - settings.manage_parameters.coffee_first_drip_time = settings.coffee_first_drip_time; - settings.manage_parameters.coffee_blooming_time = settings.coffee_blooming_time; - settings.manage_parameters.set_last_coffee_brew = settings.set_last_coffee_brew; - settings.manage_parameters.set_custom_brew_time = settings.set_custom_brew_time; + settings.manage_parameters.coffee_concentration = + settings.coffee_concentration; + settings.manage_parameters.coffee_first_drip_time = + settings.coffee_first_drip_time; + settings.manage_parameters.coffee_blooming_time = + settings.coffee_blooming_time; + settings.manage_parameters.set_last_coffee_brew = + settings.set_last_coffee_brew; + settings.manage_parameters.set_custom_brew_time = + settings.set_custom_brew_time; settings.manage_parameters.tds = settings.tds; - settings.manage_parameters.brew_beverage_quantity = settings.brew_beverage_quantity; + settings.manage_parameters.brew_beverage_quantity = + settings.brew_beverage_quantity; // This will be fixed value - settings.default_last_coffee_parameters.method_of_preparation = true; + settings.default_last_coffee_parameters.method_of_preparation = + true; // With this property there also came the change that we moved all parameters to manage_parameters await this.uiSettingsStorage.saveSettings(settings); } - delete settings.brew_time; delete settings.brew_temperature_time; delete settings.grind_size; @@ -226,7 +280,6 @@ export class UIUpdate { await this.uiSettingsStorage.saveSettings(settings); - break; case 'UPDATE_2': const settings_v2: Settings = this.uiSettingsStorage.getSettings(); @@ -243,19 +296,24 @@ export class UIUpdate { case 'UPDATE_4': if (this.platform.is('cordova') && this.platform.is('ios')) { // Greenbean and roasting machines just existing in this updated version then. - const allEntries: Array = - [...this.uiBrewStorage.getAllEntries(), - ...this.uiMillStorage.getAllEntries(), - ...this.uiPreparationStorage.getAllEntries(), - ...this.uiBeanStorage.getAllEntries()]; + const allEntries: Array = [ + ...this.uiBrewStorage.getAllEntries(), + ...this.uiMillStorage.getAllEntries(), + ...this.uiPreparationStorage.getAllEntries(), + ...this.uiBeanStorage.getAllEntries(), + ]; if (allEntries.length > 0) { - this.uiLog.log(`${_version} - Check ${allEntries.length} entries`); + this.uiLog.log( + `${_version} - Check ${allEntries.length} entries` + ); let entryIndex: number = -1; for (const entry of allEntries) { - entryIndex ++; + entryIndex++; try { - this.uiLog.log(`${_version} - Check entry ${entryIndex} of ${allEntries.length}`); + this.uiLog.log( + `${_version} - Check entry ${entryIndex} of ${allEntries.length}` + ); let entryNeedsUpdate: boolean = false; // tslint:disable-next-line for (let i = 0; i < entry.attachments.length; i++) { @@ -266,25 +324,42 @@ export class UIUpdate { // Remove the first slash oldPath = oldPath.substr(1); } - this.uiLog.log(`${_version} - Move file from ${this.file.dataDirectory} to ${this.file.syncedDataDirectory}; Name: ${oldPath}`); - const newPath: string = await this.uiFileHelper.moveFile(this.file.dataDirectory, this.file.documentsDirectory, oldPath, oldPath); - - this.uiLog.log(`${_version} Update path from ${oldPath} to ${newPath}`); + this.uiLog.log( + `${_version} - Move file from ${this.file.dataDirectory} to ${this.file.syncedDataDirectory}; Name: ${oldPath}` + ); + const newPath: string = await this.uiFileHelper.moveFile( + this.file.dataDirectory, + this.file.documentsDirectory, + oldPath, + oldPath + ); + + this.uiLog.log( + `${_version} Update path from ${oldPath} to ${newPath}` + ); entry.attachments[i] = newPath; entryNeedsUpdate = true; } if (entryNeedsUpdate) { - this.uiLog.log(`${_version} - Update entry ${entryIndex} of ${allEntries.length}`); - - this.uiAlert.setLoadingSpinnerMessage( this.translate.instant('UPDATE_ENTRY_OF',{ - index: entryIndex, count: allEntries.length - })); - - let storageToUpdate: UIBrewStorage | UIBeanStorage | UIPreparationStorage | UIMillStorage; + this.uiLog.log( + `${_version} - Update entry ${entryIndex} of ${allEntries.length}` + ); + + this.uiAlert.setLoadingSpinnerMessage( + this.translate.instant('UPDATE_ENTRY_OF', { + index: entryIndex, + count: allEntries.length, + }) + ); + + let storageToUpdate: + | UIBrewStorage + | UIBeanStorage + | UIPreparationStorage + | UIMillStorage; if (entry instanceof Brew) { storageToUpdate = this.uiBrewStorage; - } else if (entry instanceof Mill) { storageToUpdate = this.uiMillStorage; } else if (entry instanceof Preparation) { @@ -295,42 +370,49 @@ export class UIUpdate { await storageToUpdate.update(entry); } } catch (ex) { - this.uiLog.log(`${_version} - Update exception ${ex.message}`); + this.uiLog.log( + `${_version} - Update exception ${ex.message}` + ); } - } } } break; case 'UPDATE_5': - const settings_v5: any = this.uiSettingsStorage.getSettings(); - if (settings_v5.brew_order.before.water === null || settings_v5.brew_order.before.water === undefined) { - - + if ( + settings_v5.brew_order.before.water === null || + settings_v5.brew_order.before.water === undefined + ) { const settings_v5Before = settings_v5.brew_order.before; - const maxKey = maxBy(keys(settings_v5Before), (o) => settings_v5Before[o]); + const maxKey = maxBy( + keys(settings_v5Before), + (o) => settings_v5Before[o] + ); const highestNumber = settings_v5Before[maxKey]; - settings_v5.brew_order.before.water = highestNumber +1; - settings_v5.brew_order.before.bean_weight_in = highestNumber +2; - settings_v5.brew_order.before.vessel = highestNumber +3; + settings_v5.brew_order.before.water = highestNumber + 1; + settings_v5.brew_order.before.bean_weight_in = highestNumber + 2; + settings_v5.brew_order.before.vessel = highestNumber + 3; await this.uiSettingsStorage.saveSettings(settings_v5); - const preparations_v5: any = this.uiPreparationStorage.getAllEntries(); - for(const prep of preparations_v5) { - prep.brew_order.before.water = highestNumber +1; - prep.brew_order.before.bean_weight_in = highestNumber +2; - prep.brew_order.before.vessel = highestNumber +3; + const preparations_v5: any = + this.uiPreparationStorage.getAllEntries(); + for (const prep of preparations_v5) { + prep.brew_order.before.water = highestNumber + 1; + prep.brew_order.before.bean_weight_in = highestNumber + 2; + prep.brew_order.before.vessel = highestNumber + 3; await this.uiPreparationStorage.update(prep); } } break; case 'UPDATE_6': const beans_v6: any = this.uiBeanStorage.getAllEntries(); - for(const bean of beans_v6) { + for (const bean of beans_v6) { // We have issues with references, so we deep copy to remove them - bean.bean_information = this.uiHelper.cloneData(bean.bean_information); + bean.bean_information = this.uiHelper.cloneData( + bean.bean_information + ); await this.uiBeanStorage.update(bean); } @@ -343,15 +425,24 @@ export class UIUpdate { settings_v6.resetFilter(); await this.uiSettingsStorage.saveSettings(settings_v6); - const preparations_v6: Array = this.uiPreparationStorage.getAllEntries(); + const preparations_v6: Array = + this.uiPreparationStorage.getAllEntries(); for (const prep_v6 of preparations_v6) { - for (const tool of prep_v6.tools) - { + for (const tool of prep_v6.tools) { tool.archived = false; } await this.uiPreparationStorage.update(prep_v6); } + break; + case 'UPDATE_7': + const settings_v7: any = this.uiSettingsStorage.getSettings(); + // Convert to number, after we've missed out + settings_v7.brew_rating_steps = Number( + settings_v7.brew_rating_steps + ); + await this.uiSettingsStorage.saveSettings(settings_v7); + break; default: break; @@ -363,16 +454,17 @@ export class UIUpdate { } }); return promise; - } - private async __checkUpdateForDataVersion(_dataVersion: string, _silentUpdate: boolean) { + private async __checkUpdateForDataVersion( + _dataVersion: string, + _silentUpdate: boolean + ) { const version: Version = this.uiVersionStorage.getVersion(); let somethingUpdated: boolean = false; this.uiLog.info('Check updates'); - if (version.checkIfDataVersionWasUpdated(_dataVersion) === false) { if (!_silentUpdate) { await this.uiAlert.showLoadingSpinner(); @@ -385,40 +477,39 @@ export class UIUpdate { version.pushUpdatedDataVersion(_dataVersion); somethingUpdated = true; } else { - this.uiLog.info('Data version ' + _dataVersion + ' - could not update'); + this.uiLog.info( + 'Data version ' + _dataVersion + ' - could not update' + ); } if (!_silentUpdate) { await this.uiAlert.hideLoadingSpinner(); } + } catch (ex) { + this.uiLog.error( + 'Data version ' + _dataVersion + ' - could not update ' + ex.message + ); } - catch(ex) { - this.uiLog.error('Data version ' + _dataVersion + ' - could not update ' + ex.message); - } - - } else { this.uiLog.info('Data version ' + _dataVersion + ' - No Update'); } if (somethingUpdated) { - await this.uiVersionStorage.saveVersion(version); + await this.uiVersionStorage.saveVersion(version); } } public async checkUpdate() { - this.uiLog.info('Check updates'); const hasData: boolean = await this.uiStorage.hasData(); - await this.__checkUpdateForDataVersion('UPDATE_1',!hasData); - await this.__checkUpdateForDataVersion('UPDATE_2',!hasData); - await this.__checkUpdateForDataVersion('UPDATE_3',!hasData); - await this.__checkUpdateForDataVersion('UPDATE_4',!hasData); - await this.__checkUpdateForDataVersion('UPDATE_5',!hasData); - await this.__checkUpdateForDataVersion('UPDATE_6',!hasData); - + await this.__checkUpdateForDataVersion('UPDATE_1', !hasData); + await this.__checkUpdateForDataVersion('UPDATE_2', !hasData); + await this.__checkUpdateForDataVersion('UPDATE_3', !hasData); + await this.__checkUpdateForDataVersion('UPDATE_4', !hasData); + await this.__checkUpdateForDataVersion('UPDATE_5', !hasData); + await this.__checkUpdateForDataVersion('UPDATE_6', !hasData); + await this.__checkUpdateForDataVersion('UPDATE_7', !hasData); } - public async checkUpdateScreen(): Promise { const promise = new Promise(async (resolve, reject) => { let versionCode: string; @@ -429,10 +520,10 @@ export class UIUpdate { versionCode = '6.0.0'; } const version: Version = this.uiVersionStorage.getVersion(); - const displayingVersions = version.whichUpdateScreensShallBeDisplayed(versionCode); + const displayingVersions = + version.whichUpdateScreensShallBeDisplayed(versionCode); if (displayingVersions.length > 0) { - await this.__showUpdateScreen(displayingVersions); for (const v of displayingVersions) { @@ -442,19 +533,20 @@ export class UIUpdate { } resolve(undefined); - }); return promise; } private async __showUpdateScreen(showingVersions: Array) { - - const modal = await this.modalCtrl.create({component: UpdatePopoverComponent, id:'update-popover', showBackdrop: true, - backdropDismiss: true, - swipeToClose: true, - componentProps: {versions: showingVersions}}); - await modal.present(); - await modal.onWillDismiss(); + const modal = await this.modalCtrl.create({ + component: UpdatePopoverComponent, + id: 'update-popover', + showBackdrop: true, + backdropDismiss: true, + swipeToClose: true, + componentProps: { versions: showingVersions }, + }); + await modal.present(); + await modal.onWillDismiss(); } - } From fd3e0a558e9ee2bf02ea3341127899ef93b86037 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 23 Oct 2022 15:54:43 +0200 Subject: [PATCH 69/78] Fix that you can download pressure raw data without scale, update ionic angular --- package-lock.json | 30 +++++++++---------- package.json | 2 +- .../brew-brewing/brew-brewing.component.html | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 55f2431ae..49600795d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "@ionic-native/splash-screen": "^5.33.1", "@ionic-native/status-bar": "^5.33.1", "@ionic-native/three-dee-touch": "^5.33.1", - "@ionic/angular": "^6.3.1", + "@ionic/angular": "^6.3.2", "@ionic/cli": "^6.18.1", "@ionic/storage": "^2.3.1", "@ngx-translate/core": "^11.0.1", @@ -4349,11 +4349,11 @@ } }, "node_modules/@ionic/angular": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.3.1.tgz", - "integrity": "sha512-hT97StH54ZhefdXDSkEAdBc8ssWBf9W8PrEXEUiYtBpp6AbTu/EL5AjHFIIWyyBXPic0sh5+KeJSu86Xxz5yMA==", + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.3.2.tgz", + "integrity": "sha512-DbG5PKuk/i+7XweWqrpre+2NbkNZoa1AhEJQjeVgwYqKBXvkR4ZlQXPxHif9AAta093Xjt2uKgU2/0R8kh6lyQ==", "dependencies": { - "@ionic/core": "^6.3.1", + "@ionic/core": "^6.3.2", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" }, @@ -7744,9 +7744,9 @@ } }, "node_modules/@ionic/core": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.1.tgz", - "integrity": "sha512-OpmGQQ/sGtoXW4PQRvRjYa9mTlAmAWwFMu8g/1rcdAPaTQQAlRnfZ62wYYqmChLSFlVbn6mCleeljzR9FaYrAg==", + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.2.tgz", + "integrity": "sha512-L4xqJyixmGApwYc5fQgGoK80wXGCrbjL8vGfeNbjYqxxP0ZIKGAhURPoMAtSTqLLK9gdhh4Mv6gw4gNKvxodPA==", "dependencies": { "@stencil/core": "^2.18.0", "ionicons": "^6.0.3", @@ -31803,11 +31803,11 @@ } }, "@ionic/angular": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.3.1.tgz", - "integrity": "sha512-hT97StH54ZhefdXDSkEAdBc8ssWBf9W8PrEXEUiYtBpp6AbTu/EL5AjHFIIWyyBXPic0sh5+KeJSu86Xxz5yMA==", + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.3.2.tgz", + "integrity": "sha512-DbG5PKuk/i+7XweWqrpre+2NbkNZoa1AhEJQjeVgwYqKBXvkR4ZlQXPxHif9AAta093Xjt2uKgU2/0R8kh6lyQ==", "requires": { - "@ionic/core": "^6.3.1", + "@ionic/core": "^6.3.2", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" } @@ -34275,9 +34275,9 @@ } }, "@ionic/core": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.1.tgz", - "integrity": "sha512-OpmGQQ/sGtoXW4PQRvRjYa9mTlAmAWwFMu8g/1rcdAPaTQQAlRnfZ62wYYqmChLSFlVbn6mCleeljzR9FaYrAg==", + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.2.tgz", + "integrity": "sha512-L4xqJyixmGApwYc5fQgGoK80wXGCrbjL8vGfeNbjYqxxP0ZIKGAhURPoMAtSTqLLK9gdhh4Mv6gw4gNKvxodPA==", "requires": { "@stencil/core": "^2.18.0", "ionicons": "^6.0.3", diff --git a/package.json b/package.json index 60ccf88c4..8016e4269 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "@ionic-native/splash-screen": "^5.33.1", "@ionic-native/status-bar": "^5.33.1", "@ionic-native/three-dee-touch": "^5.33.1", - "@ionic/angular": "^6.3.1", + "@ionic/angular": "^6.3.2", "@ionic/cli": "^6.18.1", "@ionic/storage": "^2.3.1", "@ngx-translate/core": "^11.0.1", diff --git a/src/components/brews/brew-brewing/brew-brewing.component.html b/src/components/brews/brew-brewing/brew-brewing.component.html index 4c5def014..b700a1507 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.html +++ b/src/components/brews/brew-brewing/brew-brewing.component.html @@ -254,7 +254,7 @@ {{"BREW_HEADER_WHILE_BREW" | translate }} - + From 015b793fd6f75a992b1dea88a4940bf15b0d7bdf Mon Sep 17 00:00:00 2001 From: Jglez3 Date: Sun, 23 Oct 2022 15:57:23 +0200 Subject: [PATCH 70/78] Update Spanish translation for 6.2 (#410) * Update Spanish translation * Update Spanish Co-authored-by: Lars Saalbach --- src/assets/i18n/es.json | 680 ++++++++++++++++++++-------------------- 1 file changed, 340 insertions(+), 340 deletions(-) diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index a63563dde..1f11a7177 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -4,63 +4,63 @@ "NAV_SETTINGS": "Configuración", "NAV_BREWS": "Preparaciones", "NAV_BEANS": "Granos", - "NAV_PREPARATION": "Metodos", + "NAV_PREPARATION": "Métodos", "NAV_MILL": "Molinos", "NAV_ABOUT_US": "Sobre nosotros", "NAV_CONTACT": "Contacto", "NAV_PRIVACY": "Política de privacidad", "NAV_CREDITS": "Créditos", - "NAV_TERMS": "Términos de usuario", - "NAV_THANKS": "Gracias!", + "NAV_TERMS": "Términos y condiciones", + "NAV_THANKS": "¡Gracias!", "NAV_LICENCES": "Licencias de código abierto", "NAV_STATISTICS": "Estadísticas", "NAV_IMPRESSUM": "Autoría", "NAV_COOKIE": "Cookie", "NAV_LOGS": "Registro", - "NAV_BREW_PARAMS": "Parámetros de praparación", - "NAV_INFORMATION_TO_APP": "Sobre la aplicación", + "NAV_BREW_PARAMS": "Parámetros de preparación", + "NAV_INFORMATION_TO_APP": "Acerca de la aplicación", "NAV_WATER_SECTION": "Agua", "NAV_HELPER": "Cálculos", "POPOVER_BREWS_OPTION_REPEAT": "Repetir", "POPOVER_BREWS_OPTION_DETAIL": "Detalles", "DETAIL": "Detalles", "POPOVER_BREWS_OPTION_EDIT": "Editar", - "POPOVER_BREWS_OPTION_DELETE": "Borrar", + "POPOVER_BREWS_OPTION_DELETE": "Eliminar", "POPOVER_BREWS_OPTION_PHOTO_GALLERY": "Galería", "POPOVER_BREWS_OPTION_CUPPING": "Catar", - "POPOVER_BREWS_OPTION_MAP_COORDINATES": "Tú posición", + "POPOVER_BREWS_OPTION_MAP_COORDINATES": "Tu posición", "POPOVER_BREWS_OPTION_FAST_REPEAT": "Repetir preparación", "PAGE_BREWS_NO_ENTRIES": "No has añadido ninguna preparación", "PAGE_BREWS_NO_ARCHIVED_ENTRIES": "No has guardado ninguna preparación", "CANT_START_NEW_BREW_TITLE": "Parece que falta información", - "CANT_START_NEW_BREW_DESCRIPTION": "Para iniciar una preparación primero tienes que añadir un grano, un molino y un metodo. En el manú busca las diferentes categorías para agregar la informacion requerida.", - "PAGE_HOME_WELCOME_GREETINGS": "Maravilloso que estes acá!", + "CANT_START_NEW_BREW_DESCRIPTION": "Para iniciar una preparación primero tienes que añadir un grano, un molino y un método. En el menú busca las diferentes categorías para agregar la información requerida.", + "PAGE_HOME_WELCOME_GREETINGS": "¡Maravilloso que estés acá!", "PAGE_HOME_TOTAL_BREW": "Preparación", "PAGE_HOME_TOTAL_BREWS": "Preparaciones", "PAGE_HOME_BEAN_EXPLORED": "Grano descubierto", "PAGE_HOME_BEANS_EXPLORED": "Granos descubiertos", - "PAGE_HOME_LAST_BREWS": "Últimas praparaciones", - "PAGE_HOME_LAST_BREW": "Última praparación", - "PAGE_HOME_DIFFERENT_PREPARATION_METHODS": "Diferentes metodos de praparación", + "PAGE_HOME_LAST_BREWS": "Últimas preparaciones", + "PAGE_HOME_LAST_BREW": "Última preparación", + "PAGE_HOME_DIFFERENT_PREPARATION_METHODS": "Diferentes métodos de preparación", "PAGE_HOME_DIFFERENT_MILLS": "Diferentes molinos", - "PAGE_HOME_SUPPORTER": "Contribuyen a la aplicacción", - "PAGE_HOME_START_BREW": "Inica la preparación", - "PAGE_BEANS_LIST_OBTAINABLE": "Disponible", + "PAGE_HOME_SUPPORTER": "Contribuyen a la aplicación", + "PAGE_HOME_START_BREW": "Inicia la preparación", + "PAGE_BEANS_LIST_OBTAINABLE": "Disponibles", "PAGE_BEANS_LIST_YOU_GOT_NO_FRESH_BEANS": "Lamentablemente ya no te quedan granos frescos.", - "PAGE_BEANS_LIST_YOU_GOT_NO_FINISHED_BEANS": "Todavia no has usado granos.", - "PAGE_MILL_LIST_NO_MILL_EXISTING": "Todavia no has agregado un molino.", - "PAGE_PREPARATION_LIST_NO_PREPARATION_EXISTING": "Todavia no has agregado metodos de preparación.", - "PAGE_CONTACT_SUGGESTIONS_QUESTIONS_WISHES": "Dudas, preguntas, deseos?", - "PAGE_THANKS_THANKS_FOR_YOUR_SUPPORT": "Gracias por tu apoyo!", + "PAGE_BEANS_LIST_YOU_GOT_NO_FINISHED_BEANS": "Todavía no has usado granos.", + "PAGE_MILL_LIST_NO_MILL_EXISTING": "Todavía no has agregado un molino.", + "PAGE_PREPARATION_LIST_NO_PREPARATION_EXISTING": "Todavía no has agregado métodos de preparación.", + "PAGE_CONTACT_SUGGESTIONS_QUESTIONS_WISHES": "¿Dudas, preguntas, sugerencias?", + "PAGE_THANKS_THANKS_FOR_YOUR_SUPPORT": "¡Gracias por tu apoyo!", "PAGE_SETTINGS_LANGUAGE": "Idiomas", - "PAGE_SETTINGS_LANGUAGE_GERMAN": "Deutsch", - "PAGE_SETTINGS_LANGUAGE_ENGLISH": "Englisch", + "PAGE_SETTINGS_LANGUAGE_GERMAN": "Alemán", + "PAGE_SETTINGS_LANGUAGE_ENGLISH": "Inglés", "PAGE_SETTINGS_LANGUAGE_SPANISH": "Español", "PAGE_SETTINGS_LANGUAGE_TURKISH": "Turco", "PAGE_SETTINGS_LANGUAGE_CHINESE": "Chino (simplificado)", "PAGE_SETTINGS_GENERAL_SETTINGS": "Configuraciones generales", "PAGE_SETTINGS_TRANSFER": "Transferencia de datos", - "PAGE_SETTINGS_PRESET_LAST_BREW": "¿Guardar ultima preparación como plantilla?", + "PAGE_SETTINGS_PRESET_LAST_BREW": "¿Guardar última preparación como plantilla?", "PAGE_SETTINGS_DISPLAY": "Vista", "PAGE_SETTINGS_DISPLAY_SINGLE_PAGE": "Una página", "PAGE_SETTINGS_DISPLAY_PAGING": "Paginación", @@ -75,22 +75,22 @@ "PAGE_STATISTICS_DIFFERENT_PREPARATION_METHOD": "Métodos de preparación", "PAGE_STATISTICS_TOTAL_GROUND_BEANS": "Grano molido", "PAGE_STATISTICS_MONEY_SPENT_FOR_COFFEE": "Dinero invertido en café", - "PAGE_STATISTICS_DRUNKEN_BREWS": "Tasas consumidas", + "PAGE_STATISTICS_DRUNKEN_BREWS": "Tazas consumidas", "PAGE_STATISTICS_BREW_PROCESSES": "Número de preparaciones", "PAGE_STATISTICS_DRUNKEN_QUANTITY": "Cantidad consumida", - "PAGE_STATISTICS_BEAN_WEIGHT_USED": "Total de granos molidos", + "PAGE_STATISTICS_BEAN_WEIGHT_USED": "Total de gramos molidos", "PAGE_BREW_TEXT_INFORMATION_FROM_ROASTER": "Información sobre la tostadora", "PAGE_ABOUT_NO_VERSION_AVAILABLE": "No hay versión disponible", "PAGE_ABOUT_APP_VERSION": "Versión", "PAGE_LICENCES_WEBSITE": "Página web", "BEAN_DATA_ROAST_NAME": "Tipo de tueste", "BEAN_DATA_CUSTOM_ROAST_NAME": "Tipo de tueste personalizado", - "BEAN_DATA_ROASTING_DATE": "Fecha del tueste", + "BEAN_DATA_ROASTING_DATE": "Fecha de tueste", "BEAN_DATA_ROASTER": "Tostado por", "BEAN_DATA_VARIETY": "Variedad", "BEAN_DATA_PROCESSING": "Proceso", - "BEAN_DATA_COUNTRY": "Origen", - "BEAN_DATA_MIX": "Blend(mezcla)", + "BEAN_DATA_COUNTRY": "País", + "BEAN_DATA_MIX": "Blend (mezcla)", "BEAN_DATA_AROMATICS": "Perfil de sabor", "BEAN_DATA_WEIGHT": "Peso", "BEAN_DATA_COST": "Precio", @@ -102,18 +102,18 @@ "BEAN_DATA_HARVEST_TIME": "Cosecha", "BEAN_DATA_PERCENTAGE": "Porcentaje", "BEAN_DATA_CERTIFICATION": "Certificaciones", - "BEAN_DATA_ROASTING_TYPE": "Tipo de tostado", + "BEAN_DATA_ROASTING_TYPE": "Tipo de tueste", "BEAN_DATA_DECAFFEINATED": "Descafeinado", "BEAN_DATA_URL": "Página web", "BEAN_DATA_EAN": "EAN / Código", - "BEAN_DATA_CUPPING_POINTS": "Puntaje en cata", + "BEAN_DATA_CUPPING_POINTS": "Puntuación en cata", "BEAN_DATA_PURCHASING_PRICE": "Precio de compra", "BEAN_DATA_FOB_PRICE": "Precio FOB", - "BREW_DATA_CUSTOM_BREW_TIME": "Hora (de la preparación)?", + "BREW_DATA_CUSTOM_BREW_TIME": "¿Hora (de la preparación)?", "BREW_CREATION_DATE": "Fecha (de la preparación)", "REPEAT": "Repetir", "EDIT": "Editar", - "DELETE": "Borrar", + "DELETE": "Eliminar", "FINISHED": "Acabado", "NOTES": "Notas", "ADD_PHOTO": "Agregar imagen", @@ -135,34 +135,34 @@ "BREW_DATA_SURF_TIME": "Surfeo Tiempo", "BREW_DATA_TIME": "Tiempo", "BREW_DATA_GRIND_SIZE": "Ajuste de molienda", - "BREW_DATA_GRIND_WEIGHT": "Café molido (gr)", + "BREW_DATA_GRIND_WEIGHT": "Café molido (g)", "BREW_DATA_IN_OUT_BR": "Entada/Salida (BR)", "BREW_DATA_NOTES": "Notas", "BREW_DATA_PREPARATION_METHOD": "Método de preparación", "BREW_DATA_MILL": "Molino", "BREW_DATA_MILL_SPEED": "Velocidad del molino (rpm)", "BREW_DATA_MILL_TIMER": "Tiempo de molido", - "BREW_DATA_BREW_QUANTITY": "Cantidad de agua (gr/ml)", + "BREW_DATA_BREW_QUANTITY": "Cantidad de agua (g/ml)", "BREW_DATA_BEAN_TYPE": "Tipo de grano", - "BREW_DATA_BREW_TEMPERATURE": "Temperatura de praparación", + "BREW_DATA_BREW_TEMPERATURE": "Temperatura de preparación", "BREW_DATA_PRESSURE_PROFILE": "Perfil", "BREW_DATA_COFFEE_TYPE": "Tipo de café", "BREW_DATA_COFFEE_CONCENTRATION": "Concentración de café", "BREW_DATA_COFFEE_FIRST_DRIP_TIME": "Primeras gotas de café", "BREW_DATA_COFFEE_BLOOMING_TIME": "Tiempo de preinfusión (Blooming)", "BREW_DATA_ATTACHMENTS": "Adjuntos / Imágenes", - "BREW_DATA_RATING": "Evaluación", + "BREW_DATA_RATING": "Puntuación", "BREW_DATA_CALCULATED_COFFEE_BREW_TIME": "Tiempo de preparación", "BREW_DATA_TDS": "Total de sólidos disueltos ", "BREW_DATA_CALCULATED_EXTRACTION_YIELD": "Rendimiento de extracción %", "BREW_INFORMATION_BREW_RATIO": "Proporción (ratio)", "BREW_INFORMATION_BEAN_AGE": "Edad de los granos (días)", - "BREW_INFORMATION_BREW_QUANTITY_TYPE_NAME": "Cantidad de preparaciónes-métodos", + "BREW_INFORMATION_BREW_QUANTITY_TYPE_NAME": "Cantidad de preparaciones-métodos", "BREW_DATA_TDS_EY": "TDS / %EY", "BREW_DATA_BREW_BEVERAGE_QUANTITY": "Tamaño de la bebida (gr/ml)", "BREW_DATA_PREPARATION_METHOD_TOOL": "Herramientas para la preparación", "BREW_DATA_WATER": "Agua", - "BREW_DATA_BEAN_WEIGHT_IN": "Cantidad de granos (gr)", + "BREW_DATA_BEAN_WEIGHT_IN": "Cantidad de granos (g)", "BREW_DATA_VESSEL": "Recipiente", "BREW_DATA_VESSEL_WEIGHT": "Peso del recipiente", "BREW_DATA_VESSEL_NAME": "Nombre del recipiente", @@ -174,30 +174,30 @@ "HOURS": "Horas", "ONE_MINUTE": "Minuto", "MINUTES": "Minutos", - "WITHOUT_COFFEE": "Sin café", + "WITHOUT_COFFEE": "sin café", "NOT_FOUND": "No encontrado", - "INVALID_FILE_FORMAT": "Archivo invalido", + "INVALID_FILE_FORMAT": "Archivo inválido", "FILE_NOT_FOUND_INFORMATION": "Archivo no encontrado", "ERROR_ON_FILE_READING": "Error al leer los datos del archivo", "IMPORT_SUCCESSFULLY": "Importado correctamente", "IMPORT_UNSUCCESSFULLY_DATA_NOT_CHANGED": "Importación incorrecta, no se ha cambiado ningún dato", "INVALID_FILE_DATA": "Contenido de archivo no válido", "DOWNLOADED": "Descargado", - "FILE_DOWNLOADED_SUCCESSFULLY": "JSON-Datei '{{fileName}}' se descargó correctamente en la carpeta de descargas!", + "FILE_DOWNLOADED_SUCCESSFULLY": "¡El archivo JSON '{{fileName}}' se descargó correctamente en la carpeta de descargas!", "NO": "No", - "YES": "Si", - "SURE_QUESTION": "Seguro?", - "DELETE_BREW_QUESTION": "Borrar preparación?", - "DELETE_BEAN_QUESTION": "Borar granos? Todas las preparaciones asociadas también se eliminarán.", + "YES": "Sí", + "SURE_QUESTION": "¿Seguro?", + "DELETE_BREW_QUESTION": "¿Eliminar preparación?", + "DELETE_BEAN_QUESTION": "¿Eliminar granos? Todas las preparaciones asociadas también se eliminarán.", "DELETE_GREEN_BEAN_QUESTION": "¿Eliminar granos verdes? ¡Se eliminarán todos los granos tostados asociados, así como las preparaciones!", - "DELETE_MILL_QUESTION": "Borrar molino? Todas las preparaciones asociadas se modificarán.", - "DELETE_PREPARATION_METHOD_QUESTION": "Borrar métodos? Todas las preparaciones asociadas también se eliminarán.", - "DELETE_PREPARATION_TOOL_QUESTION": "Borrar herramientas de preparación? Todos los preparativos asociados también se actualizarán.", + "DELETE_MILL_QUESTION": "¿Eliminar molino? Todas las preparaciones asociadas se modificarán.", + "DELETE_PREPARATION_METHOD_QUESTION": "¿Eliminar métodos? Todas las preparaciones asociadas también se eliminarán.", + "DELETE_PREPARATION_TOOL_QUESTION": "¿Eliminar herramientas de preparación? Todos los preparativos asociados también se actualizarán.", "APP_COULD_NOT_STARTED_CORRECTLY_BECAUSE_MISSING_FILESYSTEM": "La aplicación no se pudo iniciar correctamente debido a la falta de un sistema de archivos", "CARE": "Alerta", "ERROR_OCCURED": "Se ha producido un error", - "CSV_FILE_NOT_DOWNLOADED": "No se pudo descargar el archivo CSV!", - "CSV_FILE_DOWNLOADED_SUCCESSFULLY": "CSV-Datei '{{fileName}}' Se descargó correctamente en la carpeta de descargas!", + "CSV_FILE_NOT_DOWNLOADED": "¡No se pudo descargar el archivo CSV!", + "CSV_FILE_DOWNLOADED_SUCCESSFULLY": "¡El archivo CSV '{{fileName}}' se descargó correctamente en la carpeta de descargas!", "ADD_BREW": "Añadir preparación", "CHOOSE": "Escoger", "CHOOSE_PHOTO_OR_LIBRARY": "Tomar foto o elegir de entre la galería de fotos", @@ -215,7 +215,7 @@ "PAGE_PREPARATION_INFORMATION_BREWED_QUANTITY": "Cantidad preparada", "PAGE_PREPARATION_INFORMATION_GRIND_WEIGHT": "Peso de los granos consumidos", "PAGE_PREPARATION_INFORMATION_TIME_SPENT_BREWING": "Tiempo total de preparaciones", - "PAGE_PREPARATION_INFORMATION": "Información de los metodos de preparación", + "PAGE_PREPARATION_INFORMATION": "Información de los métodos de preparación", "SECONDS": "Segundos", "PAGE_MILL_INFORMATION": "Información del molino", "PAGE_MILL_INFORMATION_BREWS_DONE": "Preparaciones con este molino", @@ -226,13 +226,13 @@ "PAGE_HELPER_WATER_HARDNESS_GERMAN_HARDNESS": "°dH (medida alemana de la dureza del agua)", "PAGE_HELPER_WATER_HARDNESS_TOTAL_HARDNESS": "Dureza total", "PAGE_HELPER_BREW_RATIO": "Proporción (ratio)", - "PAGE_HELPER_BREW_RATIO_GROUND_COFFEE": "Café molido (gr)", - "PAGE_HELPER_BREW_RATIO_WATER": "Agua (gr/ml)", - "PAGE_HELPER_BREW_RATIO_CALCULATED": "Proporción de preparaccion (ratio) calculado", - "PAGE_SETTINGS_SHOW_ARCHIVED_BREWS": "Muestra preparaciones archivadas", - "PAGE_SETTINGS_SHOW_ARCHIVED_BEANS": "Muestra granos archivados", - "PAGE_SETTINGS_SHOW_ARCHIVED_GREEN_BEANS": "Muestra granos verdes archivados", - "CUPPING_SCORE": "Puntaje", + "PAGE_HELPER_BREW_RATIO_GROUND_COFFEE": "Café molido (g)", + "PAGE_HELPER_BREW_RATIO_WATER": "Agua (g/ml)", + "PAGE_HELPER_BREW_RATIO_CALCULATED": "Proporción de preparación (ratio) calculado", + "PAGE_SETTINGS_SHOW_ARCHIVED_BREWS": "Mostrar preparaciones archivadas", + "PAGE_SETTINGS_SHOW_ARCHIVED_BEANS": "Mostrar granos archivados", + "PAGE_SETTINGS_SHOW_ARCHIVED_GREEN_BEANS": "Mostrar granos verdes archivados", + "CUPPING_SCORE": "Puntuación", "CUPPING_SCORE_DRY_FRAGRANCE": "Fragancia", "CUPPING_SCORE_WET_AROMA": "Aroma", "CUPPING_SCORE_BRIGHTNESS": "Brillo", @@ -246,13 +246,13 @@ "CUPPING_SCORE_CUPPERS_CORRECTION": "Corrección del catador", "CUPPING_SCORE_DRY_FRAGRANCE_TOOLTIP": "Se refiere al aroma del café molido seco antes de agregar agua caliente.", "CUPPING_SCORE_WET_AROMA_TOOLTIP": "El olor del café, después de agregar el agua caliente.", - "CUPPING_SCORE_BRIGHTNESS_TOOLTIP": "La acidez es el sabor de las notas altas agudas en el café causadas por un conjunto de ácidos clorogénico, cítrico, chénico, acético y otros, sentidos principalmente en la parte frontal de la boca y la lengua. (Es una buena cualidad; no está relacionada con el amargor en el café, y no es directamente responsable del malestar estomacal). La acidez es apreciada por muchos catadores, y se relaciona directamente con la calidad de la taza, ya que la acidez es el producto de plantaciones de gran altitud.", - "CUPPING_SCORE_FLAVOR_TOOLTIP": "Esta es la impresión general en la boca, incluidas todas las demás calificaciones. Hay 4 agrupaciones de 'sabor primario' (agrio, dulce, salado, amargo) y muchos 'sabores secundarios'.", + "CUPPING_SCORE_BRIGHTNESS_TOOLTIP": "La acidez es el sabor de las notas altas agudas en el café causadas por un conjunto de ácidos clorogénico, cítrico, quínico, acético y otros, sentidos principalmente en la parte frontal de la boca y la lengua. (Es una buena cualidad; no está relacionada con el amargor en el café, y no es directamente responsable del malestar estomacal). La acidez es apreciada por muchos catadores, y se relaciona directamente con la calidad de la taza, ya que la acidez es el producto de plantaciones de gran altitud.", + "CUPPING_SCORE_FLAVOR_TOOLTIP": "Esta es la impresión general en la boca, incluidas todas las demás calificaciones. Hay 4 agrupaciones de 'sabor primario' (agrio, dulce, salado y amargo) y muchos 'sabores secundarios'.", "CUPPING_SCORE_BODY_TOOLTIP": "A menudo llamado 'sensación en la boca', el cuerpo es el sentido de intensidad y de densidad del café preparado, causado por el porcentaje de sólidos solubles en la taza, incluidos todos los compuestos orgánicos que se extraen (el método de preparación y la cantidad de café molido utilizado influyen en gran medida en esto). Calificamos Cuerpo en una escala más baja porque los cafés de cuerpo ligero ciertamente no son malos y, en algunos orígenes, el cuerpo más ligero se adapta mejor al carácter general de la taza.", - "CUPPING_SCORE_FINISH_TOOLTIP": "Los sabores persistentes o emergentes que vienen después de que se limpia el paladar. Esto incluye el momento en que el café sale de la boca hasta minutos después... una razón por la que encontrará muchos catadores revisando los puntajes de regusto cuando todavía están experimentando un sabor positivo uno o dos minutos después.", - "CUPPING_SCORE_SWEETNESS_TOOLTIP": "La dulzura es casi siempre una cualidad deseable en el café, incluso si se describe de maneras eufemísticas como 'dulzura rústica' o 'agridulce'. Puedes notar que la dulzura refinada (piensa en pasteles, dulces finos, azúcar blanca, dulzura pura) tiene un puntaje alto, así como la dulzura compleja de los azúcares de frutas (fructosa). La dulzura de la malta (maltosa) es menos tradicional pero bastante deseable y la miel puede variar desde la muy pura y limpia hasta la compleja, rústica casi con levadura. Básicamente, si la dulzura es importante para la taza, se calificará bien.", + "CUPPING_SCORE_FINISH_TOOLTIP": "Los sabores persistentes o emergentes que vienen después de que se limpia el paladar. Esto incluye el momento en que el café sale de la boca hasta minutos después... una razón por la que encontrará muchos catadores revisando las puntuaciones de regusto cuando todavía están experimentando un sabor positivo uno o dos minutos después.", + "CUPPING_SCORE_SWEETNESS_TOOLTIP": "La dulzura es casi siempre una cualidad deseable en el café, incluso si se describe de maneras eufemísticas como 'dulzura rústica' o 'agridulce'. Puedes notar que la dulzura refinada (piensa en pasteles, dulces finos, azúcar blanca, dulzura pura) tiene una puntuación alta, así como la dulzura compleja de los azúcares de frutas (fructosa). La dulzura de la malta (maltosa) es menos tradicional pero bastante deseable y la miel puede variar desde la muy pura y limpia hasta la compleja, rústica casi con levadura. Básicamente, si la dulzura es importante para la taza, se calificará bien.", "CUPPING_SCORE_CLEAN_CUP_TOOLTIP": "Ten en cuenta que 'taza limpia' no significa literalmente que no haya suciedad en el café. Se trata solo de sabor y cafés crudos y peculiares que son 'impuros' también pueden tener sabores bastante deseables, como los cafés descascarillados en húmedo de Sumatra Indonesia, o los naturales de Etiopía y Yemen.", - "CUPPING_SCORE_COMPLEXITY_TOOLTIP": "La complejidad complementa las puntuaciones de 'sabor' y 'acabado' para comunicar una variedad o superposición de muchos sabores. Significa que hay mucho que descubrir en la taza. Por otra parte los cafés simples pueden ser un alivio después de la sobreexposición a muchos cafés potentes, intensos y complejos.", + "CUPPING_SCORE_COMPLEXITY_TOOLTIP": "La complejidad complementa las puntuaciones de 'sabor' y 'acabado' para comunicar una variedad o superposición de muchos sabores. Significa que hay mucho que descubrir en la taza. Por otra parte, los cafés simples pueden ser un alivio después de la sobreexposición a muchos cafés potentes, intensos y complejos.", "CUPPING_SCORE_UNIFORMITY_TOOLTIP": "La uniformidad se refiere a las diferencias entre taza y taza. Los cafés de proceso seco pueden ser menos uniformes que los cafés de proceso húmedo por naturaleza. Nunca evitaríamos un lote que tenga sabores fantásticos si de vez en cuando flaquea. Esto se puntúa durante el protocolo de cata, donde se hacen múltiples tazas de cada lote que se está revisando.", "CUPPING_SCORE_CUPPERS_CORRECTION_TOOLTIP": "Esto se adapta del sistema SCAA y la puntuación de la Taza de Excelencia (a veces lo llaman 'Puntos generales'). Permite que un catador se asegure de que la puntuación total comunique correctamente la impresión general de la taza. Podrías criticar este enfoque y considerarlo 'manipular' el total. En cierto modo, estarías en lo cierto... pero sería mucho peor cambiar las puntuaciones de una categoría para lograr el total deseado (darle a un café un 9 por acidez cuando sabes que es un 7), o por el contrario tener un café que merece absolutamente un 90 terminar en 84. El número específico de corrección del catador no importa nada, ya sea un 5 o un 8... la idea es que la puntuación total dé una impresión correcta de la calidad del café.", "CUPPING_SCORE_TOOLTIP": "100-95 = Increíble, 90-94 = Sobresaliente, 85-89 = Muy bueno, 80-84 = Bueno, 75-79 = Pasable, 70-74 = Pobre", @@ -269,43 +269,43 @@ "EDIT_MILL": "Editar molino", "USE_FILTER": "Usar filtro", "RESET_FILTER": "Reiniciar filtro", - "COFFEE_GRAMS_GRINDED": "Gramos molido", + "COFFEE_GRAMS_GRINDED": "Gramos molidos", "BEANS_USED": "Granos usados", "BREW_HEADER_BEFORE_BREW": "Antes de la preparación", "BREW_HEADER_WHILE_BREW": "Durante la preparación", - "BREW_HEADER_AFTER_BREW": "Despues de la praparación", + "BREW_HEADER_AFTER_BREW": "Después de la preparación", "BREW_HEADER_CUPPING": "Catar", "BEANS_CONSUMED": "Archivar", "NAV_MANAGE_PARAMETERS": "Mantener parámetros", "NAV_SORT_PARAMETERS": "Ordenar parámetros", "NAV_DEFAULT_PARAMETERS": "Guardar como parámetros predeterminados", - "PAGE_SORT_PARAMETERS_DESCRIPTION": "Arastrar y soltar los parámetros para definir en qué secuencia se mostrarán.", + "PAGE_SORT_PARAMETERS_DESCRIPTION": "Arrastrar y soltar los parámetros para definir en qué orden se mostrarán.", "PAGE_MANAGE_PARAMETERS_DESCRIPTION": "Marca los parámetros que se mostrarán al editar la información de la preparación.", "PAGE_DEFAULT_PARAMETERS_DESCRIPTION": "Marca qué parámetros deben mantener el último valor utilizado.", "SORT_PARAMETERS_BEFORE": "Antes de la preparación", "SORT_PARAMETERS_MEANWHILE": "Durante la preparación", - "SORT_PARAMETERS_AFTER": "Despues de la praparación", - "MORE_INFORMATION": "Mas información", + "SORT_PARAMETERS_AFTER": "Después de la preparación", + "MORE_INFORMATION": "Más información", "UNDERSTOOD": "Entendido", - "WELCOME_PAGE_ACTIVATE_ANALYTICS_TITLE": "Activar Google Analytics", - "WELCOME_PAGE_ACTIVATE_ANALYTICS_DESCRIPTION": "Me gustaría mejorar esta aplicación continuamente. ¿Aceptas que recopile datos analíticos sobre el uso de tu aplicación? ¡No se recopilará información de identificación personal!", - "ANALYTICS_INFORMATION_TITLE": "Análisis y seguimiento", - "ANALYTICS_INFORMATION_DESCRIPTION": "Como sabes, la seguridad de tus datos y tu privacidad es nuestra máxima prioridad.

Por esta razón, hemos cambiado de Google Analytics al servicio de código abierto centrado en la seguridad de los datos y la privacidad Matomo, que está alojado en nuestro propio servidor, lo que significa que tenemos la propiedad total de los datos.

Los parámetros rastreados no han cambiado, y aún prometemos que nunca rastrearemos ningún dato personal.

Nuestro sitio web proporciona toda la información sobre los parámetros que rastreamos y, además, puedes verificar el código fuente que es 100% de código abierto.

¿Tiene preguntas?

Entonces no dudes en ponerte en contacto con nosotros.", + "WELCOME_PAGE_ACTIVATE_ANALYTICS_TITLE": "Analíticas y seguimiento", + "WELCOME_PAGE_ACTIVATE_ANALYTICS_DESCRIPTION": "Me gustaría mejorar esta aplicación continuamente. ¿Aceptas que recopile datos analíticos sobre el uso de tu aplicación? ¡No se recopilará información de carácter personal!", + "ANALYTICS_INFORMATION_TITLE": "Analíticas y seguimiento", + "ANALYTICS_INFORMATION_DESCRIPTION": "Como sabes, la seguridad de tus datos y tu privacidad es nuestra máxima prioridad.

Por esta razón, hemos cambiado de Google Analytics al servicio de código abierto centrado en la seguridad de los datos y la privacidad Matomo, que está alojado en nuestro propio servidor, lo que significa que tenemos la propiedad total de los datos.

Los parámetros rastreados no han cambiado, y aún prometemos que nunca rastrearemos ningún dato personal.

Nuestra página web proporciona toda la información sobre los parámetros que rastreamos y, además, puedes verificar el código fuente que es 100% de código abierto.

¿Tienes preguntas?

Entonces no dudes en ponerte en contacto con nosotros.", "ACTIVATE": "Activar", "DO_NOT_ACTIVE": "No activar", "WELCOME_PAGE_BEAN_TITLE": "Agregar grano", - "WELCOME_PAGE_BEAN_DESCRIPTION": "Preparar café sin granos es un poco complicado. ¡Agrega tu primera grano para comenzar!", + "WELCOME_PAGE_BEAN_DESCRIPTION": "Preparar café sin granos es un poco complicado. ¡Agrega tu primer grano para comenzar!", "WELCOME_PAGE_BEAN_ADD": "Agregar grano", "SKIP": "Saltar", "WELCOME_PAGE_PREPARATION_TITLE": "Agregar método de preparación", "WELCOME_PAGE_PREPARATION_DESCRIPTION": "¿Hacer café sin un método de preparación? Ya sea V60, Aeropress, portafiltro o clásico, agrega tu método de elaboración de café.", - "WELCOME_PAGE_PREPARATION_ADD": "Agregar método de praparación", + "WELCOME_PAGE_PREPARATION_ADD": "Agregar método de preparación", "WELCOME_PAGE_MILL_TITLE": "Agregar molino", - "WELCOME_PAGE_MILL_DESCRIPTION": "Grano, método de preparación y por último, pero no menos importante: ¡Tu molino y estas listo!", + "WELCOME_PAGE_MILL_DESCRIPTION": "Grano, método de preparación y, por último, pero no menos importante: ¡Tu molino y estás listo!", "WELCOME_PAGE_MILL_ADD": "Agregar molino", - "WELCOME_PAGE_TITLE": "Bienvenido!", + "WELCOME_PAGE_TITLE": "¡Bienvenido!", "WELCOME_PAGE_BEAN_HEADLINE": "El primer grano", - "WELCOME_PAGE_PREPARATION_HEADLINE": "Agregar metodo de preparación", + "WELCOME_PAGE_PREPARATION_HEADLINE": "Agregar método de preparación", "WELCOME_PAGE_MILL_HEADLINE": "El primer molino", "WELCOME_PAGE_LETS_START_HEADLINE": "¡A empezar!", "WELCOME_PAGE_LETS_START_TITLE": "¡Manos a la obra!", @@ -313,22 +313,22 @@ "PREPARATION_TYPE": "Tipo de método", "PREPARATION_TYPE_NAME": "Nombre", "ARCHIVED": "Archivado", - "PAGE_SETTINGS_SHOW_ARCHIVED_PREPARATIONS": "Muestra metodos archivados", - "PAGE_SETTINGS_SHOW_ARCHIVED_MILLS": "Muestra molinos archivados", + "PAGE_SETTINGS_SHOW_ARCHIVED_PREPARATIONS": "Mostrar métodos archivados", + "PAGE_SETTINGS_SHOW_ARCHIVED_MILLS": "Mostrar molinos archivados", "PAGE_MILL_LIST_NO_ARCHIVED_MILL_EXISTING": "No has archivado ningun molino", - "PAGE_PREPARATION_LIST_NO_ARCHIVED_PREPARATION_EXISTING": "No has archivado ningun metodo.", + "PAGE_PREPARATION_LIST_NO_ARCHIVED_PREPARATION_EXISTING": "No has archivado ningún método.", "TOAST_BREW_ADDED_SUCCESSFULLY": "Preparación agregada con éxito", "TOAST_BREW_REPEATED_SUCCESSFULLY": "Preparación repetida con éxito", "TOAST_BEAN_ADDED_SUCCESSFULLY": "Grano agregado con éxito", - "TOAST_MILL_ADDED_SUCCESSFULLY": "Molino agregad con éxito", - "TOAST_PREPARATION_ADDED_SUCCESSFULLY": "Metodo agregado con éxito", + "TOAST_MILL_ADDED_SUCCESSFULLY": "Molino agregado con éxito", + "TOAST_PREPARATION_ADDED_SUCCESSFULLY": "Método agregado con éxito", "TOAST_WATER_ADDED_SUCCESSFULLY": "Agua agregada con éxito", "TOAST_BREW_DELETED_SUCCESSFULLY": "Preparación eliminada", "TOAST_BEAN_DELETED_SUCCESSFULLY": "Grano eliminado", "TOAST_GREEN_BEAN_DELETED_SUCCESSFULLY": "Se ha eliminado el grano verde", "TOAST_MILL_DELETED_SUCCESSFULLY": "Molino eliminado", "TOAST_WATER_DELETED_SUCCESSFULLY": "El agua ha sido eliminada", - "TOAST_PREPARATION_DELETED_SUCCESSFULLY": "Metodo eliminado", + "TOAST_PREPARATION_DELETED_SUCCESSFULLY": "Método eliminado", "TOAST_BREW_EDITED_SUCCESSFULLY": "Se ha editado la preparación", "TOAST_BEAN_EDITED_SUCCESSFULLY": "Se ha editado el grano", "TOAST_MILL_EDITED_SUCCESSFULLY": "Se ha editado el molino", @@ -336,7 +336,7 @@ "TOAST_WATER_EDITED_SUCCESSFULLY": "Se ha editado el agua", "TOAST_BEAN_ARCHIVED_SUCCESSFULLY": "Grano archivado", "TOAST_MILL_ARCHIVED_SUCCESSFULLY": "Molino archivado", - "TOAST_PREPARATION_ARCHIVED_SUCCESSFULLY": "Metodo archivado", + "TOAST_PREPARATION_ARCHIVED_SUCCESSFULLY": "Método archivado", "TOAST_WATER_ARCHIVED_SUCCESSFULLY": "Se ha archivado el agua", "BEAN_WEIGHT_ALREADY_USED": "{{gramUsed}}g de {{gramTotal}}g", "PREPARATION_TYPE_CUSTOM_PREPARATION": "Método de preparación personalizado", @@ -350,43 +350,43 @@ "PREPARATION_TYPE_SWANNECK": "Cuello de ganso", "PREPARATION_TYPE_DRIPPER": "Dripper", "PREPARATION_TYPE_DELTER_PRESS": "Delter Press", - "PREPARATION_TYPE_COLD_BREW": "Cold Brew (extracción en frio)", - "PREPARATION_TYPE_AEROPRESS_INVERTED": "Aeropress Invertido", + "PREPARATION_TYPE_COLD_BREW": "Cold Brew (extracción en frío)", + "PREPARATION_TYPE_AEROPRESS_INVERTED": "Aeropress invertido", "PREPARATION_TYPE_TURKISH": "Turco", "PREPARATION_TYPE_BLUE_DRIPPER": "Blue Dripper", "PREPARATION_TYPE_ADD_CUSTOM": "Agregar método personalizado", "PREPARATION_TYPE_GINA": "Gina", "PREPARATION_TYPE_KONO": "Kono", "PREPARATION_TYPE_ORIGAMI": "Origami", - "PREPARATION_TYPE_CAFELAT": "Cafelat", + "PREPARATION_TYPE_CAFELAT": "Cafelat Robot", "PREPARATION_TYPE_OREA": "Orea", "PREPARATION_TYPE_COLD_DRIP": "Cold drip", - "PREPARATION_TYPE_HAND_LEVER": "Hand lever", + "PREPARATION_TYPE_HAND_LEVER": "Palanca", "PREPARATION_TYPE_FLAIR": "Flair", "PREPARATION_TYPE_APRIL_BREWER": "April Brewer", "PREPARATION_TYPE_ESPRO_BLOOM": "Espro Bloom", "PREPARATION_TYPE_FELLOW_STAGG": "Fellow Stagg", "PREPARATION_TYPE_HSIAO_50": "Hsiao 50", "PREPARATION_TYPE_KARLSBADER_KANNE": "Karlsbader", - "PREPARATION_TYPE_MOCCA_MASTER": "Mocca Master", - "PREPARATION_TYPE_SIPHON": "Syphon", - "CHOOSE_BEANS": "Seleccionar grano", - "CHOOSE_BEAN": "Seleccionar granos", + "PREPARATION_TYPE_MOCCA_MASTER": "Moccamaster", + "PREPARATION_TYPE_SIPHON": "Sifón", + "CHOOSE_BEANS": "Seleccionar granos", + "CHOOSE_BEAN": "Seleccionar grano", "CHOOSE_WATERS": "Seleccionar aguas", "CHOOSE_WATER": "Seleccionar agua", - "CHOOSE_PREPARATIONS": "Seleccionar metodos", - "CHOOSE_PREPARATION": "Seleccionar metodo", + "CHOOSE_PREPARATIONS": "Seleccionar métodos", + "CHOOSE_PREPARATION": "Seleccionar método", "CHOOSE_MILLS": "Seleccionar molinos", - "CHOOSE_MILL": "seleccionar molino", + "CHOOSE_MILL": "Seleccionar molino", "BEAN": { "PLACE_HOLDER": { "BEAN_DATA_NAME": "Agregar nombre", - "BEAN_DATA_ROAST_NAME": "Añadir grado de tostado", + "BEAN_DATA_ROAST_NAME": "Añadir grado de tueste", "BEAN_DATA_ROASTING_DATE": "¿Cuándo se tostaron los granos?", - "BEAN_DATA_ROASTER": "¿Quien tostó los granos?", + "BEAN_DATA_ROASTER": "¿Quién tostó los granos?", "BEAN_DATA_VARIETY": "Agrega la variedad de café", - "BEAN_DATA_PROCESSING": "Procesamiento del café, por ejemplo lavado", - "BEAN_DATA_COUNTRY": "¿Orígen del grano?", + "BEAN_DATA_PROCESSING": "Procesamiento del café. Ejemplo: lavado", + "BEAN_DATA_COUNTRY": "¿País de origen del grano?", "BEAN_DATA_MIX": "¿Cuál es la relación de mezcla?", "BEAN_DATA_AROMATICS": "Añadir aromas", "BEAN_DATA_WEIGHT": "Peso de los granos", @@ -394,16 +394,16 @@ "BEAN_DATA_REGION": "Agregar la región", "BEAN_DATA_FARM": "Agregar la finca", "BEAN_DATA_FARMER": "Agregar al productor/a", - "BEAN_DATA_ELEVATION": "¿De que altura son los granos?", - "BEAN_DATA_HARVEST_TIME": "¿Cuando se cosecharon los granos?", + "BEAN_DATA_ELEVATION": "¿A qué altura fueron plantados los cafetos?", + "BEAN_DATA_HARVEST_TIME": "¿Cuándo se cosecharon los granos?", "BEAN_DATA_BUY_DATE": "¿Cuándo se compró el grano?", "BEAN_DATA_PERCENTAGE": "Agrega el porcentaje", "BEAN_DATA_CERTIFICATION": "Agrega la certificación del grano (Comercio justo, Bio)", - "BEAN_DATA_ROASTING_TYPE": "Agrega el tipo de tuesta", + "BEAN_DATA_ROASTING_TYPE": "Agrega el tipo de tueste", "BEAN_DATA_DECAFFEINATED": "¿Es descafeinado?", "BEAN_DATA_URL": "Agrega la página web", - "BEAN_DATA_EAN": "Agerga el código EAN o código propietario del producto", - "BEAN_DATA_CUPPING_POINTS": "Agrega el puntaje de cata ", + "BEAN_DATA_EAN": "Agrega el código EAN o código propietario del producto", + "BEAN_DATA_CUPPING_POINTS": "Agrega la puntuación de cata ", "BEAN_DATA_PURCHASING_PRICE": "Agrega el precio de compra", "BEAN_DATA_FOB_PRICE": "Agrega el precio FOB", "NOTES": "Agrega notas", @@ -414,7 +414,7 @@ "PREPARATION": { "PLACE_HOLDER": { "PREPARATION_TYPE_NAME": "Agrega un nombre", - "NOTES": "Agrega notas a tu metodo de praparación" + "NOTES": "Agrega notas a tu método de preparación" } }, "MILL": { @@ -435,7 +435,7 @@ "BREW_DATA_MILL_TIMER": "Introduce el tiempo de molido", "BREW_DATA_PRESSURE_PROFILE": "Perfil de presión/flujo, consejos de preparación", "BREW_DATA_TEMPERATURE_TIME": "Introduce el tiempo desde que la máquina calentó", - "BREW_DATA_COFFEE_BLOOMING_TIME": "¿Cuánto tiempo duro la desgasificación (blooming)?", + "BREW_DATA_COFFEE_BLOOMING_TIME": "¿Cuánto tiempo duró la desgasificación (blooming)?", "BREW_DATA_COFFEE_FIRST_DRIP_TIME": "¿Cuándo apareció la primera gota?", "BREW_DATA_BREW_QUANTITY": "¿Cuánto café has preparado?", "BREW_DATA_COFFEE_TYPE": "Introduzca el tipo de café (por ejemplo, ristretto)", @@ -443,43 +443,43 @@ "BREW_DATA_TDS": "¿Cuántos sólidos se disolvieron en total?", "BREW_DATA_NOTES": "Agrega notas a esta preparación", "BREW_DATA_BREW_BEVERAGE_QUANTITY": "Añade la cantidad de bebida resultante", - "BREW_DATA_PREPARATION_METHOD_TOOL": "Por favor elije tus herramientas de preparación", + "BREW_DATA_PREPARATION_METHOD_TOOL": "Por favor, elije tus herramientas de preparación", "BREW_DATA_WATER": "Elija el agua usada", "BREW_DATA_BEAN_WEIGHT_IN": "¿Cuánto grano usaste?" } }, "ROASTED_BEFORE": "Tostado hace", - "DAY_OLD": "Días", - "DAYS_OLD": "Días", + "DAY_OLD": "día", + "DAYS_OLD": "días", "BEANS_AMOUNT_USED": "Consumidos", "CUPPING_BREW": "Cata", "COFFEE_DRUNKEN_QUANTITY": "Cantidad consumida", "IMAGE_DELETED": "Imagen eliminada", - "IMAGE_NOT_DELETED": "Imagen no pudo ser eliminada", + "IMAGE_NOT_DELETED": "La imagen no pudo ser eliminada", "EXTERNAL_STORAGE_NOT_SUPPORTED": "Lo sentimos, el almacenamiento externo no es compatible", - "BEANS_ARCHIVED": "Archivado", - "TAB_ARCHIVE": "Archivo", - "PLEASE_WAIT": "Por favor paciencia...", + "BEANS_ARCHIVED": "Archivados", + "TAB_ARCHIVE": "Archivados", + "PLEASE_WAIT": "Por favor, espere...", "TODAY": "Hoy", "PREPARATION_STYLE_POUR_OVER": "Filtro", "PREPARATION_STYLE_ESPRESSO": "Espresso", - "PREPARATION_STYLE_FULL_IMMERSION": "Inmersion total (infusión)", + "PREPARATION_STYLE_FULL_IMMERSION": "Inmersión total (infusión)", "PREPARATION_STYLE_PERCOLATION": "Percolado", - "PREPARATION_TYPE_STYLE": "Tipo de praparación", + "PREPARATION_TYPE_STYLE": "Tipo de preparación", "PAGE_SETTINGS_FAST_REPEAT_DESCRIPTION": "Activa una nueva entrada de menú - con esto puedes repetir la preparación directamente.", - "PAGE_SETTINGS_TRACK_BREW_COORDINATES_DESCRIPTION": "Guarda el lugar de cada brebaje.", + "PAGE_SETTINGS_TRACK_BREW_COORDINATES_DESCRIPTION": "Guarda el lugar de cada preparación.", "PAGE_SETTINGS_TRACK_CAFFEINE_CONSUMPTION_DESCRIPTION": "Guarda la cantidad de cafeína consumida", - "UPDATE_TITLE": "Que hay de nuevo", + "UPDATE_TITLE": "Novedades", "NEXT": "Siguiente", "UPDATE_TEXT_TITLE_TITLE": { "5.0.0": { - "TITLE": "Versión 5.0: Ésto es lo nuevo", + "TITLE": "Versión 5.0: Novedades", "DESCRIPTION": [ "Nuevo diseño, nuevos iconos, nuevos colores, nuevo logotipo", - "Nuevos metodos de preparación", - "Los métodos de elaboración ahora se pueden clasificar (percolación, espresso, inmersión completa)", - "Los métodos de elaboración ahora se pueden almacenar con herramientas (filtros, coladores, etc.)", - "Los métodos de elaboración ahora pueden tener su propio flujo de trabajo", + "Nuevos métodos de preparación", + "Los métodos de preparación ahora se pueden clasificar (percolación, espresso, inmersión completa)", + "Los métodos de preparación ahora se pueden almacenar con herramientas (filtros, coladores, etc.)", + "Los métodos de preparación ahora pueden tener su propio flujo de trabajo", "Se puede almacenar más información sobre el grano, así como diferentes variedades de granos", "Campo de referencia - la cantidad de agua solo está disponible para percolación/inmersión total", "¿Dónde sacaste el último café? Habilita esto en la configuración", @@ -491,21 +491,21 @@ "El radar de catas lleno ahora se muestra en los detalles de preparación", "La cantidad restante de granos ahora se muestra en la página de inicio", "Ahora se proponen tostadores para los granos", - "Cambian la calificación de las preparaciones a estrellas" + "Cambia la puntuación de las preparaciones a estrellas" ] }, "5.1.0": { - "TITLE": "Versión 5.1: Ésto es lo nuevo", + "TITLE": "Versión 5.1: Novedades", "DESCRIPTION": [ "Nueva selección de tiempo para las preparaciones", - "En iOS se puede seleccionar nuevamente la fecha de tostado de los granos", + "En iOS se puede seleccionar nuevamente la fecha de tueste de los granos", "En el iPad se pueden seleccionar nuevamente las imágenes ", "El cálculo de TDS es nuevamente visible en las preparaciones", "Zonas seguras agregadas para dispositivos iOS" ] }, "5.2.0": { - "TITLE": "Versión 5.2: Ésto es lo nuevo", + "TITLE": "Versión 5.2: Novedades", "DESCRIPTION": [ "Preparaciones:", "Temporizador de preparaciones continúa ejecutándose en segundo plano", @@ -521,14 +521,14 @@ "Interacciones:", "La pulsación prolongada en los iconos conduce a la vista de edición", "Las vistas detalladas ahora se admiten con un clic directo en el icono", - "Sitios web de Github / Facebook / Instagram vinculados", + "Páginas web de Github / Facebook / Instagram vinculados", "", "Correcciones:", "La información de granos se copiaba incorrectamente", - "La cantidad de preparaciónes se habilitaba de forma predeterminada para los nuevos usuarios", + "La cantidad de preparaciones se habilitaba de forma predeterminada para los nuevos usuarios", "", "Otros:", - "Integración de Apple Healthkit (activable en configuración)", + "Integración de Apple HealthKit (activable en configuración)", "Limpieza", "Cambios de diseño", "Extensión de estadísticas", @@ -537,7 +537,7 @@ ] }, "5.3.1": { - "TITLE": "Versión 5.3: Ésto es lo nuevo", + "TITLE": "Versión 5.3: Novedades", "DESCRIPTION": [ "Métodos de preparación:", "Cambio de iconos", @@ -561,17 +561,17 @@ ] }, "5.4.0": { - "TITLE": "Versión 5.4: Ésto es lo nuevo", + "TITLE": "Versión 5.4: Novedades", "DESCRIPTION": [ - "Sección de tostado:", + "Sección de tueste:", "Administra todos tus granos verdes y tostadoras (se puede activar en el menú de configuración)", "Guarda todos tus granos verdes y transfiérelos a tostados", "Agrega tu tostadora y conéctala con tus diferentes tipos de granos tostados", "", - "Sitio web:", - "Vaya en directo en nuestro nuevo sitio web! -> https://beanconqueror.com", + "Página web:", + "¡Vaya en directo a nuestra nueva página web! -> https://beanconqueror.com", "", - "Apoyanos:", + "Apóyanos:", "¿Siempre has querido apoyar a Beanconqueror? Hemos agregado un nuevo vínculo 'Cómprame un café'", "", "iOS - iCloud:", @@ -579,9 +579,9 @@ "Primero debe activar esta opción en la Configuración de iCloud para guardar Beanconqueror en iCloud", "", "Android/iOS - Exportación de archivos automatizada:", - "El archivo Beanconqueror.json se guarda durante un máximo de 7 días, después de lo cual se eliminarán automáticamente de nuevo.", - "Android: Descargar / Beanconqueror_export / Beanconqueror_automatic_export_DAY.json", - "iOS: Archivos / Descargar / Beanconqueror_export / Beanconqueror_automatic_export_FILE.json", + "El archivo Beanconqueror.json se guarda durante un máximo de 7 días, después de lo cual se eliminará automáticamente de nuevo.", + "Android: Descargas / Beanconqueror_export / Beanconqueror_automatic_export_DAY.json", + "iOS: Archivos / Descargas / Beanconqueror_export / Beanconqueror_automatic_export_FILE.json", "", "Ajustes:", "Excel - Exporta todos tus datos a Excel para trabajar con ellos aún más", @@ -593,8 +593,8 @@ "Se eliminó Google Analytics / Firebase", "", "Corrección de errores:", - "Apple Healthkit - la configuración no se guardaba", - "A veces, las estrellas de calificación de elaboración no se llenaban (elaboración agregar / editar)", + "Apple HealthKit - la configuración no se guardaba", + "A veces, las estrellas de calificación de preparación no se llenaban (preparación agregar / editar)", "Editar con un toque largo, la pantalla no se podía desplazar", "La importación de archivos grandes en iOS provocaba una mala conducta ", "El procedimiento de eliminación de granos/ preparaciones o molinos no era consistente y daba lugar a problemas gráficos", @@ -613,23 +613,23 @@ ] }, "6.0.0": { - "TITLE": "Versión 6.0: Ésto es lo nuevo", + "TITLE": "Versión 6.0: Novedades", "DESCRIPTION": [ - "Balanza Bluetooth", - "Compatibilidad con la primera balanza Bluetooth - Decent-Scale - Muchas gracias a Decent Espresso", + "Básculas Bluetooth", + "Compatibilidad con la primera báscula Bluetooth - Decent-Scale - Muchas gracias a Decent Espresso", "Soporte para la Acaia Lunar", "", "Degustación de aromas", - "Prueba cada brebaje con sus respectivos aromas.", + "Prueba cada bebida con sus respectivos aromas.", "", - "Área de agua", - "Agrega tu propia agua, activa esta área en los ajustes", + "Sección de agua", + "Agrega tu propia agua, activa esta sección en la configuración", "", "Más idiomas", "Soporte para español - ¡Gracias a Frank!", "", "Mejoras", - "Ahora repite más rápido la preparación con los métodos, presiona prolongadamente '+'", + "Ahora repite más rápido la preparación con los métodos, presiona prolongadamente '+'", "Nuevos parámetros agregados", "Soporte de diferentes monedas", "Edición de la preparación en la vista detallada.", @@ -644,7 +644,7 @@ "Soporte para distancias de seguridad", "", "Corrección de errores:", - "Apple Healthkit - el café descafeinado se guarda", + "Apple HealthKit - el café descafeinado se guarda", "Copiar granos conducía a un error", "Tiempo de preparación agregado en la exportación de Excel", "Correcciones de errores menores", @@ -654,19 +654,19 @@ ] }, "6.1.0": { - "TITLE": "Versión 6.1: Ésto es lo nuevo!", + "TITLE": "Versión 6.1: Novedades", "DESCRIPTION": [ "Códigos QR", - "¡Escanea tus bolsas de café! Toda la información del café viene directamente de la torrefacción.", + "¡Escanea tus bolsas de café! Toda la información del café viene directamente del tostador.", "", - "Balanzas Bluetooth ", - "Soporte para la Acaia Pearl 2021 - Gracias a Micah and Mike", - "Soporte para la Acaia Lunar 2021 - Gracias a Micah and Mike", - "Soporte para la Acaia Pyxis - Gracias a Micah and Mike", + "Básculas Bluetooth ", + "Soporte para la Acaia Pearl 2021 - Gracias a Micah y Mike", + "Soporte para la Acaia Lunar 2021 - Gracias a Micah y Mike", + "Soporte para la Acaia Pyxis - Gracias a Micah y Mike", "Soporte para la Hiroia Jimmy - Gracias a Silas", "Soporte para la Felicita Arc - Gracias a Herman", "Cuidado: Acaia Pearl < 2021 no tiene soporte por el momento", - "La información de peso de la balanza bluetooth ahora se puede usar en la página de granos", + "La información de peso de la báscula bluetooth ahora se puede usar en la página de granos", "Los cambios de peso ahora son visibles sin iniciar una preparación a través del temporizador", "", "Descripción general de la preparación", @@ -674,64 +674,64 @@ "Las imágenes de preparación ahora son visibles en la vista de lista", "", "Gráfico de preparación", - "Reelaboración del gráfico de preparación para una solución más fluida", - "El gráfico de preparación ahora se puede maximizar", - "El gráfico de preparación ahora se puede ampliar en la vista de detalles de preparación y exportar", - "Ahora se muestra la cantidad de flujo promedio", + "Reelaboración del gráfico de preparación para una solución más fluida", + "El gráfico de preparación ahora se puede maximizar", + "El gráfico de preparación ahora se puede ampliar en la vista de detalles de preparación y exportar", + "Ahora se muestra la cantidad de flujo promedio", "", "Granos", - "Campos agregados: Fecha de compra, Precio FOB, Precio de compra", - "Los granos ahora se pueden marcar como favoritos y filtrar", - "Si un grano se archiva, ahora también puede calificar el paquete", - "Al presionar '+' ahora puede elegir agregar o escanear un nuevo paquete", - "Mantenga presionado '+' para agregar directamente un nuevo grano", + "Campos agregados: Fecha de compra, Precio FOB, Precio de compra", + "Los granos ahora se pueden marcar como favoritos y filtrar", + "Si un grano se archiva, ahora también puede calificar el paquete", + "Al presionar '+' ahora puede elegir agregar o escanear un nuevo paquete", + "Mantenga presionado '+' para agregar directamente un nuevo grano", "", "Métodos de preparación", "Los métodos de preparación ahora se pueden repetir con todas las configuraciones", - "Hay más métodos de preparación disponibles - Gracias a Nicola", - "Al seleccionar un método de preparación también se muestra la imagen", + "Hay más métodos de preparación disponibles - Gracias a Nicola", + "Al seleccionar un método de preparación también se muestra la imagen", "", "Ajustes", "Las calificaciones ahora se pueden escalonar (1, 0.75, 0.5, 0.25, 0.1)", - "Balanza Bluetooth: defina si la balanza debe configurarse en peso cero al iniciar una nueva preparación o iniciar el temporizador", - "Balanza Bluetooth: defina si desea ignorar anomalías o valores negativos; si es así, no será posible un gráfico en vivo", - "Elija ahora si desea ver las preparaciones archivadas en la página de inicio", - "Exportar ahora también exporta los datos sin procesar de los valores de bluetooth guardados", + "Báscula Bluetooth: defina si la báscula debe configurarse en peso cero al iniciar una nueva preparación o iniciar el temporizador", + "Báscula Bluetooth: defina si desea ignorar anomalías o valores negativos; si es así, no será posible un gráfico en vivo", + "Elija ahora si desea ver las preparaciones archivadas en la página de inicio", + "Exportar ahora también exporta los datos sin procesar de los valores de bluetooth guardados", "", "Mejoras", "Eliminar las herramientas del método de preparación ahora ya no eliminará las preparaciones", - "Las herramientas del método de preparación ahora se pueden editar y archivar", + "Las herramientas del método de preparación ahora se pueden editar y archivar", "", "Corrección de errores:", - "Se encontraron más problemas que podrían conducir a una pérdida de datos", - "Pequeñas correcciones de errores", + "Se encontraron más problemas que podrían conducir a una pérdida de datos", + "Pequeñas correcciones de errores", "", "Otros:", - "Actualizado a Ionic-Framework 6, por lo tanto existen algunos pequeños cambios visuales" + "Actualizado a Ionic-Framework 6, por lo tanto, existen algunos pequeños cambios visuales" ] }, "6.1.3": { - "TITLE": "Version 6.1.3: Thats new!", + "TITLE": "Versión 6.1.3: Novedades", "DESCRIPTION": [ - "Android - Attention", - "In first please: Sorry!", - "Sadly the database was resetted from going form APK to AAB format on Android Play Store, and your app will propably start without data.", - "I could not debug or control this situation, while development everything worked as expected", - "If your app started blank, please go into settings and import the file below 'Download/Beanconqueror_export/Beanconqueror_automatic_export_*.json' * stands for the latest timestamp, the backup.", - "All datas should then be back as normal, if not please write me an e-mail: info@beanconqueror.com." + "Android - Atención", + "Antes que nada: ¡perdón!", + "Lamentablemente la base de datos ha sido reseteada al pasar la aplicación de APK a AAB en Google Play Store y verás que no tienes datos en la aplicación.", + "No he podido prever esto durante el desarrollo porque todo funcionaba perfectamente", + "Si inicias la aplicación y no tienes datos, ve a configuración e importa el fichero que encontrarás en 'Download/Beanconqueror_export/Beanconqueror_automatic_export_*.json' * refleja el último día y hora de la copia de seguridad.", + "Deberían aparecer todos los datos que tenías, si no es el caso, envíame un correo a: info@beanconqueror.com." ] }, "6.1.5": { - "TITLE": "Versión 6.1.5: Ésto es lo nuevo!", + "TITLE": "Versión 6.1.5: Novedades", "DESCRIPTION": [ "Códigos QR", - "Recargue beans que fueron escaneados a través de códigos qr", + "Recargue granos que fueron escaneados a través de códigos QR", "", "Gráfico de preparación", "El flujo de agua se calcula ahora en tiempo real", "", "Granos", - "Buscar frijoles ahora en la selección", + "Buscar granos ahora en la selección", "", "Corrección de errores/b>", "Después de tomar una foto, la rueda giratoria de carga no desapareció.", @@ -739,49 +739,49 @@ ] }, "6.2.0": { - "TITLE": "Version 6.2.0: Thats new", + "TITLE": "Versión 6.2.0: Novedades", "DESCRIPTION": [ - "Pressure devices", - "Support of PRS - Sensor", - "Support of 'Do it yourself' Popsicle - Sensor - Thanks to Mike and Shay", - "Autostart timer on a specific pressure - editable in settings", - "Press of pressure gauge, will reset pressure to 0", - "Display name of pressure device and mac-address on connect", + "Dispositivos de presión", + "Añadido soporte para sensor PRS", + "Añadido soporte para sensor 'Do it yourself' Popsicle - Gracias a Mike y Shay", + "Inicio automático del temporizador al llegar a cierta presión - editable en la configuración", + "Presionar el manómetro resetea la presión a 0.", + "Ahora se muestra el nombre y la dirección del dispositivo de presión al conectarse", "", - "Bluetooth scales", - "Support of Eureka Precisa - Thanks to Mimoja", - "Define the behavior of the bluetooth scale on a new brew - editable in settings", - "Define which graphs should be displayed on filter or espresso - editable in settings", - "Sequential processing of bluetooth commands to reduce issues", - "Display name of bluetooth scale and mac-address on connect", + "Básculas Bluetooth", + "Soporte para Eureka Precisa - Gracias a Mimoja", + "Elige el comportamiento de la báscula bluetooth en una nueva preparación - editable en configuración", + "Elige qué gráficos deben mostrarse en filtro o espresso - editable en configuración", + "Procesamiento secuencial de los comandos bluetooth para evitar errores", + "Ahora se muestran el nombre y la dirección MAC de la báscula al conectarse", "", - "Brews", - "Supports now milliseconds - Activate in settings", - "Filtersystem expanded, search for roast type and roastery", - "You can reconnect your bluetooth scale or pressure device on the brew add/edit page", + "Preparaciones", + "Añadido soporte para milisegundos - se puede activar en la configuración", + "Filtro de búsqueda mejorado, ahora se puede buscar por tipo de tueste y tostador", + "Ahora se puede reconectar la báscula o el dispositivo de presión en la página de añadir o editar preparación", "", - "Beans", - "Share your bean (without server needed) - Thanks to Mike", - "Show all brews to your bean", - "Support bean rating like for brews - editable in settings", + "Granos", + "Comparte tus granos (sin necesidad de servidor) - Gracias a Mike", + "Muestra todas las preparaciones asociadas a un grano", + "Añadido mismo tipo de puntuación que para las preparaciones - editable en la configuración", "", - "More languages", - "Support of Turkish - Thanks to Halil Portakal", - "Support of Chinese - Thanks to Jiageng", + "Más idiomas", + "Turco - Gracias a Halil Portakal", + "Chino (simplificado) - Gracias a Jiageng", "", - "Mills", - "Display of the last used grind setting, aswell as the last used bean", + "Molinos", + "Ahora se muestra el último ajuste y el último grano usados", "", - "Improvements", - "Error message when a bean is scanned, which has not been approved yet", - "The edit of the brew-date is not activated by default", + "Mejoras", + "Mensaje de error cuando se escanea un grano que todavía no ha sido aprobado", + "La opción de editar la hora de la preparación ahora viene desactivada por defecto", "", - "Others", - "Typos fixed", - "Fixed an issue that you didn't see the star-rating even with normal settings", - "Older brew graphics can now be exported again", - "Update to Ionic 6.3.0", - "Smaller bug fixes" + "Otros", + "Erratas corregidas", + "Corregido un error que no permitía ver algunas puntuaciones aún usando la configuración predeterminada", + "Se puede volver a exportar gráficos antiguos", + "Actualización a Ionic 6.3.0", + "Corrección de fallos menores" ] } }, @@ -799,26 +799,26 @@ "ENABLE_PREPARATION_CUSTOM_PARAMETERS": "Usar parámetro personalizado", "BEAN_ADD_ANOTHER_SORT": "Añadir más variedades", "BEAN_SORT": "Variedad", - "BEAN_SORT_INFORMATION": "Informacion de variedad", + "BEAN_SORT_INFORMATION": "Información de variedad", "BEAN_SORT_MORE_INFORMATION": "Más información", - "NAVIGATE_TO_PREPARATION_METHODS": "A los métodos de preparación", + "NAVIGATE_TO_PREPARATION_METHODS": "Ir a los métodos de preparación", "PREPARATION_TOOLS": "Herramientas para las preparaciones", "PREPARATION_TOOLS_INFORMATION": "Para los portafiltros, agregue su propio filtro. Con un V60 o Aeropress hay diferentes filtros de papel / tela / metal, etc.", "PREPARATION_TOOLS_PLACEHOLDER": "Filtro de papel, filtro de tela, VST-20g, 14g-malla, etc.", "PREPARATION_PARAMETERS_CUSTOMIZED": "Parámetros personalizados", "BEANS_WEIGHT_AVAILABLE": "Granos disponibles", - "SORT_ORDER": "Cambiar la clasificación", - "ASCENDING": "ascendente", - "DESCENDING": "descendente", + "SORT_ORDER": "Cambiar el orden", + "ASCENDING": "Ascendente", + "DESCENDING": "Descendente", "SORT_AFTER": "Ordenar por", "BEAN_SORT_NAME_OF_BEAN": "Nombre del grano", "BEAN_SORT_ROASTER": "Tostado por", - "BEAN_SORT_ROASTING_DATE": "Fecha de tostado", - "BEAN_TAB_ROAST_INFORMATION": "Información de tostado", + "BEAN_SORT_ROASTING_DATE": "Fecha de tueste", + "BEAN_TAB_ROAST_INFORMATION": "Información de tueste", "BEAN_TAB_GENERAL_INFORMATION": "General", "BEAN_TAB_SORT_INFORMATION": "Información sobre variedad", "PAGE_SETTINGS_MANAGE_ARCHIVE": "Administrar archivos", - "LAST_USE": "Usado recientemente", + "LAST_USE": "Último uso", "SEARCH": "Buscar", "OVERVIEW": "Visión general", "BEAN_HEADER_ADDITIONALE_INFORMATION": "Información adicional", @@ -845,15 +845,15 @@ } }, "EXCEL_EXPORT": "Exportar como Excel", - "HEALTH_KIT_QUESTION_TITLE": "Guardar en HealthKit", - "HEALTH_KIT_QUESTION_MESSAGE": "La activación almacena automáticamente la cantidad de cafeína consumida de cada preparación en Apple Health", + "HEALTH_KIT_QUESTION_TITLE": "¿Guardar en HealthKit?", + "HEALTH_KIT_QUESTION_MESSAGE": "Activar este parámetro permite a la aplicación registrar automáticamente la cantidad de cafeína consumida de cada preparación en Apple Health", "NAV_ROASTING_SECTION": "Tostar", "ROASTING_SECTION": { "NAV_GREEN_BEANS": "Café verde", "NAV_ROASTING_MACHINE": "Tostadora", "ROASTING_MACHINE": { "TOTAL_ROAST_QUANTITY": "Total tostado", - "TOTAL_ROAST_COUNT": "Tuestas" + "TOTAL_ROAST_COUNT": "Tuestes" }, "GREEN_BEAN": { "ADD": "Agregar", @@ -863,8 +863,8 @@ "NO_ROASTS_YET": "No se realizó ningún tostado" }, "BEAN": { - "DROP_TEMPERATURE": "Temperatura final de tostado", - "ROAST_LENGTH": "Tiempo de tostado", + "DROP_TEMPERATURE": "Temperatura final de tueste", + "ROAST_LENGTH": "Tiempo de tueste", "ROASTER_MACHINE": "Tostadora", "GREEN_BEAN_WEIGHT": "Peso del grano verde", "OUTSIDE_TEMPERATURE": "Temperatura ambiente", @@ -874,8 +874,8 @@ "SECOND_CRACK_MINUTE": "Minuto del segundo crack", "SECOND_CRACK_TEMPERATURE": "Temperatura del segundo crack", "PLACE_HOLDER": { - "DROP_TEMPERATURE": "Temperatura final de tostado (descarga)", - "ROAST_LENGTH": "Tiempo de tostado", + "DROP_TEMPERATURE": "Temperatura final de tueste (descarga)", + "ROAST_LENGTH": "Tiempo de tueste", "ROASTER_MACHINE": "Tostadora", "GREEN_BEAN_WEIGHT": "Peso del grano verde", "OUTSIDE_TEMPERATURE": "Temperatura ambiente", @@ -888,26 +888,26 @@ } }, "PAGE_SETTINGS_MANAGE_SECTIONS": "Otras configuraciones", - "PAGE_SETTINGS_SHOW_ROASTING_SECTION": "Activar sección de tostado", + "PAGE_SETTINGS_SHOW_ROASTING_SECTION": "Activar sección de tueste", "PAGE_SETTINGS_SHOW_WATER_SECTION": "Activar sección de agua", "PAGE_SETTINGS_SHOW_CUPPING_SECTION": "Activar sección de cata", "BEAN_DATA_BUY_DATE": "Fecha de compra", "BEAN_SORT_CREATION_DATE": "Fecha de creación", "BEAN_SORT_PURCHASE_DATE": "Fecha de compra", - "BEAN_ROAST_COUNT": "Tuestas", + "BEAN_ROAST_COUNT": "Tuestes", "TRANSFER_ROAST": "Tostar", - "BEAN_TAB_LINKED_ROASTS": "Tuestas", - "BEAN_DATA_WEIGHT_AFTER_ROASTING": "Peso después del tostado", + "BEAN_TAB_LINKED_ROASTS": "Tuestes", + "BEAN_DATA_WEIGHT_AFTER_ROASTING": "Peso después del tueste", "TOAST_GREEN_BEAN_ADDED_SUCCESSFULLY": "Grano verde añadido", "TOAST_GREEN_BEAN_EDITED_SUCCESSFULLY": "Grano verde editado", "TOAST_GREEN_BEAN_ARCHIVED_SUCCESSFULLY": "Grano verde archivado", "TOAST_ROASTING_MACHINE_ADDED_SUCCESSFULLY": "Agregar tostadora", "TOAST_ROASTING_MACHINE_EDITED_SUCCESSFULLY": "Editar tostadora", - "TOAST_ROASTING_MACHINE_ARCHIVED_SUCCESSFULLY": "Archivar tuesta", + "TOAST_ROASTING_MACHINE_ARCHIVED_SUCCESSFULLY": "Archivar tueste", "DELETE_ROASTING_MACHINE_QUESTION": "¿Eliminar la tostadora con todos los granos?", - "TOAST_ROASTING_MACHINE_DELETED_SUCCESSFULLY": "Tostadora eliminiada", + "TOAST_ROASTING_MACHINE_DELETED_SUCCESSFULLY": "Tostadora eliminada", "EDIT_ROASTING_MACHINE": "Editar", - "DETAIL_ROASTING_MACHINE": "Detalles de tostado", + "DETAIL_ROASTING_MACHINE": "Detalles de la tostadora", "DELETE_WATER_QUESTION": "¿Eliminar el agua? Todas las preparaciones a las que se hace referencia se actualizarán y no se eliminarán", "ROASTING_MACHINE": { "PLACE_HOLDER": { @@ -916,8 +916,8 @@ } }, "NAV_ROASTING_MACHINE": "Tostadora", - "PAGE_ROASTING_MACHINE_LIST_NO_MACHINES_EXISTING": "Todavía no has agregado ningúna tostadora.", - "PAGE_ROASTING_MACHINE_LIST_NO_ARCHIVED_MACHINES_EXISTING": "Aún no has archivado ningúna tostadora.", + "PAGE_ROASTING_MACHINE_LIST_NO_MACHINES_EXISTING": "Todavía no has agregado ninguna tostadora.", + "PAGE_ROASTING_MACHINE_LIST_NO_ARCHIVED_MACHINES_EXISTING": "Aún no has archivado ninguna tostadora.", "CHOOSE_ROASTING_MACHINES": "Seleccionar tostadoras", "CHOOSE_ROASTING_MACHINE": "Seleccionar tostadora", "POPOVER_BREWS_OPTION_TOGGLE_FAVOURITE": "Favorito", @@ -931,27 +931,27 @@ "STATISTIC_TAB_GENERAL": "General", "STATISTIC_TAB_BREWS": "Preparaciones", "STATISTIC_TAB_BEANS": "Granos", - "STATISTIC_TAB_PREPARATIONS": "Preparaciones", + "STATISTIC_TAB_PREPARATIONS": "Métodos", "STATISTIC_TAB_GRINDERS": "Molinos", - "PAGE_STATISTICS_BREW_PER_DAYPROCESSES": "Preparaciones al dia", + "PAGE_STATISTICS_BREW_PER_DAYPROCESSES": "Preparaciones al día", "PAGE_STATISTICS_BREW_TIME": "Tiempo de preparación", "PAGE_STATISTICS_PHOTOS_TAKEN": "Fotos tomadas", "PAGE_SETTINGS_IMAGE_QUALITY": "Calidad de la imagen", - "PAGE_SETTINGS_IMAGE_QUALITY_TOOLTIP": "Defina qué calidad deben tener sus imágenes. Esto te permite reducir tu uso de datos.", - "PAGE_SETTINGS_BREW_RATING": "Calificación de preparación", - "PAGE_SETTINGS_BREW_RATING_TOOLTIP": "¿De -1 a 5 es demasiado pequeño para calificar tu preparación? Puede configurar hasta 100 'puntos'.", + "PAGE_SETTINGS_IMAGE_QUALITY_TOOLTIP": "Defina qué calidad deben tener sus imágenes. Esto permite reducir el uso de datos.", + "PAGE_SETTINGS_BREW_RATING": "Puntuación de preparación", + "PAGE_SETTINGS_BREW_RATING_TOOLTIP": "¿De -1 a 5 es demasiado poco para puntuar tu preparación? Puedes configurar hasta 100 'puntos'.", "UPDATE_ENTRY_OF": "Actualizar entrada {{index}} de {{count}}", - "WEBSITE": "Sitio web", + "WEBSITE": "Página web", "SHARE": "Compartir", "ANDROID_FILE_ACCESS_NEEDED_TITLE": "Se requiere acceso a archivos compartidos", - "ANDROID_FILE_ACCESS_NEEDED_DESCRIPTION": "Para que la aplicación funcione completamente, te pedimos que autorices el acceso a los archivos. De lo contrario, habrá mala conducta dentro de la aplicación. Esto es especialmente necesario para el sistema de respaldo automático.", + "ANDROID_FILE_ACCESS_NEEDED_DESCRIPTION": "Para que la aplicación funcione completamente, te pedimos que autorices el acceso a los archivos. De lo contrario, la aplicación no funcionará correctamente. Esto es especialmente necesario para las copias de seguridad automáticas.", "COULD_NOT_ACCESS_FILE": "No pudimos acceder al archivo elegido", "WRONG_FILE_FORMAT": "Has elegido un formato de archivo no admitido", "SCAN_BEAN": "Escanear paquete", "CLEAR": "Limpiar", "BEAN_LOOKS_LIKE_CONSUMED": "El paquete de granos parece haber sido consumido, ¿desea archivarlo ahora?", "CUPPING_1": "Frutas", - "CUPPING_2": "Citricos", + "CUPPING_2": "Cítricos", "CUPPING_3": "Limón y limonada", "CUPPING_4": "Lima", "CUPPING_5": "Pomelo / toronja", @@ -972,7 +972,7 @@ "CUPPING_20": "Uva roja", "CUPPING_21": "Uva concordia", "CUPPING_22": "Fruta tropical", - "CUPPING_23": "Lychee", + "CUPPING_23": "Lichi", "CUPPING_24": "Carambola / fruta estrella", "CUPPING_25": "Tamarindo", "CUPPING_26": "Maracuyá", @@ -982,7 +982,7 @@ "CUPPING_30": "Kiwi", "CUPPING_31": "Banana / plátano", "CUPPING_32": "Coco", - "CUPPING_33": "Fruta de hueso / de partir", + "CUPPING_33": "Fruta de hueso", "CUPPING_34": "Durazno", "CUPPING_35": "Nectarina", "CUPPING_36": "Albaricoque", @@ -1017,7 +1017,7 @@ "CUPPING_65": "Pacana", "CUPPING_66": "Avellana", "CUPPING_67": "Almendra", - "CUPPING_68": "Grano y Creal", + "CUPPING_68": "Grano y cereal", "CUPPING_69": "Pastelería de pan dulce", "CUPPING_70": "Granola", "CUPPING_71": "Graham cracker", @@ -1027,13 +1027,13 @@ "CUPPING_75": "Pan fresco", "CUPPING_76": "Dulce y azucarado", "CUPPING_77": "Vainilla", - "CUPPING_78": "Turrón / Nougat", + "CUPPING_78": "Turrón", "CUPPING_79": "Miel", "CUPPING_80": "Mantequilla", "CUPPING_81": "Crema", - "CUPPING_82": "Malvavisco / Marshallow", + "CUPPING_82": "Malvavisco", "CUPPING_83": "Caña de azúcar", - "CUPPING_84": "Azúcar morena / rubia", + "CUPPING_84": "Azúcar moreno / rubia", "CUPPING_85": "Azúcar tostada", "CUPPING_86": "Miel de maple", "CUPPING_87": "Melaza / chancaca", @@ -1060,7 +1060,7 @@ "CUPPING_108": "Salsa de soja / soya", "CUPPING_109": "Tomate secado al sol", "CUPPING_110": "Tomate", - "CUPPING_111": "Vegetal terroso hierba", + "CUPPING_111": "Vegetal, terroso y hierba", "CUPPING_112": "Tierra", "CUPPING_113": "Madera fresca", "CUPPING_114": "Cedro", @@ -1143,84 +1143,84 @@ "CUPPING_BREW_TAB_AROMA": "Aroma", "CUPPING_BREW_TAB_TASTING": "Cata sistemática", "WATER_PLACEHOLDER": "Para una función completa, active la sección de agua en el menú de configuración", - "PAGE_SETTINGS_SCALES": "Balanza", - "CONNECT": "Connectar", + "PAGE_SETTINGS_SCALES": "Báscula", + "CONNECT": "Conectar", "DISCONNECT": "Desconectar", "SCALE": { - "BLUETOOTH_SCAN_RUNNING": "Se buscará la balanza durante 60 segundos, espere", - "BLUETOOTH_NOT_ENABLED": "Bluetooth no activado, actívelo para que funcione correctamente", - "CONNECTION_NOT_ESTABLISHED": "No se encontró la balanza o no se pudo establecer la conexión", - "CONNECTED_SUCCESSFULLY": "Balanza conectada", - "DISCONNECTED_SUCCESSFULLY": "Balanza desconectada", - "DISCONNECTED_UNPLANNED": "Balanza desconectada no planificada", + "BLUETOOTH_SCAN_RUNNING": "Se buscará la báscula durante 60 segundos, espere", + "BLUETOOTH_NOT_ENABLED": "Bluetooth desactivado, actívelo para que funcione correctamente", + "CONNECTION_NOT_ESTABLISHED": "No se encontró la báscula o no se pudo establecer la conexión", + "CONNECTED_SUCCESSFULLY": "Báscula conectada", + "DISCONNECTED_SUCCESSFULLY": "Báscula desconectada", + "DISCONNECTED_UNPLANNED": "Desconexión no planificada de la báscula", "REQUEST_PERMISSION": { - "LOCATION": "Para encontrar balanzas bluetooth, la aplicación necesita acceder a la ubicación.", - "BLUETOOTH": "Para encontrar balanzas bluetooth, la aplicación necesita acceso a bluetooth" + "LOCATION": "Para encontrar básculas bluetooth, la aplicación necesita acceder a la ubicación.", + "BLUETOOTH": "Para encontrar básculas bluetooth, la aplicación necesita acceso al bluetooth" }, - "INFORMATION_DESCRIPTION": "Básculas compatibles: Decent Scale y Acaia Scales y Felicita Scales y Hiroia Jimmy y Eureka Precisa. Care: If the Eureka Precisa recieves a negative value, the timer stops" + "INFORMATION_DESCRIPTION": "Básculas compatibles: Decent, Acaia, Felicita, Hiroia Jimmy y Eureka Precise. Atención: Si la báscula Eureka Precise recibe un valor negativo, el temporizador se detiene" }, "QR": { - "WRONG_QRCODE_DESCRIPTION": "Código qr incorrecto o contenido incorrecto", + "WRONG_QRCODE_DESCRIPTION": "Código QR incorrecto o contenido incorrecto", "WRONG_QRCODE_TITLE": "Error", "WRONG_LINK_DESCRIPTION": "Enlace de aplicación incorrecto", "WRONG_LINK_TITLE": "Error", "SERVER": { - "ERROR_OCCURED": "Se ha producido un error, no se pudo leer el código qr, inténtalo de nuevo.", - "BEAN_NOT_APPROVED": "Bean has not been approved yet,please try later again" + "ERROR_OCCURED": "Se ha producido un error, no se pudo leer el código QR, inténtelo de nuevo.", + "BEAN_NOT_APPROVED": "El grano no ha sido aprobado todavía, inténtelo de nuevo." }, "BEAN_SUCCESSFULLY_SCANNED": "Grano escaneado correctamente", "BEAN_SUCCESSFULLY_REFRESHED": "Grano actualizado con éxito", "IMAGES_GETTING_DOWNLOADED": "Se están descargando imágenes" }, "RETRY_CONNECT": "Reintentar la conexión", - "SMART_SCALE_STAY_CONNECTED_ON_APP_MINIMIZE": "Deja que la balanza esté conectada incluso cuando la aplicación esté minimizada / inactiva", + "SMART_SCALE_STAY_CONNECTED_ON_APP_MINIMIZE": "Permitir que la báscula esté conectada incluso cuando la aplicación esté en segundo plano", "BREW_FLOW_WEIGHT": "Peso", - "BREW_FLOW_WEIGHT_PER_SECOND": "Fujo", - "ROAST_TYPE_UNKNOWN":"Desconocido", - "ROAST_TYPE_CINNAMON_ROAST":"Tueste canela (claro/Cinnamon) ", - "ROAST_TYPE_AMERICAN_ROAST":"Tueste Americano", - "ROAST_TYPE_NEW_ENGLAND_ROAST":"Tueste New England", - "ROAST_TYPE_HALF_CITY_ROAST":"Tueste Half City", - "ROAST_TYPE_MODERATE_LIGHT_ROAST":"Tueste claro moderado (Moderate-Light) ", - "ROAST_TYPE_CITY_ROAST":"Tueste City", - "ROAST_TYPE_CITY_PLUS_ROAST":"Tueste City+", - "ROAST_TYPE_FULL_CITY_ROAST":"Tueste Full City", - "ROAST_TYPE_FULL_CITY_PLUS_ROAST":"Tueste Full City +", - "ROAST_TYPE_ITALIAN_ROAST":"Tueste Italiano", - "ROAST_TYPE_VIEANNA_ROAST":"Tueste Vienes", - "ROAST_TYPE_FRENCH_ROAST":"Tueste Frances", - "ROAST_TYPE_CUSTOM_ROAST":"Individual", - "BEAN_MIX_UNKNOWN":"Desconocido", - "BEAN_MIX_SINGLE_ORIGIN":"Orígen único", - "BEAN_MIX_BLEND":"Blend", - "BEAN_ROASTING_TYPE_FILTER":"Filtrado", - "BEAN_ROASTING_TYPE_ESPRESSO":"Espresso", - "BEAN_ROASTING_TYPE_OMNI":"Omni", - "BEAN_ROASTING_TYPE_UNKNOWN":"Desconocido", - "SMART_SCALE_LOG": "Activar los ficheros de log para balanzas inteligentes (Unicamente se usaran los logs para el debug de la aplicación).", - "TOAST_PREPARATION_TOOL_EDITED_SUCCESSFULLY": "Herramientas de preparaccion editadas", - "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE": "Balanza Bluetooth", + "BREW_FLOW_WEIGHT_PER_SECOND": "Flujo", + "ROAST_TYPE_UNKNOWN": "Desconocido", + "ROAST_TYPE_CINNAMON_ROAST": "Tueste canela (claro/Cinnamon) ", + "ROAST_TYPE_AMERICAN_ROAST": "Tueste americano", + "ROAST_TYPE_NEW_ENGLAND_ROAST": "Tueste New England", + "ROAST_TYPE_HALF_CITY_ROAST": "Tueste Half City", + "ROAST_TYPE_MODERATE_LIGHT_ROAST": "Tueste claro moderado (Moderate-Light) ", + "ROAST_TYPE_CITY_ROAST": "Tueste City", + "ROAST_TYPE_CITY_PLUS_ROAST": "Tueste City+", + "ROAST_TYPE_FULL_CITY_ROAST": "Tueste Full City", + "ROAST_TYPE_FULL_CITY_PLUS_ROAST": "Tueste Full City +", + "ROAST_TYPE_ITALIAN_ROAST": "Tueste italiano", + "ROAST_TYPE_VIEANNA_ROAST": "Tueste vienés", + "ROAST_TYPE_FRENCH_ROAST": "Tueste francés", + "ROAST_TYPE_CUSTOM_ROAST": "Personalizado", + "BEAN_MIX_UNKNOWN": "Desconocido", + "BEAN_MIX_SINGLE_ORIGIN": "Origen único", + "BEAN_MIX_BLEND": "Blend", + "BEAN_ROASTING_TYPE_FILTER": "Filtro", + "BEAN_ROASTING_TYPE_ESPRESSO": "Espresso", + "BEAN_ROASTING_TYPE_OMNI": "Omni", + "BEAN_ROASTING_TYPE_UNKNOWN": "Desconocido", + "SMART_SCALE_LOG": "Activar los ficheros de log para básculas inteligentes (únicamente se usarán los logs para depurar la aplicación).", + "TOAST_PREPARATION_TOOL_EDITED_SUCCESSFULLY": "Herramientas de preparación editadas", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE": "Báscula Bluetooth", "PAGE_SETTINGS_TAB_GENERAL": "General", - "SMART_SCALE_TARE_ON_BREW": "Tarar balanza en la nueva preparacion", - "SMART_SCALE_TARE_ON_START_TIMER": "Tarar balanza al iniciar el temporizador", - "PAGE_SETTINGS_BREW_RATING_STEPS": "Pasos de calificación", + "SMART_SCALE_TARE_ON_BREW": "Tarar báscula en la nueva preparación", + "SMART_SCALE_TARE_ON_START_TIMER": "Tarar báscula al iniciar el temporizador", + "PAGE_SETTINGS_BREW_RATING_STEPS": "Intervalos de puntuación de preparaciones", "BREW_AVG_FLOW_WEIGHT_PER_SECOND": "Ø Flujo", "CUSTOM_LIST_VIEW_PARAMETERS": "Parámetros de vista de lista", "NAV_LIST_VIEW_CUSTOM_PARAMETERS": "Parámetros de vista de lista", - "PAGE_LIST_VIEW_CUSTOM_PARAMETERS_DESCRIPTION": "Decide qué parámetro de la preparación del café debe mostrarse en los mosaicos de vista de lista", + "PAGE_LIST_VIEW_CUSTOM_PARAMETERS_DESCRIPTION": "Decide qué parámetros de la preparación del café deben mostrarse en los mosaicos de vista de lista", "BREW_DATA_VESSEL_NAME_WEIGHT": "Recipiente nombre/peso", "IGNORE_NEGATIVE_VALUES": "Ignorar valores de peso negativos", "IGNORE_ANOMALY_VALUES": "Ignorar valores anómalos", - "IGNORE_ANOMALY_VALUES_TOOLTIP": "Por ejemplo: Revolver una taza en la balanza", + "IGNORE_ANOMALY_VALUES_TOOLTIP": "Por ejemplo: Revolver una taza en la báscula", "TOAST_BEAN_FAVOURITE_ADDED": "Agregar favorito", "TOAST_BEAN_FAVOURITE_REMOVED": "Eliminar favorito", "QR_CODE_SCANNER_INFORMATION_TITLE": "Código QR", - "QR_CODE_SCANNER_INFORMATION_DESCRIPTION": "Toda la información escaneada del grano proviene directamente de la torrefacción.
Si encuentras información incorrecta o engañosa, infórmame por correo electrónico: info@beanconqueror.com.", + "QR_CODE_SCANNER_INFORMATION_DESCRIPTION": "Toda la información escaneada del grano proviene directamente del tostador.
Si encuentras información incorrecta o engañosa, infórmame por correo electrónico: info@beanconqueror.com.", "DONT_SHOW_AGAIN": "No volver a mostrar", "ARCHIVED_TOOLS": "Herramientas archivadas", "UNARCHIVE": "Restaurar", - "PAGE_SETTINGS_HIDE_ARCHIVED_BREWS_DASHBOARD": "Mostrar preparaciones archivadas en el escritorio", - "PAGE_SETTINGS_HIDE_ARCHIVED_BREWS_DASHBOARD_DESCRIPTION": "Mostrar preparaciones archivadas en el inicio?", + "PAGE_SETTINGS_HIDE_ARCHIVED_BREWS_DASHBOARD": "Mostrar preparaciones archivadas en la página principal", + "PAGE_SETTINGS_HIDE_ARCHIVED_BREWS_DASHBOARD_DESCRIPTION": "¿Mostrar preparaciones archivadas en el inicio?", "COPY": "Copiar", "TOAST_PREPARATION_METHOD_REPEATED_SUCCESSFULLY": "Método de preparación copiado con éxito", "PREPARATION_TYPE_CAFEC_FLOWER": "Cafec Flower", @@ -1228,46 +1228,46 @@ "PREPARATION_TYPE_DECENT_ESPRESSO": "Decent Espresso", "PREPARATION_TYPE_HARIO_SWITCH": "Hario Switch", "PREPARATION_TYPE_HARIO_WOODNECK": "Hario Woodneck", - "PREPARATION_TYPE_RATIO_SIX_COFFEE_BREWER": "Ratio Six Coffee Brewer", + "PREPARATION_TYPE_RATIO_SIX_COFFEE_BREWER": "Ratio Six", "PREPARATION_TYPE_ROK": "ROK", "PREPARATION_TYPE_TORNADO_DUO": "Tornado Duo", "PREPARATION_TYPE_TRICOLATE": "Tricolate", - "QR_CODE_REFRESH_DATA_MESSAGE": "Toda la información del bean se sobrescribirá, ¿empezar ahora?", + "QR_CODE_REFRESH_DATA_MESSAGE": "Toda la información del grano se sobrescribirá, ¿empezar ahora?", "POPOVER_QR_CODE_REFRESH": "Recargar datos", - "BREW_FLOW_WEIGHT_REALTIME": "Fujo (tiempo real)", - "SMART_SCALE_STOP_TIMER_ON_BREW": "Stop scale timer on new brew", - "SMART_SCALE_RESET_TIMER_ON_BREW": "Reset scale timer on new brew", - "BREW_PRESSURE_FLOW": "Pressure", - "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_FILTER": "Show graphs for filter", - "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_ESPRESSO": "Show graphs for espresso", - "PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE": "Pressure device", - "PRESSURE_LOG": "Activate logfiles for pressure device", - "PRESSURE_THRESHOLD_ACTIVE": "Start timer with predefined pressure", - "PRESSURE_THRESHOLD_BAR": "Threshold pressure", - "TIMER_MILLISECONDS": "MS", - "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS": "Milliseconds?", - "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Use milliseconds to even more accurately analyze your brews", - "PAGE_SETTINGS_BEAN_RATING": "Bean rating", - "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "Is the default '0 to 5' not the right rating for you? You can instead use a '0 to 100' scale", - "PAGE_SETTINGS_BEAN_RATING_STEPS": "Bean rating steps", - "COFFEE_GRAMS_BREWED": "Grams brewed", - "SMART_SCALE_MAXIMIZE_ON_START_TIMER": "Maximize realtime graphic on timer start", + "BREW_FLOW_WEIGHT_REALTIME": "Flujo (tiempo real)", + "SMART_SCALE_STOP_TIMER_ON_BREW": "Detener temporizador de la báscula con una nueva preparación", + "SMART_SCALE_RESET_TIMER_ON_BREW": "Resetear temporizador con una nueva preparación", + "BREW_PRESSURE_FLOW": "Presión", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_FILTER": "Mostrar gráficos para filtro", + "PAGE_SETTINGS_TAB_BLUETOOTH_SCALE_SHOW_GRAPHS_ESPRESSO": "Mostrar gráficos para espresso", + "PAGE_SETTINGS_TAB_BLUETOOTH_PRESSURE": "Dispositivo de presión", + "PRESSURE_LOG": "Activar archivos de log para dispositivos de presión", + "PRESSURE_THRESHOLD_ACTIVE": "Iniciar temporizador al llegar a una presión predefinida", + "PRESSURE_THRESHOLD_BAR": "Umbral de presión", + "TIMER_MILLISECONDS": "ms", + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS": "¿Milisegundos?", + "PAGE_SETTINGS_BREW_ENABLE_MILLISECONDS_DESCRIPTION": "Usar milisegundos para analizar con más detalle tus preparaciones", + "PAGE_SETTINGS_BEAN_RATING": "Puntuación de los granos", + "PAGE_SETTINGS_BEAN_RATING_TOOLTIP": "¿Te parece poco puntuar de 0 a 5? Puedes habilitar una escala de '0 a 100'", + "PAGE_SETTINGS_BEAN_RATING_STEPS": "Intervalos de puntuación de granos", + "COFFEE_GRAMS_BREWED": "Gramos consumidos", + "SMART_SCALE_MAXIMIZE_ON_START_TIMER": "Poner gráfico en tiempo real a pantalla completa cuando se inicie el temporizador", "PRESSURE": { - "CONNECTION_NOT_ESTABLISHED": "Pressure device not found found or connection could not be established", - "CONNECTED_SUCCESSFULLY": "Pressure device connected", - "DISCONNECTED_SUCCESSFULLY": "Pressure device disconnected", - "DISCONNECTED_UNPLANNED": "Pressure device disconnected unplanned", - "INFORMATION_DESCRIPTION": "Supported devices are: Popsicle", - "BLUETOOTH_SCAN_RUNNING": "Pressure device will be searched for 60 seconds, please wait", - "BLUETOOTH_NOT_ENABLED": "Bluetooth not activated, please activate to work properly", + "CONNECTION_NOT_ESTABLISHED": "No se encontró el dispositivo de presión o no se pudo establecer conexión", + "CONNECTED_SUCCESSFULLY": "Dispositivo presión conectado", + "DISCONNECTED_SUCCESSFULLY": "Dispositivo de presión desconectado", + "DISCONNECTED_UNPLANNED": "Desconexión no planificada del dispositivo de presión", + "INFORMATION_DESCRIPTION": "Dispositivos soportados: PRS y Popsicle", + "BLUETOOTH_SCAN_RUNNING": "Se buscará el dispositivo de presión durante 60 segundos, espere", + "BLUETOOTH_NOT_ENABLED": "Bluetooth desactivado, actívelo para que funcione correctamente", "REQUEST_PERMISSION": { - "LOCATION": "To find pressure devices, the app needs access to the location.", - "BLUETOOTH": "To find pressure devices, the app needs access to bluetooth" + "LOCATION": "Para encontrar dispositivos de presión, la aplicación necesita acceder a la ubicación.", + "BLUETOOTH": "Para encontrar dispositivos de presión, la aplicación necesita acceso al bluetooth." } }, - "POPOVER_BLUETOOTH_ACTION_RECONNECT_SCALE": "Reconnect scale", - "POPOVER_BLUETOOTH_ACTION_RECONNECT_PRESSURE_DEVICE": "Reconnect pressure device", - "POPOVER_SHOW_BREWS": "Show brews", - "LAST_USED_GRIND_SIZE_SETTING": "Last grind setting", - "LAST_USED_BEAN": "Last bean" + "POPOVER_BLUETOOTH_ACTION_RECONNECT_SCALE": "Reconectar báscula", + "POPOVER_BLUETOOTH_ACTION_RECONNECT_PRESSURE_DEVICE": "Reconectar dispositivo de presión", + "POPOVER_SHOW_BREWS": "Mostrar preparaciones", + "LAST_USED_GRIND_SIZE_SETTING": "Último ajuste", + "LAST_USED_BEAN": "Último grano" } From 52883d8a69d30f7b05149ad1e2dd49f599300a05 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 23 Oct 2022 16:04:54 +0200 Subject: [PATCH 71/78] Fix filter to fixing decimal numbers --- .../bean-filter/bean-filter.component.html | 2 +- .../bean-filter/bean-filter.component.ts | 2 +- .../brew-filter/brew-filter.component.html | 2 +- .../brew/brew-filter/brew-filter.component.ts | 128 ++++++++++-------- 4 files changed, 72 insertions(+), 62 deletions(-) diff --git a/src/app/beans/bean-filter/bean-filter.component.html b/src/app/beans/bean-filter/bean-filter.component.html index 47d1e299b..78e03ede1 100644 --- a/src/app/beans/bean-filter/bean-filter.component.html +++ b/src/app/beans/bean-filter/bean-filter.component.html @@ -45,7 +45,7 @@
{{"BREW_DATA_RATING" | translate }} {{filter.rating.lower}} - {{filter.rating.upper}} + style="vertical-align: top;">{{this.uiHelper.toFixedIfNecessary(filter.rating.lower,2)}} - {{this.uiHelper.toFixedIfNecessary(filter.rating.upper,2)}} diff --git a/src/app/beans/bean-filter/bean-filter.component.ts b/src/app/beans/bean-filter/bean-filter.component.ts index 8cf7e9f8e..6e9c8c4a6 100644 --- a/src/app/beans/bean-filter/bean-filter.component.ts +++ b/src/app/beans/bean-filter/bean-filter.component.ts @@ -37,7 +37,7 @@ export class BeanFilterComponent implements OnInit { private readonly modalController: ModalController, private readonly uiBrewHelper: UIBrewHelper, private readonly navParams: NavParams, - private readonly uiHelper: UIHelper, + public readonly uiHelper: UIHelper, private readonly uiSettingsStorage: UISettingsStorage, private readonly uiPreparationStorage: UIPreparationStorage, private readonly uiBeanStorage: UIBeanStorage, diff --git a/src/app/brew/brew-filter/brew-filter.component.html b/src/app/brew/brew-filter/brew-filter.component.html index 895d62aa9..e619fa59f 100644 --- a/src/app/brew/brew-filter/brew-filter.component.html +++ b/src/app/brew/brew-filter/brew-filter.component.html @@ -46,7 +46,7 @@ {{"BREW_DATA_RATING" | translate }} {{filter.rating.lower}} - {{filter.rating.upper}} + style="vertical-align: top;">{{this.uiHelper.toFixedIfNecessary(filter.rating.lower,2)}} - {{this.uiHelper.toFixedIfNecessary(filter.rating.upper,2)}} diff --git a/src/app/brew/brew-filter/brew-filter.component.ts b/src/app/brew/brew-filter/brew-filter.component.ts index a8e9daa55..659591bab 100644 --- a/src/app/brew/brew-filter/brew-filter.component.ts +++ b/src/app/brew/brew-filter/brew-filter.component.ts @@ -1,19 +1,19 @@ -import {Component, OnInit} from '@angular/core'; -import {ModalController, NavParams} from '@ionic/angular'; -import {UIBrewHelper} from '../../../services/uiBrewHelper'; -import {UIHelper} from '../../../services/uiHelper'; -import {UISettingsStorage} from '../../../services/uiSettingsStorage'; -import {IBrewPageFilter} from '../../../interfaces/brew/iBrewPageFilter'; -import {UIPreparationStorage} from '../../../services/uiPreparationStorage'; -import {UIMillStorage} from '../../../services/uiMillStorage'; -import {UIBeanStorage} from '../../../services/uiBeanStorage'; -import {Bean} from '../../../classes/bean/bean'; -import {Mill} from '../../../classes/mill/mill'; -import {Preparation} from '../../../classes/preparation/preparation'; -import {Settings} from '../../../classes/settings/settings'; -import {PreparationTool} from '../../../classes/preparation/preparationTool'; -import {UIBrewStorage} from '../../../services/uiBrewStorage'; -import {Brew} from '../../../classes/brew/brew'; +import { Component, OnInit } from '@angular/core'; +import { ModalController, NavParams } from '@ionic/angular'; +import { UIBrewHelper } from '../../../services/uiBrewHelper'; +import { UIHelper } from '../../../services/uiHelper'; +import { UISettingsStorage } from '../../../services/uiSettingsStorage'; +import { IBrewPageFilter } from '../../../interfaces/brew/iBrewPageFilter'; +import { UIPreparationStorage } from '../../../services/uiPreparationStorage'; +import { UIMillStorage } from '../../../services/uiMillStorage'; +import { UIBeanStorage } from '../../../services/uiBeanStorage'; +import { Bean } from '../../../classes/bean/bean'; +import { Mill } from '../../../classes/mill/mill'; +import { Preparation } from '../../../classes/preparation/preparation'; +import { Settings } from '../../../classes/settings/settings'; +import { PreparationTool } from '../../../classes/preparation/preparationTool'; +import { UIBrewStorage } from '../../../services/uiBrewStorage'; +import { Brew } from '../../../classes/brew/brew'; @Component({ selector: 'brew-filter', @@ -30,22 +30,22 @@ export class BrewFilterComponent implements OnInit { public mills: Array = []; public segment: string = 'open'; - constructor(private readonly modalController: ModalController, - private readonly uiBrewHelper: UIBrewHelper, - private readonly navParams: NavParams, - private readonly uiHelper: UIHelper, - private readonly uiSettingsStorage: UISettingsStorage, - private readonly uiPreparationStorage: UIPreparationStorage, - private readonly uiBeanStorage: UIBeanStorage, - private readonly uiMillStorage: UIMillStorage, - private readonly uiBrewStorage: UIBrewStorage) { - + constructor( + private readonly modalController: ModalController, + private readonly uiBrewHelper: UIBrewHelper, + private readonly navParams: NavParams, + public readonly uiHelper: UIHelper, + private readonly uiSettingsStorage: UISettingsStorage, + private readonly uiPreparationStorage: UIPreparationStorage, + private readonly uiBeanStorage: UIBeanStorage, + private readonly uiMillStorage: UIMillStorage, + private readonly uiBrewStorage: UIBrewStorage + ) { this.settings = this.uiSettingsStorage.getSettings(); this.filter = this.settings.GET_BREW_FILTER(); } public ngOnInit() { - this.segment = this.navParams.get('segment'); this.filter = this.uiHelper.copyData(this.navParams.get('brew_filter')); this.__reloadFilterSettings(); @@ -55,26 +55,32 @@ export class BrewFilterComponent implements OnInit { const isOpen = this.segment === 'open'; let brewsFiltered: Array = []; if (isOpen) { - brewsFiltered = this.uiBrewStorage.getAllEntries().filter((e) => - e.getBean().finished === !isOpen && - e.getMill().finished === !isOpen && - e.getPreparation().finished === !isOpen + brewsFiltered = this.uiBrewStorage + .getAllEntries() + .filter( + (e) => + e.getBean().finished === !isOpen && + e.getMill().finished === !isOpen && + e.getPreparation().finished === !isOpen + ); + } else { + brewsFiltered = this.uiBrewStorage + .getAllEntries() + .filter( + (e) => + e.getBean().finished === !isOpen || + e.getMill().finished === !isOpen || + e.getPreparation().finished === !isOpen ); - } - else { - brewsFiltered = this.uiBrewStorage.getAllEntries().filter((e) => - e.getBean().finished === !isOpen || - e.getMill().finished === !isOpen || - e.getPreparation().finished === !isOpen - ); } let maxBrewRating = maxSettingsRating; if (brewsFiltered.length > 0) { - const maxRating = brewsFiltered.reduce((p, c) => p.rating > c.rating ? p : c); + const maxRating = brewsFiltered.reduce((p, c) => + p.rating > c.rating ? p : c + ); maxBrewRating = maxRating.rating; } - if (maxBrewRating > maxSettingsRating) { return maxBrewRating; } @@ -83,12 +89,10 @@ export class BrewFilterComponent implements OnInit { public hasPreparationTools() { for (const uuid of this.filter.method_of_preparation) { - const preparation = this.uiPreparationStorage.getByUUID(uuid); if (preparation.tools.length > 0) { return true; } - } return false; } @@ -98,56 +102,62 @@ export class BrewFilterComponent implements OnInit { } public getPreparationTools() { - const preparationTools: { name: string, tool: PreparationTool }[] = []; + const preparationTools: { name: string; tool: PreparationTool }[] = []; for (const uuid of this.filter.method_of_preparation) { - - const preparation: Preparation = this.uiPreparationStorage.getByUUID(uuid); + const preparation: Preparation = + this.uiPreparationStorage.getByUUID(uuid); if (preparation.tools.length > 0) { for (const tool of preparation.tools) { preparationTools.push({ - name:preparation.name, - tool: tool + name: preparation.name, + tool: tool, }); } - } - } return preparationTools; } public dismiss(): void { this.modalController.dismiss({ - brew_filter: undefined + brew_filter: undefined, }); } public useFilter() { this.modalController.dismiss({ - brew_filter: this.uiHelper.copyData(this.filter) + brew_filter: this.uiHelper.copyData(this.filter), }); } public resetFilter() { this.filter = this.settings.GET_BREW_FILTER(); - this.modalController.dismiss({ - brew_filter: this.uiHelper.copyData(this.filter) - },undefined,BrewFilterComponent.COMPONENT_ID); + this.modalController.dismiss( + { + brew_filter: this.uiHelper.copyData(this.filter), + }, + undefined, + BrewFilterComponent.COMPONENT_ID + ); } - private __reloadFilterSettings() { - this.method_of_preparations = this.uiPreparationStorage.getAllEntries() + this.method_of_preparations = this.uiPreparationStorage + .getAllEntries() .sort((a, b) => a.name.localeCompare(b.name)); - this.beans = this.uiBeanStorage.getAllEntries() + this.beans = this.uiBeanStorage + .getAllEntries() .sort((a, b) => a.name.localeCompare(b.name)); - this.mills = this.uiMillStorage.getAllEntries() + this.mills = this.uiMillStorage + .getAllEntries() .sort((a, b) => a.name.localeCompare(b.name)); if (this.segment === 'open') { this.beans = this.beans.filter((e) => e.finished === false); this.mills = this.mills.filter((e) => e.finished === false); - this.method_of_preparations = this.method_of_preparations.filter((e) => e.finished === false); + this.method_of_preparations = this.method_of_preparations.filter( + (e) => e.finished === false + ); } else { this.beans = this.beans.filter((e) => e.finished === true); } From d69bc6def568e94f3df24afea963d82b1309726f Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sun, 23 Oct 2022 17:00:47 +0200 Subject: [PATCH 72/78] Formatting temperature time and blooming time, aswell as fixing blooming change event --- src/classes/brew/brew.ts | 67 +++++++++++++++++++ .../brew-information.component.html | 4 +- .../brew-brewing/brew-brewing.component.ts | 2 +- 3 files changed, 70 insertions(+), 3 deletions(-) diff --git a/src/classes/brew/brew.ts b/src/classes/brew/brew.ts index 96c546d8a..d88dfa0b8 100755 --- a/src/classes/brew/brew.ts +++ b/src/classes/brew/brew.ts @@ -398,6 +398,73 @@ export class Brew implements IBrew { return formatted; } + public getFormattedTotalCoffeeTemperatureTime(): string { + const secs = this.brew_temperature_time; + + const millisecondsEnabled: boolean = + this.getSettingsStorageInstance().getSettings().brew_milliseconds; + let formatted = ''; + if (millisecondsEnabled) { + formatted = moment + .utc(secs * 1000) + .add('milliseconds', this.brew_temperature_time_milliseconds) + .format('mm:ss.SSS'); + } else { + formatted = moment + .utc(secs * 1000) + .add('milliseconds', this.brew_temperature_time_milliseconds) + .format('mm:ss'); + } + + if (moment.utc(secs * 1000).hours() > 0) { + if (millisecondsEnabled) { + formatted = moment + .utc(secs * 1000) + .add('milliseconds', this.brew_temperature_time_milliseconds) + .format('HH:mm:ss.SSS'); + } else { + formatted = moment + .utc(secs * 1000) + .add('milliseconds', this.brew_temperature_time_milliseconds) + .format('HH:mm:ss'); + } + } + return formatted; + } + public getFormattedTotalCoffeeBloomingTime(): string { + const secs = this.coffee_blooming_time; + + const millisecondsEnabled: boolean = + this.getSettingsStorageInstance().getSettings().brew_milliseconds; + let formatted = ''; + if (millisecondsEnabled) { + formatted = moment + .utc(secs * 1000) + .add('milliseconds', this.coffee_blooming_time_milliseconds) + .format('mm:ss.SSS'); + } else { + formatted = moment + .utc(secs * 1000) + .add('milliseconds', this.coffee_blooming_time_milliseconds) + .format('mm:ss'); + } + + if (moment.utc(secs * 1000).hours() > 0) { + if (millisecondsEnabled) { + formatted = moment + .utc(secs * 1000) + .add('milliseconds', this.coffee_blooming_time_milliseconds) + .format('HH:mm:ss.SSS'); + } else { + formatted = moment + .utc(secs * 1000) + .add('milliseconds', this.coffee_blooming_time_milliseconds) + .format('HH:mm:ss'); + } + } + return formatted; + } + public getFormattedBrewTime(): string { const secs = this.brew_time; let formattingStr: string = 'HH:mm:ss'; diff --git a/src/components/brew-information/brew-information.component.html b/src/components/brew-information/brew-information.component.html index 788a4b604..abfdc347f 100644 --- a/src/components/brew-information/brew-information.component.html +++ b/src/components/brew-information/brew-information.component.html @@ -114,13 +114,13 @@ brew.getPreparation().visible_list_view_parameters.brew_temperature_time, brew.getPreparation().use_custom_parameters)"> {{"BREW_DATA_TEMPERATURE_TIME" | translate}}
- {{brew?.brew_temperature_time}} + {{brew?.getFormattedTotalCoffeeTemperatureTime()}} {{"BREW_DATA_COFFEE_BLOOMING_TIME" | translate}}
- {{brew?.coffee_blooming_time}} + {{brew?.getFormattedTotalCoffeeBloomingTime()}}
Dispositivos de presión
", - "Añadido soporte para sensor PRS", "Añadido soporte para sensor 'Do it yourself' Popsicle - Gracias a Mike y Shay", "Inicio automático del temporizador al llegar a cierta presión - editable en la configuración", "Presionar el manómetro resetea la presión a 0.", @@ -1257,7 +1256,7 @@ "CONNECTED_SUCCESSFULLY": "Dispositivo presión conectado", "DISCONNECTED_SUCCESSFULLY": "Dispositivo de presión desconectado", "DISCONNECTED_UNPLANNED": "Desconexión no planificada del dispositivo de presión", - "INFORMATION_DESCRIPTION": "Dispositivos soportados: PRS y Popsicle", + "INFORMATION_DESCRIPTION": "Dispositivos soportados: Popsicle", "BLUETOOTH_SCAN_RUNNING": "Se buscará el dispositivo de presión durante 60 segundos, espere", "BLUETOOTH_NOT_ENABLED": "Bluetooth desactivado, actívelo para que funcione correctamente", "REQUEST_PERMISSION": { From 57d7fda91f5d5100f360fbdad9f501d5c731671c Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sat, 29 Oct 2022 13:29:29 +0200 Subject: [PATCH 74/78] Update to 6.3.3 ionic --- README.md | 2 +- package-lock.json | 42 +++++++++++++++++++++--------------------- package.json | 2 +- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 4324cb28f..b7a51ff8f 100755 --- a/README.md +++ b/README.md @@ -205,7 +205,7 @@ https://stackoverflow.com/questions/60357663/do-apple-app-site-association-files ### Upgrade Ionic if needed: -`npm install @ionic/angular@6.3.1` +`npm install @ionic/angular@6.3.3` -> Or the actual active version ### Installing AAB on your android (mac) diff --git a/package-lock.json b/package-lock.json index 49600795d..6360c73d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "@ionic-native/splash-screen": "^5.33.1", "@ionic-native/status-bar": "^5.33.1", "@ionic-native/three-dee-touch": "^5.33.1", - "@ionic/angular": "^6.3.2", + "@ionic/angular": "^6.3.3", "@ionic/cli": "^6.18.1", "@ionic/storage": "^2.3.1", "@ngx-translate/core": "^11.0.1", @@ -4349,11 +4349,11 @@ } }, "node_modules/@ionic/angular": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.3.2.tgz", - "integrity": "sha512-DbG5PKuk/i+7XweWqrpre+2NbkNZoa1AhEJQjeVgwYqKBXvkR4ZlQXPxHif9AAta093Xjt2uKgU2/0R8kh6lyQ==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.3.3.tgz", + "integrity": "sha512-GY8rBWIhhdqF7Nkby+413/4xWVySh0otAgDkrweSZ0zEGAw+KZQGQtv9OUcguI1tnVZd8JWHDD7S4myDOOpTBA==", "dependencies": { - "@ionic/core": "^6.3.2", + "@ionic/core": "^6.3.3", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" }, @@ -7744,9 +7744,9 @@ } }, "node_modules/@ionic/core": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.2.tgz", - "integrity": "sha512-L4xqJyixmGApwYc5fQgGoK80wXGCrbjL8vGfeNbjYqxxP0ZIKGAhURPoMAtSTqLLK9gdhh4Mv6gw4gNKvxodPA==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.3.tgz", + "integrity": "sha512-I7eRsni/3blStScsQcITb4seuunNzS4mIK0GxHljeRRb8oQI9Xy/oP4rq9weo9lsuEVD0sHIqBIS7/Oo9iEymQ==", "dependencies": { "@stencil/core": "^2.18.0", "ionicons": "^6.0.3", @@ -8720,9 +8720,9 @@ "dev": true }, "node_modules/@stencil/core": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.18.1.tgz", - "integrity": "sha512-/fXkh1lwZ+X9JQCw50mPjhBogzEHOBvVC5pLoDLZqodVYK0DGWILM2YLV4dcIUBNEK8/HMDpO/Rq81/rS3mNOw==", + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.19.2.tgz", + "integrity": "sha512-TK3sHqyQAACwcac4fWntypFtN9c/y+y9ioZojeCnNDY3dxF33Ax70lL9ZLDyQnWWR+aTh1WFoqB5sYOnZIUKMA==", "bin": { "stencil": "bin/stencil" }, @@ -31803,11 +31803,11 @@ } }, "@ionic/angular": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.3.2.tgz", - "integrity": "sha512-DbG5PKuk/i+7XweWqrpre+2NbkNZoa1AhEJQjeVgwYqKBXvkR4ZlQXPxHif9AAta093Xjt2uKgU2/0R8kh6lyQ==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.3.3.tgz", + "integrity": "sha512-GY8rBWIhhdqF7Nkby+413/4xWVySh0otAgDkrweSZ0zEGAw+KZQGQtv9OUcguI1tnVZd8JWHDD7S4myDOOpTBA==", "requires": { - "@ionic/core": "^6.3.2", + "@ionic/core": "^6.3.3", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" } @@ -34275,9 +34275,9 @@ } }, "@ionic/core": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.2.tgz", - "integrity": "sha512-L4xqJyixmGApwYc5fQgGoK80wXGCrbjL8vGfeNbjYqxxP0ZIKGAhURPoMAtSTqLLK9gdhh4Mv6gw4gNKvxodPA==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.3.tgz", + "integrity": "sha512-I7eRsni/3blStScsQcITb4seuunNzS4mIK0GxHljeRRb8oQI9Xy/oP4rq9weo9lsuEVD0sHIqBIS7/Oo9iEymQ==", "requires": { "@stencil/core": "^2.18.0", "ionicons": "^6.0.3", @@ -35042,9 +35042,9 @@ } }, "@stencil/core": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.18.1.tgz", - "integrity": "sha512-/fXkh1lwZ+X9JQCw50mPjhBogzEHOBvVC5pLoDLZqodVYK0DGWILM2YLV4dcIUBNEK8/HMDpO/Rq81/rS3mNOw==" + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.19.2.tgz", + "integrity": "sha512-TK3sHqyQAACwcac4fWntypFtN9c/y+y9ioZojeCnNDY3dxF33Ax70lL9ZLDyQnWWR+aTh1WFoqB5sYOnZIUKMA==" }, "@stylelint/postcss-css-in-js": { "version": "0.37.2", diff --git a/package.json b/package.json index 8016e4269..327641cab 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "@ionic-native/splash-screen": "^5.33.1", "@ionic-native/status-bar": "^5.33.1", "@ionic-native/three-dee-touch": "^5.33.1", - "@ionic/angular": "^6.3.2", + "@ionic/angular": "^6.3.3", "@ionic/cli": "^6.18.1", "@ionic/storage": "^2.3.1", "@ngx-translate/core": "^11.0.1", From 2bec150fb8ffb2023d7ed9a5962df786fffa21fc Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sat, 29 Oct 2022 14:06:23 +0200 Subject: [PATCH 75/78] update --- package-lock.json | 12 ++++++------ package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6360c73d6..b8f8e3ff1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@angular/platform-browser": "^14.1.0", "@angular/platform-browser-dynamic": "^14.1.0", "@angular/router": "^14.1.0", - "@graphefruit/coffee-bluetooth-devices": "file:../../graphefruit-coffee-bluetooth-devices-0.0.33.tgz", + "@graphefruit/coffee-bluetooth-devices": "file:../../graphefruit-coffee-bluetooth-devices-0.0.1.tgz", "@ionic-native/android-permissions": "^5.33.1", "@ionic-native/app-minimize": "^5.33.1", "@ionic-native/app-version": "^5.33.1", @@ -4062,9 +4062,9 @@ "dev": true }, "node_modules/@graphefruit/coffee-bluetooth-devices": { - "version": "0.0.33", - "resolved": "file:../../graphefruit-coffee-bluetooth-devices-0.0.33.tgz", - "integrity": "sha512-ceUrFrvdTf6fP9UhIRcUxQHBoaRsdQdNsKmeCHCdX4fQfWqqjjsOdyuTLNI4d1atV+u0wL0GOMH/CDk1zoxEZw==", + "version": "0.0.1", + "resolved": "file:../../graphefruit-coffee-bluetooth-devices-0.0.1.tgz", + "integrity": "sha512-t2r/5HfegTUqoKUNITdthLdCpKJZBGlZ/5qdLilFAKGoAgEpYg2ifHeTDsU2CyRtt+YOkc7ofoOFPGn2IP27Mg==", "dependencies": { "tslib": "^2.3.0" }, @@ -31612,8 +31612,8 @@ "dev": true }, "@graphefruit/coffee-bluetooth-devices": { - "version": "file:../../graphefruit-coffee-bluetooth-devices-0.0.33.tgz", - "integrity": "sha512-ceUrFrvdTf6fP9UhIRcUxQHBoaRsdQdNsKmeCHCdX4fQfWqqjjsOdyuTLNI4d1atV+u0wL0GOMH/CDk1zoxEZw==", + "version": "file:../../graphefruit-coffee-bluetooth-devices-0.0.1.tgz", + "integrity": "sha512-t2r/5HfegTUqoKUNITdthLdCpKJZBGlZ/5qdLilFAKGoAgEpYg2ifHeTDsU2CyRtt+YOkc7ofoOFPGn2IP27Mg==", "requires": { "tslib": "^2.3.0" } diff --git a/package.json b/package.json index 327641cab..930cf5132 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "@angular/platform-browser": "^14.1.0", "@angular/platform-browser-dynamic": "^14.1.0", "@angular/router": "^14.1.0", - "@graphefruit/coffee-bluetooth-devices": "file:../../graphefruit-coffee-bluetooth-devices-0.0.33.tgz", + "@graphefruit/coffee-bluetooth-devices": "file:../../graphefruit-coffee-bluetooth-devices-0.0.1.tgz", "@ionic-native/android-permissions": "^5.33.1", "@ionic-native/app-minimize": "^5.33.1", "@ionic-native/app-version": "^5.33.1", From e7134d13568ff39215c7bbf6f0a2a593cf832801 Mon Sep 17 00:00:00 2001 From: Graphefruit Date: Sat, 29 Oct 2022 21:07:52 +0200 Subject: [PATCH 76/78] Fixing waiting sppiners for share, fixing first drip time, fixing milliseconds excel export --- src/app/settings/settings.page.ts | 26 ++++++++++++-- src/classes/brew/brew.ts | 34 +++++++++++++++++++ .../brew-information.component.html | 2 +- .../brew-information.component.ts | 22 ++++++------ .../brew-brewing/brew-brewing.component.ts | 2 +- src/services/uiExcel.ts | 8 ++--- 6 files changed, 74 insertions(+), 20 deletions(-) diff --git a/src/app/settings/settings.page.ts b/src/app/settings/settings.page.ts index f1b15692e..44b81b1a2 100644 --- a/src/app/settings/settings.page.ts +++ b/src/app/settings/settings.page.ts @@ -280,7 +280,14 @@ export class SettingsPage implements OnInit { return; } - await this.uiAlert.showLoadingSpinner(); + await new Promise(async (resolve) => { + // Give some time + await this.uiAlert.showLoadingSpinner(); + setTimeout(async () => { + resolve(undefined); + }, 50); + }); + this.uiAlert.setLoadingSpinnerMessage('SCALE.BLUETOOTH_SCAN_RUNNING', true); const scale = await this.bleManager.tryToFindScale(); if (scale) { @@ -291,6 +298,14 @@ export class SettingsPage implements OnInit { this.bleManager.autoConnectScale(scale.type, scale.id, false); } catch (ex) {} + await new Promise(async (resolve) => { + // Give some time + setTimeout(async () => { + await this.uiAlert.hideLoadingSpinner(); + resolve(undefined); + }, 50); + }); + this.settings.scale_id = scale.id; this.settings.scale_type = scale.type; @@ -320,9 +335,14 @@ export class SettingsPage implements OnInit { break; } } - await this.uiAlert.hideLoadingSpinner(); } else { - await this.uiAlert.hideLoadingSpinner(); + await new Promise(async (resolve) => { + // Give some time + setTimeout(async () => { + await this.uiAlert.hideLoadingSpinner(); + resolve(undefined); + }, 50); + }); this.uiAlert.showMessage( 'SCALE.CONNECTION_NOT_ESTABLISHED', undefined, diff --git a/src/classes/brew/brew.ts b/src/classes/brew/brew.ts index d88dfa0b8..ba2d3608b 100755 --- a/src/classes/brew/brew.ts +++ b/src/classes/brew/brew.ts @@ -465,6 +465,40 @@ export class Brew implements IBrew { return formatted; } + public getFormattedTotalCoffeeFirstDripTime(): string { + const secs = this.coffee_first_drip_time; + + const millisecondsEnabled: boolean = + this.getSettingsStorageInstance().getSettings().brew_milliseconds; + let formatted = ''; + if (millisecondsEnabled) { + formatted = moment + .utc(secs * 1000) + .add('milliseconds', this.coffee_first_drip_time_milliseconds) + .format('mm:ss.SSS'); + } else { + formatted = moment + .utc(secs * 1000) + .add('milliseconds', this.coffee_first_drip_time_milliseconds) + .format('mm:ss'); + } + + if (moment.utc(secs * 1000).hours() > 0) { + if (millisecondsEnabled) { + formatted = moment + .utc(secs * 1000) + .add('milliseconds', this.coffee_first_drip_time_milliseconds) + .format('HH:mm:ss.SSS'); + } else { + formatted = moment + .utc(secs * 1000) + .add('milliseconds', this.coffee_first_drip_time_milliseconds) + .format('HH:mm:ss'); + } + } + return formatted; + } + public getFormattedBrewTime(): string { const secs = this.brew_time; let formattingStr: string = 'HH:mm:ss'; diff --git a/src/components/brew-information/brew-information.component.html b/src/components/brew-information/brew-information.component.html index abfdc347f..237dcaf54 100644 --- a/src/components/brew-information/brew-information.component.html +++ b/src/components/brew-information/brew-information.component.html @@ -126,7 +126,7 @@ brew.getPreparation().visible_list_view_parameters.coffee_first_drip_time, brew.getPreparation().use_custom_parameters)"> {{"BREW_DATA_COFFEE_FIRST_DRIP_TIME" | translate}}
- {{brew?.coffee_first_drip_time}} + {{brew?.getFormattedTotalCoffeeFirstDripTime()}} + Beanconqueror Lars Saalbach diff --git a/src/components/brews/brew-brewing/brew-brewing.component.ts b/src/components/brews/brew-brewing/brew-brewing.component.ts index b9830184a..0727751ee 100644 --- a/src/components/brews/brew-brewing/brew-brewing.component.ts +++ b/src/components/brews/brew-brewing/brew-brewing.component.ts @@ -282,7 +282,7 @@ export class BrewBrewingComponent implements OnInit, AfterViewInit { } } if (connectTriggered) { - if (!this.flowProfileChartEl) { + if (this.flowProfileChartEl === undefined) { this.initializeFlowChart(); } } diff --git a/src/services/serverCommunication/server-communication.service.ts b/src/services/serverCommunication/server-communication.service.ts index 82016e5dd..082e0e3dd 100644 --- a/src/services/serverCommunication/server-communication.service.ts +++ b/src/services/serverCommunication/server-communication.service.ts @@ -18,8 +18,7 @@ export class ServerCommunicationService { const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', - Authorization: - 'Basic ' + btoa('account@beanconqueror.com:q5gsZM9Pbte2FEb'), + Authorization: 'Basic ' + btoa('123:1234'), }), }; this.http diff --git a/src/services/uiBeanHelper.ts b/src/services/uiBeanHelper.ts index 373f51fd4..ca43da9f0 100644 --- a/src/services/uiBeanHelper.ts +++ b/src/services/uiBeanHelper.ts @@ -133,7 +133,6 @@ export class UIBeanHelper { } public async addScannedQRBean(_scannedQRBean: ServerBean) { - console.log(_scannedQRBean.error); if (_scannedQRBean.error === null) { this.uiAnalytics.trackEvent( QR_TRACKING.TITLE,