@energycap/components 0.39.3 → 0.39.4-ECAP-23220-bc-file-upload-dialog.20231219-1507
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/esm2020/lib/controls/file-upload/file-upload.component.mjs +81 -30
- package/fesm2015/energycap-components.mjs +77 -28
- package/fesm2015/energycap-components.mjs.map +1 -1
- package/fesm2020/energycap-components.mjs +76 -27
- package/fesm2020/energycap-components.mjs.map +1 -1
- package/lib/controls/file-upload/file-upload.component.d.ts +12 -2
- package/package.json +1 -1
- package/src/assets/locales/en_US.json +3 -1
@@ -5,10 +5,12 @@ import { FormControlBase } from '../form-control-base';
|
|
5
5
|
import * as i0 from "@angular/core";
|
6
6
|
import * as i1 from "../../core/validation-message.service";
|
7
7
|
import * as i2 from "../../shared/form-group.helper";
|
8
|
-
import * as i3 from "@angular/
|
9
|
-
import * as i4 from "
|
10
|
-
import * as i5 from "../
|
11
|
-
import * as i6 from "../form-
|
8
|
+
import * as i3 from "@angular/common";
|
9
|
+
import * as i4 from "@angular/forms";
|
10
|
+
import * as i5 from "../button/button.component";
|
11
|
+
import * as i6 from "../form-control/form-control.component";
|
12
|
+
import * as i7 from "../form-group/form-group.component";
|
13
|
+
import * as i8 from "@ngx-translate/core";
|
12
14
|
export const FileTypeExtensions = {
|
13
15
|
zip: ['.zip'],
|
14
16
|
excel: ['.xls', '.xlsx']
|
@@ -17,8 +19,8 @@ export class FileUploadComponent extends FormControlBase {
|
|
17
19
|
// static class to create the form group from a parent component
|
18
20
|
static getFormModel(validators, disabled = false) {
|
19
21
|
let formGroup = new UntypedFormGroup({
|
20
|
-
|
21
|
-
|
22
|
+
files: new UntypedFormControl({ value: null, disabled: disabled }, validators),
|
23
|
+
names: new UntypedFormControl({ value: null, disabled: disabled }, validators),
|
22
24
|
base64FileString: new UntypedFormControl(null),
|
23
25
|
uploadResult: new UntypedFormControl(null)
|
24
26
|
});
|
@@ -39,6 +41,12 @@ export class FileUploadComponent extends FormControlBase {
|
|
39
41
|
* File output, determines which properties are supplied on the formModel
|
40
42
|
*/
|
41
43
|
this.fileOutput = 'base64';
|
44
|
+
/**
|
45
|
+
* Optional display type that controls whether the file input textbox is displayed or
|
46
|
+
* simply a button the user clicks to launch the OS file storage dialog.
|
47
|
+
* Default: file
|
48
|
+
*/
|
49
|
+
this.displayType = 'file';
|
42
50
|
}
|
43
51
|
ngOnChanges(changes) {
|
44
52
|
super.ngOnChanges(changes);
|
@@ -52,35 +60,62 @@ export class FileUploadComponent extends FormControlBase {
|
|
52
60
|
this.formModel?.get('name')?.valueChanges.pipe(takeUntil(this.componentDestroyed)).subscribe(value => {
|
53
61
|
if (!value) {
|
54
62
|
this.formModel.patchValue({
|
55
|
-
|
63
|
+
files: null,
|
64
|
+
names: null,
|
56
65
|
base64FileString: null,
|
57
66
|
uploadResult: null
|
58
67
|
});
|
59
68
|
}
|
60
69
|
});
|
61
70
|
}
|
71
|
+
// * New fileChange method
|
62
72
|
async fileChange(files) {
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
// the fileChange to trigger.
|
79
|
-
if (this.fileInput) {
|
80
|
-
this.fileInput.nativeElement.value = '';
|
73
|
+
const promises = Array.from(files).map((file) => new Promise((resolve) => {
|
74
|
+
if (file) {
|
75
|
+
const reader = new FileReader();
|
76
|
+
reader.onloadend = async (e) => {
|
77
|
+
const base64FileString = reader?.result?.toString().split(",")[1];
|
78
|
+
await this.processFile(file, base64FileString);
|
79
|
+
resolve(null);
|
80
|
+
};
|
81
|
+
if (this.isBase64FileOutput()) {
|
82
|
+
reader.readAsDataURL(file);
|
83
|
+
}
|
84
|
+
else {
|
85
|
+
resolve(this.processFile(file));
|
86
|
+
}
|
87
|
+
;
|
81
88
|
}
|
89
|
+
}));
|
90
|
+
await Promise.all(promises);
|
91
|
+
// Clear the file inputs value, this will allow the user to pick the same filenames again
|
92
|
+
// and cause fileChange to re-trigger.
|
93
|
+
if (this.fileInput) {
|
94
|
+
this.fileInput.nativeElement.value = '';
|
82
95
|
}
|
83
96
|
}
|
97
|
+
// * Old Method
|
98
|
+
// public async fileChange(files: FileList): Promise<void> {
|
99
|
+
// let file = files.item(0);
|
100
|
+
// // If there is a file selected and then opened again and click cancel you get null so don't try and set anything
|
101
|
+
// if (file) {
|
102
|
+
// let reader: FileReader = new FileReader();
|
103
|
+
// reader.onloadend = async e => {
|
104
|
+
// let base64FileString: string | undefined = reader?.result?.toString().split(",")[1];
|
105
|
+
// this.processFile(file!, base64FileString);
|
106
|
+
// };
|
107
|
+
// if (this.isBase64FileOutput()) {
|
108
|
+
// reader.readAsDataURL(file);
|
109
|
+
// } else {
|
110
|
+
// await this.processFile(file!);
|
111
|
+
// }
|
112
|
+
// // Clear the file inputs value, this will allow the user to pick the same filename and cause
|
113
|
+
// // the fileChange to trigger.
|
114
|
+
// if (this.fileInput) {
|
115
|
+
// this.fileInput.nativeElement.value = '';
|
116
|
+
// }
|
117
|
+
// }
|
118
|
+
// }
|
84
119
|
/**
|
85
120
|
* Checks the file type and updates the file type accept property. This is what determines the file
|
86
121
|
* type choices that the user will be limited to in the file browse dialog
|
@@ -133,10 +168,22 @@ export class FileUploadComponent extends FormControlBase {
|
|
133
168
|
* @param base64FileString
|
134
169
|
* @param onFileSelectedResult
|
135
170
|
*/
|
171
|
+
// * Old method
|
136
172
|
patchFileResult(file, base64FileString, onFileSelectedResult) {
|
173
|
+
// Get the current value of files from formModel
|
174
|
+
let files = this.formModel?.get('files')?.value || [];
|
175
|
+
let names = this.formModel?.get('names')?.value || [];
|
176
|
+
// If the file is not null, append it to the files array
|
177
|
+
if (file) {
|
178
|
+
files = [...files, file];
|
179
|
+
}
|
180
|
+
// If the file name is not null, append it to the names array
|
181
|
+
if (file?.name) {
|
182
|
+
names = [...names, file.name];
|
183
|
+
}
|
137
184
|
this.formModel?.patchValue({
|
138
|
-
|
139
|
-
|
185
|
+
files: files,
|
186
|
+
names: names,
|
140
187
|
base64FileString: base64FileString ?? null
|
141
188
|
});
|
142
189
|
if (onFileSelectedResult) {
|
@@ -148,10 +195,10 @@ export class FileUploadComponent extends FormControlBase {
|
|
148
195
|
}
|
149
196
|
}
|
150
197
|
FileUploadComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FileUploadComponent, deps: [{ token: i1.ValidationMessageService }, { token: i2.FormGroupHelper }], target: i0.ɵɵFactoryTarget.Component });
|
151
|
-
FileUploadComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: FileUploadComponent, selector: "ec-file-upload", inputs: { placeholder: "placeholder", fileType: "fileType", fileOutput: "fileOutput", customExtensions: "customExtensions", onFileSelected: "onFileSelected" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, read: ElementRef, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ec-form-group [label]=\"label\"\r\n [formGroup]=\"formModel\"\r\n class=\"mb-0\">\r\n <div class=\"d-flex control-group\">\r\n <div class=\"d-flex flex-grow position-relative\">\r\n <input #fileInput\r\n id=\"{{inputId}}_input\"\r\n type=\"file\"\r\n tabindex=\"-1\"\r\n [attr.accept]=\"fileTypeAccept\"\r\n (
|
198
|
+
FileUploadComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: FileUploadComponent, selector: "ec-file-upload", inputs: { placeholder: "placeholder", fileType: "fileType", fileOutput: "fileOutput", customExtensions: "customExtensions", onFileSelected: "onFileSelected", displayType: "displayType", buttonLabel: "buttonLabel" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, read: ElementRef, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ec-form-group [label]=\"label\"\r\n [formGroup]=\"formModel\"\r\n class=\"mb-0\">\r\n <div class=\"d-flex control-group\">\r\n <div class=\"d-flex flex-grow position-relative\">\r\n <input #fileInput\r\n id=\"{{inputId}}_input\"\r\n type=\"file\"\r\n tabindex=\"-1\"\r\n [attr.accept]=\"fileTypeAccept\"\r\n (change)=\"fileChange($event.target.files)\"\r\n [class.has-value]=\"formModel?.get('name')?.value\"\r\n multiple>\r\n <ec-form-control *ngIf=\"displayType === 'file'\"\r\n id=\"{{inputId}}_formControl\"\r\n class=\"text-truncate\"\r\n [required]=\"required\"\r\n [pending]=\"pending\">\r\n <input id=\"{{inputId}}_name\"\r\n [formControl]=\"formModel?.get('name')\"\r\n type=\"text\"\r\n [placeholder]=\"placeholder\"\r\n [tabindex]=\"-1\">\r\n </ec-form-control>\r\n </div>\r\n <ec-button *ngIf=\"displayType === 'file'\"\r\n #browseBtn\r\n id=\"{{inputId}}_browseBtn\"\r\n (clicked)=\"fileInput.click()\"\r\n type=\"secondary\"\r\n [tabindex]=\"tabindex\"\r\n [disabled]=\"formModel?.get('name')?.disabled\"\r\n label=\"Browse\"\r\n [autofocus]=\"autofocus\">\r\n </ec-button>\r\n </div>\r\n <ec-button *ngIf=\"displayType === 'button'\"\r\n #selectZipFilesBtn\r\n id=\"{{inputId}}_browseBtn\"\r\n [pending]=\"pending\"\r\n type=\"primary\"\r\n [label]=\"buttonLabel ?? 'Browse_TC' | translate\"\r\n (clicked)=\"fileInput.click()\"\r\n style=\"width: 100%;\">\r\n </ec-button>\r\n</ec-form-group>", styles: [":host{display:block;margin-bottom:1rem}ec-form-control{margin-bottom:0}ec-form-control ::ng-deep>.ec-focus-ring{display:none!important}input[type=file]{opacity:0;display:block;position:absolute;top:0;left:0;width:100%;height:100%;z-index:1;cursor:pointer}input[type=file].has-value{width:calc(100% - 1.5rem)}ec-button{--ec-button-border-color-secondary: var(--ec-form-control-border-color);--ec-button-color-icon-secondary: var(--ec-color-icon)}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: i6.FormControlComponent, selector: "ec-form-control", inputs: ["id", "icon", "actionIcon", "showClear", "pending", "required", "readonly"], outputs: ["actionClicked"] }, { kind: "component", type: i7.FormGroupComponent, selector: "ec-form-group", inputs: ["id", "label", "formGroup", "labelPosition", "overrideValidationError", "hideValidationMessage"] }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] });
|
152
199
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FileUploadComponent, decorators: [{
|
153
200
|
type: Component,
|
154
|
-
args: [{ selector: "ec-file-upload", template: "<ec-form-group [label]=\"label\"\r\n [formGroup]=\"formModel\"\r\n class=\"mb-0\">\r\n <div class=\"d-flex control-group\">\r\n <div class=\"d-flex flex-grow position-relative\">\r\n <input #fileInput\r\n id=\"{{inputId}}_input\"\r\n type=\"file\"\r\n tabindex=\"-1\"\r\n [attr.accept]=\"fileTypeAccept\"\r\n (
|
201
|
+
args: [{ selector: "ec-file-upload", template: "<ec-form-group [label]=\"label\"\r\n [formGroup]=\"formModel\"\r\n class=\"mb-0\">\r\n <div class=\"d-flex control-group\">\r\n <div class=\"d-flex flex-grow position-relative\">\r\n <input #fileInput\r\n id=\"{{inputId}}_input\"\r\n type=\"file\"\r\n tabindex=\"-1\"\r\n [attr.accept]=\"fileTypeAccept\"\r\n (change)=\"fileChange($event.target.files)\"\r\n [class.has-value]=\"formModel?.get('name')?.value\"\r\n multiple>\r\n <ec-form-control *ngIf=\"displayType === 'file'\"\r\n id=\"{{inputId}}_formControl\"\r\n class=\"text-truncate\"\r\n [required]=\"required\"\r\n [pending]=\"pending\">\r\n <input id=\"{{inputId}}_name\"\r\n [formControl]=\"formModel?.get('name')\"\r\n type=\"text\"\r\n [placeholder]=\"placeholder\"\r\n [tabindex]=\"-1\">\r\n </ec-form-control>\r\n </div>\r\n <ec-button *ngIf=\"displayType === 'file'\"\r\n #browseBtn\r\n id=\"{{inputId}}_browseBtn\"\r\n (clicked)=\"fileInput.click()\"\r\n type=\"secondary\"\r\n [tabindex]=\"tabindex\"\r\n [disabled]=\"formModel?.get('name')?.disabled\"\r\n label=\"Browse\"\r\n [autofocus]=\"autofocus\">\r\n </ec-button>\r\n </div>\r\n <ec-button *ngIf=\"displayType === 'button'\"\r\n #selectZipFilesBtn\r\n id=\"{{inputId}}_browseBtn\"\r\n [pending]=\"pending\"\r\n type=\"primary\"\r\n [label]=\"buttonLabel ?? 'Browse_TC' | translate\"\r\n (clicked)=\"fileInput.click()\"\r\n style=\"width: 100%;\">\r\n </ec-button>\r\n</ec-form-group>", styles: [":host{display:block;margin-bottom:1rem}ec-form-control{margin-bottom:0}ec-form-control ::ng-deep>.ec-focus-ring{display:none!important}input[type=file]{opacity:0;display:block;position:absolute;top:0;left:0;width:100%;height:100%;z-index:1;cursor:pointer}input[type=file].has-value{width:calc(100% - 1.5rem)}ec-button{--ec-button-border-color-secondary: var(--ec-form-control-border-color);--ec-button-color-icon-secondary: var(--ec-color-icon)}\n"] }]
|
155
202
|
}], ctorParameters: function () { return [{ type: i1.ValidationMessageService }, { type: i2.FormGroupHelper }]; }, propDecorators: { placeholder: [{
|
156
203
|
type: Input
|
157
204
|
}], fileType: [{
|
@@ -162,8 +209,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
162
209
|
type: Input
|
163
210
|
}], onFileSelected: [{
|
164
211
|
type: Input
|
212
|
+
}], displayType: [{
|
213
|
+
type: Input
|
214
|
+
}], buttonLabel: [{
|
215
|
+
type: Input
|
165
216
|
}], fileInput: [{
|
166
217
|
type: ViewChild,
|
167
218
|
args: ["fileInput", { read: ElementRef, static: true }]
|
168
219
|
}] } });
|
169
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9maWxlLXVwbG9hZC9maWxlLXVwbG9hZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQW9DLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7Ozs7OztBQUt2RCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRztJQUNoQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDYixLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO0NBQ3pCLENBQUM7QUFPRixNQUFNLE9BQU8sbUJBQW9CLFNBQVEsZUFBZTtJQUV0RCxnRUFBZ0U7SUFDekQsTUFBTSxDQUFDLFlBQVksQ0FDeEIsVUFBeUIsRUFDekIsV0FBb0IsS0FBSztRQUV6QixJQUFJLFNBQVMsR0FBRyxJQUFJLGdCQUFnQixDQUFDO1lBQ25DLElBQUksRUFBRSxJQUFJLGtCQUFrQixDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsVUFBVSxDQUFDO1lBQzdFLElBQUksRUFBRSxJQUFJLGtCQUFrQixDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsVUFBVSxDQUFDO1lBQzdFLGdCQUFnQixFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDO1lBQzlDLFlBQVksRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQztTQUMzQyxDQUFDLENBQUM7UUFDSCxJQUFJLFFBQVEsRUFBRTtZQUNaLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNyQjtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFpQ0QsWUFDWSx3QkFBa0QsRUFDbEQsZUFBZ0M7UUFFMUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBSHZDLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBakM1Qzs7V0FFRztRQUNhLGdCQUFXLEdBQVksZ0JBQWdCLENBQUM7UUFReEQ7O1dBRUc7UUFDYSxlQUFVLEdBQWdCLFFBQVEsQ0FBQztJQXNCbkQsQ0FBQztJQUVNLFdBQVcsQ0FBQyxPQUFzQjtRQUN2QyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTNCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFTSxRQUFRO1FBQ2IsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWpCLDRFQUE0RTtRQUM1RSxtRkFBbUY7UUFDbkYsbUJBQW1CO1FBQ25CLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQzVDLFNBQVMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FDbkMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEIsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDVixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztvQkFDeEIsSUFBSSxFQUFFLElBQUk7b0JBQ1YsZ0JBQWdCLEVBQUUsSUFBSTtvQkFDdEIsWUFBWSxFQUFFLElBQUk7aUJBQ25CLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFlO1FBQ3JDLElBQUksSUFBSSxHQUFnQixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRDLGdIQUFnSDtRQUNoSCxJQUFJLElBQUksRUFBRTtZQUNSLElBQUksTUFBTSxHQUFlLElBQUksVUFBVSxFQUFFLENBQUM7WUFFMUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxLQUFLLEVBQUMsQ0FBQyxFQUFDLEVBQUU7Z0JBQzNCLElBQUksZ0JBQWdCLEdBQXVCLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwRixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUssRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzVDLENBQUMsQ0FBQztZQUVGLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUU7Z0JBQzdCLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDNUI7aUJBQU07Z0JBQ0wsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUssQ0FBQyxDQUFDO2FBQy9CO1lBRUQsNEZBQTRGO1lBQzVGLDZCQUE2QjtZQUM3QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7YUFDekM7U0FDRjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxvQkFBb0I7UUFDMUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxjQUFjLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNuRTtpQkFBTTtnQkFDTCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtvQkFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUN2RDthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFVLEVBQUUsZ0JBQXFDO1FBQ3pFLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixJQUFJO2dCQUNGLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDdEQ7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDViwyREFBMkQ7Z0JBQzNELDRFQUE0RTthQUM3RTtTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1NBQzlDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGtCQUFrQjtRQUN4QixPQUFPLElBQUksQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxlQUFlLENBQUMsSUFBaUIsRUFBRSxnQkFBeUIsRUFBRSxvQkFBMEI7UUFDOUYsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUM7WUFDekIsSUFBSSxFQUFFLElBQUk7WUFDVixJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7WUFDaEIsZ0JBQWdCLEVBQUUsZ0JBQWdCLElBQUksSUFBSTtTQUMzQyxDQUFDLENBQUM7UUFFSCxJQUFJLG9CQUFvQixFQUFFO1lBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQztTQUNuRTthQUFNO1lBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUNuRDtJQUNILENBQUM7O2dIQTVLVSxtQkFBbUI7b0dBQW5CLG1CQUFtQix5U0E2Q0UsVUFBVSx1RkNqRTVDLDQ1Q0FrQ2dCOzJGRGRILG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxnQkFBZ0I7NklBMEJWLFdBQVc7c0JBQTFCLEtBQUs7Z0JBTVUsUUFBUTtzQkFBdkIsS0FBSztnQkFLVSxVQUFVO3NCQUF6QixLQUFLO2dCQUdVLGdCQUFnQjtzQkFBL0IsS0FBSztnQkFPVSxjQUFjO3NCQUE3QixLQUFLO2dCQUU2RCxTQUFTO3NCQUEzRSxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3ZhbGlkYXRpb24tbWVzc2FnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwSGVscGVyIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Zvcm0tZ3JvdXAuaGVscGVyJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2xCYXNlIH0gZnJvbSAnLi4vZm9ybS1jb250cm9sLWJhc2UnO1xyXG5cclxuZXhwb3J0IHR5cGUgRmlsZVR5cGUgPSAnemlwJyB8ICdleGNlbCcgfCAnY3VzdG9tJztcclxuZXhwb3J0IHR5cGUgRmlsZU91dHB1dCA9ICdyYXcnIHwgJ2Jhc2U2NCc7XHJcblxyXG5leHBvcnQgY29uc3QgRmlsZVR5cGVFeHRlbnNpb25zID0ge1xyXG4gIHppcDogWycuemlwJ10sXHJcbiAgZXhjZWw6IFsnLnhscycsICcueGxzeCddXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJlYy1maWxlLXVwbG9hZFwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vZmlsZS11cGxvYWQuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybHM6IFtcIi4vZmlsZS11cGxvYWQuY29tcG9uZW50LnNjc3NcIl1cclxufSlcclxuZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRDb21wb25lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIC8vIHN0YXRpYyBjbGFzcyB0byBjcmVhdGUgdGhlIGZvcm0gZ3JvdXAgZnJvbSBhIHBhcmVudCBjb21wb25lbnRcclxuICBwdWJsaWMgc3RhdGljIGdldEZvcm1Nb2RlbChcclxuICAgIHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10sXHJcbiAgICBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKTogVW50eXBlZEZvcm1Hcm91cCB7XHJcbiAgICBsZXQgZm9ybUdyb3VwID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe1xyXG4gICAgICBmaWxlOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IG51bGwsIGRpc2FibGVkOiBkaXNhYmxlZCB9LCB2YWxpZGF0b3JzKSxcclxuICAgICAgbmFtZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiBudWxsLCBkaXNhYmxlZDogZGlzYWJsZWQgfSwgdmFsaWRhdG9ycyksXHJcbiAgICAgIGJhc2U2NEZpbGVTdHJpbmc6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgIHVwbG9hZFJlc3VsdDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChudWxsKVxyXG4gICAgfSk7XHJcbiAgICBpZiAoZGlzYWJsZWQpIHtcclxuICAgICAgZm9ybUdyb3VwLmRpc2FibGUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmb3JtR3JvdXA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRleHRib3ggaW5wdXQncyBwbGFjZWhvbGRlclxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlcj86IHN0cmluZyA9IFwiQ2hvb3NlIGZpbGUuLi5cIjtcclxuXHJcbiAgLyoqIENvbW1vbiBleHRlbnNpb25zIGZvciBhIGZpbGUgYnJvd3NpbmcgZGlhbG9nXHJcbiAgICogIE5vdGU6IEVkZ2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYWNjZXB0IGF0dHJpYnV0ZSBvbiBmaWxlIGlucHV0cywgdGhlcmVmb3IgYWxsIGZpbGUgdHlwZXNcclxuICAgKiAgICAgICAgd2lsbCBiZSBzaG93bi4gIEZpcmVmb3ggYW5kIENocm9tZSBib3RoIHN1cHBvcnQgdGhpcyBmZWF0dXJlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBmaWxlVHlwZT86IEZpbGVUeXBlIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvKipcclxuICAgKiBGaWxlIG91dHB1dCwgZGV0ZXJtaW5lcyB3aGljaCBwcm9wZXJ0aWVzIGFyZSBzdXBwbGllZCBvbiB0aGUgZm9ybU1vZGVsXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGZpbGVPdXRwdXQ/OiBGaWxlT3V0cHV0ID0gJ2Jhc2U2NCc7XHJcblxyXG4gIC8qKiBJZiBmaWxlVHlwZSBpcyBzZXQgdG8gY3VzdG9tIHNldCB0aGUgYWNjZXB0YWJsZSBmaWxlIHR5cGVzIGJhc2VkIG9uIHRoZSBjdXN0b20gYXJyYXkgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgY3VzdG9tRXh0ZW5zaW9ucz86IEFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIHN1cHBvcnRlZCBpZiB0aGUgaG9zdGluZyBwYWdlIG5lZWRzIHRvIHByb2Nlc3MgdGhlIGZpbGUgYmVmb3JlXHJcbiAgICogc2V0dGluZyB0aGUgZm9ybU1vZGVsIHdpdGggdGhlIGZpbGUgaW5mb3JtYXRpb24uIElmIHRoZSBwcm9taXNlIHJlc29sdmVzIGl0IHdpbGwgY29udGludWVcclxuICAgKiBhbmQgc2V0IHRoZSBmaWxlIG5hbWUgYW5kIGNvbnRlbnRzIHRvIHRoZSBmb3JtTW9kZWwsIG90aGVyd2lzZSBvbiBmYWlsdXJlIGl0J2xsIGRvIG5vdGhpbmcuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIG9uRmlsZVNlbGVjdGVkPzogKGZpbGU6IEZpbGUpID0+IFByb21pc2U8YW55PjtcclxuXHJcbiAgQFZpZXdDaGlsZChcImZpbGVJbnB1dFwiLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgZmlsZUlucHV0PzogRWxlbWVudFJlZjtcclxuXHJcbiAgLyoqIFByb3BlcnR5IGJvdW5kIHRvIHRoZSBmaWxlIGlucHV0IHRvIGZpbHRlciB3aGF0IGZpbGUgdHlwZXMgYXJlIHNob3duIGluIHRoZSBkaWFsb2cgKi9cclxuICBwdWJsaWMgZmlsZVR5cGVBY2NlcHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcm90ZWN0ZWQgdmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlOiBWYWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UsXHJcbiAgICBwcm90ZWN0ZWQgZm9ybUdyb3VwSGVscGVyOiBGb3JtR3JvdXBIZWxwZXJcclxuICApIHtcclxuICAgIHN1cGVyKHZhbGlkYXRpb25NZXNzYWdlU2VydmljZSwgZm9ybUdyb3VwSGVscGVyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUZpbGVUeXBlQWNjZXB0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgIC8vIFdhdGNoIGZvciBuYW1lIHRvIGNoYW5nZSwgaWYgdGhlIHZhbHVlIGlzIGNsZWFyZWQgd2Ugd2lsbCBjbGVhciB0aGUgb3RoZXJcclxuICAgIC8vIHN1cHBvcnRpbmcgbW9kZWwgcHJvcGVydGllcy4gVGhlIG5hbWUgY2FuIGJlIGNsZWFyZWQgYnkgdGhlIHVzZXIgbWFudWFsbHkgb3IgdmlhXHJcbiAgICAvLyB0aGUgY2xlYXIgYnV0dG9uXHJcbiAgICB0aGlzLmZvcm1Nb2RlbD8uZ2V0KCduYW1lJyk/LnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpXHJcbiAgICApLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICB0aGlzLmZvcm1Nb2RlbC5wYXRjaFZhbHVlKHtcclxuICAgICAgICAgIGZpbGU6IG51bGwsXHJcbiAgICAgICAgICBiYXNlNjRGaWxlU3RyaW5nOiBudWxsLFxyXG4gICAgICAgICAgdXBsb2FkUmVzdWx0OiBudWxsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGZpbGVDaGFuZ2UoZmlsZXM6IEZpbGVMaXN0KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZmlsZTogRmlsZSB8IG51bGwgPSBmaWxlcy5pdGVtKDApO1xyXG5cclxuICAgIC8vIElmIHRoZXJlIGlzIGEgZmlsZSBzZWxlY3RlZCBhbmQgdGhlbiBvcGVuZWQgYWdhaW4gYW5kIGNsaWNrIGNhbmNlbCB5b3UgZ2V0IG51bGwgc28gZG9uJ3QgdHJ5IGFuZCBzZXQgYW55dGhpbmdcclxuICAgIGlmIChmaWxlKSB7XHJcbiAgICAgIGxldCByZWFkZXI6IEZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGFzeW5jIGUgPT4ge1xyXG4gICAgICAgIGxldCBiYXNlNjRGaWxlU3RyaW5nOiBzdHJpbmcgfCB1bmRlZmluZWQgPSByZWFkZXI/LnJlc3VsdD8udG9TdHJpbmcoKS5zcGxpdChcIixcIilbMV07XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzRmlsZShmaWxlISwgYmFzZTY0RmlsZVN0cmluZyk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAodGhpcy5pc0Jhc2U2NEZpbGVPdXRwdXQoKSkge1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0ZpbGUoZmlsZSEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBDbGVhciB0aGUgZmlsZSBpbnB1dHMgdmFsdWUsIHRoaXMgd2lsbCBhbGxvdyB0aGUgdXNlciB0byBwaWNrIHRoZSBzYW1lIGZpbGVuYW1lIGFuZCBjYXVzZVxyXG4gICAgICAvLyB0aGUgZmlsZUNoYW5nZSB0byB0cmlnZ2VyLlxyXG4gICAgICBpZiAodGhpcy5maWxlSW5wdXQpIHtcclxuICAgICAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyB0aGUgZmlsZSB0eXBlIGFuZCB1cGRhdGVzIHRoZSBmaWxlIHR5cGUgYWNjZXB0IHByb3BlcnR5LiBUaGlzIGlzIHdoYXQgZGV0ZXJtaW5lcyB0aGUgZmlsZVxyXG4gICAqIHR5cGUgY2hvaWNlcyB0aGF0IHRoZSB1c2VyIHdpbGwgYmUgbGltaXRlZCB0byBpbiB0aGUgZmlsZSBicm93c2UgZGlhbG9nXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVGaWxlVHlwZUFjY2VwdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmZpbGVUeXBlKSB7XHJcbiAgICAgIGlmICh0aGlzLmZpbGVUeXBlICE9PSBcImN1c3RvbVwiKSB7XHJcbiAgICAgICAgdGhpcy5maWxlVHlwZUFjY2VwdCA9IEZpbGVUeXBlRXh0ZW5zaW9uc1t0aGlzLmZpbGVUeXBlXS5qb2luKFwiLFwiKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5jdXN0b21FeHRlbnNpb25zKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbGVUeXBlQWNjZXB0ID0gdGhpcy5jdXN0b21FeHRlbnNpb25zLmpvaW4oXCIsXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGFrZSBhIGZpbGUgdGhhdCB3YXMgc2VsZWN0ZWQgYnkgdGhlIHVzZXIgYW5kIHByb2Nlc3MvcGF0Y2ggb3VyIGZvcm0gbW9kZWxcclxuICAgKiBJZiB0aGUgaG9zdCBjb21wb25lbnQgcmVxdWlyZXMgYW4gYWN0aW9uIHRvIG9jY3VyIHdpdGggdGhlIGZpbGUgcHJpb3IgdG8gdGhlIHBhdGNoIGl0IHdpbGwgY2FsbFxyXG4gICAqIGFuZCB3YWl0IGZvciBpdCB0byByZXR1cm4uXHJcbiAgICogQHBhcmFtIGZpbGUgXHJcbiAgICogQHBhcmFtIGJhc2U2NEZpbGVTdHJpbmcgT3B0aW9uYWw6IFdpbGwgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIGlmIHRoZSBmaWxlT3V0cHV0IGlzIHNldCB0byBiYXNlNjRcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NGaWxlKGZpbGU6IEZpbGUsIGJhc2U2NEZpbGVTdHJpbmc/OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLm9uRmlsZVNlbGVjdGVkKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMub25GaWxlU2VsZWN0ZWQoZmlsZSk7XHJcbiAgICAgICAgdGhpcy5wYXRjaEZpbGVSZXN1bHQoZmlsZSwgYmFzZTY0RmlsZVN0cmluZywgcmVzdWx0KTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIC8vIEJ1bW1lciwgd2UncmUgbm90IGdvaW5nIHRvIGRvIGFueXRoaW5nIGFib3V0IGl0IHRob3VnaC4gXHJcbiAgICAgICAgLy8gV2UgYXJlIG5vdCBwYXRjaGluZyBhbnkgb2YgdGhlIHJlc3VsdCBzbyBhbnkgZXhpc3RpbmcgaW5mb3JtYXRpb24gcmVtYWluc1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBhdGNoRmlsZVJlc3VsdChmaWxlLCBiYXNlNjRGaWxlU3RyaW5nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJhc2VkIG9uIHRoZSBmaWxlT3V0cHV0IHJldHVybiB3aGV0aGVyIHRoaXMgY29tcG9uZW50IGlzIGV4cGVjdGVkIHRvIGRlbGl2ZXIgYSBiYXNlNjQgb3V0cHV0XHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0Jhc2U2NEZpbGVPdXRwdXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5maWxlT3V0cHV0ID09PSAnYmFzZTY0JztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZW4gdGhlIGZpbGUgd2FzIHNlbGVjdGVkIGFuZCBwcm9jZXNzZWQgcGF0Y2ggdGhlIGZpbGUgaW5mb3JtYXRpb24gdGhhdCB0aGUgaG9zdGluZyBmb3JtIHdpbGxcclxuICAgKiBiZSBsb29raW5nIGZvci4gXHJcbiAgICogQHBhcmFtIGZpbGUgXHJcbiAgICogQHBhcmFtIGJhc2U2NEZpbGVTdHJpbmcgXHJcbiAgICogQHBhcmFtIG9uRmlsZVNlbGVjdGVkUmVzdWx0IFxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGF0Y2hGaWxlUmVzdWx0KGZpbGU6IEZpbGUgfCBudWxsLCBiYXNlNjRGaWxlU3RyaW5nPzogc3RyaW5nLCBvbkZpbGVTZWxlY3RlZFJlc3VsdD86IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JtTW9kZWw/LnBhdGNoVmFsdWUoeyBcclxuICAgICAgZmlsZTogZmlsZSwgXHJcbiAgICAgIG5hbWU6IGZpbGU/Lm5hbWUsIFxyXG4gICAgICBiYXNlNjRGaWxlU3RyaW5nOiBiYXNlNjRGaWxlU3RyaW5nID8/IG51bGxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChvbkZpbGVTZWxlY3RlZFJlc3VsdCkge1xyXG4gICAgICB0aGlzLmZvcm1Nb2RlbC5wYXRjaFZhbHVlKHsgdXBsb2FkUmVzdWx0OiBvbkZpbGVTZWxlY3RlZFJlc3VsdCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZm9ybU1vZGVsLnBhdGNoVmFsdWUoeyB1cGxvYWRSZXN1bHQ6IG51bGwgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxlYy1mb3JtLWdyb3VwIFtsYWJlbF09XCJsYWJlbFwiXHJcbiAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybU1vZGVsXCJcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJtYi0wXCI+XHJcbiAgPGRpdiBjbGFzcz1cImQtZmxleCBjb250cm9sLWdyb3VwXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtZ3JvdyBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICA8aW5wdXQgI2ZpbGVJbnB1dFxyXG4gICAgICAgICAgICAgaWQ9XCJ7e2lucHV0SWR9fV9pbnB1dFwiXHJcbiAgICAgICAgICAgICB0eXBlPVwiZmlsZVwiXHJcbiAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcclxuICAgICAgICAgICAgIFthdHRyLmFjY2VwdF09XCJmaWxlVHlwZUFjY2VwdFwiXHJcbiAgICAgICAgICAgICAoY2xpY2spPVwiYnJvd3NlQnRuLmZvY3VzKClcIlxyXG4gICAgICAgICAgICAgKGNoYW5nZSk9XCJmaWxlQ2hhbmdlKCRldmVudC50YXJnZXQuZmlsZXMpXCJcclxuICAgICAgICAgICAgIFtjbGFzcy5oYXMtdmFsdWVdPVwiZm9ybU1vZGVsPy5nZXQoJ25hbWUnKT8udmFsdWVcIj5cclxuICAgICAgPGVjLWZvcm0tY29udHJvbCBpZD1cInt7aW5wdXRJZH19X2Zvcm1Db250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW3BlbmRpbmddPVwicGVuZGluZ1wiPlxyXG4gICAgICAgIDxpbnB1dCBpZD1cInt7aW5wdXRJZH19X25hbWVcIlxyXG4gICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybU1vZGVsPy5nZXQoJ25hbWUnKVwiXHJcbiAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIi0xXCI+XHJcbiAgICAgIDwvZWMtZm9ybS1jb250cm9sPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZWMtYnV0dG9uICNicm93c2VCdG5cclxuICAgICAgICAgICAgICAgaWQ9XCJ7e2lucHV0SWR9fV9icm93c2VCdG5cIlxyXG4gICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJmaWxlSW5wdXQuY2xpY2soKVwiXHJcbiAgICAgICAgICAgICAgIHR5cGU9XCJzZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxyXG4gICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybU1vZGVsPy5nZXQoJ25hbWUnKT8uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICBsYWJlbD1cIkJyb3dzZVwiXHJcbiAgICAgICAgICAgICAgIFthdXRvZm9jdXNdPVwiYXV0b2ZvY3VzXCI+XHJcbiAgICA8L2VjLWJ1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9lYy1mb3JtLWdyb3VwPiJdfQ==
|
220
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9maWxlLXVwbG9hZC9maWxlLXVwbG9hZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQW9DLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7Ozs7Ozs7O0FBS3ZELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHO0lBQ2hDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUNiLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7Q0FDekIsQ0FBQztBQU9GLE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxlQUFlO0lBRXRELGdFQUFnRTtJQUN6RCxNQUFNLENBQUMsWUFBWSxDQUN4QixVQUF5QixFQUN6QixXQUFvQixLQUFLO1FBRXpCLElBQUksU0FBUyxHQUFHLElBQUksZ0JBQWdCLENBQUM7WUFDbkMsS0FBSyxFQUFFLElBQUksa0JBQWtCLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxVQUFVLENBQUM7WUFDOUUsS0FBSyxFQUFFLElBQUksa0JBQWtCLENBQUMsRUFBRSxLQUFLLEVBQUUs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Q25FO2FBQU07WUFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ25EO0lBRUgsQ0FBQzs7Z0hBdk9VLG1CQUFtQjtvR0FBbkIsbUJBQW1CLGlXQXlERSxVQUFVLHVGQzdFNUMsNDJEQTZDZ0I7MkZEekJILG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxnQkFBZ0I7NklBMEJWLFdBQVc7c0JBQTFCLEtBQUs7Z0JBTVUsUUFBUTtzQkFBdkIsS0FBSztnQkFLVSxVQUFVO3NCQUF6QixLQUFLO2dCQUdVLGdCQUFnQjtzQkFBL0IsS0FBSztnQkFPVSxjQUFjO3NCQUE3QixLQUFLO2dCQU9VLFdBQVc7c0JBQTFCLEtBQUs7Z0JBS1UsV0FBVztzQkFBMUIsS0FBSztnQkFFNkQsU0FBUztzQkFBM0UsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS92YWxpZGF0aW9uLW1lc3NhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cEhlbHBlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9mb3JtLWdyb3VwLmhlbHBlcic7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sQmFzZSB9IGZyb20gJy4uL2Zvcm0tY29udHJvbC1iYXNlJztcclxuXHJcbmV4cG9ydCB0eXBlIEZpbGVUeXBlID0gJ3ppcCcgfCAnZXhjZWwnIHwgJ2N1c3RvbSc7XHJcbmV4cG9ydCB0eXBlIEZpbGVPdXRwdXQgPSAncmF3JyB8ICdiYXNlNjQnO1xyXG5cclxuZXhwb3J0IGNvbnN0IEZpbGVUeXBlRXh0ZW5zaW9ucyA9IHtcclxuICB6aXA6IFsnLnppcCddLFxyXG4gIGV4Y2VsOiBbJy54bHMnLCAnLnhsc3gnXVxyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiZWMtZmlsZS11cGxvYWRcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC5zY3NzXCJdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWxlVXBsb2FkQ29tcG9uZW50IGV4dGVuZHMgRm9ybUNvbnRyb2xCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG5cclxuICAvLyBzdGF0aWMgY2xhc3MgdG8gY3JlYXRlIHRoZSBmb3JtIGdyb3VwIGZyb20gYSBwYXJlbnQgY29tcG9uZW50XHJcbiAgcHVibGljIHN0YXRpYyBnZXRGb3JtTW9kZWwoXHJcbiAgICB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdLFxyXG4gICAgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICk6IFVudHlwZWRGb3JtR3JvdXAge1xyXG4gICAgbGV0IGZvcm1Hcm91cCA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHtcclxuICAgICAgZmlsZXM6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogbnVsbCwgZGlzYWJsZWQ6IGRpc2FibGVkIH0sIHZhbGlkYXRvcnMpLFxyXG4gICAgICBuYW1lczogbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiBudWxsLCBkaXNhYmxlZDogZGlzYWJsZWQgfSwgdmFsaWRhdG9ycyksXHJcbiAgICAgIGJhc2U2NEZpbGVTdHJpbmc6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgIHVwbG9hZFJlc3VsdDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChudWxsKVxyXG4gICAgfSk7XHJcbiAgICBpZiAoZGlzYWJsZWQpIHtcclxuICAgICAgZm9ybUdyb3VwLmRpc2FibGUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmb3JtR3JvdXA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRleHRib3ggaW5wdXQncyBwbGFjZWhvbGRlclxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlcj86IHN0cmluZyA9IFwiQ2hvb3NlIGZpbGUuLi5cIjtcclxuXHJcbiAgLyoqIENvbW1vbiBleHRlbnNpb25zIGZvciBhIGZpbGUgYnJvd3NpbmcgZGlhbG9nXHJcbiAgICogIE5vdGU6IEVkZ2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYWNjZXB0IGF0dHJpYnV0ZSBvbiBmaWxlIGlucHV0cywgdGhlcmVmb3IgYWxsIGZpbGUgdHlwZXNcclxuICAgKiAgICAgICAgd2lsbCBiZSBzaG93bi4gIEZpcmVmb3ggYW5kIENocm9tZSBib3RoIHN1cHBvcnQgdGhpcyBmZWF0dXJlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBmaWxlVHlwZT86IEZpbGVUeXBlIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvKipcclxuICAgKiBGaWxlIG91dHB1dCwgZGV0ZXJtaW5lcyB3aGljaCBwcm9wZXJ0aWVzIGFyZSBzdXBwbGllZCBvbiB0aGUgZm9ybU1vZGVsXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGZpbGVPdXRwdXQ/OiBGaWxlT3V0cHV0ID0gJ2Jhc2U2NCc7XHJcblxyXG4gIC8qKiBJZiBmaWxlVHlwZSBpcyBzZXQgdG8gY3VzdG9tIHNldCB0aGUgYWNjZXB0YWJsZSBmaWxlIHR5cGVzIGJhc2VkIG9uIHRoZSBjdXN0b20gYXJyYXkgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgY3VzdG9tRXh0ZW5zaW9ucz86IEFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIHN1cHBvcnRlZCBpZiB0aGUgaG9zdGluZyBwYWdlIG5lZWRzIHRvIHByb2Nlc3MgdGhlIGZpbGUgYmVmb3JlXHJcbiAgICogc2V0dGluZyB0aGUgZm9ybU1vZGVsIHdpdGggdGhlIGZpbGUgaW5mb3JtYXRpb24uIElmIHRoZSBwcm9taXNlIHJlc29sdmVzIGl0IHdpbGwgY29udGludWVcclxuICAgKiBhbmQgc2V0IHRoZSBmaWxlIG5hbWUgYW5kIGNvbnRlbnRzIHRvIHRoZSBmb3JtTW9kZWwsIG90aGVyd2lzZSBvbiBmYWlsdXJlIGl0J2xsIGRvIG5vdGhpbmcuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIG9uRmlsZVNlbGVjdGVkPzogKGZpbGVzOiBGaWxlIHwgRmlsZVtdKSA9PiBQcm9taXNlPGFueT47XHJcblxyXG4gIC8qKiBcclxuICAgKiBPcHRpb25hbCBkaXNwbGF5IHR5cGUgdGhhdCBjb250cm9scyB3aGV0aGVyIHRoZSBmaWxlIGlucHV0IHRleHRib3ggaXMgZGlzcGxheWVkIG9yXHJcbiAgICogc2ltcGx5IGEgYnV0dG9uIHRoZSB1c2VyIGNsaWNrcyB0byBsYXVuY2ggdGhlIE9TIGZpbGUgc3RvcmFnZSBkaWFsb2cuXHJcbiAgICogRGVmYXVsdDogZmlsZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBkaXNwbGF5VHlwZT86ICdmaWxlJyB8ICdidXR0b24nID0gJ2ZpbGUnO1xyXG5cclxuICAvKiogXHJcbiAgICogV2hlbiBkaXNwbGF5IHR5cGUgaXMgc2V0IHRvIGJ1dHRvbiB0aGlzIHByb3BlcnR5IHdpbGwgY29udHJvbCB0aGUgYnV0dG9uIGxhYmVsXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGJ1dHRvbkxhYmVsPzogc3RyaW5nO1xyXG5cclxuICBAVmlld0NoaWxkKFwiZmlsZUlucHV0XCIsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBmaWxlSW5wdXQ/OiBFbGVtZW50UmVmO1xyXG5cclxuICAvKiogUHJvcGVydHkgYm91bmQgdG8gdGhlIGZpbGUgaW5wdXQgdG8gZmlsdGVyIHdoYXQgZmlsZSB0eXBlcyBhcmUgc2hvd24gaW4gdGhlIGRpYWxvZyAqL1xyXG4gIHB1YmxpYyBmaWxlVHlwZUFjY2VwdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByb3RlY3RlZCB2YWxpZGF0aW9uTWVzc2FnZVNlcnZpY2U6IFZhbGlkYXRpb25NZXNzYWdlU2VydmljZSxcclxuICAgIHByb3RlY3RlZCBmb3JtR3JvdXBIZWxwZXI6IEZvcm1Hcm91cEhlbHBlcixcclxuICApIHtcclxuICAgIHN1cGVyKHZhbGlkYXRpb25NZXNzYWdlU2VydmljZSwgZm9ybUdyb3VwSGVscGVyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUZpbGVUeXBlQWNjZXB0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgIC8vIFdhdGNoIGZvciBuYW1lIHRvIGNoYW5nZSwgaWYgdGhlIHZhbHVlIGlzIGNsZWFyZWQgd2Ugd2lsbCBjbGVhciB0aGUgb3RoZXJcclxuICAgIC8vIHN1cHBvcnRpbmcgbW9kZWwgcHJvcGVydGllcy4gVGhlIG5hbWUgY2FuIGJlIGNsZWFyZWQgYnkgdGhlIHVzZXIgbWFudWFsbHkgb3IgdmlhXHJcbiAgICAvLyB0aGUgY2xlYXIgYnV0dG9uXHJcbiAgICB0aGlzLmZvcm1Nb2RlbD8uZ2V0KCduYW1lJyk/LnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpXHJcbiAgICApLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICB0aGlzLmZvcm1Nb2RlbC5wYXRjaFZhbHVlKHtcclxuICAgICAgICAgIGZpbGVzOiBudWxsLFxyXG4gICAgICAgICAgbmFtZXM6IG51bGwsXHJcbiAgICAgICAgICBiYXNlNjRGaWxlU3RyaW5nOiBudWxsLFxyXG4gICAgICAgICAgdXBsb2FkUmVzdWx0OiBudWxsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gKiBOZXcgZmlsZUNoYW5nZSBtZXRob2RcclxuICBwdWJsaWMgYXN5bmMgZmlsZUNoYW5nZShmaWxlczogRmlsZUxpc3QpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHByb21pc2VzID0gQXJyYXkuZnJvbShmaWxlcykubWFwKChmaWxlKSA9PiBuZXcgUHJvbWlzZSAoKHJlc29sdmUpID0+IHtcclxuICAgICAgaWYgKGZpbGUpIHtcclxuICAgICAgICBjb25zdCByZWFkZXI6IEZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAgICAgICByZWFkZXIub25sb2FkZW5kID0gYXN5bmMgZSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBiYXNlNjRGaWxlU3RyaW5nOiBzdHJpbmcgfCB1bmRlZmluZWQgPSByZWFkZXI/LnJlc3VsdD8udG9TdHJpbmcoKS5zcGxpdChcIixcIilbMV07XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NGaWxlKGZpbGUsIGJhc2U2NEZpbGVTdHJpbmcpO1xyXG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0Jhc2U2NEZpbGVPdXRwdXQoKSkge1xyXG4gICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc29sdmUodGhpcy5wcm9jZXNzRmlsZShmaWxlKSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG5cclxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcclxuXHJcbiAgICAvLyBDbGVhciB0aGUgZmlsZSBpbnB1dHMgdmFsdWUsIHRoaXMgd2lsbCBhbGxvdyB0aGUgdXNlciB0byBwaWNrIHRoZSBzYW1lIGZpbGVuYW1lcyBhZ2FpblxyXG4gICAgLy8gYW5kIGNhdXNlIGZpbGVDaGFuZ2UgdG8gcmUtdHJpZ2dlci5cclxuICAgIGlmICh0aGlzLmZpbGVJbnB1dCkge1xyXG4gICAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAqIE9sZCBNZXRob2RcclxuICAvLyBwdWJsaWMgYXN5bmMgZmlsZUNoYW5nZShmaWxlczogRmlsZUxpc3QpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAvLyAgIGxldCBmaWxlID0gZmlsZXMuaXRlbSgwKTtcclxuXHJcbiAgLy8gICAvLyBJZiB0aGVyZSBpcyBhIGZpbGUgc2VsZWN0ZWQgYW5kIHRoZW4gb3BlbmVkIGFnYWluIGFuZCBjbGljayBjYW5jZWwgeW91IGdldCBudWxsIHNvIGRvbid0IHRyeSBhbmQgc2V0IGFueXRoaW5nXHJcbiAgLy8gICBpZiAoZmlsZSkge1xyXG4gIC8vICAgICBsZXQgcmVhZGVyOiBGaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuXHJcbiAgLy8gICAgIHJlYWRlci5vbmxvYWRlbmQgPSBhc3luYyBlID0+IHtcclxuICAvLyAgICAgICBsZXQgYmFzZTY0RmlsZVN0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkID0gcmVhZGVyPy5yZXN1bHQ/LnRvU3RyaW5nKCkuc3BsaXQoXCIsXCIpWzFdO1xyXG4gIC8vICAgICAgIHRoaXMucHJvY2Vzc0ZpbGUoZmlsZSEsIGJhc2U2NEZpbGVTdHJpbmcpO1xyXG4gIC8vICAgICB9O1xyXG5cclxuICAvLyAgICAgaWYgKHRoaXMuaXNCYXNlNjRGaWxlT3V0cHV0KCkpIHtcclxuICAvLyAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAvLyAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NGaWxlKGZpbGUhKTtcclxuICAvLyAgICAgfVxyXG5cclxuICAvLyAgICAgLy8gQ2xlYXIgdGhlIGZpbGUgaW5wdXRzIHZhbHVlLCB0aGlzIHdpbGwgYWxsb3cgdGhlIHVzZXIgdG8gcGljayB0aGUgc2FtZSBmaWxlbmFtZSBhbmQgY2F1c2VcclxuICAvLyAgICAgLy8gdGhlIGZpbGVDaGFuZ2UgdG8gdHJpZ2dlci5cclxuICAvLyAgICAgaWYgKHRoaXMuZmlsZUlucHV0KSB7XHJcbiAgLy8gICAgICAgdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVja3MgdGhlIGZpbGUgdHlwZSBhbmQgdXBkYXRlcyB0aGUgZmlsZSB0eXBlIGFjY2VwdCBwcm9wZXJ0eS4gVGhpcyBpcyB3aGF0IGRldGVybWluZXMgdGhlIGZpbGVcclxuICAgKiB0eXBlIGNob2ljZXMgdGhhdCB0aGUgdXNlciB3aWxsIGJlIGxpbWl0ZWQgdG8gaW4gdGhlIGZpbGUgYnJvd3NlIGRpYWxvZ1xyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlRmlsZVR5cGVBY2NlcHQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5maWxlVHlwZSkge1xyXG4gICAgICBpZiAodGhpcy5maWxlVHlwZSAhPT0gXCJjdXN0b21cIikge1xyXG4gICAgICAgIHRoaXMuZmlsZVR5cGVBY2NlcHQgPSBGaWxlVHlwZUV4dGVuc2lvbnNbdGhpcy5maWxlVHlwZV0uam9pbihcIixcIik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VzdG9tRXh0ZW5zaW9ucykge1xyXG4gICAgICAgICAgdGhpcy5maWxlVHlwZUFjY2VwdCA9IHRoaXMuY3VzdG9tRXh0ZW5zaW9ucy5qb2luKFwiLFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRha2UgYSBmaWxlIHRoYXQgd2FzIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIGFuZCBwcm9jZXNzL3BhdGNoIG91ciBmb3JtIG1vZGVsXHJcbiAgICogSWYgdGhlIGhvc3QgY29tcG9uZW50IHJlcXVpcmVzIGFuIGFjdGlvbiB0byBvY2N1ciB3aXRoIHRoZSBmaWxlIHByaW9yIHRvIHRoZSBwYXRjaCBpdCB3aWxsIGNhbGxcclxuICAgKiBhbmQgd2FpdCBmb3IgaXQgdG8gcmV0dXJuLlxyXG4gICAqIEBwYXJhbSBmaWxlIFxyXG4gICAqIEBwYXJhbSBiYXNlNjRGaWxlU3RyaW5nIE9wdGlvbmFsOiBXaWxsIGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBpZiB0aGUgZmlsZU91dHB1dCBpcyBzZXQgdG8gYmFzZTY0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzRmlsZShmaWxlOiBGaWxlLCBiYXNlNjRGaWxlU3RyaW5nPzogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5vbkZpbGVTZWxlY3RlZCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLm9uRmlsZVNlbGVjdGVkKGZpbGUpO1xyXG4gICAgICAgIHRoaXMucGF0Y2hGaWxlUmVzdWx0KGZpbGUsIGJhc2U2NEZpbGVTdHJpbmcsIHJlc3VsdCk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAvLyBCdW1tZXIsIHdlJ3JlIG5vdCBnb2luZyB0byBkbyBhbnl0aGluZyBhYm91dCBpdCB0aG91Z2guIFxyXG4gICAgICAgIC8vIFdlIGFyZSBub3QgcGF0Y2hpbmcgYW55IG9mIHRoZSByZXN1bHQgc28gYW55IGV4aXN0aW5nIGluZm9ybWF0aW9uIHJlbWFpbnNcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wYXRjaEZpbGVSZXN1bHQoZmlsZSwgYmFzZTY0RmlsZVN0cmluZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCYXNlZCBvbiB0aGUgZmlsZU91dHB1dCByZXR1cm4gd2hldGhlciB0aGlzIGNvbXBvbmVudCBpcyBleHBlY3RlZCB0byBkZWxpdmVyIGEgYmFzZTY0IG91dHB1dFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgaXNCYXNlNjRGaWxlT3V0cHV0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsZU91dHB1dCA9PT0gJ2Jhc2U2NCc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGVuIHRoZSBmaWxlIHdhcyBzZWxlY3RlZCBhbmQgcHJvY2Vzc2VkIHBhdGNoIHRoZSBmaWxlIGluZm9ybWF0aW9uIHRoYXQgdGhlIGhvc3RpbmcgZm9ybSB3aWxsXHJcbiAgICogYmUgbG9va2luZyBmb3IuIFxyXG4gICAqIEBwYXJhbSBmaWxlIFxyXG4gICAqIEBwYXJhbSBiYXNlNjRGaWxlU3RyaW5nIFxyXG4gICAqIEBwYXJhbSBvbkZpbGVTZWxlY3RlZFJlc3VsdCBcclxuICAgKi9cclxuICAvLyAqIE9sZCBtZXRob2RcclxuICBwcml2YXRlIHBhdGNoRmlsZVJlc3VsdChmaWxlOiBGaWxlIHwgbnVsbCwgYmFzZTY0RmlsZVN0cmluZz86IHN0cmluZywgb25GaWxlU2VsZWN0ZWRSZXN1bHQ/OiBhbnkpOiB2b2lkIHtcclxuICAgIC8vIEdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiBmaWxlcyBmcm9tIGZvcm1Nb2RlbFxyXG4gICAgbGV0IGZpbGVzID0gdGhpcy5mb3JtTW9kZWw/LmdldCgnZmlsZXMnKT8udmFsdWUgfHwgW107XHJcbiAgICBsZXQgbmFtZXMgPSB0aGlzLmZvcm1Nb2RlbD8uZ2V0KCduYW1lcycpPy52YWx1ZSB8fCBbXTtcclxuXHJcbiAgICAvLyBJZiB0aGUgZmlsZSBpcyBub3QgbnVsbCwgYXBwZW5kIGl0IHRvIHRoZSBmaWxlcyBhcnJheVxyXG4gICAgaWYgKGZpbGUpIHtcclxuICAgICAgZmlsZXMgPSBbLi4uZmlsZXMsIGZpbGVdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHRoZSBmaWxlIG5hbWUgaXMgbm90IG51bGwsIGFwcGVuZCBpdCB0byB0aGUgbmFtZXMgYXJyYXlcclxuICAgIGlmIChmaWxlPy5uYW1lKSB7XHJcbiAgICAgIG5hbWVzID0gWy4uLm5hbWVzLCBmaWxlLm5hbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZm9ybU1vZGVsPy5wYXRjaFZhbHVlKHtcclxuICAgICAgZmlsZXM6IGZpbGVzLFxyXG4gICAgICBuYW1lczogbmFtZXMsXHJcbiAgICAgIGJhc2U2NEZpbGVTdHJpbmc6IGJhc2U2NEZpbGVTdHJpbmcgPz8gbnVsbFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKG9uRmlsZVNlbGVjdGVkUmVzdWx0KSB7XHJcbiAgICAgIHRoaXMuZm9ybU1vZGVsLnBhdGNoVmFsdWUoeyB1cGxvYWRSZXN1bHQ6IG9uRmlsZVNlbGVjdGVkUmVzdWx0IH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb3JtTW9kZWwucGF0Y2hWYWx1ZSh7IHVwbG9hZFJlc3VsdDogbnVsbCB9KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvLyAqIE5ldyBtZXRob2RcclxuICAvLyBwcml2YXRlIHBhdGNoRmlsZVJlc3VsdChmaWxlczogRmlsZVtdIHwgbnVsbCwgYmFzZTY0RmlsZVN0cmluZz86IHN0cmluZ1tdLCBvbkZpbGVTZWxlY3RlZFJlc3VsdD86IGFueSk6IHZvaWQge1xyXG4gIC8vICAgY29uc3QgZmlsZUFycmF5ID0gZmlsZXMgfHwgW107XHJcbiAgLy8gICBjb25zdCBuYW1lQXJyYXkgPSBmaWxlQXJyYXkubWFwKGZpbGUgPT4gZmlsZS5uYW1lKTtcclxuICAvLyAgIGNvbnN0IGJhc2U2NEFycmF5ID0gYmFzZTY0RmlsZVN0cmluZyB8fCBbXTtcclxuXHJcbiAgLy8gICB0aGlzLmZvcm1Nb2RlbD8ucGF0Y2hWYWx1ZSh7XHJcbiAgLy8gICAgIGZpbGVzOiBmaWxlQXJyYXksXHJcbiAgLy8gICAgIG5hbWU6IG5hbWVBcnJheSxcclxuICAvLyAgICAgYmFzZTY0RmlsZVN0cmluZzogYmFzZTY0QXJyYXlcclxuICAvLyAgIH0pO1xyXG4gICAgXHJcbiAgLy8gICBpZihvbkZpbGVTZWxlY3RlZFJlc3VsdCkge1xyXG4gIC8vICAgICB0aGlzLmZvcm1Nb2RlbC5wYXRjaFZhbHVlKHsgdXBsb2FkUmVzdWx0OiBvbkZpbGVTZWxlY3RlZFJlc3VsdCB9KTtcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIHRoaXMuZm9ybU1vZGVsLnBhdGNoVmFsdWUoeyB1cGxvYWRSZXN1bHQ6IG51bGwgfSk7XHJcbiAgLy8gICB9O1xyXG4gIC8vIH1cclxufVxyXG4iLCI8ZWMtZm9ybS1ncm91cCBbbGFiZWxdPVwibGFiZWxcIlxyXG4gICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1Nb2RlbFwiXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwibWItMFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggY29udHJvbC1ncm91cFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWdyb3cgcG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgICAgPGlucHV0ICNmaWxlSW5wdXRcclxuICAgICAgICAgICAgIGlkPVwie3tpbnB1dElkfX1faW5wdXRcIlxyXG4gICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxyXG4gICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXHJcbiAgICAgICAgICAgICBbYXR0ci5hY2NlcHRdPVwiZmlsZVR5cGVBY2NlcHRcIlxyXG4gICAgICAgICAgICAgKGNoYW5nZSk9XCJmaWxlQ2hhbmdlKCRldmVudC50YXJnZXQuZmlsZXMpXCJcclxuICAgICAgICAgICAgIFtjbGFzcy5oYXMtdmFsdWVdPVwiZm9ybU1vZGVsPy5nZXQoJ25hbWUnKT8udmFsdWVcIlxyXG4gICAgICAgICAgICAgbXVsdGlwbGU+XHJcbiAgICAgIDxlYy1mb3JtLWNvbnRyb2wgKm5nSWY9XCJkaXNwbGF5VHlwZSA9PT0gJ2ZpbGUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7aW5wdXRJZH19X2Zvcm1Db250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW3BlbmRpbmddPVwicGVuZGluZ1wiPlxyXG4gICAgICAgIDxpbnB1dCBpZD1cInt7aW5wdXRJZH19X25hbWVcIlxyXG4gICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybU1vZGVsPy5nZXQoJ25hbWUnKVwiXHJcbiAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIi0xXCI+XHJcbiAgICAgIDwvZWMtZm9ybS1jb250cm9sPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZWMtYnV0dG9uICpuZ0lmPVwiZGlzcGxheVR5cGUgPT09ICdmaWxlJ1wiXHJcbiAgICAgICAgICAgICAgICNicm93c2VCdG5cclxuICAgICAgICAgICAgICAgaWQ9XCJ7e2lucHV0SWR9fV9icm93c2VCdG5cIlxyXG4gICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJmaWxlSW5wdXQuY2xpY2soKVwiXHJcbiAgICAgICAgICAgICAgIHR5cGU9XCJzZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxyXG4gICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybU1vZGVsPy5nZXQoJ25hbWUnKT8uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICBsYWJlbD1cIkJyb3dzZVwiXHJcbiAgICAgICAgICAgICAgIFthdXRvZm9jdXNdPVwiYXV0b2ZvY3VzXCI+XHJcbiAgICA8L2VjLWJ1dHRvbj5cclxuICA8L2Rpdj5cclxuICA8ZWMtYnV0dG9uICpuZ0lmPVwiZGlzcGxheVR5cGUgPT09ICdidXR0b24nXCJcclxuICAgICAgICAgICAgICNzZWxlY3RaaXBGaWxlc0J0blxyXG4gICAgICAgICAgICAgaWQ9XCJ7e2lucHV0SWR9fV9icm93c2VCdG5cIlxyXG4gICAgICAgICAgICAgW3BlbmRpbmddPVwicGVuZGluZ1wiXHJcbiAgICAgICAgICAgICB0eXBlPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICBbbGFiZWxdPVwiYnV0dG9uTGFiZWwgPz8gJ0Jyb3dzZV9UQycgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgKGNsaWNrZWQpPVwiZmlsZUlucHV0LmNsaWNrKClcIlxyXG4gICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cclxuICA8L2VjLWJ1dHRvbj5cclxuPC9lYy1mb3JtLWdyb3VwPiJdfQ==
|
@@ -3780,8 +3780,8 @@ class FileUploadComponent extends FormControlBase {
|
|
3780
3780
|
// static class to create the form group from a parent component
|
3781
3781
|
static getFormModel(validators, disabled = false) {
|
3782
3782
|
let formGroup = new UntypedFormGroup({
|
3783
|
-
|
3784
|
-
|
3783
|
+
files: new UntypedFormControl({ value: null, disabled: disabled }, validators),
|
3784
|
+
names: new UntypedFormControl({ value: null, disabled: disabled }, validators),
|
3785
3785
|
base64FileString: new UntypedFormControl(null),
|
3786
3786
|
uploadResult: new UntypedFormControl(null)
|
3787
3787
|
});
|
@@ -3802,6 +3802,12 @@ class FileUploadComponent extends FormControlBase {
|
|
3802
3802
|
* File output, determines which properties are supplied on the formModel
|
3803
3803
|
*/
|
3804
3804
|
this.fileOutput = 'base64';
|
3805
|
+
/**
|
3806
|
+
* Optional display type that controls whether the file input textbox is displayed or
|
3807
|
+
* simply a button the user clicks to launch the OS file storage dialog.
|
3808
|
+
* Default: file
|
3809
|
+
*/
|
3810
|
+
this.displayType = 'file';
|
3805
3811
|
}
|
3806
3812
|
ngOnChanges(changes) {
|
3807
3813
|
super.ngOnChanges(changes);
|
@@ -3816,38 +3822,65 @@ class FileUploadComponent extends FormControlBase {
|
|
3816
3822
|
(_b = (_a = this.formModel) === null || _a === void 0 ? void 0 : _a.get('name')) === null || _b === void 0 ? void 0 : _b.valueChanges.pipe(takeUntil(this.componentDestroyed)).subscribe(value => {
|
3817
3823
|
if (!value) {
|
3818
3824
|
this.formModel.patchValue({
|
3819
|
-
|
3825
|
+
files: null,
|
3826
|
+
names: null,
|
3820
3827
|
base64FileString: null,
|
3821
3828
|
uploadResult: null
|
3822
3829
|
});
|
3823
3830
|
}
|
3824
3831
|
});
|
3825
3832
|
}
|
3833
|
+
// * New fileChange method
|
3826
3834
|
fileChange(files) {
|
3827
3835
|
return __awaiter(this, void 0, void 0, function* () {
|
3828
|
-
|
3829
|
-
|
3830
|
-
|
3831
|
-
|
3832
|
-
|
3833
|
-
|
3834
|
-
|
3835
|
-
|
3836
|
-
|
3837
|
-
|
3838
|
-
|
3839
|
-
|
3840
|
-
|
3841
|
-
|
3842
|
-
|
3843
|
-
|
3844
|
-
// the fileChange to trigger.
|
3845
|
-
if (this.fileInput) {
|
3846
|
-
this.fileInput.nativeElement.value = '';
|
3836
|
+
const promises = Array.from(files).map((file) => new Promise((resolve) => {
|
3837
|
+
if (file) {
|
3838
|
+
const reader = new FileReader();
|
3839
|
+
reader.onloadend = (e) => __awaiter(this, void 0, void 0, function* () {
|
3840
|
+
var _a;
|
3841
|
+
const base64FileString = (_a = reader === null || reader === void 0 ? void 0 : reader.result) === null || _a === void 0 ? void 0 : _a.toString().split(",")[1];
|
3842
|
+
yield this.processFile(file, base64FileString);
|
3843
|
+
resolve(null);
|
3844
|
+
});
|
3845
|
+
if (this.isBase64FileOutput()) {
|
3846
|
+
reader.readAsDataURL(file);
|
3847
|
+
}
|
3848
|
+
else {
|
3849
|
+
resolve(this.processFile(file));
|
3850
|
+
}
|
3851
|
+
;
|
3847
3852
|
}
|
3853
|
+
}));
|
3854
|
+
yield Promise.all(promises);
|
3855
|
+
// Clear the file inputs value, this will allow the user to pick the same filenames again
|
3856
|
+
// and cause fileChange to re-trigger.
|
3857
|
+
if (this.fileInput) {
|
3858
|
+
this.fileInput.nativeElement.value = '';
|
3848
3859
|
}
|
3849
3860
|
});
|
3850
3861
|
}
|
3862
|
+
// * Old Method
|
3863
|
+
// public async fileChange(files: FileList): Promise<void> {
|
3864
|
+
// let file = files.item(0);
|
3865
|
+
// // If there is a file selected and then opened again and click cancel you get null so don't try and set anything
|
3866
|
+
// if (file) {
|
3867
|
+
// let reader: FileReader = new FileReader();
|
3868
|
+
// reader.onloadend = async e => {
|
3869
|
+
// let base64FileString: string | undefined = reader?.result?.toString().split(",")[1];
|
3870
|
+
// this.processFile(file!, base64FileString);
|
3871
|
+
// };
|
3872
|
+
// if (this.isBase64FileOutput()) {
|
3873
|
+
// reader.readAsDataURL(file);
|
3874
|
+
// } else {
|
3875
|
+
// await this.processFile(file!);
|
3876
|
+
// }
|
3877
|
+
// // Clear the file inputs value, this will allow the user to pick the same filename and cause
|
3878
|
+
// // the fileChange to trigger.
|
3879
|
+
// if (this.fileInput) {
|
3880
|
+
// this.fileInput.nativeElement.value = '';
|
3881
|
+
// }
|
3882
|
+
// }
|
3883
|
+
// }
|
3851
3884
|
/**
|
3852
3885
|
* Checks the file type and updates the file type accept property. This is what determines the file
|
3853
3886
|
* type choices that the user will be limited to in the file browse dialog
|
@@ -3902,11 +3935,23 @@ class FileUploadComponent extends FormControlBase {
|
|
3902
3935
|
* @param base64FileString
|
3903
3936
|
* @param onFileSelectedResult
|
3904
3937
|
*/
|
3938
|
+
// * Old method
|
3905
3939
|
patchFileResult(file, base64FileString, onFileSelectedResult) {
|
3906
|
-
var _a;
|
3907
|
-
|
3908
|
-
|
3909
|
-
|
3940
|
+
var _a, _b, _c, _d, _e;
|
3941
|
+
// Get the current value of files from formModel
|
3942
|
+
let files = ((_b = (_a = this.formModel) === null || _a === void 0 ? void 0 : _a.get('files')) === null || _b === void 0 ? void 0 : _b.value) || [];
|
3943
|
+
let names = ((_d = (_c = this.formModel) === null || _c === void 0 ? void 0 : _c.get('names')) === null || _d === void 0 ? void 0 : _d.value) || [];
|
3944
|
+
// If the file is not null, append it to the files array
|
3945
|
+
if (file) {
|
3946
|
+
files = [...files, file];
|
3947
|
+
}
|
3948
|
+
// If the file name is not null, append it to the names array
|
3949
|
+
if (file === null || file === void 0 ? void 0 : file.name) {
|
3950
|
+
names = [...names, file.name];
|
3951
|
+
}
|
3952
|
+
(_e = this.formModel) === null || _e === void 0 ? void 0 : _e.patchValue({
|
3953
|
+
files: files,
|
3954
|
+
names: names,
|
3910
3955
|
base64FileString: base64FileString !== null && base64FileString !== void 0 ? base64FileString : null
|
3911
3956
|
});
|
3912
3957
|
if (onFileSelectedResult) {
|
@@ -3918,10 +3963,10 @@ class FileUploadComponent extends FormControlBase {
|
|
3918
3963
|
}
|
3919
3964
|
}
|
3920
3965
|
FileUploadComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FileUploadComponent, deps: [{ token: ValidationMessageService }, { token: FormGroupHelper }], target: i0.ɵɵFactoryTarget.Component });
|
3921
|
-
FileUploadComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: FileUploadComponent, selector: "ec-file-upload", inputs: { placeholder: "placeholder", fileType: "fileType", fileOutput: "fileOutput", customExtensions: "customExtensions", onFileSelected: "onFileSelected" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, read: ElementRef, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ec-form-group [label]=\"label\"\r\n [formGroup]=\"formModel\"\r\n class=\"mb-0\">\r\n <div class=\"d-flex control-group\">\r\n <div class=\"d-flex flex-grow position-relative\">\r\n <input #fileInput\r\n id=\"{{inputId}}_input\"\r\n type=\"file\"\r\n tabindex=\"-1\"\r\n [attr.accept]=\"fileTypeAccept\"\r\n (
|
3966
|
+
FileUploadComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: FileUploadComponent, selector: "ec-file-upload", inputs: { placeholder: "placeholder", fileType: "fileType", fileOutput: "fileOutput", customExtensions: "customExtensions", onFileSelected: "onFileSelected", displayType: "displayType", buttonLabel: "buttonLabel" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, read: ElementRef, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ec-form-group [label]=\"label\"\r\n [formGroup]=\"formModel\"\r\n class=\"mb-0\">\r\n <div class=\"d-flex control-group\">\r\n <div class=\"d-flex flex-grow position-relative\">\r\n <input #fileInput\r\n id=\"{{inputId}}_input\"\r\n type=\"file\"\r\n tabindex=\"-1\"\r\n [attr.accept]=\"fileTypeAccept\"\r\n (change)=\"fileChange($event.target.files)\"\r\n [class.has-value]=\"formModel?.get('name')?.value\"\r\n multiple>\r\n <ec-form-control *ngIf=\"displayType === 'file'\"\r\n id=\"{{inputId}}_formControl\"\r\n class=\"text-truncate\"\r\n [required]=\"required\"\r\n [pending]=\"pending\">\r\n <input id=\"{{inputId}}_name\"\r\n [formControl]=\"formModel?.get('name')\"\r\n type=\"text\"\r\n [placeholder]=\"placeholder\"\r\n [tabindex]=\"-1\">\r\n </ec-form-control>\r\n </div>\r\n <ec-button *ngIf=\"displayType === 'file'\"\r\n #browseBtn\r\n id=\"{{inputId}}_browseBtn\"\r\n (clicked)=\"fileInput.click()\"\r\n type=\"secondary\"\r\n [tabindex]=\"tabindex\"\r\n [disabled]=\"formModel?.get('name')?.disabled\"\r\n label=\"Browse\"\r\n [autofocus]=\"autofocus\">\r\n </ec-button>\r\n </div>\r\n <ec-button *ngIf=\"displayType === 'button'\"\r\n #selectZipFilesBtn\r\n id=\"{{inputId}}_browseBtn\"\r\n [pending]=\"pending\"\r\n type=\"primary\"\r\n [label]=\"buttonLabel ?? 'Browse_TC' | translate\"\r\n (clicked)=\"fileInput.click()\"\r\n style=\"width: 100%;\">\r\n </ec-button>\r\n</ec-form-group>", styles: [":host{display:block;margin-bottom:1rem}ec-form-control{margin-bottom:0}ec-form-control ::ng-deep>.ec-focus-ring{display:none!important}input[type=file]{opacity:0;display:block;position:absolute;top:0;left:0;width:100%;height:100%;z-index:1;cursor:pointer}input[type=file].has-value{width:calc(100% - 1.5rem)}ec-button{--ec-button-border-color-secondary: var(--ec-form-control-border-color);--ec-button-color-icon-secondary: var(--ec-color-icon)}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: FormControlComponent, selector: "ec-form-control", inputs: ["id", "icon", "actionIcon", "showClear", "pending", "required", "readonly"], outputs: ["actionClicked"] }, { kind: "component", type: FormGroupComponent, selector: "ec-form-group", inputs: ["id", "label", "formGroup", "labelPosition", "overrideValidationError", "hideValidationMessage"] }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
|
3922
3967
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FileUploadComponent, decorators: [{
|
3923
3968
|
type: Component,
|
3924
|
-
args: [{ selector: "ec-file-upload", template: "<ec-form-group [label]=\"label\"\r\n [formGroup]=\"formModel\"\r\n class=\"mb-0\">\r\n <div class=\"d-flex control-group\">\r\n <div class=\"d-flex flex-grow position-relative\">\r\n <input #fileInput\r\n id=\"{{inputId}}_input\"\r\n type=\"file\"\r\n tabindex=\"-1\"\r\n [attr.accept]=\"fileTypeAccept\"\r\n (
|
3969
|
+
args: [{ selector: "ec-file-upload", template: "<ec-form-group [label]=\"label\"\r\n [formGroup]=\"formModel\"\r\n class=\"mb-0\">\r\n <div class=\"d-flex control-group\">\r\n <div class=\"d-flex flex-grow position-relative\">\r\n <input #fileInput\r\n id=\"{{inputId}}_input\"\r\n type=\"file\"\r\n tabindex=\"-1\"\r\n [attr.accept]=\"fileTypeAccept\"\r\n (change)=\"fileChange($event.target.files)\"\r\n [class.has-value]=\"formModel?.get('name')?.value\"\r\n multiple>\r\n <ec-form-control *ngIf=\"displayType === 'file'\"\r\n id=\"{{inputId}}_formControl\"\r\n class=\"text-truncate\"\r\n [required]=\"required\"\r\n [pending]=\"pending\">\r\n <input id=\"{{inputId}}_name\"\r\n [formControl]=\"formModel?.get('name')\"\r\n type=\"text\"\r\n [placeholder]=\"placeholder\"\r\n [tabindex]=\"-1\">\r\n </ec-form-control>\r\n </div>\r\n <ec-button *ngIf=\"displayType === 'file'\"\r\n #browseBtn\r\n id=\"{{inputId}}_browseBtn\"\r\n (clicked)=\"fileInput.click()\"\r\n type=\"secondary\"\r\n [tabindex]=\"tabindex\"\r\n [disabled]=\"formModel?.get('name')?.disabled\"\r\n label=\"Browse\"\r\n [autofocus]=\"autofocus\">\r\n </ec-button>\r\n </div>\r\n <ec-button *ngIf=\"displayType === 'button'\"\r\n #selectZipFilesBtn\r\n id=\"{{inputId}}_browseBtn\"\r\n [pending]=\"pending\"\r\n type=\"primary\"\r\n [label]=\"buttonLabel ?? 'Browse_TC' | translate\"\r\n (clicked)=\"fileInput.click()\"\r\n style=\"width: 100%;\">\r\n </ec-button>\r\n</ec-form-group>", styles: [":host{display:block;margin-bottom:1rem}ec-form-control{margin-bottom:0}ec-form-control ::ng-deep>.ec-focus-ring{display:none!important}input[type=file]{opacity:0;display:block;position:absolute;top:0;left:0;width:100%;height:100%;z-index:1;cursor:pointer}input[type=file].has-value{width:calc(100% - 1.5rem)}ec-button{--ec-button-border-color-secondary: var(--ec-form-control-border-color);--ec-button-color-icon-secondary: var(--ec-color-icon)}\n"] }]
|
3925
3970
|
}], ctorParameters: function () { return [{ type: ValidationMessageService }, { type: FormGroupHelper }]; }, propDecorators: { placeholder: [{
|
3926
3971
|
type: Input
|
3927
3972
|
}], fileType: [{
|
@@ -3932,6 +3977,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
3932
3977
|
type: Input
|
3933
3978
|
}], onFileSelected: [{
|
3934
3979
|
type: Input
|
3980
|
+
}], displayType: [{
|
3981
|
+
type: Input
|
3982
|
+
}], buttonLabel: [{
|
3983
|
+
type: Input
|
3935
3984
|
}], fileInput: [{
|
3936
3985
|
type: ViewChild,
|
3937
3986
|
args: ["fileInput", { read: ElementRef, static: true }]
|