barsa-develop-components 2.2.73 → 2.2.75

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 (81) hide show
  1. package/fesm2022/barsa-develop-components.mjs +205 -204
  2. package/fesm2022/barsa-develop-components.mjs.map +1 -1
  3. package/lib/avatar/avatar.component.d.ts +1 -1
  4. package/lib/form-report-view/form-report-view.component.d.ts +1 -1
  5. package/lib/geographic-location/geographic-location.component.d.ts +1 -1
  6. package/lib/report-button-view/report-button-view.component.d.ts +1 -1
  7. package/package.json +3 -5
  8. package/esm2022/barsa-develop-components.mjs +0 -5
  9. package/esm2022/lib/accept-reject/accept-reject.component.mjs +0 -68
  10. package/esm2022/lib/avatar/avatar.component.mjs +0 -29
  11. package/esm2022/lib/barcode-format-pipe.mjs +0 -25
  12. package/esm2022/lib/barcode-reader/barcode-reader.component.mjs +0 -62
  13. package/esm2022/lib/barcode-reader-dialog/barcode-reader-dialog.component.mjs +0 -82
  14. package/esm2022/lib/barcode-reader-video/barcode-reader-video.component.mjs +0 -66
  15. package/esm2022/lib/barcode.service.mjs +0 -330
  16. package/esm2022/lib/barsa-develop-components.module.mjs +0 -292
  17. package/esm2022/lib/barsa-document-list-item/barsa-document-list-item.component.mjs +0 -104
  18. package/esm2022/lib/barsa-documents/barsa-documents.component.mjs +0 -159
  19. package/esm2022/lib/barsa-geographic-location/barsa-geographic-location.component.mjs +0 -173
  20. package/esm2022/lib/card-content-image-and-title/card-content-image-and-title.component.mjs +0 -50
  21. package/esm2022/lib/card-content-line-chart/card-content-line-chart.component.mjs +0 -36
  22. package/esm2022/lib/card-header-big-image-title-and-subtitle/card-header-big-image-title-and-subtitle.component.mjs +0 -19
  23. package/esm2022/lib/card-header-kpi/card-header-kpi.component.mjs +0 -40
  24. package/esm2022/lib/card-header-logo-title-subtitle/card-header-logo-title-subtitle.component.mjs +0 -45
  25. package/esm2022/lib/checkbox-button/checkbox-button.component.mjs +0 -23
  26. package/esm2022/lib/column-chip/column-chip.component.mjs +0 -44
  27. package/esm2022/lib/column-form-viewer/column-form-viewer.component.mjs +0 -88
  28. package/esm2022/lib/column-progressbar/column-progressbar.component.mjs +0 -87
  29. package/esm2022/lib/enum-info-micro-proccess-flow/enum-info-micro-proccess-flow.component.mjs +0 -18
  30. package/esm2022/lib/footer/footer.component.mjs +0 -43
  31. package/esm2022/lib/form-card/form-card.component.mjs +0 -17
  32. package/esm2022/lib/form-chart-content/form-chart-content.component.mjs +0 -36
  33. package/esm2022/lib/form-content-quick-view/form-content-quick-view.component.mjs +0 -102
  34. package/esm2022/lib/form-report-view/form-report-view.component.mjs +0 -25
  35. package/esm2022/lib/form-report-view-item/form-report-view-item.component.mjs +0 -45
  36. package/esm2022/lib/g4b-details/g4b-details.component.mjs +0 -28
  37. package/esm2022/lib/g4b-estelam/g4b-estelam.component.mjs +0 -30
  38. package/esm2022/lib/geographic-location/geographic-location.component.mjs +0 -88
  39. package/esm2022/lib/login-form/login-form.component.mjs +0 -55
  40. package/esm2022/lib/login-social-conncetions/login-social-conncetions.component.mjs +0 -30
  41. package/esm2022/lib/master-detail-card-form/master-detail-card-form.component.mjs +0 -17
  42. package/esm2022/lib/media-file-uploader/media-file-uploader.component.mjs +0 -238
  43. package/esm2022/lib/micro-proccess-flow/micro-proccess-flow.component.mjs +0 -52
  44. package/esm2022/lib/micro-process-flow-view/micro-process-flow-view.component.mjs +0 -24
  45. package/esm2022/lib/mo-info-micro-proccess-flow/mo-info-micro-proccess-flow.component.mjs +0 -23
  46. package/esm2022/lib/models/document-item.mjs +0 -2
  47. package/esm2022/lib/models/documents-setting.mjs +0 -2
  48. package/esm2022/lib/models/form-report-view-setting.mjs +0 -2
  49. package/esm2022/lib/models/index.mjs +0 -8
  50. package/esm2022/lib/models/micro-process-flow-view-setting.mjs +0 -2
  51. package/esm2022/lib/models/person.mjs +0 -2
  52. package/esm2022/lib/models/service-desk-view-of-services-setting.mjs +0 -2
  53. package/esm2022/lib/models/tab-process-view-setting.mjs +0 -2
  54. package/esm2022/lib/pipes/datasource-to-flow-item.mjs +0 -23
  55. package/esm2022/lib/pipes/index.mjs +0 -3
  56. package/esm2022/lib/pipes/mo-list-to-flow-item.pipe.mjs +0 -23
  57. package/esm2022/lib/query-string-form-observable/query-string-form-observable.component.mjs +0 -37
  58. package/esm2022/lib/query-string-observable/query-string-observable.component.mjs +0 -22
  59. package/esm2022/lib/report-button-view/report-button-view.component.mjs +0 -37
  60. package/esm2022/lib/report-line-chart-view/report-line-chart-view.component.mjs +0 -12
  61. package/esm2022/lib/report-tab-view/report-tab-view.component.mjs +0 -27
  62. package/esm2022/lib/resend-verification-code/resend-verification-code.component.mjs +0 -62
  63. package/esm2022/lib/service-desk-card-content-mojavezhay-akhz-shode/service-desk-card-content-mojavezhay-akhz-shode.component.mjs +0 -28
  64. package/esm2022/lib/service-desk-form-layout-content-mojavez/service-desk-form-layout-content-mojavez.component.mjs +0 -110
  65. package/esm2022/lib/service-desk-header/service-desk-header.component.mjs +0 -249
  66. package/esm2022/lib/service-desk-servcie-detail/service-desk-servcie-detail.component.mjs +0 -142
  67. package/esm2022/lib/service-desk-view-of-services/service-desk-view-of-services.component.mjs +0 -37
  68. package/esm2022/lib/setting-form/setting-form.component.mjs +0 -64
  69. package/esm2022/lib/subform-in-row-report/subform-in-row-report.component.mjs +0 -73
  70. package/esm2022/lib/tab-process-view/tab-process-view.component.mjs +0 -48
  71. package/esm2022/lib/table-view-vertical-columns/table-view-vertical-columns.component.mjs +0 -16
  72. package/esm2022/lib/timer-count-down/timer-count-down.component.mjs +0 -104
  73. package/esm2022/lib/token-report-view/token-report-view.component.mjs +0 -27
  74. package/esm2022/lib/ui-enum-segmented-button/ui-enum-segmented-button.component.mjs +0 -25
  75. package/esm2022/lib/ui-num-rate/ui-num-rate.component.mjs +0 -41
  76. package/esm2022/lib/ui-person/ui-person.component.mjs +0 -160
  77. package/esm2022/lib/ui-person/ui-person.pipe.mjs +0 -41
  78. package/esm2022/lib/ui-pictures-carousel/ui-pictures-carousel.component.mjs +0 -17
  79. package/esm2022/lib/ui-text-field-search/ui-text-field-search.component.mjs +0 -42
  80. package/esm2022/lib/ulv-context-menu-item-show-file-content/ulv-context-menu-item-show-file-content.component.mjs +0 -69
  81. package/esm2022/public-api.mjs +0 -64
@@ -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
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserMediaBaseService, deps: [{ token: i1.LogService }], target: i0.ɵɵFactoryTarget.Injectable }); }
204
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserMediaBaseService }); }
205
- }
206
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserMediaBaseService, decorators: [{
207
- type: Injectable
208
- }], ctorParameters: () => [{ 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
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WebBarcodeService, deps: [{ token: UserMediaBaseService }], target: i0.ɵɵFactoryTarget.Injectable }); }
325
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WebBarcodeService }); }
326
- }
327
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WebBarcodeService, decorators: [{
328
- type: Injectable
329
- }], ctorParameters: () => [{ type: UserMediaBaseService }] });
330
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyY29kZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2EtZGV2ZWxvcC1jb21wb25lbnRzL3NyYy9saWIvYmFyY29kZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsd0JBQXdCLEVBQW9CLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0YsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBTzNDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGtDQUFtQyxTQUFRLHdCQUF3QjtJQU81RTs7T0FFRztJQUNJLGtCQUFrQjtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyx3QkFBd0IsQ0FDakMsUUFBaUIsRUFDakIsU0FBNEI7UUFFNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxlQUFlLENBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELElBQUksS0FBSyxDQUFDO1FBRVYsSUFBSSxDQUFDO1lBQ0QsS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFB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Q0FBQztZQUNoQyxPQUFPO1FBQ1gsQ0FBQztRQUVELG9EQUFvRDtRQUNwRCx1RUFBdUU7UUFFdkUsOENBQThDO0lBQ2xELENBQUM7SUFDRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxHQUFRO1FBQzNCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsZ0JBQWdCO0lBQ3BCLENBQUM7SUFDRDs7T0FFRztJQUNLLGVBQWUsQ0FBQyxNQUEwQixFQUFFLEtBQTRCO1FBQzVFLElBQUksTUFBTSxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFjLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUMsQ0FBQztJQUNMLENBQUM7SUFDTyxhQUFhO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQzsrR0E5SVEsaUJBQWlCO21IQUFqQixpQkFBaUI7OzRGQUFqQixpQkFBaUI7a0JBRDdCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXN1bHQsIEV4Y2VwdGlvbiwgRGVjb2RlSGludFR5cGUsIEJhcmNvZGVGb3JtYXQgfSBmcm9tICdAenhpbmcvbGlicmFyeSc7XHJcbmltcG9ydCB7IENoZWNrc3VtRXhjZXB0aW9uLCBGb3JtYXRFeGNlcHRpb24sIE5vdEZvdW5kRXhjZXB0aW9uIH0gZnJvbSAnQHp4aW5nL2xpYnJhcnknO1xyXG5pbXBvcnQgeyBCcm93c2VyQ29kZVJlYWRlciwgQnJvd3Nlck11bHRpRm9ybWF0UmVhZGVyLCBJU2Nhbm5lckNvbnRyb2xzIH0gZnJvbSAnQHp4aW5nL2Jyb3dzZXInO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2JhcnNhLW5vdmluLXJheS1jb3JlJztcclxuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlc3VsdEFuZEVycm9yIHtcclxuICAgIHJlc3VsdD86IFJlc3VsdDtcclxuICAgIGVycm9yPzogRXhjZXB0aW9uO1xyXG59XHJcblxyXG4vKipcclxuICogQmFzZWQgb24genhpbmctdHlwZXNjcmlwdCBCcm93c2VyQ29kZVJlYWRlclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEJyb3dzZXJNdWx0aUZvcm1hdENvbnRpbnVvdXNSZWFkZXIgZXh0ZW5kcyBCcm93c2VyTXVsdGlGb3JtYXRSZWFkZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBBbGxvd3MgdG8gY2FsbCBzY2FubmVyIGNvbnRyb2xzIEFQSSB3aGlsZSBzY2FubmluZy5cclxuICAgICAqIFdpbGwgYmUgdW5kZWZpbmVkIGlmIG5vIHNjYW5uaW5nIGlzIHJ1bm5pZy5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHNjYW5uZXJDb250cm9sczogSVNjYW5uZXJDb250cm9scyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNvZGUgcmVhZGVyIHNjYW5uZXIgY29udHJvbHMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTY2FubmVyQ29udHJvbHMoKTogSVNjYW5uZXJDb250cm9scyB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNjYW5uZXJDb250cm9scykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNjYW5uaW5nIGlzIHJ1bm5pbmcgYXQgdGhlIHRpbWUuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnNjYW5uZXJDb250cm9scztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YXJ0cyB0aGUgZGVjb2RpbmcgZnJvbSB0aGUgY3VycmVudCBvciBhIG5ldyB2aWRlbyBlbGVtZW50LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBkZXZpY2VJZCBUaGUgZGV2aWNlJ3MgdG8gYmUgdXNlZCBJZFxyXG4gICAgICogQHBhcmFtIHByZXZpZXdFbCBBIG5ldyB2aWRlbyBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBzY2FuRnJvbURldmljZU9ic2VydmFibGUoXHJcbiAgICAgICAgZGV2aWNlSWQ/OiBzdHJpbmcsXHJcbiAgICAgICAgcHJldmlld0VsPzogSFRNTFZpZGVvRWxlbWVudFxyXG4gICAgKTogUHJvbWlzZTxPYnNlcnZhYmxlPFJlc3VsdEFuZEVycm9yPj4ge1xyXG4gICAgICAgIGNvbnN0IHNjYW4kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZXN1bHRBbmRFcnJvcj4oe30pO1xyXG4gICAgICAgIGxldCBjdHJscztcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY3RybHMgPSBhd2FpdCB0aGlzLmRlY29kZUZyb21WaWRlb0RldmljZShkZXZpY2VJZCwgcHJldmlld0VsLCAocmVzdWx0LCBlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHNjYW4kLm5leHQoeyByZXN1bHQgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvck5hbWUgPSBlcnJvci5uYW1lO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjYW5ub3Qgc3RvcCBvbiBmYWlscy5cclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAvLyBzY2FuIEZhaWx1cmUgLSBmb3VuZCBub3RoaW5nLCBubyBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZSA9PT0gTm90Rm91bmRFeGNlcHRpb24ubmFtZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHNjYW4gRXJyb3IgLSBmb3VuZCB0aGUgUVIgYnV0IGdvdCBlcnJvciBvbiBkZWNvZGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZSA9PT0gQ2hlY2tzdW1FeGNlcHRpb24ubmFtZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZSA9PT0gRm9ybWF0RXhjZXB0aW9uLm5hbWUgfHxcclxuICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdObyBNdWx0aUZvcm1hdCBSZWFkZXJzIHdlcmUgYWJsZSB0byBkZXRlY3QgdGhlIGNvZGUuJylcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNjYW4kLm5leHQoeyBlcnJvciB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gcHJvYmFibHkgZmF0YWwgZXJyb3JcclxuICAgICAgICAgICAgICAgIHNjYW4kLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lckNvbnRyb2xzPy5zdG9wKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXJDb250cm9scyA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNjYW5uZXJDb250cm9scyA9IHtcclxuICAgICAgICAgICAgICAgIC4uLmN0cmxzLFxyXG4gICAgICAgICAgICAgICAgc3RvcCgpOiB2b2lkIHtcclxuICAgICAgICAgICAgICAgICAgICBjdHJscy5zdG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NhbiQuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHNjYW4kLmVycm9yKGUpO1xyXG4gICAgICAgICAgICB0aGlzLnNjYW5uZXJDb250cm9scz8uc3RvcCgpO1xyXG4gICAgICAgICAgICB0aGlzLnNjYW5uZXJDb250cm9scyA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzY2FuJC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxufVxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBVc2VyTWVkaWFCYXNlU2VydmljZSB7XHJcbiAgICBoYXNOYXZpZ2F0b3IgPSBmYWxzZTtcclxuICAgIGlzTWVkaWFEZXZpY2VzU3VwcG9ydGVkID0gZmFsc2U7XHJcblxyXG4gICAgX2NhbWVyYXNTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1lZGlhRGV2aWNlSW5mb1tdPihbXSk7XHJcbiAgICBjYW1lcmFzJCA9IHRoaXMuX2NhbWVyYXNTb3VyY2VcclxuICAgICAgICAuYXNPYnNlcnZhYmxlKClcclxuICAgICAgICAucGlwZShzaGFyZVJlcGxheSgxKSlcclxuICAgICAgICAucGlwZShmaWx0ZXIoKGl0ZW1zKSA9PiBpdGVtcyAmJiBpdGVtcy5sZW5ndGggPiAwKSk7XHJcblxyXG4gICAgX3Blcm1pc3Npb25SZXNwb25zZSA9IG5ldyBTdWJqZWN0PERPTUV4Y2VwdGlvbj4oKTtcclxuICAgIHBlcm1pc3Npb25SZXNwb25zZSQgPSB0aGlzLl9wZXJtaXNzaW9uUmVzcG9uc2UuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgX2hhc0RldmljZXNTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIGhhc0RldmljZXMkID0gdGhpcy5faGFzRGV2aWNlc1NvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcclxuXHJcbiAgICBfcGVybWlzc2lvblNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gICAgcGVybWlzc2lvbiQgPSB0aGlzLl9wZXJtaXNzaW9uU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoKTtcclxuXHJcbiAgICBfY2FtZXJhc05vdEZvdW5kU291cmNlID0gbmV3IFN1YmplY3Q8RE9NRXhjZXB0aW9uPigpO1xyXG4gICAgY2FtZXJhc05vdEZvdW5kJCA9IHRoaXMuX2NhbWVyYXNOb3RGb3VuZFNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHtcclxuICAgICAgICB0aGlzLmhhc05hdmlnYXRvciA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnO1xyXG4gICAgICAgIHRoaXMuaXNNZWRpYURldmljZXNTdXBwb3J0ZWQgPSB0aGlzLmhhc05hdmlnYXRvciAmJiAhIW5hdmlnYXRvci5tZWRpYURldmljZXM7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdXBkYXRlVmlkZW9JbnB1dERldmljZXMoKTogUHJvbWlzZTxNZWRpYURldmljZUluZm9bXT4ge1xyXG4gICAgICAgIC8vIHBlcm1pc3Npb25zIGFyZW4ndCBuZWVkZWQgdG8gZ2V0IGRldmljZXMsIGJ1dCB0byBhY2Nlc3MgdGhlbSBhbmQgdGhlaXIgaW5mb1xyXG4gICAgICAgIGNvbnN0IGRldmljZXMgPSAoYXdhaXQgQnJvd3NlckNvZGVSZWFkZXIubGlzdFZpZGVvSW5wdXREZXZpY2VzKCkpIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IGhhc0RldmljZXMgPSBkZXZpY2VzICYmIGRldmljZXMubGVuZ3RoID4gMDtcclxuXHJcbiAgICAgICAgLy8gc3RvcmVzIGRpc2NvdmVyZWQgZGV2aWNlcyBhbmQgdXBkYXRlcyBpbmZvcm1hdGlvblxyXG4gICAgICAgIHRoaXMuX2hhc0RldmljZXNTb3VyY2UubmV4dChoYXNEZXZpY2VzKTtcclxuICAgICAgICB0aGlzLl9jYW1lcmFzU291cmNlLm5leHQoWy4uLmRldmljZXNdKTtcclxuXHJcbiAgICAgICAgaWYgKCFoYXNEZXZpY2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IHtcclxuICAgICAgICAgICAgICAgIGNvZGU6IERPTUV4Y2VwdGlvbi5OT1RfRk9VTkRfRVJSLFxyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0RldmljZSBub3QgZm91bmQuJ1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLl9jYW1lcmFzTm90Rm91bmRTb3VyY2UubmV4dChlcnIgYXMgRE9NRXhjZXB0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkZXZpY2VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbmQgcmVnaXN0ZXJzIGFsbCBjYW1tZXJhcy5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNrRm9yUGVybWlzc2lvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZXJyb3IoJ3VzZXIgbWVkaWEnLCBgQ2FuJ3QgYXNrIHBlcm1pc3Npb24sIG5hdmlnYXRvciBpcyBub3QgcHJlc2VudC5gKTtcclxuICAgICAgICAgICAgdGhpcy5fc2V0UGVybWlzc2lvbihmYWxzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaXNNZWRpYURldmljZXNTdXBwb3J0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9nU2VydmljZS5lcnJvcigndXNlciBtZWRpYScsIGBDYW4ndCBnZXQgdXNlciBtZWRpYSwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkLmApO1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRQZXJtaXNzaW9uKGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzdHJlYW06IE1lZGlhU3RyZWFtIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCBwZXJtaXNzaW9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIFdpbGwgdHJ5IHRvIGFzayBmb3IgcGVybWlzc2lvblxyXG4gICAgICAgICAgICBzdHJlYW0gPSBhd2FpdCB0aGlzLl9nZXRBbnlWaWRlb0RldmljZSgpO1xyXG4gICAgICAgICAgICBwZXJtaXNzaW9uID0gISFzdHJlYW07XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVBlcm1pc3Npb25FeGNlcHRpb24oZXJyIGFzIERPTUV4Y2VwdGlvbik7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy50ZXJtaW5hdGVTdHJlYW0oc3RyZWFtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NldFBlcm1pc3Npb24ocGVybWlzc2lvbik7XHJcbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb247XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgdGVybWluYXRlU3RyZWFtKHN0cmVhbTogTWVkaWFTdHJlYW0gfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICBpZiAoc3RyZWFtKSB7XHJcbiAgICAgICAgICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0KSA9PiB0LnN0b3AoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdHJlYW0gPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX3NldFBlcm1pc3Npb24ocGVybWlzc2lvbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3Blcm1pc3Npb25Tb3VyY2UubmV4dChwZXJtaXNzaW9uKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfZ2V0QW55VmlkZW9EZXZpY2UoKTogUHJvbWlzZTxNZWRpYVN0cmVhbT4ge1xyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IHZpZGVvOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9oYW5kbGVQZXJtaXNzaW9uRXhjZXB0aW9uKGVycjogRE9NRXhjZXB0aW9uKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcigndXNlciBtZWRpYScsICdFcnJvciB3aGVuIGFza2luZyBmb3IgcGVybWlzc2lvbi4nLCBlcnIpO1xyXG4gICAgICAgIGxldCBwZXJtaXNzaW9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZXJyLm5hbWUpIHtcclxuICAgICAgICAgICAgLy8gdXN1YWxseSBjYXVzZWQgYnkgbm90IHNlY3VyZSBvcmlnaW5zXHJcbiAgICAgICAgICAgIGNhc2UgJ05vdFN1cHBvcnRlZEVycm9yJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ1NlcnZpY2Uud2FybigndXNlciBtZWRpYScsIGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIC8vIGNvdWxkIG5vdCBjbGFpbVxyXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gY2FuJ3QgY2hlY2sgZGV2aWNlc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faGFzRGV2aWNlc1NvdXJjZS5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgLy8gdXNlciBkZW5pZWQgcGVybWlzc2lvblxyXG4gICAgICAgICAgICBjYXNlICdOb3RBbGxvd2VkRXJyb3InOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nU2VydmljZS53YXJuKCd1c2VyIG1lZGlhJywgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgLy8gY2xhaW1lZCBhbmQgZGVuaWVkIHBlcm1pc3Npb25cclxuICAgICAgICAgICAgICAgIHBlcm1pc3Npb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhhdCBpbnB1dCBkZXZpY2VzIGV4aXN0c1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faGFzRGV2aWNlc1NvdXJjZS5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAvLyB0aGUgZGV2aWNlIGhhcyBubyBhdHRhY2hlZCBpbnB1dCBkZXZpY2VzXHJcbiAgICAgICAgICAgIGNhc2UgJ05vdEZvdW5kRXJyb3InOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nU2VydmljZS53YXJuKCd1c2VyIG1lZGlhJywgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgLy8gbm8gcGVybWlzc2lvbnMgY2xhaW1lZFxyXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSB3YXMgbm8gZGV2aWNlc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faGFzRGV2aWNlc1NvdXJjZS5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIC8vIHRlbGxzIHRoZSBsaXN0ZW5lciBhYm91dCB0aGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbWVyYXNOb3RGb3VuZFNvdXJjZS5uZXh0KGVycik7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgJ05vdFJlYWRhYmxlRXJyb3InOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nU2VydmljZS53YXJuKFxyXG4gICAgICAgICAgICAgICAgICAgICd1c2VyIG1lZGlhJyxcclxuICAgICAgICAgICAgICAgICAgICBgQ291bGRuJ3QgcmVhZCB0aGUgZGV2aWNlKHMpJ3Mgc3RyZWFtLCBpdCdzIHByb2JhYmx5IGluIHVzZSBieSBhbm90aGVyIGFwcC5gXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgLy8gbm8gcGVybWlzc2lvbnMgY2xhaW1lZFxyXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhlcmUgYXJlIGRldmljZXMsIHdoaWNoIEkgY291bGRuJ3QgdXNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9oYXNEZXZpY2VzU291cmNlLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgLy8gdGVsbHMgdGhlIGxpc3RlbmVyIGFib3V0IHRoZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2FtZXJhc05vdEZvdW5kU291cmNlLm5leHQoZXJyKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ1NlcnZpY2Uud2FybihcclxuICAgICAgICAgICAgICAgICAgICAndXNlciBtZWRpYScsXHJcbiAgICAgICAgICAgICAgICAgICAgJ0kgd2FzIG5vdCBhYmxlIHRvIGRlZmluZSBpZiBJIGhhdmUgcGVybWlzc2lvbnMgZm9yIGNhbWVyYSBvciBub3QuJyxcclxuICAgICAgICAgICAgICAgICAgICBlcnJcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAvLyB1bmtub3duXHJcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmhhc0RldmljZXMubmV4dCh1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NldFBlcm1pc3Npb24ocGVybWlzc2lvbik7XHJcblxyXG4gICAgICAgIC8vIHRlbGxzIHRoZSBsaXN0ZW5lciBhYm91dCB0aGUgZXJyb3JcclxuICAgICAgICB0aGlzLl9wZXJtaXNzaW9uUmVzcG9uc2UubmV4dChlcnIpO1xyXG5cclxuICAgICAgICByZXR1cm4gcGVybWlzc2lvbjtcclxuICAgIH1cclxufVxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBXZWJCYXJjb2RlU2VydmljZSB7XHJcbiAgICBzY2FuRXJyb3IkOiBPYnNlcnZhYmxlPEVycm9yPjtcclxuICAgIHNjYW5GYWlsdXJlJDogT2JzZXJ2YWJsZTxFcnJvcj47XHJcbiAgICBzY2FuQ29tcGxldGUkOiBPYnNlcnZhYmxlPFJlc3VsdD47XHJcbiAgICBzY2FuU3VjY2VzcyQ6IE9ic2VydmFibGU8c3RyaW5nPjtcclxuXHJcbiAgICBwcml2YXRlIF9kZXZpY2U6IE1lZGlhRGV2aWNlSW5mbyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgIHByaXZhdGUgX3ZpZGVvRWw6IEhUTUxWaWRlb0VsZW1lbnQ7XHJcbiAgICBwcml2YXRlIF9jb2RlUmVhZGVyOiBCcm93c2VyTXVsdGlGb3JtYXRDb250aW51b3VzUmVhZGVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgcHJpdmF0ZSBfaGludHM6IE1hcDxEZWNvZGVIaW50VHlwZSwgYW55PiA9IG5ldyBNYXA8RGVjb2RlSGludFR5cGUsIGFueT4oKTtcclxuICAgIHByaXZhdGUgX3NjYW5FcnJvclNvdXJjZSA9IG5ldyBTdWJqZWN0PEVycm9yPigpO1xyXG4gICAgcHJpdmF0ZSBfc2NhbkZhaWx1cmVTb3VyY2UgPSBuZXcgU3ViamVjdDxFcnJvcj4oKTtcclxuICAgIHByaXZhdGUgX3NjYW5TdWJzY3JpcHRpb246IGFueTtcclxuICAgIHByaXZhdGUgX3NjYW5Db21wbGV0ZVNvdXJjZSA9IG5ldyBTdWJqZWN0PFJlc3VsdD4oKTtcclxuICAgIHByaXZhdGUgX3NjYW5TdWNjZXNzU291cmNlID0gbmV3IFN1YmplY3Q8UmVzdWx0PigpO1xyXG4gICAgcHJpdmF0ZSBfb3B0aW9uczoge1xyXG4gICAgICAgIGRlbGF5QmV0d2VlblNjYW5BdHRlbXB0czogbnVtYmVyO1xyXG4gICAgICAgIGRlbGF5QmV0d2VlblNjYW5TdWNjZXNzOiBudW1iZXI7XHJcbiAgICB9ID0ge1xyXG4gICAgICAgIGRlbGF5QmV0d2VlblNjYW5BdHRlbXB0czogNTAsXHJcbiAgICAgICAgZGVsYXlCZXR3ZWVuU2NhblN1Y2Nlc3M6IDUwMFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdXNlck1lZGlhU2VydmljZTogVXNlck1lZGlhQmFzZVNlcnZpY2UpIHtcclxuICAgICAgICB0aGlzLnNjYW5FcnJvciQgPSB0aGlzLl9zY2FuRXJyb3JTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5zY2FuRmFpbHVyZSQgPSB0aGlzLl9zY2FuRmFpbHVyZVNvdXJjZS5hc09ic2VydmFibGUoKTtcclxuICAgICAgICB0aGlzLnNjYW5Db21wbGV0ZSQgPSB0aGlzLl9zY2FuQ29tcGxldGVTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5zY2FuU3VjY2VzcyQgPSB0aGlzLl9zY2FuU3VjY2Vzc1NvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKG1hcCgoYykgPT4gYy5nZXRUZXh0KCkpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhcnRTY2FuKGRldmljZTogTWVkaWFEZXZpY2VJbmZvLCB2aWRlb0VsOiBIVE1MVmlkZW9FbGVtZW50LCBvcHRpb25zID0gdGhpcy5fb3B0aW9ucyk6IHZvaWQge1xyXG4gICAgICAgIC8vIGluc3RhbnRseSBzdG9wcyB0aGUgc2NhbiBiZWZvcmUgY2hhbmdpbmcgZGV2aWNlc1xyXG4gICAgICAgIHRoaXMuc2NhblN0b3AoKTtcclxuXHJcbiAgICAgICAgLy8gY29ycmVjdGx5IHNldHMgdGhlIG5ldyAob3Igbm9uZSkgZGV2aWNlXHJcbiAgICAgICAgdGhpcy5fZGV2aWNlID0gZGV2aWNlIHx8IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl92aWRlb0VsID0gdmlkZW9FbDtcclxuICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICBpZiAoIXRoaXMuX2RldmljZSkge1xyXG4gICAgICAgICAgICAvLyBjbGVhbnMgdGhlIHZpZGVvIGJlY2F1c2UgdXNlciByZW1vdmVkIHRoZSBkZXZpY2VcclxuICAgICAgICAgICAgQnJvd3NlckNvZGVSZWFkZXIuY2xlYW5WaWRlb1NvdXJjZSh2aWRlb0VsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3NjYW5TdWJzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBpcyBhbHJlYWR5IGEgc2NhbiBwcm9jY2VzcyBydW5uaW5nLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9kZXZpY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBkZXZpY2UgZGVmaW5lZCwgY2Fubm90IHN0YXJ0IHNjYW4sIHBsZWFzZSBkZWZpbmUgYSBkZXZpY2UuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiBlbmFibGVkLCBzdGFydHMgc2Nhbm5pbmdcclxuICAgICAgICBpZiAoZGV2aWNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NhbkZyb21EZXZpY2UoZGV2aWNlLmRldmljZUlkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0Rm9ybWF0KGlucHV0OiBCYXJjb2RlRm9ybWF0W10pOiB2b2lkIHtcclxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZm9ybWF0cywgbWFrZSBzdXJlIHRoZSBbZm9ybWF0c10gaW5wdXQgaXMgYSBiaW5kaW5nLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZm9ybWF0cyBtYXkgYmUgc2V0IGZyb20gaHRtbCB0ZW1wbGF0ZSBhcyBCYXJjb2RlRm9ybWF0IG9yIHN0cmluZyBhcnJheVxyXG4gICAgICAgIGNvbnN0IGZvcm1hdHMgPSBpbnB1dC5tYXAoKGYpID0+IHRoaXMuZ2V0QmFyY29kZUZvcm1hdE9yRmFpbChmKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbnRzID0gdGhpcy5faGludHM7XHJcblxyXG4gICAgICAgIC8vIHVwZGF0ZXMgdGhlIGhpbnRzXHJcbiAgICAgICAgaGludHMuc2V0KERlY29kZUhpbnRUeXBlLlBPU1NJQkxFX0ZPUk1BVFMsIGZvcm1hdHMpO1xyXG5cclxuICAgICAgICAvLyBoYW5kbGVzIHVwZGF0aW5nIHRoZSBjb2RlUmVhZGVyXHJcbiAgICAgICAgdGhpcy5faGludHMgPSBoaW50cztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzY2FuU3RvcCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fc2NhblN1YnNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLl9jb2RlUmVhZGVyPy5nZXRTY2FubmVyQ29udHJvbHMoKS5zdG9wKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NjYW5TdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NjYW5TdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMudG9yY2hDb21wYXRpYmxlLm5leHQoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIC8vIEBub3RlIGFwZW5hcyBuZWNlc3NhcmlvIHBvciBlbnF1YW50byBjYXVzYSBkYSBUb3JjaFxyXG4gICAgICAgIHRoaXMuc2NhblN0b3AoKTtcclxuICAgICAgICB0aGlzLl9jb2RlUmVhZGVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX2RldmljZSA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEJhcmNvZGVGb3JtYXRPckZhaWwoZm9ybWF0OiBzdHJpbmcgfCBCYXJjb2RlRm9ybWF0KTogQmFyY29kZUZvcm1hdCB7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBmb3JtYXQgPT09ICdzdHJpbmcnID8gQmFyY29kZUZvcm1hdFtmb3JtYXQudHJpbSgpLnRvVXBwZXJDYXNlKCldIDogZm9ybWF0O1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBhc3luYyBzY2FuRnJvbURldmljZShkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgdmlkZW9FbGVtZW50ID0gdGhpcy5fdmlkZW9FbDtcclxuXHJcbiAgICAgICAgY29uc3QgY29kZVJlYWRlciA9IHRoaXMuZ2V0Q29kZVJlYWRlcigpO1xyXG5cclxuICAgICAgICBjb25zdCBzY2FuU3RyZWFtID0gYXdhaXQgY29kZVJlYWRlci5zY2FuRnJvbURldmljZU9ic2VydmFibGUoZGV2aWNlSWQsIHZpZGVvRWxlbWVudCk7XHJcblxyXG4gICAgICAgIGlmICghc2NhblN0cmVhbSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZGVmaW5lZCBkZWNvZGluZyBzdHJlYW0sIGFib3J0aW5nLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbmV4dCA9ICh4OiBSZXN1bHRBbmRFcnJvcik6IHZvaWQgPT4gdGhpcy5fb25EZWNvZGVSZXN1bHQoeC5yZXN1bHQsIHguZXJyb3IpO1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gKGVycjogYW55KTogdm9pZCA9PiB0aGlzLl9vbkRlY29kZUVycm9yKGVycik7XHJcbiAgICAgICAgY29uc3QgY29tcGxldGUgPSAoKTogdm9pZCA9PiB7fTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2NhblN1YnNjcmlwdGlvbiA9IHNjYW5TdHJlYW0uc3Vic2NyaWJlKG5leHQsIGVycm9yLCBjb21wbGV0ZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zY2FuU3Vic2NyaXB0aW9uLmNsb3NlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjb25zdCBjb250cm9scyA9IGNvZGVSZWFkZXIuZ2V0U2Nhbm5lckNvbnRyb2xzKCk7XHJcbiAgICAgICAgLy8gY29uc3QgaGFzVG9yY2hDb250cm9sID0gdHlwZW9mIGNvbnRyb2xzLnN3aXRjaFRvcmNoICE9PSAndW5kZWZpbmVkJztcclxuXHJcbiAgICAgICAgLy8gdGhpcy50b3JjaENvbXBhdGlibGUubmV4dChoYXNUb3JjaENvbnRyb2wpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIGRlY29kZSBlcnJvcnMuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX29uRGVjb2RlRXJyb3IoZXJyOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zY2FuRXJyb3JTb3VyY2UubmV4dChlcnIpO1xyXG4gICAgICAgIC8vIHRoaXMucmVzZXQoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlcyBkZWNvZGUgcmVzdWx0cy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfb25EZWNvZGVSZXN1bHQocmVzdWx0OiBSZXN1bHQgfCB1bmRlZmluZWQsIGVycm9yOiBFeGNlcHRpb24gfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NjYW5TdWNjZXNzU291cmNlLm5leHQocmVzdWx0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9zY2FuRmFpbHVyZVNvdXJjZS5uZXh0KGVycm9yIGFzIEVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zY2FuQ29tcGxldGVTb3VyY2UubmV4dChyZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgZ2V0Q29kZVJlYWRlcigpOiBCcm93c2VyTXVsdGlGb3JtYXRDb250aW51b3VzUmVhZGVyIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2NvZGVSZWFkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fY29kZVJlYWRlciA9IG5ldyBCcm93c2VyTXVsdGlGb3JtYXRDb250aW51b3VzUmVhZGVyKHRoaXMuX2hpbnRzLCB0aGlzLl9vcHRpb25zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb2RlUmVhZGVyO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==