barsa-develop-components 1.0.456 → 2.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 (205) hide show
  1. package/{esm2020 → esm2022}/barsa-develop-components.mjs +4 -4
  2. package/esm2022/lib/accept-reject/accept-reject.component.mjs +68 -0
  3. package/esm2022/lib/avatar/avatar.component.mjs +29 -0
  4. package/esm2022/lib/barcode-format-pipe.mjs +24 -0
  5. package/esm2022/lib/barcode-reader/barcode-reader.component.mjs +62 -0
  6. package/esm2022/lib/barcode-reader-dialog/barcode-reader-dialog.component.mjs +82 -0
  7. package/esm2022/lib/barcode-reader-video/barcode-reader-video.component.mjs +66 -0
  8. package/esm2022/lib/barcode.service.mjs +330 -0
  9. package/{esm2020 → esm2022}/lib/barsa-develop-components.module.mjs +284 -284
  10. package/esm2022/lib/barsa-document-list-item/barsa-document-list-item.component.mjs +104 -0
  11. package/esm2022/lib/barsa-documents/barsa-documents.component.mjs +173 -0
  12. package/esm2022/lib/barsa-geographic-location/barsa-geographic-location.component.mjs +163 -0
  13. package/esm2022/lib/card-content-image-and-title/card-content-image-and-title.component.mjs +50 -0
  14. package/esm2022/lib/card-content-line-chart/card-content-line-chart.component.mjs +37 -0
  15. package/esm2022/lib/card-header-big-image-title-and-subtitle/card-header-big-image-title-and-subtitle.component.mjs +19 -0
  16. package/esm2022/lib/card-header-kpi/card-header-kpi.component.mjs +40 -0
  17. package/esm2022/lib/card-header-logo-title-subtitle/card-header-logo-title-subtitle.component.mjs +45 -0
  18. package/{esm2020 → esm2022}/lib/checkbox-button/checkbox-button.component.mjs +23 -23
  19. package/esm2022/lib/column-form-viewer/column-form-viewer.component.mjs +88 -0
  20. package/{esm2020 → esm2022}/lib/enum-info-micro-proccess-flow/enum-info-micro-proccess-flow.component.mjs +18 -18
  21. package/esm2022/lib/footer/footer.component.mjs +43 -0
  22. package/esm2022/lib/form-card/form-card.component.mjs +17 -0
  23. package/esm2022/lib/form-chart-content/form-chart-content.component.mjs +37 -0
  24. package/esm2022/lib/form-content-quick-view/form-content-quick-view.component.mjs +102 -0
  25. package/esm2022/lib/form-report-view/form-report-view.component.mjs +25 -0
  26. package/esm2022/lib/form-report-view-item/form-report-view-item.component.mjs +45 -0
  27. package/{esm2020 → esm2022}/lib/g4b-details/g4b-details.component.mjs +28 -28
  28. package/esm2022/lib/g4b-estelam/g4b-estelam.component.mjs +30 -0
  29. package/esm2022/lib/geographic-location/geographic-location.component.mjs +85 -0
  30. package/esm2022/lib/login-form/login-form.component.mjs +55 -0
  31. package/{esm2020 → esm2022}/lib/login-social-conncetions/login-social-conncetions.component.mjs +30 -30
  32. package/esm2022/lib/master-detail-card-form/master-detail-card-form.component.mjs +17 -0
  33. package/esm2022/lib/media-file-uploader/media-file-uploader.component.mjs +238 -0
  34. package/esm2022/lib/micro-proccess-flow/micro-proccess-flow.component.mjs +52 -0
  35. package/esm2022/lib/micro-process-flow-view/micro-process-flow-view.component.mjs +24 -0
  36. package/esm2022/lib/mo-info-micro-proccess-flow/mo-info-micro-proccess-flow.component.mjs +23 -0
  37. package/esm2022/lib/models/document-item.mjs +2 -0
  38. package/esm2022/lib/models/documents-setting.mjs +2 -0
  39. package/{esm2020 → esm2022}/lib/models/form-report-view-setting.mjs +2 -2
  40. package/{esm2020 → esm2022}/lib/models/index.mjs +8 -8
  41. package/{esm2020 → esm2022}/lib/models/micro-process-flow-view-setting.mjs +2 -2
  42. package/{esm2020 → esm2022}/lib/models/person.mjs +1 -1
  43. package/{esm2020 → esm2022}/lib/models/service-desk-view-of-services-setting.mjs +2 -2
  44. package/{esm2020 → esm2022}/lib/models/tab-process-view-setting.mjs +2 -2
  45. package/{esm2020 → esm2022}/lib/pipes/datasource-to-flow-item.mjs +22 -22
  46. package/{esm2020 → esm2022}/lib/pipes/index.mjs +2 -2
  47. package/{esm2020 → esm2022}/lib/pipes/mo-list-to-flow-item.pipe.mjs +22 -22
  48. package/esm2022/lib/query-string-form-observable/query-string-form-observable.component.mjs +37 -0
  49. package/esm2022/lib/query-string-observable/query-string-observable.component.mjs +22 -0
  50. package/esm2022/lib/report-button-view/report-button-view.component.mjs +37 -0
  51. package/{esm2020 → esm2022}/lib/report-line-chart-view/report-line-chart-view.component.mjs +13 -13
  52. package/esm2022/lib/report-tab-view/report-tab-view.component.mjs +27 -0
  53. package/esm2022/lib/resend-verification-code/resend-verification-code.component.mjs +62 -0
  54. package/{esm2020 → esm2022}/lib/service-desk-card-content-mojavezhay-akhz-shode/service-desk-card-content-mojavezhay-akhz-shode.component.mjs +28 -28
  55. package/esm2022/lib/service-desk-form-layout-content-mojavez/service-desk-form-layout-content-mojavez.component.mjs +110 -0
  56. package/esm2022/lib/service-desk-header/service-desk-header.component.mjs +240 -0
  57. package/esm2022/lib/service-desk-servcie-detail/service-desk-servcie-detail.component.mjs +142 -0
  58. package/esm2022/lib/service-desk-view-of-services/service-desk-view-of-services.component.mjs +37 -0
  59. package/esm2022/lib/setting-form/setting-form.component.mjs +64 -0
  60. package/esm2022/lib/subform-in-row-report/subform-in-row-report.component.mjs +73 -0
  61. package/esm2022/lib/tab-process-view/tab-process-view.component.mjs +48 -0
  62. package/esm2022/lib/table-view-vertical-columns/table-view-vertical-columns.component.mjs +16 -0
  63. package/esm2022/lib/timer-count-down/timer-count-down.component.mjs +98 -0
  64. package/esm2022/lib/token-report-view/token-report-view.component.mjs +27 -0
  65. package/esm2022/lib/ui-enum-segmented-button/ui-enum-segmented-button.component.mjs +25 -0
  66. package/esm2022/lib/ui-num-rate/ui-num-rate.component.mjs +29 -0
  67. package/esm2022/lib/ui-person/ui-person.component.mjs +160 -0
  68. package/esm2022/lib/ui-person/ui-person.pipe.mjs +40 -0
  69. package/esm2022/lib/ui-pictures-carousel/ui-pictures-carousel.component.mjs +17 -0
  70. package/esm2022/lib/ui-text-field-search/ui-text-field-search.component.mjs +42 -0
  71. package/esm2022/lib/ulv-context-menu-item-show-file-content/ulv-context-menu-item-show-file-content.component.mjs +69 -0
  72. package/{esm2020 → esm2022}/public-api.mjs +62 -62
  73. package/fesm2022/barsa-develop-components.mjs +3626 -0
  74. package/fesm2022/barsa-develop-components.mjs.map +1 -0
  75. package/index.d.ts +5 -5
  76. package/lib/accept-reject/accept-reject.component.d.ts +28 -28
  77. package/lib/avatar/avatar.component.d.ts +12 -12
  78. package/lib/barcode-format-pipe.d.ts +7 -7
  79. package/lib/barcode-reader/barcode-reader.component.d.ts +19 -19
  80. package/lib/barcode-reader-dialog/barcode-reader-dialog.component.d.ts +32 -32
  81. package/lib/barcode-reader-video/barcode-reader-video.component.d.ts +22 -22
  82. package/lib/barcode.service.d.ts +98 -98
  83. package/lib/barsa-develop-components.module.d.ts +117 -117
  84. package/lib/barsa-document-list-item/barsa-document-list-item.component.d.ts +39 -39
  85. package/lib/barsa-documents/barsa-documents.component.d.ts +47 -47
  86. package/lib/barsa-geographic-location/barsa-geographic-location.component.d.ts +45 -46
  87. package/lib/card-content-image-and-title/card-content-image-and-title.component.d.ts +18 -18
  88. package/lib/card-content-line-chart/card-content-line-chart.component.d.ts +9 -9
  89. package/lib/card-header-big-image-title-and-subtitle/card-header-big-image-title-and-subtitle.component.d.ts +6 -6
  90. package/lib/card-header-kpi/card-header-kpi.component.d.ts +14 -14
  91. package/lib/card-header-logo-title-subtitle/card-header-logo-title-subtitle.component.d.ts +23 -23
  92. package/lib/checkbox-button/checkbox-button.component.d.ts +13 -13
  93. package/lib/column-form-viewer/column-form-viewer.component.d.ts +30 -30
  94. package/lib/enum-info-micro-proccess-flow/enum-info-micro-proccess-flow.component.d.ts +8 -8
  95. package/lib/footer/footer.component.d.ts +15 -15
  96. package/lib/form-card/form-card.component.d.ts +8 -8
  97. package/lib/form-chart-content/form-chart-content.component.d.ts +9 -9
  98. package/lib/form-content-quick-view/form-content-quick-view.component.d.ts +18 -18
  99. package/lib/form-report-view/form-report-view.component.d.ts +13 -13
  100. package/lib/form-report-view-item/form-report-view-item.component.d.ts +15 -15
  101. package/lib/g4b-details/g4b-details.component.d.ts +9 -9
  102. package/lib/g4b-estelam/g4b-estelam.component.d.ts +11 -11
  103. package/lib/geographic-location/geographic-location.component.d.ts +33 -34
  104. package/lib/login-form/login-form.component.d.ts +12 -12
  105. package/lib/login-social-conncetions/login-social-conncetions.component.d.ts +12 -12
  106. package/lib/master-detail-card-form/master-detail-card-form.component.d.ts +8 -8
  107. package/lib/media-file-uploader/media-file-uploader.component.d.ts +52 -52
  108. package/lib/micro-proccess-flow/micro-proccess-flow.component.d.ts +28 -28
  109. package/lib/micro-process-flow-view/micro-process-flow-view.component.d.ts +14 -14
  110. package/lib/mo-info-micro-proccess-flow/mo-info-micro-proccess-flow.component.d.ts +9 -9
  111. package/lib/models/document-item.d.ts +19 -19
  112. package/lib/models/documents-setting.d.ts +11 -11
  113. package/lib/models/form-report-view-setting.d.ts +7 -7
  114. package/lib/models/index.d.ts +7 -7
  115. package/lib/models/micro-process-flow-view-setting.d.ts +8 -8
  116. package/lib/models/person.d.ts +10 -10
  117. package/lib/models/service-desk-view-of-services-setting.d.ts +6 -6
  118. package/lib/models/tab-process-view-setting.d.ts +7 -7
  119. package/lib/pipes/datasource-to-flow-item.d.ts +10 -10
  120. package/lib/pipes/index.d.ts +2 -2
  121. package/lib/pipes/mo-list-to-flow-item.pipe.d.ts +10 -10
  122. package/lib/query-string-form-observable/query-string-form-observable.component.d.ts +13 -13
  123. package/lib/query-string-observable/query-string-observable.component.d.ts +9 -9
  124. package/lib/report-button-view/report-button-view.component.d.ts +12 -12
  125. package/lib/report-line-chart-view/report-line-chart-view.component.d.ts +7 -7
  126. package/lib/report-tab-view/report-tab-view.component.d.ts +15 -15
  127. package/lib/resend-verification-code/resend-verification-code.component.d.ts +19 -18
  128. package/lib/service-desk-card-content-mojavezhay-akhz-shode/service-desk-card-content-mojavezhay-akhz-shode.component.d.ts +15 -15
  129. package/lib/service-desk-form-layout-content-mojavez/service-desk-form-layout-content-mojavez.component.d.ts +26 -26
  130. package/lib/service-desk-header/service-desk-header.component.d.ts +63 -63
  131. package/lib/service-desk-servcie-detail/service-desk-servcie-detail.component.d.ts +39 -39
  132. package/lib/service-desk-view-of-services/service-desk-view-of-services.component.d.ts +16 -16
  133. package/lib/setting-form/setting-form.component.d.ts +20 -20
  134. package/lib/subform-in-row-report/subform-in-row-report.component.d.ts +22 -21
  135. package/lib/tab-process-view/tab-process-view.component.d.ts +20 -20
  136. package/lib/table-view-vertical-columns/table-view-vertical-columns.component.d.ts +6 -6
  137. package/lib/timer-count-down/timer-count-down.component.d.ts +15 -15
  138. package/lib/token-report-view/token-report-view.component.d.ts +15 -15
  139. package/lib/ui-enum-segmented-button/ui-enum-segmented-button.component.d.ts +9 -9
  140. package/lib/ui-num-rate/ui-num-rate.component.d.ts +9 -9
  141. package/lib/ui-person/ui-person.component.d.ts +31 -31
  142. package/lib/ui-person/ui-person.pipe.d.ts +7 -7
  143. package/lib/ui-pictures-carousel/ui-pictures-carousel.component.d.ts +6 -6
  144. package/lib/ui-text-field-search/ui-text-field-search.component.d.ts +17 -17
  145. package/lib/ulv-context-menu-item-show-file-content/ulv-context-menu-item-show-file-content.component.d.ts +25 -25
  146. package/package.json +7 -13
  147. package/public-api.d.ts +58 -58
  148. package/esm2020/lib/accept-reject/accept-reject.component.mjs +0 -69
  149. package/esm2020/lib/avatar/avatar.component.mjs +0 -29
  150. package/esm2020/lib/barcode-format-pipe.mjs +0 -24
  151. package/esm2020/lib/barcode-reader/barcode-reader.component.mjs +0 -62
  152. package/esm2020/lib/barcode-reader-dialog/barcode-reader-dialog.component.mjs +0 -82
  153. package/esm2020/lib/barcode-reader-video/barcode-reader-video.component.mjs +0 -66
  154. package/esm2020/lib/barcode.service.mjs +0 -330
  155. package/esm2020/lib/barsa-document-list-item/barsa-document-list-item.component.mjs +0 -104
  156. package/esm2020/lib/barsa-documents/barsa-documents.component.mjs +0 -173
  157. package/esm2020/lib/barsa-geographic-location/barsa-geographic-location.component.mjs +0 -174
  158. package/esm2020/lib/card-content-image-and-title/card-content-image-and-title.component.mjs +0 -51
  159. package/esm2020/lib/card-content-line-chart/card-content-line-chart.component.mjs +0 -38
  160. package/esm2020/lib/card-header-big-image-title-and-subtitle/card-header-big-image-title-and-subtitle.component.mjs +0 -20
  161. package/esm2020/lib/card-header-kpi/card-header-kpi.component.mjs +0 -41
  162. package/esm2020/lib/card-header-logo-title-subtitle/card-header-logo-title-subtitle.component.mjs +0 -46
  163. package/esm2020/lib/column-form-viewer/column-form-viewer.component.mjs +0 -88
  164. package/esm2020/lib/footer/footer.component.mjs +0 -44
  165. package/esm2020/lib/form-card/form-card.component.mjs +0 -18
  166. package/esm2020/lib/form-chart-content/form-chart-content.component.mjs +0 -38
  167. package/esm2020/lib/form-content-quick-view/form-content-quick-view.component.mjs +0 -102
  168. package/esm2020/lib/form-report-view/form-report-view.component.mjs +0 -26
  169. package/esm2020/lib/form-report-view-item/form-report-view-item.component.mjs +0 -45
  170. package/esm2020/lib/g4b-estelam/g4b-estelam.component.mjs +0 -30
  171. package/esm2020/lib/geographic-location/geographic-location.component.mjs +0 -88
  172. package/esm2020/lib/login-form/login-form.component.mjs +0 -55
  173. package/esm2020/lib/master-detail-card-form/master-detail-card-form.component.mjs +0 -17
  174. package/esm2020/lib/media-file-uploader/media-file-uploader.component.mjs +0 -238
  175. package/esm2020/lib/micro-proccess-flow/micro-proccess-flow.component.mjs +0 -53
  176. package/esm2020/lib/micro-process-flow-view/micro-process-flow-view.component.mjs +0 -24
  177. package/esm2020/lib/mo-info-micro-proccess-flow/mo-info-micro-proccess-flow.component.mjs +0 -23
  178. package/esm2020/lib/models/document-item.mjs +0 -2
  179. package/esm2020/lib/models/documents-setting.mjs +0 -2
  180. package/esm2020/lib/query-string-form-observable/query-string-form-observable.component.mjs +0 -37
  181. package/esm2020/lib/query-string-observable/query-string-observable.component.mjs +0 -22
  182. package/esm2020/lib/report-button-view/report-button-view.component.mjs +0 -38
  183. package/esm2020/lib/report-tab-view/report-tab-view.component.mjs +0 -28
  184. package/esm2020/lib/resend-verification-code/resend-verification-code.component.mjs +0 -59
  185. package/esm2020/lib/service-desk-form-layout-content-mojavez/service-desk-form-layout-content-mojavez.component.mjs +0 -110
  186. package/esm2020/lib/service-desk-header/service-desk-header.component.mjs +0 -236
  187. package/esm2020/lib/service-desk-servcie-detail/service-desk-servcie-detail.component.mjs +0 -142
  188. package/esm2020/lib/service-desk-view-of-services/service-desk-view-of-services.component.mjs +0 -37
  189. package/esm2020/lib/setting-form/setting-form.component.mjs +0 -64
  190. package/esm2020/lib/subform-in-row-report/subform-in-row-report.component.mjs +0 -65
  191. package/esm2020/lib/tab-process-view/tab-process-view.component.mjs +0 -49
  192. package/esm2020/lib/table-view-vertical-columns/table-view-vertical-columns.component.mjs +0 -16
  193. package/esm2020/lib/timer-count-down/timer-count-down.component.mjs +0 -98
  194. package/esm2020/lib/token-report-view/token-report-view.component.mjs +0 -27
  195. package/esm2020/lib/ui-enum-segmented-button/ui-enum-segmented-button.component.mjs +0 -25
  196. package/esm2020/lib/ui-num-rate/ui-num-rate.component.mjs +0 -29
  197. package/esm2020/lib/ui-person/ui-person.component.mjs +0 -160
  198. package/esm2020/lib/ui-person/ui-person.pipe.mjs +0 -40
  199. package/esm2020/lib/ui-pictures-carousel/ui-pictures-carousel.component.mjs +0 -17
  200. package/esm2020/lib/ui-text-field-search/ui-text-field-search.component.mjs +0 -42
  201. package/esm2020/lib/ulv-context-menu-item-show-file-content/ulv-context-menu-item-show-file-content.component.mjs +0 -70
  202. package/fesm2015/barsa-develop-components.mjs +0 -3660
  203. package/fesm2015/barsa-develop-components.mjs.map +0 -1
  204. package/fesm2020/barsa-develop-components.mjs +0 -3625
  205. package/fesm2020/barsa-develop-components.mjs.map +0 -1
@@ -1,82 +0,0 @@
1
- import { ChangeDetectionStrategy, Component } from '@angular/core';
2
- import { of } from 'rxjs';
3
- import { BaseComponent } from 'barsa-novin-ray-core';
4
- import { concatMap, delay, exhaustMap, finalize, takeUntil, tap } from 'rxjs/operators';
5
- import { BarcodeFormat } from '@zxing/library';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@fundamental-ngx/core";
8
- import * as i2 from "../barcode.service";
9
- import * as i3 from "@angular/common";
10
- import * as i4 from "@fundamental-ngx/core/bar";
11
- import * as i5 from "@fundamental-ngx/core/dialog";
12
- import * as i6 from "@fundamental-ngx/core/title";
13
- import * as i7 from "@fundamental-ngx/core/utils";
14
- import * as i8 from "@fundamental-ngx/core/select";
15
- import * as i9 from "../barcode-reader-video/barcode-reader-video.component";
16
- import * as i10 from "barsa-novin-ray-core";
17
- export class BarcodeReaderDialogComponent extends BaseComponent {
18
- constructor(_dialogRef, _userMediaService) {
19
- super();
20
- this._dialogRef = _dialogRef;
21
- this._userMediaService = _userMediaService;
22
- this.value = '';
23
- this.format = [BarcodeFormat.QR_CODE];
24
- this.loading = true;
25
- this._dialogRef.loading(true);
26
- this.barcodeFormats = this._dialogRef.data?.barcodeFormats ?? [];
27
- this.selectedFormat = this.barcodeFormats.length > 0 ? this.barcodeFormats[0] : BarcodeFormat.QR_CODE;
28
- }
29
- ngAfterViewInit() {
30
- super.ngAfterViewInit();
31
- this._initialize();
32
- }
33
- onDismiss() {
34
- this._dialogRef.dismiss();
35
- }
36
- onOk() {
37
- this._close();
38
- }
39
- onCameraChange(value) {
40
- this.selectedCamera = value;
41
- }
42
- onFormatChange(format) {
43
- this.selectedFormat = format;
44
- }
45
- onScanSuccess(result) {
46
- this.value = result;
47
- this._close();
48
- }
49
- onValueChanged(e) {
50
- this.value = e.target.value;
51
- }
52
- _close() {
53
- this._dialogRef.close(this.value);
54
- }
55
- _initialize() {
56
- of(true)
57
- .pipe(takeUntil(this._onDestroy$), exhaustMap(() => this._userMediaService.askForPermission()), concatMap((permission) => {
58
- if (permission) {
59
- return this._userMediaService.updateVideoInputDevices();
60
- }
61
- else {
62
- return of(true);
63
- }
64
- }), finalize(() => {
65
- this.loading = false;
66
- this._dialogRef.loading(false);
67
- }))
68
- .subscribe();
69
- this.hasDevice$ = this._userMediaService.hasDevices$;
70
- this.permission$ = this._userMediaService.permission$;
71
- this.cameras$ = this._userMediaService.cameras$.pipe(delay(0), tap((cameras) => {
72
- this.selectedCamera = cameras.find((c) => c.label.indexOf('back') > -1) ?? cameras[0];
73
- }));
74
- }
75
- }
76
- BarcodeReaderDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: BarcodeReaderDialogComponent, deps: [{ token: i1.DialogRef }, { token: i2.UserMediaBaseService }], target: i0.ɵɵFactoryTarget.Component });
77
- BarcodeReaderDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.7", type: BarcodeReaderDialogComponent, selector: "bdc-barcode-reader-dialog", usesInheritance: true, ngImport: i0, template: "<fd-dialog>\r\n <fd-dialog-header>\r\n <h1 fd-title>{{ 'BarcodeReader' | bbbTranslate }} {{ selectedCamera?.label }}</h1>\r\n <button fd-dialog-close-button (click)=\"onDismiss()\"></button>\r\n </fd-dialog-header>\r\n <fd-dialog-body>\r\n <ng-container *ngIf=\"!loading\">\r\n <ng-container *ngIf=\"permission$ | async; else noPermission\">\r\n <ng-container *ngIf=\"hasDevice$ | async; else noDevice\">\r\n <bdc-barcode-reader-video\r\n *ngIf=\"selectedCamera\"\r\n [format]=\"format\"\r\n [selectedCamera]=\"selectedCamera\"\r\n [allFormats]=\"barcodeFormats\"\r\n (scanSuccess)=\"onScanSuccess($event)\"\r\n ></bdc-barcode-reader-video>\r\n </ng-container> </ng-container\r\n ></ng-container>\r\n <ng-template #noDevice>\r\n <p>BrowserNotSupport</p>\r\n </ng-template>\r\n <ng-template #noPermission>\r\n <p>NoPermission</p>\r\n </ng-template>\r\n </fd-dialog-body>\r\n <fd-dialog-footer>\r\n <ng-template fdTemplate=\"footer\">\r\n <ng-container *ngIf=\"cameras$ | async as cameraList\">\r\n <div fd-bar-left>\r\n <fd-select\r\n *ngIf=\"cameraList.length > 1\"\r\n [placeholder]=\"'Camera' | bbbTranslate\"\r\n (valueChange)=\"onCameraChange($event)\"\r\n [value]=\"selectedCamera\"\r\n >\r\n <fd-option *ngFor=\"let camera of cameraList\" [value]=\"camera\">{{ camera.label }}</fd-option>\r\n </fd-select>\r\n </div>\r\n <div fd-bar-right></div>\r\n </ng-container>\r\n </ng-template>\r\n </fd-dialog-footer>\r\n</fd-dialog>\r\n", styles: [""], 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.BarLeftDirective, selector: "[fd-bar-left]" }, { kind: "directive", type: i4.BarRightDirective, selector: "[fd-bar-right]" }, { kind: "component", type: i5.DialogComponent, selector: "fd-dialog", inputs: ["class", "dialogRef", "dialogConfig"] }, { kind: "component", type: i5.DialogBodyComponent, selector: "fd-dialog-body" }, { kind: "component", type: i5.DialogFooterComponent, selector: "fd-dialog-footer" }, { kind: "component", type: i5.DialogHeaderComponent, selector: "fd-dialog-header" }, { kind: "component", type: i5.DialogCloseButtonComponent, selector: "[fd-dialog-close-button]", inputs: ["mobile", "title"] }, { kind: "component", type: i6.TitleComponent, selector: "h1[fd-title], h2[fd-title], h3[fd-title], h4[fd-title], h5[fd-title], h6[fd-title]", inputs: ["headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "directive", type: i7.TemplateDirective, selector: "[fdTemplate]", inputs: ["fdTemplate"] }, { kind: "component", type: i8.SelectComponent, selector: "fd-select", inputs: ["controlId", "state", "mobile", "stateMessage", "disabled", "required", "readonly", "placeholder", "value", "extendedBodyTemplate", "maxHeight", "glyph", "closeOnOutsideClick", "fillControlMode", "controlTemplate", "appendTo", "unselectMissingOption", "typeaheadDebounceInterval", "ariaLabelledBy", "ariaLabel", "mobileConfig", "inline"], outputs: ["isOpenChange", "valueChange"] }, { kind: "component", type: i8.OptionComponent, selector: "[fd-option], fd-option", inputs: ["id", "value", "disabled"], outputs: ["selectionChange"] }, { kind: "component", type: i9.BarcodeReaderVideoComponent, selector: "bdc-barcode-reader-video", inputs: ["allFormats", "previewFitMode", "selectedCamera"], outputs: ["scanSuccess"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i10.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
78
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: BarcodeReaderDialogComponent, decorators: [{
79
- type: Component,
80
- args: [{ selector: 'bdc-barcode-reader-dialog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<fd-dialog>\r\n <fd-dialog-header>\r\n <h1 fd-title>{{ 'BarcodeReader' | bbbTranslate }} {{ selectedCamera?.label }}</h1>\r\n <button fd-dialog-close-button (click)=\"onDismiss()\"></button>\r\n </fd-dialog-header>\r\n <fd-dialog-body>\r\n <ng-container *ngIf=\"!loading\">\r\n <ng-container *ngIf=\"permission$ | async; else noPermission\">\r\n <ng-container *ngIf=\"hasDevice$ | async; else noDevice\">\r\n <bdc-barcode-reader-video\r\n *ngIf=\"selectedCamera\"\r\n [format]=\"format\"\r\n [selectedCamera]=\"selectedCamera\"\r\n [allFormats]=\"barcodeFormats\"\r\n (scanSuccess)=\"onScanSuccess($event)\"\r\n ></bdc-barcode-reader-video>\r\n </ng-container> </ng-container\r\n ></ng-container>\r\n <ng-template #noDevice>\r\n <p>BrowserNotSupport</p>\r\n </ng-template>\r\n <ng-template #noPermission>\r\n <p>NoPermission</p>\r\n </ng-template>\r\n </fd-dialog-body>\r\n <fd-dialog-footer>\r\n <ng-template fdTemplate=\"footer\">\r\n <ng-container *ngIf=\"cameras$ | async as cameraList\">\r\n <div fd-bar-left>\r\n <fd-select\r\n *ngIf=\"cameraList.length > 1\"\r\n [placeholder]=\"'Camera' | bbbTranslate\"\r\n (valueChange)=\"onCameraChange($event)\"\r\n [value]=\"selectedCamera\"\r\n >\r\n <fd-option *ngFor=\"let camera of cameraList\" [value]=\"camera\">{{ camera.label }}</fd-option>\r\n </fd-select>\r\n </div>\r\n <div fd-bar-right></div>\r\n </ng-container>\r\n </ng-template>\r\n </fd-dialog-footer>\r\n</fd-dialog>\r\n" }]
81
- }], ctorParameters: function () { return [{ type: i1.DialogRef }, { type: i2.UserMediaBaseService }]; } });
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyY29kZS1yZWFkZXItZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLWRldmVsb3AtY29tcG9uZW50cy9zcmMvbGliL2JhcmNvZGUtcmVhZGVyLWRpYWxvZy9iYXJjb2RlLXJlYWRlci1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2EtZGV2ZWxvcC1jb21wb25lbnRzL3NyYy9saWIvYmFyY29kZS1yZWFkZXItZGlhbG9nL2JhcmNvZGUtcmVhZGVyLWRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVsRixPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7OztBQU8vQyxNQUFNLE9BQU8sNEJBQTZCLFNBQVEsYUFBYTtJQVUzRCxZQUFvQixVQUFxQixFQUFVLGlCQUF1QztRQUN0RixLQUFLLEVBQUUsQ0FBQztRQURRLGVBQVUsR0FBVixVQUFVLENBQVc7UUFBVSxzQkFBaUIsR0FBakIsaUJBQWlCLENBQXNCO1FBVDFGLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFWCxXQUFNLEdBQUcsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFTN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxP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Q0E7MkZEN0JhLDRCQUE0QjtrQkFOeEMsU0FBUzsrQkFDSSwyQkFBMkIsbUJBR3BCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERpYWxvZ1JlZiB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50IH0gZnJvbSAnYmFyc2Etbm92aW4tcmF5LWNvcmUnO1xyXG5pbXBvcnQgeyBVc2VyTWVkaWFCYXNlU2VydmljZSB9IGZyb20gJy4uL2JhcmNvZGUuc2VydmljZSc7XHJcbmltcG9ydCB7IGNvbmNhdE1hcCwgZGVsYXksIGV4aGF1c3RNYXAsIGZpbmFsaXplLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQmFyY29kZUZvcm1hdCB9IGZyb20gJ0B6eGluZy9saWJyYXJ5JztcclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2JkYy1iYXJjb2RlLXJlYWRlci1kaWFsb2cnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2JhcmNvZGUtcmVhZGVyLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9iYXJjb2RlLXJlYWRlci1kaWFsb2cuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYXJjb2RlUmVhZGVyRGlhbG9nQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xyXG4gICAgdmFsdWUgPSAnJztcclxuICAgIGNhbWVyYXMkOiBPYnNlcnZhYmxlPE1lZGlhRGV2aWNlSW5mb1tdPjtcclxuICAgIGZvcm1hdCA9IFtCYXJjb2RlRm9ybWF0LlFSX0NPREVdO1xyXG4gICAgaGFzRGV2aWNlJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAgIHBlcm1pc3Npb24kOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gICAgbG9hZGluZzogYm9vbGVhbjtcclxuICAgIHNlbGVjdGVkQ2FtZXJhOiBNZWRpYURldmljZUluZm87XHJcbiAgICBiYXJjb2RlRm9ybWF0czogQXJyYXk8QmFyY29kZUZvcm1hdD47XHJcbiAgICBzZWxlY3RlZEZvcm1hdDogQmFyY29kZUZvcm1hdDtcclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2RpYWxvZ1JlZjogRGlhbG9nUmVmLCBwcml2YXRlIF91c2VyTWVkaWFTZXJ2aWNlOiBVc2VyTWVkaWFCYXNlU2VydmljZSkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9kaWFsb2dSZWYubG9hZGluZyh0cnVlKTtcclxuICAgICAgICB0aGlzLmJhcmNvZGVGb3JtYXRzID0gdGhpcy5fZGlhbG9nUmVmLmRhdGE/LmJhcmNvZGVGb3JtYXRzID8/IFtdO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGb3JtYXQgPSB0aGlzLmJhcmNvZGVGb3JtYXRzLmxlbmd0aCA+IDAgPyB0aGlzLmJhcmNvZGVGb3JtYXRzWzBdIDogQmFyY29kZUZvcm1hdC5RUl9DT0RFO1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcclxuICAgICAgICB0aGlzLl9pbml0aWFsaXplKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25EaXNtaXNzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2RpYWxvZ1JlZi5kaXNtaXNzKCk7XHJcbiAgICB9XHJcbiAgICBvbk9rKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DYW1lcmFDaGFuZ2UodmFsdWUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ2FtZXJhID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBvbkZvcm1hdENoYW5nZShmb3JtYXQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRm9ybWF0ID0gZm9ybWF0O1xyXG4gICAgfVxyXG4gICAgb25TY2FuU3VjY2VzcyhyZXN1bHQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnZhbHVlID0gcmVzdWx0O1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlKCk7XHJcbiAgICB9XHJcbiAgICBvblZhbHVlQ2hhbmdlZChlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfY2xvc2UoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfaW5pdGlhbGl6ZSgpOiB2b2lkIHtcclxuICAgICAgICBvZih0cnVlKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSxcclxuICAgICAgICAgICAgICAgIGV4aGF1c3RNYXAoKCkgPT4gdGhpcy5fdXNlck1lZGlhU2VydmljZS5hc2tGb3JQZXJtaXNzaW9uKCkpLFxyXG4gICAgICAgICAgICAgICAgY29uY2F0TWFwKChwZXJtaXNzaW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBlcm1pc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJNZWRpYVNlcnZpY2UudXBkYXRlVmlkZW9JbnB1dERldmljZXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmxvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgdGhpcy5oYXNEZXZpY2UkID0gdGhpcy5fdXNlck1lZGlhU2VydmljZS5oYXNEZXZpY2VzJDtcclxuICAgICAgICB0aGlzLnBlcm1pc3Npb24kID0gdGhpcy5fdXNlck1lZGlhU2VydmljZS5wZXJtaXNzaW9uJDtcclxuICAgICAgICB0aGlzLmNhbWVyYXMkID0gdGhpcy5fdXNlck1lZGlhU2VydmljZS5jYW1lcmFzJC5waXBlKFxyXG4gICAgICAgICAgICBkZWxheSgwKSxcclxuICAgICAgICAgICAgdGFwKChjYW1lcmFzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2FtZXJhID0gY2FtZXJhcy5maW5kKChjKSA9PiBjLmxhYmVsLmluZGV4T2YoJ2JhY2snKSA+IC0xKSA/PyBjYW1lcmFzWzBdO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGZkLWRpYWxvZz5cclxuICAgIDxmZC1kaWFsb2ctaGVhZGVyPlxyXG4gICAgICAgIDxoMSBmZC10aXRsZT57eyAnQmFyY29kZVJlYWRlcicgfCBiYmJUcmFuc2xhdGUgfX0ge3sgc2VsZWN0ZWRDYW1lcmE/LmxhYmVsIH19PC9oMT5cclxuICAgICAgICA8YnV0dG9uIGZkLWRpYWxvZy1jbG9zZS1idXR0b24gKGNsaWNrKT1cIm9uRGlzbWlzcygpXCI+PC9idXR0b24+XHJcbiAgICA8L2ZkLWRpYWxvZy1oZWFkZXI+XHJcbiAgICA8ZmQtZGlhbG9nLWJvZHk+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwZXJtaXNzaW9uJCB8IGFzeW5jOyBlbHNlIG5vUGVybWlzc2lvblwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0RldmljZSQgfCBhc3luYzsgZWxzZSBub0RldmljZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxiZGMtYmFyY29kZS1yZWFkZXItdmlkZW9cclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZENhbWVyYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtYXRdPVwiZm9ybWF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkQ2FtZXJhXT1cInNlbGVjdGVkQ2FtZXJhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2FsbEZvcm1hdHNdPVwiYmFyY29kZUZvcm1hdHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2NhblN1Y2Nlc3MpPVwib25TY2FuU3VjY2VzcygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICA+PC9iZGMtYmFyY29kZS1yZWFkZXItdmlkZW8+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gPC9uZy1jb250YWluZXJcclxuICAgICAgICA+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNub0RldmljZT5cclxuICAgICAgICAgICAgPHA+QnJvd3Nlck5vdFN1cHBvcnQ8L3A+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI25vUGVybWlzc2lvbj5cclxuICAgICAgICAgICAgPHA+Tm9QZXJtaXNzaW9uPC9wPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2ZkLWRpYWxvZy1ib2R5PlxyXG4gICAgPGZkLWRpYWxvZy1mb290ZXI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIGZkVGVtcGxhdGU9XCJmb290ZXJcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhbWVyYXMkIHwgYXN5bmMgYXMgY2FtZXJhTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBmZC1iYXItbGVmdD5cclxuICAgICAgICAgICAgICAgICAgICA8ZmQtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2FtZXJhTGlzdC5sZW5ndGggPiAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidDYW1lcmEnIHwgYmJiVHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uQ2FtZXJhQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWRDYW1lcmFcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGZkLW9wdGlvbiAqbmdGb3I9XCJsZXQgY2FtZXJhIG9mIGNhbWVyYUxpc3RcIiBbdmFsdWVdPVwiY2FtZXJhXCI+e3sgY2FtZXJhLmxhYmVsIH19PC9mZC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9mZC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZmQtYmFyLXJpZ2h0PjwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9mZC1kaWFsb2ctZm9vdGVyPlxyXG48L2ZkLWRpYWxvZz5cclxuIl19
@@ -1,66 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
- import { BehaviorSubject } from 'rxjs';
3
- import { BaseComponent } from 'barsa-novin-ray-core';
4
- import { debounceTime, filter, takeUntil, tap } from 'rxjs/operators';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../barcode.service";
7
- import * as i2 from "barsa-novin-ray-core";
8
- export class BarcodeReaderVideoComponent extends BaseComponent {
9
- constructor(_webBarcodeService) {
10
- super();
11
- this._webBarcodeService = _webBarcodeService;
12
- this.previewFitMode = 'fill';
13
- this.scanSuccess = new EventEmitter();
14
- this._cameraSource = new BehaviorSubject(null);
15
- }
16
- set selectedCamera(val) {
17
- this._cameraSource.next(val);
18
- }
19
- ngOnInit() {
20
- super.ngOnInit();
21
- this._setFormat(this.allFormats);
22
- this._cameraSource
23
- .asObservable()
24
- .pipe(takeUntil(this._onDestroy$), debounceTime(500), filter((camera) => camera != null), tap((camera) => {
25
- this._stopScan();
26
- this._startScan(camera);
27
- }))
28
- .subscribe();
29
- this._webBarcodeService.scanSuccess$.subscribe((result) => {
30
- this.scanSuccess.emit(result);
31
- });
32
- }
33
- ngOnDestroy() {
34
- super.ngOnDestroy();
35
- this._webBarcodeService.scanStop();
36
- }
37
- _setFormat(formats) {
38
- this._webBarcodeService.setFormat(formats);
39
- }
40
- _stopScan() {
41
- this._webBarcodeService.scanStop();
42
- }
43
- _startScan(camera) {
44
- if (this.videoElement) {
45
- this._webBarcodeService.startScan(camera, this.videoElement.nativeElement);
46
- }
47
- }
48
- }
49
- BarcodeReaderVideoComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: BarcodeReaderVideoComponent, deps: [{ token: i1.WebBarcodeService }], target: i0.ɵɵFactoryTarget.Component });
50
- BarcodeReaderVideoComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.7", type: BarcodeReaderVideoComponent, selector: "bdc-barcode-reader-video", inputs: { allFormats: "allFormats", previewFitMode: "previewFitMode", selectedCamera: "selectedCamera" }, outputs: { scanSuccess: "scanSuccess" }, viewQueries: [{ propertyName: "videoElement", first: true, predicate: ["videoElement"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<video #videoElement [style.object-fit]=\"previewFitMode\">\r\n <p>{{ 'BrowserNotSupport' | bbbTranslate }}</p>\r\n</video>\r\n", styles: [":host,video{display:block;width:100%;height:100%}\n"], dependencies: [{ kind: "pipe", type: i2.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
51
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: BarcodeReaderVideoComponent, decorators: [{
52
- type: Component,
53
- args: [{ selector: 'bdc-barcode-reader-video', changeDetection: ChangeDetectionStrategy.OnPush, template: "<video #videoElement [style.object-fit]=\"previewFitMode\">\r\n <p>{{ 'BrowserNotSupport' | bbbTranslate }}</p>\r\n</video>\r\n", styles: [":host,video{display:block;width:100%;height:100%}\n"] }]
54
- }], ctorParameters: function () { return [{ type: i1.WebBarcodeService }]; }, propDecorators: { allFormats: [{
55
- type: Input
56
- }], previewFitMode: [{
57
- type: Input
58
- }], scanSuccess: [{
59
- type: Output
60
- }], videoElement: [{
61
- type: ViewChild,
62
- args: ['videoElement', { static: true }]
63
- }], selectedCamera: [{
64
- type: Input
65
- }] } });
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyY29kZS1yZWFkZXItdmlkZW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2EtZGV2ZWxvcC1jb21wb25lbnRzL3NyYy9saWIvYmFyY29kZS1yZWFkZXItdmlkZW8vYmFyY29kZS1yZWFkZXItdmlkZW8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2EtZGV2ZWxvcC1jb21wb25lbnRzL3NyYy9saWIvYmFyY29kZS1yZWFkZXItdmlkZW8vYmFyY29kZS1yZWFkZXItdmlkZW8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQVF0RSxNQUFNLE9BQU8sMkJBQTRCLFNBQVEsYUFBYTtJQWMxRCxZQUFvQixrQkFBcUM7UUFDckQsS0FBSyxFQUFFLENBQUM7UUFEUSx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW1CO1FBWHpELG1CQUFjLEdBQXlELE1BQU0sQ0FBQztRQUVwRSxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFPM0Msa0JBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBeUIsSUFBSSxDQUFDLENBQUM7SUFJMUUsQ0FBQztJQVBELElBQWEsY0FBYyxDQUFDLEdBQW9CO1FBQzVDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFPRCxRQUFRO1FBQ0osS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWpDLElBQUksQ0FBQyxhQUFhO2FBQ2IsWUFBWSxFQUFFO2FBQ2QsSUFBSSxDQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQzNCLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFDakIsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEVBRWxDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ1gsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQ0w7YUFDQSxTQUFTLEVBQUUsQ0FBQztRQUVqQixJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3RELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUNELFdBQVc7UUFDUCxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxVQUFVLENBQUMsT0FBd0I7UUFDdkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ08sU0FBUztRQUNiLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBQ08sVUFBVSxDQUFDLE1BQU07UUFDckIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDOUU7SUFDTCxDQUFDOzt3SEF2RFEsMkJBQTJCOzRHQUEzQiwyQkFBMkIsc1dDeEJ4QyxvSUFHQTsyRkRxQmEsMkJBQTJCO2tCQU52QyxTQUFTOytCQUNJLDBCQUEwQixtQkFHbkIsdUJBQXVCLENBQUMsTUFBTTt3R0FHdEMsVUFBVTtzQkFBbEIsS0FBSztnQkFFTixjQUFjO3NCQURiLEtBQUs7Z0JBR0ksV0FBVztzQkFBcEIsTUFBTTtnQkFHUCxZQUFZO3NCQURYLFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFFOUIsY0FBYztzQkFBMUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICAgIENvbXBvbmVudCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIE91dHB1dCxcclxuICAgIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQmFyY29kZUZvcm1hdCB9IGZyb20gJ0B6eGluZy9saWJyYXJ5JztcclxuXHJcbmltcG9ydCB7IEJhc2VDb21wb25lbnQgfSBmcm9tICdiYXJzYS1ub3Zpbi1yYXktY29yZSc7XHJcbmltcG9ydCB7IFdlYkJhcmNvZGVTZXJ2aWNlIH0gZnJvbSAnLi4vYmFyY29kZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2JkYy1iYXJjb2RlLXJlYWRlci12aWRlbycsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vYmFyY29kZS1yZWFkZXItdmlkZW8uY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vYmFyY29kZS1yZWFkZXItdmlkZW8uY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYXJjb2RlUmVhZGVyVmlkZW9Db21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgQElucHV0KCkgYWxsRm9ybWF0czogQmFyY29kZUZvcm1hdFtdO1xyXG4gICAgQElucHV0KClcclxuICAgIHByZXZpZXdGaXRNb2RlOiAnZmlsbCcgfCAnY29udGFpbicgfCAnY292ZXInIHwgJ3NjYWxlLWRvd24nIHwgJ25vbmUnID0gJ2ZpbGwnO1xyXG5cclxuICAgIEBPdXRwdXQoKSBzY2FuU3VjY2VzcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3ZpZGVvRWxlbWVudCcsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgICB2aWRlb0VsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD47XHJcbiAgICBASW5wdXQoKSBzZXQgc2VsZWN0ZWRDYW1lcmEodmFsOiBNZWRpYURldmljZUluZm8pIHtcclxuICAgICAgICB0aGlzLl9jYW1lcmFTb3VyY2UubmV4dCh2YWwpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfY2FtZXJhU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZWRpYURldmljZUluZm8gfCBudWxsPihudWxsKTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF93ZWJCYXJjb2RlU2VydmljZTogV2ViQmFyY29kZVNlcnZpY2UpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgICAgICAgdGhpcy5fc2V0Rm9ybWF0KHRoaXMuYWxsRm9ybWF0cyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NhbWVyYVNvdXJjZVxyXG4gICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCksXHJcbiAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoNTAwKSxcclxuICAgICAgICAgICAgICAgIGZpbHRlcigoY2FtZXJhKSA9PiBjYW1lcmEgIT0gbnVsbCksXHJcblxyXG4gICAgICAgICAgICAgICAgdGFwKChjYW1lcmEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdG9wU2NhbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0U2NhbihjYW1lcmEpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3dlYkJhcmNvZGVTZXJ2aWNlLnNjYW5TdWNjZXNzJC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNjYW5TdWNjZXNzLmVtaXQocmVzdWx0KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XHJcbiAgICAgICAgdGhpcy5fd2ViQmFyY29kZVNlcnZpY2Uuc2NhblN0b3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9zZXRGb3JtYXQoZm9ybWF0czogQmFyY29kZUZvcm1hdFtdKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fd2ViQmFyY29kZVNlcnZpY2Uuc2V0Rm9ybWF0KGZvcm1hdHMpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfc3RvcFNjYW4oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fd2ViQmFyY29kZVNlcnZpY2Uuc2NhblN0b3AoKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX3N0YXJ0U2NhbihjYW1lcmEpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy52aWRlb0VsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5fd2ViQmFyY29kZVNlcnZpY2Uuc3RhcnRTY2FuKGNhbWVyYSwgdGhpcy52aWRlb0VsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIjx2aWRlbyAjdmlkZW9FbGVtZW50IFtzdHlsZS5vYmplY3QtZml0XT1cInByZXZpZXdGaXRNb2RlXCI+XHJcbiAgICA8cD57eyAnQnJvd3Nlck5vdFN1cHBvcnQnIHwgYmJiVHJhbnNsYXRlIH19PC9wPlxyXG48L3ZpZGVvPlxyXG4iXX0=
@@ -1,330 +0,0 @@
1
- import { DecodeHintType, BarcodeFormat } from '@zxing/library';
2
- import { ChecksumException, FormatException, NotFoundException } from '@zxing/library';
3
- import { BrowserCodeReader, BrowserMultiFormatReader } from '@zxing/browser';
4
- import { BehaviorSubject, Subject } from 'rxjs';
5
- import { filter, map, shareReplay } from 'rxjs/operators';
6
- import { Injectable } from '@angular/core';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "barsa-novin-ray-core";
9
- /**
10
- * Based on zxing-typescript BrowserCodeReader
11
- */
12
- export class BrowserMultiFormatContinuousReader extends BrowserMultiFormatReader {
13
- /**
14
- * Returns the code reader scanner controls.
15
- */
16
- getScannerControls() {
17
- if (!this.scannerControls) {
18
- throw new Error('No scanning is running at the time.');
19
- }
20
- return this.scannerControls;
21
- }
22
- /**
23
- * Starts the decoding from the current or a new video element.
24
- *
25
- * @param deviceId The device's to be used Id
26
- * @param previewEl A new video element
27
- */
28
- async scanFromDeviceObservable(deviceId, previewEl) {
29
- const scan$ = new BehaviorSubject({});
30
- let ctrls;
31
- try {
32
- ctrls = await this.decodeFromVideoDevice(deviceId, previewEl, (result, error) => {
33
- if (!error) {
34
- scan$.next({ result });
35
- return;
36
- }
37
- console.error(error);
38
- const errorName = error.name;
39
- // stream cannot stop on fails.
40
- if (
41
- // scan Failure - found nothing, no error
42
- errorName === NotFoundException.name ||
43
- // scan Error - found the QR but got error on decoding
44
- errorName === ChecksumException.name ||
45
- errorName === FormatException.name ||
46
- error.message.includes('No MultiFormat Readers were able to detect the code.')) {
47
- scan$.next({ error });
48
- return;
49
- }
50
- // probably fatal error
51
- scan$.error(error);
52
- this.scannerControls?.stop();
53
- this.scannerControls = undefined;
54
- return;
55
- });
56
- this.scannerControls = {
57
- ...ctrls,
58
- stop() {
59
- ctrls.stop();
60
- scan$.complete();
61
- }
62
- };
63
- }
64
- catch (e) {
65
- scan$.error(e);
66
- this.scannerControls?.stop();
67
- this.scannerControls = undefined;
68
- }
69
- return scan$.asObservable();
70
- }
71
- }
72
- export class UserMediaBaseService {
73
- /**
74
- *
75
- */
76
- constructor(_logService) {
77
- this._logService = _logService;
78
- this.hasNavigator = false;
79
- this.isMediaDevicesSupported = false;
80
- this._camerasSource = new BehaviorSubject([]);
81
- this.cameras$ = this._camerasSource
82
- .asObservable()
83
- .pipe(shareReplay(1))
84
- .pipe(filter((items) => items && items.length > 0));
85
- this._permissionResponse = new Subject();
86
- this.permissionResponse$ = this._permissionResponse.asObservable();
87
- this._hasDevicesSource = new BehaviorSubject(false);
88
- this.hasDevices$ = this._hasDevicesSource.asObservable().pipe(shareReplay(1));
89
- this._permissionSource = new BehaviorSubject(false);
90
- this.permission$ = this._permissionSource.asObservable().pipe();
91
- this._camerasNotFoundSource = new Subject();
92
- this.camerasNotFound$ = this._camerasNotFoundSource.asObservable().pipe(shareReplay(1));
93
- this.hasNavigator = typeof navigator !== 'undefined';
94
- this.isMediaDevicesSupported = this.hasNavigator && !!navigator.mediaDevices;
95
- }
96
- async updateVideoInputDevices() {
97
- // permissions aren't needed to get devices, but to access them and their info
98
- const devices = (await BrowserCodeReader.listVideoInputDevices()) || [];
99
- const hasDevices = devices && devices.length > 0;
100
- // stores discovered devices and updates information
101
- this._hasDevicesSource.next(hasDevices);
102
- this._camerasSource.next([...devices]);
103
- if (!hasDevices) {
104
- const err = {
105
- code: DOMException.NOT_FOUND_ERR,
106
- message: 'Device not found.'
107
- };
108
- this._camerasNotFoundSource.next(err);
109
- }
110
- return devices;
111
- }
112
- /**
113
- * Gets and registers all cammeras.
114
- */
115
- async askForPermission() {
116
- if (!this.hasNavigator) {
117
- this._logService.error('user media', `Can't ask permission, navigator is not present.`);
118
- this._setPermission(false);
119
- }
120
- if (!this.isMediaDevicesSupported) {
121
- this._logService.error('user media', `Can't get user media, this is not supported.`);
122
- this._setPermission(false);
123
- }
124
- let stream;
125
- let permission = false;
126
- try {
127
- // Will try to ask for permission
128
- stream = await this._getAnyVideoDevice();
129
- permission = !!stream;
130
- }
131
- catch (err) {
132
- this._handlePermissionException(err);
133
- }
134
- finally {
135
- this.terminateStream(stream);
136
- }
137
- this._setPermission(permission);
138
- return permission;
139
- }
140
- terminateStream(stream) {
141
- if (stream) {
142
- stream.getTracks().forEach((t) => t.stop());
143
- }
144
- stream = undefined;
145
- }
146
- _setPermission(permission) {
147
- this._permissionSource.next(permission);
148
- }
149
- _getAnyVideoDevice() {
150
- return navigator.mediaDevices.getUserMedia({ video: true });
151
- }
152
- _handlePermissionException(err) {
153
- console.error('user media', 'Error when asking for permission.', err);
154
- let permission = false;
155
- switch (err.name) {
156
- // usually caused by not secure origins
157
- case 'NotSupportedError':
158
- this._logService.warn('user media', err.message);
159
- // could not claim
160
- permission = false;
161
- // can't check devices
162
- this._hasDevicesSource.next(false);
163
- break;
164
- // user denied permission
165
- case 'NotAllowedError':
166
- this._logService.warn('user media', err.message);
167
- // claimed and denied permission
168
- permission = false;
169
- // this means that input devices exists
170
- this._hasDevicesSource.next(true);
171
- break;
172
- // the device has no attached input devices
173
- case 'NotFoundError':
174
- this._logService.warn('user media', err.message);
175
- // no permissions claimed
176
- permission = false;
177
- // because there was no devices
178
- this._hasDevicesSource.next(false);
179
- // tells the listener about the error
180
- this._camerasNotFoundSource.next(err);
181
- break;
182
- case 'NotReadableError':
183
- this._logService.warn('user media', `Couldn't read the device(s)'s stream, it's probably in use by another app.`);
184
- // no permissions claimed
185
- permission = false;
186
- // there are devices, which I couldn't use
187
- this._hasDevicesSource.next(false);
188
- // tells the listener about the error
189
- this._camerasNotFoundSource.next(err);
190
- break;
191
- default:
192
- this._logService.warn('user media', 'I was not able to define if I have permissions for camera or not.', err);
193
- // unknown
194
- permission = false;
195
- // this.hasDevices.next(undefined;
196
- break;
197
- }
198
- this._setPermission(permission);
199
- // tells the listener about the error
200
- this._permissionResponse.next(err);
201
- return permission;
202
- }
203
- }
204
- UserMediaBaseService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: UserMediaBaseService, deps: [{ token: i1.LogService }], target: i0.ɵɵFactoryTarget.Injectable });
205
- UserMediaBaseService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: UserMediaBaseService });
206
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: UserMediaBaseService, decorators: [{
207
- type: Injectable
208
- }], ctorParameters: function () { return [{ type: i1.LogService }]; } });
209
- export class WebBarcodeService {
210
- constructor(userMediaService) {
211
- this.userMediaService = userMediaService;
212
- this._device = undefined;
213
- this._codeReader = undefined;
214
- this._hints = new Map();
215
- this._scanErrorSource = new Subject();
216
- this._scanFailureSource = new Subject();
217
- this._scanCompleteSource = new Subject();
218
- this._scanSuccessSource = new Subject();
219
- this._options = {
220
- delayBetweenScanAttempts: 50,
221
- delayBetweenScanSuccess: 500
222
- };
223
- this.scanError$ = this._scanErrorSource.asObservable();
224
- this.scanFailure$ = this._scanFailureSource.asObservable();
225
- this.scanComplete$ = this._scanCompleteSource.asObservable();
226
- this.scanSuccess$ = this._scanSuccessSource.asObservable().pipe(map((c) => c.getText()));
227
- }
228
- startScan(device, videoEl, options = this._options) {
229
- // instantly stops the scan before changing devices
230
- this.scanStop();
231
- // correctly sets the new (or none) device
232
- this._device = device || undefined;
233
- this._videoEl = videoEl;
234
- this._options = options;
235
- if (!this._device) {
236
- // cleans the video because user removed the device
237
- BrowserCodeReader.cleanVideoSource(videoEl);
238
- }
239
- if (this._scanSubscription) {
240
- throw new Error('There is already a scan proccess running.');
241
- }
242
- if (!this._device) {
243
- throw new Error('No device defined, cannot start scan, please define a device.');
244
- }
245
- // if enabled, starts scanning
246
- if (device) {
247
- this.scanFromDevice(device.deviceId);
248
- }
249
- }
250
- setFormat(input) {
251
- if (typeof input === 'string') {
252
- throw new Error('Invalid formats, make sure the [formats] input is a binding.');
253
- }
254
- // formats may be set from html template as BarcodeFormat or string array
255
- const formats = input.map((f) => this.getBarcodeFormatOrFail(f));
256
- const hints = this._hints;
257
- // updates the hints
258
- hints.set(DecodeHintType.POSSIBLE_FORMATS, formats);
259
- // handles updating the codeReader
260
- this._hints = hints;
261
- }
262
- scanStop() {
263
- if (this._scanSubscription) {
264
- this._codeReader?.getScannerControls().stop();
265
- this._scanSubscription?.unsubscribe();
266
- this._scanSubscription = undefined;
267
- }
268
- // this.torchCompatible.next(false);
269
- }
270
- destroy() {
271
- // @note apenas necessario por enquanto causa da Torch
272
- this.scanStop();
273
- this._codeReader = undefined;
274
- this._device = undefined;
275
- }
276
- getBarcodeFormatOrFail(format) {
277
- return typeof format === 'string' ? BarcodeFormat[format.trim().toUpperCase()] : format;
278
- }
279
- async scanFromDevice(deviceId) {
280
- const videoElement = this._videoEl;
281
- const codeReader = this.getCodeReader();
282
- const scanStream = await codeReader.scanFromDeviceObservable(deviceId, videoElement);
283
- if (!scanStream) {
284
- throw new Error('Undefined decoding stream, aborting.');
285
- }
286
- const next = (x) => this._onDecodeResult(x.result, x.error);
287
- const error = (err) => this._onDecodeError(err);
288
- const complete = () => { };
289
- this._scanSubscription = scanStream.subscribe(next, error, complete);
290
- if (this._scanSubscription.closed) {
291
- return;
292
- }
293
- // const controls = codeReader.getScannerControls();
294
- // const hasTorchControl = typeof controls.switchTorch !== 'undefined';
295
- // this.torchCompatible.next(hasTorchControl);
296
- }
297
- /**
298
- * Handles decode errors.
299
- */
300
- _onDecodeError(err) {
301
- this._scanErrorSource.next(err);
302
- // this.reset();
303
- }
304
- /**
305
- * Handles decode results.
306
- */
307
- _onDecodeResult(result, error) {
308
- if (result) {
309
- this._scanSuccessSource.next(result);
310
- }
311
- else {
312
- this._scanFailureSource.next(error);
313
- }
314
- if (result) {
315
- this._scanCompleteSource.next(result);
316
- }
317
- }
318
- getCodeReader() {
319
- if (!this._codeReader) {
320
- this._codeReader = new BrowserMultiFormatContinuousReader(this._hints, this._options);
321
- }
322
- return this._codeReader;
323
- }
324
- }
325
- WebBarcodeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: WebBarcodeService, deps: [{ token: UserMediaBaseService }], target: i0.ɵɵFactoryTarget.Injectable });
326
- WebBarcodeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: WebBarcodeService });
327
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: WebBarcodeService, decorators: [{
328
- type: Injectable
329
- }], ctorParameters: function () { return [{ type: UserMediaBaseService }]; } });
330
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyY29kZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2EtZGV2ZWxvcC1jb21wb25lbnRzL3NyYy9saWIvYmFyY29kZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsd0JBQXdCLEVBQW9CLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0YsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBTzNDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGtDQUFtQyxTQUFRLHdCQUF3QjtJQU81RTs7T0FFRztJQUNJLGtCQUFrQjtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7U0FDMUQ7UUFDRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLHdCQUF3QixDQUNqQyxRQUFpQixFQUNqQixTQUE0QjtRQUU1QixNQUFNLEtBQUssR0FBRyxJQUFJLGVBQWUsQ0FBaUIsRUFBRSxDQUFDLENBQUM7UUFDdEQsSUFBSSxLQUFLLENBQUM7UUFFVixJQUFJO1lBQ0EsS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxTQUFTLEVB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MEIsRUFBRSxLQUE0QjtRQUM1RSxJQUFJLE1BQU0sRUFBRTtZQUNSLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDeEM7YUFBTTtZQUNILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBYyxDQUFDLENBQUM7U0FDaEQ7UUFDRCxJQUFJLE1BQU0sRUFBRTtZQUNSLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDekM7SUFDTCxDQUFDO0lBQ08sYUFBYTtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksa0NBQWtDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDekY7UUFFRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQzs7OEdBOUlRLGlCQUFpQjtrSEFBakIsaUJBQWlCOzJGQUFqQixpQkFBaUI7a0JBRDdCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXN1bHQsIEV4Y2VwdGlvbiwgRGVjb2RlSGludFR5cGUsIEJhcmNvZGVGb3JtYXQgfSBmcm9tICdAenhpbmcvbGlicmFyeSc7XHJcbmltcG9ydCB7IENoZWNrc3VtRXhjZXB0aW9uLCBGb3JtYXRFeGNlcHRpb24sIE5vdEZvdW5kRXhjZXB0aW9uIH0gZnJvbSAnQHp4aW5nL2xpYnJhcnknO1xyXG5pbXBvcnQgeyBCcm93c2VyQ29kZVJlYWRlciwgQnJvd3Nlck11bHRpRm9ybWF0UmVhZGVyLCBJU2Nhbm5lckNvbnRyb2xzIH0gZnJvbSAnQHp4aW5nL2Jyb3dzZXInO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2JhcnNhLW5vdmluLXJheS1jb3JlJztcclxuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlc3VsdEFuZEVycm9yIHtcclxuICAgIHJlc3VsdD86IFJlc3VsdDtcclxuICAgIGVycm9yPzogRXhjZXB0aW9uO1xyXG59XHJcblxyXG4vKipcclxuICogQmFzZWQgb24genhpbmctdHlwZXNjcmlwdCBCcm93c2VyQ29kZVJlYWRlclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEJyb3dzZXJNdWx0aUZvcm1hdENvbnRpbnVvdXNSZWFkZXIgZXh0ZW5kcyBCcm93c2VyTXVsdGlGb3JtYXRSZWFkZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBBbGxvd3MgdG8gY2FsbCBzY2FubmVyIGNvbnRyb2xzIEFQSSB3aGlsZSBzY2FubmluZy5cclxuICAgICAqIFdpbGwgYmUgdW5kZWZpbmVkIGlmIG5vIHNjYW5uaW5nIGlzIHJ1bm5pZy5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHNjYW5uZXJDb250cm9sczogSVNjYW5uZXJDb250cm9scyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNvZGUgcmVhZGVyIHNjYW5uZXIgY29udHJvbHMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTY2FubmVyQ29udHJvbHMoKTogSVNjYW5uZXJDb250cm9scyB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNjYW5uZXJDb250cm9scykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNjYW5uaW5nIGlzIHJ1bm5pbmcgYXQgdGhlIHRpbWUuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnNjYW5uZXJDb250cm9scztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YXJ0cyB0aGUgZGVjb2RpbmcgZnJvbSB0aGUgY3VycmVudCBvciBhIG5ldyB2aWRlbyBlbGVtZW50LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBkZXZpY2VJZCBUaGUgZGV2aWNlJ3MgdG8gYmUgdXNlZCBJZFxyXG4gICAgICogQHBhcmFtIHByZXZpZXdFbCBBIG5ldyB2aWRlbyBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBzY2FuRnJvbURldmljZU9ic2VydmFibGUoXHJcbiAgICAgICAgZGV2aWNlSWQ/OiBzdHJpbmcsXHJcbiAgICAgICAgcHJldmlld0VsPzogSFRNTFZpZGVvRWxlbWVudFxyXG4gICAgKTogUHJvbWlzZTxPYnNlcnZhYmxlPFJlc3VsdEFuZEVycm9yPj4ge1xyXG4gICAgICAgIGNvbnN0IHNjYW4kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZXN1bHRBbmRFcnJvcj4oe30pO1xyXG4gICAgICAgIGxldCBjdHJscztcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY3RybHMgPSBhd2FpdCB0aGlzLmRlY29kZUZyb21WaWRlb0RldmljZShkZXZpY2VJZCwgcHJldmlld0VsLCAocmVzdWx0LCBlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHNjYW4kLm5leHQoeyByZXN1bHQgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvck5hbWUgPSBlcnJvci5uYW1lO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjYW5ub3Qgc3RvcCBvbiBmYWlscy5cclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAvLyBzY2FuIEZhaWx1cmUgLSBmb3VuZCBub3RoaW5nLCBubyBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZSA9PT0gTm90Rm91bmRFeGNlcHRpb24ubmFtZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHNjYW4gRXJyb3IgLSBmb3VuZCB0aGUgUVIgYnV0IGdvdCBlcnJvciBvbiBkZWNvZGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZSA9PT0gQ2hlY2tzdW1FeGNlcHRpb24ubmFtZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZSA9PT0gRm9ybWF0RXhjZXB0aW9uLm5hbWUgfHxcclxuICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdObyBNdWx0aUZvcm1hdCBSZWFkZXJzIHdlcmUgYWJsZSB0byBkZXRlY3QgdGhlIGNvZGUuJylcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNjYW4kLm5leHQoeyBlcnJvciB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gcHJvYmFibHkgZmF0YWwgZXJyb3JcclxuICAgICAgICAgICAgICAgIHNjYW4kLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lckNvbnRyb2xzPy5zdG9wKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXJDb250cm9scyA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNjYW5uZXJDb250cm9scyA9IHtcclxuICAgICAgICAgICAgICAgIC4uLmN0cmxzLFxyXG4gICAgICAgICAgICAgICAgc3RvcCgpOiB2b2lkIHtcclxuICAgICAgICAgICAgICAgICAgICBjdHJscy5zdG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NhbiQuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHNjYW4kLmVycm9yKGUpO1xyXG4gICAgICAgICAgICB0aGlzLnNjYW5uZXJDb250cm9scz8uc3RvcCgpO1xyXG4gICAgICAgICAgICB0aGlzLnNjYW5uZXJDb250cm9scyA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzY2FuJC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxufVxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBVc2VyTWVkaWFCYXNlU2VydmljZSB7XHJcbiAgICBoYXNOYXZpZ2F0b3IgPSBmYWxzZTtcclxuICAgIGlzTWVkaWFEZXZpY2VzU3VwcG9ydGVkID0gZmFsc2U7XHJcblxyXG4gICAgX2NhbWVyYXNTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1lZGlhRGV2aWNlSW5mb1tdPihbXSk7XHJcbiAgICBjYW1lcmFzJCA9IHRoaXMuX2NhbWVyYXNTb3VyY2VcclxuICAgICAgICAuYXNPYnNlcnZhYmxlKClcclxuICAgICAgICAucGlwZShzaGFyZVJlcGxheSgxKSlcclxuICAgICAgICAucGlwZShmaWx0ZXIoKGl0ZW1zKSA9PiBpdGVtcyAmJiBpdGVtcy5sZW5ndGggPiAwKSk7XHJcblxyXG4gICAgX3Blcm1pc3Npb25SZXNwb25zZSA9IG5ldyBTdWJqZWN0PERPTUV4Y2VwdGlvbj4oKTtcclxuICAgIHBlcm1pc3Npb25SZXNwb25zZSQgPSB0aGlzLl9wZXJtaXNzaW9uUmVzcG9uc2UuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgX2hhc0RldmljZXNTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIGhhc0RldmljZXMkID0gdGhpcy5faGFzRGV2aWNlc1NvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcclxuXHJcbiAgICBfcGVybWlzc2lvblNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gICAgcGVybWlzc2lvbiQgPSB0aGlzLl9wZXJtaXNzaW9uU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoKTtcclxuXHJcbiAgICBfY2FtZXJhc05vdEZvdW5kU291cmNlID0gbmV3IFN1YmplY3Q8RE9NRXhjZXB0aW9uPigpO1xyXG4gICAgY2FtZXJhc05vdEZvdW5kJCA9IHRoaXMuX2NhbWVyYXNOb3RGb3VuZFNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHtcclxuICAgICAgICB0aGlzLmhhc05hdmlnYXRvciA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnO1xyXG4gICAgICAgIHRoaXMuaXNNZWRpYURldmljZXNTdXBwb3J0ZWQgPSB0aGlzLmhhc05hdmlnYXRvciAmJiAhIW5hdmlnYXRvci5tZWRpYURldmljZXM7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdXBkYXRlVmlkZW9JbnB1dERldmljZXMoKTogUHJvbWlzZTxNZWRpYURldmljZUluZm9bXT4ge1xyXG4gICAgICAgIC8vIHBlcm1pc3Npb25zIGFyZW4ndCBuZWVkZWQgdG8gZ2V0IGRldmljZXMsIGJ1dCB0byBhY2Nlc3MgdGhlbSBhbmQgdGhlaXIgaW5mb1xyXG4gICAgICAgIGNvbnN0IGRldmljZXMgPSAoYXdhaXQgQnJvd3NlckNvZGVSZWFkZXIubGlzdFZpZGVvSW5wdXREZXZpY2VzKCkpIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IGhhc0RldmljZXMgPSBkZXZpY2VzICYmIGRldmljZXMubGVuZ3RoID4gMDtcclxuXHJcbiAgICAgICAgLy8gc3RvcmVzIGRpc2NvdmVyZWQgZGV2aWNlcyBhbmQgdXBkYXRlcyBpbmZvcm1hdGlvblxyXG4gICAgICAgIHRoaXMuX2hhc0RldmljZXNTb3VyY2UubmV4dChoYXNEZXZpY2VzKTtcclxuICAgICAgICB0aGlzLl9jYW1lcmFzU291cmNlLm5leHQoWy4uLmRldmljZXNdKTtcclxuXHJcbiAgICAgICAgaWYgKCFoYXNEZXZpY2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IHtcclxuICAgICAgICAgICAgICAgIGNvZGU6IERPTUV4Y2VwdGlvbi5OT1RfRk9VTkRfRVJSLFxyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0RldmljZSBub3QgZm91bmQuJ1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLl9jYW1lcmFzTm90Rm91bmRTb3VyY2UubmV4dChlcnIgYXMgRE9NRXhjZXB0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkZXZpY2VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbmQgcmVnaXN0ZXJzIGFsbCBjYW1tZXJhcy5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNrRm9yUGVybWlzc2lvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZXJyb3IoJ3VzZXIgbWVkaWEnLCBgQ2FuJ3QgYXNrIHBlcm1pc3Npb24sIG5hdmlnYXRvciBpcyBub3QgcHJlc2VudC5gKTtcclxuICAgICAgICAgICAgdGhpcy5fc2V0UGVybWlzc2lvbihmYWxzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaXNNZWRpYURldmljZXNTdXBwb3J0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9nU2VydmljZS5lcnJvcigndXNlciBtZWRpYScsIGBDYW4ndCBnZXQgdXNlciBtZWRpYSwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkLmApO1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRQZXJtaXNzaW9uKGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzdHJlYW06IE1lZGlhU3RyZWFtIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCBwZXJtaXNzaW9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIFdpbGwgdHJ5IHRvIGFzayBmb3IgcGVybWlzc2lvblxyXG4gICAgICAgICAgICBzdHJlYW0gPSBhd2FpdCB0aGlzLl9nZXRBbnlWaWRlb0RldmljZSgpO1xyXG4gICAgICAgICAgICBwZXJtaXNzaW9uID0gISFzdHJlYW07XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVBlcm1pc3Npb25FeGNlcHRpb24oZXJyIGFzIERPTUV4Y2VwdGlvbik7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy50ZXJtaW5hdGVTdHJlYW0oc3RyZWFtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NldFBlcm1pc3Npb24ocGVybWlzc2lvbik7XHJcbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb247XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgdGVybWluYXRlU3RyZWFtKHN0cmVhbTogTWVkaWFTdHJlYW0gfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICBpZiAoc3RyZWFtKSB7XHJcbiAgICAgICAgICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0KSA9PiB0LnN0b3AoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdHJlYW0gPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX3NldFBlcm1pc3Npb24ocGVybWlzc2lvbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3Blcm1pc3Npb25Tb3VyY2UubmV4dChwZXJtaXNzaW9uKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfZ2V0QW55VmlkZW9EZXZpY2UoKTogUHJvbWlzZTxNZWRpYVN0cmVhbT4ge1xyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IHZpZGVvOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9oYW5kbGVQZXJtaXNzaW9uRXhjZXB0aW9uKGVycjogRE9NRXhjZXB0aW9uKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcigndXNlciBtZWRpYScsICdFcnJvciB3aGVuIGFza2luZyBmb3IgcGVybWlzc2lvbi4nLCBlcnIpO1xyXG4gICAgICAgIGxldCBwZXJtaXNzaW9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZXJyLm5hbWUpIHtcclxuICAgICAgICAgICAgLy8gdXN1YWxseSBjYXVzZWQgYnkgbm90IHNlY3VyZSBvcmlnaW5zXHJcbiAgICAgICAgICAgIGNhc2UgJ05vdFN1cHBvcnRlZEVycm9yJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ1NlcnZpY2Uud2FybigndXNlciBtZWRpYScsIGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIC8vIGNvdWxkIG5vdCBjbGFpbVxyXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gY2FuJ3QgY2hlY2sgZGV2aWNlc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faGFzRGV2aWNlc1NvdXJjZS5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgLy8gdXNlciBkZW5pZWQgcGVybWlzc2lvblxyXG4gICAgICAgICAgICBjYXNlICdOb3RBbGxvd2VkRXJyb3InOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nU2VydmljZS53YXJuKCd1c2VyIG1lZGlhJywgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgLy8gY2xhaW1lZCBhbmQgZGVuaWVkIHBlcm1pc3Npb25cclxuICAgICAgICAgICAgICAgIHBlcm1pc3Npb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhhdCBpbnB1dCBkZXZpY2VzIGV4aXN0c1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faGFzRGV2aWNlc1NvdXJjZS5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAvLyB0aGUgZGV2aWNlIGhhcyBubyBhdHRhY2hlZCBpbnB1dCBkZXZpY2VzXHJcbiAgICAgICAgICAgIGNhc2UgJ05vdEZvdW5kRXJyb3InOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nU2VydmljZS53YXJuKCd1c2VyIG1lZGlhJywgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgLy8gbm8gcGVybWlzc2lvbnMgY2xhaW1lZFxyXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSB3YXMgbm8gZGV2aWNlc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faGFzRGV2aWNlc1NvdXJjZS5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIC8vIHRlbGxzIHRoZSBsaXN0ZW5lciBhYm91dCB0aGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbWVyYXNOb3RGb3VuZFNvdXJjZS5uZXh0KGVycik7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgJ05vdFJlYWRhYmxlRXJyb3InOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nU2VydmljZS53YXJuKFxyXG4gICAgICAgICAgICAgICAgICAgICd1c2VyIG1lZGlhJyxcclxuICAgICAgICAgICAgICAgICAgICBgQ291bGRuJ3QgcmVhZCB0aGUgZGV2aWNlKHMpJ3Mgc3RyZWFtLCBpdCdzIHByb2JhYmx5IGluIHVzZSBieSBhbm90aGVyIGFwcC5gXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgLy8gbm8gcGVybWlzc2lvbnMgY2xhaW1lZFxyXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhlcmUgYXJlIGRldmljZXMsIHdoaWNoIEkgY291bGRuJ3QgdXNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9oYXNEZXZpY2VzU291cmNlLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgLy8gdGVsbHMgdGhlIGxpc3RlbmVyIGFib3V0IHRoZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2FtZXJhc05vdEZvdW5kU291cmNlLm5leHQoZXJyKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ1NlcnZpY2Uud2FybihcclxuICAgICAgICAgICAgICAgICAgICAndXNlciBtZWRpYScsXHJcbiAgICAgICAgICAgICAgICAgICAgJ0kgd2FzIG5vdCBhYmxlIHRvIGRlZmluZSBpZiBJIGhhdmUgcGVybWlzc2lvbnMgZm9yIGNhbWVyYSBvciBub3QuJyxcclxuICAgICAgICAgICAgICAgICAgICBlcnJcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAvLyB1bmtub3duXHJcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmhhc0RldmljZXMubmV4dCh1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NldFBlcm1pc3Npb24ocGVybWlzc2lvbik7XHJcblxyXG4gICAgICAgIC8vIHRlbGxzIHRoZSBsaXN0ZW5lciBhYm91dCB0aGUgZXJyb3JcclxuICAgICAgICB0aGlzLl9wZXJtaXNzaW9uUmVzcG9uc2UubmV4dChlcnIpO1xyXG5cclxuICAgICAgICByZXR1cm4gcGVybWlzc2lvbjtcclxuICAgIH1cclxufVxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBXZWJCYXJjb2RlU2VydmljZSB7XHJcbiAgICBzY2FuRXJyb3IkOiBPYnNlcnZhYmxlPEVycm9yPjtcclxuICAgIHNjYW5GYWlsdXJlJDogT2JzZXJ2YWJsZTxFcnJvcj47XHJcbiAgICBzY2FuQ29tcGxldGUkOiBPYnNlcnZhYmxlPFJlc3VsdD47XHJcbiAgICBzY2FuU3VjY2VzcyQ6IE9ic2VydmFibGU8c3RyaW5nPjtcclxuXHJcbiAgICBwcml2YXRlIF9kZXZpY2U6IE1lZGlhRGV2aWNlSW5mbyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgIHByaXZhdGUgX3ZpZGVvRWw6IEhUTUxWaWRlb0VsZW1lbnQ7XHJcbiAgICBwcml2YXRlIF9jb2RlUmVhZGVyOiBCcm93c2VyTXVsdGlGb3JtYXRDb250aW51b3VzUmVhZGVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgcHJpdmF0ZSBfaGludHM6IE1hcDxEZWNvZGVIaW50VHlwZSwgYW55PiA9IG5ldyBNYXA8RGVjb2RlSGludFR5cGUsIGFueT4oKTtcclxuICAgIHByaXZhdGUgX3NjYW5FcnJvclNvdXJjZSA9IG5ldyBTdWJqZWN0PEVycm9yPigpO1xyXG4gICAgcHJpdmF0ZSBfc2NhbkZhaWx1cmVTb3VyY2UgPSBuZXcgU3ViamVjdDxFcnJvcj4oKTtcclxuICAgIHByaXZhdGUgX3NjYW5TdWJzY3JpcHRpb246IGFueTtcclxuICAgIHByaXZhdGUgX3NjYW5Db21wbGV0ZVNvdXJjZSA9IG5ldyBTdWJqZWN0PFJlc3VsdD4oKTtcclxuICAgIHByaXZhdGUgX3NjYW5TdWNjZXNzU291cmNlID0gbmV3IFN1YmplY3Q8UmVzdWx0PigpO1xyXG4gICAgcHJpdmF0ZSBfb3B0aW9uczoge1xyXG4gICAgICAgIGRlbGF5QmV0d2VlblNjYW5BdHRlbXB0czogbnVtYmVyO1xyXG4gICAgICAgIGRlbGF5QmV0d2VlblNjYW5TdWNjZXNzOiBudW1iZXI7XHJcbiAgICB9ID0ge1xyXG4gICAgICAgIGRlbGF5QmV0d2VlblNjYW5BdHRlbXB0czogNTAsXHJcbiAgICAgICAgZGVsYXlCZXR3ZWVuU2NhblN1Y2Nlc3M6IDUwMFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdXNlck1lZGlhU2VydmljZTogVXNlck1lZGlhQmFzZVNlcnZpY2UpIHtcclxuICAgICAgICB0aGlzLnNjYW5FcnJvciQgPSB0aGlzLl9zY2FuRXJyb3JTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5zY2FuRmFpbHVyZSQgPSB0aGlzLl9zY2FuRmFpbHVyZVNvdXJjZS5hc09ic2VydmFibGUoKTtcclxuICAgICAgICB0aGlzLnNjYW5Db21wbGV0ZSQgPSB0aGlzLl9zY2FuQ29tcGxldGVTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5zY2FuU3VjY2VzcyQgPSB0aGlzLl9zY2FuU3VjY2Vzc1NvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKG1hcCgoYykgPT4gYy5nZXRUZXh0KCkpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhcnRTY2FuKGRldmljZTogTWVkaWFEZXZpY2VJbmZvLCB2aWRlb0VsOiBIVE1MVmlkZW9FbGVtZW50LCBvcHRpb25zID0gdGhpcy5fb3B0aW9ucyk6IHZvaWQge1xyXG4gICAgICAgIC8vIGluc3RhbnRseSBzdG9wcyB0aGUgc2NhbiBiZWZvcmUgY2hhbmdpbmcgZGV2aWNlc1xyXG4gICAgICAgIHRoaXMuc2NhblN0b3AoKTtcclxuXHJcbiAgICAgICAgLy8gY29ycmVjdGx5IHNldHMgdGhlIG5ldyAob3Igbm9uZSkgZGV2aWNlXHJcbiAgICAgICAgdGhpcy5fZGV2aWNlID0gZGV2aWNlIHx8IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl92aWRlb0VsID0gdmlkZW9FbDtcclxuICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICBpZiAoIXRoaXMuX2RldmljZSkge1xyXG4gICAgICAgICAgICAvLyBjbGVhbnMgdGhlIHZpZGVvIGJlY2F1c2UgdXNlciByZW1vdmVkIHRoZSBkZXZpY2VcclxuICAgICAgICAgICAgQnJvd3NlckNvZGVSZWFkZXIuY2xlYW5WaWRlb1NvdXJjZSh2aWRlb0VsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3NjYW5TdWJzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBpcyBhbHJlYWR5IGEgc2NhbiBwcm9jY2VzcyBydW5uaW5nLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9kZXZpY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBkZXZpY2UgZGVmaW5lZCwgY2Fubm90IHN0YXJ0IHNjYW4sIHBsZWFzZSBkZWZpbmUgYSBkZXZpY2UuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiBlbmFibGVkLCBzdGFydHMgc2Nhbm5pbmdcclxuICAgICAgICBpZiAoZGV2aWNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NhbkZyb21EZXZpY2UoZGV2aWNlLmRldmljZUlkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0Rm9ybWF0KGlucHV0OiBCYXJjb2RlRm9ybWF0W10pOiB2b2lkIHtcclxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZm9ybWF0cywgbWFrZSBzdXJlIHRoZSBbZm9ybWF0c10gaW5wdXQgaXMgYSBiaW5kaW5nLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZm9ybWF0cyBtYXkgYmUgc2V0IGZyb20gaHRtbCB0ZW1wbGF0ZSBhcyBCYXJjb2RlRm9ybWF0IG9yIHN0cmluZyBhcnJheVxyXG4gICAgICAgIGNvbnN0IGZvcm1hdHMgPSBpbnB1dC5tYXAoKGYpID0+IHRoaXMuZ2V0QmFyY29kZUZvcm1hdE9yRmFpbChmKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbnRzID0gdGhpcy5faGludHM7XHJcblxyXG4gICAgICAgIC8vIHVwZGF0ZXMgdGhlIGhpbnRzXHJcbiAgICAgICAgaGludHMuc2V0KERlY29kZUhpbnRUeXBlLlBPU1NJQkxFX0ZPUk1BVFMsIGZvcm1hdHMpO1xyXG5cclxuICAgICAgICAvLyBoYW5kbGVzIHVwZGF0aW5nIHRoZSBjb2RlUmVhZGVyXHJcbiAgICAgICAgdGhpcy5faGludHMgPSBoaW50cztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzY2FuU3RvcCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fc2NhblN1YnNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLl9jb2RlUmVhZGVyPy5nZXRTY2FubmVyQ29udHJvbHMoKS5zdG9wKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NjYW5TdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NjYW5TdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMudG9yY2hDb21wYXRpYmxlLm5leHQoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIC8vIEBub3RlIGFwZW5hcyBuZWNlc3NhcmlvIHBvciBlbnF1YW50byBjYXVzYSBkYSBUb3JjaFxyXG4gICAgICAgIHRoaXMuc2NhblN0b3AoKTtcclxuICAgICAgICB0aGlzLl9jb2RlUmVhZGVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX2RldmljZSA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEJhcmNvZGVGb3JtYXRPckZhaWwoZm9ybWF0OiBzdHJpbmcgfCBCYXJjb2RlRm9ybWF0KTogQmFyY29kZUZvcm1hdCB7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBmb3JtYXQgPT09ICdzdHJpbmcnID8gQmFyY29kZUZvcm1hdFtmb3JtYXQudHJpbSgpLnRvVXBwZXJDYXNlKCldIDogZm9ybWF0O1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBhc3luYyBzY2FuRnJvbURldmljZShkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgdmlkZW9FbGVtZW50ID0gdGhpcy5fdmlkZW9FbDtcclxuXHJcbiAgICAgICAgY29uc3QgY29kZVJlYWRlciA9IHRoaXMuZ2V0Q29kZVJlYWRlcigpO1xyXG5cclxuICAgICAgICBjb25zdCBzY2FuU3RyZWFtID0gYXdhaXQgY29kZVJlYWRlci5zY2FuRnJvbURldmljZU9ic2VydmFibGUoZGV2aWNlSWQsIHZpZGVvRWxlbWVudCk7XHJcblxyXG4gICAgICAgIGlmICghc2NhblN0cmVhbSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZGVmaW5lZCBkZWNvZGluZyBzdHJlYW0sIGFib3J0aW5nLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbmV4dCA9ICh4OiBSZXN1bHRBbmRFcnJvcik6IHZvaWQgPT4gdGhpcy5fb25EZWNvZGVSZXN1bHQoeC5yZXN1bHQsIHguZXJyb3IpO1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gKGVycjogYW55KTogdm9pZCA9PiB0aGlzLl9vbkRlY29kZUVycm9yKGVycik7XHJcbiAgICAgICAgY29uc3QgY29tcGxldGUgPSAoKTogdm9pZCA9PiB7fTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2NhblN1YnNjcmlwdGlvbiA9IHNjYW5TdHJlYW0uc3Vic2NyaWJlKG5leHQsIGVycm9yLCBjb21wbGV0ZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zY2FuU3Vic2NyaXB0aW9uLmNsb3NlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjb25zdCBjb250cm9scyA9IGNvZGVSZWFkZXIuZ2V0U2Nhbm5lckNvbnRyb2xzKCk7XHJcbiAgICAgICAgLy8gY29uc3QgaGFzVG9yY2hDb250cm9sID0gdHlwZW9mIGNvbnRyb2xzLnN3aXRjaFRvcmNoICE9PSAndW5kZWZpbmVkJztcclxuXHJcbiAgICAgICAgLy8gdGhpcy50b3JjaENvbXBhdGlibGUubmV4dChoYXNUb3JjaENvbnRyb2wpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIGRlY29kZSBlcnJvcnMuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX29uRGVjb2RlRXJyb3IoZXJyOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zY2FuRXJyb3JTb3VyY2UubmV4dChlcnIpO1xyXG4gICAgICAgIC8vIHRoaXMucmVzZXQoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlcyBkZWNvZGUgcmVzdWx0cy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfb25EZWNvZGVSZXN1bHQocmVzdWx0OiBSZXN1bHQgfCB1bmRlZmluZWQsIGVycm9yOiBFeGNlcHRpb24gfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NjYW5TdWNjZXNzU291cmNlLm5leHQocmVzdWx0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9zY2FuRmFpbHVyZVNvdXJjZS5uZXh0KGVycm9yIGFzIEVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zY2FuQ29tcGxldGVTb3VyY2UubmV4dChyZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgZ2V0Q29kZVJlYWRlcigpOiBCcm93c2VyTXVsdGlGb3JtYXRDb250aW51b3VzUmVhZGVyIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2NvZGVSZWFkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fY29kZVJlYWRlciA9IG5ldyBCcm93c2VyTXVsdGlGb3JtYXRDb250aW51b3VzUmVhZGVyKHRoaXMuX2hpbnRzLCB0aGlzLl9vcHRpb25zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb2RlUmVhZGVyO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==