ng-tailwind 6.3.0 → 6.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/components/ngt-multi-select/ngt-multi-select.component.d.ts +2 -1
  2. package/fesm2022/ng-tailwind.mjs +361 -346
  3. package/fesm2022/ng-tailwind.mjs.map +1 -1
  4. package/package.json +1 -3
  5. package/esm2022/animations/ngt-angular-animations.mjs +0 -34
  6. package/esm2022/base/ngt-base-ng-model.mjs +0 -90
  7. package/esm2022/components/ngt-action/ngt-action.component.mjs +0 -96
  8. package/esm2022/components/ngt-action/ngt-action.module.mjs +0 -28
  9. package/esm2022/components/ngt-button/ngt-button.component.mjs +0 -142
  10. package/esm2022/components/ngt-button/ngt-button.module.mjs +0 -28
  11. package/esm2022/components/ngt-checkbox/ngt-checkbox.component.mjs +0 -192
  12. package/esm2022/components/ngt-checkbox/ngt-checkbox.module.mjs +0 -28
  13. package/esm2022/components/ngt-content/ngt-content.component.mjs +0 -32
  14. package/esm2022/components/ngt-content/ngt-content.module.mjs +0 -20
  15. package/esm2022/components/ngt-context-menu/ngt-context-menu.component.mjs +0 -25
  16. package/esm2022/components/ngt-context-menu/ngt-context-menu.directive.mjs +0 -89
  17. package/esm2022/components/ngt-context-menu/ngt-context-menu.module.mjs +0 -33
  18. package/esm2022/components/ngt-datatable/ngt-datatable.component.mjs +0 -472
  19. package/esm2022/components/ngt-datatable/ngt-datatable.module.mjs +0 -99
  20. package/esm2022/components/ngt-datatable/ngt-tbody/ngt-tbody.component.mjs +0 -57
  21. package/esm2022/components/ngt-datatable/ngt-td/ngt-td.component.mjs +0 -62
  22. package/esm2022/components/ngt-datatable/ngt-td-check/ngt-td-check.component.mjs +0 -113
  23. package/esm2022/components/ngt-datatable/ngt-th/ngt-th.component.mjs +0 -228
  24. package/esm2022/components/ngt-datatable/ngt-th-check/ngt-th-check.component.mjs +0 -127
  25. package/esm2022/components/ngt-datatable/ngt-thead/ngt-thead.component.mjs +0 -55
  26. package/esm2022/components/ngt-datatable/ngt-tr/ngt-tr.component.mjs +0 -86
  27. package/esm2022/components/ngt-date/ngt-date.component.mjs +0 -435
  28. package/esm2022/components/ngt-date/ngt-date.module.mjs +0 -40
  29. package/esm2022/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.mjs +0 -19
  30. package/esm2022/components/ngt-dropdown/ngt-dropdown.component.mjs +0 -205
  31. package/esm2022/components/ngt-dropdown/ngt-dropdown.module.mjs +0 -21
  32. package/esm2022/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.mjs +0 -54
  33. package/esm2022/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.mjs +0 -66
  34. package/esm2022/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.mjs +0 -94
  35. package/esm2022/components/ngt-dropzone/ngt-dropzone.component.mjs +0 -496
  36. package/esm2022/components/ngt-dropzone/ngt-dropzone.meta.mjs +0 -24
  37. package/esm2022/components/ngt-dropzone/ngt-dropzone.module.mjs +0 -55
  38. package/esm2022/components/ngt-floating-button/ngt-floating-button.component.mjs +0 -119
  39. package/esm2022/components/ngt-floating-button/ngt-floating-button.module.mjs +0 -28
  40. package/esm2022/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.mjs +0 -22
  41. package/esm2022/components/ngt-form/ngt-form.component.mjs +0 -207
  42. package/esm2022/components/ngt-form/ngt-form.module.mjs +0 -29
  43. package/esm2022/components/ngt-header-nav/ngt-header-nav.component.mjs +0 -39
  44. package/esm2022/components/ngt-header-nav/ngt-header-nav.module.mjs +0 -20
  45. package/esm2022/components/ngt-helper/ngt-helper.component.mjs +0 -69
  46. package/esm2022/components/ngt-helper/ngt-helper.module.mjs +0 -28
  47. package/esm2022/components/ngt-input/ngt-input.component.mjs +0 -844
  48. package/esm2022/components/ngt-input/ngt-input.module.mjs +0 -47
  49. package/esm2022/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.mjs +0 -46
  50. package/esm2022/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.mjs +0 -33
  51. package/esm2022/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.mjs +0 -40
  52. package/esm2022/components/ngt-modal/ngt-modal.component.mjs +0 -122
  53. package/esm2022/components/ngt-modal/ngt-modal.module.mjs +0 -39
  54. package/esm2022/components/ngt-multi-select/ngt-multi-select.component.mjs +0 -503
  55. package/esm2022/components/ngt-multi-select/ngt-multi-select.module.mjs +0 -52
  56. package/esm2022/components/ngt-pagination/ngt-pagination.component.mjs +0 -162
  57. package/esm2022/components/ngt-pagination/ngt-pagination.module.mjs +0 -36
  58. package/esm2022/components/ngt-popover/ngt-popover-tooltip/ngt-popover-tooltip.component.mjs +0 -59
  59. package/esm2022/components/ngt-popover/ngt-popover.component.mjs +0 -85
  60. package/esm2022/components/ngt-popover/ngt-popover.directive.mjs +0 -130
  61. package/esm2022/components/ngt-popover/ngt-popover.module.mjs +0 -36
  62. package/esm2022/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.mjs +0 -34
  63. package/esm2022/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.mjs +0 -35
  64. package/esm2022/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.mjs +0 -57
  65. package/esm2022/components/ngt-portlet/ngt-portlet.component.mjs +0 -74
  66. package/esm2022/components/ngt-portlet/ngt-portlet.module.mjs +0 -47
  67. package/esm2022/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.mjs +0 -19
  68. package/esm2022/components/ngt-radio-button/ngt-radio-button.component.mjs +0 -153
  69. package/esm2022/components/ngt-radio-button/ngt-radio-button.module.mjs +0 -29
  70. package/esm2022/components/ngt-section/ngt-section.component.mjs +0 -151
  71. package/esm2022/components/ngt-section/ngt-section.module.mjs +0 -32
  72. package/esm2022/components/ngt-select/ngt-select.component.mjs +0 -670
  73. package/esm2022/components/ngt-select/ngt-select.directive.mjs +0 -36
  74. package/esm2022/components/ngt-select/ngt-select.module.mjs +0 -65
  75. package/esm2022/components/ngt-shining/ngt-shining.component.mjs +0 -40
  76. package/esm2022/components/ngt-shining/ngt-shining.module.mjs +0 -20
  77. package/esm2022/components/ngt-sidenav/ngt-sidenav.component.mjs +0 -132
  78. package/esm2022/components/ngt-sidenav/ngt-sidenav.module.mjs +0 -20
  79. package/esm2022/components/ngt-slider/ngt-slider.component.mjs +0 -100
  80. package/esm2022/components/ngt-slider/ngt-slider.module.mjs +0 -24
  81. package/esm2022/components/ngt-svg/ngt-svg.component.mjs +0 -53
  82. package/esm2022/components/ngt-svg/ngt-svg.module.mjs +0 -24
  83. package/esm2022/components/ngt-tag/ngt-tag.component.mjs +0 -37
  84. package/esm2022/components/ngt-tag/ngt-tag.module.mjs +0 -24
  85. package/esm2022/components/ngt-textarea/ngt-textarea.component.mjs +0 -238
  86. package/esm2022/components/ngt-textarea/ngt-textarea.module.mjs +0 -43
  87. package/esm2022/components/ngt-validation/ngt-validation.component.mjs +0 -26
  88. package/esm2022/components/ngt-validation/ngt-validation.module.mjs +0 -20
  89. package/esm2022/directives/ngt-stylizable/ngt-stylizable.directive.mjs +0 -299
  90. package/esm2022/directives/ngt-stylizable/ngt-stylizable.module.mjs +0 -20
  91. package/esm2022/enums/size.enum.mjs +0 -11
  92. package/esm2022/helpers/enum/enum.mjs +0 -7
  93. package/esm2022/helpers/form/form.mjs +0 -14
  94. package/esm2022/helpers/input-mask/input-mask.helper.mjs +0 -26
  95. package/esm2022/helpers/promise/promise-helper.mjs +0 -4
  96. package/esm2022/helpers/routing/route.mjs +0 -11
  97. package/esm2022/helpers/uuid.mjs +0 -10
  98. package/esm2022/ng-tailwind.mjs +0 -5
  99. package/esm2022/public-api.mjs +0 -127
  100. package/esm2022/services/http/ngt-attachment-http.service.mjs +0 -3
  101. package/esm2022/services/http/ngt-http-form.service.mjs +0 -3
  102. package/esm2022/services/http/ngt-http-resource.service.mjs +0 -3
  103. package/esm2022/services/http/ngt-http-validation.service.mjs +0 -3
  104. package/esm2022/services/http/ngt-http.service.mjs +0 -3
  105. package/esm2022/services/http/ngt-translate.service.mjs +0 -3
  106. package/esm2022/services/ngt-stylizable/ngt-stylizable.service.mjs +0 -279
  107. package/esm2022/services/validation/ngt-ability-validation.service.mjs +0 -3
@@ -1,496 +0,0 @@
1
- import { Component, EventEmitter, Host, Input, Optional, Output, SkipSelf, ViewChild, ViewEncapsulation, } from '@angular/core';
2
- import { ControlContainer, NgForm, Validators } from '@angular/forms';
3
- import { NgxDropzoneComponent } from 'ngx-dropzone';
4
- import { forkJoin } from 'rxjs';
5
- import { map } from 'rxjs/operators';
6
- import Viewer from 'viewerjs';
7
- import { NgtBaseNgModel, NgtMakeProvider } from '../../base/ngt-base-ng-model';
8
- import { getEnumFromString } from '../../helpers/enum/enum';
9
- import { uuid } from '../../helpers/uuid';
10
- import { NgtStylizableService } from '../../services/ngt-stylizable/ngt-stylizable.service';
11
- import { NgtDropzoneFileViewerComponent } from './ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component';
12
- import { NgtDropzoneErrorType, NgtDropzonePreviewType } from './ngt-dropzone.meta';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "@angular/forms";
15
- import * as i2 from "../../services/http/ngt-attachment-http.service";
16
- import * as i3 from "../ngt-form/ngt-form.component";
17
- import * as i4 from "../ngt-section/ngt-section.component";
18
- import * as i5 from "../ngt-modal/ngt-modal.component";
19
- import * as i6 from "@angular/common";
20
- import * as i7 from "../ngt-validation/ngt-validation.component";
21
- import * as i8 from "ngx-dropzone";
22
- import * as i9 from "../ngt-helper/ngt-helper.component";
23
- import * as i10 from "./ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component";
24
- import * as i11 from "./ngt-dropzone-view/ngt-dropzone-view.component";
25
- import * as i12 from "./custom-dropzone-preview/custom-dropzone-preview.component";
26
- export class NgtDropzoneComponent extends NgtBaseNgModel {
27
- ;
28
- ;
29
- constructor(formContainer, injector, changeDetector, ngtAttachmentHttpService, ngtForm, ngtSection, ngtModal) {
30
- super();
31
- this.formContainer = formContainer;
32
- this.injector = injector;
33
- this.changeDetector = changeDetector;
34
- this.ngtAttachmentHttpService = ngtAttachmentHttpService;
35
- this.ngtForm = ngtForm;
36
- this.ngtSection = ngtSection;
37
- this.ngtModal = ngtModal;
38
- this.helpTextColor = 'text-green-500';
39
- // Behavior
40
- this.resources = [];
41
- this.multipleSelection = false;
42
- this.showFileName = false;
43
- this.disableClick = false;
44
- this.disabled = false;
45
- this.viewMode = false;
46
- this.removable = false;
47
- this.canDownloadFile = true;
48
- this.verticalExpandable = false;
49
- this.acceptedFiles = '*' /** Mime type */;
50
- this.previewType = NgtDropzonePreviewType.DEFAULT;
51
- this.onFileSelected = new EventEmitter();
52
- this.onFileSelectError = new EventEmitter();
53
- this.onFileUploadFail = new EventEmitter();
54
- this.onFileRemoved = new EventEmitter();
55
- this.onFileUploadInit = new EventEmitter();
56
- this.onFileUploaded = new EventEmitter();
57
- this.onFilePreviewLoaded = new EventEmitter();
58
- this.dropzoneHeight = '180px';
59
- this.uploadedResources = [];
60
- this.forceDisableClick = false;
61
- this.nativeValue = [];
62
- this.showNgtDropzoneFileViewer = false;
63
- this.componentReady = false;
64
- this.loading = false;
65
- this.ngxElementId = uuid();
66
- this.imageViewerOptions = {
67
- navbar: true,
68
- toolbar: {
69
- zoomIn: true,
70
- zoomOut: true,
71
- reset: true,
72
- rotateLeft: true,
73
- rotateRight: true,
74
- prev: true,
75
- next: true,
76
- }
77
- };
78
- this.subscriptions = [];
79
- this.ngtDropzoneLoaderStyle = new NgtStylizableService();
80
- this.ngtDropzoneLoaderStyle.load(this.injector, 'NgtDropzoneLoader', {
81
- h: 'h-8',
82
- color: {
83
- text: 'text-gray-600'
84
- }
85
- });
86
- }
87
- ngOnChanges(changes) {
88
- if (changes.previewType) {
89
- this.previewType = getEnumFromString(changes.previewType.currentValue, NgtDropzonePreviewType);
90
- }
91
- }
92
- ngAfterContentChecked() {
93
- if (this.container && this.container.nativeElement) {
94
- this.dropzoneHeight = `${this.container.nativeElement.parentElement.offsetHeight}px`;
95
- this.changeDetector.detectChanges();
96
- }
97
- }
98
- ngOnInit() {
99
- setTimeout(() => {
100
- this.componentReady = true;
101
- setTimeout(() => {
102
- this.initComponent();
103
- });
104
- }, 500);
105
- }
106
- ngOnDestroy() {
107
- this.destroySubscriptions();
108
- }
109
- imagePreview(index) {
110
- const images = this.uploadedResources.filter((resource) => this.isImage(resource));
111
- const imagesDiv = document.createElement("div");
112
- images.forEach((image) => {
113
- let imageElement = document.createElement("img");
114
- imageElement.src = image.file.url;
115
- imagesDiv.appendChild(imageElement);
116
- });
117
- this.onImageClick(imagesDiv, index);
118
- }
119
- onImageClick(element, index) {
120
- if (!this.viewMode) {
121
- this.forceDisableClick = true;
122
- }
123
- const ngtDropzoneComponent = this;
124
- if (index !== null && index !== undefined) {
125
- this.imageViewerOptions = { ...this.imageViewerOptions, ...{ initialViewIndex: index } };
126
- }
127
- const viewer = new Viewer(element, {
128
- ...this.imageViewerOptions, ...{
129
- hidden() {
130
- ngtDropzoneComponent.forceDisableClick = false;
131
- viewer.destroy();
132
- }
133
- }
134
- });
135
- viewer.show();
136
- }
137
- onFileClick(url, name, size) {
138
- this.forceDisableClick = true;
139
- this.showNgtDropzoneFileViewer = true;
140
- this.ngtDropzoneFileViewer.url = url;
141
- this.ngtDropzoneFileViewer.fileName = name;
142
- this.ngtDropzoneFileViewer.fileSize = size;
143
- this.ngtDropzoneFileViewer.init();
144
- this.subscriptions.push(this.ngtDropzoneFileViewer.onClose.subscribe(() => {
145
- this.showNgtDropzoneFileViewer = false;
146
- this.forceDisableClick = false;
147
- }));
148
- }
149
- async onSelect(event) {
150
- if (event.rejectedFiles.length) {
151
- for (const rejectedFile of event.rejectedFiles) {
152
- if (rejectedFile.reason == 'size') {
153
- this.onFileSelectError.emit(NgtDropzoneErrorType.SIZE);
154
- break;
155
- }
156
- else if (rejectedFile.reason == 'no_multiple') {
157
- this.onFileSelectError.emit(NgtDropzoneErrorType.NO_MULTIPLE);
158
- break;
159
- }
160
- else if (rejectedFile.reason == 'type') {
161
- this.onFileSelectError.emit(NgtDropzoneErrorType.TYPE);
162
- break;
163
- }
164
- else {
165
- this.onFileSelectError.emit(NgtDropzoneErrorType.DEFAULT);
166
- break;
167
- }
168
- }
169
- }
170
- if (this.itemsLimit) {
171
- if (this.itemsLimit == 1 && event.addedFiles
172
- && event.addedFiles.length == this.itemsLimit && this.uploadedResources.length == this.itemsLimit) {
173
- this.uploadedResources = [];
174
- }
175
- if (event.addedFiles
176
- && event.addedFiles.length + this.uploadedResources.length <= this.itemsLimit) {
177
- this.onFileSelected.emit(event);
178
- this.uploadFiles(event.addedFiles);
179
- }
180
- else {
181
- this.onFileSelectError.emit(NgtDropzoneErrorType.ITEMS_LIMIT);
182
- }
183
- }
184
- else {
185
- this.onFileSelected.emit(event);
186
- this.uploadFiles(event.addedFiles);
187
- }
188
- }
189
- async uploadFiles(files) {
190
- if (files && files.length) {
191
- const temporaryFiles = [];
192
- const temporaryAttachments = [];
193
- const observables = [];
194
- const unacceptedFiles = [];
195
- this.loading = true;
196
- this.onFileUploadInit.emit();
197
- files.forEach(file => {
198
- if (file.type.includes(this.unacceptedFiles)) {
199
- return unacceptedFiles.push(file);
200
- }
201
- observables.push(this.ngtAttachmentHttpService.upload(this.remoteResource, file).pipe(map((response) => {
202
- if (response && response.data) {
203
- if (response.data.attributes && response.data.attributes.data) {
204
- file['url'] = response.data.attributes.data.url;
205
- }
206
- temporaryFiles.push({
207
- id: response.data.id,
208
- size: file.size,
209
- file: file
210
- });
211
- response.data['loaded'] = true;
212
- temporaryAttachments.push(response.data);
213
- }
214
- })));
215
- });
216
- if (!observables.length && unacceptedFiles.length) {
217
- this.loading = false;
218
- return this.onFileSelectError.emit(NgtDropzoneErrorType.TYPE);
219
- }
220
- this.subscriptions.push(forkJoin(observables).subscribe((response) => {
221
- this.uploadedResources.push(...temporaryFiles);
222
- if (this.itemsLimit == 1) {
223
- this.onNativeChange([...temporaryAttachments]);
224
- }
225
- else {
226
- this.onNativeChange([...temporaryAttachments, ...this.nativeValue]);
227
- }
228
- this.onFileUploaded.emit();
229
- this.loading = false;
230
- if (unacceptedFiles.length) {
231
- this.onFileSelectError.emit(NgtDropzoneErrorType.TYPE);
232
- }
233
- setTimeout(() => this.changeDetector.detectChanges(), 500);
234
- }, (error) => {
235
- this.onFileUploadFail.emit(error);
236
- this.loading = false;
237
- setTimeout(() => this.changeDetector.detectChanges(), 500);
238
- }));
239
- }
240
- }
241
- async loadFilePreview(attachments) {
242
- if (attachments && attachments.length && attachments[0]) {
243
- let temporaryResource = [];
244
- let observables = [];
245
- attachments.forEach((attachment) => {
246
- if (!(attachment instanceof File) && !attachment.loaded) {
247
- this.loading = true;
248
- attachment['loaded'] = true;
249
- observables.push(this.ngtAttachmentHttpService.preview(attachment)
250
- .pipe(map((response) => {
251
- temporaryResource.push({
252
- id: response.data.getApiId(),
253
- file: response.data.getAttribute('file')
254
- });
255
- })));
256
- }
257
- });
258
- this.subscriptions.push(forkJoin(observables).subscribe((response) => {
259
- this.uploadedResources.push(...temporaryResource);
260
- this.onNativeChange(attachments);
261
- this.onFilePreviewLoaded.emit();
262
- this.loading = false;
263
- setTimeout(() => this.changeDetector.detectChanges(), 500);
264
- }, (error) => {
265
- this.loading = false;
266
- }));
267
- }
268
- }
269
- onRemove(resource) {
270
- this.uploadedResources.splice(this.uploadedResources.indexOf(resource), 1);
271
- this.nativeValue = this.nativeValue.filter(element => element.id != resource.id);
272
- this.onNativeChange(this.nativeValue);
273
- this.onFileRemoved.emit(resource);
274
- }
275
- isImage(resource) {
276
- return this.previewType == 'IMAGE'
277
- || (resource.file?.type
278
- && resource.file.type.includes('image')
279
- && !resource.file.type.includes('dwg'));
280
- }
281
- isVideo(resource) {
282
- return this.previewType == 'VIDEO' || (resource.file && resource.file.type && resource.file.type.includes('video'));
283
- }
284
- isAudio(resource) {
285
- return (resource.file && resource.file.type && resource.file.type.includes('audio'));
286
- }
287
- isFile(resource) {
288
- return !this.isImage(resource) && !this.isAudio(resource) && !this.isVideo(resource);
289
- }
290
- getFormattedFileSize(resource) {
291
- if (resource) {
292
- let size = resource.size || resource.fileSize;
293
- if (!size) {
294
- if (resource.file && resource.file.size) {
295
- size = resource.file.size;
296
- }
297
- else {
298
- size = 0;
299
- }
300
- }
301
- if (parseFloat(size) > 1000000) {
302
- return (parseFloat(size) / 1000000).toFixed(2) + ' Mb';
303
- }
304
- return Math.round(parseFloat(size) / 1000) + ' Kb';
305
- }
306
- }
307
- onNativeChange(value) {
308
- if (value === undefined) {
309
- this.value = [];
310
- this.nativeValue = [];
311
- }
312
- else {
313
- this.nativeValue = value;
314
- if (JSON.stringify(this.value) != JSON.stringify(this.nativeValue)) {
315
- this.value = this.nativeValue;
316
- }
317
- }
318
- }
319
- change(value) {
320
- if (value && !this.viewMode) {
321
- this.onNativeChange(Array.isArray(value) ? value : [value]);
322
- if (this.componentReady) {
323
- this.loadFilePreview(Array.isArray(value) ? value : [value]);
324
- }
325
- }
326
- }
327
- downloadFile(attachment) {
328
- this.ngtAttachmentHttpService.download(attachment).subscribe(() => { });
329
- }
330
- reset() {
331
- this.uploadedResources = [];
332
- this.value = [];
333
- this.nativeValue = [];
334
- this.initComponent();
335
- }
336
- openFileSelector() {
337
- document.getElementById(this.ngxElementId).click();
338
- }
339
- isDisabled() {
340
- return this.disabled || this.isDisabledByParent();
341
- }
342
- initComponent() {
343
- if (this.viewMode) {
344
- this.previewType = NgtDropzonePreviewType.DEFAULT;
345
- return;
346
- }
347
- if (this.formContainer && this.formContainer.control
348
- && (this.formControl = this.formContainer.control.get(this.name))) {
349
- this.resetFilesLoad();
350
- this.loadFilePreview(Array.isArray(this.value) ? this.value : [this.value]);
351
- this.updateValidations();
352
- if (this.value) {
353
- this.formControl.markAsDirty();
354
- }
355
- else {
356
- this.formControl.markAsPristine();
357
- }
358
- }
359
- }
360
- resetFilesLoad() {
361
- if (Array.isArray(this.value)) {
362
- this.value.forEach(element => {
363
- if (element) {
364
- element['loaded'] = false;
365
- }
366
- });
367
- }
368
- }
369
- updateValidations() {
370
- if (!this.formControl) {
371
- return;
372
- }
373
- let syncValidators = [];
374
- if (this.isRequired) {
375
- syncValidators.push(Validators.required);
376
- }
377
- syncValidators.push();
378
- setTimeout(() => {
379
- this.formControl.setValidators(syncValidators);
380
- this.formControl.updateValueAndValidity();
381
- });
382
- }
383
- isDisabledByParent() {
384
- return this.ngtForm?.isDisabled
385
- || this.ngtSection?.isDisabled
386
- || this.ngtModal?.isDisabled;
387
- }
388
- destroySubscriptions() {
389
- this.subscriptions.forEach(subscription => subscription.unsubscribe());
390
- this.subscriptions = [];
391
- }
392
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgtDropzoneComponent, deps: [{ token: i1.ControlContainer, host: true, optional: true }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }, { token: i2.NgtAttachmentHttpService, optional: true, skipSelf: true }, { token: i3.NgtFormComponent, optional: true, skipSelf: true }, { token: i4.NgtSectionComponent, optional: true, skipSelf: true }, { token: i5.NgtModalComponent, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component }); }
393
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NgtDropzoneComponent, selector: "ngt-dropzone", inputs: { label: "label", placeholder: "placeholder", helpTextColor: "helpTextColor", helpText: "helpText", helpTitle: "helpTitle", resources: "resources", multipleSelection: "multipleSelection", itemsLimit: "itemsLimit", showFileName: "showFileName", disableClick: "disableClick", disabled: "disabled", viewMode: "viewMode", removable: "removable", canDownloadFile: "canDownloadFile", verticalExpandable: "verticalExpandable", isRequired: "isRequired", hideNgxDropzone: "hideNgxDropzone", acceptedFiles: "acceptedFiles", unacceptedFiles: "unacceptedFiles", maxFileSize: "maxFileSize", previewType: "previewType", name: "name", remoteResource: "remoteResource" }, outputs: { onFileSelected: "onFileSelected", onFileSelectError: "onFileSelectError", onFileUploadFail: "onFileUploadFail", onFileRemoved: "onFileRemoved", onFileUploadInit: "onFileUploadInit", onFileUploaded: "onFileUploaded", onFilePreviewLoaded: "onFilePreviewLoaded" }, providers: [
394
- NgtMakeProvider(NgtDropzoneComponent),
395
- ], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "ngxDropzone", first: true, predicate: NgxDropzoneComponent, descendants: true, static: true }, { propertyName: "ngtDropzoneFileViewer", first: true, predicate: NgtDropzoneFileViewerComponent, descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"flex flex-col h-full w-full\" #container>\n <label *ngIf=\"label\" class=\"flex mb-2 text-sm\">\n {{ label }}:\n\n <span class=\"text-red-500 font-bold text-md ml-1\" *ngIf=\"isRequired\">*</span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\" class=\"ml-1\">\n {{ helpText }}\n </ngt-helper>\n </label>\n\n <div *ngIf=\"!viewMode\" class=\"h-full w-full relative\">\n <div *ngIf=\"loading && !hideNgxDropzone\"\n class=\"flex absolute justify-center items-center w-full h-full cursor-wait z-10\">\n <div class=\"div-loader\"></div>\n </div>\n\n <ngx-dropzone [id]=\"ngxElementId\" [multiple]='multipleSelection' [maxFileSize]='maxFileSize'\n (change)='onSelect($event)' [class.single-attachment]='itemsLimit == 1' [accept]='acceptedFiles'\n [disabled]='isDisabled() || loading' [expandable]='verticalExpandable'\n [disableClick]='disableClick || forceDisableClick' [ngStyle]=\"{ 'height': dropzoneHeight }\"\n [ngClass]=\"{ 'hidden':hideNgxDropzone }\" #ngxDropzone>\n <ng-container *ngIf=\"!loading\">\n <ngx-dropzone-label *ngIf=\"!uploadedResources?.length\" class=\"px-2\">\n {{ placeholder }}\n </ngx-dropzone-label>\n\n <ng-container *ngFor=\"let resource of uploadedResources; let index = index\">\n <div class=\"flex flex-col w-48 mx-4\"\n title=\"{{ resource?.file?.name || '' }} ({{ getFormattedFileSize(resource) }})\">\n <custom-dropzone-preview *ngIf=\"previewType == 'DEFAULT' && isFile(resource)\"\n [file]='resource.file' [removable]=\"removable\" (removed)=\"onRemove(resource)\"\n (click)=\"onFileClick(resource.file.url, resource.file.name, resource.file.size)\"\n ngProjectAs=\"ngx-dropzone-preview\">\n </custom-dropzone-preview>\n\n <div *ngIf=\"isImage(resource)\" class=\"cursor-pointer\" (click)=\"imagePreview(index)\" #gallery>\n <ngx-dropzone-image-preview class=\"image-preview-default-class\" [file]=\"resource.file\"\n [removable]=\"removable\" (removed)=\"onRemove(resource)\">\n </ngx-dropzone-image-preview>\n </div>\n\n <ngx-dropzone-video-preview *ngIf=\"isVideo(resource) || isAudio(resource)\"\n [file]=\"resource.file\" [removable]=\"removable\" (removed)=\"onRemove(resource)\">\n </ngx-dropzone-video-preview>\n\n <p *ngIf=\"showFileName\"\n class=\"w-full truncate text-gray-500 text-center text-sm font-mono mt-2\">\n {{ resource?.file?.name || '' }}\n </p>\n </div>\n </ng-container>\n </ng-container>\n </ngx-dropzone>\n </div>\n\n <ngt-dropzone-view *ngIf=\"viewMode\" class=\"h-full w-full\" [resources]=\"resources\" [loading]=\"loading\"\n [placeholder]=\"placeholder\" [dropzoneHeight]=\"dropzoneHeight\"\n (onFileClick)=\"onFileClick($event.previewUrl, $event.name, $event.fileSize)\"\n (onImageClick)=\"onImageClick($event.div, $event.index)\">\n </ngt-dropzone-view>\n\n <ngt-dropzone-file-viewer [hidden]=\"!showNgtDropzoneFileViewer\" (onClose)=\"forceDisableClick = false\"\n [canDownloadFile]=\"canDownloadFile\" [disableContent]=\"canDownloadFile ? 'none' : 'popout'\">\n </ngt-dropzone-file-viewer>\n\n <input *ngIf='componentReady' type=\"hidden\" [ngModel]=\"value\" [name]=\"name\" [value]=\"value\">\n <ngt-validation [control]=\"formControl\" [container]=\"formContainer\"></ngt-validation>\n</div>", styles: [".single-attachment{border:none!important;margin:unset!important;overflow:hidden!important;display:flex!important;justify-content:center!important}.image-preview-default-class{margin:unset!important}custom-dropzone-preview{height:100%!important;min-height:unset!important;margin:unset!important}.div-loader{width:4rem;height:4rem;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.NgtValidationComponent, selector: "ngt-validation", inputs: ["control", "container", "minValue", "minLength"] }, { kind: "component", type: i8.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "processDirectoryDrop", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }, { kind: "directive", type: i8.NgxDropzoneLabelDirective, selector: "ngx-dropzone-label" }, { kind: "component", type: i8.NgxDropzoneImagePreviewComponent, selector: "ngx-dropzone-image-preview", inputs: ["file"] }, { kind: "component", type: i8.NgxDropzoneVideoPreviewComponent, selector: "ngx-dropzone-video-preview" }, { kind: "component", type: i9.NgtHelperComponent, selector: "ngt-helper", inputs: ["helpTextColor", "helpText", "helpTitle", "icon", "iconSize", "iconColor", "iconTitle", "tooltipSize", "autoXReverse", "helperReverseYPosition"] }, { kind: "component", type: i10.NgtDropzoneFileViewerComponent, selector: "ngt-dropzone-file-viewer", inputs: ["url", "fileName", "fileSize", "disableContent", "canDownloadFile"], outputs: ["onClose"] }, { kind: "component", type: i11.NgtDropzoneViewComponent, selector: "ngt-dropzone-view", inputs: ["resources", "dropzoneHeight", "loading", "placeholder"], outputs: ["onImageClick", "onFileClick"] }, { kind: "component", type: i12.CustomDropzonePreviewComponent, selector: "custom-dropzone-preview" }], viewProviders: [
396
- { provide: ControlContainer, useExisting: NgForm }
397
- ], encapsulation: i0.ViewEncapsulation.None }); }
398
- }
399
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgtDropzoneComponent, decorators: [{
400
- type: Component,
401
- args: [{ selector: 'ngt-dropzone', encapsulation: ViewEncapsulation.None, providers: [
402
- NgtMakeProvider(NgtDropzoneComponent),
403
- ], viewProviders: [
404
- { provide: ControlContainer, useExisting: NgForm }
405
- ], template: "<div class=\"flex flex-col h-full w-full\" #container>\n <label *ngIf=\"label\" class=\"flex mb-2 text-sm\">\n {{ label }}:\n\n <span class=\"text-red-500 font-bold text-md ml-1\" *ngIf=\"isRequired\">*</span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\" class=\"ml-1\">\n {{ helpText }}\n </ngt-helper>\n </label>\n\n <div *ngIf=\"!viewMode\" class=\"h-full w-full relative\">\n <div *ngIf=\"loading && !hideNgxDropzone\"\n class=\"flex absolute justify-center items-center w-full h-full cursor-wait z-10\">\n <div class=\"div-loader\"></div>\n </div>\n\n <ngx-dropzone [id]=\"ngxElementId\" [multiple]='multipleSelection' [maxFileSize]='maxFileSize'\n (change)='onSelect($event)' [class.single-attachment]='itemsLimit == 1' [accept]='acceptedFiles'\n [disabled]='isDisabled() || loading' [expandable]='verticalExpandable'\n [disableClick]='disableClick || forceDisableClick' [ngStyle]=\"{ 'height': dropzoneHeight }\"\n [ngClass]=\"{ 'hidden':hideNgxDropzone }\" #ngxDropzone>\n <ng-container *ngIf=\"!loading\">\n <ngx-dropzone-label *ngIf=\"!uploadedResources?.length\" class=\"px-2\">\n {{ placeholder }}\n </ngx-dropzone-label>\n\n <ng-container *ngFor=\"let resource of uploadedResources; let index = index\">\n <div class=\"flex flex-col w-48 mx-4\"\n title=\"{{ resource?.file?.name || '' }} ({{ getFormattedFileSize(resource) }})\">\n <custom-dropzone-preview *ngIf=\"previewType == 'DEFAULT' && isFile(resource)\"\n [file]='resource.file' [removable]=\"removable\" (removed)=\"onRemove(resource)\"\n (click)=\"onFileClick(resource.file.url, resource.file.name, resource.file.size)\"\n ngProjectAs=\"ngx-dropzone-preview\">\n </custom-dropzone-preview>\n\n <div *ngIf=\"isImage(resource)\" class=\"cursor-pointer\" (click)=\"imagePreview(index)\" #gallery>\n <ngx-dropzone-image-preview class=\"image-preview-default-class\" [file]=\"resource.file\"\n [removable]=\"removable\" (removed)=\"onRemove(resource)\">\n </ngx-dropzone-image-preview>\n </div>\n\n <ngx-dropzone-video-preview *ngIf=\"isVideo(resource) || isAudio(resource)\"\n [file]=\"resource.file\" [removable]=\"removable\" (removed)=\"onRemove(resource)\">\n </ngx-dropzone-video-preview>\n\n <p *ngIf=\"showFileName\"\n class=\"w-full truncate text-gray-500 text-center text-sm font-mono mt-2\">\n {{ resource?.file?.name || '' }}\n </p>\n </div>\n </ng-container>\n </ng-container>\n </ngx-dropzone>\n </div>\n\n <ngt-dropzone-view *ngIf=\"viewMode\" class=\"h-full w-full\" [resources]=\"resources\" [loading]=\"loading\"\n [placeholder]=\"placeholder\" [dropzoneHeight]=\"dropzoneHeight\"\n (onFileClick)=\"onFileClick($event.previewUrl, $event.name, $event.fileSize)\"\n (onImageClick)=\"onImageClick($event.div, $event.index)\">\n </ngt-dropzone-view>\n\n <ngt-dropzone-file-viewer [hidden]=\"!showNgtDropzoneFileViewer\" (onClose)=\"forceDisableClick = false\"\n [canDownloadFile]=\"canDownloadFile\" [disableContent]=\"canDownloadFile ? 'none' : 'popout'\">\n </ngt-dropzone-file-viewer>\n\n <input *ngIf='componentReady' type=\"hidden\" [ngModel]=\"value\" [name]=\"name\" [value]=\"value\">\n <ngt-validation [control]=\"formControl\" [container]=\"formContainer\"></ngt-validation>\n</div>", styles: [".single-attachment{border:none!important;margin:unset!important;overflow:hidden!important;display:flex!important;justify-content:center!important}.image-preview-default-class{margin:unset!important}custom-dropzone-preview{height:100%!important;min-height:unset!important;margin:unset!important}.div-loader{width:4rem;height:4rem;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
406
- }], ctorParameters: () => [{ type: i1.ControlContainer, decorators: [{
407
- type: Optional
408
- }, {
409
- type: Host
410
- }] }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }, { type: i2.NgtAttachmentHttpService, decorators: [{
411
- type: Optional
412
- }, {
413
- type: SkipSelf
414
- }] }, { type: i3.NgtFormComponent, decorators: [{
415
- type: Optional
416
- }, {
417
- type: SkipSelf
418
- }] }, { type: i4.NgtSectionComponent, decorators: [{
419
- type: Optional
420
- }, {
421
- type: SkipSelf
422
- }] }, { type: i5.NgtModalComponent, decorators: [{
423
- type: Optional
424
- }, {
425
- type: SkipSelf
426
- }] }], propDecorators: { container: [{
427
- type: ViewChild,
428
- args: ['container']
429
- }], ngxDropzone: [{
430
- type: ViewChild,
431
- args: [NgxDropzoneComponent, { static: true }]
432
- }], ngtDropzoneFileViewer: [{
433
- type: ViewChild,
434
- args: [NgtDropzoneFileViewerComponent, { static: true }]
435
- }], label: [{
436
- type: Input
437
- }], placeholder: [{
438
- type: Input
439
- }], helpTextColor: [{
440
- type: Input
441
- }], helpText: [{
442
- type: Input
443
- }], helpTitle: [{
444
- type: Input
445
- }], resources: [{
446
- type: Input
447
- }], multipleSelection: [{
448
- type: Input
449
- }], itemsLimit: [{
450
- type: Input
451
- }], showFileName: [{
452
- type: Input
453
- }], disableClick: [{
454
- type: Input
455
- }], disabled: [{
456
- type: Input
457
- }], viewMode: [{
458
- type: Input
459
- }], removable: [{
460
- type: Input
461
- }], canDownloadFile: [{
462
- type: Input
463
- }], verticalExpandable: [{
464
- type: Input
465
- }], isRequired: [{
466
- type: Input
467
- }], hideNgxDropzone: [{
468
- type: Input
469
- }], acceptedFiles: [{
470
- type: Input
471
- }], unacceptedFiles: [{
472
- type: Input
473
- }], maxFileSize: [{
474
- type: Input
475
- }], previewType: [{
476
- type: Input
477
- }], name: [{
478
- type: Input
479
- }], remoteResource: [{
480
- type: Input
481
- }], onFileSelected: [{
482
- type: Output
483
- }], onFileSelectError: [{
484
- type: Output
485
- }], onFileUploadFail: [{
486
- type: Output
487
- }], onFileRemoved: [{
488
- type: Output
489
- }], onFileUploadInit: [{
490
- type: Output
491
- }], onFileUploaded: [{
492
- type: Output
493
- }], onFilePreviewLoaded: [{
494
- type: Output
495
- }] } });
496
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LWRyb3B6b25lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXRhaWx3aW5kL3NyYy9jb21wb25lbnRzL25ndC1kcm9wem9uZS9uZ3QtZHJvcHpvbmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdGFpbHdpbmQvc3JjL2NvbXBvbmVudHMvbmd0LWRyb3B6b25lL25ndC1kcm9wem9uZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsU0FBUyxFQUVULFlBQVksRUFDWixJQUFJLEVBRUosS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sUUFBUSxFQUNSLFNBQVMsRUFDVCxpQkFBaUIsR0FDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RSxPQUFPLEVBQTBCLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLE1BQU0sTUFBTSxVQUFVLENBQUM7QUFFOUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFMUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDNUYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sK0RBQStELENBQUM7QUFDL0csT0FBTyxFQUFFLG9CQUFvQixFQUFtQixzQkFBc0Is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dGVudENoZWNrZWQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3QsXG4gICAgSW5qZWN0b3IsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBTa2lwU2VsZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbENvbnRhaW5lciwgTmdGb3JtLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTmd4RHJvcHpvbmVDaGFuZ2VFdmVudCwgTmd4RHJvcHpvbmVDb21wb25lbnQgfSBmcm9tICduZ3gtZHJvcHpvbmUnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IFZpZXdlciBmcm9tICd2aWV3ZXJqcyc7XG5cbmltcG9ydCB7IE5ndEJhc2VOZ01vZGVsLCBOZ3RNYWtlUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9iYXNlL25ndC1iYXNlLW5nLW1vZGVsJztcbmltcG9ydCB7IGdldEVudW1Gcm9tU3RyaW5nIH0gZnJvbSAnLi4vLi4vaGVscGVycy9lbnVtL2VudW0nO1xuaW1wb3J0IHsgdXVpZCB9IGZyb20gJy4uLy4uL2hlbHBlcnMvdXVpZCc7XG5pbXBvcnQgeyBOZ3RBdHRhY2htZW50SHR0cFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9odHRwL25ndC1hdHRhY2htZW50LWh0dHAuc2VydmljZSc7XG5pbXBvcnQgeyBOZ3RTdHlsaXphYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25ndC1zdHlsaXphYmxlL25ndC1zdHlsaXphYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd0RHJvcHpvbmVGaWxlVmlld2VyQ29tcG9uZW50IH0gZnJvbSAnLi9uZ3QtZHJvcHpvbmUtZmlsZS12aWV3ZXIvbmd0LWRyb3B6b25lLWZpbGUtdmlld2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ3REcm9wem9uZUVycm9yVHlwZSwgTmd0RHJvcHpvbmVGaWxlLCBOZ3REcm9wem9uZVByZXZpZXdUeXBlIH0gZnJvbSAnLi9uZ3QtZHJvcHpvbmUubWV0YSc7XG5pbXBvcnQgeyBOZ3RGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LWZvcm0vbmd0LWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IE5ndFNlY3Rpb25Db21wb25lbnQgfSBmcm9tICcuLi9uZ3Qtc2VjdGlvbi9uZ3Qtc2VjdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmd0TW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9uZ3QtbW9kYWwvbmd0LW1vZGFsLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd0LWRyb3B6b25lJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmd0LWRyb3B6b25lLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9uZ3QtZHJvcHpvbmUuY29tcG9uZW50LmNzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIE5ndE1ha2VQcm92aWRlcihOZ3REcm9wem9uZUNvbXBvbmVudCksXG4gICAgXSxcbiAgICB2aWV3UHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lciwgdXNlRXhpc3Rpbmc6IE5nRm9ybSB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3REcm9wem9uZUNvbXBvbmVudCBleHRlbmRzIE5ndEJhc2VOZ01vZGVsIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudENoZWNrZWQge1xuICAgIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIHB1YmxpYyBjb250YWluZXI6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZChOZ3hEcm9wem9uZUNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIG5neERyb3B6b25lOiBOZ3hEcm9wem9uZUNvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKE5ndERyb3B6b25lRmlsZVZpZXdlckNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIG5ndERyb3B6b25lRmlsZVZpZXdlcjogTmd0RHJvcHpvbmVGaWxlVmlld2VyQ29tcG9uZW50O1xuXG4gICAgLy8gVmlzdWFsXG4gICAgQElucHV0KCkgcHVibGljIGxhYmVsOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUZXh0Q29sb3I6IHN0cmluZyA9ICd0ZXh0LWdyZWVuLTUwMCc7XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUZXh0OiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUaXRsZTogc3RyaW5nO1xuXG4gICAgLy8gQmVoYXZpb3JcbiAgICBASW5wdXQoKSBwdWJsaWMgcmVzb3VyY2VzOiBBcnJheTxOZ3REcm9wem9uZUZpbGU+ID0gW107XG4gICAgQElucHV0KCkgcHVibGljIG11bHRpcGxlU2VsZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGl0ZW1zTGltaXQ6IG51bWJlcjtcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd0ZpbGVOYW1lOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGRpc2FibGVDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyB2aWV3TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyByZW1vdmFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgY2FuRG93bmxvYWRGaWxlOiBib29sZWFuID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgdmVydGljYWxFeHBhbmRhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGlzUmVxdWlyZWQ6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGhpZGVOZ3hEcm9wem9uZTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgYWNjZXB0ZWRGaWxlczogc3RyaW5nID0gJyonIC8qKiBNaW1lIHR5cGUgKi87XG4gICAgQElucHV0KCkgcHVibGljIHVuYWNjZXB0ZWRGaWxlczogc3RyaW5nOyAvKiogTWltZSB0eXBlICovO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXhGaWxlU2l6ZTogbnVtYmVyOyAvKiogQnl0ZXMgKi87XG4gICAgQElucHV0KCkgcHVibGljIHByZXZpZXdUeXBlOiBOZ3REcm9wem9uZVByZXZpZXdUeXBlID0gTmd0RHJvcHpvbmVQcmV2aWV3VHlwZS5ERUZBVUxUO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIHJlbW90ZVJlc291cmNlOiBhbnk7XG5cbiAgICBAT3V0cHV0KCkgcHVibGljIG9uRmlsZVNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8Tmd4RHJvcHpvbmVDaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkZpbGVTZWxlY3RFcnJvcjogRXZlbnRFbWl0dGVyPE5ndERyb3B6b25lRXJyb3JUeXBlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uRmlsZVVwbG9hZEZhaWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25GaWxlUmVtb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uRmlsZVVwbG9hZEluaXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkZpbGVVcGxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uRmlsZVByZXZpZXdMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBwdWJsaWMgZHJvcHpvbmVIZWlnaHQ6IHN0cmluZyA9ICcxODBweCc7XG4gICAgcHVibGljIHVwbG9hZGVkUmVzb3VyY2VzID0gW107XG4gICAgcHVibGljIGZvcmNlRGlzYWJsZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIG5hdGl2ZVZhbHVlID0gW107XG4gICAgcHVibGljIHNob3dOZ3REcm9wem9uZUZpbGVWaWV3ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY29tcG9uZW50UmVhZHkgPSBmYWxzZTtcbiAgICBwdWJsaWMgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBuZ3REcm9wem9uZUxvYWRlclN0eWxlOiBOZ3RTdHlsaXphYmxlU2VydmljZTtcbiAgICBwdWJsaWMgbmd4RWxlbWVudElkOiBzdHJpbmcgPSB1dWlkKCk7XG4gICAgcHVibGljIGltYWdlVmlld2VyT3B0aW9uczogYW55ID0ge1xuICAgICAgICBuYXZiYXI6IHRydWUsXG4gICAgICAgIHRvb2xiYXI6IHtcbiAgICAgICAgICAgIHpvb21JbjogdHJ1ZSxcbiAgICAgICAgICAgIHpvb21PdXQ6IHRydWUsXG4gICAgICAgICAgICByZXNldDogdHJ1ZSxcbiAgICAgICAgICAgIHJvdGF0ZUxlZnQ6IHRydWUsXG4gICAgICAgICAgICByb3RhdGVSaWdodDogdHJ1ZSxcbiAgICAgICAgICAgIHByZXY6IHRydWUsXG4gICAgICAgICAgICBuZXh0OiB0cnVlLFxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uczogQXJyYXk8U3Vic2NyaXB0aW9uPiA9IFtdO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBAT3B0aW9uYWwoKSBASG9zdCgpXG4gICAgICAgIHB1YmxpYyBmb3JtQ29udGFpbmVyOiBDb250cm9sQ29udGFpbmVyLFxuXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcblxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxuICAgICAgICBwcml2YXRlIG5ndEF0dGFjaG1lbnRIdHRwU2VydmljZTogTmd0QXR0YWNobWVudEh0dHBTZXJ2aWNlLFxuXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpXG4gICAgICAgIHByaXZhdGUgbmd0Rm9ybTogTmd0Rm9ybUNvbXBvbmVudCxcblxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxuICAgICAgICBwcml2YXRlIG5ndFNlY3Rpb246IE5ndFNlY3Rpb25Db21wb25lbnQsXG5cbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKClcbiAgICAgICAgcHJpdmF0ZSBuZ3RNb2RhbDogTmd0TW9kYWxDb21wb25lbnRcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLm5ndERyb3B6b25lTG9hZGVyU3R5bGUgPSBuZXcgTmd0U3R5bGl6YWJsZVNlcnZpY2UoKTtcblxuICAgICAgICB0aGlzLm5ndERyb3B6b25lTG9hZGVyU3R5bGUubG9hZCh0aGlzLmluamVjdG9yLCAnTmd0RHJvcHpvbmVMb2FkZXInLCB7XG4gICAgICAgICAgICBoOiAnaC04JyxcbiAgICAgICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgICAgICAgdGV4dDogJ3RleHQtZ3JheS02MDAnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLnByZXZpZXdUeXBlKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpZXdUeXBlID0gZ2V0RW51bUZyb21TdHJpbmcoY2hhbmdlcy5wcmV2aWV3VHlwZS5jdXJyZW50VmFsdWUsIE5ndERyb3B6b25lUHJldmlld1R5cGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyICYmIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZHJvcHpvbmVIZWlnaHQgPSBgJHt0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0fXB4YDtcblxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRSZWFkeSA9IHRydWU7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbXBvbmVudCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3lTdWJzY3JpcHRpb25zKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGltYWdlUHJldmlldyhpbmRleCkge1xuICAgICAgICBjb25zdCBpbWFnZXMgPSB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzLmZpbHRlcigocmVzb3VyY2UpID0+IHRoaXMuaXNJbWFnZShyZXNvdXJjZSkpO1xuICAgICAgICBjb25zdCBpbWFnZXNEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgICAgIGltYWdlcy5mb3JFYWNoKChpbWFnZSkgPT4ge1xuICAgICAgICAgICAgbGV0IGltYWdlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG5cbiAgICAgICAgICAgIGltYWdlRWxlbWVudC5zcmMgPSBpbWFnZS5maWxlLnVybDtcblxuICAgICAgICAgICAgaW1hZ2VzRGl2LmFwcGVuZENoaWxkKGltYWdlRWxlbWVudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub25JbWFnZUNsaWNrKGltYWdlc0RpdiwgaW5kZXgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkltYWdlQ2xpY2soZWxlbWVudCwgaW5kZXg/KSB7XG4gICAgICAgIGlmICghdGhpcy52aWV3TW9kZSkge1xuICAgICAgICAgICAgdGhpcy5mb3JjZURpc2FibGVDbGljayA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZ3REcm9wem9uZUNvbXBvbmVudCA9IHRoaXM7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9PSBudWxsICYmIGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VWaWV3ZXJPcHRpb25zID0geyAuLi50aGlzLmltYWdlVmlld2VyT3B0aW9ucywgLi4ueyBpbml0aWFsVmlld0luZGV4OiBpbmRleCB9IH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2aWV3ZXIgPSBuZXcgVmlld2VyKGVsZW1lbnQsIHtcbiAgICAgICAgICAgIC4uLnRoaXMuaW1hZ2VWaWV3ZXJPcHRpb25zLCAuLi57XG4gICAgICAgICAgICAgICAgaGlkZGVuKCkge1xuICAgICAgICAgICAgICAgICAgICBuZ3REcm9wem9uZUNvbXBvbmVudC5mb3JjZURpc2FibGVDbGljayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB2aWV3ZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmlld2VyLnNob3coKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25GaWxlQ2xpY2sodXJsOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuZm9yY2VEaXNhYmxlQ2xpY2sgPSB0cnVlO1xuICAgICAgICB0aGlzLnNob3dOZ3REcm9wem9uZUZpbGVWaWV3ZXIgPSB0cnVlO1xuICAgICAgICB0aGlzLm5ndERyb3B6b25lRmlsZVZpZXdlci51cmwgPSB1cmw7XG4gICAgICAgIHRoaXMubmd0RHJvcHpvbmVGaWxlVmlld2VyLmZpbGVOYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5uZ3REcm9wem9uZUZpbGVWaWV3ZXIuZmlsZVNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLm5ndERyb3B6b25lRmlsZVZpZXdlci5pbml0KCk7XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5uZ3REcm9wem9uZUZpbGVWaWV3ZXIub25DbG9zZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93Tmd0RHJvcHpvbmVGaWxlVmlld2VyID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZvcmNlRGlzYWJsZUNsaWNrID0gZmFsc2U7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb25TZWxlY3QoZXZlbnQ6IE5neERyb3B6b25lQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LnJlamVjdGVkRmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlamVjdGVkRmlsZSBvZiA8YW55PmV2ZW50LnJlamVjdGVkRmlsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVqZWN0ZWRGaWxlLnJlYXNvbiA9PSAnc2l6ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RFcnJvci5lbWl0KE5ndERyb3B6b25lRXJyb3JUeXBlLlNJWkUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlamVjdGVkRmlsZS5yZWFzb24gPT0gJ25vX211bHRpcGxlJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdEVycm9yLmVtaXQoTmd0RHJvcHpvbmVFcnJvclR5cGUuTk9fTVVMVElQTEUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlamVjdGVkRmlsZS5yZWFzb24gPT0gJ3R5cGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25GaWxlU2VsZWN0RXJyb3IuZW1pdChOZ3REcm9wem9uZUVycm9yVHlwZS5UWVBFKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RFcnJvci5lbWl0KE5ndERyb3B6b25lRXJyb3JUeXBlLkRFRkFVTFQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pdGVtc0xpbWl0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtc0xpbWl0ID09IDEgJiYgZXZlbnQuYWRkZWRGaWxlc1xuICAgICAgICAgICAgICAgICYmIGV2ZW50LmFkZGVkRmlsZXMubGVuZ3RoID09IHRoaXMuaXRlbXNMaW1pdCAmJiB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzLmxlbmd0aCA9PSB0aGlzLml0ZW1zTGltaXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChldmVudC5hZGRlZEZpbGVzXG4gICAgICAgICAgICAgICAgJiYgZXZlbnQuYWRkZWRGaWxlcy5sZW5ndGggKyB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzLmxlbmd0aCA8PSB0aGlzLml0ZW1zTGltaXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdGVkLmVtaXQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZXMoZXZlbnQuYWRkZWRGaWxlcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub25GaWxlU2VsZWN0RXJyb3IuZW1pdChOZ3REcm9wem9uZUVycm9yVHlwZS5JVEVNU19MSU1JVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdGVkLmVtaXQoZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlcyhldmVudC5hZGRlZEZpbGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGxvYWRGaWxlcyhmaWxlczogQXJyYXk8RmlsZT4pIHtcbiAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgdGVtcG9yYXJ5RmlsZXMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBvcmFyeUF0dGFjaG1lbnRzID0gW107XG4gICAgICAgICAgICBjb25zdCBvYnNlcnZhYmxlcyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgdW5hY2NlcHRlZEZpbGVzID0gW107XG5cbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm9uRmlsZVVwbG9hZEluaXQuZW1pdCgpO1xuXG4gICAgICAgICAgICBmaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaWxlLnR5cGUuaW5jbHVkZXModGhpcy51bmFjY2VwdGVkRmlsZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmFjY2VwdGVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBvYnNlcnZhYmxlcy5wdXNoKHRoaXMubmd0QXR0YWNobWVudEh0dHBTZXJ2aWNlLnVwbG9hZCh0aGlzLnJlbW90ZVJlc291cmNlLCBmaWxlKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuYXR0cmlidXRlcyAmJiByZXNwb25zZS5kYXRhLmF0dHJpYnV0ZXMuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlWyd1cmwnXSA9IHJlc3BvbnNlLmRhdGEuYXR0cmlidXRlcy5kYXRhLnVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnlGaWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJlc3BvbnNlLmRhdGEuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmRhdGFbJ2xvYWRlZCddID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnlBdHRhY2htZW50cy5wdXNoKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghb2JzZXJ2YWJsZXMubGVuZ3RoICYmIHVuYWNjZXB0ZWRGaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9uRmlsZVNlbGVjdEVycm9yLmVtaXQoTmd0RHJvcHpvbmVFcnJvclR5cGUuVFlQRSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgIGZvcmtKb2luKG9ic2VydmFibGVzKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZFJlc291cmNlcy5wdXNoKC4uLnRlbXBvcmFyeUZpbGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNMaW1pdCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbk5hdGl2ZUNoYW5nZShbLi4udGVtcG9yYXJ5QXR0YWNobWVudHNdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbk5hdGl2ZUNoYW5nZShbLi4udGVtcG9yYXJ5QXR0YWNobWVudHMsIC4uLnRoaXMubmF0aXZlVmFsdWVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVVcGxvYWRlZC5lbWl0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuYWNjZXB0ZWRGaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdEVycm9yLmVtaXQoTmd0RHJvcHpvbmVFcnJvclR5cGUuVFlQRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCksIDUwMCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVVcGxvYWRGYWlsLmVtaXQoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCksIDUwMCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWRGaWxlUHJldmlldyhhdHRhY2htZW50czogYW55KSB7XG4gICAgICAgIGlmIChhdHRhY2htZW50cyAmJiBhdHRhY2htZW50cy5sZW5ndGggJiYgYXR0YWNobWVudHNbMF0pIHtcbiAgICAgICAgICAgIGxldCB0ZW1wb3JhcnlSZXNvdXJjZSA9IFtdO1xuICAgICAgICAgICAgbGV0IG9ic2VydmFibGVzID0gW107XG5cbiAgICAgICAgICAgIGF0dGFjaG1lbnRzLmZvckVhY2goKGF0dGFjaG1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBGaWxlKSAmJiAhYXR0YWNobWVudC5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50Wydsb2FkZWQnXSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2YWJsZXMucHVzaCh0aGlzLm5ndEF0dGFjaG1lbnRIdHRwU2VydmljZS5wcmV2aWV3KGF0dGFjaG1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYXJ5UmVzb3VyY2UucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcmVzcG9uc2UuZGF0YS5nZXRBcGlJZCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogcmVzcG9uc2UuZGF0YS5nZXRBdHRyaWJ1dGUoJ2ZpbGUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgIGZvcmtKb2luKG9ic2VydmFibGVzKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZFJlc291cmNlcy5wdXNoKC4uLnRlbXBvcmFyeVJlc291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25OYXRpdmVDaGFuZ2UoYXR0YWNobWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVQcmV2aWV3TG9hZGVkLmVtaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpLCA1MDApO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvblJlbW92ZShyZXNvdXJjZTogYW55KSB7XG4gICAgICAgIHRoaXMudXBsb2FkZWRSZXNvdXJjZXMuc3BsaWNlKHRoaXMudXBsb2FkZWRSZXNvdXJjZXMuaW5kZXhPZihyZXNvdXJjZSksIDEpO1xuICAgICAgICB0aGlzLm5hdGl2ZVZhbHVlID0gdGhpcy5uYXRpdmVWYWx1ZS5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50LmlkICE9IHJlc291cmNlLmlkKTtcbiAgICAgICAgdGhpcy5vbk5hdGl2ZUNoYW5nZSh0aGlzLm5hdGl2ZVZhbHVlKTtcbiAgICAgICAgdGhpcy5vbkZpbGVSZW1vdmVkLmVtaXQocmVzb3VyY2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0ltYWdlKHJlc291cmNlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJldmlld1R5cGUgPT0gJ0lNQUdFJ1xuICAgICAgICAgICAgfHwgKFxuICAgICAgICAgICAgICAgIHJlc291cmNlLmZpbGU/LnR5cGVcbiAgICAgICAgICAgICAgICAmJiByZXNvdXJjZS5maWxlLnR5cGUuaW5jbHVkZXMoJ2ltYWdlJylcbiAgICAgICAgICAgICAgICAmJiAhcmVzb3VyY2UuZmlsZS50eXBlLmluY2x1ZGVzKCdkd2cnKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNWaWRlbyhyZXNvdXJjZTogYW55KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXZpZXdUeXBlID09ICdWSURFTycgfHwgKHJlc291cmNlLmZpbGUgJiYgcmVzb3VyY2UuZmlsZS50eXBlICYmIHJlc291cmNlLmZpbGUudHlwZS5pbmNsdWRlcygndmlkZW8nKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQXVkaW8ocmVzb3VyY2U6IGFueSkge1xuICAgICAgICByZXR1cm4gKHJlc291cmNlLmZpbGUgJiYgcmVzb3VyY2UuZmlsZS50eXBlICYmIHJlc291cmNlLmZpbGUudHlwZS5pbmNsdWRlcygnYXVkaW8nKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRmlsZShyZXNvdXJjZTogYW55KSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0ltYWdlKHJlc291cmNlKSAmJiAhdGhpcy5pc0F1ZGlvKHJlc291cmNlKSAmJiAhdGhpcy5pc1ZpZGVvKHJlc291cmNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Rm9ybWF0dGVkRmlsZVNpemUocmVzb3VyY2U6IGFueSkge1xuICAgICAgICBpZiAocmVzb3VyY2UpIHtcbiAgICAgICAgICAgIGxldCBzaXplID0gcmVzb3VyY2Uuc2l6ZSB8fCByZXNvdXJjZS5maWxlU2l6ZTtcblxuICAgICAgICAgICAgaWYgKCFzaXplKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlLmZpbGUgJiYgcmVzb3VyY2UuZmlsZS5zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpemUgPSByZXNvdXJjZS5maWxlLnNpemU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGFyc2VGbG9hdChzaXplKSA+IDEwMDAwMDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHBhcnNlRmxvYXQoc2l6ZSkgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNYic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoc2l6ZSkgLyAxMDAwKSArICcgS2InO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uTmF0aXZlQ2hhbmdlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBbXTtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlVmFsdWUgPSBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlVmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXMudmFsdWUpICE9IEpTT04uc3RyaW5naWZ5KHRoaXMubmF0aXZlVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubmF0aXZlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2hhbmdlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmICF0aGlzLnZpZXdNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLm9uTmF0aXZlQ2hhbmdlKEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50UmVhZHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRGaWxlUHJldmlldyhBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZG93bmxvYWRGaWxlKGF0dGFjaG1lbnQ6IGFueSkge1xuICAgICAgICB0aGlzLm5ndEF0dGFjaG1lbnRIdHRwU2VydmljZS5kb3dubG9hZChhdHRhY2htZW50KS5zdWJzY3JpYmUoKCkgPT4geyB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMudXBsb2FkZWRSZXNvdXJjZXMgPSBbXTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFtdO1xuICAgICAgICB0aGlzLm5hdGl2ZVZhbHVlID0gW107XG4gICAgICAgIHRoaXMuaW5pdENvbXBvbmVudCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvcGVuRmlsZVNlbGVjdG9yKCkge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm5neEVsZW1lbnRJZCkuY2xpY2soKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5pc0Rpc2FibGVkQnlQYXJlbnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRDb21wb25lbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZXdNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpZXdUeXBlID0gTmd0RHJvcHpvbmVQcmV2aWV3VHlwZS5ERUZBVUxUO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mb3JtQ29udGFpbmVyICYmIHRoaXMuZm9ybUNvbnRhaW5lci5jb250cm9sXG4gICAgICAgICAgICAmJiAodGhpcy5mb3JtQ29udHJvbCA9IHRoaXMuZm9ybUNvbnRhaW5lci5jb250cm9sLmdldCh0aGlzLm5hbWUpKSkge1xuICAgICAgICAgICAgdGhpcy5yZXNldEZpbGVzTG9hZCgpO1xuICAgICAgICAgICAgdGhpcy5sb2FkRmlsZVByZXZpZXcoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/IHRoaXMudmFsdWUgOiBbdGhpcy52YWx1ZV0pO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9ucygpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldEZpbGVzTG9hZCgpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50Wydsb2FkZWQnXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVWYWxpZGF0aW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1Db250cm9sKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3luY1ZhbGlkYXRvcnMgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaCgpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHN5bmNWYWxpZGF0b3JzKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRGlzYWJsZWRCeVBhcmVudCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmd0Rm9ybT8uaXNEaXNhYmxlZFxuICAgICAgICAgICAgfHwgdGhpcy5uZ3RTZWN0aW9uPy5pc0Rpc2FibGVkXG4gICAgICAgICAgICB8fCB0aGlzLm5ndE1vZGFsPy5pc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveVN1YnNjcmlwdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGgtZnVsbCB3LWZ1bGxcIiAjY29udGFpbmVyPlxuICAgIDxsYWJlbCAqbmdJZj1cImxhYmVsXCIgY2xhc3M9XCJmbGV4IG1iLTIgdGV4dC1zbVwiPlxuICAgICAgICB7eyBsYWJlbCB9fTpcblxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtcmVkLTUwMCBmb250LWJvbGQgdGV4dC1tZCBtbC0xXCIgKm5nSWY9XCJpc1JlcXVpcmVkXCI+Kjwvc3Bhbj5cblxuICAgICAgICA8bmd0LWhlbHBlciAqbmdJZj1cImhlbHBUZXh0XCIgW2hlbHBUaXRsZV09XCJoZWxwVGl0bGVcIiBbaWNvbkNvbG9yXT1cImhlbHBUZXh0Q29sb3JcIiBjbGFzcz1cIm1sLTFcIj5cbiAgICAgICAgICAgIHt7IGhlbHBUZXh0IH19XG4gICAgICAgIDwvbmd0LWhlbHBlcj5cbiAgICA8L2xhYmVsPlxuXG4gICAgPGRpdiAqbmdJZj1cIiF2aWV3TW9kZVwiIGNsYXNzPVwiaC1mdWxsIHctZnVsbCByZWxhdGl2ZVwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwibG9hZGluZyAmJiAhaGlkZU5neERyb3B6b25lXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhYnNvbHV0ZSBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgdy1mdWxsIGgtZnVsbCBjdXJzb3Itd2FpdCB6LTEwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWxvYWRlclwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bmd4LWRyb3B6b25lIFtpZF09XCJuZ3hFbGVtZW50SWRcIiBbbXVsdGlwbGVdPSdtdWx0aXBsZVNlbGVjdGlvbicgW21heEZpbGVTaXplXT0nbWF4RmlsZVNpemUnXG4gICAgICAgICAgICAoY2hhbmdlKT0nb25TZWxlY3QoJGV2ZW50KScgW2NsYXNzLnNpbmdsZS1hdHRhY2htZW50XT0naXRlbXNMaW1pdCA9PSAxJyBbYWNjZXB0XT0nYWNjZXB0ZWRGaWxlcydcbiAgICAgICAgICAgIFtkaXNhYmxlZF09J2lzRGlzYWJsZWQoKSB8fCBsb2FkaW5nJyBbZXhwYW5kYWJsZV09J3ZlcnRpY2FsRXhwYW5kYWJsZSdcbiAgICAgICAgICAgIFtkaXNhYmxlQ2xpY2tdPSdkaXNhYmxlQ2xpY2sgfHwgZm9yY2VEaXNhYmxlQ2xpY2snIFtuZ1N0eWxlXT1cInsgJ2hlaWdodCc6IGRyb3B6b25lSGVpZ2h0IH1cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaGlkZGVuJzpoaWRlTmd4RHJvcHpvbmUgfVwiICNuZ3hEcm9wem9uZT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgIDxuZ3gtZHJvcHpvbmUtbGFiZWwgKm5nSWY9XCIhdXBsb2FkZWRSZXNvdXJjZXM/Lmxlbmd0aFwiIGNsYXNzPVwicHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBwbGFjZWhvbGRlciB9fVxuICAgICAgICAgICAgICAgIDwvbmd4LWRyb3B6b25lLWxhYmVsPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcmVzb3VyY2Ugb2YgdXBsb2FkZWRSZXNvdXJjZXM7IGxldCBpbmRleCA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctNDggbXgtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IHJlc291cmNlPy5maWxlPy5uYW1lIHx8ICcnIH19ICh7eyBnZXRGb3JtYXR0ZWRGaWxlU2l6ZShyZXNvdXJjZSkgfX0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Y3VzdG9tLWRyb3B6b25lLXByZXZpZXcgKm5nSWY9XCJwcmV2aWV3VHlwZSA9PSAnREVGQVVMVCcgJiYgaXNGaWxlKHJlc291cmNlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbGVdPSdyZXNvdXJjZS5maWxlJyBbcmVtb3ZhYmxlXT1cInJlbW92YWJsZVwiIChyZW1vdmVkKT1cIm9uUmVtb3ZlKHJlc291cmNlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRmlsZUNsaWNrKHJlc291cmNlLmZpbGUudXJsLCByZXNvdXJjZS5maWxlLm5hbWUsIHJlc291cmNlLmZpbGUuc2l6ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nUHJvamVjdEFzPVwibmd4LWRyb3B6b25lLXByZXZpZXdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvY3VzdG9tLWRyb3B6b25lLXByZXZpZXc+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0ltYWdlKHJlc291cmNlKVwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiaW1hZ2VQcmV2aWV3KGluZGV4KVwiICNnYWxsZXJ5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtZHJvcHpvbmUtaW1hZ2UtcHJldmlldyBjbGFzcz1cImltYWdlLXByZXZpZXctZGVmYXVsdC1jbGFzc1wiIFtmaWxlXT1cInJlc291cmNlLmZpbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVtb3ZhYmxlXT1cInJlbW92YWJsZVwiIChyZW1vdmVkKT1cIm9uUmVtb3ZlKHJlc291cmNlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LWRyb3B6b25lLWltYWdlLXByZXZpZXc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1kcm9wem9uZS12aWRlby1wcmV2aWV3ICpuZ0lmPVwiaXNWaWRlbyhyZXNvdXJjZSkgfHwgaXNBdWRpbyhyZXNvdXJjZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWxlXT1cInJlc291cmNlLmZpbGVcIiBbcmVtb3ZhYmxlXT1cInJlbW92YWJsZVwiIChyZW1vdmVkKT1cIm9uUmVtb3ZlKHJlc291cmNlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtZHJvcHpvbmUtdmlkZW8tcHJldmlldz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJzaG93RmlsZU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIHRydW5jYXRlIHRleHQtZ3JheS01MDAgdGV4dC1jZW50ZXIgdGV4dC1zbSBmb250LW1vbm8gbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJlc291cmNlPy5maWxlPy5uYW1lIHx8ICcnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmd4LWRyb3B6b25lPlxuICAgIDwvZGl2PlxuXG4gICAgPG5ndC1kcm9wem9uZS12aWV3ICpuZ0lmPVwidmlld01vZGVcIiBjbGFzcz1cImgtZnVsbCB3LWZ1bGxcIiBbcmVzb3VyY2VzXT1cInJlc291cmNlc1wiIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiBbZHJvcHpvbmVIZWlnaHRdPVwiZHJvcHpvbmVIZWlnaHRcIlxuICAgICAgICAob25GaWxlQ2xpY2spPVwib25GaWxlQ2xpY2soJGV2ZW50LnByZXZpZXdVcmwsICRldmVudC5uYW1lLCAkZXZlbnQuZmlsZVNpemUpXCJcbiAgICAgICAgKG9uSW1hZ2VDbGljayk9XCJvbkltYWdlQ2xpY2soJGV2ZW50LmRpdiwgJGV2ZW50LmluZGV4KVwiPlxuICAgIDwvbmd0LWRyb3B6b25lLXZpZXc+XG5cbiAgICA8bmd0LWRyb3B6b25lLWZpbGUtdmlld2VyIFtoaWRkZW5dPVwiIXNob3dOZ3REcm9wem9uZUZpbGVWaWV3ZXJcIiAob25DbG9zZSk9XCJmb3JjZURpc2FibGVDbGljayA9IGZhbHNlXCJcbiAgICAgICAgW2NhbkRvd25sb2FkRmlsZV09XCJjYW5Eb3dubG9hZEZpbGVcIiBbZGlzYWJsZUNvbnRlbnRdPVwiY2FuRG93bmxvYWRGaWxlID8gJ25vbmUnIDogJ3BvcG91dCdcIj5cbiAgICA8L25ndC1kcm9wem9uZS1maWxlLXZpZXdlcj5cblxuICAgIDxpbnB1dCAqbmdJZj0nY29tcG9uZW50UmVhZHknIHR5cGU9XCJoaWRkZW5cIiBbbmdNb2RlbF09XCJ2YWx1ZVwiIFtuYW1lXT1cIm5hbWVcIiBbdmFsdWVdPVwidmFsdWVcIj5cbiAgICA8bmd0LXZhbGlkYXRpb24gW2NvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIiBbY29udGFpbmVyXT1cImZvcm1Db250YWluZXJcIj48L25ndC12YWxpZGF0aW9uPlxuPC9kaXY+Il19