@muraai/mnl-form 0.0.1-alpha-32ca3fa → 0.0.1-alpha-11e96eb

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 (65) hide show
  1. package/README.md +5 -5
  2. package/fesm2022/muraai-mnl-form.mjs +152 -145
  3. package/fesm2022/muraai-mnl-form.mjs.map +1 -1
  4. package/lib/{formly-lib/formly-lib.component.d.ts → mnl-form/mnl-form.component.d.ts} +3 -3
  5. package/lib/types/upload-file.d.ts +1 -1
  6. package/lib/workflow-status/ workflow-status.module.d.ts +8 -8
  7. package/lib/workflow-status/workflow-status.component.d.ts +1 -1
  8. package/package.json +4 -5
  9. package/public-api.d.ts +2 -2
  10. package/esm2022/lib/confirmation-dialog/confirmation-dialog.component.mjs +0 -34
  11. package/esm2022/lib/formly-lib/formly-lib.component.mjs +0 -199
  12. package/esm2022/lib/formly-lib/formly-standalone.module.mjs +0 -155
  13. package/esm2022/lib/models/custom-form-field.model.mjs +0 -2
  14. package/esm2022/lib/models/workflow-status.model.mjs +0 -2
  15. package/esm2022/lib/services/graphql.service.mjs +0 -30
  16. package/esm2022/lib/services/scoring.service.mjs +0 -103
  17. package/esm2022/lib/types/action-button-renderer.component.mjs +0 -59
  18. package/esm2022/lib/types/autocomplete-type.component.mjs +0 -68
  19. package/esm2022/lib/types/button.type.mjs +0 -72
  20. package/esm2022/lib/types/comments.type.mjs +0 -102
  21. package/esm2022/lib/types/country-code-input.type.mjs +0 -181
  22. package/esm2022/lib/types/custom-date.type.mjs +0 -20
  23. package/esm2022/lib/types/custom-input.component.mjs +0 -62
  24. package/esm2022/lib/types/date-format.type.mjs +0 -196
  25. package/esm2022/lib/types/expansion-panel.types.mjs +0 -85
  26. package/esm2022/lib/types/formly-field-panel.type.mjs +0 -70
  27. package/esm2022/lib/types/grid-actionable.type.mjs +0 -197
  28. package/esm2022/lib/types/grid-formly-cell.component.mjs +0 -42
  29. package/esm2022/lib/types/grid.type.mjs +0 -125
  30. package/esm2022/lib/types/input.type.mjs +0 -43
  31. package/esm2022/lib/types/mu-helper-text.type.mjs +0 -331
  32. package/esm2022/lib/types/multi-select-autocomplete.mjs +0 -139
  33. package/esm2022/lib/types/multi-select-checkbox.component.mjs +0 -247
  34. package/esm2022/lib/types/radio.type.mjs +0 -71
  35. package/esm2022/lib/types/scrollable-tabs.types.mjs +0 -220
  36. package/esm2022/lib/types/select-api-auto-complete.component.mjs +0 -111
  37. package/esm2022/lib/types/select-autocomplete-redefined.component.mjs +0 -142
  38. package/esm2022/lib/types/select-autocomplete.type.mjs +0 -254
  39. package/esm2022/lib/types/stepper.type.mjs +0 -268
  40. package/esm2022/lib/types/table.types.mjs +0 -79
  41. package/esm2022/lib/types/tabs.types.mjs +0 -293
  42. package/esm2022/lib/types/tabular-form-dialog.component.mjs +0 -331
  43. package/esm2022/lib/types/tabular-form.type.mjs +0 -641
  44. package/esm2022/lib/types/upload-file.mjs +0 -524
  45. package/esm2022/lib/types/view-file-dialog.component.mjs +0 -90
  46. package/esm2022/lib/utils/formly.utils.mjs +0 -105
  47. package/esm2022/lib/validators/custom-email-validator.mjs +0 -18
  48. package/esm2022/lib/validators/ein-validators.mjs +0 -11
  49. package/esm2022/lib/validators/gst-validator.mjs +0 -11
  50. package/esm2022/lib/validators/normal-email-validator.mjs +0 -17
  51. package/esm2022/lib/validators/npi-validator.mjs +0 -11
  52. package/esm2022/lib/validators/pan-validator.mjs +0 -11
  53. package/esm2022/lib/validators/phone-number-validator.mjs +0 -22
  54. package/esm2022/lib/validators/select-validator.mjs +0 -7
  55. package/esm2022/lib/validators/tinSsn-validator.mjs +0 -12
  56. package/esm2022/lib/workflow-status/ workflow-status.module.mjs +0 -52
  57. package/esm2022/lib/workflow-status/workflow-status.component.mjs +0 -70
  58. package/esm2022/lib/wrappers/form-field-description-wrapper.component.mjs +0 -44
  59. package/esm2022/lib/wrappers/form-field-wrapper.component.mjs +0 -34
  60. package/esm2022/lib/wrappers/formly-wrapper-with-old-value.component.mjs +0 -140
  61. package/esm2022/lib/wrappers/prefix-suffix-wrapper.component.mjs +0 -95
  62. package/esm2022/lib/wrappers/prefix-sufix-extension.component.mjs +0 -9
  63. package/esm2022/muraai-mnl-form.mjs +0 -5
  64. package/esm2022/public-api.mjs +0 -12
  65. /package/lib/{formly-lib/formly-standalone.module.d.ts → mnl-form/mnl-form-standalone.module.d.ts} +0 -0
@@ -1,524 +0,0 @@
1
- import { Breakpoints } from '@angular/cdk/layout';
2
- import { CommonModule, DatePipe } from '@angular/common';
3
- import { ChangeDetectionStrategy, Component, DestroyRef, inject, } from '@angular/core';
4
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
- import { FormsModule, ReactiveFormsModule } from '@angular/forms';
6
- import { MatFormFieldModule } from '@angular/material/form-field';
7
- import { MatIconModule } from '@angular/material/icon';
8
- import { MatInputModule } from '@angular/material/input';
9
- import { MatSnackBarModule } from '@angular/material/snack-bar';
10
- import { MatTableDataSource, MatTableModule } from '@angular/material/table';
11
- import { MatTooltipModule } from '@angular/material/tooltip';
12
- import { FieldType, FormlyModule } from '@ngx-formly/core';
13
- import { TranslateModule } from '@ngx-translate/core';
14
- import { Observable } from 'rxjs';
15
- import * as i0 from "@angular/core";
16
- import * as i1 from "@angular/material/snack-bar";
17
- import * as i2 from "@ngx-translate/core";
18
- import * as i3 from "@angular/cdk/layout";
19
- import * as i4 from "@ngx-formly/core";
20
- import * as i5 from "@angular/common";
21
- import * as i6 from "@angular/material/table";
22
- import * as i7 from "@angular/material/icon";
23
- import * as i8 from "@angular/material/tooltip";
24
- export class FormlyFileUploadComponent extends FieldType {
25
- constructor(snackBar, translateService, breakpointObserver, cdr) {
26
- super();
27
- this.snackBar = snackBar;
28
- this.translateService = translateService;
29
- this.breakpointObserver = breakpointObserver;
30
- this.cdr = cdr;
31
- this.uploadedFiles = [];
32
- this.displayedColumns = [
33
- 'fileName',
34
- 'convertedFileSize',
35
- 'uploadedBy',
36
- 'uploadedAt',
37
- 'actions',
38
- ];
39
- this.dataSource = new MatTableDataSource();
40
- this.showUploadbtn = true;
41
- this.destroyRef = inject(DestroyRef);
42
- this.isMobileDevice = false;
43
- this.breakpointObserver
44
- ?.observe([Breakpoints.Handset])
45
- .pipe(takeUntilDestroyed(this.destroyRef))
46
- .subscribe((result) => {
47
- this.isMobileDevice = result?.matches;
48
- });
49
- }
50
- ngOnInit() {
51
- const userDetails = localStorage.getItem('loggedInUserDetails');
52
- this.loggedInUserDetails = userDetails
53
- ? JSON.parse(userDetails)
54
- : { email: '' };
55
- if (this.field.props?.['isMultiFileUpload'] && this.formControl.value) {
56
- this.uploadedFiles = this.formControl.value ?? [];
57
- }
58
- else {
59
- if (this.formControl.value &&
60
- Object.keys(this.formControl.value || {}).length) {
61
- this.uploadedFiles = [this.formControl.value];
62
- }
63
- }
64
- this.dataSource.data = [...this.uploadedFiles];
65
- this.showUploadbtn = this.props?.['isMultiFileUpload']
66
- ? true
67
- : !this.uploadedFiles.length;
68
- }
69
- onFileSelect(event) {
70
- const selectedFile = event.target.files;
71
- if (!selectedFile || !selectedFile.length)
72
- return;
73
- const maxFileSizeMB = this.field.props?.['maxFileSizeMB'] || 1;
74
- const maxFileSize = maxFileSizeMB * 1024 * 1024;
75
- if (this.props?.['isMultiFileUpload']) {
76
- if (this.isFileAlreadyUploaded(event.target.files)) {
77
- this.snackBar.open(this.translateService.instant('MNL_UPLOAD_FILE.DUPLICATE_UPLOADED'), 'Ok', {
78
- duration: 3000,
79
- panelClass: ['warn-snackbar'],
80
- });
81
- this.resetFileInput(event.target);
82
- return;
83
- }
84
- }
85
- const selectedFiles = Array.from(selectedFile);
86
- const invalidChars = /[&,"]/;
87
- const filesToProcess = this.field.props?.['isMultiFileUpload']
88
- ? selectedFiles
89
- : [selectedFiles[0]];
90
- filesToProcess.forEach((file) => {
91
- if (file.size > maxFileSize) {
92
- this.snackBar.open(`The file "${file.name}" exceeds the ${maxFileSizeMB} MB size limit.`, 'OK', {
93
- duration: 3000,
94
- panelClass: ['warn-snackbar'],
95
- });
96
- }
97
- else if (invalidChars.test(file.name)) {
98
- this.snackBar.open('MNL_UPLOAD_FILE.INVALID_CHARS_FILE_NAME', 'Ok', {
99
- duration: 7000,
100
- panelClass: ['error-snackbar'],
101
- });
102
- }
103
- else {
104
- const newFile = {
105
- fileName: file.name,
106
- fileSize: file.size,
107
- fileType: file.type,
108
- file: file,
109
- uploadedBy: this.loggedInUserDetails.email,
110
- uploadedAt: new Date(),
111
- nodeId: '',
112
- convertedFileSize: this.formatFileSize(file.size),
113
- };
114
- if (!this.props?.['isMultiFileUpload']) {
115
- this.uploadedFiles = [newFile];
116
- }
117
- else {
118
- this.uploadedFiles.push(newFile);
119
- }
120
- }
121
- });
122
- this.dataSource.data = [...this.uploadedFiles];
123
- this.resetFileInput(event.target);
124
- this.showUploadbtn = this.props?.['isMultiFileUpload']
125
- ? true
126
- : !this.uploadedFiles.length;
127
- if (this.field.props?.['onFilesAdded']) {
128
- this.field.props['onFilesAdded'](this.uploadedFiles);
129
- }
130
- }
131
- handleActionClick(action, index, element) {
132
- const onUploadFileAction = this.field.props?.['onUploadFileAction'];
133
- if (typeof onUploadFileAction === 'function') {
134
- const result = onUploadFileAction(action.icon, element, index);
135
- this.invokeAction(() => result, element, index, () => {
136
- if (action.icon === 'delete')
137
- this.removeFile(index);
138
- if (action.icon === 'cloud_upload')
139
- this.refreshUploadedTable(element, index);
140
- if (action.icon === 'cloud_download' || action.icon === 'visibility')
141
- () => { };
142
- }, action.icon);
143
- }
144
- }
145
- refreshUploadedTable(element, index) {
146
- this.uploadedFiles[index] = element;
147
- if (this.props?.['isMultiFileUpload']) {
148
- const uploaded = this.uploadedFiles.filter((f) => !!f.nodeId);
149
- this.formControl.setValue(uploaded);
150
- }
151
- else {
152
- this.formControl.setValue(this.uploadedFiles[0]);
153
- }
154
- this.formControl.markAsTouched();
155
- this.form.updateValueAndValidity();
156
- this.dataSource.data = [...this.uploadedFiles];
157
- this.cdr.detectChanges();
158
- }
159
- removeFile(index) {
160
- this.uploadedFiles.splice(index, 1);
161
- this.dataSource.data = [...this.uploadedFiles];
162
- if (!this.field.props?.['isMultiFileUpload']) {
163
- this.formControl.setValue(null);
164
- }
165
- else {
166
- this.formControl.setValue(this.uploadedFiles);
167
- const uploaded = this.uploadedFiles.filter((f) => !!f.nodeId);
168
- this.formControl.setValue(uploaded);
169
- }
170
- this.showUploadbtn = this.props?.['isMultiFileUpload']
171
- ? true
172
- : !this.uploadedFiles.length;
173
- }
174
- isFileAlreadyUploaded(selectedFile) {
175
- return this.uploadedFiles.some((file) => file.fileName === selectedFile[0].name);
176
- }
177
- resetFileInput(fileInput) {
178
- fileInput.value = '';
179
- }
180
- showUploadAction(action, file) {
181
- const hasNode = !!file.nodeId;
182
- const userRoles = this.options.formState?.userRoles ?? [];
183
- const enabledRoles = this.field?.enabledForRoles ?? [];
184
- switch (action.icon) {
185
- case 'cloud_upload':
186
- return !hasNode;
187
- case 'cloud_download':
188
- case 'visibility':
189
- return hasNode;
190
- case 'delete':
191
- return (hasNode && userRoles.some((role) => enabledRoles.includes(role)));
192
- default:
193
- return false;
194
- }
195
- }
196
- formatFileSize(bytes) {
197
- if (bytes < 1024)
198
- return bytes + ' B';
199
- if (bytes < 1048576)
200
- return (bytes / 1024).toFixed(2) + ' KB';
201
- return (bytes / 1048576).toFixed(2) + ' MB';
202
- }
203
- invokeAction(actionCallback, element, index, defaultFn, icon) {
204
- if (!actionCallback) {
205
- defaultFn();
206
- return;
207
- }
208
- const result = actionCallback(element, index);
209
- if (result instanceof Observable) {
210
- result.subscribe((shouldProceed) => {
211
- if (shouldProceed) {
212
- this.successMessage(icon);
213
- defaultFn();
214
- }
215
- });
216
- }
217
- else {
218
- Promise.resolve(result).then((shouldProceed) => {
219
- if (shouldProceed) {
220
- this.successMessage(icon);
221
- defaultFn();
222
- }
223
- });
224
- }
225
- }
226
- successMessage(icon) {
227
- if (icon === 'cloud_upload') {
228
- this.snackBar.open(this.translateService.instant('MNL_UPLOAD_FILE.FILE_SUCCESSFUL_UPLOADED'), 'Ok', {
229
- duration: 5000,
230
- panelClass: ['success-snackbar'],
231
- });
232
- }
233
- else if (icon === 'delete') {
234
- this.snackBar.open(this.translateService.instant('MNL_UPLOAD_FILE.FILE_SUCCESSFUL_DELETED'), 'Ok', {
235
- duration: 5000,
236
- panelClass: ['success-snackbar'],
237
- });
238
- }
239
- }
240
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormlyFileUploadComponent, deps: [{ token: i1.MatSnackBar }, { token: i2.TranslateService }, { token: i3.BreakpointObserver }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
241
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FormlyFileUploadComponent, isStandalone: true, selector: "mu-formly-field-file", usesInheritance: true, ngImport: i0, template: `
242
- @if(showUploadbtn) {
243
- <div
244
- class="input-btn"
245
- [ngClass]="{ 'red-upload': !field.formControl?.valid }"
246
- >
247
- <button
248
- type="button"
249
- [disabled]="field.props?.['disabled']"
250
- [ngClass]="[field.props?.['color']]"
251
- (click)="fileInput.click()"
252
- >
253
- <mat-icon
254
- *ngIf="field.props?.['icon']"
255
- class="text-lg mb-1"
256
- >{{ field.props?.['icon'] }}</mat-icon
257
- >
258
- {{ field.props?.label }}<span *ngIf="to.required">*</span>
259
- </button>
260
- <input
261
- type="file"
262
- #fileInput
263
- (change)="onFileSelect($event)"
264
- [formlyAttributes]="field"
265
- [multiple]="field.props?.['isMultiFileUpload']"
266
- [accept]="field.props?.['acceptedFileTypes'] || '.pdf,.xlsx,.jpg,.jpeg,.docx'"
267
- class="hidden"
268
- />
269
- <div class="text-[0.83rem] text-gray-500 mt-1">
270
- Allowed file types:
271
- {{ field.props?.['acceptedFileTypes'] || '.pdf, .xlsx, .jpg, jpeg, .docx' }}
272
- <br />
273
- Maximum file size: {{ field.props?.['maxFileSizeMB'] || 1 }}MB
274
- </div>
275
- </div>
276
- }
277
- <table
278
- mat-table
279
- *ngIf="this.props?.['isMultiFileUpload'] && uploadedFiles?.length"
280
- [dataSource]="dataSource"
281
- class="mat-elevation-z8"
282
- >
283
- <ng-container matColumnDef="fileName">
284
- <th mat-header-cell *matHeaderCellDef class="header-cell">File Name</th>
285
- <td mat-cell *matCellDef="let element">{{ element.fileName }}</td>
286
- </ng-container>
287
-
288
- <ng-container matColumnDef="convertedFileSize">
289
- <th mat-header-cell *matHeaderCellDef class="header-cell">Size</th>
290
- <td mat-cell *matCellDef="let element">
291
- {{ element.convertedFileSize }}
292
- </td>
293
- </ng-container>
294
-
295
- <ng-container matColumnDef="uploadedBy">
296
- <th mat-header-cell *matHeaderCellDef class="header-cell">
297
- Uploaded By
298
- </th>
299
- <td mat-cell *matCellDef="let element">{{ element.uploadedBy }}</td>
300
- </ng-container>
301
-
302
- <ng-container matColumnDef="uploadedAt">
303
- <th mat-header-cell *matHeaderCellDef class="header-cell">
304
- Uploaded Date
305
- </th>
306
- <td mat-cell *matCellDef="let element">
307
- {{ element.uploadedAt | date : 'dd-MMM-yyyy, hh:mm:ss a' }}
308
- </td>
309
- </ng-container>
310
-
311
- <ng-container matColumnDef="actions">
312
- <th mat-header-cell *matHeaderCellDef class="header-cell">Actions</th>
313
- <td mat-cell *matCellDef="let element; let i = index">
314
- <div class="action-buttons">
315
- <div
316
- *ngFor="let action of field?.props?.['actions']"
317
- class="actions-container"
318
- >
319
- <mat-icon
320
- class="action-icons"
321
- *ngIf="showUploadAction(action, element)"
322
- matTooltip="{{ action.label | translate }}"
323
- (click)="handleActionClick(action, i, element)"
324
- >
325
- {{ action.icon }}
326
- </mat-icon>
327
- </div>
328
- </div>
329
- </td>
330
- </ng-container>
331
-
332
- <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
333
- <tr mat-row *matRowDef="let row; columns: displayedColumns"></tr>
334
- </table>
335
-
336
- <div class="w-full">
337
- <table
338
- *ngIf="!this.props?.['isMultiFileUpload'] && uploadedFiles?.length"
339
- class="w-full flex flex-col md:flex-row items-start md:items-center gap-2 md:gap-4"
340
- >
341
- <tr
342
- class="flex flex-col md:flex-row items-start md:items-center gap-2 md:gap-4 w-full"
343
- >
344
- <td
345
- class="text-sm truncate overflow-hidden whitespace-nowrap max-w-full flex-1 md:border-none"
346
- [matTooltip]="uploadedFiles[0].fileName"
347
- >
348
- {{ uploadedFiles[0].fileName }}
349
- </td>
350
- <td class="flex items-center justify-end md:flex-shrink-0">
351
- <div
352
- *ngFor="let action of field?.props?.['actions']"
353
- class="flex items-center"
354
- >
355
- <mat-icon
356
- matTooltip="{{ action.label | translate }}"
357
- *ngIf="showUploadAction(action, uploadedFiles[0])"
358
- (click)="handleActionClick(action, 0, uploadedFiles[0])"
359
- class="action-icons"
360
- >
361
- {{ action.icon }}
362
- </mat-icon>
363
- </div>
364
- </td>
365
- </tr>
366
- </table>
367
- </div>
368
- <div
369
- *ngIf="to['note']"
370
- class="text-gray-500 mt-1 w-[900px]"
371
- [innerHTML]="to['note']"
372
- ></div>
373
- `, isInline: true, styles: [".mat-mdc-table{margin-top:5px;box-shadow:none}.header-cell{background-color:#7876761f!important}.action-buttons{display:flex;flex-direction:row;justify-content:start;align-items:center}.action-icons{font-size:20px}.actions-container{display:flex;justify-content:center;align-items:center;height:43px;padding-top:5px}.input-btn button,.red-upload button{color:#fff;padding:3px 10px;border:none;cursor:pointer;border-radius:50px;font-family:Poppins,Helvetica Neue,sans-serif;font-weight:500;font-size:14px;display:flex;align-items:center;justify-content:center}.input-btn button:disabled,.red-upload button:disabled{background-color:#d3d3d3;color:#b0b0b0}th,td,.upload-btn{font-family:Poppins,Helvetica Neue,sans-serif}.red-upload button{background-color:red}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: FormlyModule }, { kind: "directive", type: i4.ɵFormlyAttributes, selector: "[formlyAttributes]", inputs: ["formlyAttributes", "id"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatSnackBarModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
374
- }
375
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormlyFileUploadComponent, decorators: [{
376
- type: Component,
377
- args: [{ selector: 'mu-formly-field-file', standalone: true, imports: [
378
- FormsModule,
379
- MatFormFieldModule,
380
- MatInputModule,
381
- ReactiveFormsModule,
382
- FormlyModule,
383
- CommonModule,
384
- MatTableModule,
385
- MatIconModule,
386
- MatTooltipModule,
387
- TranslateModule,
388
- MatSnackBarModule,
389
- DatePipe,
390
- ], template: `
391
- @if(showUploadbtn) {
392
- <div
393
- class="input-btn"
394
- [ngClass]="{ 'red-upload': !field.formControl?.valid }"
395
- >
396
- <button
397
- type="button"
398
- [disabled]="field.props?.['disabled']"
399
- [ngClass]="[field.props?.['color']]"
400
- (click)="fileInput.click()"
401
- >
402
- <mat-icon
403
- *ngIf="field.props?.['icon']"
404
- class="text-lg mb-1"
405
- >{{ field.props?.['icon'] }}</mat-icon
406
- >
407
- {{ field.props?.label }}<span *ngIf="to.required">*</span>
408
- </button>
409
- <input
410
- type="file"
411
- #fileInput
412
- (change)="onFileSelect($event)"
413
- [formlyAttributes]="field"
414
- [multiple]="field.props?.['isMultiFileUpload']"
415
- [accept]="field.props?.['acceptedFileTypes'] || '.pdf,.xlsx,.jpg,.jpeg,.docx'"
416
- class="hidden"
417
- />
418
- <div class="text-[0.83rem] text-gray-500 mt-1">
419
- Allowed file types:
420
- {{ field.props?.['acceptedFileTypes'] || '.pdf, .xlsx, .jpg, jpeg, .docx' }}
421
- <br />
422
- Maximum file size: {{ field.props?.['maxFileSizeMB'] || 1 }}MB
423
- </div>
424
- </div>
425
- }
426
- <table
427
- mat-table
428
- *ngIf="this.props?.['isMultiFileUpload'] && uploadedFiles?.length"
429
- [dataSource]="dataSource"
430
- class="mat-elevation-z8"
431
- >
432
- <ng-container matColumnDef="fileName">
433
- <th mat-header-cell *matHeaderCellDef class="header-cell">File Name</th>
434
- <td mat-cell *matCellDef="let element">{{ element.fileName }}</td>
435
- </ng-container>
436
-
437
- <ng-container matColumnDef="convertedFileSize">
438
- <th mat-header-cell *matHeaderCellDef class="header-cell">Size</th>
439
- <td mat-cell *matCellDef="let element">
440
- {{ element.convertedFileSize }}
441
- </td>
442
- </ng-container>
443
-
444
- <ng-container matColumnDef="uploadedBy">
445
- <th mat-header-cell *matHeaderCellDef class="header-cell">
446
- Uploaded By
447
- </th>
448
- <td mat-cell *matCellDef="let element">{{ element.uploadedBy }}</td>
449
- </ng-container>
450
-
451
- <ng-container matColumnDef="uploadedAt">
452
- <th mat-header-cell *matHeaderCellDef class="header-cell">
453
- Uploaded Date
454
- </th>
455
- <td mat-cell *matCellDef="let element">
456
- {{ element.uploadedAt | date : 'dd-MMM-yyyy, hh:mm:ss a' }}
457
- </td>
458
- </ng-container>
459
-
460
- <ng-container matColumnDef="actions">
461
- <th mat-header-cell *matHeaderCellDef class="header-cell">Actions</th>
462
- <td mat-cell *matCellDef="let element; let i = index">
463
- <div class="action-buttons">
464
- <div
465
- *ngFor="let action of field?.props?.['actions']"
466
- class="actions-container"
467
- >
468
- <mat-icon
469
- class="action-icons"
470
- *ngIf="showUploadAction(action, element)"
471
- matTooltip="{{ action.label | translate }}"
472
- (click)="handleActionClick(action, i, element)"
473
- >
474
- {{ action.icon }}
475
- </mat-icon>
476
- </div>
477
- </div>
478
- </td>
479
- </ng-container>
480
-
481
- <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
482
- <tr mat-row *matRowDef="let row; columns: displayedColumns"></tr>
483
- </table>
484
-
485
- <div class="w-full">
486
- <table
487
- *ngIf="!this.props?.['isMultiFileUpload'] && uploadedFiles?.length"
488
- class="w-full flex flex-col md:flex-row items-start md:items-center gap-2 md:gap-4"
489
- >
490
- <tr
491
- class="flex flex-col md:flex-row items-start md:items-center gap-2 md:gap-4 w-full"
492
- >
493
- <td
494
- class="text-sm truncate overflow-hidden whitespace-nowrap max-w-full flex-1 md:border-none"
495
- [matTooltip]="uploadedFiles[0].fileName"
496
- >
497
- {{ uploadedFiles[0].fileName }}
498
- </td>
499
- <td class="flex items-center justify-end md:flex-shrink-0">
500
- <div
501
- *ngFor="let action of field?.props?.['actions']"
502
- class="flex items-center"
503
- >
504
- <mat-icon
505
- matTooltip="{{ action.label | translate }}"
506
- *ngIf="showUploadAction(action, uploadedFiles[0])"
507
- (click)="handleActionClick(action, 0, uploadedFiles[0])"
508
- class="action-icons"
509
- >
510
- {{ action.icon }}
511
- </mat-icon>
512
- </div>
513
- </td>
514
- </tr>
515
- </table>
516
- </div>
517
- <div
518
- *ngIf="to['note']"
519
- class="text-gray-500 mt-1 w-[900px]"
520
- [innerHTML]="to['note']"
521
- ></div>
522
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".mat-mdc-table{margin-top:5px;box-shadow:none}.header-cell{background-color:#7876761f!important}.action-buttons{display:flex;flex-direction:row;justify-content:start;align-items:center}.action-icons{font-size:20px}.actions-container{display:flex;justify-content:center;align-items:center;height:43px;padding-top:5px}.input-btn button,.red-upload button{color:#fff;padding:3px 10px;border:none;cursor:pointer;border-radius:50px;font-family:Poppins,Helvetica Neue,sans-serif;font-weight:500;font-size:14px;display:flex;align-items:center;justify-content:center}.input-btn button:disabled,.red-upload button:disabled{background-color:#d3d3d3;color:#b0b0b0}th,td,.upload-btn{font-family:Poppins,Helvetica Neue,sans-serif}.red-upload button{background-color:red}\n"] }]
523
- }], ctorParameters: () => [{ type: i1.MatSnackBar }, { type: i2.TranslateService }, { type: i3.BreakpointObserver }, { type: i0.ChangeDetectorRef }] });
524
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3JtLWxpYi9zcmMvbGliL3R5cGVzL3VwbG9hZC1maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBc0IsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBZSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQW9CLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7OztBQXVObEMsTUFBTSxPQUFPLHlCQUNYLFNBQVEsU0FBa0M7SUFpQjFDLFlBQ1UsUUFBcUIs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Q2YsaUJBQWlCOzs0RkFpTVIseUJBQXlCO2tCQS9NckMsU0FBUzsrQkFDRSxzQkFBc0IsY0FDcEIsSUFBSSxXQUNQO3dCQUNQLFdBQVc7d0JBQ1gsa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLG1CQUFtQjt3QkFDbkIsWUFBWTt3QkFDWixZQUFZO3dCQUNaLGNBQWM7d0JBQ2QsYUFBYTt3QkFDYixnQkFBZ0I7d0JBQ2hCLGVBQWU7d0JBQ2YsaUJBQWlCO3dCQUNqQixRQUFRO3FCQUNULFlBQ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9JVCxtQkF3RGdCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmVha3BvaW50T2JzZXJ2ZXIsIEJyZWFrcG9pbnRzIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLFxuICBpbmplY3QsXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciwgTWF0U25hY2tCYXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlLCBNYXRUYWJsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7IEZpZWxkVHlwZSwgRm9ybWx5TW9kdWxlIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEN1c3RvbUZvcm1seUZpZWxkQ29uZmlnLFxuICBGaWxlQWN0aW9uLFxuICBNYXliZUFzeW5jQm9vbCxcbn0gZnJvbSAnLi4vbW9kZWxzL2N1c3RvbS1mb3JtLWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gJ3J4anMvaW50ZXJuYWwvc2NoZWR1bGVyL0FjdGlvbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ211LWZvcm1seS1maWVsZC1maWxlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZvcm1zTW9kdWxlLFxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEZvcm1seU1vZHVsZSxcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgTWF0VGFibGVNb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBNYXRTbmFja0Jhck1vZHVsZSxcbiAgICBEYXRlUGlwZSxcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICBAaWYoc2hvd1VwbG9hZGJ0bikge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiaW5wdXQtYnRuXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ3JlZC11cGxvYWQnOiAhZmllbGQuZm9ybUNvbnRyb2w/LnZhbGlkIH1cIlxuICAgID5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZC5wcm9wcz8uWydkaXNhYmxlZCddXCJcbiAgICAgICAgW25nQ2xhc3NdPVwiW2ZpZWxkLnByb3BzPy5bJ2NvbG9yJ11dXCJcbiAgICAgICAgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgKm5nSWY9XCJmaWVsZC5wcm9wcz8uWydpY29uJ11cIlxuICAgICAgICAgIGNsYXNzPVwidGV4dC1sZyBtYi0xXCJcbiAgICAgICAgICA+e3sgZmllbGQucHJvcHM/LlsnaWNvbiddIH19PC9tYXQtaWNvblxuICAgICAgICA+XG4gICAgICAgIHt7IGZpZWxkLnByb3BzPy5sYWJlbCB9fTxzcGFuICpuZ0lmPVwidG8ucmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAjZmlsZUlucHV0XG4gICAgICAgIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0KCRldmVudClcIlxuICAgICAgICBbZm9ybWx5QXR0cmlidXRlc109XCJmaWVsZFwiXG4gICAgICAgIFttdWx0aXBsZV09XCJmaWVsZC5wcm9wcz8uWydpc011bHRpRmlsZVVwbG9hZCddXCJcbiAgICAgICAgW2FjY2VwdF09XCJmaWVsZC5wcm9wcz8uWydhY2NlcHRlZEZpbGVUeXBlcyddIHx8ICcucGRmLC54bHN4LC5qcGcsLmpwZWcsLmRvY3gnXCJcbiAgICAgICAgY2xhc3M9XCJoaWRkZW5cIlxuICAgICAgLz5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LVswLjgzcmVtXSB0ZXh0LWdyYXktNTAwIG10LTFcIj5cbiAgICAgICAgQWxsb3dlZCBmaWxlIHR5cGVzOlxuICAgICAgICB7eyBmaWVsZC5wcm9wcz8uWydhY2NlcHRlZEZpbGVUeXBlcyddIHx8ICcucGRmLCAueGxzeCwgLmpwZywganBlZywgLmRvY3gnIH19XG4gICAgICAgIDxiciAvPlxuICAgICAgICBNYXhpbXVtIGZpbGUgc2l6ZToge3sgZmllbGQucHJvcHM/LlsnbWF4RmlsZVNpemVNQiddIHx8IDEgfX1NQlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgfVxuICAgIDx0YWJsZVxuICAgICAgbWF0LXRhYmxlXG4gICAgICAqbmdJZj1cInRoaXMucHJvcHM/LlsnaXNNdWx0aUZpbGVVcGxvYWQnXSAmJiB1cGxvYWRlZEZpbGVzPy5sZW5ndGhcIlxuICAgICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gICAgICBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejhcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZmlsZU5hbWVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cImhlYWRlci1jZWxsXCI+RmlsZSBOYW1lPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57eyBlbGVtZW50LmZpbGVOYW1lIH19PC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImNvbnZlcnRlZEZpbGVTaXplXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJoZWFkZXItY2VsbFwiPlNpemU8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgIHt7IGVsZW1lbnQuY29udmVydGVkRmlsZVNpemUgfX1cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVwbG9hZGVkQnlcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cImhlYWRlci1jZWxsXCI+XG4gICAgICAgICAgVXBsb2FkZWQgQnlcbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57eyBlbGVtZW50LnVwbG9hZGVkQnkgfX08L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidXBsb2FkZWRBdFwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwiaGVhZGVyLWNlbGxcIj5cbiAgICAgICAgICBVcGxvYWRlZCBEYXRlXG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAge3sgZWxlbWVudC51cGxvYWRlZEF0IHwgZGF0ZSA6ICdkZC1NTU0teXl5eSwgaGg6bW06c3MgYScgfX1cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFjdGlvbnNcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cImhlYWRlci1jZWxsXCI+QWN0aW9uczwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50OyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b25zXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgZmllbGQ/LnByb3BzPy5bJ2FjdGlvbnMnXVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9ucy1jb250YWluZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGlvbi1pY29uc1wiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93VXBsb2FkQWN0aW9uKGFjdGlvbiwgZWxlbWVudClcIlxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyBhY3Rpb24ubGFiZWwgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVBY3Rpb25DbGljayhhY3Rpb24sIGksIGVsZW1lbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGFjdGlvbi5pY29uIH19XG4gICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgIDwvdGFibGU+XG5cbiAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICA8dGFibGVcbiAgICAgICAgKm5nSWY9XCIhdGhpcy5wcm9wcz8uWydpc011bHRpRmlsZVVwbG9hZCddICYmIHVwbG9hZGVkRmlsZXM/Lmxlbmd0aFwiXG4gICAgICAgIGNsYXNzPVwidy1mdWxsIGZsZXggZmxleC1jb2wgbWQ6ZmxleC1yb3cgaXRlbXMtc3RhcnQgbWQ6aXRlbXMtY2VudGVyIGdhcC0yIG1kOmdhcC00XCJcbiAgICAgID5cbiAgICAgICAgPHRyXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIG1kOmZsZXgtcm93IGl0ZW1zLXN0YXJ0IG1kOml0ZW1zLWNlbnRlciBnYXAtMiBtZDpnYXAtNCB3LWZ1bGxcIlxuICAgICAgICA+XG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtc20gdHJ1bmNhdGUgb3ZlcmZsb3ctaGlkZGVuIHdoaXRlc3BhY2Utbm93cmFwIG1heC13LWZ1bGwgZmxleC0xIG1kOmJvcmRlci1ub25lXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInVwbG9hZGVkRmlsZXNbMF0uZmlsZU5hbWVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHVwbG9hZGVkRmlsZXNbMF0uZmlsZU5hbWUgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kIG1kOmZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBmaWVsZD8ucHJvcHM/LlsnYWN0aW9ucyddXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyBhY3Rpb24ubGFiZWwgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd1VwbG9hZEFjdGlvbihhY3Rpb24sIHVwbG9hZGVkRmlsZXNbMF0pXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQWN0aW9uQ2xpY2soYWN0aW9uLCAwLCB1cGxvYWRlZEZpbGVzWzBdKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb24taWNvbnNcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgYWN0aW9uLmljb24gfX1cbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwidG9bJ25vdGUnXVwiXG4gICAgICBjbGFzcz1cInRleHQtZ3JheS01MDAgbXQtMSB3LVs5MDBweF1cIlxuICAgICAgW2lubmVySFRNTF09XCJ0b1snbm90ZSddXCJcbiAgICA+PC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5tYXQtbWRjLXRhYmxlIHtcbiAgICAgICAgbWFyZ2luLXRvcDogNXB4O1xuICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICAgICAgfVxuICAgICAgLmhlYWRlci1jZWxsIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDEyMCAxMTggMTE4IC8gMTIlKSAhaW1wb3J0YW50O1xuICAgICAgfVxuICAgICAgLmFjdGlvbi1idXR0b25zIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzdGFydDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIH1cbiAgICAgIC5hY3Rpb24taWNvbnMge1xuICAgICAgICBmb250LXNpemU6IDIwcHg7XG4gICAgICB9XG4gICAgICAuYWN0aW9ucy1jb250YWluZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgaGVpZ2h0OiA0M3B4O1xuICAgICAgICBwYWRkaW5nLXRvcDogNXB4O1xuICAgICAgfVxuXG4gICAgICAuaW5wdXQtYnRuIGJ1dHRvbixcbiAgICAgIC5yZWQtdXBsb2FkIGJ1dHRvbiB7XG4gICAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICAgICAgcGFkZGluZzogM3B4IDEwcHg7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1MHB4O1xuICAgICAgICBmb250LWZhbWlseTogUG9wcGlucywgJ0hlbHZldGljYSBOZXVlJywgc2Fucy1zZXJpZjtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIH1cbiAgICAgIC5pbnB1dC1idG4gYnV0dG9uOmRpc2FibGVkLFxuICAgICAgLnJlZC11cGxvYWQgYnV0dG9uOmRpc2FibGVkIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2QzZDNkMztcbiAgICAgICAgY29sb3I6ICNiMGIwYjA7XG4gICAgICB9XG4gICAgICB0aCxcbiAgICAgIHRkLFxuICAgICAgLnVwbG9hZC1idG4ge1xuICAgICAgICBmb250LWZhbWlseTogUG9wcGlucywgJ0hlbHZldGljYSBOZXVlJywgc2Fucy1zZXJpZjtcbiAgICAgIH1cbiAgICAgIC5yZWQtdXBsb2FkIGJ1dHRvbiB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJlZDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybWx5RmlsZVVwbG9hZENvbXBvbmVudFxuICBleHRlbmRzIEZpZWxkVHlwZTxDdXN0b21Gb3JtbHlGaWVsZENvbmZpZz5cbiAgaW1wbGVtZW50cyBPbkluaXRcbntcbiAgdXBsb2FkZWRGaWxlczogYW55W10gPSBbXTtcbiAgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbXG4gICAgJ2ZpbGVOYW1lJyxcbiAgICAnY29udmVydGVkRmlsZVNpemUnLFxuICAgICd1cGxvYWRlZEJ5JyxcbiAgICAndXBsb2FkZWRBdCcsXG4gICAgJ2FjdGlvbnMnLFxuICBdO1xuICBkYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSgpO1xuICBzaG93VXBsb2FkYnRuID0gdHJ1ZTtcbiAgbG9nZ2VkSW5Vc2VyRGV0YWlscyE6IGFueTtcbiAgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgaXNNb2JpbGVEZXZpY2U6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBicmVha3BvaW50T2JzZXJ2ZXI6IEJyZWFrcG9pbnRPYnNlcnZlcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmJyZWFrcG9pbnRPYnNlcnZlclxuICAgICAgPy5vYnNlcnZlKFtCcmVha3BvaW50cy5IYW5kc2V0XSlcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgIHRoaXMuaXNNb2JpbGVEZXZpY2UgPSByZXN1bHQ/Lm1hdGNoZXM7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IHVzZXJEZXRhaWxzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xvZ2dlZEluVXNlckRldGFpbHMnKTtcbiAgICB0aGlzLmxvZ2dlZEluVXNlckRldGFpbHMgPSB1c2VyRGV0YWlsc1xuICAgICAgPyBKU09OLnBhcnNlKHVzZXJEZXRhaWxzKVxuICAgICAgOiB7IGVtYWlsOiAnJyB9O1xuXG4gICAgaWYgKHRoaXMuZmllbGQucHJvcHM/LlsnaXNNdWx0aUZpbGVVcGxvYWQnXSAmJiB0aGlzLmZvcm1Db250cm9sLnZhbHVlKSB7XG4gICAgICB0aGlzLnVwbG9hZGVkRmlsZXMgPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlID8/IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgJiZcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5mb3JtQ29udHJvbC52YWx1ZSB8fCB7fSkubGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzID0gW3RoaXMuZm9ybUNvbnRyb2wudmFsdWVdO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IFsuLi50aGlzLnVwbG9hZGVkRmlsZXNdO1xuICAgIHRoaXMuc2hvd1VwbG9hZGJ0biA9IHRoaXMucHJvcHM/LlsnaXNNdWx0aUZpbGVVcGxvYWQnXVxuICAgICAgPyB0cnVlXG4gICAgICA6ICF0aGlzLnVwbG9hZGVkRmlsZXMubGVuZ3RoO1xuICB9XG5cbiAgb25GaWxlU2VsZWN0KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZEZpbGUgPSBldmVudC50YXJnZXQuZmlsZXM7XG4gICAgaWYgKCFzZWxlY3RlZEZpbGUgfHwgIXNlbGVjdGVkRmlsZS5sZW5ndGgpIHJldHVybjtcblxuICAgIGNvbnN0IG1heEZpbGVTaXplTUIgPSB0aGlzLmZpZWxkLnByb3BzPy5bJ21heEZpbGVTaXplTUInXSB8fCAxO1xuICAgIGNvbnN0IG1heEZpbGVTaXplID0gbWF4RmlsZVNpemVNQiAqIDEwMjQgKiAxMDI0O1xuXG4gICAgaWYgKHRoaXMucHJvcHM/LlsnaXNNdWx0aUZpbGVVcGxvYWQnXSkge1xuICAgICAgaWYgKHRoaXMuaXNGaWxlQWxyZWFkeVVwbG9hZGVkKGV2ZW50LnRhcmdldC5maWxlcykpIHtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdNTkxfVVBMT0FEX0ZJTEUuRFVQTElDQVRFX1VQTE9BREVEJyksXG4gICAgICAgICAgJ09rJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnd2Fybi1zbmFja2JhciddLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZXNldEZpbGVJbnB1dChldmVudC50YXJnZXQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRGaWxlcyA9IEFycmF5LmZyb20oc2VsZWN0ZWRGaWxlKTtcbiAgICBjb25zdCBpbnZhbGlkQ2hhcnMgPSAvWyYsXCJdLztcblxuICAgIGNvbnN0IGZpbGVzVG9Qcm9jZXNzID0gdGhpcy5maWVsZC5wcm9wcz8uWydpc011bHRpRmlsZVVwbG9hZCddXG4gICAgICA/IHNlbGVjdGVkRmlsZXNcbiAgICAgIDogW3NlbGVjdGVkRmlsZXNbMF1dO1xuXG4gICAgZmlsZXNUb1Byb2Nlc3MuZm9yRWFjaCgoZmlsZTogYW55KSA9PiB7XG4gICAgICBpZiAoZmlsZS5zaXplID4gbWF4RmlsZVNpemUpIHtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFxuICAgICAgICAgIGBUaGUgZmlsZSBcIiR7ZmlsZS5uYW1lfVwiIGV4Y2VlZHMgdGhlICR7bWF4RmlsZVNpemVNQn0gTUIgc2l6ZSBsaW1pdC5gLFxuICAgICAgICAgICdPSycsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3dhcm4tc25hY2tiYXInXSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGludmFsaWRDaGFycy50ZXN0KGZpbGUubmFtZSkpIHtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdNTkxfVVBMT0FEX0ZJTEUuSU5WQUxJRF9DSEFSU19GSUxFX05BTUUnLCAnT2snLCB7XG4gICAgICAgICAgZHVyYXRpb246IDcwMDAsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydlcnJvci1zbmFja2JhciddLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld0ZpbGUgPSB7XG4gICAgICAgICAgZmlsZU5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgICBmaWxlU2l6ZTogZmlsZS5zaXplLFxuICAgICAgICAgIGZpbGVUeXBlOiBmaWxlLnR5cGUsXG4gICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICB1cGxvYWRlZEJ5OiB0aGlzLmxvZ2dlZEluVXNlckRldGFpbHMuZW1haWwsXG4gICAgICAgICAgdXBsb2FkZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICBub2RlSWQ6ICcnLFxuICAgICAgICAgIGNvbnZlcnRlZEZpbGVTaXplOiB0aGlzLmZvcm1hdEZpbGVTaXplKGZpbGUuc2l6ZSksXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCF0aGlzLnByb3BzPy5bJ2lzTXVsdGlGaWxlVXBsb2FkJ10pIHtcbiAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMgPSBbbmV3RmlsZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzLnB1c2gobmV3RmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gWy4uLnRoaXMudXBsb2FkZWRGaWxlc107XG5cbiAgICB0aGlzLnJlc2V0RmlsZUlucHV0KGV2ZW50LnRhcmdldCk7XG4gICAgdGhpcy5zaG93VXBsb2FkYnRuID0gdGhpcy5wcm9wcz8uWydpc011bHRpRmlsZVVwbG9hZCddXG4gICAgICA/IHRydWVcbiAgICAgIDogIXRoaXMudXBsb2FkZWRGaWxlcy5sZW5ndGg7XG5cbiAgICBpZiAodGhpcy5maWVsZC5wcm9wcz8uWydvbkZpbGVzQWRkZWQnXSkge1xuICAgICAgdGhpcy5maWVsZC5wcm9wc1snb25GaWxlc0FkZGVkJ10odGhpcy51cGxvYWRlZEZpbGVzKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVBY3Rpb25DbGljayhhY3Rpb246IEZpbGVBY3Rpb24sIGluZGV4OiBudW1iZXIsIGVsZW1lbnQ6IGFueSkge1xuICAgIGNvbnN0IG9uVXBsb2FkRmlsZUFjdGlvbiA9IHRoaXMuZmllbGQucHJvcHM/Llsnb25VcGxvYWRGaWxlQWN0aW9uJ107XG4gICAgaWYgKHR5cGVvZiBvblVwbG9hZEZpbGVBY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG9uVXBsb2FkRmlsZUFjdGlvbihhY3Rpb24uaWNvbiwgZWxlbWVudCwgaW5kZXgpO1xuICAgICAgdGhpcy5pbnZva2VBY3Rpb24oXG4gICAgICAgICgpID0+IHJlc3VsdCxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgaW5kZXgsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBpZiAoYWN0aW9uLmljb24gPT09ICdkZWxldGUnKSB0aGlzLnJlbW92ZUZpbGUoaW5kZXgpO1xuICAgICAgICAgIGlmIChhY3Rpb24uaWNvbiA9PT0gJ2Nsb3VkX3VwbG9hZCcpXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hVcGxvYWRlZFRhYmxlKGVsZW1lbnQsIGluZGV4KTtcbiAgICAgICAgICBpZiAoYWN0aW9uLmljb24gPT09ICdjbG91ZF9kb3dubG9hZCcgfHwgYWN0aW9uLmljb24gPT09ICd2aXNpYmlsaXR5JylcbiAgICAgICAgICAgICgpID0+IHt9O1xuICAgICAgICB9LFxuICAgICAgICBhY3Rpb24uaWNvblxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZWZyZXNoVXBsb2FkZWRUYWJsZShlbGVtZW50OiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnVwbG9hZGVkRmlsZXNbaW5kZXhdID0gZWxlbWVudDtcbiAgICBpZiAodGhpcy5wcm9wcz8uWydpc011bHRpRmlsZVVwbG9hZCddKSB7XG4gICAgICBjb25zdCB1cGxvYWRlZCA9IHRoaXMudXBsb2FkZWRGaWxlcy5maWx0ZXIoKGYpID0+ICEhZi5ub2RlSWQpO1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh1cGxvYWRlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy51cGxvYWRlZEZpbGVzWzBdKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB0aGlzLmZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gWy4uLnRoaXMudXBsb2FkZWRGaWxlc107XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcmVtb3ZlRmlsZShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy51cGxvYWRlZEZpbGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBbLi4udGhpcy51cGxvYWRlZEZpbGVzXTtcblxuICAgIGlmICghdGhpcy5maWVsZC5wcm9wcz8uWydpc011bHRpRmlsZVVwbG9hZCddKSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMudXBsb2FkZWRGaWxlcyk7XG4gICAgICBjb25zdCB1cGxvYWRlZCA9IHRoaXMudXBsb2FkZWRGaWxlcy5maWx0ZXIoKGYpID0+ICEhZi5ub2RlSWQpO1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh1cGxvYWRlZCk7XG4gICAgfVxuICAgIHRoaXMuc2hvd1VwbG9hZGJ0biA9IHRoaXMucHJvcHM/LlsnaXNNdWx0aUZpbGVVcGxvYWQnXVxuICAgICAgPyB0cnVlXG4gICAgICA6ICF0aGlzLnVwbG9hZGVkRmlsZXMubGVuZ3RoO1xuICB9XG5cbiAgaXNGaWxlQWxyZWFkeVVwbG9hZGVkKHNlbGVjdGVkRmlsZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudXBsb2FkZWRGaWxlcy5zb21lKFxuICAgICAgKGZpbGUpID0+IGZpbGUuZmlsZU5hbWUgPT09IHNlbGVjdGVkRmlsZVswXS5uYW1lXG4gICAgKTtcbiAgfVxuXG4gIHJlc2V0RmlsZUlucHV0KGZpbGVJbnB1dDogYW55KTogdm9pZCB7XG4gICAgZmlsZUlucHV0LnZhbHVlID0gJyc7XG4gIH1cblxuICBzaG93VXBsb2FkQWN0aW9uKGFjdGlvbjogYW55LCBmaWxlOiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCBoYXNOb2RlID0gISFmaWxlLm5vZGVJZDtcbiAgICBjb25zdCB1c2VyUm9sZXMgPSB0aGlzLm9wdGlvbnMuZm9ybVN0YXRlPy51c2VyUm9sZXMgPz8gW107XG4gICAgY29uc3QgZW5hYmxlZFJvbGVzID0gdGhpcy5maWVsZD8uZW5hYmxlZEZvclJvbGVzID8/IFtdO1xuXG4gICAgc3dpdGNoIChhY3Rpb24uaWNvbikge1xuICAgICAgY2FzZSAnY2xvdWRfdXBsb2FkJzpcbiAgICAgICAgcmV0dXJuICFoYXNOb2RlO1xuXG4gICAgICBjYXNlICdjbG91ZF9kb3dubG9hZCc6XG4gICAgICBjYXNlICd2aXNpYmlsaXR5JzpcbiAgICAgICAgcmV0dXJuIGhhc05vZGU7XG5cbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgaGFzTm9kZSAmJiB1c2VyUm9sZXMuc29tZSgocm9sZTogYW55KSA9PiBlbmFibGVkUm9sZXMuaW5jbHVkZXMocm9sZSkpXG4gICAgICAgICk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRGaWxlU2l6ZShieXRlczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoYnl0ZXMgPCAxMDI0KSByZXR1cm4gYnl0ZXMgKyAnIEInO1xuICAgIGlmIChieXRlcyA8IDEwNDg1NzYpIHJldHVybiAoYnl0ZXMgLyAxMDI0KS50b0ZpeGVkKDIpICsgJyBLQic7XG4gICAgcmV0dXJuIChieXRlcyAvIDEwNDg1NzYpLnRvRml4ZWQoMikgKyAnIE1CJztcbiAgfVxuXG4gIHByaXZhdGUgaW52b2tlQWN0aW9uKFxuICAgIGFjdGlvbkNhbGxiYWNrOlxuICAgICAgfCB1bmRlZmluZWRcbiAgICAgIHwgKChlbGVtZW50OiBhbnksIGluZGV4OiBudW1iZXIpID0+IE1heWJlQXN5bmNCb29sKSxcbiAgICBlbGVtZW50OiBhbnksXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBkZWZhdWx0Rm46ICgpID0+IHZvaWQsXG4gICAgaWNvbj86IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBpZiAoIWFjdGlvbkNhbGxiYWNrKSB7XG4gICAgICBkZWZhdWx0Rm4oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhY3Rpb25DYWxsYmFjayhlbGVtZW50LCBpbmRleCk7XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgKHJlc3VsdCBhcyBPYnNlcnZhYmxlPGJvb2xlYW4+KS5zdWJzY3JpYmUoKHNob3VsZFByb2NlZWQpID0+IHtcbiAgICAgICAgaWYgKHNob3VsZFByb2NlZWQpIHtcbiAgICAgICAgICB0aGlzLnN1Y2Nlc3NNZXNzYWdlKGljb24pO1xuICAgICAgICAgIGRlZmF1bHRGbigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCBhcyBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPikudGhlbihcbiAgICAgICAgKHNob3VsZFByb2NlZWQpID0+IHtcbiAgICAgICAgICBpZiAoc2hvdWxkUHJvY2VlZCkge1xuICAgICAgICAgICAgdGhpcy5zdWNjZXNzTWVzc2FnZShpY29uKTtcbiAgICAgICAgICAgIGRlZmF1bHRGbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzdWNjZXNzTWVzc2FnZShpY29uOiBzdHJpbmcpIHtcbiAgICBpZiAoaWNvbiA9PT0gJ2Nsb3VkX3VwbG9hZCcpIHtcbiAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgJ01OTF9VUExPQURfRklMRS5GSUxFX1NVQ0NFU1NGVUxfVVBMT0FERUQnXG4gICAgICAgICksXG4gICAgICAgICdPaycsXG4gICAgICAgIHtcbiAgICAgICAgICBkdXJhdGlvbjogNTAwMCxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ3N1Y2Nlc3Mtc25hY2tiYXInXSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGljb24gPT09ICdkZWxldGUnKSB7XG4gICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICAgICdNTkxfVVBMT0FEX0ZJTEUuRklMRV9TVUNDRVNTRlVMX0RFTEVURUQnXG4gICAgICAgICksXG4gICAgICAgICdPaycsXG4gICAgICAgIHtcbiAgICAgICAgICBkdXJhdGlvbjogNTAwMCxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ3N1Y2Nlc3Mtc25hY2tiYXInXSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==