nuxeo-development-framework 2.0.8 → 3.0.0

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 (136) hide show
  1. package/bundles/nuxeo-development-framework.umd.js +8335 -455
  2. package/bundles/nuxeo-development-framework.umd.js.map +1 -1
  3. package/esm2015/lib/components/activities-log/activities-log/activities-log.component.js +84 -0
  4. package/esm2015/lib/components/activities-log/activities-log/activities-log.service.js +35 -0
  5. package/esm2015/lib/components/activities-log/activities-log.module.js +30 -0
  6. package/esm2015/lib/components/attachment-item/attachment-item/attachment-item.component.js +54 -0
  7. package/esm2015/lib/components/attachment-item/attachment-item.module.js +44 -0
  8. package/esm2015/lib/components/attachment-modal/attachment-modal.module.js +40 -0
  9. package/esm2015/lib/components/attachment-modal/attachments/attachments.component.js +157 -0
  10. package/esm2015/lib/components/confirmation-dialog/confirmation-dialog/confirmation-dialog.component.js +30 -0
  11. package/esm2015/lib/components/confirmation-dialog/confirmation-dialog.module.js +30 -0
  12. package/esm2015/lib/components/display-suitable-icon/display-suitable-icon/display-suitable-icon.component.js +44 -0
  13. package/esm2015/lib/components/display-suitable-icon/display-suitable-icon/icon.service.js +140 -0
  14. package/esm2015/lib/components/display-suitable-icon/display-suitable-icon.module.js +24 -0
  15. package/esm2015/lib/components/dynamic-fields-renderer/dynamic-fields-renderer/dynamic-fields-renderer.component.js +177 -0
  16. package/esm2015/lib/components/dynamic-fields-renderer/dynamic-fields-renderer.module.js +43 -0
  17. package/esm2015/lib/components/dynamic-tabs/dynamic-tabs/dynamic-tabs.component.js +39 -0
  18. package/esm2015/lib/components/dynamic-tabs/dynamic-tabs.module.js +34 -0
  19. package/esm2015/lib/components/file-manger/components/add-to-collection/add-to-collection.component.js +132 -0
  20. package/esm2015/lib/components/file-manger/components/copy/copy.component.js +119 -0
  21. package/esm2015/lib/components/file-manger/components/create-directory/create-directory.component.js +91 -0
  22. package/esm2015/lib/components/file-manger/components/create-modal/create-modal.component.js +455 -0
  23. package/esm2015/lib/components/file-manger/components/creation-type/creation-type.component.js +26 -0
  24. package/esm2015/lib/components/file-manger/components/delete/delete.component.js +77 -0
  25. package/esm2015/lib/components/file-manger/components/folder-modal/folder-modal.component.js +114 -0
  26. package/esm2015/lib/components/file-manger/components/loan-request/loan-request.component.js +80 -0
  27. package/esm2015/lib/components/file-manger/components/move/move.component.js +108 -0
  28. package/esm2015/lib/components/file-manger/components/publish-dialog/publish-dialog.component.js +111 -0
  29. package/esm2015/lib/components/file-manger/components/rename/rename.component.js +86 -0
  30. package/esm2015/lib/components/file-manger/components/scan-modal/scan-modal.component.js +313 -0
  31. package/esm2015/lib/components/file-manger/components/share-dialog/share-dialog.component.js +294 -0
  32. package/esm2015/lib/components/file-manger/components/sidepanel/sidepanel.component.js +256 -0
  33. package/esm2015/lib/components/file-manger/components/template-modal/template-modal.component.js +64 -0
  34. package/esm2015/lib/components/file-manger/components/transfer-doc/transfer-doc.component.js +71 -0
  35. package/esm2015/lib/components/file-manger/components/update-modal/update-modal.component.js +358 -0
  36. package/esm2015/lib/components/file-manger/file-manager.abstract.js +1004 -0
  37. package/esm2015/lib/components/file-manger/file-manger.module.js +275 -0
  38. package/esm2015/lib/components/hijri-gregorian-datepicker/hijri-gregorian-datepicker/hijri-datepicker/hijri-datepicker.component.js +8 -2
  39. package/esm2015/lib/components/hijri-gregorian-datepicker/utils/IslamicI18n.js +2 -2
  40. package/esm2015/lib/components/mutiple-dynamic-form-viewer/multiple-dynamic-form-viewer/multiple-dynamic-form-viewer.component.js +51 -0
  41. package/esm2015/lib/components/mutiple-dynamic-form-viewer/mutiple-dynamic-form-viewer.module.js +30 -0
  42. package/esm2015/lib/components/permissions/add-permissions-dialog/add-permissions-dialog.component.js +177 -0
  43. package/esm2015/lib/components/permissions/permission.service.js +118 -0
  44. package/esm2015/lib/components/permissions/permissions/permissions.component.js +232 -0
  45. package/esm2015/lib/components/permissions/permissions-template/permissions-template.component.js +117 -0
  46. package/esm2015/lib/components/permissions/permissions.module.js +71 -0
  47. package/esm2015/lib/components/select-users-by-department/select-users-by-department.module.js +47 -0
  48. package/esm2015/lib/components/select-users-by-department/select-users-by-departments/department-management.service.js +27 -0
  49. package/esm2015/lib/components/select-users-by-department/select-users-by-departments/select-users-by-departments.component.js +116 -0
  50. package/esm2015/lib/components/user/user/user.component.js +29 -0
  51. package/esm2015/lib/components/user/user.module.js +30 -0
  52. package/esm2015/lib/directive/directive.module.js +9 -4
  53. package/esm2015/lib/directive/drag-and-drop/drag-and-drop.directive.js +46 -0
  54. package/esm2015/lib/shared/libraryShared.module.js +1 -4
  55. package/esm2015/lib/shared-services/dialog-mangment.service.js +61 -0
  56. package/esm2015/lib/shared-services/dynamic-form.service.js +241 -0
  57. package/esm2015/lib/shared-services/file-manager.adapter.js +74 -0
  58. package/esm2015/lib/shared-services/file-manager.service.js +741 -0
  59. package/esm2015/lib/shared-services/global-pdftron.service.js +46 -0
  60. package/esm2015/lib/shared-services/mainfolder.service.js +157 -0
  61. package/esm2015/lib/shared-services/publishing-document.service.js +202 -0
  62. package/esm2015/lib/shared-services/recently-viewed.service.js +57 -0
  63. package/esm2015/lib/shared-services/shared-docs.service.js +135 -0
  64. package/esm2015/lib/shared-services/shared-services.module.js +20 -0
  65. package/esm2015/lib/shared-services/upload-file.service.js +29 -0
  66. package/esm2015/lib/shared-services/upload-managment.service.js +151 -0
  67. package/esm2015/lib/shared-services/user.service.js +54 -0
  68. package/esm2015/public-api.js +64 -1
  69. package/fesm2015/nuxeo-development-framework.js +7628 -154
  70. package/fesm2015/nuxeo-development-framework.js.map +1 -1
  71. package/lib/components/activities-log/activities-log/activities-log.component.d.ts +23 -0
  72. package/lib/components/activities-log/activities-log/activities-log.service.d.ts +9 -0
  73. package/lib/components/activities-log/activities-log.module.d.ts +10 -0
  74. package/lib/components/attachment-item/attachment-item/attachment-item.component.d.ts +21 -0
  75. package/lib/components/attachment-item/attachment-item.module.d.ts +13 -0
  76. package/lib/components/attachment-modal/attachment-modal.module.d.ts +12 -0
  77. package/lib/components/attachment-modal/attachments/attachments.component.d.ts +50 -0
  78. package/lib/components/confirmation-dialog/confirmation-dialog/confirmation-dialog.component.d.ts +12 -0
  79. package/lib/components/confirmation-dialog/confirmation-dialog.module.d.ts +10 -0
  80. package/lib/components/display-suitable-icon/display-suitable-icon/display-suitable-icon.component.d.ts +17 -0
  81. package/lib/components/display-suitable-icon/display-suitable-icon/icon.service.d.ts +8 -0
  82. package/lib/components/display-suitable-icon/display-suitable-icon.module.d.ts +8 -0
  83. package/lib/components/dynamic-fields-renderer/dynamic-fields-renderer/dynamic-fields-renderer.component.d.ts +137 -0
  84. package/lib/components/dynamic-fields-renderer/dynamic-fields-renderer.module.d.ts +12 -0
  85. package/lib/components/dynamic-tabs/dynamic-tabs/dynamic-tabs.component.d.ts +13 -0
  86. package/lib/components/dynamic-tabs/dynamic-tabs.module.d.ts +11 -0
  87. package/lib/components/file-manger/components/add-to-collection/add-to-collection.component.d.ts +31 -0
  88. package/lib/components/file-manger/components/copy/copy.component.d.ts +32 -0
  89. package/lib/components/file-manger/components/create-directory/create-directory.component.d.ts +24 -0
  90. package/lib/components/file-manger/components/create-modal/create-modal.component.d.ts +108 -0
  91. package/lib/components/file-manger/components/creation-type/creation-type.component.d.ts +11 -0
  92. package/lib/components/file-manger/components/delete/delete.component.d.ts +30 -0
  93. package/lib/components/file-manger/components/folder-modal/folder-modal.component.d.ts +56 -0
  94. package/lib/components/file-manger/components/loan-request/loan-request.component.d.ts +23 -0
  95. package/lib/components/file-manger/components/move/move.component.d.ts +32 -0
  96. package/lib/components/file-manger/components/publish-dialog/publish-dialog.component.d.ts +32 -0
  97. package/lib/components/file-manger/components/rename/rename.component.d.ts +25 -0
  98. package/lib/components/file-manger/components/scan-modal/scan-modal.component.d.ts +95 -0
  99. package/lib/components/file-manger/components/share-dialog/share-dialog.component.d.ts +58 -0
  100. package/lib/components/file-manger/components/sidepanel/sidepanel.component.d.ts +62 -0
  101. package/lib/components/file-manger/components/template-modal/template-modal.component.d.ts +34 -0
  102. package/lib/components/file-manger/components/transfer-doc/transfer-doc.component.d.ts +24 -0
  103. package/lib/components/file-manger/components/update-modal/update-modal.component.d.ts +194 -0
  104. package/lib/components/file-manger/file-manager.abstract.d.ts +169 -0
  105. package/lib/components/file-manger/file-manger.module.d.ts +55 -0
  106. package/lib/components/hijri-gregorian-datepicker/hijri-gregorian-datepicker/hijri-datepicker/hijri-datepicker.component.d.ts +2 -0
  107. package/lib/components/mutiple-dynamic-form-viewer/multiple-dynamic-form-viewer/multiple-dynamic-form-viewer.component.d.ts +17 -0
  108. package/lib/components/mutiple-dynamic-form-viewer/mutiple-dynamic-form-viewer.module.d.ts +10 -0
  109. package/lib/components/permissions/add-permissions-dialog/add-permissions-dialog.component.d.ts +44 -0
  110. package/lib/components/permissions/permission.service.d.ts +21 -0
  111. package/lib/components/permissions/permissions/permissions.component.d.ts +48 -0
  112. package/lib/components/permissions/permissions-template/permissions-template.component.d.ts +22 -0
  113. package/lib/components/permissions/permissions.module.d.ts +21 -0
  114. package/lib/components/select-users-by-department/select-users-by-department.module.d.ts +13 -0
  115. package/lib/components/select-users-by-department/select-users-by-departments/department-management.service.d.ts +10 -0
  116. package/lib/components/select-users-by-department/select-users-by-departments/select-users-by-departments.component.d.ts +33 -0
  117. package/lib/components/user/user/user.component.d.ts +12 -0
  118. package/lib/components/user/user.module.d.ts +10 -0
  119. package/lib/directive/directive.module.d.ts +3 -2
  120. package/lib/directive/drag-and-drop/drag-and-drop.directive.d.ts +11 -0
  121. package/lib/shared/libraryShared.module.d.ts +1 -1
  122. package/lib/shared-services/dialog-mangment.service.d.ts +15 -0
  123. package/lib/shared-services/dynamic-form.service.d.ts +24 -0
  124. package/lib/shared-services/file-manager.adapter.d.ts +48 -0
  125. package/lib/shared-services/file-manager.service.d.ts +89 -0
  126. package/lib/shared-services/global-pdftron.service.d.ts +10 -0
  127. package/lib/shared-services/mainfolder.service.d.ts +29 -0
  128. package/lib/shared-services/publishing-document.service.d.ts +25 -0
  129. package/lib/shared-services/recently-viewed.service.d.ts +17 -0
  130. package/lib/shared-services/shared-docs.service.d.ts +21 -0
  131. package/lib/shared-services/shared-services.module.d.ts +7 -0
  132. package/lib/shared-services/upload-file.service.d.ts +10 -0
  133. package/lib/shared-services/upload-managment.service.d.ts +72 -0
  134. package/lib/shared-services/user.service.d.ts +12 -0
  135. package/package.json +7 -6
  136. package/public-api.d.ts +61 -0
@@ -0,0 +1,313 @@
1
+ import { Component, Inject } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import { MAT_DIALOG_DATA } from '@angular/material/dialog';
4
+ import * as moment from 'moment';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/material/dialog";
7
+ import * as i2 from "../../../../shared-services/upload-managment.service";
8
+ import * as i3 from "../../../../shared-services/dialog-mangment.service";
9
+ import * as i4 from "../../../../shared-services/file-manager.service";
10
+ import * as i5 from "../../../custom-toastr/services/custom-toastr.service";
11
+ import * as i6 from "@angular/forms";
12
+ import * as i7 from "../../../../shared-services/dynamic-form.service";
13
+ import * as i8 from "../../../hijri-gregorian-datepicker/services/date-helper.service";
14
+ import * as i9 from "../../../../Core/adapters/adapter.service";
15
+ import * as i10 from "../../../../Core/services/translation/translation.service";
16
+ import * as i11 from "../../../../Core/services/nuxeo/nuxeo.service";
17
+ import * as i12 from "../../../../shared-services/user.service";
18
+ import * as i13 from "../../../../configuration/app-config.service";
19
+ import * as i14 from "../../../documents/components/document-scan/document-scan.service";
20
+ import * as i15 from "../../../documents/components/document-scan/document-scan.component";
21
+ import * as i16 from "../../../dynamic-fields-renderer/dynamic-fields-renderer/dynamic-fields-renderer.component";
22
+ import * as i17 from "../../../dynamic-form/components/dynamic-form/dynamic-form.component";
23
+ import * as i18 from "@angular/common";
24
+ import * as i19 from "../../../../directive/rtl/set-rtl.directive";
25
+ import * as i20 from "@ngx-translate/core";
26
+ export class ScanModalComponent {
27
+ constructor(data, dialogRef, uploadMangmentService, dialogMangmentService, fileMangerService, tosterService, formBuilder, dynamicFormService, dateHelperService, adapter, translationService, nuxeoService, userService, appConfService, envirnoment, documentScanService) {
28
+ this.data = data;
29
+ this.dialogRef = dialogRef;
30
+ this.uploadMangmentService = uploadMangmentService;
31
+ this.dialogMangmentService = dialogMangmentService;
32
+ this.fileMangerService = fileMangerService;
33
+ this.tosterService = tosterService;
34
+ this.formBuilder = formBuilder;
35
+ this.dynamicFormService = dynamicFormService;
36
+ this.dateHelperService = dateHelperService;
37
+ this.adapter = adapter;
38
+ this.translationService = translationService;
39
+ this.nuxeoService = nuxeoService;
40
+ this.userService = userService;
41
+ this.appConfService = appConfService;
42
+ this.envirnoment = envirnoment;
43
+ this.documentScanService = documentScanService;
44
+ this.activeTab = 'scan';
45
+ this.createWhenFinishMode = false;
46
+ this.selectedFile = {
47
+ staticData: {},
48
+ fileType: '',
49
+ dynamicForm: '',
50
+ dynamicData: {
51
+ valid: false,
52
+ data: {}
53
+ },
54
+ file: ''
55
+ };
56
+ this.temporaryDyanmicData = {};
57
+ this.showRenderer = false;
58
+ this.isArabic = false;
59
+ this.showStaticForm = false;
60
+ this.usingExtraFields = false; // flage to switch between static form types
61
+ this.myEnvironment = this.envirnoment;
62
+ }
63
+ ngOnInit() {
64
+ this.langSubscription = this.translationService.isArabic.subscribe(res => {
65
+ this.isArabic = res;
66
+ });
67
+ this.createWhenFinishMode = false;
68
+ this.fileType = this.dialogMangmentService.fileType;
69
+ this.source = this.dialogMangmentService.addingFrom;
70
+ this.fileMangerService.getFileSchemas(this.fileType.type).subscribe(schemas => {
71
+ schemas.map(item => {
72
+ if (item.name === "generaldocument") {
73
+ this.usingExtraFields = true;
74
+ }
75
+ });
76
+ this.initiatfileForm();
77
+ //if starting from filemnager then i have fixed file type for all attachmetn and single dynaimc form type
78
+ if (this.source === 'fileManger') {
79
+ if (this.uploadMangmentService.uploadedFilesStatus.uploadedFiles.length > 0) {
80
+ setTimeout(() => {
81
+ this.selectedFile = Object.assign({}, this.uploadMangmentService.uploadedFilesStatus.uploadedFiles.shift());
82
+ this.temporaryDyanmicData = this.selectedFile.dynamicData.data;
83
+ this.fileForm.patchValue(this.selectedFile.staticData);
84
+ if (this.selectedFile['staticData']['agencyCategoryCode']) {
85
+ this.agencyNameFilter = {
86
+ category: this.selectedFile['staticData']['agencyCategoryCode']
87
+ };
88
+ }
89
+ if (this.selectedFile['staticData']['countryCategoryCode']) {
90
+ this.countryNameFilter = {
91
+ category: this.selectedFile['staticData']['countryCategoryCode']
92
+ };
93
+ }
94
+ this.openSubscriptions();
95
+ }, 2000);
96
+ setTimeout(() => {
97
+ this.showRenderer = true;
98
+ }, 3000);
99
+ }
100
+ else {
101
+ this.selectedFile.dynamicForm = this.dialogMangmentService.storedDynamicForm;
102
+ this.showRenderer = true;
103
+ this.openSubscriptions();
104
+ }
105
+ }
106
+ });
107
+ this.uploadStartSubscription = this.documentScanService.uploadStart.subscribe(res => {
108
+ this.uploadMangmentService.uploadedFilesStatus.uploadInProgress = res;
109
+ });
110
+ this.fileChangeSubscription = this.documentScanService.fileChange.subscribe(event => {
111
+ //console.log(event);
112
+ this.selectedFile.file = event;
113
+ let payLoad = this.constructPayLoad(this.selectedFile);
114
+ this.fileMangerService.createFile(payLoad, this.fileMangerService.selectedFolderId).subscribe(res => {
115
+ if (res['status'] && res['status'] === 'failed') {
116
+ this.uploadMangmentService.scanCreationFailed = true;
117
+ this.tosterService.show('error', 'TOASTER.ERROR', 'TOASTER.UPLOAD_ERROR');
118
+ this.removeSubscription();
119
+ }
120
+ else {
121
+ this.fileMangerService.onRefreshingFileManger.next();
122
+ this.tosterService.show('success', 'TOASTER.SUCCESS', "TOASTER.FILE_CREATED_SUCCE");
123
+ this.documentScanService.storedFile = {};
124
+ this.uploadMangmentService.resetStatus();
125
+ this.removeSubscription();
126
+ }
127
+ });
128
+ });
129
+ this.scannerUploadButton = document.getElementById('scannerUploadButton');
130
+ }
131
+ initiatfileForm() {
132
+ if (this.usingExtraFields) {
133
+ this.fileForm = this.formBuilder.group({
134
+ title: ['', [Validators.required]],
135
+ description: [''],
136
+ subject: ['', [Validators.required]],
137
+ documentNumber: [''],
138
+ gdocumentDate: [null, [Validators.required]],
139
+ secrecyLevel: [null],
140
+ importanceLevel: [null],
141
+ departmentCode: [''],
142
+ agencyCategoryCode: [null],
143
+ agencyName: [null],
144
+ countryCategoryCode: [null],
145
+ countryName: [null],
146
+ remarks: ['']
147
+ });
148
+ }
149
+ else {
150
+ this.fileForm = this.formBuilder.group({
151
+ title: ['', [Validators.required]],
152
+ description: ['']
153
+ });
154
+ }
155
+ this.staticFormFields = this.appConfService.myConfiguration.staticFormFields;
156
+ if (this.fileFormSubscription) {
157
+ this.fileFormSubscription.unsubscribe();
158
+ }
159
+ if (this.fileForm.get('departmentCode')) {
160
+ this.fileForm.get('departmentCode').setValue(this.userService.getUserDepartmentFromPath(this.data.path));
161
+ }
162
+ }
163
+ openSubscriptions() {
164
+ this.fileFormSubscription = this.fileForm.valueChanges.subscribe(data => {
165
+ this.selectedFile.staticData = data;
166
+ });
167
+ if (this.fileForm.get('agencyCategoryCode')) {
168
+ this.agencyCategCodeSubscription = this.fileForm.get('agencyCategoryCode').valueChanges.subscribe(res => {
169
+ this.fileForm.get('agencyName').setValue(null);
170
+ this.agencyNameFilter = {
171
+ category: res
172
+ };
173
+ });
174
+ }
175
+ if (this.fileForm.get('countryCategoryCode')) {
176
+ this.countryCategCodeSubscription = this.fileForm.get('countryCategoryCode').valueChanges.subscribe(res => {
177
+ this.fileForm.get('countryName').setValue(null);
178
+ this.countryNameFilter = {
179
+ category: res
180
+ };
181
+ });
182
+ }
183
+ }
184
+ onUploading(event) {
185
+ this.uploadMangmentService.uploadedFilesStatus.uploadInProgress = event;
186
+ }
187
+ // onScannerSuccess(event) {
188
+ // //console.log(event);
189
+ // this.selectedFile.file = event;
190
+ // let payLoad = this.constructPayLoad(this.selectedFile);
191
+ // this.fileMangerService.createFile(payLoad, this.fileMangerService.selectedFolderId).subscribe(res => {
192
+ // this.fileMangerService.onRefreshingFileManger.next();
193
+ // this.tosterService.show('success', 'TOASTER.SUCCESS', "TOASTER.FILE_CREATED_SUCCE")
194
+ // this.documentScanService.storedFile = {};
195
+ // this.uploadMangmentService.resetStatus();
196
+ // })
197
+ // }
198
+ ondynamicFormChange(dynamicData) {
199
+ if (dynamicData.data) {
200
+ console.log(dynamicData.data);
201
+ this.selectedFile.dynamicData = Object.assign({}, dynamicData);
202
+ }
203
+ }
204
+ closeDialog() {
205
+ this.documentScanService.storedFile = {};
206
+ this.removeSubscription();
207
+ this.dialogRef.close(false);
208
+ }
209
+ minimizDialog() {
210
+ this.documentScanService.onMinimizing.emit(true);
211
+ this.uploadMangmentService.uploadedFilesStatus.uploadedFiles.push(Object.assign({}, this.selectedFile));
212
+ this.removeSubscription();
213
+ this.dialogRef.close(true);
214
+ }
215
+ removeSubscription() {
216
+ setTimeout(() => {
217
+ this.uploadStartSubscription ? this.uploadStartSubscription.unsubscribe() : '';
218
+ this.fileChangeSubscription ? this.fileChangeSubscription.unsubscribe() : '';
219
+ }, 2000);
220
+ }
221
+ startAddingProperties() {
222
+ this.uploadMangmentService.addingPropertiesMode = true;
223
+ }
224
+ createDocument() {
225
+ this.documentScanService.onMinimizing.emit(true);
226
+ this.uploadMangmentService.uploadedFilesStatus.uploadedFiles.push(Object.assign({}, this.selectedFile));
227
+ this.scannerUploadButton.click();
228
+ this.dialogRef.close(true);
229
+ }
230
+ constructPayLoad(file) {
231
+ let props = this.dynamicFormService.constructDynamicFormPayload(file.dynamicData.data, file.dynamicForm);
232
+ let staticFormData = this.mappingStaticData(file.staticData);
233
+ let param = {
234
+ "document": {
235
+ "type": this.fileType.type,
236
+ "name": file.staticData.title,
237
+ "properties": Object.assign(Object.assign(Object.assign({}, props), staticFormData), { "file:content": {
238
+ "upload-batch": file.file.blob['upload-batch'],
239
+ "upload-fileId": file.file.blob['upload-fileId']
240
+ } })
241
+ }
242
+ };
243
+ if (file.fileType.documentCode) {
244
+ param["documentTypeCode"] = file.fileType.documentCode;
245
+ }
246
+ return { params: param, originFile: file };
247
+ }
248
+ mappingStaticData(data) {
249
+ if (data.gdocumentDate && data.gdocumentDate !== null) {
250
+ moment.locale('en');
251
+ data['hdocumentDate'] = this.dateHelperService.gregorianToHijri(data.gdocumentDate, 'iYYYY-iMM-iDD');
252
+ data.gdocumentDate = (moment(data.gdocumentDate).format("YYYY-MM-DDT00:00:00.000") + "Z");
253
+ }
254
+ return this.adapter.adaptOut(data, this.staticFormFields);
255
+ }
256
+ constructDynamicFormPayload(file) {
257
+ var _a;
258
+ let updatedDynamicValues = {};
259
+ Object.keys((_a = file === null || file === void 0 ? void 0 : file.dynamicData) === null || _a === void 0 ? void 0 : _a.data).map(key => {
260
+ let updatedKey = key.replace(':', '');
261
+ let prefix = file.dynamicForm.prefix[updatedKey];
262
+ if (prefix) {
263
+ // check if component is user selector to map its data from object to username or id only
264
+ if (file.dynamicData.data[key] && file.dynamicData.data[key]['userSelector'] && file.dynamicData.data[key]['userSelector'] === true) {
265
+ updatedDynamicValues[prefix + ':' + updatedKey] = file.dynamicData.data[key]['value']['id'] ? file.dynamicData.data[key]['value']['id'] : file.dynamicData.data[key]['value']['properties']['username'];
266
+ }
267
+ else {
268
+ updatedDynamicValues[prefix + ':' + updatedKey] = file.dynamicData.data[key];
269
+ }
270
+ }
271
+ else {
272
+ if (file.dynamicData.data[key]['userSelector'] && file.dynamicData.data[key]['userSelector'] === true) {
273
+ updatedDynamicValues[updatedKey] = file.dynamicData.data[key]['value']['id'] ? file.dynamicData.data[key]['value']['id'] : file.dynamicData.data[key]['value']['properties']['username'];
274
+ }
275
+ else {
276
+ updatedDynamicValues[updatedKey] = file.dynamicData.data[key];
277
+ }
278
+ }
279
+ });
280
+ return updatedDynamicValues;
281
+ }
282
+ createWhenFinish() {
283
+ }
284
+ changTabTo(tabName) {
285
+ this.activeTab = tabName;
286
+ }
287
+ checkValidation() {
288
+ return false;
289
+ }
290
+ ngOnDestroy() {
291
+ this.langSubscription ? this.langSubscription.unsubscribe() : '';
292
+ this.agencyCategCodeSubscription ? this.agencyCategCodeSubscription.unsubscribe() : null;
293
+ this.countryCategCodeSubscription ? this.countryCategCodeSubscription.unsubscribe() : null;
294
+ this.fileFormSubscription ? this.fileFormSubscription.unsubscribe() : null;
295
+ }
296
+ }
297
+ ScanModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: ScanModalComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.MatDialogRef }, { token: i2.UploadManagmentService }, { token: i3.DialogMangmentService }, { token: i4.FileManagerService }, { token: i5.CustomToastrService }, { token: i6.FormBuilder }, { token: i7.DynamicFormService }, { token: i8.DateHelperService }, { token: i9.AdapterService }, { token: i10.TranslationService }, { token: i11.NuxeoService }, { token: i12.UserService }, { token: i13.AppConfigService }, { token: 'environment' }, { token: i14.DocumentScanService }], target: i0.ɵɵFactoryTarget.Component });
298
+ ScanModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.4", type: ScanModalComponent, selector: "app-scan-modal", ngImport: i0, template: "<div class=\"scanner-modal-body relative h-full\">\r\n <!-- -->\r\n <!-- tabs -->\r\n <div\r\n class=\"scanner-tabs d-flex justify-around items-center border-b-2 border-gray-200 mb-5 text-gray-900 text-lg\"\r\n >\r\n <div\r\n class=\"scanner-single-tab cursor-pointer w-1/2 text-center py-2 border-gray-900 hover:bg-gray-100\"\r\n (click)=\"changTabTo('scan')\"\r\n [ngClass]=\"{ 'font-bold border-b-4': activeTab === 'scan' }\"\r\n >\r\n {{\"CREATE.SCAN\" | translate}}\r\n </div>\r\n <div\r\n class=\"scanner-single-tab cursor-pointer w-1/2 text-center py-2 border-gray-900 hover:bg-gray-100\"\r\n (click)=\"changTabTo('form')\"\r\n [ngClass]=\"{ 'font-bold border-b-4': activeTab === 'form' }\"\r\n >\r\n {{\"CREATE.DETAILS\" | translate}}\r\n </div>\r\n </div>\r\n <div class=\"tabs-body-wrapper\">\r\n <!-- uploader indicator loading -->\r\n <div\r\n class=\"upload-loader mx-2\"\r\n *ngIf=\"uploadMangmentService.uploadedFilesStatus.uploadInProgress\"\r\n >\r\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\r\n </div>\r\n\r\n <!-- scanner -->\r\n <div class=\"\" [ngClass]=\"{ 'd-none': activeTab === 'form' }\">\r\n <app-document-scan\r\n [hideUploadButton]=\"true\"\r\n [useStoredFile]=\"true\"\r\n ></app-document-scan>\r\n </div>\r\n\r\n <!-- forms and properties -->\r\n <div\r\n class=\"forms-section\"\r\n [ngClass]=\"{ 'd-none': activeTab === 'scan' }\"\r\n >\r\n <div class=\"w-2/3\">\r\n <div class=\"mb-5\">\r\n <div class=\"label-style\">\r\n {{ \"CREATE.FILE_TYPE\" | translate }}\r\n </div>\r\n <div class=\"text-base text-gray-900\">\r\n {{ isArabic ? fileType.arabicText : fileType.englishText }}\r\n </div>\r\n </div>\r\n <div class=\"file-fields mt-3\" SetRtl>\r\n <form [formGroup]=\"fileForm\" *ngIf=\"fileForm\">\r\n <div class=\"single-field mb-3\">\r\n <div class=\"label-style\">\r\n {{ \"CREATE.TITLE\" | translate\r\n }}<span class=\"text-red-500\">*</span>\r\n </div>\r\n <input\r\n class=\"field-style\"\r\n formControlName=\"title\"\r\n placeholder=\" {{ 'CREATE.TITLE' | translate }}\"\r\n />\r\n </div>\r\n <div class=\"single-field mb-3\">\r\n <div class=\"label-style\">\r\n {{ \"CREATE.DESCRIPTION\" | translate }}\r\n </div>\r\n <input\r\n class=\"field-style\"\r\n formControlName=\"description\"\r\n placeholder=\" {{\r\n 'CREATE.DESCRIPTION' | translate\r\n }}\"\r\n />\r\n </div>\r\n\r\n <!------------------ new statis form ---------------------------->\r\n <div *ngIf=\"usingExtraFields\">\r\n \r\n <app-dynamic-fields-renderer [form]=\"fileForm\" [agencyNameFilter]=\"agencyNameFilter\" [countryNameFilter]=\"countryNameFilter\"></app-dynamic-fields-renderer>\r\n\r\n <!-- <div class=\"single-field mb-3\">\r\n <div class=\"label-style\">\r\n {{ \"CREATE.DOCUMENT_SUBJECT\" | translate\r\n }}<span class=\"text-red-500\">*</span>\r\n </div>\r\n <input\r\n class=\"field-style\"\r\n formControlName=\"subject\"\r\n placeholder=\" {{\r\n 'CREATE.DOCUMENT_SUBJECT' | translate\r\n }}\"\r\n />\r\n </div>\r\n <div class=\"single-field mb-3\">\r\n <div class=\"label-style\">\r\n {{ \"CREATE.DOCUMENT_NUMBER\" | translate }}\r\n </div>\r\n <input\r\n class=\"field-style\"\r\n formControlName=\"documentNumber\"\r\n placeholder=\" {{\r\n 'CREATE.DOCUMENT_NUMBER' | translate\r\n }}\"\r\n />\r\n </div>\r\n <div class=\"single-field mb-3\">\r\n <cts-dynamic-form-hijri-dateitem\r\n formControlName=\"gdocumentDate\"\r\n label=\"CREATE.DOCUMENT_DATE\"\r\n >\r\n </cts-dynamic-form-hijri-dateitem>\r\n </div>\r\n <div class=\"single-field mb-3\">\r\n <app-dynamic-form-vocabulary-item\r\n [label]=\"'CREATE.SCRECY_LEVEL'\"\r\n [bindLabel]=\"'label'\"\r\n [bindValue]=\"'id'\"\r\n placeholder=\"{{\r\n 'VOCABULARY.SELECT_ITEM' | translate\r\n }}\"\r\n [multiple]=\"false\"\r\n [searchable]=\"false\"\r\n [closeOnSelect]=\"true\"\r\n [hideSelectedItems]=\"false\"\r\n [vocabularyType]=\"'VOC_SecrecyLevel'\"\r\n formControlName=\"secrecyLevel\"\r\n >\r\n </app-dynamic-form-vocabulary-item>\r\n </div>\r\n <div class=\"single-field mb-3\">\r\n <app-dynamic-form-vocabulary-item\r\n [label]=\"'CREATE.IMPORTANCE_LEVEL'\"\r\n [bindLabel]=\"'label'\"\r\n [bindValue]=\"'id'\"\r\n placeholder=\"{{\r\n 'VOCABULARY.SELECT_ITEM' | translate\r\n }}\"\r\n [multiple]=\"false\"\r\n [searchable]=\"false\"\r\n [closeOnSelect]=\"true\"\r\n [hideSelectedItems]=\"false\"\r\n [vocabularyType]=\"'VOC_Importance'\"\r\n formControlName=\"importanceLevel\"\r\n >\r\n </app-dynamic-form-vocabulary-item>\r\n </div>\r\n\r\n <div class=\"single-field mb-3\">\r\n <div class=\"label-style\">\r\n {{ \"CREATE.DEPARTMENT_CODE\" | translate }}\r\n </div>\r\n <app-dynamic-form-department\r\n formControlName=\"departmentCode\"\r\n [placeholder]=\"'please select department'\"\r\n [pp_departmentNestedTree]=\"\r\n 'PP_OS_Departments'\r\n \"\r\n [pp_departmentTree]=\"'PP_OS_Departments'\"\r\n [customPrefix]=\"'osdept'\"\r\n [customParentProperty]=\"\r\n 'osdepartment_parentDepartmentCode'\r\n \"\r\n [useCustomAddEditAction]=\"true\"\r\n >\r\n </app-dynamic-form-department>\r\n </div>\r\n\r\n <div class=\"single-field mb-3\">\r\n <app-translated-vocabulary-select\r\n [label]=\"'CREATE.AGENCY_CATEGORY_CODE'\"\r\n [arbBindLabel]=\"'label_ar'\"\r\n [engBindLabel]=\"'label_en'\"\r\n [bindValue]=\"'id'\"\r\n placeholder=\"{{\r\n 'VOCABULARY.SELECT_ITEM' | translate\r\n }}\"\r\n [multiple]=\"false\"\r\n [searchable]=\"true\"\r\n [closeOnSelect]=\"true\"\r\n [hideSelectedItems]=\"false\"\r\n formControlName=\"agencyCategoryCode\"\r\n [vocbularyId]=\"'VOC_AgencyCategory'\"\r\n [useFilter]=\"false\"\r\n >\r\n </app-translated-vocabulary-select>\r\n </div>\r\n\r\n <div class=\"single-field mb-3\">\r\n <app-translated-vocabulary-select\r\n [label]=\"'CREATE.AGENCY_NAME'\"\r\n [arbBindLabel]=\"'label_ar'\"\r\n [engBindLabel]=\"'label_en'\"\r\n [bindValue]=\"'id'\"\r\n placeholder=\"{{\r\n 'VOCABULARY.SELECT_ITEM' | translate\r\n }}\"\r\n [multiple]=\"false\"\r\n [searchable]=\"true\"\r\n [closeOnSelect]=\"true\"\r\n [hideSelectedItems]=\"false\"\r\n formControlName=\"agencyName\"\r\n [vocbularyId]=\"'VOC_Agency'\"\r\n [filter]=\"agencyNameFilter\"\r\n [useFilter]=\"true\"\r\n >\r\n </app-translated-vocabulary-select>\r\n </div>\r\n\r\n <div class=\"single-field mb-3\">\r\n <app-translated-vocabulary-select\r\n [label]=\"'CREATE.COUNTRY_CATEGORY_CODE'\"\r\n [arbBindLabel]=\"'label_ar'\"\r\n [engBindLabel]=\"'label_en'\"\r\n [bindValue]=\"'id'\"\r\n placeholder=\"{{\r\n 'VOCABULARY.SELECT_ITEM' | translate\r\n }}\"\r\n [multiple]=\"false\"\r\n [searchable]=\"true\"\r\n [closeOnSelect]=\"true\"\r\n [hideSelectedItems]=\"false\"\r\n formControlName=\"countryCategoryCode\"\r\n [vocbularyId]=\"'VOC_CountryCategory'\"\r\n [useFilter]=\"false\"\r\n >\r\n </app-translated-vocabulary-select>\r\n </div>\r\n\r\n <div class=\"single-field mb-3\">\r\n <app-translated-vocabulary-select\r\n [label]=\"'CREATE.COUNTRY_NAME'\"\r\n [arbBindLabel]=\"'label_ar'\"\r\n [engBindLabel]=\"'label_en'\"\r\n [bindValue]=\"'id'\"\r\n placeholder=\"{{\r\n 'VOCABULARY.SELECT_ITEM' | translate\r\n }}\"\r\n [multiple]=\"false\"\r\n [searchable]=\"true\"\r\n [closeOnSelect]=\"true\"\r\n [hideSelectedItems]=\"false\"\r\n formControlName=\"countryName\"\r\n [vocbularyId]=\"'VOC_Country'\"\r\n [filter]=\"countryNameFilter\"\r\n [useFilter]=\"true\"\r\n >\r\n </app-translated-vocabulary-select>\r\n </div>\r\n\r\n <div class=\"single-field mb-3\">\r\n <div class=\"label-style\">\r\n {{ \"CREATE.REMARKS\" | translate }}\r\n </div>\r\n <input\r\n class=\"field-style\"\r\n formControlName=\"remarks\"\r\n placeholder=\" {{\r\n 'CREATE.REMARKS' | translate\r\n }}\"\r\n />\r\n </div> -->\r\n </div>\r\n\r\n <!-- ----------------------------------------------------------- -->\r\n </form>\r\n <!-- *ngIf=\"\" -->\r\n <div\r\n class=\"dynamic-part -mx-4\"\r\n *ngIf=\"selectedFile.dynamicForm && showRenderer\"\r\n >\r\n <app-dynamic-form\r\n [form]=\"selectedFile.dynamicForm\"\r\n [data]=\"temporaryDyanmicData\"\r\n (change)=\"ondynamicFormChange($event)\"\r\n ></app-dynamic-form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- actions and buttons -->\r\n <div\r\n class=\"w-full d-flex justify-between scanner-actions-wrapper absolute bottom-0\"\r\n >\r\n <div class=\"flex\">\r\n <button class=\"cancelation-button\" (click)=\"closeDialog()\">\r\n {{ \"BUTTONS.CANCEL\" | translate }}\r\n </button>\r\n <button class=\"cancelation-button mx-2\" (click)=\"minimizDialog()\">\r\n {{ \"BUTTONS.MINIMIZED\" | translate }}\r\n </button>\r\n </div>\r\n\r\n <!-- -->\r\n <div class=\"d-flex\">\r\n <!-- <button\r\n *ngIf=\"creationFailed\"\r\n [disabled]=\"\r\n scannerUploadButton.disabled ||\r\n !selectedFile.dynamicData.valid ||\r\n fileForm.invalid\r\n \"\r\n [ngClass]=\"{\r\n 'opacity-30 cursor-not-allowed':\r\n scannerUploadButton.disabled ||\r\n !selectedFile.dynamicData.valid ||\r\n fileForm.invalid\r\n }\"\r\n (click)=\"createDocument()\"\r\n class=\"submission-button\"\r\n >\r\n {{ \"BUTTONS.TRY_AGAIN\" | translate }}\r\n </button> -->\r\n <button\r\n (click)=\"createDocument()\"\r\n [disabled]=\"\r\n scannerUploadButton.disabled ||\r\n !selectedFile.dynamicData.valid ||\r\n fileForm.invalid\r\n \"\r\n [ngClass]=\"{\r\n 'opacity-30 cursor-not-allowed':\r\n scannerUploadButton.disabled ||\r\n !selectedFile.dynamicData.valid ||\r\n fileForm.invalid\r\n }\"\r\n class=\"submission-button\"\r\n >\r\n {{ uploadMangmentService.scanCreationFailed ? (\"BUTTONS.TRY_AGAIN\" | translate) : (\"BUTTONS.CREATE\" | translate) }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".forms-section{display:flex;justify-content:center}.tabs-body-wrapper{height:calc(100% - 125px);overflow-y:auto;overflow-x:hidden}\n"], components: [{ type: i15.ScanComponent, selector: "app-document-scan", inputs: ["useStoredFile", "hideUploadButton"], outputs: ["file"] }, { type: i16.DynamicFieldsRendererComponent, selector: "app-dynamic-fields-renderer", inputs: ["form", "agencyNameFilter", "countryNameFilter", "fields"] }, { type: i17.DynamicFormComponent, selector: "app-dynamic-form", inputs: ["form", "data", "readOnly"], outputs: ["change"] }], directives: [{ type: i18.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i18.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i19.SetRtlDirective, selector: "[SetRtl]" }, { type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }], pipes: { "translate": i20.TranslatePipe } });
299
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: ScanModalComponent, decorators: [{
300
+ type: Component,
301
+ args: [{
302
+ selector: 'app-scan-modal',
303
+ templateUrl: './scan-modal.component.html',
304
+ styleUrls: ['./scan-modal.component.scss']
305
+ }]
306
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
307
+ type: Inject,
308
+ args: [MAT_DIALOG_DATA]
309
+ }] }, { type: i1.MatDialogRef }, { type: i2.UploadManagmentService }, { type: i3.DialogMangmentService }, { type: i4.FileManagerService }, { type: i5.CustomToastrService }, { type: i6.FormBuilder }, { type: i7.DynamicFormService }, { type: i8.DateHelperService }, { type: i9.AdapterService }, { type: i10.TranslationService }, { type: i11.NuxeoService }, { type: i12.UserService }, { type: i13.AppConfigService }, { type: undefined, decorators: [{
310
+ type: Inject,
311
+ args: ['environment']
312
+ }] }, { type: i14.DocumentScanService }]; } });
313
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nhbi1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9udXhlby1kZXZlbG9wbWVudC1mcmFtZXdvcmsvc3JjL2xpYi9jb21wb25lbnRzL2ZpbGUtbWFuZ2VyL2NvbXBvbmVudHMvc2Nhbi1tb2RhbC9zY2FuLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL251eGVvLWRldmVsb3BtZW50LWZyYW1ld29yay9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1tYW5nZXIvY29tcG9uZW50cy9zY2FuLW1vZGFsL3NjYW4tbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBMEIsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFnQixlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQU96RSxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNqQyxNQUFNLE9BQU8sa0JBQWtCO0lBbUM3QixZQUE0QyxJQUFJLEVBQ3ZDLFNBQTJDLEVBQzNDLHFCQUE2QyxFQUM3QyxxQkFBNEMsRUFDM0MsaUJBQXFDLEVBQ3JDLGFBQWtDLEVBQ2xDLFdBQXlCLEVBQ3pCLGtCQUFzQyxFQUN0QyxpQkFBcUMsRUFDckMsT0FBd0IsRUFDeEIsa0JBQXVDLEVBQ3ZDLFlBQTRCLEVBQzVCLFdBQXlCLEVBQ3pCLGNBQWlDLEVBQ1YsV0FBVyxFQUNsQyxtQkFBeUM7UUFmUCxTQUFJLEdBQUosSUFBSSxDQUFBO1FBQ3ZDLGNBQVMsR0FBVCxTQUFTLENBQWtDO1FBQzNDLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBd0I7UUFDN0MsMEJBQXFCLEdB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LDJCQUEyQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN6RixJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzNGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0UsQ0FBQzs7K0dBdlRVLGtCQUFrQixrQkFtQ1QsZUFBZSxrYkFjekIsYUFBYTttR0FqRFosa0JBQWtCLHNEQ3ZCL0Isb3ppQkFnVkE7MkZEelRhLGtCQUFrQjtrQkFMOUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixXQUFXLEVBQUUsNkJBQTZCO29CQUMxQyxTQUFTLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQztpQkFDM0M7OzBCQW9DYyxNQUFNOzJCQUFDLGVBQWU7OzBCQWNoQyxNQUFNOzJCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBVcGxvYWRNYW5hZ21lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkLXNlcnZpY2VzL3VwbG9hZC1tYW5hZ21lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IERpYWxvZ01hbmdtZW50U2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC1zZXJ2aWNlcy9kaWFsb2ctbWFuZ21lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IER5bmFtaWNGb3JtU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC1zZXJ2aWNlcy9keW5hbWljLWZvcm0uc2VydmljZSc7XHJcbmltcG9ydCB7IEZpbGVNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC1zZXJ2aWNlcy9maWxlLW1hbmFnZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkLXNlcnZpY2VzL3VzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgQ3VzdG9tVG9hc3RyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2N1c3RvbS10b2FzdHIvc2VydmljZXMvY3VzdG9tLXRvYXN0ci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRG9jdW1lbnRTY2FuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2RvY3VtZW50cy9jb21wb25lbnRzL2RvY3VtZW50LXNjYW4vZG9jdW1lbnQtc2Nhbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGF0ZUhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9oaWpyaS1ncmVnb3JpYW4tZGF0ZXBpY2tlci9zZXJ2aWNlcy9kYXRlLWhlbHBlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWRhcHRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9Db3JlL2FkYXB0ZXJzL2FkYXB0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL0NvcmUvc2VydmljZXMvdHJhbnNsYXRpb24vdHJhbnNsYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IE51eGVvU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL0NvcmUvc2VydmljZXMvbnV4ZW8vbnV4ZW8uc2VydmljZSc7XHJcbmltcG9ydCB7IEFwcENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uL2FwcC1jb25maWcuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1zY2FuLW1vZGFsJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc2Nhbi1tb2RhbC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc2Nhbi1tb2RhbC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTY2FuTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHNjYW5uZXJVcGxvYWRCdXR0b247XHJcbiAgZmlsZVR5cGU7XHJcbiAgc291cmNlO1xyXG4gIGFjdGl2ZVRhYiA9ICdzY2FuJztcclxuICBjcmVhdGVXaGVuRmluaXNoTW9kZSA9IGZhbHNlO1xyXG4gIG15RW52aXJvbm1lbnRcclxuICBzZWxlY3RlZEZpbGUgPSB7XHJcbiAgICBzdGF0aWNEYXRhIDoge30sXHJcbiAgICBmaWxlVHlwZTogJycsXHJcbiAgICBkeW5hbWljRm9ybTogJycsXHJcbiAgICBkeW5hbWljRGF0YToge1xyXG4gICAgICB2YWxpZDogZmFsc2UsXHJcbiAgICAgIGRhdGE6IHt9XHJcbiAgICB9LFxyXG4gICAgZmlsZTogJydcclxuICB9O1xyXG4gIHRlbXBvcmFyeUR5YW5taWNEYXRhID0ge307XHJcbiAgc2hvd1JlbmRlcmVyID0gZmFsc2U7XHJcblxyXG4gIHVwbG9hZFN0YXJ0U3Vic2NyaXB0aW9uIDogU3Vic2NyaXB0aW9uO1xyXG4gIGZpbGVDaGFuZ2VTdWJzY3JpcHRpb24gIDpTdWJzY3JpcHRpb247XHJcbiAgZmlsZUZvcm1TdWJzY3JpcHRpb24gOiBTdWJzY3JpcHRpb247XHJcbiAgYWdlbmN5Q2F0ZWdDb2RlU3Vic2NyaXB0aW9uIDogU3Vic2NyaXB0aW9uO1xyXG4gIGNvdW50cnlDYXRlZ0NvZGVTdWJzY3JpcHRpb24gOiBTdWJzY3JpcHRpb247XHJcbiAgbGFuZ1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBpc0FyYWJpYyA9IGZhbHNlO1xyXG4gIHNob3dTdGF0aWNGb3JtID0gZmFsc2VcclxuICB1c2luZ0V4dHJhRmllbGRzID0gZmFsc2U7IC8vIGZsYWdlIHRvIHN3aXRjaCBiZXR3ZWVuIHN0YXRpYyBmb3JtIHR5cGVzXHJcbiAgZmlsZUZvcm0gOiBGb3JtR3JvdXA7XHJcbiAgc3RhdGljRm9ybUZpZWxkcztcclxuICBhZ2VuY3lOYW1lRmlsdGVyIDtcclxuICBjb3VudHJ5TmFtZUZpbHRlcjtcclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhLFxyXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPFNjYW5Nb2RhbENvbXBvbmVudD4sXHJcbiAgICBwdWJsaWMgdXBsb2FkTWFuZ21lbnRTZXJ2aWNlOiBVcGxvYWRNYW5hZ21lbnRTZXJ2aWNlLFxyXG4gICAgcHVibGljIGRpYWxvZ01hbmdtZW50U2VydmljZTogRGlhbG9nTWFuZ21lbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmaWxlTWFuZ2VyU2VydmljZTogRmlsZU1hbmFnZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b3N0ZXJTZXJ2aWNlOiBDdXN0b21Ub2FzdHJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlciA6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBkeW5hbWljRm9ybVNlcnZpY2U6IER5bmFtaWNGb3JtU2VydmljZSxcclxuICAgIHByaXZhdGUgZGF0ZUhlbHBlclNlcnZpY2UgOiBEYXRlSGVscGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgYWRhcHRlciA6IEFkYXB0ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2UgOiBUcmFuc2xhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG51eGVvU2VydmljZSAgOiBOdXhlb1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlIDogVXNlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGFwcENvbmZTZXJ2aWNlIDogQXBwQ29uZmlnU2VydmljZSxcclxuICAgIEBJbmplY3QoJ2Vudmlyb25tZW50JykgcHJpdmF0ZSBlbnZpcm5vbWVudCxcclxuICAgIHByaXZhdGUgZG9jdW1lbnRTY2FuU2VydmljZSA6IERvY3VtZW50U2NhblNlcnZpY2UpIHsgXHJcbiAgICAgIHRoaXMubXlFbnZpcm9ubWVudCA9IHRoaXMuZW52aXJub21lbnRcclxuICAgIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxhbmdTdWJzY3JpcHRpb249IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmlzQXJhYmljLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICB0aGlzLmlzQXJhYmljID0gcmVzO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jcmVhdGVXaGVuRmluaXNoTW9kZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5maWxlVHlwZSA9IHRoaXMuZGlhbG9nTWFuZ21lbnRTZXJ2aWNlLmZpbGVUeXBlO1xyXG4gICAgdGhpcy5zb3VyY2UgPSB0aGlzLmRpYWxvZ01hbmdtZW50U2VydmljZS5hZGRpbmdGcm9tO1xyXG5cclxuICAgIHRoaXMuZmlsZU1hbmdlclNlcnZpY2UuZ2V0RmlsZVNjaGVtYXModGhpcy5maWxlVHlwZS50eXBlKS5zdWJzY3JpYmUoc2NoZW1hcyA9PiB7XHJcbiAgICAgIHNjaGVtYXMubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgIGlmKGl0ZW0ubmFtZSA9PT0gXCJnZW5lcmFsZG9jdW1lbnRcIil7XHJcbiAgICAgICAgICB0aGlzLnVzaW5nRXh0cmFGaWVsZHMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgdGhpcy5pbml0aWF0ZmlsZUZvcm0oKTtcclxuICAgICAgICAgIC8vaWYgc3RhcnRpbmcgZnJvbSBmaWxlbW5hZ2VyIHRoZW4gaSBoYXZlIGZpeGVkIGZpbGUgdHlwZSBmb3IgYWxsIGF0dGFjaG1ldG4gYW5kIHNpbmdsZSBkeW5haW1jIGZvcm0gIHR5cGVcclxuICAgIGlmICh0aGlzLnNvdXJjZSA9PT0gJ2ZpbGVNYW5nZXInKSB7XHJcbiAgICAgIGlmKHRoaXMudXBsb2FkTWFuZ21lbnRTZXJ2aWNlLnVwbG9hZGVkRmlsZXNTdGF0dXMudXBsb2FkZWRGaWxlcy5sZW5ndGggPiAwKXtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gey4uLnRoaXMudXBsb2FkTWFuZ21lbnRTZXJ2aWNlLnVwbG9hZGVkRmlsZXNTdGF0dXMudXBsb2FkZWRGaWxlcy5zaGlmdCgpfTtcclxuICAgICAgICAgIHRoaXMudGVtcG9yYXJ5RHlhbm1pY0RhdGEgPXRoaXMuc2VsZWN0ZWRGaWxlLmR5bmFtaWNEYXRhLmRhdGE7XHJcbiAgICAgICAgICB0aGlzLmZpbGVGb3JtLnBhdGNoVmFsdWUodGhpcy5zZWxlY3RlZEZpbGUuc3RhdGljRGF0YSk7XHJcbiAgICAgICAgICBpZih0aGlzLnNlbGVjdGVkRmlsZVsnc3RhdGljRGF0YSddWydhZ2VuY3lDYXRlZ29yeUNvZGUnXSl7XHJcbiAgICAgICAgICAgIHRoaXMuYWdlbmN5TmFtZUZpbHRlciA9IHtcclxuICAgICAgICAgICAgICBjYXRlZ29yeSA6IHRoaXMuc2VsZWN0ZWRGaWxlWydzdGF0aWNEYXRhJ11bJ2FnZW5jeUNhdGVnb3J5Q29kZSddXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZih0aGlzLnNlbGVjdGVkRmlsZVsnc3RhdGljRGF0YSddWydjb3VudHJ5Q2F0ZWdvcnlDb2RlJ10pe1xyXG4gICAgICAgICAgICB0aGlzLmNvdW50cnlOYW1lRmlsdGVyID0ge1xyXG4gICAgICAgICAgICAgIGNhdGVnb3J5IDogdGhpcy5zZWxlY3RlZEZpbGVbJ3N0YXRpY0RhdGEnXVsnY291bnRyeUNhdGVnb3J5Q29kZSddXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm9wZW5TdWJzY3JpcHRpb25zKCk7XHJcbiAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNob3dSZW5kZXJlciA9IHRydWU7XHJcbiAgICAgICAgfSwgMzAwMCk7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGUuZHluYW1pY0Zvcm0gPSB0aGlzLmRpYWxvZ01hbmdtZW50U2VydmljZS5zdG9yZWREeW5hbWljRm9ybTtcclxuICAgICAgICAgIHRoaXMuc2hvd1JlbmRlcmVyID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMub3BlblN1YnNjcmlwdGlvbnMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICB0aGlzLnVwbG9hZFN0YXJ0U3Vic2NyaXB0aW9uID0gdGhpcy5kb2N1bWVudFNjYW5TZXJ2aWNlLnVwbG9hZFN0YXJ0LnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICB0aGlzLnVwbG9hZE1hbmdtZW50U2VydmljZS51cGxvYWRlZEZpbGVzU3RhdHVzLnVwbG9hZEluUHJvZ3Jlc3MgPSByZXM7XHJcbiAgICB9KVxyXG4gICAgdGhpcy5maWxlQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5kb2N1bWVudFNjYW5TZXJ2aWNlLmZpbGVDaGFuZ2Uuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgLy9jb25zb2xlLmxvZyhldmVudCk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlLmZpbGUgPSBldmVudDtcclxuICAgICAgbGV0IHBheUxvYWQgPSB0aGlzLmNvbnN0cnVjdFBheUxvYWQodGhpcy5zZWxlY3RlZEZpbGUpO1xyXG4gICAgICB0aGlzLmZpbGVNYW5nZXJTZXJ2aWNlLmNyZWF0ZUZpbGUocGF5TG9hZCwgdGhpcy5maWxlTWFuZ2VyU2VydmljZS5zZWxlY3RlZEZvbGRlcklkKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICBpZihyZXNbJ3N0YXR1cyddICYmIHJlc1snc3RhdHVzJ10gPT09ICdmYWlsZWQnKXtcclxuICAgICAgICAgIHRoaXMudXBsb2FkTWFuZ21lbnRTZXJ2aWNlLnNjYW5DcmVhdGlvbkZhaWxlZCA9IHRydWU7XHJcbiAgICAgICAgIHRoaXMudG9zdGVyU2VydmljZS5zaG93KCdlcnJvcicgLCAnVE9BU1RFUi5FUlJPUicgLCAnVE9BU1RFUi5VUExPQURfRVJST1InKTtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlU3Vic2NyaXB0aW9uKCk7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICB0aGlzLmZpbGVNYW5nZXJTZXJ2aWNlLm9uUmVmcmVzaGluZ0ZpbGVNYW5nZXIubmV4dCgpO1xyXG4gICAgICAgICAgdGhpcy50b3N0ZXJTZXJ2aWNlLnNob3coJ3N1Y2Nlc3MnLCAnVE9BU1RFUi5TVUNDRVNTJywgXCJUT0FTVEVSLkZJTEVfQ1JFQVRFRF9TVUNDRVwiKVxyXG4gICAgICAgICAgdGhpcy5kb2N1bWVudFNjYW5TZXJ2aWNlLnN0b3JlZEZpbGUgPSB7fTtcclxuICAgICAgICAgIHRoaXMudXBsb2FkTWFuZ21lbnRTZXJ2aWNlLnJlc2V0U3RhdHVzKCk7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZVN1YnNjcmlwdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH0pXHJcbiAgICB9KVxyXG5cclxuICAgICB0aGlzLnNjYW5uZXJVcGxvYWRCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Nhbm5lclVwbG9hZEJ1dHRvbicpO1xyXG4gIH1cclxuICBcclxuICBpbml0aWF0ZmlsZUZvcm0oKXtcclxuICAgIGlmKHRoaXMudXNpbmdFeHRyYUZpZWxkcyl7XHJcbiAgICAgIHRoaXMuZmlsZUZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgICB0aXRsZSA6IFsnJyAsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgICAgZGVzY3JpcHRpb24gOiBbJyddLFxyXG4gICAgICAgIHN1YmplY3QgOiBbJycgLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICAgIGRvY3VtZW50TnVtYmVyIDogWycnXSxcclxuICAgICAgICBnZG9jdW1lbnREYXRlIDogW251bGwgLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICAgIHNlY3JlY3lMZXZlbCA6IFtudWxsXSxcclxuICAgICAgICBpbXBvcnRhbmNlTGV2ZWw6W251bGxdLFxyXG4gICAgICAgIGRlcGFydG1lbnRDb2RlOlsnJ10sXHJcbiAgICAgICAgYWdlbmN5Q2F0ZWdvcnlDb2RlOltudWxsXSxcclxuICAgICAgICBhZ2VuY3lOYW1lOltudWxsXSxcclxuICAgICAgICBjb3VudHJ5Q2F0ZWdvcnlDb2RlOltudWxsXSxcclxuICAgICAgICBjb3VudHJ5TmFtZTpbbnVsbF0sXHJcbiAgICAgICAgcmVtYXJrczpbJyddXHJcbiAgICAgIH0pXHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy5maWxlRm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICAgIHRpdGxlIDogWycnICwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgICBkZXNjcmlwdGlvbiA6IFsnJ11cclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHRoaXMuc3RhdGljRm9ybUZpZWxkcyA9IHRoaXMuYXBwQ29uZlNlcnZpY2UubXlDb25maWd1cmF0aW9uLnN0YXRpY0Zvcm1GaWVsZHM7XHJcbiAgICBpZih0aGlzLmZpbGVGb3JtU3Vic2NyaXB0aW9uKXtcclxuICAgICAgdGhpcy5maWxlRm9ybVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5maWxlRm9ybS5nZXQoJ2RlcGFydG1lbnRDb2RlJykpe1xyXG4gICAgICB0aGlzLmZpbGVGb3JtLmdldCgnZGVwYXJ0bWVudENvZGUnKS5zZXRWYWx1ZSh0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJEZXBhcnRtZW50RnJvbVBhdGgodGhpcy5kYXRhLnBhdGgpKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBvcGVuU3Vic2NyaXB0aW9ucygpe1xyXG4gICAgdGhpcy5maWxlRm9ybVN1YnNjcmlwdGlvbiA9ICB0aGlzLmZpbGVGb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlLnN0YXRpY0RhdGEgPSBkYXRhO1xyXG4gICAgfSlcclxuXHJcbiAgICBpZih0aGlzLmZpbGVGb3JtLmdldCgnYWdlbmN5Q2F0ZWdvcnlDb2RlJykpe1xyXG4gICAgICB0aGlzLmFnZW5jeUNhdGVnQ29kZVN1YnNjcmlwdGlvbiA9ICB0aGlzLmZpbGVGb3JtLmdldCgnYWdlbmN5Q2F0ZWdvcnlDb2RlJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsZUZvcm0uZ2V0KCdhZ2VuY3lOYW1lJykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWdlbmN5TmFtZUZpbHRlciA9IHtcclxuICAgICAgICAgICAgICBjYXRlZ29yeSA6IHJlc1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGlmKHRoaXMuZmlsZUZvcm0uZ2V0KCdjb3VudHJ5Q2F0ZWdvcnlDb2RlJykpe1xyXG4gICAgICB0aGlzLmNvdW50cnlDYXRlZ0NvZGVTdWJzY3JpcHRpb24gPSAgdGhpcy5maWxlRm9ybS5nZXQoJ2NvdW50cnlDYXRlZ29yeUNvZGUnKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgdGhpcy5maWxlRm9ybS5nZXQoJ2NvdW50cnlOYW1lJykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgdGhpcy5jb3VudHJ5TmFtZUZpbHRlciA9IHtcclxuICAgICAgICAgIGNhdGVnb3J5IDogcmVzXHJcbiAgICAgICAgfTtcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBvblVwbG9hZGluZyhldmVudCkge1xyXG4gICAgdGhpcy51cGxvYWRNYW5nbWVudFNlcnZpY2UudXBsb2FkZWRGaWxlc1N0YXR1cy51cGxvYWRJblByb2dyZXNzID0gZXZlbnQ7XHJcbiAgfVxyXG5cclxuICAvLyBvblNjYW5uZXJTdWNjZXNzKGV2ZW50KSB7XHJcbiAgLy8gICAvL2NvbnNvbGUubG9nKGV2ZW50KTtcclxuICAvLyAgIHRoaXMuc2VsZWN0ZWRGaWxlLmZpbGUgPSBldmVudDtcclxuICAvLyAgIGxldCBwYXlMb2FkID0gdGhpcy5jb25zdHJ1Y3RQYXlMb2FkKHRoaXMuc2VsZWN0ZWRGaWxlKTtcclxuICAvLyAgIHRoaXMuZmlsZU1hbmdlclNlcnZpY2UuY3JlYXRlRmlsZShwYXlMb2FkLCB0aGlzLmZpbGVNYW5nZXJTZXJ2aWNlLnNlbGVjdGVkRm9sZGVySWQpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gIC8vICAgICB0aGlzLmZpbGVNYW5nZXJTZXJ2aWNlLm9uUmVmcmVzaGluZ0ZpbGVNYW5nZXIubmV4dCgpO1xyXG4gIC8vICAgICB0aGlzLnRvc3RlclNlcnZpY2Uuc2hvdygnc3VjY2VzcycsICdUT0FTVEVSLlNVQ0NFU1MnLCBcIlRPQVNURVIuRklMRV9DUkVBVEVEX1NVQ0NFXCIpXHJcbiAgLy8gICAgIHRoaXMuZG9jdW1lbnRTY2FuU2VydmljZS5zdG9yZWRGaWxlID0ge307XHJcbiAgLy8gICAgIHRoaXMudXBsb2FkTWFuZ21lbnRTZXJ2aWNlLnJlc2V0U3RhdHVzKCk7XHJcbiAgLy8gICB9KVxyXG4gIC8vIH1cclxuXHJcbiAgb25keW5hbWljRm9ybUNoYW5nZShkeW5hbWljRGF0YSkge1xyXG4gICAgaWYgKGR5bmFtaWNEYXRhLmRhdGEpIHtcclxuICAgICAgY29uc29sZS5sb2coZHluYW1pY0RhdGEuZGF0YSlcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbGUuZHluYW1pY0RhdGEgPSB7IC4uLmR5bmFtaWNEYXRhIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZURpYWxvZygpIHtcclxuICAgIHRoaXMuZG9jdW1lbnRTY2FuU2VydmljZS5zdG9yZWRGaWxlID0ge307XHJcbiAgICB0aGlzLnJlbW92ZVN1YnNjcmlwdGlvbigpO1xyXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoZmFsc2UpO1xyXG5cclxuICB9XHJcblxyXG4gIG1pbmltaXpEaWFsb2coKSB7XHJcbiAgICB0aGlzLmRvY3VtZW50U2NhblNlcnZpY2Uub25NaW5pbWl6aW5nLmVtaXQodHJ1ZSk7XHJcbiAgICB0aGlzLnVwbG9hZE1hbmdtZW50U2VydmljZS51cGxvYWRlZEZpbGVzU3RhdHVzLnVwbG9hZGVkRmlsZXMucHVzaCh7Li4udGhpcy5zZWxlY3RlZEZpbGV9KVxyXG4gICAgdGhpcy5yZW1vdmVTdWJzY3JpcHRpb24oKTtcclxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlU3Vic2NyaXB0aW9uKCl7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy51cGxvYWRTdGFydFN1YnNjcmlwdGlvbiA/IHRoaXMudXBsb2FkU3RhcnRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSA6ICcnO1xyXG4gICAgICB0aGlzLmZpbGVDaGFuZ2VTdWJzY3JpcHRpb24gPyB0aGlzLmZpbGVDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSA6ICcnO1xyXG4gICAgfSwgMjAwMCk7XHJcbiAgfVxyXG5cclxuICBzdGFydEFkZGluZ1Byb3BlcnRpZXMoKSB7XHJcbiAgICB0aGlzLnVwbG9hZE1hbmdtZW50U2VydmljZS5hZGRpbmdQcm9wZXJ0aWVzTW9kZSA9IHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgY3JlYXRlRG9jdW1lbnQoKSB7XHJcbiAgICB0aGlzLmRvY3VtZW50U2NhblNlcnZpY2Uub25NaW5pbWl6aW5nLmVtaXQodHJ1ZSk7XHJcbiAgICB0aGlzLnVwbG9hZE1hbmdtZW50U2VydmljZS51cGxvYWRlZEZpbGVzU3RhdHVzLnVwbG9hZGVkRmlsZXMucHVzaCh7Li4udGhpcy5zZWxlY3RlZEZpbGV9KTtcclxuICAgIHRoaXMuc2Nhbm5lclVwbG9hZEJ1dHRvbi5jbGljaygpO1xyXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RQYXlMb2FkKGZpbGUpIHtcclxuICAgIGxldCBwcm9wcyA9IHRoaXMuZHluYW1pY0Zvcm1TZXJ2aWNlLmNvbnN0cnVjdER5bmFtaWNGb3JtUGF5bG9hZChmaWxlLmR5bmFtaWNEYXRhLmRhdGEsIGZpbGUuZHluYW1pY0Zvcm0pO1xyXG4gICAgbGV0IHN0YXRpY0Zvcm1EYXRhID0gdGhpcy5tYXBwaW5nU3RhdGljRGF0YShmaWxlLnN0YXRpY0RhdGEpXHJcblxyXG4gICAgbGV0IHBhcmFtID0ge1xyXG4gICAgICBcImRvY3VtZW50XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogdGhpcy5maWxlVHlwZS50eXBlLFxyXG4gICAgICAgIFwibmFtZVwiOiBmaWxlLnN0YXRpY0RhdGEudGl0bGUsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIC4uLnByb3BzLFxyXG4gICAgICAgICAgLi4uc3RhdGljRm9ybURhdGEsXHJcbiAgICAgICAgICBcImZpbGU6Y29udGVudFwiOiB7XHJcbiAgICAgICAgICAgIFwidXBsb2FkLWJhdGNoXCI6IGZpbGUuZmlsZS5ibG9iWyd1cGxvYWQtYmF0Y2gnXSxcclxuICAgICAgICAgICAgXCJ1cGxvYWQtZmlsZUlkXCI6IGZpbGUuZmlsZS5ibG9iWyd1cGxvYWQtZmlsZUlkJ11cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBpZiAoZmlsZS5maWxlVHlwZS5kb2N1bWVudENvZGUpIHtcclxuICAgICAgcGFyYW1bXCJkb2N1bWVudFR5cGVDb2RlXCJdID0gZmlsZS5maWxlVHlwZS5kb2N1bWVudENvZGVcclxuICAgIH1cclxuICAgIHJldHVybiB7cGFyYW1zIDogcGFyYW0gLCBvcmlnaW5GaWxlIDogZmlsZX07XHJcbiAgfVxyXG5cclxuICBtYXBwaW5nU3RhdGljRGF0YShkYXRhKXtcclxuICAgIGlmKGRhdGEuZ2RvY3VtZW50RGF0ZSAmJiBkYXRhLmdkb2N1bWVudERhdGUgIT09IG51bGwpe1xyXG4gICAgICBtb21lbnQubG9jYWxlKCdlbicpO1xyXG4gICAgICBkYXRhWydoZG9jdW1lbnREYXRlJ10gPSB0aGlzLmRhdGVIZWxwZXJTZXJ2aWNlLmdyZWdvcmlhblRvSGlqcmkoZGF0YS5nZG9jdW1lbnREYXRlLCdpWVlZWS1pTU0taUREJyk7XHJcbiAgICAgIGRhdGEuZ2RvY3VtZW50RGF0ZSA9IChtb21lbnQoZGF0YS5nZG9jdW1lbnREYXRlKS5mb3JtYXQoXCJZWVlZLU1NLUREVDAwOjAwOjAwLjAwMFwiKSArIFwiWlwiKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5hZGFwdE91dChkYXRhICwgdGhpcy5zdGF0aWNGb3JtRmllbGRzKVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0RHluYW1pY0Zvcm1QYXlsb2FkKGZpbGUpIHtcclxuICAgIGxldCB1cGRhdGVkRHluYW1pY1ZhbHVlcyA9IHt9XHJcbiAgICBPYmplY3Qua2V5cyhmaWxlPy5keW5hbWljRGF0YT8uZGF0YSkubWFwKGtleSA9PiB7XHJcbiAgICAgIGxldCB1cGRhdGVkS2V5ID0ga2V5LnJlcGxhY2UoJzonLCAnJyk7XHJcbiAgICAgIGxldCBwcmVmaXggPSBmaWxlLmR5bmFtaWNGb3JtLnByZWZpeFt1cGRhdGVkS2V5XTtcclxuICAgICAgaWYgKHByZWZpeCkge1xyXG4gICAgICAgIC8vIGNoZWNrIGlmIGNvbXBvbmVudCBpcyB1c2VyIHNlbGVjdG9yIHRvIG1hcCBpdHMgZGF0YSBmcm9tIG9iamVjdCB0byB1c2VybmFtZSBvciBpZCBvbmx5IFxyXG4gICAgICAgIGlmKGZpbGUuZHluYW1pY0RhdGEuZGF0YVtrZXldICYmIGZpbGUuZHluYW1pY0RhdGEuZGF0YVtrZXldWyd1c2VyU2VsZWN0b3InXSAmJiBmaWxlLmR5bmFtaWNEYXRhLmRhdGFba2V5XVsndXNlclNlbGVjdG9yJ10gPT09IHRydWUpe1xyXG4gICAgICAgICAgIHVwZGF0ZWREeW5hbWljVmFsdWVzW3ByZWZpeCArICc6JyArIHVwZGF0ZWRLZXldID0gZmlsZS5keW5hbWljRGF0YS5kYXRhW2tleV1bJ3ZhbHVlJ11bJ2lkJ10gPyBmaWxlLmR5bmFtaWNEYXRhLmRhdGFba2V5XVsndmFsdWUnXVsnaWQnXSA6IGZpbGUuZHluYW1pY0RhdGEuZGF0YVtrZXldWyd2YWx1ZSddWydwcm9wZXJ0aWVzJ11bJ3VzZXJuYW1lJ107XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgdXBkYXRlZER5bmFtaWNWYWx1ZXNbcHJlZml4ICsgJzonICsgdXBkYXRlZEtleV0gPSBmaWxlLmR5bmFtaWNEYXRhLmRhdGFba2V5XVxyXG4gICAgICAgIH1cclxuICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmKGZpbGUuZHluYW1pY0RhdGEuZGF0YVtrZXldWyd1c2VyU2VsZWN0b3InXSAmJiBmaWxlLmR5bmFtaWNEYXRhLmRhdGFba2V5XVsndXNlclNlbGVjdG9yJ10gPT09IHRydWUpe1xyXG4gICAgICAgICAgIHVwZGF0ZWREeW5hbWljVmFsdWVzW3VwZGF0ZWRLZXldID0gZmlsZS5keW5hbWljRGF0YS5kYXRhW2tleV1bJ3ZhbHVlJ11bJ2lkJ10gPyBmaWxlLmR5bmFtaWNEYXRhLmRhdGFba2V5XVsndmFsdWUnXVsnaWQnXSA6IGZpbGUuZHluYW1pY0RhdGEuZGF0YVtrZXldWyd2YWx1ZSddWydwcm9wZXJ0aWVzJ11bJ3VzZXJuYW1lJ107XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgdXBkYXRlZER5bmFtaWNWYWx1ZXNbdXBkYXRlZEtleV0gPSBmaWxlLmR5bmFtaWNEYXRhLmRhdGFba2V5XVxyXG4gICAgICAgIH1cclxuICAgICB9XHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHVwZGF0ZWREeW5hbWljVmFsdWVzO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlV2hlbkZpbmlzaCgpIHtcclxuXHJcbiAgfVxyXG5cclxuICBjaGFuZ1RhYlRvKHRhYk5hbWUpIHtcclxuICAgIHRoaXMuYWN0aXZlVGFiID0gdGFiTmFtZTtcclxuICB9XHJcbiAgY2hlY2tWYWxpZGF0aW9uKCkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKXtcclxuICAgIHRoaXMubGFuZ1N1YnNjcmlwdGlvbiA/IHRoaXMubGFuZ1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpIDogJyc7XHJcbiAgICB0aGlzLmFnZW5jeUNhdGVnQ29kZVN1YnNjcmlwdGlvbiA/IHRoaXMuYWdlbmN5Q2F0ZWdDb2RlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkgOiBudWxsO1xyXG4gICAgdGhpcy5jb3VudHJ5Q2F0ZWdDb2RlU3Vic2NyaXB0aW9uID8gdGhpcy5jb3VudHJ5Q2F0ZWdDb2RlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkgOiBudWxsO1xyXG4gICAgdGhpcy5maWxlRm9ybVN1YnNjcmlwdGlvbiA/IHRoaXMuZmlsZUZvcm1TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSA6IG51bGw7XHJcbiAgfVxyXG59XHJcblxyXG4iLCI8ZGl2IGNsYXNzPVwic2Nhbm5lci1tb2RhbC1ib2R5IHJlbGF0aXZlIGgtZnVsbFwiPlxyXG4gICAgPCEtLSAgLS0+XHJcbiAgICA8IS0tIHRhYnMgLS0+XHJcbiAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJzY2FubmVyLXRhYnMgZC1mbGV4IGp1c3RpZnktYXJvdW5kIGl0ZW1zLWNlbnRlciBib3JkZXItYi0yIGJvcmRlci1ncmF5LTIwMCBtYi01IHRleHQtZ3JheS05MDAgdGV4dC1sZ1wiXHJcbiAgICA+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cInNjYW5uZXItc2luZ2xlLXRhYiBjdXJzb3ItcG9pbnRlciB3LTEvMiB0ZXh0LWNlbnRlciBweS0yIGJvcmRlci1ncmF5LTkwMCBob3ZlcjpiZy1ncmF5LTEwMFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ1RhYlRvKCdzY2FuJylcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdmb250LWJvbGQgYm9yZGVyLWItNCc6IGFjdGl2ZVRhYiA9PT0gJ3NjYW4nIH1cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAge3tcIkNSRUFURS5TQ0FOXCIgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJzY2FubmVyLXNpbmdsZS10YWIgY3Vyc29yLXBvaW50ZXIgdy0xLzIgdGV4dC1jZW50ZXIgcHktMiBib3JkZXItZ3JheS05MDAgaG92ZXI6YmctZ3JheS0xMDBcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdUYWJUbygnZm9ybScpXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnZm9udC1ib2xkIGJvcmRlci1iLTQnOiBhY3RpdmVUYWIgPT09ICdmb3JtJyB9XCJcclxuICAgICAgICA+XHJcbiAgICAgICAge3tcIkNSRUFURS5ERVRBSUxTXCIgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFicy1ib2R5LXdyYXBwZXJcIj5cclxuICAgICAgICA8IS0tIHVwbG9hZGVyIGluZGljYXRvciBsb2FkaW5nIC0tPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJ1cGxvYWQtbG9hZGVyIG14LTJcIlxyXG4gICAgICAgICAgICAqbmdJZj1cInVwbG9hZE1hbmdtZW50U2VydmljZS51cGxvYWRlZEZpbGVzU3RhdHVzLnVwbG9hZEluUHJvZ3Jlc3NcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gc2Nhbm5lciAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiXCIgW25nQ2xhc3NdPVwieyAnZC1ub25lJzogYWN0aXZlVGFiID09PSAnZm9ybScgfVwiPlxyXG4gICAgICAgICAgICA8YXBwLWRvY3VtZW50LXNjYW5cclxuICAgICAgICAgICAgICAgIFtoaWRlVXBsb2FkQnV0dG9uXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgW3VzZVN0b3JlZEZpbGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgID48L2FwcC1kb2N1bWVudC1zY2FuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIGZvcm1zIGFuZCBwcm9wZXJ0aWVzICAtLT5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybXMtc2VjdGlvblwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2Qtbm9uZSc6IGFjdGl2ZVRhYiA9PT0gJ3NjYW4nIH1cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMi8zXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1zdHlsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBcIkNSRUFURS5GSUxFX1RZUEVcIiB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJhc2UgdGV4dC1ncmF5LTkwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpc0FyYWJpYyA/ICBmaWxlVHlwZS5hcmFiaWNUZXh0IDogZmlsZVR5cGUuZW5nbGlzaFRleHQgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtZmllbGRzIG10LTNcIiBTZXRSdGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWxlRm9ybVwiICpuZ0lmPVwiZmlsZUZvcm1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZS1maWVsZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtc3R5bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBcIkNSRUFURS5USVRMRVwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08c3BhbiBjbGFzcz1cInRleHQtcmVkLTUwMFwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtc3R5bGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiB7eyAnQ1JFQVRFLlRJVExFJyB8IHRyYW5zbGF0ZSB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZS1maWVsZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtc3R5bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBcIkNSRUFURS5ERVNDUklQVElPTlwiIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtc3R5bGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ1JFQVRFLkRFU0NSSVBUSU9OJyB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0gbmV3IHN0YXRpcyBmb3JtICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXNpbmdFeHRyYUZpZWxkc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZmllbGRzLXJlbmRlcmVyIFtmb3JtXT1cImZpbGVGb3JtXCIgW2FnZW5jeU5hbWVGaWx0ZXJdPVwiYWdlbmN5TmFtZUZpbHRlclwiIFtjb3VudHJ5TmFtZUZpbHRlcl09XCJjb3VudHJ5TmFtZUZpbHRlclwiPjwvYXBwLWR5bmFtaWMtZmllbGRzLXJlbmRlcmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInNpbmdsZS1maWVsZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IFwiQ1JFQVRFLkRPQ1VNRU5UX1NVQkpFQ1RcIiB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTxzcGFuIGNsYXNzPVwidGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1zdHlsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN1YmplY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NSRUFURS5ET0NVTUVOVF9TVUJKRUNUJyB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZS1maWVsZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IFwiQ1JFQVRFLkRPQ1VNRU5UX05VTUJFUlwiIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtc3R5bGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkb2N1bWVudE51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiIHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ1JFQVRFLkRPQ1VNRU5UX05VTUJFUicgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGUtZmllbGQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjdHMtZHluYW1pYy1mb3JtLWhpanJpLWRhdGVpdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImdkb2N1bWVudERhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkNSRUFURS5ET0NVTUVOVF9EQVRFXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jdHMtZHluYW1pYy1mb3JtLWhpanJpLWRhdGVpdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlLWZpZWxkIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZm9ybS12b2NhYnVsYXJ5LWl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidDUkVBVEUuU0NSRUNZX0xFVkVMJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiaW5kTGFiZWxdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiaW5kVmFsdWVdPVwiJ2lkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWT0NBQlVMQVJZLlNFTEVDVF9JVEVNJyB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hhYmxlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nsb3NlT25TZWxlY3RdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlU2VsZWN0ZWRJdGVtc109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2b2NhYnVsYXJ5VHlwZV09XCInVk9DX1NlY3JlY3lMZXZlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzZWNyZWN5TGV2ZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FwcC1keW5hbWljLWZvcm0tdm9jYWJ1bGFyeS1pdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlLWZpZWxkIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZm9ybS12b2NhYnVsYXJ5LWl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidDUkVBVEUuSU1QT1JUQU5DRV9MRVZFTCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmluZExhYmVsXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmluZFZhbHVlXT1cIidpZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVk9DQUJVTEFSWS5TRUxFQ1RfSVRFTScgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoYWJsZV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbG9zZU9uU2VsZWN0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZVNlbGVjdGVkSXRlbXNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdm9jYWJ1bGFyeVR5cGVdPVwiJ1ZPQ19JbXBvcnRhbmNlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImltcG9ydGFuY2VMZXZlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLWR5bmFtaWMtZm9ybS12b2NhYnVsYXJ5LWl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlLWZpZWxkIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtc3R5bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgXCJDUkVBVEUuREVQQVJUTUVOVF9DT0RFXCIgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZm9ybS1kZXBhcnRtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRlcGFydG1lbnRDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidwbGVhc2Ugc2VsZWN0IGRlcGFydG1lbnQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BwX2RlcGFydG1lbnROZXN0ZWRUcmVlXT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BQX09TX0RlcGFydG1lbnRzJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHBfZGVwYXJ0bWVudFRyZWVdPVwiJ1BQX09TX0RlcGFydG1lbnRzJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjdXN0b21QcmVmaXhdPVwiJ29zZGVwdCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY3VzdG9tUGFyZW50UHJvcGVydHldPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3NkZXBhcnRtZW50X3BhcmVudERlcGFydG1lbnRDb2RlJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdXNlQ3VzdG9tQWRkRWRpdEFjdGlvbl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtZHluYW1pYy1mb3JtLWRlcGFydG1lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlLWZpZWxkIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLXRyYW5zbGF0ZWQtdm9jYWJ1bGFyeS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidDUkVBVEUuQUdFTkNZX0NBVEVHT1JZX0NPREUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FyYkJpbmRMYWJlbF09XCInbGFiZWxfYXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VuZ0JpbmRMYWJlbF09XCInbGFiZWxfZW4nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JpbmRWYWx1ZV09XCInaWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZPQ0FCVUxBUlkuU0VMRUNUX0lURU0nIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbG9zZU9uU2VsZWN0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZVNlbGVjdGVkSXRlbXNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZ2VuY3lDYXRlZ29yeUNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdm9jYnVsYXJ5SWRdPVwiJ1ZPQ19BZ2VuY3lDYXRlZ29yeSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdXNlRmlsdGVyXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtdHJhbnNsYXRlZC12b2NhYnVsYXJ5LXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGUtZmllbGQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtdHJhbnNsYXRlZC12b2NhYnVsYXJ5LXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0NSRUFURS5BR0VOQ1lfTkFNRSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXJiQmluZExhYmVsXT1cIidsYWJlbF9hcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW5nQmluZExhYmVsXT1cIidsYWJlbF9lbidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmluZFZhbHVlXT1cIidpZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVk9DQUJVTEFSWS5TRUxFQ1RfSVRFTScgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nsb3NlT25TZWxlY3RdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlU2VsZWN0ZWRJdGVtc109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFnZW5jeU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdm9jYnVsYXJ5SWRdPVwiJ1ZPQ19BZ2VuY3knXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJhZ2VuY3lOYW1lRmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZUZpbHRlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtdHJhbnNsYXRlZC12b2NhYnVsYXJ5LXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGUtZmllbGQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtdHJhbnNsYXRlZC12b2NhYnVsYXJ5LXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0NSRUFURS5DT1VOVFJZX0NBVEVHT1JZX0NPREUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FyYkJpbmRMYWJlbF09XCInbGFiZWxfYXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VuZ0JpbmRMYWJlbF09XCInbGFiZWxfZW4nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JpbmRWYWx1ZV09XCInaWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZPQ0FCVUxBUlkuU0VMRUNUX0lURU0nIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbG9zZU9uU2VsZWN0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZVNlbGVjdGVkSXRlbXNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5Q2F0ZWdvcnlDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZvY2J1bGFyeUlkXT1cIidWT0NfQ291bnRyeUNhdGVnb3J5J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt1c2VGaWx0ZXJdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FwcC10cmFuc2xhdGVkLXZvY2FidWxhcnktc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZS1maWVsZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC10cmFuc2xhdGVkLXZvY2FidWxhcnktc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQ1JFQVRFLkNPVU5UUllfTkFNRSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXJiQmluZExhYmVsXT1cIidsYWJlbF9hcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW5nQmluZExhYmVsXT1cIidsYWJlbF9lbidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmluZFZhbHVlXT1cIidpZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVk9DQUJVTEFSWS5TRUxFQ1RfSVRFTScgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nsb3NlT25TZWxlY3RdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlU2VsZWN0ZWRJdGVtc109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvdW50cnlOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZvY2J1bGFyeUlkXT1cIidWT0NfQ291bnRyeSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImNvdW50cnlOYW1lRmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZUZpbHRlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtdHJhbnNsYXRlZC12b2NhYnVsYXJ5LXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGUtZmllbGQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1zdHlsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBcIkNSRUFURS5SRU1BUktTXCIgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1zdHlsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlbWFya3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NSRUFURS5SRU1BUktTJyB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tICpuZ0lmPVwiXCIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtcGFydCAtbXgtNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRGaWxlLmR5bmFtaWNGb3JtICYmIHNob3dSZW5kZXJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZm9ybVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwic2VsZWN0ZWRGaWxlLmR5bmFtaWNGb3JtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cInRlbXBvcmFyeUR5YW5taWNEYXRhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25keW5hbWljRm9ybUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvYXBwLWR5bmFtaWMtZm9ybT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLSBhY3Rpb25zIGFuZCBidXR0b25zICAtLT5cclxuICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cInctZnVsbCBkLWZsZXgganVzdGlmeS1iZXR3ZWVuIHNjYW5uZXItYWN0aW9ucy13cmFwcGVyIGFic29sdXRlIGJvdHRvbS0wXCJcclxuICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FuY2VsYXRpb24tYnV0dG9uXCIgKGNsaWNrKT1cImNsb3NlRGlhbG9nKClcIj5cclxuICAgICAgICAgICAgICAgIHt7IFwiQlVUVE9OUy5DQU5DRUxcIiB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbmNlbGF0aW9uLWJ1dHRvbiBteC0yXCIgKGNsaWNrKT1cIm1pbmltaXpEaWFsb2coKVwiPlxyXG4gICAgICAgICAgICAgICAge3sgXCJCVVRUT05TLk1JTklNSVpFRFwiIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tICAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgIDwhLS0gPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjcmVhdGlvbkZhaWxlZFwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc2Nhbm5lclVwbG9hZEJ1dHRvbi5kaXNhYmxlZCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZEZpbGUuZHluYW1pY0RhdGEudmFsaWQgfHxcclxuICAgICAgICAgICAgICAgICAgICBmaWxlRm9ybS5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICdvcGFjaXR5LTMwIGN1cnNvci1ub3QtYWxsb3dlZCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZXJVcGxvYWRCdXR0b24uZGlzYWJsZWQgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkRmlsZS5keW5hbWljRGF0YS52YWxpZCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlRm9ybS5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjcmVhdGVEb2N1bWVudCgpXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3VibWlzc2lvbi1idXR0b25cIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyBcIkJVVFRPTlMuVFJZX0FHQUlOXCIgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+IC0tPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlRG9jdW1lbnQoKVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc2Nhbm5lclVwbG9hZEJ1dHRvbi5kaXNhYmxlZCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZEZpbGUuZHluYW1pY0RhdGEudmFsaWQgfHxcclxuICAgICAgICAgICAgICAgICAgICBmaWxlRm9ybS5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICdvcGFjaXR5LTMwIGN1cnNvci1ub3QtYWxsb3dlZCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZXJVcGxvYWRCdXR0b24uZGlzYWJsZWQgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkRmlsZS5keW5hbWljRGF0YS52YWxpZCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlRm9ybS5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3VibWlzc2lvbi1idXR0b25cIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyB1cGxvYWRNYW5nbWVudFNlcnZpY2Uuc2NhbkNyZWF0aW9uRmFpbGVkID8gIChcIkJVVFRPTlMuVFJZX0FHQUlOXCIgfCB0cmFuc2xhdGUpIDogKFwiQlVUVE9OUy5DUkVBVEVcIiB8IHRyYW5zbGF0ZSkgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==