ngx-scandoc 0.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/core/app.worker.d.ts +1 -0
  2. package/core/components/base.component.d.ts +6 -0
  3. package/core/components/camera-switch/camera-switch.component.d.ts +11 -0
  4. package/core/components/components.module.d.ts +15 -0
  5. package/core/components/scan/scan.component.d.ts +120 -0
  6. package/core/components/scan-results/scan-results.component.d.ts +20 -0
  7. package/core/components/webcam/domain/webcam-image.d.ts +35 -0
  8. package/core/components/webcam/domain/webcam-init-error.d.ts +4 -0
  9. package/core/components/webcam/domain/webcam-mirror-properties.d.ts +3 -0
  10. package/core/components/webcam/util/webcam.util.d.ts +8 -0
  11. package/core/components/webcam/webcam/webcam.component.d.ts +205 -0
  12. package/core/components/webcam/webcam.module.d.ts +9 -0
  13. package/core/interfaces/config.d.ts +16 -0
  14. package/core/pipes/pipes.module.d.ts +7 -0
  15. package/core/pipes/safeResourceUrl.pipe.d.ts +10 -0
  16. package/core/shared/material.module.d.ts +28 -0
  17. package/dialogs/components/blank/blank.component.d.ts +16 -0
  18. package/dialogs/components/confirm/confirm.component.d.ts +30 -0
  19. package/dialogs/components/loading/loading.component.d.ts +5 -0
  20. package/dialogs/components/scan-profile/scan-profile.component.d.ts +18 -0
  21. package/dialogs/components/scan-selfie/scan-selfie.component.d.ts +83 -0
  22. package/dialogs/components/turn-document/turn-document.component.d.ts +12 -0
  23. package/dialogs/dialogs.core.provider.d.ts +18 -0
  24. package/dialogs/dialogs.module.d.ts +21 -0
  25. package/esm2020/core/app.worker.mjs +236 -0
  26. package/esm2020/core/components/base.component.mjs +15 -0
  27. package/esm2020/core/components/camera-switch/camera-switch.component.mjs +22 -0
  28. package/esm2020/core/components/components.module.mjs +46 -0
  29. package/esm2020/core/components/scan/scan.component.mjs +587 -0
  30. package/esm2020/core/components/scan-results/scan-results.component.mjs +38 -0
  31. package/esm2020/core/components/webcam/domain/webcam-image.mjs +58 -0
  32. package/esm2020/core/components/webcam/domain/webcam-init-error.mjs +3 -0
  33. package/esm2020/core/components/webcam/domain/webcam-mirror-properties.mjs +3 -0
  34. package/esm2020/core/components/webcam/util/webcam.util.mjs +48 -0
  35. package/esm2020/core/components/webcam/webcam/webcam.component.mjs +867 -0
  36. package/esm2020/core/components/webcam/webcam.module.mjs +22 -0
  37. package/esm2020/core/interfaces/config.mjs +2 -0
  38. package/esm2020/core/pipes/pipes.module.mjs +19 -0
  39. package/esm2020/core/pipes/safeResourceUrl.pipe.mjs +20 -0
  40. package/esm2020/core/shared/material.module.mjs +162 -0
  41. package/esm2020/dialogs/components/blank/blank.component.mjs +46 -0
  42. package/esm2020/dialogs/components/confirm/confirm.component.mjs +53 -0
  43. package/esm2020/dialogs/components/loading/loading.component.mjs +12 -0
  44. package/esm2020/dialogs/components/scan-profile/scan-profile.component.mjs +48 -0
  45. package/esm2020/dialogs/components/scan-selfie/scan-selfie.component.mjs +392 -0
  46. package/esm2020/dialogs/components/turn-document/turn-document.component.mjs +32 -0
  47. package/esm2020/dialogs/dialogs.core.provider.mjs +109 -0
  48. package/esm2020/dialogs/dialogs.module.mjs +89 -0
  49. package/esm2020/forms/form.module.mjs +87 -0
  50. package/esm2020/forms/types/avatar.type.mjs +53 -0
  51. package/esm2020/forms/types/profile.image.type.mjs +54 -0
  52. package/esm2020/forms/types/title.type.mjs +60 -0
  53. package/esm2020/lib/ngx-scandoc.module.mjs +28 -11
  54. package/esm2020/providers/auth.provider.mjs +58 -0
  55. package/esm2020/providers/camera.provider.mjs +40 -0
  56. package/esm2020/providers/interceptor.provider.mjs +61 -0
  57. package/esm2020/providers/layout.provider.mjs +28 -0
  58. package/esm2020/providers/scan.form.mjs +386 -0
  59. package/esm2020/providers/scan.provider.mjs +488 -0
  60. package/esm2020/providers/translation.provider.mjs +50 -0
  61. package/esm2020/providers/webrtc.provider.mjs +58 -0
  62. package/esm2020/public-api.mjs +24 -4
  63. package/fesm2015/ngx-scandoc.mjs +4190 -31
  64. package/fesm2015/ngx-scandoc.mjs.map +1 -1
  65. package/fesm2020/ngx-scandoc.mjs +4166 -31
  66. package/fesm2020/ngx-scandoc.mjs.map +1 -1
  67. package/forms/form.module.d.ts +18 -0
  68. package/forms/types/avatar.type.d.ts +14 -0
  69. package/forms/types/profile.image.type.d.ts +14 -0
  70. package/forms/types/title.type.d.ts +12 -0
  71. package/lib/ngx-scandoc.module.d.ts +6 -2
  72. package/package.json +6 -2
  73. package/providers/auth.provider.d.ts +21 -0
  74. package/providers/camera.provider.d.ts +17 -0
  75. package/providers/interceptor.provider.d.ts +13 -0
  76. package/providers/layout.provider.d.ts +11 -0
  77. package/providers/scan.form.d.ts +13 -0
  78. package/providers/scan.provider.d.ts +237 -0
  79. package/providers/translation.provider.d.ts +9 -0
  80. package/providers/webrtc.provider.d.ts +11 -0
  81. package/public-api.d.ts +23 -3
  82. package/esm2020/lib/ngx-scandoc.component.mjs +0 -22
  83. package/esm2020/lib/ngx-scandoc.service.mjs +0 -14
  84. package/lib/ngx-scandoc.component.d.ts +0 -8
  85. package/lib/ngx-scandoc.service.d.ts +0 -6
@@ -0,0 +1,38 @@
1
+ import { Component, EventEmitter, Input, Output, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../../providers/camera.provider";
4
+ import * as i2 from "../../../providers/scan.form";
5
+ import * as i3 from "@angular/common";
6
+ import * as i4 from "@angular/forms";
7
+ import * as i5 from "@angular/material/card";
8
+ import * as i6 from "@angular/material/button";
9
+ import * as i7 from "@ngx-formly/core";
10
+ export class ScanResultsComponent {
11
+ constructor(cameraProvider, formProvider) {
12
+ this.cameraProvider = cameraProvider;
13
+ this.formProvider = formProvider;
14
+ this.action = new EventEmitter();
15
+ }
16
+ ngOnInit() {
17
+ this.fields = this.formProvider.document();
18
+ }
19
+ ngOnDestroy() { }
20
+ selfie() {
21
+ this.action.emit({ selfie: true });
22
+ }
23
+ }
24
+ ScanResultsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScanResultsComponent, deps: [{ token: i1.NgxScandocCameraProvider }, { token: i2.ScanFieldsProvider }], target: i0.ɵɵFactoryTarget.Component });
25
+ ScanResultsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ScanResultsComponent, selector: "ngx-scan-results", inputs: { model: "model", images: "images", form: "form" }, outputs: { action: "action" }, ngImport: i0, template: "<div class=\"wraper\">\n <div style=\"flex: 1\">\n <mat-card style=\"margin: 4px; padding: 4px 16px\">\n <h3>Avatar</h3>\n <div class=\"selfieContainer\">\n <div class=\"selfie\">\n <img *ngIf=\"model?._avatar\" class=\"preview\" [src]=\"model._avatar\" />\n </div>\n <button (click)=\"selfie()\" mat-raised-button>Take selfie</button>\n </div>\n </mat-card>\n\n <form\n fxLayout=\"row\"\n fxLayoutAlign=\"start center\"\n class=\"px-16 py-0 w-100-p\"\n [formGroup]=\"form\"\n >\n <formly-form\n ngClass.lt-md=\"mobile\"\n fxFlex\n [form]=\"form\"\n [fields]=\"fields\"\n [model]=\"model\"\n >\n </formly-form>\n </form>\n </div>\n <div style=\"flex: 1\" class=\"pr-16 m-4\">\n <mat-card style=\"margin: 4px; padding-top: 2px\" class=\"images\">\n <h3>Images</h3>\n <ng-container *ngFor=\"let img of images\">\n <div fxLayout=\"column\">\n <ng-container *ngIf=\"img.side === 0\">\n <div class=\"title\">Front Side</div>\n </ng-container>\n <ng-container *ngIf=\"img.side === 1\">\n <div class=\"title\">Back Side</div>\n </ng-container>\n <img\n class=\"preview\"\n style=\"max-width: 460px; border-radius: 1rem\"\n [src]=\"img.data\"\n />\n </div>\n </ng-container>\n </mat-card>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column!important;flex:1;overflow:hidden}.images .title{padding:8px 0;font-weight:600}.images img{margin-bottom:16px;width:100%}.wraper{padding:8px 8px 0 0;overflow:auto;flex:1;display:flex;flex-direction:row}mat-card{box-shadow:none!important}.selfieContainer{display:flex;flex-direction:row;align-items:center}.selfieContainer .selfie{width:150px}.selfieContainer .selfie .preview{width:120px;height:120px;border-radius:80px}.selfieContainer .button{box-shadow:none;border:1px solid rgba(0,0,0,.1)}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i5.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "component", type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] });
26
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScanResultsComponent, decorators: [{
27
+ type: Component,
28
+ args: [{ selector: 'ngx-scan-results', template: "<div class=\"wraper\">\n <div style=\"flex: 1\">\n <mat-card style=\"margin: 4px; padding: 4px 16px\">\n <h3>Avatar</h3>\n <div class=\"selfieContainer\">\n <div class=\"selfie\">\n <img *ngIf=\"model?._avatar\" class=\"preview\" [src]=\"model._avatar\" />\n </div>\n <button (click)=\"selfie()\" mat-raised-button>Take selfie</button>\n </div>\n </mat-card>\n\n <form\n fxLayout=\"row\"\n fxLayoutAlign=\"start center\"\n class=\"px-16 py-0 w-100-p\"\n [formGroup]=\"form\"\n >\n <formly-form\n ngClass.lt-md=\"mobile\"\n fxFlex\n [form]=\"form\"\n [fields]=\"fields\"\n [model]=\"model\"\n >\n </formly-form>\n </form>\n </div>\n <div style=\"flex: 1\" class=\"pr-16 m-4\">\n <mat-card style=\"margin: 4px; padding-top: 2px\" class=\"images\">\n <h3>Images</h3>\n <ng-container *ngFor=\"let img of images\">\n <div fxLayout=\"column\">\n <ng-container *ngIf=\"img.side === 0\">\n <div class=\"title\">Front Side</div>\n </ng-container>\n <ng-container *ngIf=\"img.side === 1\">\n <div class=\"title\">Back Side</div>\n </ng-container>\n <img\n class=\"preview\"\n style=\"max-width: 460px; border-radius: 1rem\"\n [src]=\"img.data\"\n />\n </div>\n </ng-container>\n </mat-card>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column!important;flex:1;overflow:hidden}.images .title{padding:8px 0;font-weight:600}.images img{margin-bottom:16px;width:100%}.wraper{padding:8px 8px 0 0;overflow:auto;flex:1;display:flex;flex-direction:row}mat-card{box-shadow:none!important}.selfieContainer{display:flex;flex-direction:row;align-items:center}.selfieContainer .selfie{width:150px}.selfieContainer .selfie .preview{width:120px;height:120px;border-radius:80px}.selfieContainer .button{box-shadow:none;border:1px solid rgba(0,0,0,.1)}\n"] }]
29
+ }], ctorParameters: function () { return [{ type: i1.NgxScandocCameraProvider }, { type: i2.ScanFieldsProvider }]; }, propDecorators: { model: [{
30
+ type: Input
31
+ }], images: [{
32
+ type: Input
33
+ }], form: [{
34
+ type: Input
35
+ }], action: [{
36
+ type: Output
37
+ }] } });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nhbi1yZXN1bHRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zY2FuZG9jL3NyYy9jb3JlL2NvbXBvbmVudHMvc2Nhbi1yZXN1bHRzL3NjYW4tcmVzdWx0cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2NhbmRvYy9zcmMvY29yZS9jb21wb25lbnRzL3NjYW4tcmVzdWx0cy9zY2FuLXJlc3VsdHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBR1osS0FBSyxFQUdMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7O0FBV3ZCLE1BQU0sT0FBTyxvQkFBb0I7SUFPL0IsWUFDUyxjQUF3QyxFQUN2QyxZQUFnQztRQURqQyxtQkFBYyxHQUFkLGNBQWMsQ0FBMEI7UUFDdkMsaUJBQVksR0FBWixZQUFZLENBQW9CO1FBSmhDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBS25DLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFRCxXQUFXLEtBQVUsQ0FBQztJQUV0QixNQUFNO1FBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNyQyxDQUFDOztpSEFwQlUsb0JBQW9CO3FHQUFwQixvQkFBb0IsbUpDcEJqQyx1OENBaURBOzJGRDdCYSxvQkFBb0I7a0JBTmhDLFNBQVM7K0JBQ0Usa0JBQWtCO2dKQU1uQixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFDSSxNQUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5neFNjYW5kb2NDYW1lcmFQcm92aWRlciB9IGZyb20gJy4uLy4uLy4uL3Byb3ZpZGVycy9jYW1lcmEucHJvdmlkZXInO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2NhbkZpZWxkc1Byb3ZpZGVyIH0gZnJvbSAnLi4vLi4vLi4vcHJvdmlkZXJzL3NjYW4uZm9ybSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1zY2FuLXJlc3VsdHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2Nhbi1yZXN1bHRzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2Nhbi1yZXN1bHRzLmNvbXBvbmVudC5zY3NzJ10sXG4gIC8vICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2NhblJlc3VsdHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIG1vZGVsOiBhbnk7XG4gIEBJbnB1dCgpIGltYWdlczogYW55O1xuICBmaWVsZHM6IGFueTtcbiAgQElucHV0KCkgZm9ybSE6IEZvcm1Hcm91cDtcbiAgQE91dHB1dCgpIGFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY2FtZXJhUHJvdmlkZXI6IE5neFNjYW5kb2NDYW1lcmFQcm92aWRlcixcbiAgICBwcml2YXRlIGZvcm1Qcm92aWRlcjogU2NhbkZpZWxkc1Byb3ZpZGVyXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpZWxkcyA9IHRoaXMuZm9ybVByb3ZpZGVyLmRvY3VtZW50KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHt9XG5cbiAgc2VsZmllKCkge1xuICAgIHRoaXMuYWN0aW9uLmVtaXQoeyBzZWxmaWU6IHRydWUgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ3cmFwZXJcIj5cbiAgPGRpdiBzdHlsZT1cImZsZXg6IDFcIj5cbiAgICA8bWF0LWNhcmQgc3R5bGU9XCJtYXJnaW46IDRweDsgcGFkZGluZzogNHB4IDE2cHhcIj5cbiAgICAgIDxoMz5BdmF0YXI8L2gzPlxuICAgICAgPGRpdiBjbGFzcz1cInNlbGZpZUNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZmllXCI+XG4gICAgICAgICAgPGltZyAqbmdJZj1cIm1vZGVsPy5fYXZhdGFyXCIgY2xhc3M9XCJwcmV2aWV3XCIgW3NyY109XCJtb2RlbC5fYXZhdGFyXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cInNlbGZpZSgpXCIgbWF0LXJhaXNlZC1idXR0b24+VGFrZSBzZWxmaWU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWF0LWNhcmQ+XG5cbiAgICA8Zm9ybVxuICAgICAgZnhMYXlvdXQ9XCJyb3dcIlxuICAgICAgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiXG4gICAgICBjbGFzcz1cInB4LTE2IHB5LTAgdy0xMDAtcFwiXG4gICAgICBbZm9ybUdyb3VwXT1cImZvcm1cIlxuICAgID5cbiAgICAgIDxmb3JtbHktZm9ybVxuICAgICAgICBuZ0NsYXNzLmx0LW1kPVwibW9iaWxlXCJcbiAgICAgICAgZnhGbGV4XG4gICAgICAgIFtmb3JtXT1cImZvcm1cIlxuICAgICAgICBbZmllbGRzXT1cImZpZWxkc1wiXG4gICAgICAgIFttb2RlbF09XCJtb2RlbFwiXG4gICAgICA+XG4gICAgICA8L2Zvcm1seS1mb3JtPlxuICAgIDwvZm9ybT5cbiAgPC9kaXY+XG4gIDxkaXYgc3R5bGU9XCJmbGV4OiAxXCIgY2xhc3M9XCJwci0xNiBtLTRcIj5cbiAgICA8bWF0LWNhcmQgc3R5bGU9XCJtYXJnaW46IDRweDsgcGFkZGluZy10b3A6IDJweFwiIGNsYXNzPVwiaW1hZ2VzXCI+XG4gICAgICA8aDM+SW1hZ2VzPC9oMz5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGltZyBvZiBpbWFnZXNcIj5cbiAgICAgICAgPGRpdiBmeExheW91dD1cImNvbHVtblwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbWcuc2lkZSA9PT0gMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+RnJvbnQgU2lkZTwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbWcuc2lkZSA9PT0gMVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+QmFjayBTaWRlPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPGltZ1xuICAgICAgICAgICAgY2xhc3M9XCJwcmV2aWV3XCJcbiAgICAgICAgICAgIHN0eWxlPVwibWF4LXdpZHRoOiA0NjBweDsgYm9yZGVyLXJhZGl1czogMXJlbVwiXG4gICAgICAgICAgICBbc3JjXT1cImltZy5kYXRhXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbWF0LWNhcmQ+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Container class for a captured webcam image
3
+ * @author basst314, davidshen84
4
+ */
5
+ export class WebcamImage {
6
+ constructor(imageAsDataUrl, mimeType, imageData, resized) {
7
+ this._mimeType = mimeType;
8
+ this._imageAsDataUrl = imageAsDataUrl;
9
+ this._imageData = imageData;
10
+ this._imageResized = resized;
11
+ }
12
+ /**
13
+ * Extracts the Base64 data out of the given dataUrl.
14
+ * @param dataUrl the given dataUrl
15
+ * @param mimeType the mimeType of the data
16
+ */
17
+ static getDataFromDataUrl(dataUrl, mimeType) {
18
+ return dataUrl.replace(`data:${mimeType};base64,`, '');
19
+ }
20
+ /**
21
+ * Get the base64 encoded image data
22
+ * @returns base64 data of the image
23
+ */
24
+ get imageAsBase64() {
25
+ return this._imageAsBase64
26
+ ? this._imageAsBase64
27
+ : (this._imageAsBase64 = WebcamImage.getDataFromDataUrl(this._imageAsDataUrl, this._mimeType));
28
+ }
29
+ /**
30
+ * Get the encoded image as dataUrl
31
+ * @returns the dataUrl of the image
32
+ */
33
+ get imageAsDataUrl() {
34
+ return this._imageAsDataUrl;
35
+ }
36
+ /**
37
+ * Get the ImageData object associated with the canvas' 2d context.
38
+ * @returns the ImageData of the canvas's 2d context.
39
+ */
40
+ get imageData() {
41
+ return this._imageData;
42
+ }
43
+ get imageResized() {
44
+ return this._imageResized;
45
+ }
46
+ get dataUrl() {
47
+ const canvas = document.createElement('canvas');
48
+ const { width, height } = this._imageData;
49
+ canvas.width = width;
50
+ canvas.height = height;
51
+ const ctx = canvas.getContext('2d');
52
+ if (ctx) {
53
+ ctx.putImageData(this._imageData, 0, 0);
54
+ }
55
+ return canvas.toDataURL(this._mimeType, 1);
56
+ }
57
+ }
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViY2FtLWltYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNjYW5kb2Mvc3JjL2NvcmUvY29tcG9uZW50cy93ZWJjYW0vZG9tYWluL3dlYmNhbS1pbWFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUN0QixZQUNFLGNBQXNCLEVBQ3RCLFFBQWdCLEVBQ2hCLFNBQW9CLEVBQ3BCLE9BQVk7UUFFWixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUMxQixJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztJQUMvQixDQUFDO0lBU0Q7Ozs7T0FJRztJQUNLLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFlLEVBQUUsUUFBZ0I7UUFDakUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsUUFBUSxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxjQUFjO1lBQ3hCLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYztZQUNyQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQyxrQkFBa0IsQ0FDbkQsSUFBSSxDQUFDLGVBQWUsRUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FDZixDQUFDLENBQUM7SUFDVCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFaEQsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBRXZCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBSSxHQUFHLEVBQUU7WUFDUCxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3pDO1FBRUQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb250YWluZXIgY2xhc3MgZm9yIGEgY2FwdHVyZWQgd2ViY2FtIGltYWdlXG4gKiBAYXV0aG9yIGJhc3N0MzE0LCBkYXZpZHNoZW44NFxuICovXG5leHBvcnQgY2xhc3MgV2ViY2FtSW1hZ2Uge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgaW1hZ2VBc0RhdGFVcmw6IHN0cmluZyxcbiAgICBtaW1lVHlwZTogc3RyaW5nLFxuICAgIGltYWdlRGF0YTogSW1hZ2VEYXRhLFxuICAgIHJlc2l6ZWQ6IGFueVxuICApIHtcbiAgICB0aGlzLl9taW1lVHlwZSA9IG1pbWVUeXBlO1xuICAgIHRoaXMuX2ltYWdlQXNEYXRhVXJsID0gaW1hZ2VBc0RhdGFVcmw7XG4gICAgdGhpcy5faW1hZ2VEYXRhID0gaW1hZ2VEYXRhO1xuICAgIHRoaXMuX2ltYWdlUmVzaXplZCA9IHJlc2l6ZWQ7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9taW1lVHlwZTogc3RyaW5nO1xuICBwcml2YXRlIF9pbWFnZUFzQmFzZTY0Pzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbWFnZUFzRGF0YVVybDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbWFnZURhdGE6IEltYWdlRGF0YTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW1hZ2VSZXNpemVkOiBzdHJpbmc7XG5cblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIEJhc2U2NCBkYXRhIG91dCBvZiB0aGUgZ2l2ZW4gZGF0YVVybC5cbiAgICogQHBhcmFtIGRhdGFVcmwgdGhlIGdpdmVuIGRhdGFVcmxcbiAgICogQHBhcmFtIG1pbWVUeXBlIHRoZSBtaW1lVHlwZSBvZiB0aGUgZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0RGF0YUZyb21EYXRhVXJsKGRhdGFVcmw6IHN0cmluZywgbWltZVR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiBkYXRhVXJsLnJlcGxhY2UoYGRhdGE6JHttaW1lVHlwZX07YmFzZTY0LGAsICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGJhc2U2NCBlbmNvZGVkIGltYWdlIGRhdGFcbiAgICogQHJldHVybnMgYmFzZTY0IGRhdGEgb2YgdGhlIGltYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlQXNCYXNlNjQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faW1hZ2VBc0Jhc2U2NFxuICAgICAgPyB0aGlzLl9pbWFnZUFzQmFzZTY0XG4gICAgICA6ICh0aGlzLl9pbWFnZUFzQmFzZTY0ID0gV2ViY2FtSW1hZ2UuZ2V0RGF0YUZyb21EYXRhVXJsKFxuICAgICAgICAgIHRoaXMuX2ltYWdlQXNEYXRhVXJsLFxuICAgICAgICAgIHRoaXMuX21pbWVUeXBlXG4gICAgICAgICkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZW5jb2RlZCBpbWFnZSBhcyBkYXRhVXJsXG4gICAqIEByZXR1cm5zIHRoZSBkYXRhVXJsIG9mIHRoZSBpbWFnZVxuICAgKi9cbiAgcHVibGljIGdldCBpbWFnZUFzRGF0YVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pbWFnZUFzRGF0YVVybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIEltYWdlRGF0YSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYW52YXMnIDJkIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIHRoZSBJbWFnZURhdGEgb2YgdGhlIGNhbnZhcydzIDJkIGNvbnRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlRGF0YSgpOiBJbWFnZURhdGEge1xuICAgIHJldHVybiB0aGlzLl9pbWFnZURhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGltYWdlUmVzaXplZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pbWFnZVJlc2l6ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFVcmwoKSB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG5cbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuX2ltYWdlRGF0YTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKGN0eCkge1xuICAgICAgY3R4LnB1dEltYWdlRGF0YSh0aGlzLl9pbWFnZURhdGEsIDAsIDApO1xuICAgIH1cblxuICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKHRoaXMuX21pbWVUeXBlLCAxKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ export class WebcamInitError {
2
+ }
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViY2FtLWluaXQtZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2NhbmRvYy9zcmMvY29yZS9jb21wb25lbnRzL3dlYmNhbS9kb21haW4vd2ViY2FtLWluaXQtZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLGVBQWU7Q0FHM0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgV2ViY2FtSW5pdEVycm9yIHtcbiAgcHVibGljIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIHB1YmxpYyBtZWRpYVN0cmVhbUVycm9yPzphbnk7XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ export class WebcamMirrorProperties {
2
+ }
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViY2FtLW1pcnJvci1wcm9wZXJ0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNjYW5kb2Mvc3JjL2NvcmUvY29tcG9uZW50cy93ZWJjYW0vZG9tYWluL3dlYmNhbS1taXJyb3ItcHJvcGVydGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sc0JBQXNCO0NBRWxDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFdlYmNhbU1pcnJvclByb3BlcnRpZXMge1xuICBwdWJsaWMgeD86IHN0cmluZzsgIC8vIFtcImF1dG9cIiwgXCJhbHdheXNcIiwgXCJuZXZlclwiXVxufVxuIl19
@@ -0,0 +1,48 @@
1
+ import { from, Observable } from 'rxjs';
2
+ import { switchMap, tap } from 'rxjs/operators';
3
+ export class WebcamUtil {
4
+ /**
5
+ * Lists available videoInput devices
6
+ * @returns a list of media device info.
7
+ */
8
+ static getAvailableVideoInputs() {
9
+ return new Observable((observer) => {
10
+ if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {
11
+ return observer.error(null);
12
+ }
13
+ const _window = window;
14
+ let streams;
15
+ from(navigator.mediaDevices.getUserMedia({
16
+ video: { deviceId: undefined },
17
+ }))
18
+ .pipe(tap((s) => { streams = s; }), switchMap((s) => from(navigator.mediaDevices.enumerateDevices())))
19
+ .subscribe((devices) => {
20
+ // console.log(streams);
21
+ if (streams) {
22
+ streams.getTracks().forEach((track) => {
23
+ track.stop();
24
+ });
25
+ }
26
+ observer.next(devices.filter((device) => device.kind === 'videoinput'));
27
+ });
28
+ });
29
+ // return new Promise((resolve, reject) => {
30
+ // navigator.mediaDevices.getUserMedia({
31
+ // video: undefined,
32
+ // });
33
+ // navigator.mediaDevices
34
+ // .enumerateDevices()
35
+ // .then((devices: MediaDeviceInfo[]) => {
36
+ // resolve(
37
+ // devices.filter(
38
+ // (device: MediaDeviceInfo) => device.kind === 'videoinput'
39
+ // )
40
+ // );
41
+ // })
42
+ // .catch((err) => {
43
+ // reject(err.message || err);
44
+ // });
45
+ // });
46
+ }
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViY2FtLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2NhbmRvYy9zcmMvY29yZS9jb21wb25lbnRzL3dlYmNhbS91dGlsL3dlYmNhbS51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFNLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEQsTUFBTSxPQUFPLFVBQVU7SUFDckI7OztPQUdHO0lBRUksTUFBTSxDQUFDLHVCQUF1QjtRQUNuQyxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFO2dCQUN2RSxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDN0I7WUFDRCxNQUFNLE9BQU8sR0FBUSxNQUFNLENBQUM7WUFDakMsSUFBSSxPQUFZLENBQUM7WUFDWixJQUFJLENBQ0YsU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7Z0JBQ2xDLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUU7YUFDL0IsQ0FBQyxDQUNIO2lCQUNFLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFFLE9BQU8sR0FBRyxDQUFDLENBQUEsQ0FBQSxDQUFDLENBQUMsRUFDekIsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDZCxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQ2hELENBQ0Y7aUJBQ0EsU0FBUyxDQUFDLENBQUMsT0FBMEIsRUFBRSxFQUFFO2dCQUMxQyx5QkFBeUI7Z0JBRXZCLElBQUksT0FBTyxFQUFFO29CQUNYLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTt3QkFDekMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNmLENBQUMsQ0FBQyxDQUFDO2lCQUNKO2dCQUNELFFBQVEsQ0FBQyxJQUFJLENBQ1gsT0FBTyxDQUFDLE1BQU0sQ0FDWixDQUFDLE1BQXVCLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUMxRCxDQUNGLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRUgsNENBQTRDO1FBQzVDLDBDQUEwQztRQUMxQyx3QkFBd0I7UUFDeEIsUUFBUTtRQUNSLDJCQUEyQjtRQUMzQiwwQkFBMEI7UUFDMUIsOENBQThDO1FBQzlDLGlCQUFpQjtRQUNqQiwwQkFBMEI7UUFDMUIsc0VBQXNFO1FBQ3RFLFlBQVk7UUFDWixXQUFXO1FBQ1gsU0FBUztRQUNULHdCQUF3QjtRQUN4QixvQ0FBb0M7UUFDcEMsVUFBVTtRQUNWLE1BQU07SUFDUixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJjYW1VdGlsIHtcbiAgLyoqXG4gICAqIExpc3RzIGF2YWlsYWJsZSB2aWRlb0lucHV0IGRldmljZXNcbiAgICogQHJldHVybnMgYSBsaXN0IG9mIG1lZGlhIGRldmljZSBpbmZvLlxuICAgKi9cblxuICBwdWJsaWMgc3RhdGljIGdldEF2YWlsYWJsZVZpZGVvSW5wdXRzKCk6IE9ic2VydmFibGU8TWVkaWFEZXZpY2VJbmZvW10+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgICBpZiAoIW5hdmlnYXRvci5tZWRpYURldmljZXMgfHwgIW5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcykge1xuICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IobnVsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCBfd2luZG93OiBhbnkgPSB3aW5kb3c7XG4gbGV0IHN0cmVhbXM6IGFueTtcbiAgICAgIGZyb20oXG4gICAgICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHtcbiAgICAgICAgICB2aWRlbzogeyBkZXZpY2VJZDogdW5kZWZpbmVkIH0sXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgocykgPT4ge3N0cmVhbXMgPSBzfSksXG4gICAgICAgICAgc3dpdGNoTWFwKChzKSA9PlxuICAgICAgICAgICAgZnJvbShuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoZGV2aWNlczogTWVkaWFEZXZpY2VJbmZvW10pID0+IHtcbiAgICAgICAgLy8gIGNvbnNvbGUubG9nKHN0cmVhbXMpO1xuXG4gICAgICAgICAgaWYgKHN0cmVhbXMpIHtcbiAgICAgICAgICAgIHN0cmVhbXMuZ2V0VHJhY2tzKCkuZm9yRWFjaCgodHJhY2s6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0cmFjay5zdG9wKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dChcbiAgICAgICAgICAgIGRldmljZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAoZGV2aWNlOiBNZWRpYURldmljZUluZm8pID0+IGRldmljZS5raW5kID09PSAndmlkZW9pbnB1dCdcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8gICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7XG4gICAgLy8gICAgIHZpZGVvOiB1bmRlZmluZWQsXG4gICAgLy8gICB9KTtcbiAgICAvLyAgIG5hdmlnYXRvci5tZWRpYURldmljZXNcbiAgICAvLyAgICAgLmVudW1lcmF0ZURldmljZXMoKVxuICAgIC8vICAgICAudGhlbigoZGV2aWNlczogTWVkaWFEZXZpY2VJbmZvW10pID0+IHtcbiAgICAvLyAgICAgICByZXNvbHZlKFxuICAgIC8vICAgICAgICAgZGV2aWNlcy5maWx0ZXIoXG4gICAgLy8gICAgICAgICAgIChkZXZpY2U6IE1lZGlhRGV2aWNlSW5mbykgPT4gZGV2aWNlLmtpbmQgPT09ICd2aWRlb2lucHV0J1xuICAgIC8vICAgICAgICAgKVxuICAgIC8vICAgICAgICk7XG4gICAgLy8gICAgIH0pXG4gICAgLy8gICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgLy8gICAgICAgcmVqZWN0KGVyci5tZXNzYWdlIHx8IGVycik7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vIH0pO1xuICB9XG59XG4iXX0=