@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.
- package/README.md +5 -5
- package/fesm2022/muraai-mnl-form.mjs +152 -145
- package/fesm2022/muraai-mnl-form.mjs.map +1 -1
- package/lib/{formly-lib/formly-lib.component.d.ts → mnl-form/mnl-form.component.d.ts} +3 -3
- package/lib/types/upload-file.d.ts +1 -1
- package/lib/workflow-status/ workflow-status.module.d.ts +8 -8
- package/lib/workflow-status/workflow-status.component.d.ts +1 -1
- package/package.json +4 -5
- package/public-api.d.ts +2 -2
- package/esm2022/lib/confirmation-dialog/confirmation-dialog.component.mjs +0 -34
- package/esm2022/lib/formly-lib/formly-lib.component.mjs +0 -199
- package/esm2022/lib/formly-lib/formly-standalone.module.mjs +0 -155
- package/esm2022/lib/models/custom-form-field.model.mjs +0 -2
- package/esm2022/lib/models/workflow-status.model.mjs +0 -2
- package/esm2022/lib/services/graphql.service.mjs +0 -30
- package/esm2022/lib/services/scoring.service.mjs +0 -103
- package/esm2022/lib/types/action-button-renderer.component.mjs +0 -59
- package/esm2022/lib/types/autocomplete-type.component.mjs +0 -68
- package/esm2022/lib/types/button.type.mjs +0 -72
- package/esm2022/lib/types/comments.type.mjs +0 -102
- package/esm2022/lib/types/country-code-input.type.mjs +0 -181
- package/esm2022/lib/types/custom-date.type.mjs +0 -20
- package/esm2022/lib/types/custom-input.component.mjs +0 -62
- package/esm2022/lib/types/date-format.type.mjs +0 -196
- package/esm2022/lib/types/expansion-panel.types.mjs +0 -85
- package/esm2022/lib/types/formly-field-panel.type.mjs +0 -70
- package/esm2022/lib/types/grid-actionable.type.mjs +0 -197
- package/esm2022/lib/types/grid-formly-cell.component.mjs +0 -42
- package/esm2022/lib/types/grid.type.mjs +0 -125
- package/esm2022/lib/types/input.type.mjs +0 -43
- package/esm2022/lib/types/mu-helper-text.type.mjs +0 -331
- package/esm2022/lib/types/multi-select-autocomplete.mjs +0 -139
- package/esm2022/lib/types/multi-select-checkbox.component.mjs +0 -247
- package/esm2022/lib/types/radio.type.mjs +0 -71
- package/esm2022/lib/types/scrollable-tabs.types.mjs +0 -220
- package/esm2022/lib/types/select-api-auto-complete.component.mjs +0 -111
- package/esm2022/lib/types/select-autocomplete-redefined.component.mjs +0 -142
- package/esm2022/lib/types/select-autocomplete.type.mjs +0 -254
- package/esm2022/lib/types/stepper.type.mjs +0 -268
- package/esm2022/lib/types/table.types.mjs +0 -79
- package/esm2022/lib/types/tabs.types.mjs +0 -293
- package/esm2022/lib/types/tabular-form-dialog.component.mjs +0 -331
- package/esm2022/lib/types/tabular-form.type.mjs +0 -641
- package/esm2022/lib/types/upload-file.mjs +0 -524
- package/esm2022/lib/types/view-file-dialog.component.mjs +0 -90
- package/esm2022/lib/utils/formly.utils.mjs +0 -105
- package/esm2022/lib/validators/custom-email-validator.mjs +0 -18
- package/esm2022/lib/validators/ein-validators.mjs +0 -11
- package/esm2022/lib/validators/gst-validator.mjs +0 -11
- package/esm2022/lib/validators/normal-email-validator.mjs +0 -17
- package/esm2022/lib/validators/npi-validator.mjs +0 -11
- package/esm2022/lib/validators/pan-validator.mjs +0 -11
- package/esm2022/lib/validators/phone-number-validator.mjs +0 -22
- package/esm2022/lib/validators/select-validator.mjs +0 -7
- package/esm2022/lib/validators/tinSsn-validator.mjs +0 -12
- package/esm2022/lib/workflow-status/ workflow-status.module.mjs +0 -52
- package/esm2022/lib/workflow-status/workflow-status.component.mjs +0 -70
- package/esm2022/lib/wrappers/form-field-description-wrapper.component.mjs +0 -44
- package/esm2022/lib/wrappers/form-field-wrapper.component.mjs +0 -34
- package/esm2022/lib/wrappers/formly-wrapper-with-old-value.component.mjs +0 -140
- package/esm2022/lib/wrappers/prefix-suffix-wrapper.component.mjs +0 -95
- package/esm2022/lib/wrappers/prefix-sufix-extension.component.mjs +0 -9
- package/esm2022/muraai-mnl-form.mjs +0 -5
- package/esm2022/public-api.mjs +0 -12
- /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==
|