bpm-core 0.0.105 → 0.0.106

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 (131) hide show
  1. package/fesm2022/bpm-core.mjs +248 -256
  2. package/fesm2022/bpm-core.mjs.map +1 -1
  3. package/lib/components/shared-components/form-field/checkbox/checkbox.component.d.ts +2 -1
  4. package/lib/components/shared-components/form-field/control-value-accessor.directive.d.ts +1 -1
  5. package/lib/components/shared-components/form-field/doc-uploader/docs-uploader.component.d.ts +2 -1
  6. package/lib/components/shared-components/form-field/shared-imports.d.ts +1 -1
  7. package/lib/components/shared-components/form-field/textarea/special-chars.directive.d.ts +1 -1
  8. package/lib/components/shared-components/title-section/title-section.component.d.ts +1 -1
  9. package/lib/pipes/currency.pipe.d.ts +1 -1
  10. package/lib/pipes/format-as-password.pipe.d.ts +1 -1
  11. package/lib/validators/string-to-boolean.pipe.d.ts +1 -1
  12. package/lib/validators/text.directive.d.ts +1 -1
  13. package/lib/validators/timer.pipe.d.ts +1 -1
  14. package/package.json +2 -4
  15. package/esm2022/bpm-core.mjs +0 -5
  16. package/esm2022/lib/app/app.component.mjs +0 -79
  17. package/esm2022/lib/classes/form-validation.mjs +0 -80
  18. package/esm2022/lib/classes/index.mjs +0 -2
  19. package/esm2022/lib/components/app-component-sections/activities/activities.component.mjs +0 -44
  20. package/esm2022/lib/components/app-component-sections/approvals/approvals.component.mjs +0 -23
  21. package/esm2022/lib/components/app-component-sections/approvals-workflow/approvals-workflow.component.mjs +0 -113
  22. package/esm2022/lib/components/app-component-sections/faq-sidenav/faq-sidenav.component.mjs +0 -25
  23. package/esm2022/lib/components/app-component-sections/faqs/faqs.component.mjs +0 -27
  24. package/esm2022/lib/components/app-component-sections/faqs/index.mjs +0 -2
  25. package/esm2022/lib/components/app-component-sections/feedback-section/feedback-section.component.mjs +0 -237
  26. package/esm2022/lib/components/app-component-sections/form-section/form-section.component.mjs +0 -255
  27. package/esm2022/lib/components/app-component-sections/index.mjs +0 -9
  28. package/esm2022/lib/components/app-component-sections/layout/header/header.component.mjs +0 -79
  29. package/esm2022/lib/components/app-component-sections/layout/layout.component.mjs +0 -89
  30. package/esm2022/lib/components/app-component-sections/layout/side-nav/side-nav.component.mjs +0 -158
  31. package/esm2022/lib/components/app-component-sections/main-request-details/main-request-details.component.mjs +0 -34
  32. package/esm2022/lib/components/app-component-sections/previous-requests/previous-requests.component.mjs +0 -345
  33. package/esm2022/lib/components/app-component-sections/profile-section/profile-section.component.mjs +0 -45
  34. package/esm2022/lib/components/app-component-sections/service-header/service-header.component.mjs +0 -271
  35. package/esm2022/lib/components/app-component-sections/status/status.component.mjs +0 -38
  36. package/esm2022/lib/components/app-component-sections/workflow-section/workflow-section.component.mjs +0 -164
  37. package/esm2022/lib/components/shared-components/action-buttons/action-buttons.component.mjs +0 -138
  38. package/esm2022/lib/components/shared-components/dialogs/confirm-dialog/confirm-dialog.component.mjs +0 -30
  39. package/esm2022/lib/components/shared-components/dialogs/delete-dialog/delete-dialog.component.mjs +0 -29
  40. package/esm2022/lib/components/shared-components/dialogs/submit-dialog/submit-dialog.component.mjs +0 -67
  41. package/esm2022/lib/components/shared-components/form-field/add-attachment-section/add-attachment-section.component.mjs +0 -138
  42. package/esm2022/lib/components/shared-components/form-field/attachment-section/attachment-section.component.mjs +0 -234
  43. package/esm2022/lib/components/shared-components/form-field/base-component/base-component.component.mjs +0 -198
  44. package/esm2022/lib/components/shared-components/form-field/checkbox/checkbox.component.mjs +0 -91
  45. package/esm2022/lib/components/shared-components/form-field/control-value-accessor.directive.mjs +0 -185
  46. package/esm2022/lib/components/shared-components/form-field/custom-searchable-autocomplete/custom-searchable.component.mjs +0 -131
  47. package/esm2022/lib/components/shared-components/form-field/date-picker/date-format.mjs +0 -31
  48. package/esm2022/lib/components/shared-components/form-field/date-picker/date-picker.component.mjs +0 -175
  49. package/esm2022/lib/components/shared-components/form-field/date-range-picker/date-range-picker.component.mjs +0 -186
  50. package/esm2022/lib/components/shared-components/form-field/doc-uploader/docs-uploader.component.mjs +0 -525
  51. package/esm2022/lib/components/shared-components/form-field/form-label/form-label.component.mjs +0 -33
  52. package/esm2022/lib/components/shared-components/form-field/index.mjs +0 -26
  53. package/esm2022/lib/components/shared-components/form-field/info-item/info-item.component.mjs +0 -76
  54. package/esm2022/lib/components/shared-components/form-field/input/input.component.mjs +0 -71
  55. package/esm2022/lib/components/shared-components/form-field/input-autocomplete/index.mjs +0 -3
  56. package/esm2022/lib/components/shared-components/form-field/input-autocomplete/input-autocomplete.model.mjs +0 -2
  57. package/esm2022/lib/components/shared-components/form-field/input-currency/input-currency.component.mjs +0 -73
  58. package/esm2022/lib/components/shared-components/form-field/input-email/input-email.component.mjs +0 -69
  59. package/esm2022/lib/components/shared-components/form-field/input-mask/input-mask.component.mjs +0 -61
  60. package/esm2022/lib/components/shared-components/form-field/input-number/input-number.component.mjs +0 -74
  61. package/esm2022/lib/components/shared-components/form-field/input-telephone/input-telephone.component.mjs +0 -85
  62. package/esm2022/lib/components/shared-components/form-field/radio/radio.component.mjs +0 -52
  63. package/esm2022/lib/components/shared-components/form-field/repeated-list/repeated-list.component.mjs +0 -32
  64. package/esm2022/lib/components/shared-components/form-field/search-employee/search-employee.component.mjs +0 -192
  65. package/esm2022/lib/components/shared-components/form-field/select/select.component.mjs +0 -191
  66. package/esm2022/lib/components/shared-components/form-field/shared-imports.mjs +0 -36
  67. package/esm2022/lib/components/shared-components/form-field/table-list/table-list.component.mjs +0 -116
  68. package/esm2022/lib/components/shared-components/form-field/textarea/special-chars.directive.mjs +0 -39
  69. package/esm2022/lib/components/shared-components/form-field/textarea/textarea.component.mjs +0 -57
  70. package/esm2022/lib/components/shared-components/form-field/toggle-button/toggle-button.component.mjs +0 -90
  71. package/esm2022/lib/components/shared-components/form-field/validation-errors/validation-errors.component.mjs +0 -43
  72. package/esm2022/lib/components/shared-components/index.mjs +0 -9
  73. package/esm2022/lib/components/shared-components/table/table.component.mjs +0 -243
  74. package/esm2022/lib/components/shared-components/terms-conditions/terms-conditions.component.mjs +0 -31
  75. package/esm2022/lib/components/shared-components/title-section/title-section.component.mjs +0 -31
  76. package/esm2022/lib/constants/constants.mjs +0 -149
  77. package/esm2022/lib/constants/index.mjs +0 -2
  78. package/esm2022/lib/directives/ar.directive.mjs +0 -54
  79. package/esm2022/lib/directives/currency.directive.mjs +0 -92
  80. package/esm2022/lib/directives/en.directive.mjs +0 -51
  81. package/esm2022/lib/directives/number.directive.mjs +0 -68
  82. package/esm2022/lib/directives/skip-location.directive.mjs +0 -28
  83. package/esm2022/lib/enums/actions.enum.mjs +0 -22
  84. package/esm2022/lib/enums/colors.enum.mjs +0 -6
  85. package/esm2022/lib/enums/events.enum.mjs +0 -6
  86. package/esm2022/lib/functions/data-to-blob.mjs +0 -12
  87. package/esm2022/lib/functions/encode-password.mjs +0 -14
  88. package/esm2022/lib/functions/handel-error-response.mjs +0 -12
  89. package/esm2022/lib/functions/index.mjs +0 -5
  90. package/esm2022/lib/functions/is-valid-data.mjs +0 -42
  91. package/esm2022/lib/helpers/shared.helper.mjs +0 -26
  92. package/esm2022/lib/hooks/index.mjs +0 -3
  93. package/esm2022/lib/hooks/load-form.mjs +0 -13
  94. package/esm2022/lib/hooks/save-form.mjs +0 -18
  95. package/esm2022/lib/i18n/ar.mjs +0 -200
  96. package/esm2022/lib/i18n/en.mjs +0 -204
  97. package/esm2022/lib/i18n/index.mjs +0 -3
  98. package/esm2022/lib/interfaces/action.interface.mjs +0 -2
  99. package/esm2022/lib/interfaces/api-response.interface.mjs +0 -2
  100. package/esm2022/lib/interfaces/document-file.interface.mjs +0 -2
  101. package/esm2022/lib/interfaces/form-items.interface.mjs +0 -2
  102. package/esm2022/lib/interfaces/form.interface.mjs +0 -150
  103. package/esm2022/lib/interfaces/igate-user.interface.mjs +0 -2
  104. package/esm2022/lib/interfaces/index.mjs +0 -8
  105. package/esm2022/lib/interfaces/lov-list.interface.mjs +0 -2
  106. package/esm2022/lib/interfaces/lov.interface.mjs +0 -2
  107. package/esm2022/lib/interfaces/shared.interface.mjs +0 -2
  108. package/esm2022/lib/pipes/currency.pipe.mjs +0 -66
  109. package/esm2022/lib/pipes/format-as-password.pipe.mjs +0 -19
  110. package/esm2022/lib/pipes/index.mjs +0 -3
  111. package/esm2022/lib/pipes/status-style.pipe.mjs +0 -57
  112. package/esm2022/lib/pipes/translate.pipe.mjs +0 -36
  113. package/esm2022/lib/regex/index.mjs +0 -2
  114. package/esm2022/lib/regex/regex-patterns.mjs +0 -4
  115. package/esm2022/lib/services/action.service.ts.mjs +0 -25
  116. package/esm2022/lib/services/core.service.ts.mjs +0 -527
  117. package/esm2022/lib/services/feedBack.service.mjs +0 -81
  118. package/esm2022/lib/services/i18n.service.mjs +0 -36
  119. package/esm2022/lib/services/index.mjs +0 -6
  120. package/esm2022/lib/services/sidenav.service.mjs +0 -36
  121. package/esm2022/lib/testComponent/config/segment-dynamic-loader.config.mjs +0 -8
  122. package/esm2022/lib/testComponent/general-approver-section/general-approver-section.component.mjs +0 -90
  123. package/esm2022/lib/testComponent/request-details-section/request-details-section.component.mjs +0 -482
  124. package/esm2022/lib/testComponent/services/i18n.service.mjs +0 -39
  125. package/esm2022/lib/testComponent/services/segment-dynamic-loader.service.mjs +0 -54
  126. package/esm2022/lib/validators/id.validator.mjs +0 -66
  127. package/esm2022/lib/validators/index.mjs +0 -8
  128. package/esm2022/lib/validators/string-to-boolean.pipe.mjs +0 -16
  129. package/esm2022/lib/validators/text.directive.mjs +0 -50
  130. package/esm2022/lib/validators/timer.pipe.mjs +0 -19
  131. package/esm2022/public-api.mjs +0 -19
@@ -1,525 +0,0 @@
1
- import { DeleteDialogComponent } from '../../dialogs/delete-dialog/delete-dialog.component';
2
- import { NoopScrollStrategy } from '@angular/cdk/overlay';
3
- import { Component, CUSTOM_ELEMENTS_SCHEMA, DestroyRef, EventEmitter, forwardRef, inject, Input, Output, ViewChild } from '@angular/core';
4
- import * as FileSaver from 'file-saver';
5
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
6
- import { NgClass, NgTemplateOutlet } from "@angular/common";
7
- import { MatError, MatHint } from "@angular/material/form-field";
8
- import { ControlValueAccessorDirective } from '../control-value-accessor.directive';
9
- import { MatDialog } from '@angular/material/dialog';
10
- import { MatTooltip } from "@angular/material/tooltip";
11
- import { FormLabelComponent } from '../form-label/form-label.component';
12
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
13
- import { TranslatePipe } from "../../../../pipes/translate.pipe";
14
- import * as i0 from "@angular/core";
15
- export class DocsUploaderComponent extends ControlValueAccessorDirective {
16
- maxSizeFlag = true;
17
- maxSizeValue;
18
- wrongExtensionFlag = true;
19
- useCrop;
20
- formKey;
21
- showLabel = true;
22
- downloadLink = false;
23
- showActions = true;
24
- styleHeight = ''; // medium, mini
25
- fileInputHeight = ''; // medium, mini
26
- styleWidth = '6';
27
- hints;
28
- allowedExtensions = '';
29
- callApi = true;
30
- display = '';
31
- validExtension = true;
32
- attachType = '';
33
- error;
34
- displayedFiles = [];
35
- selectedTemplateAttachment = new EventEmitter();
36
- fileNotDuplicated = true;
37
- allowedFileSize = true;
38
- getDataFromTemplate = false;
39
- allowFileContentsWithMultiAttachments = false;
40
- accept;
41
- filesize;
42
- wrongFile = {
43
- mimeType: "",
44
- fileContents: "",
45
- fileName: this.i18n.language == 'ar' ? "امتداد الملف خاطىء" : "Wrong File Extension",
46
- name: this.i18n.language == 'ar' ? "امتداد الملف خاطىء" : "Wrong File Extension"
47
- };
48
- allAttachments = [];
49
- uploadForm;
50
- signType = 'Sign';
51
- customDownload;
52
- showSignButton = false;
53
- printType = 'Print';
54
- showPrintButton = false;
55
- downloadType = 'Download';
56
- showDownloadButton = false;
57
- preventFileContents = false;
58
- addSignatureClicked = new EventEmitter();
59
- printActionClicked = new EventEmitter();
60
- emitedValue = new EventEmitter();
61
- downloadActionClicked = new EventEmitter();
62
- maxSize = '10';
63
- inputFile;
64
- dialog = inject(MatDialog);
65
- destroyRef = inject(DestroyRef);
66
- validImageTypes = {
67
- jpg: ['image/jpeg', 'image/pjpeg'],
68
- JPG: ['image/jpeg', 'image/pjpeg'],
69
- jpeg: ['image/jpeg', 'image/pjpeg'],
70
- png: ['image/png']
71
- };
72
- validImgPdfTypes = {
73
- pdf: ['application/pdf'],
74
- jpg: ['image/jpeg', 'image/pjpeg'],
75
- JPG: ['image/jpeg', 'image/pjpeg'],
76
- jpeg: ['image/jpeg', 'image/pjpeg'],
77
- bmp: ['image/bmp', 'image/x-windows-bmp'],
78
- png: ['image/png']
79
- };
80
- validFileTypes = {
81
- 'pdf': ['application/pdf'],
82
- 'doc': ['application/msword'],
83
- 'docx': ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'],
84
- 'ppt': ['application/vnd.ms-powerpoint'],
85
- 'pptx': ['application/vnd.openxmlformats-officedocument.presentationml.presentation'],
86
- 'pps': ['application/vnd.ms-powerpoint'],
87
- 'ppsx': ['application/vnd.openxmlformats-officedocument.presentationml.slideshow'],
88
- 'odt': ['application/vnd.oasis.opendocument.text'],
89
- 'xls': ['application/vnd.ms-excel'],
90
- 'xlsx': ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
91
- 'zip': ['application/zip', 'application/x-zip-compressed', 'multipart/x-zip', 'application/zip'],
92
- 'msg': ['application/vnd.ms-outlook', 'application/msg'],
93
- 'csv': ['text/csv'],
94
- 'txt': ['text/plain'],
95
- 'rtf': ['application/rtf', 'application/x-rtf', 'text/richtext'],
96
- 'html': ['text/html'],
97
- // 'mp4': ['video/mp4'],
98
- // 'm4v': ['video/mp4'],
99
- 'mov': ['video/quicktime'],
100
- 'wmv': ['video/x-ms-wmv'],
101
- // 'avi': ['video/x-msvideo'],
102
- 'mpg': ['mpg'],
103
- 'rmvb': ['rmvb'],
104
- // 'ogv': ['video/ogg'],
105
- // '3gp': ['video/3gpp', 'audio/3gpp'],
106
- // '3g2': ['video/3gpp2', 'audio/3gpp'],
107
- 'jpg': ['image/jpeg', 'image/pjpeg'],
108
- 'jpeg': ['image/jpeg', 'image/pjpeg'],
109
- 'png': ['image/png'],
110
- 'gif': ['image/gif'],
111
- 'bmp': ['image/bmp', 'image/x-windows-bmp']
112
- };
113
- validPdfTypes = {
114
- 'pdf': ['application/pdf'],
115
- };
116
- uploading;
117
- lengthError;
118
- ngOnChanges(changes) {
119
- if (this.attachments?.length) {
120
- this.allAttachments = [...this.attachments];
121
- }
122
- }
123
- ngOnInit() {
124
- super.ngOnInit();
125
- this.actionStateService.resetAction$
126
- .pipe(takeUntilDestroyed(this.destroyRef))
127
- .subscribe(res => {
128
- if (!this.isReadOnly && this.control.enabled) {
129
- this.control.reset();
130
- // if (this.required) {
131
- // this.control.setValidators(this.Validators.required)
132
- // } else {
133
- // this.control.setValidators(null)
134
- // }
135
- }
136
- });
137
- }
138
- getFileType(attachment) {
139
- if (!attachment.fileName?.includes('.') && attachment.mimeType.includes('.')) {
140
- return this.checkFileType(attachment.mimeType);
141
- }
142
- else if (attachment.fileName) {
143
- return this.checkFileType(attachment.fileName);
144
- }
145
- else {
146
- return attachment.mimeType;
147
- }
148
- }
149
- checkFileType(attachmentData) {
150
- if (attachmentData.split('.').pop() == 'msg') {
151
- return 'email-icon';
152
- }
153
- else if (attachmentData.split('.').pop() == 'jpeg') {
154
- return 'jpg';
155
- }
156
- else if (attachmentData.split('.').pop() == 'xlsx' || attachmentData.split('.').pop() == 'xls') {
157
- return 'application/vnd.ms-excel;charset=utf-8';
158
- }
159
- return attachmentData.split('.').pop();
160
- }
161
- attachmentAction(type, index, field) {
162
- if (type == "download") {
163
- if (this.downloadLink) {
164
- window.open(field?.attachmentId, '_blank', 'top=0,left=0,height=auto,width=auto');
165
- }
166
- else if (field?.attachmentId) {
167
- this.downloadFile(type, field);
168
- }
169
- else if (field?.fileContents) {
170
- this.downloadFileNew(field);
171
- }
172
- }
173
- if (type == "delete") {
174
- if (this.validExtension) {
175
- if (this.multiple) {
176
- this.confirmDelete(index);
177
- }
178
- else {
179
- this.removeAttachedFile();
180
- }
181
- }
182
- else {
183
- this.validExtension = true;
184
- }
185
- }
186
- }
187
- confirmDelete(index) {
188
- const dialogRef = this.dialog.open(DeleteDialogComponent, {
189
- panelClass: ['main-popup', 'confirm-dialog'],
190
- scrollStrategy: new NoopScrollStrategy(),
191
- });
192
- dialogRef.afterClosed().subscribe((returnValue) => {
193
- if (returnValue == 'yes') {
194
- this.removeMulti(index);
195
- }
196
- });
197
- }
198
- removeMulti(index) {
199
- this.displayedFiles.splice(index, 1);
200
- this.allAttachments.splice(index, 1);
201
- }
202
- downloadFileNew(fileData) {
203
- const fileType = this.getFileType(fileData);
204
- const blob = new Blob([fileData.fileContents], { type: fileType });
205
- FileSaver.saveAs(blob, `${fileData.fileName}`);
206
- }
207
- onValueChange(event) {
208
- const input = event.target;
209
- this.control.reset();
210
- if (input?.files?.length > 0) {
211
- this.handleFileInput(input);
212
- this.processUploadedFile(input);
213
- }
214
- }
215
- handleFileInput(input) {
216
- if (input.files && this.formKey === 'TSV') {
217
- this.selectedTemplateAttachment.emit(input.files[0]);
218
- }
219
- const file = input.files[0];
220
- let fileType = file.name?.endsWith(".msg") ? 'application/vnd.ms-outlook' : file.type;
221
- if (this.accept?.length && !this.accept.includes(fileType)) {
222
- alert(this.i18n.translate('thisIsInvalidFile'));
223
- return;
224
- }
225
- this.uploadForm?.get('file')?.setValue(file);
226
- this.uploadForm?.get('name')?.setValue(file?.name);
227
- }
228
- processUploadedFile(input) {
229
- if (!this.uploading) {
230
- const fileData = new FileInfo(input.files[0].name, input.files[0].name, input.files[0].type, '', this.filesize);
231
- this.updateFileProperties(input, fileData);
232
- if (!this.lengthError && +this.filesize < +this.maxSize) {
233
- this.allowedFileSize = true;
234
- this.uploadValidAndNonDuplicateFile(input, fileData);
235
- }
236
- else {
237
- this.allowedFileSize = false;
238
- }
239
- input.value = '';
240
- }
241
- }
242
- updateFileProperties(input, fileInfo) {
243
- this.maxSizeValue = this.maxSize ? this.maxSize : 1;
244
- this.filesize = ((input.files[0].size / 1024) / 1024).toFixed(4);
245
- this.maxSizeFlag = +this.filesize < +this.maxSize;
246
- this.lengthError = this.displayedFiles?.length >= +this.maxLength;
247
- this.wrongExtensionFlag = this.isValidMimeType(input.files[0].type);
248
- this.validExtension = this.isValidExtension(input.files[0].name.split('.').pop(), this.type);
249
- this.value = fileInfo;
250
- }
251
- uploadValidAndNonDuplicateFile(input, fileData) {
252
- if (this.validExtension) {
253
- if (this.getDataFromTemplate)
254
- this.selectedTemplateAttachment.emit(input);
255
- this.readFileAndUpload(input.files[0], fileData);
256
- }
257
- else if (!this.multiple) {
258
- this.emitEmptyFile();
259
- }
260
- }
261
- readFileAndUpload(file, fileInfo) {
262
- const reader = new FileReader();
263
- reader.onload = () => {
264
- const fileContents = reader.result.split(',')[1];
265
- fileInfo.fileContents = fileContents;
266
- fileInfo.filesize = this.filesize;
267
- if (!this.multiple) {
268
- this.uploadSingleFile(fileContents, fileInfo);
269
- }
270
- else if (this.isFileNotDuplicate(fileInfo)) {
271
- this.addMultiAttachments(fileInfo);
272
- }
273
- };
274
- reader.readAsDataURL(file);
275
- }
276
- uploadSingleFile(fileContents, fileInfo) {
277
- this.fileNotDuplicated = this.isFileNotDuplicate(fileInfo);
278
- if (!this.fileNotDuplicated) {
279
- return;
280
- }
281
- this.value.fileContents = fileContents;
282
- this.control.setValue(this.value);
283
- this.emitedValue.emit(this.value);
284
- if (this.callApi) {
285
- this.addAttachments();
286
- }
287
- else {
288
- this.selectedTemplateAttachment.emit(this.value);
289
- }
290
- }
291
- emitEmptyFile() {
292
- const emptyObj = {
293
- mimeType: "",
294
- fileContents: "",
295
- fileName: "",
296
- };
297
- this.emit(emptyObj);
298
- this.selectedTemplateAttachment.emit(null);
299
- }
300
- processAttachments(field, allowMultiAttachments) {
301
- const data = {
302
- "fileDescription": "",
303
- "attachmentcomment": "",
304
- "fileName": field.fileName,
305
- "mimeType": field.mimeType,
306
- "fileContents": field.fileContents,
307
- };
308
- this.uploading = true;
309
- this.coreService.getAttachments(data).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
310
- next: (form) => {
311
- const newObj = {
312
- "fileName": field.fileName,
313
- "attachmentId": form.attachment.attachmentId,
314
- "mimeType": form.attachment.mimeType,
315
- "fileContents": field.fileContents
316
- };
317
- if (allowMultiAttachments) {
318
- if (this.allowFileContentsWithMultiAttachments)
319
- newObj['fileContents'] = field.fileContents;
320
- this.displayedFiles = this.displayedFiles?.length ? this.displayedFiles : [];
321
- this.displayedFiles.push(newObj);
322
- this.allAttachments.push(newObj);
323
- this.emit(this.displayedFiles);
324
- this.control.setValue(this.displayedFiles);
325
- }
326
- else {
327
- this.control.setValue(newObj);
328
- this.emitedValue.emit(newObj);
329
- }
330
- this.uploading = false;
331
- },
332
- error: (err) => {
333
- this.uploading = false;
334
- err?.error?.meta?.messages?.forEach((msg) => {
335
- this.toasterService.error(msg.message);
336
- });
337
- }
338
- });
339
- }
340
- addAttachments() {
341
- this.processAttachments(this.control.value, false);
342
- }
343
- addMultiAttachments(field) {
344
- this.processAttachments(field, true);
345
- }
346
- isFileNotDuplicate(file) {
347
- if (this.allAttachments?.length) {
348
- return this.allAttachments?.findIndex(($file) => (file.fileName === $file.fileName)) === -1;
349
- }
350
- else {
351
- return true;
352
- }
353
- }
354
- isValidMimeType(value) {
355
- if (this.attachType == 'pdf') {
356
- return [].concat(...Object.values(this.validPdfTypes)).includes(value);
357
- }
358
- else if (this.attachType == 'image') {
359
- return [].concat(...Object.values(this.validImageTypes)).includes(value);
360
- }
361
- else {
362
- return true;
363
- }
364
- }
365
- isValidExtension(value, type) {
366
- if (type == 'image') {
367
- return [].concat(...Object.keys(this.validImageTypes)).includes(value.toLowerCase());
368
- }
369
- else if (type == "imagePdf") {
370
- return [].concat(...Object.keys(this.validImgPdfTypes)).includes(value.toLowerCase());
371
- }
372
- else if (type === "pdf") {
373
- return [].concat(...Object.keys(this.validPdfTypes)).includes(value.toLowerCase());
374
- }
375
- else {
376
- return [].concat(...Object.keys(this.validFileTypes)).includes(value.toLowerCase());
377
- }
378
- }
379
- removeAttachedFile() {
380
- this.control.setValue(new FileInfo(null, null, null, null, null));
381
- if (this.inputFile) {
382
- this.inputFile.nativeElement.value = null;
383
- }
384
- this.emit(this.value);
385
- this.control.reset();
386
- this.selectedTemplateAttachment.emit(null);
387
- }
388
- downloadFile(event, field) {
389
- if (this.customDownload) {
390
- this.downloadActionClicked.emit(field);
391
- }
392
- else {
393
- this.coreService.loadFile(field.attachmentId).pipe(takeUntilDestroyed(this.destroyRef)).subscribe((responseObject) => {
394
- const fileInformation = responseObject.body;
395
- this.coreService.saveFile(fileInformation);
396
- }, error => {
397
- this.toasterService.error(error.error?.['message']);
398
- });
399
- }
400
- }
401
- emit(value) {
402
- if (this.preventFileContents) {
403
- value = JSON.parse(JSON.stringify(value));
404
- this.deleteFileContents(value);
405
- }
406
- }
407
- deleteFileContents(data) {
408
- if (typeof data === 'object' && 'fileContents' in data) {
409
- delete data.fileContents;
410
- }
411
- else if (Array.isArray(data)) {
412
- data.forEach(elem => this.deleteFileContents(elem));
413
- }
414
- }
415
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: DocsUploaderComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
416
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: DocsUploaderComponent, isStandalone: true, selector: "app-file-uploader", inputs: { useCrop: "useCrop", formKey: "formKey", showLabel: "showLabel", downloadLink: "downloadLink", showActions: "showActions", styleHeight: "styleHeight", fileInputHeight: "fileInputHeight", styleWidth: "styleWidth", hints: "hints", allowedExtensions: "allowedExtensions", callApi: "callApi", display: "display", attachType: "attachType", error: "error", displayedFiles: "displayedFiles", getDataFromTemplate: "getDataFromTemplate", allowFileContentsWithMultiAttachments: "allowFileContentsWithMultiAttachments", accept: "accept", allAttachments: "allAttachments", signType: "signType", customDownload: "customDownload", showSignButton: "showSignButton", printType: "printType", showPrintButton: "showPrintButton", downloadType: "downloadType", showDownloadButton: "showDownloadButton", preventFileContents: "preventFileContents", maxSize: "maxSize" }, outputs: { selectedTemplateAttachment: "selectedTemplateAttachment", addSignatureClicked: "addSignatureClicked", printActionClicked: "printActionClicked", emitedValue: "emitedValue", downloadActionClicked: "downloadActionClicked" }, providers: [
417
- {
418
- provide: NG_VALUE_ACCESSOR,
419
- useExisting: forwardRef(() => DocsUploaderComponent),
420
- multi: true,
421
- },
422
- ], viewQueries: [{ propertyName: "inputFile", first: true, predicate: ["inputFile"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if (!isReadOnly) {\r\n <ng-container>\r\n @if(label) {\r\n <app-form-label [label]=\"label\" [optional]=\"required || mandatory ? false : true\" [tooltip]=\"tooltip\"></app-form-label>\r\n }\r\n <section\r\n (click)=\"fileAttached.click()\"\r\n [ngClass]=\"insideTable ? 'file-uploader-table' : 'file-uploader'\" class=\" mb-2\"\r\n [class.insideTableStyle]=\"insideTable\">\r\n <div\r\n [ngClass]=\"insideTable ? 'file-uploader-table-dev' : ''\" class=\"file-uploader-input\"\r\n >\r\n @if (!uploading) {\r\n <div class=\"icon mb-1\">\r\n <svg\r\n [ngClass]=\"insideTable ? 'file-uploader-table-svg' : ''\" width=\"41\" height=\"38\" viewBox=\"0 0 41 38\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0 22.1947V20.6736C0.0971303 20.1019 0.070094 19.5141 0.276371 18.9533C1.28372 16.2086 3.21231 14.5023 6.0421 13.8094C6.70499 13.6472 6.68497 13.6632 6.69899 12.9843C6.73203 11.3321 6.99839 9.71992 7.62423 8.17986C8.86289 5.13678 10.9467 2.83969 13.8816 1.39175C17.168 -0.230424 20.5956 -0.450719 24.0553 0.81598C27.4929 2.07467 29.9622 4.41581 31.4802 7.74828C31.7786 8.40316 32.027 9.08307 32.1712 9.79202C32.2402 10.1315 32.4035 10.2566 32.7529 10.3107C36.7012 10.9165 39.3358 13.1255 40.6946 16.8735C40.9069 17.4603 40.9199 18.0731 40.9599 18.6829C40.9649 18.7601 40.9389 18.8442 41 18.9113V20.5124C40.9109 20.995 40.969 21.4937 40.8608 21.9734C40.5244 23.4614 39.8454 24.7821 38.8501 25.9297C37.4522 27.5418 35.7059 28.5882 33.6161 29.0519C32.791 29.2351 31.9499 29.2521 31.1117 29.2922C30.6571 29.3142 30.584 29.193 30.592 28.7484C30.6451 25.8446 29.802 23.2571 27.8624 21.0591C25.9979 18.9463 23.6597 17.7167 20.867 17.4012C18.8553 17.1739 16.9057 17.4593 15.0612 18.3395C11.8319 19.8816 9.81416 22.4069 8.96102 25.8696C8.74273 26.7538 8.68265 27.658 8.70568 28.5702C8.7217 29.2111 8.60254 29.3122 7.95968 29.2972C5.95098 29.2511 4.10551 28.7234 2.58146 27.3596C1.07644 26.0168 0.0680913 24.3996 0.0400537 22.3028C0.0400537 22.2607 0.0250336 22.2257 0 22.1937V22.1947Z\"\r\n fill=\"#DEE0E2\"/>\r\n <path\r\n d=\"M29.0303 28.2632C29.0604 33.4031 24.8657 37.6187 19.6838 37.6548C14.5169 37.6908 10.2852 33.4952 10.2521 28.3042C10.2201 23.1403 14.4297 18.9126 19.6227 18.8946C24.8037 18.8766 28.9993 23.0542 29.0303 28.2632Z\"\r\n fill=\"#8E9AA0\"/>\r\n <path\r\n d=\"M20.5573 25.2644C20.4622 25.4477 20.5012 25.5939 20.5012 25.734C20.4982 28.2154 20.5002 30.6957 20.4982 33.177C20.4982 33.8099 20.2339 34.1704 19.7462 34.2234C19.2645 34.2765 18.88 33.9831 18.8169 33.5025C18.7959 33.3443 18.7969 33.183 18.7969 33.0238C18.7959 30.5826 18.7969 28.1423 18.7969 25.701C18.7969 25.5728 18.7969 25.4447 18.7969 25.2003C18.1971 25.8031 17.6774 26.3288 17.1527 26.8505C17.0115 26.9907 16.8683 27.1349 16.7061 27.2471C16.3566 27.4864 15.9341 27.4413 15.6457 27.154C15.3643 26.8746 15.3203 26.442 15.5486 26.0925C15.6207 25.9824 15.7128 25.8832 15.8069 25.7891C16.8613 24.7307 17.9167 23.6733 18.9732 22.6179C19.4017 22.1893 19.8784 22.1763 20.3039 22.5988C21.3914 23.6803 22.4739 24.7667 23.5533 25.8572C23.9809 26.2898 24.0129 26.8065 23.6534 27.167C23.299 27.5214 22.7753 27.4844 22.3437 27.0568C21.7499 26.47 21.1661 25.8732 20.5603 25.2644H20.5573Z\"\r\n fill=\"#F9F9F9\"/>\r\n </svg>\r\n </div>\r\n }\r\n @if (uploading) {\r\n <ds-icon class=\"sfi sfi-spinner d-inline-block spin fc-coral fs-30-imp\"></ds-icon>\r\n }\r\n\r\n <div class=\"f-14 fc-black fw-normal\">\r\n <span class=\"fc-coral fw-medium\">{{ 'browse' | translate }}</span>\r\n </div>\r\n <div class=\"fs-10 fc-dark-gray\">\r\n {{ allowedExtensions ? allowedExtensions : '' }}\r\n </div>\r\n\r\n <input type=\"file\" #inputFile [accept]=\"accept\" class=\"d-none\" #fileAttached (change)=\"onValueChange($event)\">\r\n </div>\r\n </section>\r\n\r\n @if (hints) {\r\n <div class=\"d-flex align-items-center gap-3 mb-3\">\r\n @for (hint of hints; track hint) {\r\n <ng-container>\r\n <div class=\"d-flex align-items-center gap-1 fs-12\">\r\n <ds-icon\r\n icon=\"{{ hint.valid ? 'check-circle-f' : 'check-circle-o' }}\"\r\n class=\"fs-24 {{ hint.valid ? 'fc-green' : 'fc-dark-gray' }}\"></ds-icon>\r\n <span class=\"{{ hint.valid ? 'fc-black' : 'fc-dark-gray' }}\">{{ hint.label }}</span>\r\n </div>\r\n </ng-container>\r\n }\r\n </div>\r\n }\r\n\r\n @if (hint) {\r\n <mat-hint class=\"d-flex align-items-center gap-1\">\r\n <ds-icon icon=\"info\" class=\"fs-17 fc-dark-gray\"></ds-icon>\r\n <span class=\"fs-12 fc-black line-height-1\">{{ hint }}</span>\r\n </mat-hint>\r\n }\r\n\r\n @if (multiple) {\r\n <section class=\"files-list\">\r\n @for (file of displayedFiles; track file; let i = $index) {\r\n <div class=\"file-item-container\">\r\n <ds-attachments\r\n [matTooltip]=\"file?.fileName\"\r\n [file]=\"{ name: file.fileName }\"\r\n (downloadEvent)=\"attachmentAction('download', i, file)\"\r\n (deleteEvent)=\"attachmentAction('delete', i, file)\"\r\n [showActions]=\"showActions\">\r\n </ds-attachments>\r\n </div>\r\n }\r\n </section>\r\n }\r\n\r\n @if (!multiple && (control?.value?.fileContents || control?.value?.attachmentId)) {\r\n <section class=\"files-list\">\r\n <div class=\"file-item-container file-item-container-actions\">\r\n <ds-attachments\r\n [matTooltip]=\"control?.value?.fileName\"\r\n [file]=\"{ name: control?.value.fileName }\"\r\n (downloadEvent)=\"attachmentAction('download', null, control?.value)\"\r\n (deleteEvent)=\"attachmentAction('delete', null, control?.value)\"\r\n [showActions]=\"showActions\">\r\n </ds-attachments>\r\n </div>\r\n </section>\r\n }\r\n\r\n <div class=\"attachments-error\">\r\n @if (!validExtension) {\r\n <section class=\"files-list mt-2\">\r\n <div class=\"file-item-container \">\r\n <ds-attachments\r\n [file]=\"wrongFile\" error [showActions]=\"false\">\r\n </ds-attachments>\r\n </div>\r\n </section>\r\n }\r\n\r\n @if (!allowedFileSize) {\r\n <mat-error class=\"fs-12 my-2\">\r\n {{ maxSize === \"0.3\" ? ('support3' | translate ): ('support2' | translate) + maxSize + ('mb' | translate) }}\r\n </mat-error>\r\n }\r\n\r\n @if (!fileNotDuplicated) {\r\n <mat-error class=\"fs-12 my-2\">{{ 'duplicated-error' | translate }}</mat-error>\r\n }\r\n\r\n @if (lengthError) {\r\n <mat-error class=\"fs-12\">{{ 'lengthError' | translate }} :{{ maxLength }}</mat-error>\r\n }\r\n\r\n @if (showErrorMessage) {\r\n <!-- <mat-error class=\"fs-12\">{{errorMessage}} </mat-error> -->\r\n }\r\n </div>\r\n </ng-container>\r\n}\r\n\r\n@if (isReadOnly) {\r\n <ng-container>\r\n @if (multiple && displayedFiles) {\r\n <ng-container>\r\n <div class=\"info-item\">\r\n @if (label) {\r\n <span class=\"name\">{{ label }}</span>\r\n }\r\n @if (displayedFiles?.length) {\r\n <span>\r\n @for (file of displayedFiles; track file; let i = $index) {\r\n <div class=\"file-item-container\">\r\n <ds-attachments\r\n [matTooltip]=\"file?.fileName\"\r\n class=\"my-2\" [file]=\"{ name: file.fileName }\" readOnly (downloadEvent)=\"downloadFile($event, file)\"\r\n [showActions]=\"showActions\">\r\n </ds-attachments>\r\n </div>\r\n }\r\n </span>\r\n }\r\n @if (!displayedFiles?.length) {\r\n <span class=\"disc\">\r\n {{ 'NoAttachments' | translate }}\r\n </span>\r\n }\r\n </div>\r\n </ng-container>\r\n }\r\n\r\n @if (!multiple && (control?.value?.['attachmentId'] || control?.value?.['fileContents'])) {\r\n <ng-container>\r\n <div class=\"info-item\">\r\n @if (label) {\r\n <span class=\"name\">{{ label }}</span>\r\n }\r\n <div class=\"disc file-item-container file-item-container-actions\" [ngClass]=\"{'insideTableWidth': insideTable}\">\r\n @if (control?.value?.['attachmentId'] || control?.value?.['fileContents']) {\r\n <ds-attachments\r\n [matTooltip]=\"control?.value?.fileName\" [file]=\"{ name: control?.value.fileName }\" [showActions]=\"showActions\"\r\n (downloadEvent)=\"attachmentAction('download', null, control?.value)\"\r\n (deleteEvent)=\"attachmentAction('delete', null, control?.value)\"\r\n readOnly>\r\n </ds-attachments>\r\n }\r\n </div>\r\n </div>\r\n </ng-container>\r\n }\r\n </ng-container>\r\n}", styles: [".file-uploader{--uploader-height: 150px;--uploader-width: 100%;--uploader-bg: var(--off-white);--uploader-border: 1px dashed var(--dark-gray);--uploader-radius: var(--box-radius);--uploader-padding: 1rem;height:var(--uploader-height);background-color:var(--uploader-bg);border:var(--uploader-border);border-radius:var(--uploader-radius);padding:var(--uploader-padding);text-align:center;cursor:pointer;display:flex;align-items:center;justify-content:center}.insideTableWidth{width:250px!important}.file-uploader-table{--uploader-height: 45px;--uploader-width: 100%;--uploader-bg: var(--off-white);--uploader-border: 1px dashed var(--dark-gray);--uploader-radius: var(--box-radius);--uploader-padding: 0 1rem;height:var(--uploader-height);background-color:var(--uploader-bg);border:var(--uploader-border);border-radius:var(--uploader-radius);padding:var(--uploader-padding);text-align:center;cursor:pointer;display:FLEX;align-items:CENTER;justify-content:CENTER}.file-uploader-table-dev{display:FLEX;align-items:CENTER;gap:1rem}.file-uploader-table-svg{width:70%}.insideTableStyle{width:272px}.files-list{--file-item-width: 300px;display:grid;grid-template-columns:repeat(auto-fill,var(--file-item-width));grid-gap:.5rem}@media (max-width: 768px){.files-list{grid-template-columns:repeat(auto-fill,minmax(var(--file-item-width),1fr))}}.files-list .file-item-container .uploaded-file-actions{margin-inline-start:20px}.files-list .file-item-container .uploaded-file-actions .button__wrapper{font-size:15px}.files-list .file-item-container .file-item{--file-bg: var(--off-white);--file-radius: var(--box-radius);--icon-color: var(--purple);--icon-size: 2rem;--file-border: transparent;display:flex;align-items:center;background-color:var(--file-bg);border:1px solid var(--file-border);border-radius:var(--file-radius);padding:0 1rem;height:70px;gap:.75rem}.files-list .file-item-container .file-item.error{--file-bg: rgba(var(--rgb-red), 10%);--file-border: var(--red);--icon-color: var(--red)}.files-list .file-item-container .file-item .icon{color:var(--icon-color);font-size:var(--icon-size)}.files-list .file-item-container .file-item .file-action{display:flex;align-items:center;gap:.5rem}ds-attachments::part(base){--file-width: 250px}.file-item-container-actions{display:flex;align-items:center}.file-item-container-actions .uploaded-file-actions{display:flex;align-items:center;gap:10px;margin-inline-start:25px}.file-item-container-actions .uploaded-file-actions .button__wrapper{font-size:15px}::ng-deep .file-item .name-size{display:flex;flex-direction:column;justify-content:center;flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:120px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: FormLabelComponent, selector: "app-form-label", inputs: ["tooltip", "label", "optional"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
423
- }
424
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: DocsUploaderComponent, decorators: [{
425
- type: Component,
426
- args: [{ selector: 'app-file-uploader', schemas: [CUSTOM_ELEMENTS_SCHEMA], standalone: true, imports: [
427
- NgClass,
428
- MatError,
429
- NgTemplateOutlet,
430
- MatHint,
431
- MatTooltip,
432
- FormLabelComponent,
433
- TranslatePipe
434
- ], providers: [
435
- {
436
- provide: NG_VALUE_ACCESSOR,
437
- useExisting: forwardRef(() => DocsUploaderComponent),
438
- multi: true,
439
- },
440
- ], template: "@if (!isReadOnly) {\r\n <ng-container>\r\n @if(label) {\r\n <app-form-label [label]=\"label\" [optional]=\"required || mandatory ? false : true\" [tooltip]=\"tooltip\"></app-form-label>\r\n }\r\n <section\r\n (click)=\"fileAttached.click()\"\r\n [ngClass]=\"insideTable ? 'file-uploader-table' : 'file-uploader'\" class=\" mb-2\"\r\n [class.insideTableStyle]=\"insideTable\">\r\n <div\r\n [ngClass]=\"insideTable ? 'file-uploader-table-dev' : ''\" class=\"file-uploader-input\"\r\n >\r\n @if (!uploading) {\r\n <div class=\"icon mb-1\">\r\n <svg\r\n [ngClass]=\"insideTable ? 'file-uploader-table-svg' : ''\" width=\"41\" height=\"38\" viewBox=\"0 0 41 38\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0 22.1947V20.6736C0.0971303 20.1019 0.070094 19.5141 0.276371 18.9533C1.28372 16.2086 3.21231 14.5023 6.0421 13.8094C6.70499 13.6472 6.68497 13.6632 6.69899 12.9843C6.73203 11.3321 6.99839 9.71992 7.62423 8.17986C8.86289 5.13678 10.9467 2.83969 13.8816 1.39175C17.168 -0.230424 20.5956 -0.450719 24.0553 0.81598C27.4929 2.07467 29.9622 4.41581 31.4802 7.74828C31.7786 8.40316 32.027 9.08307 32.1712 9.79202C32.2402 10.1315 32.4035 10.2566 32.7529 10.3107C36.7012 10.9165 39.3358 13.1255 40.6946 16.8735C40.9069 17.4603 40.9199 18.0731 40.9599 18.6829C40.9649 18.7601 40.9389 18.8442 41 18.9113V20.5124C40.9109 20.995 40.969 21.4937 40.8608 21.9734C40.5244 23.4614 39.8454 24.7821 38.8501 25.9297C37.4522 27.5418 35.7059 28.5882 33.6161 29.0519C32.791 29.2351 31.9499 29.2521 31.1117 29.2922C30.6571 29.3142 30.584 29.193 30.592 28.7484C30.6451 25.8446 29.802 23.2571 27.8624 21.0591C25.9979 18.9463 23.6597 17.7167 20.867 17.4012C18.8553 17.1739 16.9057 17.4593 15.0612 18.3395C11.8319 19.8816 9.81416 22.4069 8.96102 25.8696C8.74273 26.7538 8.68265 27.658 8.70568 28.5702C8.7217 29.2111 8.60254 29.3122 7.95968 29.2972C5.95098 29.2511 4.10551 28.7234 2.58146 27.3596C1.07644 26.0168 0.0680913 24.3996 0.0400537 22.3028C0.0400537 22.2607 0.0250336 22.2257 0 22.1937V22.1947Z\"\r\n fill=\"#DEE0E2\"/>\r\n <path\r\n d=\"M29.0303 28.2632C29.0604 33.4031 24.8657 37.6187 19.6838 37.6548C14.5169 37.6908 10.2852 33.4952 10.2521 28.3042C10.2201 23.1403 14.4297 18.9126 19.6227 18.8946C24.8037 18.8766 28.9993 23.0542 29.0303 28.2632Z\"\r\n fill=\"#8E9AA0\"/>\r\n <path\r\n d=\"M20.5573 25.2644C20.4622 25.4477 20.5012 25.5939 20.5012 25.734C20.4982 28.2154 20.5002 30.6957 20.4982 33.177C20.4982 33.8099 20.2339 34.1704 19.7462 34.2234C19.2645 34.2765 18.88 33.9831 18.8169 33.5025C18.7959 33.3443 18.7969 33.183 18.7969 33.0238C18.7959 30.5826 18.7969 28.1423 18.7969 25.701C18.7969 25.5728 18.7969 25.4447 18.7969 25.2003C18.1971 25.8031 17.6774 26.3288 17.1527 26.8505C17.0115 26.9907 16.8683 27.1349 16.7061 27.2471C16.3566 27.4864 15.9341 27.4413 15.6457 27.154C15.3643 26.8746 15.3203 26.442 15.5486 26.0925C15.6207 25.9824 15.7128 25.8832 15.8069 25.7891C16.8613 24.7307 17.9167 23.6733 18.9732 22.6179C19.4017 22.1893 19.8784 22.1763 20.3039 22.5988C21.3914 23.6803 22.4739 24.7667 23.5533 25.8572C23.9809 26.2898 24.0129 26.8065 23.6534 27.167C23.299 27.5214 22.7753 27.4844 22.3437 27.0568C21.7499 26.47 21.1661 25.8732 20.5603 25.2644H20.5573Z\"\r\n fill=\"#F9F9F9\"/>\r\n </svg>\r\n </div>\r\n }\r\n @if (uploading) {\r\n <ds-icon class=\"sfi sfi-spinner d-inline-block spin fc-coral fs-30-imp\"></ds-icon>\r\n }\r\n\r\n <div class=\"f-14 fc-black fw-normal\">\r\n <span class=\"fc-coral fw-medium\">{{ 'browse' | translate }}</span>\r\n </div>\r\n <div class=\"fs-10 fc-dark-gray\">\r\n {{ allowedExtensions ? allowedExtensions : '' }}\r\n </div>\r\n\r\n <input type=\"file\" #inputFile [accept]=\"accept\" class=\"d-none\" #fileAttached (change)=\"onValueChange($event)\">\r\n </div>\r\n </section>\r\n\r\n @if (hints) {\r\n <div class=\"d-flex align-items-center gap-3 mb-3\">\r\n @for (hint of hints; track hint) {\r\n <ng-container>\r\n <div class=\"d-flex align-items-center gap-1 fs-12\">\r\n <ds-icon\r\n icon=\"{{ hint.valid ? 'check-circle-f' : 'check-circle-o' }}\"\r\n class=\"fs-24 {{ hint.valid ? 'fc-green' : 'fc-dark-gray' }}\"></ds-icon>\r\n <span class=\"{{ hint.valid ? 'fc-black' : 'fc-dark-gray' }}\">{{ hint.label }}</span>\r\n </div>\r\n </ng-container>\r\n }\r\n </div>\r\n }\r\n\r\n @if (hint) {\r\n <mat-hint class=\"d-flex align-items-center gap-1\">\r\n <ds-icon icon=\"info\" class=\"fs-17 fc-dark-gray\"></ds-icon>\r\n <span class=\"fs-12 fc-black line-height-1\">{{ hint }}</span>\r\n </mat-hint>\r\n }\r\n\r\n @if (multiple) {\r\n <section class=\"files-list\">\r\n @for (file of displayedFiles; track file; let i = $index) {\r\n <div class=\"file-item-container\">\r\n <ds-attachments\r\n [matTooltip]=\"file?.fileName\"\r\n [file]=\"{ name: file.fileName }\"\r\n (downloadEvent)=\"attachmentAction('download', i, file)\"\r\n (deleteEvent)=\"attachmentAction('delete', i, file)\"\r\n [showActions]=\"showActions\">\r\n </ds-attachments>\r\n </div>\r\n }\r\n </section>\r\n }\r\n\r\n @if (!multiple && (control?.value?.fileContents || control?.value?.attachmentId)) {\r\n <section class=\"files-list\">\r\n <div class=\"file-item-container file-item-container-actions\">\r\n <ds-attachments\r\n [matTooltip]=\"control?.value?.fileName\"\r\n [file]=\"{ name: control?.value.fileName }\"\r\n (downloadEvent)=\"attachmentAction('download', null, control?.value)\"\r\n (deleteEvent)=\"attachmentAction('delete', null, control?.value)\"\r\n [showActions]=\"showActions\">\r\n </ds-attachments>\r\n </div>\r\n </section>\r\n }\r\n\r\n <div class=\"attachments-error\">\r\n @if (!validExtension) {\r\n <section class=\"files-list mt-2\">\r\n <div class=\"file-item-container \">\r\n <ds-attachments\r\n [file]=\"wrongFile\" error [showActions]=\"false\">\r\n </ds-attachments>\r\n </div>\r\n </section>\r\n }\r\n\r\n @if (!allowedFileSize) {\r\n <mat-error class=\"fs-12 my-2\">\r\n {{ maxSize === \"0.3\" ? ('support3' | translate ): ('support2' | translate) + maxSize + ('mb' | translate) }}\r\n </mat-error>\r\n }\r\n\r\n @if (!fileNotDuplicated) {\r\n <mat-error class=\"fs-12 my-2\">{{ 'duplicated-error' | translate }}</mat-error>\r\n }\r\n\r\n @if (lengthError) {\r\n <mat-error class=\"fs-12\">{{ 'lengthError' | translate }} :{{ maxLength }}</mat-error>\r\n }\r\n\r\n @if (showErrorMessage) {\r\n <!-- <mat-error class=\"fs-12\">{{errorMessage}} </mat-error> -->\r\n }\r\n </div>\r\n </ng-container>\r\n}\r\n\r\n@if (isReadOnly) {\r\n <ng-container>\r\n @if (multiple && displayedFiles) {\r\n <ng-container>\r\n <div class=\"info-item\">\r\n @if (label) {\r\n <span class=\"name\">{{ label }}</span>\r\n }\r\n @if (displayedFiles?.length) {\r\n <span>\r\n @for (file of displayedFiles; track file; let i = $index) {\r\n <div class=\"file-item-container\">\r\n <ds-attachments\r\n [matTooltip]=\"file?.fileName\"\r\n class=\"my-2\" [file]=\"{ name: file.fileName }\" readOnly (downloadEvent)=\"downloadFile($event, file)\"\r\n [showActions]=\"showActions\">\r\n </ds-attachments>\r\n </div>\r\n }\r\n </span>\r\n }\r\n @if (!displayedFiles?.length) {\r\n <span class=\"disc\">\r\n {{ 'NoAttachments' | translate }}\r\n </span>\r\n }\r\n </div>\r\n </ng-container>\r\n }\r\n\r\n @if (!multiple && (control?.value?.['attachmentId'] || control?.value?.['fileContents'])) {\r\n <ng-container>\r\n <div class=\"info-item\">\r\n @if (label) {\r\n <span class=\"name\">{{ label }}</span>\r\n }\r\n <div class=\"disc file-item-container file-item-container-actions\" [ngClass]=\"{'insideTableWidth': insideTable}\">\r\n @if (control?.value?.['attachmentId'] || control?.value?.['fileContents']) {\r\n <ds-attachments\r\n [matTooltip]=\"control?.value?.fileName\" [file]=\"{ name: control?.value.fileName }\" [showActions]=\"showActions\"\r\n (downloadEvent)=\"attachmentAction('download', null, control?.value)\"\r\n (deleteEvent)=\"attachmentAction('delete', null, control?.value)\"\r\n readOnly>\r\n </ds-attachments>\r\n }\r\n </div>\r\n </div>\r\n </ng-container>\r\n }\r\n </ng-container>\r\n}", styles: [".file-uploader{--uploader-height: 150px;--uploader-width: 100%;--uploader-bg: var(--off-white);--uploader-border: 1px dashed var(--dark-gray);--uploader-radius: var(--box-radius);--uploader-padding: 1rem;height:var(--uploader-height);background-color:var(--uploader-bg);border:var(--uploader-border);border-radius:var(--uploader-radius);padding:var(--uploader-padding);text-align:center;cursor:pointer;display:flex;align-items:center;justify-content:center}.insideTableWidth{width:250px!important}.file-uploader-table{--uploader-height: 45px;--uploader-width: 100%;--uploader-bg: var(--off-white);--uploader-border: 1px dashed var(--dark-gray);--uploader-radius: var(--box-radius);--uploader-padding: 0 1rem;height:var(--uploader-height);background-color:var(--uploader-bg);border:var(--uploader-border);border-radius:var(--uploader-radius);padding:var(--uploader-padding);text-align:center;cursor:pointer;display:FLEX;align-items:CENTER;justify-content:CENTER}.file-uploader-table-dev{display:FLEX;align-items:CENTER;gap:1rem}.file-uploader-table-svg{width:70%}.insideTableStyle{width:272px}.files-list{--file-item-width: 300px;display:grid;grid-template-columns:repeat(auto-fill,var(--file-item-width));grid-gap:.5rem}@media (max-width: 768px){.files-list{grid-template-columns:repeat(auto-fill,minmax(var(--file-item-width),1fr))}}.files-list .file-item-container .uploaded-file-actions{margin-inline-start:20px}.files-list .file-item-container .uploaded-file-actions .button__wrapper{font-size:15px}.files-list .file-item-container .file-item{--file-bg: var(--off-white);--file-radius: var(--box-radius);--icon-color: var(--purple);--icon-size: 2rem;--file-border: transparent;display:flex;align-items:center;background-color:var(--file-bg);border:1px solid var(--file-border);border-radius:var(--file-radius);padding:0 1rem;height:70px;gap:.75rem}.files-list .file-item-container .file-item.error{--file-bg: rgba(var(--rgb-red), 10%);--file-border: var(--red);--icon-color: var(--red)}.files-list .file-item-container .file-item .icon{color:var(--icon-color);font-size:var(--icon-size)}.files-list .file-item-container .file-item .file-action{display:flex;align-items:center;gap:.5rem}ds-attachments::part(base){--file-width: 250px}.file-item-container-actions{display:flex;align-items:center}.file-item-container-actions .uploaded-file-actions{display:flex;align-items:center;gap:10px;margin-inline-start:25px}.file-item-container-actions .uploaded-file-actions .button__wrapper{font-size:15px}::ng-deep .file-item .name-size{display:flex;flex-direction:column;justify-content:center;flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:120px}\n"] }]
441
- }], propDecorators: { useCrop: [{
442
- type: Input
443
- }], formKey: [{
444
- type: Input
445
- }], showLabel: [{
446
- type: Input
447
- }], downloadLink: [{
448
- type: Input
449
- }], showActions: [{
450
- type: Input
451
- }], styleHeight: [{
452
- type: Input
453
- }], fileInputHeight: [{
454
- type: Input
455
- }], styleWidth: [{
456
- type: Input
457
- }], hints: [{
458
- type: Input
459
- }], allowedExtensions: [{
460
- type: Input
461
- }], callApi: [{
462
- type: Input
463
- }], display: [{
464
- type: Input
465
- }], attachType: [{
466
- type: Input
467
- }], error: [{
468
- type: Input
469
- }], displayedFiles: [{
470
- type: Input
471
- }], selectedTemplateAttachment: [{
472
- type: Output
473
- }], getDataFromTemplate: [{
474
- type: Input
475
- }], allowFileContentsWithMultiAttachments: [{
476
- type: Input
477
- }], accept: [{
478
- type: Input
479
- }], allAttachments: [{
480
- type: Input
481
- }], signType: [{
482
- type: Input
483
- }], customDownload: [{
484
- type: Input
485
- }], showSignButton: [{
486
- type: Input
487
- }], printType: [{
488
- type: Input
489
- }], showPrintButton: [{
490
- type: Input
491
- }], downloadType: [{
492
- type: Input
493
- }], showDownloadButton: [{
494
- type: Input
495
- }], preventFileContents: [{
496
- type: Input
497
- }], addSignatureClicked: [{
498
- type: Output
499
- }], printActionClicked: [{
500
- type: Output
501
- }], emitedValue: [{
502
- type: Output
503
- }], downloadActionClicked: [{
504
- type: Output
505
- }], maxSize: [{
506
- type: Input
507
- }], inputFile: [{
508
- type: ViewChild,
509
- args: ['inputFile']
510
- }] } });
511
- class FileInfo {
512
- fileName;
513
- name;
514
- mimeType;
515
- fileContents;
516
- filesize;
517
- constructor(fileName, name, mimeType, fileContents, filesize) {
518
- this.fileName = fileName;
519
- this.name = name;
520
- this.mimeType = mimeType;
521
- this.fileContents = fileContents;
522
- this.filesize = filesize;
523
- }
524
- }
525
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jcy11cGxvYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9icG0tY29yZS9zcmMvbGliL2NvbXBvbmVudHMvc2hhcmVkLWNvbXBvbmVudHMvZm9ybS1maWVsZC9kb2MtdXBsb2FkZXIvZG9jcy11cGxvYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9icG0tY29yZS9zcmMvbGliL2NvbXBvbmVudHMvc2hhcmVkLWNvbXBvbmVudHMvZm9ybS1maWVsZC9kb2MtdXBsb2FkZXIvZG9jcy11cGxvYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxxREFBcUQsQ0FBQztBQUMxRixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsU0FBUyxFQUNULHNCQUFzQixFQUN0QixVQUFVLEVBRVYsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFFeEMsT0FBTyxFQUFZLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUQsT0FBTyxFQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDbEYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sa0NBQWtDLENBQUM7O0FBMEIvRCxNQUFNLE9BQU8scUJBQTRCLFNBQVEsNkJBQW1DO0lBQ2xGLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDbkIsWUFBWSxDQUFNO0lBQ2xCLGtCQUFrQixHQUFHLElBQUksQ0FBQztJQUNqQixPQUFPLENBQVU7SUFDakIsT0FBTyxDQUFVO0lBQ2pCLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDakIsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUNyQixXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQ25CLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQyxlQUFlO0lBQ2pDLGVBQWUsR0FBRyxFQUFFLENBQUMsQ0FBQyxlQUFlO0lBQ3JDLFVBQVUsR0FBRyxHQUFHLENBQUM7SUFDakIsS0FBSyxDQUFPO0lBQ1osaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBWSxJQUFJLENBQUM7SUFDeEIsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUN0QixjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQ2IsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUNoQixLQUFLLENBQVU7SUFDZixjQUFjLEdBQW1CLEVBQUUsQ0FBQztJQUNuQywwQkFBMEIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQzFELGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUN6QixlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ2QsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBQzVCLHFDQUFxQyxHQUFHLEtBQUssQ0FBQztJQUM5QyxNQUFNLENBQVc7SUFDMUIsUUFBUSxDQUFTO0lBQ2pCLFNBQVMsR0FBRztRQUNWLFFBQVEsRUFBRSxFQUFFO1FBQ1osWUFBWSxFQUFFLEVBQUU7UUFDaEIsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLHNCQUFzQjtRQUNwRixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsc0JBQXNCO0tBQ2pGLENBQUE7SUFDUSxjQUFjLEdBQUcsRUFBRSxDQUFDO0lBRTdCLFVBQVUsQ0FBWTtJQUNiLFFBQVEsR0FBRyxNQUFNLENBQUM7SUFDbEIsY0FBYyxDQUFVO0lBQ3hCLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsU0FBUyxHQUFHLE9BQU8sQ0FBQztJQUNwQixlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLFlBQVksR0FBRyxVQUFVLENBQUM7SUFDMUIsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQzNCLG1CQUFtQixHQUFHLEtBQUssQ0FBQztJQUMzQixtQkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ3pDLGtCQUFrQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDeEMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDakMscUJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUM1QyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ0EsU0FBUyxDQUFhO0lBQzlDLE1BQU0sR0FBYyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDckMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUdmLGVBQWUsR0FBRztRQUNqQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDO1FBQ2xDLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxhQUFhLENBQUM7UUFDbEMsSUFBSSxFQUFFLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQztRQUNuQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUM7S0FDbkIsQ0FBQTtJQUVELGdCQUFnQixHQUFHO1FBQ2pCLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDO1FBQ3hCLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxhQUFhLENBQUM7UUFDbEMsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQztRQUNsQyxJQUFJLEVBQUUsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDO1FBQ25DLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRSxxQkFBcUIsQ0FBQztRQUN6QyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUM7S0FDbkIsQ0FBQTtJQUVELGNBQWMsR0FBRztRQUNmLEtBQUssRUFBRSxDQUFDLGlCQUFpQixDQUFDO1FBQzFCLEtBQUssRUFBRSxDQUFDLG9CQUFvQixDQUFDO1FBQzdCLE1BQU0sRUFBRSxDQUFDLHlFQUF5RSxDQUFDO1FBQ25GLEtBQUssRUFBRSxDQUFDLCtCQUErQixDQUFDO1FBQ3hDLE1BQU0sRUFBRSxDQUFDLDJFQUEyRSxDQUFDO1FBQ3JGLEtBQUssRUFBRSxDQUFDLCtCQUErQixDQUFDO1FBQ3hDLE1BQU0sRUFBRSxDQUFDLHdFQUF3RSxDQUFDO1FBQ2xGLEtBQUssRUFBRSxDQUFDLHlDQUF5QyxDQUFDO1FBQ2xELEtBQUssRUFBRSxDQUFDLDBCQUEwQixDQUFDO1FBQ25DLE1BQU0sRUFBRSxDQUFDLG1FQUFtRSxDQUFDO1FBQzdFLEtBQUssRUFBRSxDQUFDLGlCQUFpQixFQUFFLDhCQUE4QixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDO1FBQ2hHLEtBQUssRUFBRSxDQUFDLDRCQUE0QixFQUFFLGlCQUFpQixDQUFDO1FBQ3hELEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUNuQixLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUM7UUFDckIsS0FBSyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxDQUFDO1FBQ2hFLE1BQU0sRUFBRSxDQUFDLFdBQVcsQ0FBQztRQUNyQix3QkFBd0I7UUFDeEIsd0JBQXdCO1FBQ3hCLEtBQUssRUFBRSxDQUFDLGlCQUFpQixDQUFDO1FBQzFCLEtBQUssRUFBRSxDQUFDLGdCQUFnQixDQUFDO1FBQ3pCLDhCQUE4QjtRQUM5QixLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDZCxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDaEIsd0JBQXdCO1FBQ3hCLHVDQUF1QztRQUN2Qyx3Q0FBd0M7UUFDeEMsS0FBSyxFQUFFLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQztRQUNwQyxNQUFNLEVBQUUsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDO1FBQ3JDLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQztRQUNwQixLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUM7UUFDcEIsS0FBSyxFQUFFLENBQUMsV0FBVyxFQUFFLHFCQUFxQixDQUFDO0tBQzVDLENBQUE7SUFHZ0IsYUFBYSxHQUFHO1FBQy9CLEtBQUssRUFBRSxDQUFDLGlCQUFpQixDQUFDO0tBQzNCLENBQUE7SUFDRCxTQUFTLENBQVU7SUFDbkIsV0FBVyxDQUFVO0lBRXJCLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLENBQUM7SUFDSCxDQUFDO0lBRVEsUUFBUTtRQUNmLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWTthQUNqQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3pDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBRXJCLHVCQUF1QjtnQkFDdkIseURBQXlEO2dCQUN6RCxXQUFXO2dCQUNYLHFDQUFxQztnQkFDckMsSUFBSTtZQUdOLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxXQUFXLENBQUMsVUFBZTtRQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM3RSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELENBQUM7YUFBTSxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRU8sYUFBYSxDQUFDLGNBQXNCO1FBQzFDLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUM3QyxPQUFPLFlBQVksQ0FBQTtRQUNyQixDQUFDO2FBQU0sSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3JELE9BQU8sS0FBSyxDQUFBO1FBQ2QsQ0FBQzthQUFNLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxNQUFNLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNqRyxPQUFPLHdDQUF3QyxDQUFDO1FBQ2xELENBQUM7UUFDRCxPQUFPLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQVMsRUFBRSxLQUFhLEVBQUUsS0FBVTtRQUNuRCxJQUFJLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUN2QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1lBQ3BGLENBQUM7aUJBQU0sSUFBSSxLQUFLLEVBQUUsWUFBWSxFQUFFLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2pDLENBQUM7aUJBQU0sSUFBSSxLQUFLLEVBQUUsWUFBWSxFQUFFLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUIsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLElBQUksSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNyQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQzNCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtnQkFDM0IsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsS0FBYTtRQUN6QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUN4RCxVQUFVLEVBQUUsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUM7WUFDNUMsY0FBYyxFQUFFLElBQUksa0JBQWtCLEVBQUU7U0FDekMsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ2hELElBQUksV0FBVyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3pCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBYTtRQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxlQUFlLENBQUMsUUFBYTtRQUMzQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUM7UUFDakUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQVU7UUFDdEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3BCLElBQUksS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFTyxlQUFlLENBQUMsS0FBVTtRQUNoQyxJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQVMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFdEYsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDM0QsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztZQUNoRCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxLQUFVO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQzNCLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUNuQixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFDbkIsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQ25CLEVBQUUsRUFDRixJQUFJLENBQUMsUUFBUSxDQUNkLENBQUM7WUFDRixJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7Z0JBQzVCLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQy9CLENBQUM7WUFFRCxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQixDQUFDLEtBQVUsRUFBRSxRQUFrQjtRQUN6RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ2xELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3RixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztJQUN4QixDQUFDO0lBRU8sOEJBQThCLENBQUMsS0FBVSxFQUFFLFFBQWtCO1FBQ25FLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksSUFBSSxDQUFDLG1CQUFtQjtnQkFBRSxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELENBQUM7YUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUVPLGlCQUFpQixDQUFDLElBQVUsRUFBRSxRQUFrQjtRQUN0RCxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFO1lBQ25CLE1BQU0sWUFBWSxHQUFJLE1BQU0sQ0FBQyxNQUFpQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RCxRQUFRLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztZQUNyQyxRQUFRLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNoRCxDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsWUFBb0IsRUFBRSxRQUFrQjtRQUMvRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUN2QyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2pDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUN2QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBRU8sYUFBYTtRQUNuQixNQUFNLFFBQVEsR0FBRztZQUNmLFFBQVEsRUFBRSxFQUFFO1lBQ1osWUFBWSxFQUFFLEVBQUU7WUFDaEIsUUFBUSxFQUFFLEVBQUU7U0FDYixDQUFBO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNuQixJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxLQUFVLEVBQUUscUJBQThCO1FBQzNELE1BQU0sSUFBSSxHQUFHO1lBQ1gsaUJBQWlCLEVBQUUsRUFBRTtZQUNyQixtQkFBbUIsRUFBRSxFQUFFO1lBQ3ZCLFVBQVUsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUMxQixVQUFVLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDMUIsY0FBYyxFQUFFLEtBQUssQ0FBQyxZQUFZO1NBQ25DLENBQUE7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQ3hDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDcEMsQ0FBQyxTQUFTLENBQUM7WUFDVixJQUFJLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDbEIsTUFBTSxNQUFNLEdBQUc7b0JBQ2IsVUFBVSxFQUFFLEtBQUssQ0FBQyxRQUFRO29CQUMxQixjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZO29CQUM1QyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRO29CQUNwQyxjQUFjLEVBQUUsS0FBSyxDQUFDLFlBQVk7aUJBQ25DLENBQUE7Z0JBQ0QsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO29CQUMxQixJQUFJLElBQUksQ0FBQyxxQ0FBcUM7d0JBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7b0JBQzVGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtvQkFDNUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO2dCQUM1QyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7b0JBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUMvQixDQUFDO2dCQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDYixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDdkIsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUMxQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3pDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFVO1FBQzVCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUdELGtCQUFrQixDQUFDLElBQWM7UUFDL0IsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM5RixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFHRCxlQUFlLENBQUMsS0FBVTtRQUN4QixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksS0FBSyxFQUFFLENBQUM7WUFDN0IsT0FBUSxFQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkYsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN0QyxPQUFRLEVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sSUFBSSxDQUFBO1FBQ2IsQ0FBQztJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFhLEVBQUUsSUFBWTtRQUMxQyxJQUFJLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNwQixPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN2RixDQUFDO2FBQU0sSUFBSSxJQUFJLElBQUksVUFBVSxFQUFFLENBQUM7WUFDOUIsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN4RixDQUFDO2FBQU0sSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDMUIsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDckYsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN0RixDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUNqRSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQzVDLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3BCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFLLEVBQUUsS0FBSztRQUN2QixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3hDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FDaEQsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUNwQyxDQUFDLFNBQVMsQ0FDVCxDQUFDLGNBQThCLEVBQUUsRUFBRTtnQkFDakMsTUFBTSxlQUFlLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQztnQkFDNUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDNUMsQ0FBQyxFQUNELEtBQUssQ0FBQyxFQUFFO2dCQUNOLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO1lBQ3JELENBQUMsQ0FDRixDQUFDO1FBRUosQ0FBQztJQUNILENBQUM7SUFFTyxJQUFJLENBQUksS0FBYztRQUM1QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzdCLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxJQUFTO1FBQ2xDLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLGNBQWMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2RCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDM0IsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBQ0gsQ0FBQzt1R0FqYlUscUJBQXFCOzJGQUFyQixxQkFBcUIsbW9DQVJyQjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUM7Z0JBQ3BELEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRiw4S0NuREgsd29TQWtMQyxnckZEN0lHLE9BQU8sb0ZBQ1AsUUFBUSxrRkFFUixPQUFPLDhFQUNQLFVBQVUsaVJBQ1Ysa0JBQWtCLGdHQUNsQixhQUFhOzsyRkFVSixxQkFBcUI7a0JBdkJqQyxTQUFTOytCQUNFLG1CQUFtQixXQUdwQixDQUFDLHNCQUFzQixDQUFDLGNBQ3JCLElBQUksV0FDUDt3QkFDUCxPQUFPO3dCQUNQLFFBQVE7d0JBQ1IsZ0JBQWdCO3dCQUNoQixPQUFPO3dCQUNQLFVBQVU7d0JBQ1Ysa0JBQWtCO3dCQUNsQixhQUFhO3FCQUNkLGFBQ1U7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQUM7NEJBQ3BELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGOzhCQU1RLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0ksMEJBQTBCO3NCQUFuQyxNQUFNO2dCQUdFLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxxQ0FBcUM7c0JBQTdDLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQVFHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDSSxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNFLE9BQU87c0JBQWYsS0FBSztnQkFDa0IsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXOztBQW1ZeEIsTUFBTSxRQUFRO0lBRUg7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUxULFlBQ1MsUUFBZ0IsRUFDaEIsSUFBWSxFQUNaLFFBQWdCLEVBQ2hCLFlBQW9CLEVBQ3BCLFFBQWdCO1FBSmhCLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDaEIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDaEIsaUJBQVksR0FBWixZQUFZLENBQVE7UUFDcEIsYUFBUSxHQUFSLFFBQVEsQ0FBUTtJQUNyQixDQUFDO0NBQ04iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RlbGV0ZURpYWxvZ0NvbXBvbmVudH0gZnJvbSAnLi4vLi4vZGlhbG9ncy9kZWxldGUtZGlhbG9nL2RlbGV0ZS1kaWFsb2cuY29tcG9uZW50JztcclxuaW1wb3J0IHtOb29wU2Nyb2xsU3RyYXRlZ3l9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcclxuICBEZXN0cm95UmVmLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgaW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIEZpbGVTYXZlciBmcm9tICdmaWxlLXNhdmVyJztcclxuaW1wb3J0IHtEb2N1bWVudEZpbGV9IGZyb20gJy4uLy4uLy4uLy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQge0Zvcm1Hcm91cCwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtOZ0NsYXNzLCBOZ1RlbXBsYXRlT3V0bGV0fSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7TWF0RXJyb3IsIE1hdEhpbnR9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkXCI7XHJcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3JEaXJlY3RpdmV9IGZyb20gJy4uL2NvbnRyb2wtdmFsdWUtYWNjZXNzb3IuZGlyZWN0aXZlJztcclxuaW1wb3J0IHtNYXREaWFsb2d9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7TWF0VG9vbHRpcH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXBcIjtcclxuaW1wb3J0IHtGb3JtTGFiZWxDb21wb25lbnR9IGZyb20gJy4uL2Zvcm0tbGFiZWwvZm9ybS1sYWJlbC5jb21wb25lbnQnO1xyXG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5pbXBvcnQge1RyYW5zbGF0ZVBpcGV9IGZyb20gXCIuLi8uLi8uLi8uLi9waXBlcy90cmFuc2xhdGUucGlwZVwiO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWZpbGUtdXBsb2FkZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kb2NzLXVwbG9hZGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kb2NzLXVwbG9hZGVyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTmdDbGFzcyxcclxuICAgIE1hdEVycm9yLFxyXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcclxuICAgIE1hdEhpbnQsXHJcbiAgICBNYXRUb29sdGlwLFxyXG4gICAgRm9ybUxhYmVsQ29tcG9uZW50LFxyXG4gICAgVHJhbnNsYXRlUGlwZVxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEb2NzVXBsb2FkZXJDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH0sXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRG9jc1VwbG9hZGVyQ29tcG9uZW50PFR5cGU+IGV4dGVuZHMgQ29udHJvbFZhbHVlQWNjZXNzb3JEaXJlY3RpdmU8VHlwZT4gaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgbWF4U2l6ZUZsYWcgPSB0cnVlO1xyXG4gIG1heFNpemVWYWx1ZTogYW55O1xyXG4gIHdyb25nRXh0ZW5zaW9uRmxhZyA9IHRydWU7XHJcbiAgQElucHV0KCkgdXNlQ3JvcDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBmb3JtS2V5ITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHNob3dMYWJlbCA9IHRydWU7XHJcbiAgQElucHV0KCkgZG93bmxvYWRMaW5rID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd0FjdGlvbnMgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHN0eWxlSGVpZ2h0ID0gJyc7IC8vIG1lZGl1bSwgbWluaVxyXG4gIEBJbnB1dCgpIGZpbGVJbnB1dEhlaWdodCA9ICcnOyAvLyBtZWRpdW0sIG1pbmlcclxuICBASW5wdXQoKSBzdHlsZVdpZHRoID0gJzYnO1xyXG4gIEBJbnB1dCgpIGhpbnRzITogYW55O1xyXG4gIEBJbnB1dCgpIGFsbG93ZWRFeHRlbnNpb25zID0gJyc7XHJcbiAgQElucHV0KCkgY2FsbEFwaTogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgZGlzcGxheSA9ICcnO1xyXG4gIHZhbGlkRXh0ZW5zaW9uID0gdHJ1ZTtcclxuICBASW5wdXQoKSBhdHRhY2hUeXBlID0gJyc7XHJcbiAgQElucHV0KCkgZXJyb3IhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZGlzcGxheWVkRmlsZXM6IERvY3VtZW50RmlsZVtdID0gW107XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkVGVtcGxhdGVBdHRhY2htZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIGZpbGVOb3REdXBsaWNhdGVkID0gdHJ1ZTtcclxuICBhbGxvd2VkRmlsZVNpemUgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGdldERhdGFGcm9tVGVtcGxhdGUgPSBmYWxzZTtcclxuICBASW5wdXQoKSBhbGxvd0ZpbGVDb250ZW50c1dpdGhNdWx0aUF0dGFjaG1lbnRzID0gZmFsc2U7XHJcbiAgQElucHV0KCkgYWNjZXB0OiBzdHJpbmdbXTtcclxuICBmaWxlc2l6ZTogc3RyaW5nO1xyXG4gIHdyb25nRmlsZSA9IHtcclxuICAgIG1pbWVUeXBlOiBcIlwiLFxyXG4gICAgZmlsZUNvbnRlbnRzOiBcIlwiLFxyXG4gICAgZmlsZU5hbWU6IHRoaXMuaTE4bi5sYW5ndWFnZSA9PSAnYXInID8gXCLYp9mF2KrYr9in2K8g2KfZhNmF2YTZgSDYrtin2LfZidihXCIgOiBcIldyb25nIEZpbGUgRXh0ZW5zaW9uXCIsXHJcbiAgICBuYW1lOiB0aGlzLmkxOG4ubGFuZ3VhZ2UgPT0gJ2FyJyA/IFwi2KfZhdiq2K/Yp9ivINin2YTZhdmE2YEg2K7Yp9i32YnYoVwiIDogXCJXcm9uZyBGaWxlIEV4dGVuc2lvblwiXHJcbiAgfVxyXG4gIEBJbnB1dCgpIGFsbEF0dGFjaG1lbnRzID0gW107XHJcblxyXG4gIHVwbG9hZEZvcm06IEZvcm1Hcm91cDtcclxuICBASW5wdXQoKSBzaWduVHlwZSA9ICdTaWduJztcclxuICBASW5wdXQoKSBjdXN0b21Eb3dubG9hZDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBzaG93U2lnbkJ1dHRvbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHByaW50VHlwZSA9ICdQcmludCc7XHJcbiAgQElucHV0KCkgc2hvd1ByaW50QnV0dG9uID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZG93bmxvYWRUeXBlID0gJ0Rvd25sb2FkJztcclxuICBASW5wdXQoKSBzaG93RG93bmxvYWRCdXR0b24gPSBmYWxzZTtcclxuICBASW5wdXQoKSBwcmV2ZW50RmlsZUNvbnRlbnRzID0gZmFsc2U7XHJcbiAgQE91dHB1dCgpIGFkZFNpZ25hdHVyZUNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIHByaW50QWN0aW9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgZW1pdGVkVmFsdWUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGRvd25sb2FkQWN0aW9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBASW5wdXQoKSBtYXhTaXplID0gJzEwJztcclxuICBAVmlld0NoaWxkKCdpbnB1dEZpbGUnKSBpbnB1dEZpbGU6IEVsZW1lbnRSZWY7XHJcbiAgZGlhbG9nOiBNYXREaWFsb2cgPSBpbmplY3QoTWF0RGlhbG9nKVxyXG4gIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XHJcblxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkSW1hZ2VUeXBlcyA9IHtcclxuICAgIGpwZzogWydpbWFnZS9qcGVnJywgJ2ltYWdlL3BqcGVnJ10sXHJcbiAgICBKUEc6IFsnaW1hZ2UvanBlZycsICdpbWFnZS9wanBlZyddLFxyXG4gICAganBlZzogWydpbWFnZS9qcGVnJywgJ2ltYWdlL3BqcGVnJ10sXHJcbiAgICBwbmc6IFsnaW1hZ2UvcG5nJ11cclxuICB9XHJcblxyXG4gIHZhbGlkSW1nUGRmVHlwZXMgPSB7XHJcbiAgICBwZGY6IFsnYXBwbGljYXRpb24vcGRmJ10sXHJcbiAgICBqcGc6IFsnaW1hZ2UvanBlZycsICdpbWFnZS9wanBlZyddLFxyXG4gICAgSlBHOiBbJ2ltYWdlL2pwZWcnLCAnaW1hZ2UvcGpwZWcnXSxcclxuICAgIGpwZWc6IFsnaW1hZ2UvanBlZycsICdpbWFnZS9wanBlZyddLFxyXG4gICAgYm1wOiBbJ2ltYWdlL2JtcCcsICdpbWFnZS94LXdpbmRvd3MtYm1wJ10sXHJcbiAgICBwbmc6IFsnaW1hZ2UvcG5nJ11cclxuICB9XHJcblxyXG4gIHZhbGlkRmlsZVR5cGVzID0ge1xyXG4gICAgJ3BkZic6IFsnYXBwbGljYXRpb24vcGRmJ10sXHJcbiAgICAnZG9jJzogWydhcHBsaWNhdGlvbi9tc3dvcmQnXSxcclxuICAgICdkb2N4JzogWydhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCddLFxyXG4gICAgJ3BwdCc6IFsnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnXSxcclxuICAgICdwcHR4JzogWydhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwucHJlc2VudGF0aW9uJ10sXHJcbiAgICAncHBzJzogWydhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCddLFxyXG4gICAgJ3Bwc3gnOiBbJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZXNob3cnXSxcclxuICAgICdvZHQnOiBbJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dCddLFxyXG4gICAgJ3hscyc6IFsnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJ10sXHJcbiAgICAneGxzeCc6IFsnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnXSxcclxuICAgICd6aXAnOiBbJ2FwcGxpY2F0aW9uL3ppcCcsICdhcHBsaWNhdGlvbi94LXppcC1jb21wcmVzc2VkJywgJ211bHRpcGFydC94LXppcCcsICdhcHBsaWNhdGlvbi96aXAnXSxcclxuICAgICdtc2cnOiBbJ2FwcGxpY2F0aW9uL3ZuZC5tcy1vdXRsb29rJywgJ2FwcGxpY2F0aW9uL21zZyddLFxyXG4gICAgJ2Nzdic6IFsndGV4dC9jc3YnXSxcclxuICAgICd0eHQnOiBbJ3RleHQvcGxhaW4nXSxcclxuICAgICdydGYnOiBbJ2FwcGxpY2F0aW9uL3J0ZicsICdhcHBsaWNhdGlvbi94LXJ0ZicsICd0ZXh0L3JpY2h0ZXh0J10sXHJcbiAgICAnaHRtbCc6IFsndGV4dC9odG1sJ10sXHJcbiAgICAvLyAnbXA0JzogWyd2aWRlby9tcDQnXSxcclxuICAgIC8vICdtNHYnOiBbJ3ZpZGVvL21wNCddLFxyXG4gICAgJ21vdic6IFsndmlkZW8vcXVpY2t0aW1lJ10sXHJcbiAgICAnd212JzogWyd2aWRlby94LW1zLXdtdiddLFxyXG4gICAgLy8gJ2F2aSc6IFsndmlkZW8veC1tc3ZpZGVvJ10sXHJcbiAgICAnbXBnJzogWydtcGcnXSxcclxuICAgICdybXZiJzogWydybXZiJ10sXHJcbiAgICAvLyAnb2d2JzogWyd2aWRlby9vZ2cnXSxcclxuICAgIC8vICczZ3AnOiBbJ3ZpZGVvLzNncHAnLCAnYXVkaW8vM2dwcCddLFxyXG4gICAgLy8gJzNnMic6IFsndmlkZW8vM2dwcDInLCAnYXVkaW8vM2dwcCddLFxyXG4gICAgJ2pwZyc6IFsnaW1hZ2UvanBlZycsICdpbWFnZS9wanBlZyddLFxyXG4gICAgJ2pwZWcnOiBbJ2ltYWdlL2pwZWcnLCAnaW1hZ2UvcGpwZWcnXSxcclxuICAgICdwbmcnOiBbJ2ltYWdlL3BuZyddLFxyXG4gICAgJ2dpZic6IFsnaW1hZ2UvZ2lmJ10sXHJcbiAgICAnYm1wJzogWydpbWFnZS9ibXAnLCAnaW1hZ2UveC13aW5kb3dzLWJtcCddXHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSB2YWxpZFBkZlR5cGVzID0ge1xyXG4gICAgJ3BkZic6IFsnYXBwbGljYXRpb24vcGRmJ10sXHJcbiAgfVxyXG4gIHVwbG9hZGluZzogYm9vbGVhbjtcclxuICBsZW5ndGhFcnJvcjogYm9vbGVhbjtcclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYXR0YWNobWVudHM/Lmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmFsbEF0dGFjaG1lbnRzID0gWy4uLnRoaXMuYXR0YWNobWVudHNdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gICAgdGhpcy5hY3Rpb25TdGF0ZVNlcnZpY2UucmVzZXRBY3Rpb24kXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxyXG4gICAgICAuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUmVhZE9ubHkgJiYgdGhpcy5jb250cm9sLmVuYWJsZWQpIHtcclxuICAgICAgICAgIHRoaXMuY29udHJvbC5yZXNldCgpO1xyXG5cclxuICAgICAgICAgIC8vIGlmICh0aGlzLnJlcXVpcmVkKSB7XHJcbiAgICAgICAgICAvLyAgIHRoaXMuY29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuVmFsaWRhdG9ycy5yZXF1aXJlZClcclxuICAgICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyAgIHRoaXMuY29udHJvbC5zZXRWYWxpZGF0b3JzKG51bGwpXHJcbiAgICAgICAgICAvLyB9XHJcblxyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsZVR5cGUoYXR0YWNobWVudDogYW55KTogc3RyaW5nIHtcclxuICAgIGlmICghYXR0YWNobWVudC5maWxlTmFtZT8uaW5jbHVkZXMoJy4nKSAmJiBhdHRhY2htZW50Lm1pbWVUeXBlLmluY2x1ZGVzKCcuJykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2hlY2tGaWxlVHlwZShhdHRhY2htZW50Lm1pbWVUeXBlKTtcclxuICAgIH0gZWxzZSBpZiAoYXR0YWNobWVudC5maWxlTmFtZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGVja0ZpbGVUeXBlKGF0dGFjaG1lbnQuZmlsZU5hbWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGF0dGFjaG1lbnQubWltZVR5cGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrRmlsZVR5cGUoYXR0YWNobWVudERhdGE6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoYXR0YWNobWVudERhdGEuc3BsaXQoJy4nKS5wb3AoKSA9PSAnbXNnJykge1xyXG4gICAgICByZXR1cm4gJ2VtYWlsLWljb24nXHJcbiAgICB9IGVsc2UgaWYgKGF0dGFjaG1lbnREYXRhLnNwbGl0KCcuJykucG9wKCkgPT0gJ2pwZWcnKSB7XHJcbiAgICAgIHJldHVybiAnanBnJ1xyXG4gICAgfSBlbHNlIGlmIChhdHRhY2htZW50RGF0YS5zcGxpdCgnLicpLnBvcCgpID09ICd4bHN4JyB8fCBhdHRhY2htZW50RGF0YS5zcGxpdCgnLicpLnBvcCgpID09ICd4bHMnKSB7XHJcbiAgICAgIHJldHVybiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsO2NoYXJzZXQ9dXRmLTgnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF0dGFjaG1lbnREYXRhLnNwbGl0KCcuJykucG9wKCk7XHJcbiAgfVxyXG5cclxuICBhdHRhY2htZW50QWN0aW9uKHR5cGU6IGFueSwgaW5kZXg6IG51bWJlciwgZmllbGQ6IGFueSkge1xyXG4gICAgaWYgKHR5cGUgPT0gXCJkb3dubG9hZFwiKSB7XHJcbiAgICAgIGlmICh0aGlzLmRvd25sb2FkTGluaykge1xyXG4gICAgICAgIHdpbmRvdy5vcGVuKGZpZWxkPy5hdHRhY2htZW50SWQsICdfYmxhbmsnLCAndG9wPTAsbGVmdD0wLGhlaWdodD1hdXRvLHdpZHRoPWF1dG8nKTtcclxuICAgICAgfSBlbHNlIGlmIChmaWVsZD8uYXR0YWNobWVudElkKSB7XHJcbiAgICAgICAgdGhpcy5kb3dubG9hZEZpbGUodHlwZSwgZmllbGQpO1xyXG4gICAgICB9IGVsc2UgaWYgKGZpZWxkPy5maWxlQ29udGVudHMpIHtcclxuICAgICAgICB0aGlzLmRvd25sb2FkRmlsZU5ldyhmaWVsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0eXBlID09IFwiZGVsZXRlXCIpIHtcclxuICAgICAgaWYgKHRoaXMudmFsaWRFeHRlbnNpb24pIHtcclxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgdGhpcy5jb25maXJtRGVsZXRlKGluZGV4KVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZUF0dGFjaGVkRmlsZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudmFsaWRFeHRlbnNpb24gPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25maXJtRGVsZXRlKGluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRGVsZXRlRGlhbG9nQ29tcG9uZW50LCB7XHJcbiAgICAgIHBhbmVsQ2xhc3M6IFsnbWFpbi1wb3B1cCcsICdjb25maXJtLWRpYWxvZyddLFxyXG4gICAgICBzY3JvbGxTdHJhdGVneTogbmV3IE5vb3BTY3JvbGxTdHJhdGVneSgpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXR1cm5WYWx1ZSkgPT4ge1xyXG4gICAgICBpZiAocmV0dXJuVmFsdWUgPT0gJ3llcycpIHtcclxuICAgICAgICB0aGlzLnJlbW92ZU11bHRpKGluZGV4KVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZU11bHRpKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuZGlzcGxheWVkRmlsZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIHRoaXMuYWxsQXR0YWNobWVudHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICB9XHJcblxyXG4gIGRvd25sb2FkRmlsZU5ldyhmaWxlRGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBmaWxlVHlwZSA9IHRoaXMuZ2V0RmlsZVR5cGUoZmlsZURhdGEpO1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtmaWxlRGF0YS5maWxlQ29udGVudHNdLCB7dHlwZTogZmlsZVR5cGV9KTtcclxuICAgIEZpbGVTYXZlci5zYXZlQXMoYmxvYiwgYCR7ZmlsZURhdGEuZmlsZU5hbWV9YCk7XHJcbiAgfVxyXG5cclxuICBvblZhbHVlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgdGhpcy5jb250cm9sLnJlc2V0KClcclxuICAgIGlmIChpbnB1dD8uZmlsZXM/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5oYW5kbGVGaWxlSW5wdXQoaW5wdXQpO1xyXG4gICAgICB0aGlzLnByb2Nlc3NVcGxvYWRlZEZpbGUoaW5wdXQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVGaWxlSW5wdXQoaW5wdXQ6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGlucHV0LmZpbGVzICYmIHRoaXMuZm9ybUtleSA9PT0gJ1RTVicpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlQXR0YWNobWVudC5lbWl0KGlucHV0LmZpbGVzWzBdKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaWxlOiBGaWxlID0gaW5wdXQuZmlsZXNbMF07XHJcbiAgICBsZXQgZmlsZVR5cGUgPSBmaWxlLm5hbWU/LmVuZHNXaXRoKFwiLm1zZ1wiKSA/ICdhcHBsaWNhdGlvbi92bmQubXMtb3V0bG9vaycgOiBmaWxlLnR5cGU7XHJcblxyXG4gICAgaWYgKHRoaXMuYWNjZXB0Py5sZW5ndGggJiYgIXRoaXMuYWNjZXB0LmluY2x1ZGVzKGZpbGVUeXBlKSkge1xyXG4gICAgICBhbGVydCh0aGlzLmkxOG4udHJhbnNsYXRlKCd0aGlzSXNJbnZhbGlkRmlsZScpKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBsb2FkRm9ybT8uZ2V0KCdmaWxlJyk/LnNldFZhbHVlKGZpbGUpO1xyXG4gICAgdGhpcy51cGxvYWRGb3JtPy5nZXQoJ25hbWUnKT8uc2V0VmFsdWUoZmlsZT8ubmFtZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByb2Nlc3NVcGxvYWRlZEZpbGUoaW5wdXQ6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnVwbG9hZGluZykge1xyXG4gICAgICBjb25zdCBmaWxlRGF0YSA9IG5ldyBGaWxlSW5mbyhcclxuICAgICAgICBpbnB1dC5maWxlc1swXS5uYW1lLFxyXG4gICAgICAgIGlucHV0LmZpbGVzWzBdLm5hbWUsXHJcbiAgICAgICAgaW5wdXQuZmlsZXNbMF0udHlwZSxcclxuICAgICAgICAnJyxcclxuICAgICAgICB0aGlzLmZpbGVzaXplXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMudXBkYXRlRmlsZVByb3BlcnRpZXMoaW5wdXQsIGZpbGVEYXRhKTtcclxuICAgICAgaWYgKCF0aGlzLmxlbmd0aEVycm9yICYmICt0aGlzLmZpbGVzaXplIDwgK3RoaXMubWF4U2l6ZSkge1xyXG4gICAgICAgIHRoaXMuYWxsb3dlZEZpbGVTaXplID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnVwbG9hZFZhbGlkQW5kTm9uRHVwbGljYXRlRmlsZShpbnB1dCwgZmlsZURhdGEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYWxsb3dlZEZpbGVTaXplID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlucHV0LnZhbHVlID0gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZpbGVQcm9wZXJ0aWVzKGlucHV0OiBhbnksIGZpbGVJbmZvOiBGaWxlSW5mbyk6IHZvaWQge1xyXG4gICAgdGhpcy5tYXhTaXplVmFsdWUgPSB0aGlzLm1heFNpemUgPyB0aGlzLm1heFNpemUgOiAxO1xyXG4gICAgdGhpcy5maWxlc2l6ZSA9ICgoaW5wdXQuZmlsZXNbMF0uc2l6ZSAvIDEwMjQpIC8gMTAyNCkudG9GaXhlZCg0KTtcclxuICAgIHRoaXMubWF4U2l6ZUZsYWcgPSArdGhpcy5maWxlc2l6ZSA8ICt0aGlzLm1heFNpemU7XHJcbiAgICB0aGlzLmxlbmd0aEVycm9yID0gdGhpcy5kaXNwbGF5ZWRGaWxlcz8ubGVuZ3RoID49ICt0aGlzLm1heExlbmd0aDtcclxuICAgIHRoaXMud3JvbmdFeHRlbnNpb25GbGFnID0gdGhpcy5pc1ZhbGlkTWltZVR5cGUoaW5wdXQuZmlsZXNbMF0udHlwZSk7XHJcbiAgICB0aGlzLnZhbGlkRXh0ZW5zaW9uID0gdGhpcy5pc1ZhbGlkRXh0ZW5zaW9uKGlucHV0LmZpbGVzWzBdLm5hbWUuc3BsaXQoJy4nKS5wb3AoKSwgdGhpcy50eXBlKTtcclxuICAgIHRoaXMudmFsdWUgPSBmaWxlSW5mbztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBsb2FkVmFsaWRBbmROb25EdXBsaWNhdGVGaWxlKGlucHV0OiBhbnksIGZpbGVEYXRhOiBGaWxlSW5mbyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudmFsaWRFeHRlbnNpb24pIHtcclxuICAgICAgaWYgKHRoaXMuZ2V0RGF0YUZyb21UZW1wbGF0ZSkgdGhpcy5zZWxlY3RlZFRlbXBsYXRlQXR0YWNobWVudC5lbWl0KGlucHV0KTtcclxuICAgICAgdGhpcy5yZWFkRmlsZUFuZFVwbG9hZChpbnB1dC5maWxlc1swXSwgZmlsZURhdGEpO1xyXG4gICAgfSBlbHNlIGlmICghdGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICB0aGlzLmVtaXRFbXB0eUZpbGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZEZpbGVBbmRVcGxvYWQoZmlsZTogRmlsZSwgZmlsZUluZm86IEZpbGVJbmZvKTogdm9pZCB7XHJcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgY29uc3QgZmlsZUNvbnRlbnRzID0gKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKS5zcGxpdCgnLCcpWzFdO1xyXG4gICAgICBmaWxlSW5mby5maWxlQ29udGVudHMgPSBmaWxlQ29udGVudHM7XHJcbiAgICAgIGZpbGVJbmZvLmZpbGVzaXplID0gdGhpcy5maWxlc2l6ZTtcclxuICAgICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgICAgdGhpcy51cGxvYWRTaW5nbGVGaWxlKGZpbGVDb250ZW50cywgZmlsZUluZm8pO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNGaWxlTm90RHVwbGljYXRlKGZpbGVJbmZvKSkge1xyXG4gICAgICAgIHRoaXMuYWRkTXVsdGlBdHRhY2htZW50cyhmaWxlSW5mbyk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBsb2FkU2luZ2xlRmlsZShmaWxlQ29udGVudHM6IHN0cmluZywgZmlsZUluZm86IEZpbGVJbmZvKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpbGVOb3REdXBsaWNhdGVkID0gdGhpcy5pc0ZpbGVOb3REdXBsaWNhdGUoZmlsZUluZm8pO1xyXG4gICAgaWYgKCF0aGlzLmZpbGVOb3REdXBsaWNhdGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMudmFsdWUuZmlsZUNvbnRlbnRzID0gZmlsZUNvbnRlbnRzO1xyXG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHRoaXMudmFsdWUpXHJcbiAgICB0aGlzLmVtaXRlZFZhbHVlLmVtaXQodGhpcy52YWx1ZSlcclxuICAgIGlmICh0aGlzLmNhbGxBcGkpIHtcclxuICAgICAgdGhpcy5hZGRBdHRhY2htZW50cygpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGVBdHRhY2htZW50LmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXRFbXB0eUZpbGUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBlbXB0eU9iaiA9IHtcclxuICAgICAgbWltZVR5cGU6IFwiXCIsXHJcbiAgICAgIGZpbGVDb250ZW50czogXCJcIixcclxuICAgICAgZmlsZU5hbWU6IFwiXCIsXHJcbiAgICB9XHJcbiAgICB0aGlzLmVtaXQoZW1wdHlPYmopXHJcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGVBdHRhY2htZW50LmVtaXQobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm9jZXNzQXR0YWNobWVudHMoZmllbGQ6IGFueSwgYWxsb3dNdWx0aUF0dGFjaG1lbnRzOiBib29sZWFuKSB7XHJcbiAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICBcImZpbGVEZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICBcImF0dGFjaG1lbnRjb21tZW50XCI6IFwiXCIsXHJcbiAgICAgIFwiZmlsZU5hbWVcIjogZmllbGQuZmlsZU5hbWUsXHJcbiAgICAgIFwibWltZVR5cGVcIjogZmllbGQubWltZVR5cGUsXHJcbiAgICAgIFwiZmlsZUNvbnRlbnRzXCI6IGZpZWxkLmZpbGVDb250ZW50cyxcclxuICAgIH1cclxuICAgIHRoaXMudXBsb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuY29yZVNlcnZpY2UuZ2V0QXR0YWNobWVudHMoZGF0YSkucGlwZShcclxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcclxuICAgICkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGZvcm06IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5ld09iaiA9IHtcclxuICAgICAgICAgIFwiZmlsZU5hbWVcIjogZmllbGQuZmlsZU5hbWUsXHJcbiAgICAgICAgICBcImF0dGFjaG1lbnRJZFwiOiBmb3JtLmF0dGFjaG1lbnQuYXR0YWNobWVudElkLFxyXG4gICAgICAgICAgXCJtaW1lVHlwZVwiOiBmb3JtLmF0dGFjaG1lbnQubWltZVR5cGUsXHJcbiAgICAgICAgICBcImZpbGVDb250ZW50c1wiOiBmaWVsZC5maWxlQ29udGVudHNcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFsbG93TXVsdGlBdHRhY2htZW50cykge1xyXG4gICAgICAgICAgaWYgKHRoaXMuYWxsb3dGaWxlQ29udGVudHNXaXRoTXVsdGlBdHRhY2htZW50cykgbmV3T2JqWydmaWxlQ29udGVudHMnXSA9IGZpZWxkLmZpbGVDb250ZW50cztcclxuICAgICAgICAgIHRoaXMuZGlzcGxheWVkRmlsZXMgPSB0aGlzLmRpc3BsYXllZEZpbGVzPy5sZW5ndGggPyB0aGlzLmRpc3BsYXllZEZpbGVzIDogW11cclxuICAgICAgICAgIHRoaXMuZGlzcGxheWVkRmlsZXMucHVzaChuZXdPYmopO1xyXG4gICAgICAgICAgdGhpcy5hbGxBdHRhY2htZW50cy5wdXNoKG5ld09iaik7XHJcbiAgICAgICAgICB0aGlzLmVtaXQodGhpcy5kaXNwbGF5ZWRGaWxlcyk7XHJcbiAgICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodGhpcy5kaXNwbGF5ZWRGaWxlcylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKG5ld09iailcclxuICAgICAgICAgIHRoaXMuZW1pdGVkVmFsdWUuZW1pdChuZXdPYmopXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudXBsb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy51cGxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICBlcnI/LmVycm9yPy5tZXRhPy5tZXNzYWdlcz8uZm9yRWFjaCgobXNnKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKG1zZy5tZXNzYWdlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhZGRBdHRhY2htZW50cygpIHtcclxuICAgIHRoaXMucHJvY2Vzc0F0dGFjaG1lbnRzKHRoaXMuY29udHJvbC52YWx1ZSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgYWRkTXVsdGlBdHRhY2htZW50cyhmaWVsZDogYW55KSB7XHJcbiAgICB0aGlzLnByb2Nlc3NBdHRhY2htZW50cyhmaWVsZCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgaXNGaWxlTm90RHVwbGljYXRlKGZpbGU6IEZpbGVJbmZvKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5hbGxBdHRhY2htZW50cz8ubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmFsbEF0dGFjaG1lbnRzPy5maW5kSW5kZXgoKCRmaWxlKSA9PiAoZmlsZS5maWxlTmFtZSA9PT0gJGZpbGUuZmlsZU5hbWUpKSA9PT0gLTE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBpc1ZhbGlkTWltZVR5cGUodmFsdWU6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuYXR0YWNoVHlwZSA9PSAncGRmJykge1xyXG4gICAgICByZXR1cm4gKFtdIGFzIHN0cmluZ1tdKS5jb25jYXQoLi4uT2JqZWN0LnZhbHVlcyh0aGlzLnZhbGlkUGRmVHlwZXMpKS5pbmNsdWRlcyh2YWx1ZSk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuYXR0YWNoVHlwZSA9PSAnaW1hZ2UnKSB7XHJcbiAgICAgIHJldHVybiAoW10gYXMgc3RyaW5nW10pLmNvbmNhdCguLi5PYmplY3QudmFsdWVzKHRoaXMudmFsaWRJbWFnZVR5cGVzKSkuaW5jbHVkZXModmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzVmFsaWRFeHRlbnNpb24odmFsdWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodHlwZSA9PSAnaW1hZ2UnKSB7XHJcbiAgICAgIHJldHVybiBbXS5jb25jYXQoLi4uT2JqZWN0LmtleXModGhpcy52YWxpZEltYWdlVHlwZXMpKS5pbmNsdWRlcyh2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImltYWdlUGRmXCIpIHtcclxuICAgICAgcmV0dXJuIFtdLmNvbmNhdCguLi5PYmplY3Qua2V5cyh0aGlzLnZhbGlkSW1nUGRmVHlwZXMpKS5pbmNsdWRlcyh2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJwZGZcIikge1xyXG4gICAgICByZXR1cm4gW10uY29uY2F0KC4uLk9iamVjdC5rZXlzKHRoaXMudmFsaWRQZGZUeXBlcykpLmluY2x1ZGVzKHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFtdLmNvbmNhdCguLi5PYmplY3Qua2V5cyh0aGlzLnZhbGlkRmlsZVR5cGVzKSkuaW5jbHVkZXModmFsdWUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVBdHRhY2hlZEZpbGUoKSB7XHJcbiAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUobmV3IEZpbGVJbmZvKG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpKVxyXG4gICAgaWYgKHRoaXMuaW5wdXRGaWxlKSB7XHJcbiAgICAgIHRoaXMuaW5wdXRGaWxlLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbWl0KHRoaXMudmFsdWUpXHJcbiAgICB0aGlzLmNvbnRyb2wucmVzZXQoKVxyXG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlQXR0YWNobWVudC5lbWl0KG51bGwpO1xyXG4gIH1cclxuXHJcbiAgZG93bmxvYWRGaWxlKGV2ZW50LCBmaWVsZCkge1xyXG4gICAgaWYgKHRoaXMuY3VzdG9tRG93bmxvYWQpIHtcclxuICAgICAgdGhpcy5kb3dubG9hZEFjdGlvbkNsaWNrZWQuZW1pdChmaWVsZClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29yZVNlcnZpY2UubG9hZEZpbGUoZmllbGQuYXR0YWNobWVudElkKS5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXHJcbiAgICAgICkuc3Vic2NyaWJlKFxyXG4gICAgICAgIChyZXNwb25zZU9iamVjdDogeyBib2R5OiBhbnk7IH0pID0+IHtcclxuICAgICAgICAgIGNvbnN0IGZpbGVJbmZvcm1hdGlvbiA9IHJlc3BvbnNlT2JqZWN0LmJvZHk7XHJcbiAgICAgICAgICB0aGlzLmNvcmVTZXJ2aWNlLnNhdmVGaWxlKGZpbGVJbmZvcm1hdGlvbilcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoZXJyb3IuZXJyb3I/LlsnbWVzc2FnZSddKVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXQ8VD4odmFsdWU6IFQgfCBUW10pIHtcclxuICAgIGlmICh0aGlzLnByZXZlbnRGaWxlQ29udGVudHMpIHtcclxuICAgICAgdmFsdWUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XHJcbiAgICAgIHRoaXMuZGVsZXRlRmlsZUNvbnRlbnRzKHZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVsZXRlRmlsZUNvbnRlbnRzKGRhdGE6IGFueSkge1xyXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiAnZmlsZUNvbnRlbnRzJyBpbiBkYXRhKSB7XHJcbiAgICAgIGRlbGV0ZSBkYXRhLmZpbGVDb250ZW50cztcclxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xyXG4gICAgICBkYXRhLmZvckVhY2goZWxlbSA9PiB0aGlzLmRlbGV0ZUZpbGVDb250ZW50cyhlbGVtKSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBGaWxlSW5mbyB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgZmlsZU5hbWU6IHN0cmluZyxcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcsXHJcbiAgICBwdWJsaWMgbWltZVR5cGU6IHN0cmluZyxcclxuICAgIHB1YmxpYyBmaWxlQ29udGVudHM6IHN0cmluZyxcclxuICAgIHB1YmxpYyBmaWxlc2l6ZTogc3RyaW5nXHJcbiAgKSB7IH1cclxufVxyXG4iLCJAaWYgKCFpc1JlYWRPbmx5KSB7XHJcbiAgPG5nLWNvbnRhaW5lcj5cclxuICAgIEBpZihsYWJlbCkge1xyXG4gICAgICA8YXBwLWZvcm0tbGFiZWwgW2xhYmVsXT1cImxhYmVsXCIgW29wdGlvbmFsXT1cInJlcXVpcmVkIHx8IG1hbmRhdG9yeSA/IGZhbHNlIDogdHJ1ZVwiIFt0b29sdGlwXT1cInRvb2x0aXBcIj48L2FwcC1mb3JtLWxhYmVsPlxyXG4gICAgfVxyXG4gICAgPHNlY3Rpb25cclxuICAgIChjbGljayk9XCJmaWxlQXR0YWNoZWQuY2xpY2soKVwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cImluc2lkZVRhYmxlID8gJ2ZpbGUtdXBsb2FkZXItdGFibGUnIDogJ2ZpbGUtdXBsb2FkZXInXCIgY2xhc3M9XCIgbWItMlwiXHJcbiAgICAgIFtjbGFzcy5pbnNpZGVUYWJsZVN0eWxlXT1cImluc2lkZVRhYmxlXCI+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBbbmdDbGFzc109XCJpbnNpZGVUYWJsZSA/ICdmaWxlLXVwbG9hZGVyLXRhYmxlLWRldicgOiAnJ1wiIGNsYXNzPVwiZmlsZS11cGxvYWRlci1pbnB1dFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIEBpZiAoIXVwbG9hZGluZykge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImljb24gbWItMVwiPlxyXG4gICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaW5zaWRlVGFibGUgPyAnZmlsZS11cGxvYWRlci10YWJsZS1zdmcnIDogJydcIiB3aWR0aD1cIjQxXCIgaGVpZ2h0PVwiMzhcIiB2aWV3Qm94PVwiMCAwIDQxIDM4XCJcclxuICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0wIDIyLjE5NDdWMjAuNjczNkMwLjA5NzEzMDMgMjAuMTAxOSAwLjA3MDA5NCAxOS41MTQxIDAuMjc2MzcxIDE4Ljk1MzNDMS4yODM3MiAxNi4yMDg2IDMuMjEyMzEgMTQuNTAyMyA2LjA0MjEgMTMuODA5NEM2LjcwNDk5IDEzLjY0NzIgNi42ODQ5NyAxMy42NjMyIDYuNjk4OTkgMTIuOTg0M0M2LjczMjAzIDExLjMzMjEgNi45OTgzOSA5LjcxOTkyIDcuNjI0MjMgOC4xNzk4NkM4Ljg2Mjg5IDUuMTM2NzggMTAuOTQ2NyAyLjgzOTY5IDEzLjg4MTYgMS4zOTE3NUMxNy4xNjggLTAuMjMwNDI0IDIwLjU5NTYgLTAuNDUwNzE5IDI0LjA1NTMgMC44MTU5OEMyNy40OTI5IDIuMDc0NjcgMjkuOTYyMiA0LjQxNTgxIDMxLjQ4MDIgNy43NDgyOEMzMS43Nzg2IDguNDAzMTYgMzIuMDI3IDkuMDgzMDcgMzIuMTcxMiA5Ljc5MjAyQzMyLjI0MDIgMTAuMTMxNSAzMi40MDM1IDEwLjI1NjYgMzIuNzUyOSAxMC4zMTA3QzM2LjcwMTIgMTAuOTE2NSAzOS4zMzU4IDEzLjEyNTUgNDAuNjk0NiAxNi44NzM1QzQwLjkwNjkgMTcuNDYwMyA0MC45MTk5IDE4LjA3MzEgNDAuOTU5OSAxOC42ODI5QzQwLjk2NDkgMTguNzYwMSA0MC45Mzg5IDE4Ljg0NDIgNDEgMTguOTExM1YyMC41MTI0QzQwLjkxMDkgMjAuOTk1IDQwLjk2OSAyMS40OTM3IDQwLjg2MDggMjEuOTczNEM0MC41MjQ0IDIzLjQ2MTQgMzkuODQ1NCAyNC43ODIxIDM4Ljg1MDEgMjUuOTI5N0MzNy40NTIyIDI3LjU0MTggMzUuNzA1OSAyOC41ODgyIDMzLjYxNjEgMjkuMDUxOUMzMi43OTEgMjkuMjM1MSAzMS45NDk5IDI5LjI1MjEgMzEuMTExNyAyOS4yOTIyQzMwLjY1NzEgMjkuMzE0MiAzMC41ODQgMjkuMTkzIDMwLjU5MiAyOC43NDg0QzMwLjY0NTEgMjUuODQ0NiAyOS44MDIgMjMuMjU3MSAyNy44NjI0IDIxLjA1OTFDMjUuOTk3OSAxOC45NDYzIDIzLjY1OTcgMTcuNzE2NyAyMC44NjcgMTcuNDAxMkMxOC44NTUzIDE3LjE3MzkgMTYuOTA1NyAxNy40NTkzIDE1LjA2MTIgMTguMzM5NUMxMS44MzE5IDE5Ljg4MTYgOS44MTQxNiAyMi40MDY5IDguOTYxMDIgMjUuODY5NkM4Ljc0MjczIDI2Ljc1MzggOC42ODI2NSAyNy42NTggOC43MDU2OCAyOC41NzAyQzguNzIxNyAyOS4yMTExIDguNjAyNTQgMjkuMzEyMiA3Ljk1OTY4IDI5LjI5NzJDNS45NTA5OCAyOS4yNTExIDQuMTA1NTEgMjguNzIzNCAyLjU4MTQ2IDI3LjM1OTZDMS4wNzY0NCAyNi4wMTY4IDAuMDY4MDkxMyAyNC4zOTk2IDAuMDQwMDUzNyAyMi4zMDI4QzAuMDQwMDUzNyAyMi4yNjA3IDAuMDI1MDMzNiAyMi4yMjU3IDAgMjIuMTkzN1YyMi4xOTQ3WlwiXHJcbiAgICAgICAgICAgICAgICBmaWxsPVwiI0RFRTBFMlwiLz5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0yOS4wMzAzIDI4LjI2MzJDMjkuMDYwNCAzMy40MDMxIDI0Ljg2NTcgMzcuNjE4NyAxOS42ODM4IDM3LjY1NDhDMTQuNTE2OSAzNy42OTA4IDEwLjI4NTIgMzMuNDk1MiAxMC4yNTIxIDI4LjMwNDJDMTAuMjIwMSAyMy4xNDAzIDE0LjQyOTcgMTguOTEyNiAxOS42MjI3IDE4Ljg5NDZDMjQuODAzNyAxOC44NzY2IDI4Ljk5OTMgMjMuMDU0MiAyOS4wMzAzIDI4LjI2MzJaXCJcclxuICAgICAgICAgICAgICAgIGZpbGw9XCIjOEU5QUEwXCIvPlxyXG4gICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICBkPVwiTTIwLjU1NzMgMjUuMjY0NEMyMC40NjIyIDI1LjQ0NzcgMjAuNTAxMiAyNS41OTM5IDIwLjUwMTIgMjUuNzM0QzIwLjQ5ODIgMjguMjE1NCAyMC41MDAyIDMwLjY5NTcgMjAuNDk4MiAzMy4xNzdDMjAuNDk4MiAzMy44MDk5IDIwLjIzMzkgMzQuMTcwNCAxOS43NDYyIDM0LjIyMzRDMTkuMjY0NSAzNC4yNzY1IDE4Ljg4IDMzLjk4MzEgMTguODE2OSAzMy41MDI1QzE4Ljc5NTkgMzMuMzQ0MyAxOC43OTY5IDMzLjE4MyAxOC43OTY5IDMzLjAyMzhDMTguNzk1OSAzMC41ODI2IDE4Ljc5NjkgMjguMTQyMyAxOC43OTY5IDI1LjcwMUMxOC43OTY5IDI1LjU3MjggMTguNzk2OSAyNS40NDQ3IDE4Ljc5NjkgMjUuMjAwM0MxOC4xOTcxIDI1LjgwMzEgMTcuNjc3NCAyNi4zMjg4IDE3LjE1MjcgMjYuODUwNUMxNy4wMTE1IDI2Ljk5MDcgMTYuODY4MyAyNy4xMzQ5IDE2LjcwNjEgMjcuMjQ3MUMxNi4zNTY2IDI3LjQ4NjQgMTUuOTM0MSAyNy40NDEzIDE1LjY0NTcgMjcuMTU0QzE1LjM2NDMgMjYuODc0NiAxNS4zMjAzIDI2LjQ0MiAxNS41NDg2IDI2LjA5MjVDMTUuNjIwNyAyNS45ODI0IDE1LjcxMjggMjUuODgzMiAxNS44MDY5IDI1Ljc4OTFDMTYuODYxMyAyNC43MzA3IDE3LjkxNjcgMjMuNjczMyAxOC45NzMyIDIyLjYxNzlDMTkuNDAxNyAyMi4xODkzIDE5Ljg3ODQgMjIuMTc2MyAyMC4zMDM5IDIyLjU5ODhDMjEuMzkxNCAyMy42ODAzIDIyLjQ3MzkgMjQuNzY2NyAyMy41NTMzIDI1Ljg1NzJDMjMuOTgwOSAyNi4yODk4IDI0LjAxMjkgMjYuODA2NSAyMy42NTM0IDI3LjE2N0MyMy4yOTkgMjcuNTIxNCAyMi43NzUzIDI3LjQ4NDQgMjIuMzQzNyAyNy4wNTY4QzIxLjc0OTkgMjYuNDcgMjEuMTY2MSAyNS44NzMyIDIwLjU2MDMgMjUuMjY0NEgyMC41NTczWlwiXHJcbiAgICAgICAgICAgICAgICBmaWxsPVwiI0Y5RjlGOVwiLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGlmICh1cGxvYWRpbmcpIHtcclxuICAgICAgICAgIDxkcy1pY29uIGNsYXNzPVwic2ZpIHNmaS1zcGlubmVyIGQtaW5saW5lLWJsb2NrIHNwaW4gZmMtY29yYWwgZnMtMzAtaW1wXCI+PC9kcy1pY29uPlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImYtMTQgZmMtYmxhY2sgZnctbm9ybWFsXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZjLWNvcmFsIGZ3LW1lZGl1bVwiPnt7ICdicm93c2UnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy0xMCBmYy1kYXJrLWdyYXlcIj5cclxuICAgICAgICAgIHt7IGFsbG93ZWRFeHRlbnNpb25zID8gYWxsb3dlZEV4dGVuc2lvbnMgOiAnJyB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiAjaW5wdXRGaWxlIFthY2NlcHRdPVwiYWNjZXB0XCIgY2xhc3M9XCJkLW5vbmVcIiAjZmlsZUF0dGFjaGVkIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZSgkZXZlbnQpXCI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9zZWN0aW9uPlxyXG5cclxuICAgIEBpZiAoaGludHMpIHtcclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTMgbWItM1wiPlxyXG4gICAgICAgIEBmb3IgKGhpbnQgb2YgaGludHM7IHRyYWNrIGhpbnQpIHtcclxuICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0xIGZzLTEyXCI+XHJcbiAgICAgICAgICAgICAgPGRzLWljb25cclxuICAgICAgICAgICAgICAgIGljb249XCJ7eyBoaW50LnZhbGlkID8gJ2NoZWNrLWNpcmNsZS1mJyA6ICdjaGVjay1jaXJjbGUtbycgfX1cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmcy0yNCB7eyBoaW50LnZhbGlkID8gJ2ZjLWdyZWVuJyA6ICdmYy1kYXJrLWdyYXknIH19XCI+PC9kcy1pY29uPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwie3sgaGludC52YWxpZCA/ICdmYy1ibGFjaycgOiAnZmMtZGFyay1ncmF5JyB9fVwiPnt7IGhpbnQubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIH1cclxuXHJcbiAgICBAaWYgKGhpbnQpIHtcclxuICAgICAgPG1hdC1oaW50IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMVwiPlxyXG4gICAgICAgIDxkcy1pY29uIGljb249XCJpbmZvXCIgY2xhc3M9XCJmcy0xNyBmYy1kYXJrLWdyYXlcIj48L2RzLWljb24+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJmcy0xMiBmYy1ibGFjayBsaW5lLWhlaWdodC0xXCI+e3sgaGludCB9fTwvc3Bhbj5cclxuICAgICAgPC9tYXQtaGludD5cclxuICAgIH1cclxuXHJcbiAgICBAaWYgKG11bHRpcGxlKSB7XHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiZmlsZXMtbGlzdFwiPlxyXG4gICAgICAgIEBmb3IgKGZpbGUgb2YgZGlzcGxheWVkRmlsZXM7IHRyYWNrIGZpbGU7IGxldCBpID0gJGluZGV4KSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1pdGVtLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZHMtYXR0YWNobWVudHNcclxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJmaWxlPy5maWxlTmFtZVwiXHJcbiAgICAgICAgICAgICAgW2ZpbGVdPVwieyBuYW1lOiBmaWxlLmZpbGVOYW1lIH1cIlxyXG4gICAgICAgICAgICAgIChkb3dubG9hZEV2ZW50KT1cImF0dGFjaG1lbnRBY3Rpb24oJ2Rvd25sb2FkJywgaSwgZmlsZSlcIlxyXG4gICAgICAgICAgICAgIChkZWxldGVFdmVudCk9XCJhdHRhY2htZW50QWN0aW9uKCdkZWxldGUnLCBpLCBmaWxlKVwiXHJcbiAgICAgICAgICAgICAgW3Nob3dBY3Rpb25zXT1cInNob3dBY3Rpb25zXCI+XHJcbiAgICAgICAgICAgIDwvZHMtYXR0YWNobWVudHM+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuICAgIH1cclxuXHJcbiAgICBAaWYgKCFtdWx0aXBsZSAmJiAoY29udHJvbD8udmFsdWU/LmZpbGVDb250ZW50cyB8fCBjb250cm9sPy52YWx1ZT8uYXR0YWNobWVudElkKSkge1xyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImZpbGVzLWxpc3RcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1pdGVtLWNvbnRhaW5lciBmaWxlLWl0ZW0tY29udGFpbmVyLWFjdGlvbnNcIj5cclxuICAgICAgICAgIDxkcy1hdHRhY2htZW50c1xyXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJjb250cm9sPy52YWx1ZT8uZmlsZU5hbWVcIlxyXG4gICAgICAgICAgICBbZmlsZV09XCJ7IG5hbWU6IGNvbnRyb2w/LnZhbHVlLmZpbGVOYW1lIH1cIlxyXG4gICAgICAgICAgICAoZG93bmxvYWRFdmVudCk9XCJhdHRhY2htZW50QWN0aW9uKCdkb3dubG9hZCcsIG51bGwsIGNvbnRyb2w/LnZhbHVlKVwiXHJcbiAgICAgICAgICAgIChkZWxldGVFdmVudCk9XCJhdHRhY2htZW50QWN0aW9uKCdkZWxldGUnLCBudWxsLCBjb250cm9sPy52YWx1ZSlcIlxyXG4gICAgICAgICAgICBbc2hvd0FjdGlvbnNdPVwic2hvd0FjdGlvbnNcIj5cclxuICAgICAgICAgIDwvZHMtYXR0YWNobWVudHM+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuICAgIH1cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiYXR0YWNobWVudHMtZXJyb3JcIj5cclxuICAgICAgQGlmICghdmFsaWRFeHRlbnNpb24pIHtcclxuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImZpbGVzLWxpc3QgbXQtMlwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtaXRlbS1jb250YWluZXIgXCI+XHJcbiAgICAgICAgICAgIDxkcy1hdHRhY2htZW50c1xyXG4gICAgICAgICAgICAgIFtmaWxlXT1cIndyb25nRmlsZVwiIGVycm9yIFtzaG93QWN0aW9uc109XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICA8L2RzLWF0dGFjaG1lbnRzPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICB9XHJcblxyXG4gICAgICBAaWYgKCFhbGxvd2VkRmlsZVNpemUpIHtcclxuICAgICAgICA8bWF0LWVycm9yIGNsYXNzPVwiZnMtMTIgbXktMlwiPlxyXG4gICAgICAgICAge3sgbWF4U2l6ZSA9PT0gXCIwLjNcIiA/ICgnc3VwcG9ydDMnIHwgdHJhbnNsYXRlICk6ICgnc3VwcG9ydDInIHwgdHJhbnNsYXRlKSArIG1heFNpemUgKyAoJ21iJyB8IHRyYW5zbGF0ZSkgfX1cclxuICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgfVxyXG5cclxuICAgICAgQGlmICghZmlsZU5vdER1cGxpY2F0ZWQpIHtcclxuICAgICAgICA8bWF0LWVycm9yIGNsYXNzPVwiZnMtMTIgbXktMlwiPnt7ICdkdXBsaWNhdGVkLWVycm9yJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWVycm9yPlxyXG4gICAgICB9XHJcblxyXG4gICAgICBAaWYgKGxlbmd0aEVycm9yKSB7XHJcbiAgICAgICAgPG1hdC1lcnJvciBjbGFzcz1cImZzLTEyXCI+e3sgJ2xlbmd0aEVycm9yJyB8IHRyYW5zbGF0ZSB9fSA6e3sgbWF4TGVuZ3RoIH19PC9tYXQtZXJyb3I+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEBpZiAoc2hvd0Vycm9yTWVzc2FnZSkge1xyXG4gICAgICAgIDwhLS0gPG1hdC1lcnJvciBjbGFzcz1cImZzLTEyXCI+e3tlcnJvck1lc3NhZ2V9fSA8L21hdC1lcnJvcj4gLS0+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG59XHJcblxyXG5AaWYgKGlzUmVhZE9ubHkpIHtcclxuICA8bmctY29udGFpbmVyPlxyXG4gICAgQGlmIChtdWx0aXBsZSAmJiBkaXNwbGF5ZWRGaWxlcykge1xyXG4gICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLWl0ZW1cIj5cclxuICAgICAgICAgIEBpZiAobGFiZWwpIHtcclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYW1lXCI+e3sgbGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBAaWYgKGRpc3BsYXllZEZpbGVzPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgQGZvciAoZmlsZSBvZiBkaXNwbGF5ZWRGaWxlczsgdHJhY2sgZmlsZTsgbGV0IGkgPSAkaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlLWl0ZW0tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkcy1hdHRhY2htZW50c1xyXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImZpbGU/LmZpbGVOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm15LTJcIiBbZmlsZV09XCJ7IG5hbWU6IGZpbGUuZmlsZU5hbWUgfVwiIHJlYWRPbmx5IChkb3dubG9hZEV2ZW50KT1cImRvd25sb2FkRmlsZSgkZXZlbnQsIGZpbGUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd0FjdGlvbnNdPVwic2hvd0FjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPC9kcy1hdHRhY2htZW50cz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgQGlmICghZGlzcGxheWVkRmlsZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRpc2NcIj5cclxuICAgICAgICAgICAgICB7eyAnTm9BdHRhY2htZW50cycgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIH1cclxuXHJcbiAgICBAaWYgKCFtdWx0aXBsZSAmJiAoY29udHJvbD8udmFsdWU/LlsnYXR0YWNobWVudElkJ10gfHwgY29udHJvbD8udmFsdWU/LlsnZmlsZUNvbnRlbnRzJ10pKSB7XHJcbiAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImluZm8taXRlbVwiPlxyXG4gICAgICAgICAgQGlmIChsYWJlbCkge1xyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hbWVcIj57eyBsYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNjIGZpbGUtaXRlbS1jb250YWluZXIgZmlsZS1pdGVtLWNvbnRhaW5lci1hY3Rpb25zXCIgW25nQ2xhc3NdPVwieydpbnNpZGVUYWJsZVdpZHRoJzogaW5zaWRlVGFibGV9XCI+XHJcbiAgICAgICAgICAgIEBpZiAoY29udHJvbD8udmFsdWU/LlsnYXR0YWNobWVudElkJ10gfHwgY29udHJvbD8udmFsdWU/LlsnZmlsZUNvbnRlbnRzJ10pIHtcclxuICAgICAgICAgICAgICA8ZHMtYXR0YWNobWVudHNcclxuICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImNvbnRyb2w/LnZhbHVlPy5maWxlTmFtZVwiIFtmaWxlXT1cInsgbmFtZTogY29udHJvbD8udmFsdWUuZmlsZU5hbWUgfVwiIFtzaG93QWN0aW9uc109XCJzaG93QWN0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAoZG93bmxvYWRFdmVudCk9XCJhdHRhY2htZW50QWN0aW9uKCdkb3dubG9hZCcsIG51bGwsIGNvbnRyb2w/LnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAoZGVsZXRlRXZlbnQpPVwiYXR0YWNobWVudEFjdGlvbignZGVsZXRlJywgbnVsbCwgY29udHJvbD8udmFsdWUpXCJcclxuICAgICAgICAgICAgICAgIHJlYWRPbmx5PlxyXG4gICAgICAgICAgICAgIDwvZHMtYXR0YWNobWVudHM+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIH1cclxuICA8L25nLWNvbnRhaW5lcj5cclxufSJdfQ==