tnx-shared 5.2.20 → 5.2.21

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 (71) hide show
  1. package/app-context/component-context.service.d.ts.map +1 -1
  2. package/classes/base/component-base.d.ts +1 -1
  3. package/classes/public-function.d.ts +3 -2
  4. package/classes/public-function.d.ts.map +1 -1
  5. package/components/chat/chat-box/chat-box.component.d.ts +1 -1
  6. package/components/dropdown/services/dropdown.service.d.ts.map +1 -1
  7. package/components/file-explorer/services/file-explorer-new.service.d.ts.map +1 -1
  8. package/components/file-explorer/services/file-explorer.service.d.ts.map +1 -1
  9. package/components/file-explorer/services/file-version.service.d.ts.map +1 -1
  10. package/components/file-explorer/services/folder.service.d.ts.map +1 -1
  11. package/components/file-explorer/services/ky-so-sim-signPDF.service.d.ts.map +1 -1
  12. package/components/file-explorer/services/my-drive.service.d.ts.map +1 -1
  13. package/components/tn-app-help/services/path-name.service.d.ts.map +1 -1
  14. package/congviec/congviec/services/congviec-dinhkem.service.d.ts.map +1 -1
  15. package/esm2020/app-context/component-context.service.mjs +4 -5
  16. package/esm2020/classes/base/component-base.mjs +2 -2
  17. package/esm2020/components/common-app-component/common-app-component.mjs +2 -2
  18. package/esm2020/components/crud/crud-form/crud-form.component.mjs +1 -1
  19. package/esm2020/components/dropdown/services/dropdown.service.mjs +5 -5
  20. package/esm2020/components/file-explorer/file-ky-so-sim/file-ky-so-sim.component.mjs +1 -1
  21. package/esm2020/components/file-explorer/file-manager/file-manager.component.mjs +2 -2
  22. package/esm2020/components/file-explorer/file-viewer/file-viewer.component.mjs +3 -3
  23. package/esm2020/components/file-explorer/services/file-explorer-new.service.mjs +39 -40
  24. package/esm2020/components/file-explorer/services/file-explorer.service.mjs +48 -51
  25. package/esm2020/components/file-explorer/services/file-version.service.mjs +5 -4
  26. package/esm2020/components/file-explorer/services/folder.service.mjs +3 -3
  27. package/esm2020/components/file-explorer/services/ky-so-sim-signPDF.service.mjs +3 -2
  28. package/esm2020/components/file-explorer/services/my-drive.service.mjs +34 -34
  29. package/esm2020/components/mask/mask.component.mjs +1 -1
  30. package/esm2020/components/number-picker-range/number-picker-range.component.mjs +1 -1
  31. package/esm2020/components/tn-app-help/services/path-name.service.mjs +4 -3
  32. package/esm2020/components/tn-tinymce/tn-tinymce.component.mjs +2 -2
  33. package/esm2020/components/user-picker/user-picker-box/user-picker-box.component.mjs +1 -1
  34. package/esm2020/components/workflow/workflow-history-new/workflow-history-new.component.mjs +1 -1
  35. package/esm2020/congviec/cauhinh-workflow/cauhinh-workflow.component.mjs +1 -1
  36. package/esm2020/congviec/congviec/services/congviec-dinhkem.service.mjs +5 -4
  37. package/esm2020/services/article.service.mjs +10 -13
  38. package/esm2020/services/base.service.mjs +36 -41
  39. package/esm2020/services/custom-router.service.mjs +4 -5
  40. package/esm2020/services/entity-picker.service.mjs +4 -3
  41. package/esm2020/services/file-object-v4.service.mjs +5 -7
  42. package/esm2020/services/high-performance.service.mjs +4 -3
  43. package/esm2020/services/master-data.service.mjs +23 -30
  44. package/esm2020/services/organization.service.mjs +18 -23
  45. package/esm2020/services/template-v4.service.mjs +3 -2
  46. package/esm2020/services/template.service.mjs +19 -27
  47. package/esm2020/services/templateinstance.service.mjs +22 -31
  48. package/esm2020/services/tn-client.service.mjs +3 -3
  49. package/esm2020/services/unique-number.service.mjs +4 -3
  50. package/esm2020/services/user-v5.service.mjs +31 -39
  51. package/esm2020/services/user.service.mjs +32 -40
  52. package/fesm2015/tnx-shared.mjs +334 -409
  53. package/fesm2015/tnx-shared.mjs.map +1 -1
  54. package/fesm2020/tnx-shared.mjs +334 -409
  55. package/fesm2020/tnx-shared.mjs.map +1 -1
  56. package/package.json +2 -2
  57. package/services/article.service.d.ts.map +1 -1
  58. package/services/base.service.d.ts.map +1 -1
  59. package/services/common.service.d.ts +2 -2
  60. package/services/custom-router.service.d.ts.map +1 -1
  61. package/services/entity-picker.service.d.ts.map +1 -1
  62. package/services/file-object-v4.service.d.ts.map +1 -1
  63. package/services/high-performance.service.d.ts.map +1 -1
  64. package/services/master-data.service.d.ts.map +1 -1
  65. package/services/organization.service.d.ts.map +1 -1
  66. package/services/template-v4.service.d.ts.map +1 -1
  67. package/services/template.service.d.ts.map +1 -1
  68. package/services/templateinstance.service.d.ts.map +1 -1
  69. package/services/unique-number.service.d.ts.map +1 -1
  70. package/services/user-v5.service.d.ts.map +1 -1
  71. package/services/user.service.d.ts.map +1 -1
@@ -1,5 +1,6 @@
1
1
  import { Injectable } from '@angular/core';
2
2
  import * as printJS_ from 'print-js';
3
+ import { firstValueFrom } from 'rxjs';
3
4
  import { catchError, retry, shareReplay } from 'rxjs/operators';
4
5
  import { BaseService } from '../../../services/base.service';
5
6
  import { GenerateLinkDownloadDTO } from '../models/generate-link-download-dto';
@@ -19,72 +20,71 @@ export class FileExplorerNewService extends BaseService {
19
20
  }
20
21
  getMyFiles() {
21
22
  const svUrl = `${this._serviceUri}/File/GetMyFiles`;
22
- return this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err))).toPromise();
23
+ return firstValueFrom(this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err))));
23
24
  }
24
25
  getByFolderId(folderId) {
25
26
  if (folderId == '00000000-0000-0000-0000-000000000000') {
26
27
  return Promise.reject({ status: 400 });
27
28
  }
28
29
  const svUrl = `${this._serviceUri}/File?folderId=${folderId}`;
29
- return this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err))).toPromise();
30
+ return firstValueFrom(this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err))));
30
31
  }
31
32
  getMyDrive(folderId) {
32
33
  if (folderId == '00000000-0000-0000-0000-000000000000') {
33
34
  return Promise.reject({ status: 400 });
34
35
  }
35
36
  const svUrl = `${this._serviceUri}/File/GetMyDrive?folderId=${folderId}`;
36
- return this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err))).toPromise();
37
+ return firstValueFrom(this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err))));
37
38
  }
38
39
  getMyShare(userId) {
39
40
  if (userId < 0) {
40
41
  return Promise.reject({ status: 400 });
41
42
  }
42
43
  const svUrl = `${this._serviceUri}/Folder/GetMyShare?userId=${userId}`;
43
- return this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err))).toPromise();
44
+ return firstValueFrom(this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err))));
44
45
  }
45
46
  getMyShareToOther(ownerId) {
46
47
  if (ownerId < 0) {
47
48
  return Promise.reject({ status: 400 });
48
49
  }
49
50
  const svUrl = `${this._serviceUri}/Folder/GetMyShareToOther?ownerId=${ownerId}`;
50
- return this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err))).toPromise();
51
+ return firstValueFrom(this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err))));
51
52
  }
52
53
  getFolderTree(folderId) {
53
54
  if (folderId == '00000000-0000-0000-0000-000000000000') {
54
55
  return Promise.reject({ status: 400 });
55
56
  }
56
57
  const apiUrl = `${this._serviceUri}/File/GetTree?folderId=${folderId}`;
57
- return this._http.get(apiUrl)
58
- .pipe(catchError((err) => this.handleError(err)))
59
- .toPromise();
58
+ return firstValueFrom(this._http.get(apiUrl)
59
+ .pipe(catchError((err) => this.handleError(err))));
60
60
  }
61
61
  copyFile(copyFileDto) {
62
62
  const svUrl = `${this._serviceUri}/File/CopyFile`;
63
- return this._http.post(svUrl, copyFileDto).pipe(catchError((err) => this.handleError(err))).toPromise();
63
+ return firstValueFrom(this._http.post(svUrl, copyFileDto).pipe(catchError((err) => this.handleError(err))));
64
64
  }
65
65
  createNewFolder(folder) {
66
66
  const svUrl = `${this._serviceUri}/Folder`;
67
- return this._http.post(svUrl, folder).pipe(catchError((err) => this.handleError(err))).toPromise();
67
+ return firstValueFrom(this._http.post(svUrl, folder).pipe(catchError((err) => this.handleError(err))));
68
68
  }
69
69
  deleteFolder(folderId) {
70
70
  const svUrl = `${this._serviceUri}/Folder/${folderId}`;
71
- return this._http.delete(svUrl).pipe(catchError((err) => this.handleError(err))).toPromise();
71
+ return firstValueFrom(this._http.delete(svUrl).pipe(catchError((err) => this.handleError(err))));
72
72
  }
73
73
  deleteMultipleFolder(folderIds) {
74
74
  const svUrl = `${this._serviceUri}/Folder/deleteMultipleFolder/${folderIds}`;
75
- return this._http.delete(svUrl).pipe(catchError((err) => this.handleError(err))).toPromise();
75
+ return firstValueFrom(this._http.delete(svUrl).pipe(catchError((err) => this.handleError(err))));
76
76
  }
77
77
  renameFolder(folderId, newFolderName) {
78
78
  const svUrl = `${this._serviceUri}/Folder/${folderId}/RenameFolder/${newFolderName}`;
79
- return this._http.patch(svUrl, {}).pipe(catchError((err) => this.handleError(err))).toPromise();
79
+ return firstValueFrom(this._http.patch(svUrl, {}).pipe(catchError((err) => this.handleError(err))));
80
80
  }
81
81
  shareFolder(shareFolder) {
82
82
  const svUrl = `${this._serviceUri}/Folder/ShareFolder`;
83
- return this._http.post(svUrl, shareFolder).pipe(catchError((err) => this.handleError(err))).toPromise();
83
+ return firstValueFrom(this._http.post(svUrl, shareFolder).pipe(catchError((err) => this.handleError(err))));
84
84
  }
85
85
  deleteShareFolder(folderId, objectId) {
86
86
  const svUrl = `${this._serviceUri}/Folder/${folderId}/DeleteShareFolder/${objectId}`;
87
- return this._http.delete(svUrl).pipe(catchError((err) => this.handleError(err))).toPromise();
87
+ return firstValueFrom(this._http.delete(svUrl).pipe(catchError((err) => this.handleError(err))));
88
88
  }
89
89
  getUploadUrl() {
90
90
  return `${this._serviceUri}/File`;
@@ -94,7 +94,7 @@ export class FileExplorerNewService extends BaseService {
94
94
  }
95
95
  getBinaryFileByFileId(fileId) {
96
96
  return new Promise((resolve, reject) => {
97
- this._http.get(this.getFileDownloadUrl(fileId)).toPromise().then(rs => {
97
+ firstValueFrom(this._http.get(this.getFileDownloadUrl(fileId))).then(rs => {
98
98
  console.log(rs);
99
99
  resolve(null);
100
100
  }).catch(err => reject(err));
@@ -105,7 +105,7 @@ export class FileExplorerNewService extends BaseService {
105
105
  }
106
106
  getFile(fileId) {
107
107
  const svUrl = `${this._serviceUri}/File/${fileId}`;
108
- return this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err))).toPromise();
108
+ return firstValueFrom(this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err))));
109
109
  }
110
110
  getFileVersionDownloadUrl(fileVersionId) {
111
111
  return `${this._serviceUri}/FileVersion/${fileVersionId}/download`;
@@ -118,7 +118,7 @@ export class FileExplorerNewService extends BaseService {
118
118
  if (model.isFileVersion && !model.fileVersionId) {
119
119
  model.fileVersionId = model.fileId;
120
120
  }
121
- return this._http.post(svUrl, model).pipe(catchError((err) => this.handleError(err))).toPromise();
121
+ return firstValueFrom(this._http.post(svUrl, model).pipe(catchError((err) => this.handleError(err))));
122
122
  }
123
123
  downloadFile(fileId, isFileVersion = false) {
124
124
  const model = new GenerateLinkDownloadDTO();
@@ -131,59 +131,59 @@ export class FileExplorerNewService extends BaseService {
131
131
  }
132
132
  generateLinkDownloadMultiple(model) {
133
133
  const svUrl = `${this._serviceUri}/Download/GenerateDownloadMultipleLink`;
134
- return this._http.post(svUrl, model).pipe(catchError((err) => this.handleError(err))).toPromise();
134
+ return firstValueFrom(this._http.post(svUrl, model).pipe(catchError((err) => this.handleError(err))));
135
135
  }
136
136
  getBinaryFile(linkDownload) {
137
- return this._http.get(linkDownload).toPromise();
137
+ return firstValueFrom(this._http.get(linkDownload));
138
138
  }
139
139
  setMoveFileItem(moveFile) {
140
140
  const svUrl = `${this._serviceUri}/File/MoveFile`;
141
- return this._http.post(svUrl, moveFile).pipe(catchError((err) => this.handleError(err))).toPromise();
141
+ return firstValueFrom(this._http.post(svUrl, moveFile).pipe(catchError((err) => this.handleError(err))));
142
142
  }
143
143
  deleteFile(fileId) {
144
144
  const svUrl = `${this._serviceUri}/File/${fileId}`;
145
- return this._http.delete(svUrl).pipe(catchError((err) => this.handleError(err))).toPromise();
145
+ return firstValueFrom(this._http.delete(svUrl).pipe(catchError((err) => this.handleError(err))));
146
146
  }
147
147
  deleteMultipleFile(fileIds) {
148
148
  const svUrl = `${this._serviceUri}/File/deleteMultipleFile/${fileIds}`;
149
- return this._http.delete(svUrl).pipe(catchError((err) => this.handleError(err))).toPromise();
149
+ return firstValueFrom(this._http.delete(svUrl).pipe(catchError((err) => this.handleError(err))));
150
150
  }
151
151
  deleteFileVersion(fileVersionId) {
152
152
  const svUrl = `${this._serviceUri}/FileVersion/${fileVersionId}`;
153
- return this._http.delete(svUrl).pipe(catchError((err) => this.handleError(err))).toPromise();
153
+ return firstValueFrom(this._http.delete(svUrl).pipe(catchError((err) => this.handleError(err))));
154
154
  }
155
155
  renameFile(fileId, newFileName) {
156
156
  const svUrl = `${this._serviceUri}/File/${fileId}/RenameFile/${newFileName}`;
157
- return this._http.patch(svUrl, {}).pipe(catchError((err) => this.handleError(err))).toPromise();
157
+ return firstValueFrom(this._http.patch(svUrl, {}).pipe(catchError((err) => this.handleError(err))));
158
158
  }
159
159
  shareFile(shareFile) {
160
160
  const svUrl = `${this._serviceUri}/File/ShareFile`;
161
- return this._http.post(svUrl, shareFile).pipe(catchError((err) => this.handleError(err))).toPromise();
161
+ return firstValueFrom(this._http.post(svUrl, shareFile).pipe(catchError((err) => this.handleError(err))));
162
162
  }
163
163
  deleteShareFile(fileId, objectId) {
164
164
  const svUrl = `${this._serviceUri}/File/${fileId}/DeleteShareFile/${objectId}`;
165
- return this._http.delete(svUrl).pipe(catchError((err) => this.handleError(err))).toPromise();
165
+ return firstValueFrom(this._http.delete(svUrl).pipe(catchError((err) => this.handleError(err))));
166
166
  }
167
167
  getSharedFiles(folderId) {
168
168
  let svUrl = `${this._serviceUri}/File/GetMySharedFiles`;
169
169
  if (folderId) {
170
170
  svUrl = `${svUrl}?folderId=${folderId}`;
171
171
  }
172
- return this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err))).toPromise();
172
+ return firstValueFrom(this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err))));
173
173
  }
174
174
  getUserSharingByFile(fileId) {
175
175
  let svUrl = `${this._serviceUri}/File/GetUserSharingByFile`;
176
176
  if (fileId) {
177
177
  svUrl = `${svUrl}?fileId=${fileId}`;
178
178
  }
179
- return this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err))).toPromise();
179
+ return firstValueFrom(this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err))));
180
180
  }
181
181
  getFolderId(userId) {
182
182
  let svUrl = `${this._serviceUri}/Folder/GetFolderId`;
183
183
  if (userId) {
184
184
  svUrl = `${svUrl}?userId=${userId}`;
185
185
  }
186
- return this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err))).toPromise();
186
+ return firstValueFrom(this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err))));
187
187
  }
188
188
  isSupportedViewOnline(fileName) {
189
189
  // file không có đuổi -> loại
@@ -234,7 +234,7 @@ export class FileExplorerNewService extends BaseService {
234
234
  'title': fileName,
235
235
  'url': downloadUrl
236
236
  };
237
- this._http.post(service, input).toPromise().then((rsConvert) => {
237
+ firstValueFrom(this._http.post(service, input)).then((rsConvert) => {
238
238
  resolve(rsConvert.fileUrl);
239
239
  }, err => {
240
240
  reject(null);
@@ -265,19 +265,19 @@ export class FileExplorerNewService extends BaseService {
265
265
  return fileExtArr[fileExtArr.length - 1].toLowerCase() === 'pdf';
266
266
  }
267
267
  saveSignedFile(data) {
268
- return this._http.post(`${this._serviceUri}/Signature/SaveSignedFile`, data).toPromise();
268
+ return firstValueFrom(this._http.post(`${this._serviceUri}/Signature/SaveSignedFile`, data));
269
269
  }
270
270
  getSignatureInfoByFileId(fileId) {
271
- return this._http.get(`${this._serviceUri}/Signature/GetListSignatureByFileId?fileId=${fileId}`).toPromise();
271
+ return firstValueFrom(this._http.get(`${this._serviceUri}/Signature/GetListSignatureByFileId?fileId=${fileId}`));
272
272
  }
273
273
  getSignatureInfoByFileVersionId(fileVersionId) {
274
- return this._http.get(`${this._serviceUri}/Signature/GetListSignatureByFileVersionId?fileVersionId=${fileVersionId}`).toPromise();
274
+ return firstValueFrom(this._http.get(`${this._serviceUri}/Signature/GetListSignatureByFileVersionId?fileVersionId=${fileVersionId}`));
275
275
  }
276
276
  getImageFileBase64(fileId, extension = 'jpg', width = 0, height = 0) {
277
277
  return new Promise((resolve, reject) => {
278
278
  const url = `${this._serviceUri}/File/getImageFileBase64?fileId=${fileId}&extension=${extension}&width=${width}&height=${height}`;
279
- this._http.get(url, { responseType: 'blob' })
280
- .toPromise().then(rs => {
279
+ firstValueFrom(this._http.get(url, { responseType: 'blob' }))
280
+ .then(rs => {
281
281
  const reader = new FileReader();
282
282
  reader.addEventListener('load', () => {
283
283
  resolve(reader.result);
@@ -295,9 +295,8 @@ export class FileExplorerNewService extends BaseService {
295
295
  }
296
296
  getServiceFileExplorer(model) {
297
297
  const svUrl = `${this._serviceUri}/File/GetServiceFileExplorer?service=${model.service}&entity=${model.entity}&entityInstanceId=${model.entityInstanceId}`;
298
- return this._http.get(svUrl)
299
- .pipe(catchError((err) => this.handleError(err)))
300
- .toPromise();
298
+ return firstValueFrom(this._http.get(svUrl)
299
+ .pipe(catchError((err) => this.handleError(err))));
301
300
  }
302
301
  }
303
302
  FileExplorerNewService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: FileExplorerNewService, deps: [{ token: i1.HttpClient }, { token: i0.Injector }, { token: i2.EnvironmentService }], target: i0.ɵɵFactoryTarget.Injectable });
@@ -308,4 +307,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
308
307
  providedIn: 'root'
309
308
  }]
310
309
  }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i0.Injector }, { type: i2.EnvironmentService }]; } });
311
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1leHBsb3Jlci1uZXcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1leHBsb3Jlci9zZXJ2aWNlcy9maWxlLWV4cGxvcmVyLW5ldy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBYyxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxLQUFLLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFDckMsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBSzdELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7O0FBTS9FLHFCQUFxQjtBQUNyQixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUM7QUFLekIsTUFBTSxPQUFPLHNCQUF1QixTQUFRLFdBQVc7SUFTbkQsWUFDSSxJQUFnQixFQUNoQixRQUFrQixFQUNWLG1CQUF1QztRQUUvQyxLQUFLLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUZsQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQW9CO1FBWG5ELGdCQUFXLEdBQUcsTUFBTSxDQUFDO1FBQ1osZ0JBQVcsR0FBVyxDQUFDLENBQUM7UUFDeEIsaUJBQVksR0FBVyxDQUFDLENBQUM7UUFZOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFFRCxVQUFVO1FBQ04sTUFBTSxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxrQkFBa0IsQ0FBQztRQUVwRCxPQUFPLElBQUksQ0FBQyxL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LENBQUM7O21IQXhiUSxzQkFBc0I7dUhBQXRCLHNCQUFzQixjQUZuQixNQUFNOzJGQUVULHNCQUFzQjtrQkFIbEMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgRWxlbWVudFJlZiwgSW5qZWN0YWJsZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgcHJpbnRKU18gZnJvbSAncHJpbnQtanMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCByZXRyeSwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFJlc3BvbnNlUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3Jlc3BvbnNlLXJlc3VsdCc7XHJcbmltcG9ydCB7IEF1dGhlblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoZW4uc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYmFzZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NvbW1vbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW52aXJvbm1lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZW52aXJvbm1lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IENvcHlGaWxlRHRvIH0gZnJvbSAnLi4vbW9kZWxzL2NvcHktZmlsZS1kdG8nO1xyXG5pbXBvcnQgeyBGb2xkZXJDcmVhdGVBbmRTZXRQZXJtaXNzaW9uRFRPIH0gZnJvbSAnLi4vbW9kZWxzL2ZvbGRlci1jcmVhdGUtYW5kLXNldC1wZXJtaXNzaW9uLWR0byc7XHJcbmltcG9ydCB7IEdlbmVyYXRlTGlua0Rvd25sb2FkRFRPIH0gZnJvbSAnLi4vbW9kZWxzL2dlbmVyYXRlLWxpbmstZG93bmxvYWQtZHRvJztcclxuaW1wb3J0IHsgTW92ZUZpbGVEVE8gfSBmcm9tICcuLi9tb2RlbHMvbW92ZS1maWxlLWR0byc7XHJcbmltcG9ydCB7IFNlcnZpY2VSZXF1ZXN0TW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvc2VydmljZS1yZXF1ZXN0LW1vZGVsJztcclxuaW1wb3J0IHsgU2hhcmVGaWxlRFRPIH0gZnJvbSAnLi4vbW9kZWxzL3NoYXJlLWZpbGUtZHRvJztcclxuaW1wb3J0IHsgU2hhcmVGb2xkZXJEVE8gfSBmcm9tICcuLi9tb2RlbHMvc2hhcmUtZm9sZGVyLWR0byc7XHJcblxyXG4vLyBmaXggZm9yIGJ1aWxkIHByb2RcclxuY29uc3QgcHJpbnRKUyA9IHByaW50SlNfO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWxlRXhwbG9yZXJOZXdTZXJ2aWNlIGV4dGVuZHMgQmFzZVNlcnZpY2Uge1xyXG4gICAgc2VydmljZUNvZGUgPSAnZmlsZSc7XHJcbiAgICByZWFkb25seSBSRVRSWV9DT1VOVDogbnVtYmVyID0gMDtcclxuICAgIHJlYWRvbmx5IFJFUExBWV9DT1VOVDogbnVtYmVyID0gMTtcclxuICAgIF9kb2N1bWVudFNlcnZlclVybDogYW55O1xyXG4gICAgcmVhZG9ubHkgX3NlcnZpY2VVcmk7XHJcbiAgICBwcml2YXRlIF9hdXRoZW5TZXJ2aWNlOiBBdXRoZW5TZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSBfY29tbW9uU2VyaXZjZTogQ29tbW9uU2VydmljZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICBwcml2YXRlIF9lbnZpcm9ubWVudFNlcnZpY2U6IEVudmlyb25tZW50U2VydmljZVxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoaHR0cCwgaW5qZWN0b3IsICcnKTtcclxuICAgICAgICB0aGlzLnNlcnZpY2VVcmkgPSB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0SHR0cFNlcnZpY2VFbmRwb2ludE9sZCh0aGlzLnNlcnZpY2VDb2RlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNeUZpbGVzKCk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuX3NlcnZpY2VVcml9L0ZpbGUvR2V0TXlGaWxlc2A7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KHRoaXMuUkVQTEFZX0NPVU5UKSxcclxuICAgICAgICAgICAgcmV0cnkodGhpcy5SRVRSWV9DT1VOVCksXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEJ5Rm9sZGVySWQoZm9sZGVySWQ6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBpZiAoZm9sZGVySWQgPT0gJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHsgc3RhdHVzOiA0MDAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuX3NlcnZpY2VVcml9L0ZpbGU/Zm9sZGVySWQ9JHtmb2xkZXJJZH1gO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHN2VXJsKS5waXBlKFxyXG4gICAgICAgICAgICBzaGFyZVJlcGxheSh0aGlzLlJFUExBWV9DT1VOVCksXHJcbiAgICAgICAgICAgIHJldHJ5KHRoaXMuUkVUUllfQ09VTlQpLFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpXHJcbiAgICAgICAgKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNeURyaXZlKGZvbGRlcklkOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgaWYgKGZvbGRlcklkID09ICcwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh7IHN0YXR1czogNDAwIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9GaWxlL0dldE15RHJpdmU/Zm9sZGVySWQ9JHtmb2xkZXJJZH1gO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHN2VXJsKS5waXBlKFxyXG4gICAgICAgICAgICBzaGFyZVJlcGxheSh0aGlzLlJFUExBWV9DT1VOVCksXHJcbiAgICAgICAgICAgIHJldHJ5KHRoaXMuUkVUUllfQ09VTlQpLFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpXHJcbiAgICAgICAgKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNeVNoYXJlKHVzZXJJZDogbnVtYmVyKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGlmICh1c2VySWQgPCAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh7IHN0YXR1czogNDAwIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9Gb2xkZXIvR2V0TXlTaGFyZT91c2VySWQ9JHt1c2VySWR9YDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0PihzdlVybCkucGlwZShcclxuICAgICAgICAgICAgc2hhcmVSZXBsYXkodGhpcy5SRVBMQVlfQ09VTlQpLFxyXG4gICAgICAgICAgICByZXRyeSh0aGlzLlJFVFJZX0NPVU5UKSxcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKVxyXG4gICAgICAgICkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TXlTaGFyZVRvT3RoZXIob3duZXJJZDogbnVtYmVyKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGlmIChvd25lcklkIDwgMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoeyBzdGF0dXM6IDQwMCB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5fc2VydmljZVVyaX0vRm9sZGVyL0dldE15U2hhcmVUb090aGVyP293bmVySWQ9JHtvd25lcklkfWA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KHRoaXMuUkVQTEFZX0NPVU5UKSxcclxuICAgICAgICAgICAgcmV0cnkodGhpcy5SRVRSWV9DT1VOVCksXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZvbGRlclRyZWUoZm9sZGVySWQ6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBpZiAoZm9sZGVySWQgPT0gJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHsgc3RhdHVzOiA0MDAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9GaWxlL0dldFRyZWU/Zm9sZGVySWQ9JHtmb2xkZXJJZH1gO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oYXBpVXJsKVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpKVxyXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29weUZpbGUoY29weUZpbGVEdG86IENvcHlGaWxlRHRvKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5fc2VydmljZVVyaX0vRmlsZS9Db3B5RmlsZWA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAucG9zdDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwsIGNvcHlGaWxlRHRvKS5waXBlKFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpXHJcbiAgICAgICAgKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVOZXdGb2xkZXIoZm9sZGVyOiBGb2xkZXJDcmVhdGVBbmRTZXRQZXJtaXNzaW9uRFRPKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5fc2VydmljZVVyaX0vRm9sZGVyYDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAucG9zdDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwsIGZvbGRlcikucGlwZShcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKVxyXG4gICAgICAgICkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlRm9sZGVyKGZvbGRlcklkOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9Gb2xkZXIvJHtmb2xkZXJJZH1gO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwLmRlbGV0ZTxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZU11bHRpcGxlRm9sZGVyKGZvbGRlcklkczogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5fc2VydmljZVVyaX0vRm9sZGVyL2RlbGV0ZU11bHRpcGxlRm9sZGVyLyR7Zm9sZGVySWRzfWA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwLmRlbGV0ZTxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmFtZUZvbGRlcihmb2xkZXJJZDogc3RyaW5nLCBuZXdGb2xkZXJOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9Gb2xkZXIvJHtmb2xkZXJJZH0vUmVuYW1lRm9sZGVyLyR7bmV3Rm9sZGVyTmFtZX1gO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwLnBhdGNoPFJlc3BvbnNlUmVzdWx0PihzdlVybCwge30pLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNoYXJlRm9sZGVyKHNoYXJlRm9sZGVyOiBTaGFyZUZvbGRlckRUTyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuX3NlcnZpY2VVcml9L0ZvbGRlci9TaGFyZUZvbGRlcmA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwLnBvc3Q8UmVzcG9uc2VSZXN1bHQ+KHN2VXJsLCBzaGFyZUZvbGRlcikucGlwZShcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKVxyXG4gICAgICAgICkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlU2hhcmVGb2xkZXIoZm9sZGVySWQ6IHN0cmluZywgb2JqZWN0SWQ6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuX3NlcnZpY2VVcml9L0ZvbGRlci8ke2ZvbGRlcklkfS9EZWxldGVTaGFyZUZvbGRlci8ke29iamVjdElkfWA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwLmRlbGV0ZTxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVwbG9hZFVybCgpIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5fc2VydmljZVVyaX0vRmlsZWA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsZURvd25sb2FkVXJsKGZpbGVJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuX3NlcnZpY2VVcml9L0ZpbGUvJHtmaWxlSWR9L2Rvd25sb2FkYDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRCaW5hcnlGaWxlQnlGaWxlSWQoZmlsZUlkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2h0dHAuZ2V0KHRoaXMuZ2V0RmlsZURvd25sb2FkVXJsKGZpbGVJZCkpLnRvUHJvbWlzZSgpLnRoZW4ocnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cocnMpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiByZWplY3QoZXJyKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2NhbkZpbGVVcGxvYWRFbmRwb2ludChjb3JyZWxhdGlvbklkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5fc2VydmljZVVyaX0vRmlsZS9DcmVhdGVTY2FubmVkRmlsZS8ke2NvcnJlbGF0aW9uSWR9YDtcclxuICAgIH1cclxuICAgIGdldEZpbGUoZmlsZUlkOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9GaWxlLyR7ZmlsZUlkfWA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KHRoaXMuUkVQTEFZX0NPVU5UKSxcclxuICAgICAgICAgICAgcmV0cnkodGhpcy5SRVRSWV9DT1VOVCksXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZpbGVWZXJzaW9uRG93bmxvYWRVcmwoZmlsZVZlcnNpb25JZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuX3NlcnZpY2VVcml9L0ZpbGVWZXJzaW9uLyR7ZmlsZVZlcnNpb25JZH0vZG93bmxvYWRgO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFub255bW91c0Rvd25sb2FkVXJsKGhhc2g6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9Eb3dubG9hZC8ke2hhc2h9YDtcclxuICAgIH1cclxuXHJcbiAgICBnZW5lcmF0ZUxpbmtEb3dubG9hZChtb2RlbDogR2VuZXJhdGVMaW5rRG93bmxvYWREVE8pOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9Eb3dubG9hZC9HZW5lcmF0ZURvd25sb2FkTGlua2A7XHJcblxyXG4gICAgICAgIGlmIChtb2RlbC5pc0ZpbGVWZXJzaW9uICYmICFtb2RlbC5maWxlVmVyc2lvbklkKSB7XHJcbiAgICAgICAgICAgIG1vZGVsLmZpbGVWZXJzaW9uSWQgPSBtb2RlbC5maWxlSWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5wb3N0PFJlc3BvbnNlUmVzdWx0PihzdlVybCwgbW9kZWwpLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSkpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGRvd25sb2FkRmlsZShmaWxlSWQ6IHN0cmluZywgaXNGaWxlVmVyc2lvbjogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgbW9kZWwgPSBuZXcgR2VuZXJhdGVMaW5rRG93bmxvYWREVE8oKTtcclxuICAgICAgICBtb2RlbC5maWxlSWQgPSBmaWxlSWQ7XHJcbiAgICAgICAgbW9kZWwuaXNGaWxlVmVyc2lvbiA9IGlzRmlsZVZlcnNpb247XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUxpbmtEb3dubG9hZChtb2RlbCkudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvd25sb2FkVXJsID0gdGhpcy5nZXRBbm9ueW1vdXNEb3dubG9hZFVybChyZXNwb25zZS5kYXRhKTtcclxuICAgICAgICAgICAgd2luZG93Lm9wZW4oZG93bmxvYWRVcmwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdlbmVyYXRlTGlua0Rvd25sb2FkTXVsdGlwbGUobW9kZWw6IEdlbmVyYXRlTGlua0Rvd25sb2FkRFRPW10pOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9Eb3dubG9hZC9HZW5lcmF0ZURvd25sb2FkTXVsdGlwbGVMaW5rYDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAucG9zdDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwsIG1vZGVsKS5waXBlKFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRCaW5hcnlGaWxlKGxpbmtEb3dubG9hZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAuZ2V0KGxpbmtEb3dubG9hZCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TW92ZUZpbGVJdGVtKG1vdmVGaWxlOiBNb3ZlRmlsZURUTyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuX3NlcnZpY2VVcml9L0ZpbGUvTW92ZUZpbGVgO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5wb3N0PFJlc3BvbnNlUmVzdWx0PihzdlVybCwgbW92ZUZpbGUpLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZUZpbGUoZmlsZUlkOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9GaWxlLyR7ZmlsZUlkfWA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwLmRlbGV0ZTxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZU11bHRpcGxlRmlsZShmaWxlSWRzOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9GaWxlL2RlbGV0ZU11bHRpcGxlRmlsZS8ke2ZpbGVJZHN9YDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAuZGVsZXRlPFJlc3BvbnNlUmVzdWx0PihzdlVybCkucGlwZShcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKVxyXG4gICAgICAgICkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlRmlsZVZlcnNpb24oZmlsZVZlcnNpb25JZDogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5fc2VydmljZVVyaX0vRmlsZVZlcnNpb24vJHtmaWxlVmVyc2lvbklkfWA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAuZGVsZXRlPFJlc3BvbnNlUmVzdWx0PihzdlVybCkucGlwZShcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKVxyXG4gICAgICAgICkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuYW1lRmlsZShmaWxlSWQ6IHN0cmluZywgbmV3RmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuX3NlcnZpY2VVcml9L0ZpbGUvJHtmaWxlSWR9L1JlbmFtZUZpbGUvJHtuZXdGaWxlTmFtZX1gO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwLnBhdGNoPFJlc3BvbnNlUmVzdWx0PihzdlVybCwge30pLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNoYXJlRmlsZShzaGFyZUZpbGU6IFNoYXJlRmlsZURUTyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuX3NlcnZpY2VVcml9L0ZpbGUvU2hhcmVGaWxlYDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAucG9zdDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwsIHNoYXJlRmlsZSkucGlwZShcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKVxyXG4gICAgICAgICkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlU2hhcmVGaWxlKGZpbGVJZDogc3RyaW5nLCBvYmplY3RJZDogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5fc2VydmljZVVyaX0vRmlsZS8ke2ZpbGVJZH0vRGVsZXRlU2hhcmVGaWxlLyR7b2JqZWN0SWR9YDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAuZGVsZXRlPFJlc3BvbnNlUmVzdWx0PihzdlVybCkucGlwZShcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKVxyXG4gICAgICAgICkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2hhcmVkRmlsZXMoZm9sZGVySWQ/OiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgbGV0IHN2VXJsID0gYCR7dGhpcy5fc2VydmljZVVyaX0vRmlsZS9HZXRNeVNoYXJlZEZpbGVzYDtcclxuICAgICAgICBpZiAoZm9sZGVySWQpIHtcclxuICAgICAgICAgICAgc3ZVcmwgPSBgJHtzdlVybH0/Zm9sZGVySWQ9JHtmb2xkZXJJZH1gO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0PihzdlVybCkucGlwZShcclxuICAgICAgICAgICAgc2hhcmVSZXBsYXkodGhpcy5SRVBMQVlfQ09VTlQpLFxyXG4gICAgICAgICAgICByZXRyeSh0aGlzLlJFVFJZX0NPVU5UKSxcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKVxyXG4gICAgICAgICkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VXNlclNoYXJpbmdCeUZpbGUoZmlsZUlkOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgbGV0IHN2VXJsID0gYCR7dGhpcy5fc2VydmljZVVyaX0vRmlsZS9HZXRVc2VyU2hhcmluZ0J5RmlsZWA7XHJcbiAgICAgICAgaWYgKGZpbGVJZCkge1xyXG4gICAgICAgICAgICBzdlVybCA9IGAke3N2VXJsfT9maWxlSWQ9JHtmaWxlSWR9YDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KHRoaXMuUkVQTEFZX0NPVU5UKSxcclxuICAgICAgICAgICAgcmV0cnkodGhpcy5SRVRSWV9DT1VOVCksXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZvbGRlcklkKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGxldCBzdlVybCA9IGAke3RoaXMuX3NlcnZpY2VVcml9L0ZvbGRlci9HZXRGb2xkZXJJZGA7XHJcbiAgICAgICAgaWYgKHVzZXJJZCkge1xyXG4gICAgICAgICAgICBzdlVybCA9IGAke3N2VXJsfT91c2VySWQ9JHt1c2VySWR9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0PihzdlVybCkucGlwZShcclxuICAgICAgICAgICAgc2hhcmVSZXBsYXkodGhpcy5SRVBMQVlfQ09VTlQpLFxyXG4gICAgICAgICAgICByZXRyeSh0aGlzLlJFVFJZX0NPVU5UKSxcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKVxyXG4gICAgICAgICkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNTdXBwb3J0ZWRWaWV3T25saW5lKGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICAvLyBmaWxlIGtow7RuZyBjw7MgxJF14buVaSAtPiBsb+G6oWlcclxuICAgICAgICBpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZmlsZVR5cGUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpO1xyXG5cclxuICAgICAgICBpZiAoKC8oZ2lmfGpwZ3xqcGVnfHRpZmZ8cG5nKSQvaSkudGVzdChmaWxlVHlwZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCgvKGRvY3xkb2NtfGRvY3h8ZG90fGRvdG18ZG90eHxlcHVifGZvZHR8aHRtfGh0bWx8bWh0fG9kdHxvdHR8cGRmfHJ0Znx0eHR8ZGp2dXx4cHMpJC9pKS50ZXN0KGZpbGVUeXBlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoKC8oY3N2fGZvZHN8b2RzfG90c3x4bHN8eGxzbXx4bHN4fHhsdHx4bHRtfHhsdHgpJC9pKS50ZXN0KGZpbGVUeXBlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoKC8oZm9kcHxvZHB8b3RwfHBvdHxwb3RtfHBvdHh8cHBzfHBwc218cHBzeHxwcHR8cHB0bXxwcHR4KSQvaSkudGVzdChmaWxlVHlwZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCgvKG1wNHxtb3Z8YXZpfHdtdnx2b2J8cm18YXNmfDNncCkkL2kpLnRlc3QoZmlsZVR5cGUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICgoLyhtcDN8d21hfHdhdnx3bXZ8b2dnKSQvaSkudGVzdChmaWxlVHlwZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsZVR5cGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFyciA9IGZpbGVOYW1lLnNwbGl0KCcuJyk7XHJcbiAgICAgICAgcmV0dXJuIGFyclthcnIubGVuZ3RoIC0gMV07XHJcbiAgICB9XHJcblxyXG4gICAgY29udmVydFRvUGRmKGZpbGVOYW1lOiBzdHJpbmcsIGZpbGVJZDogc3RyaW5nLCBpc0ZpbGVWZXJzaW9uOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gYCR7dGhpcy5fZG9jdW1lbnRTZXJ2ZXJVcmx9L0NvbnZlcnRTZXJ2aWNlLmFzaHhgO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUxpbmtEb3dubG9hZCg8R2VuZXJhdGVMaW5rRG93bmxvYWREVE8+e1xyXG4gICAgICAgICAgICAgICAgZmlsZUlkOiBmaWxlSWQsXHJcbiAgICAgICAgICAgICAgICBpc0ZpbGVWZXJzaW9uOiBpc0ZpbGVWZXJzaW9uXHJcbiAgICAgICAgICAgIH0pLnRoZW4ocnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZG93bmxvYWRVcmwgPSB0aGlzLmdldEFub255bW91c0Rvd25sb2FkVXJsKHJzLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2FzeW5jJzogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2ZpbGV0eXBlJzogdGhpcy5nZXRGaWxlVHlwZShmaWxlTmFtZSksXHJcbiAgICAgICAgICAgICAgICAgICAgJ2tleSc6IHRoaXMuX2NvbW1vblNlcml2Y2UucmFuZG9tU3RyaW5nV2l0aE5vdERlbGltaXRlcigpLFxyXG4gICAgICAgICAgICAgICAgICAgICdvdXRwdXR0eXBlJzogJ3BkZicsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3RpdGxlJzogZmlsZU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3VybCc6IGRvd25sb2FkVXJsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2h0dHAucG9zdChzZXJ2aWNlLCBpbnB1dCkudG9Qcm9taXNlKCkudGhlbigocnNDb252ZXJ0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJzQ29udmVydC5maWxlVXJsKTtcclxuICAgICAgICAgICAgICAgIH0sIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0sIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaW50KGZpbGVVcmw6IHN0cmluZykge1xyXG4gICAgICAgIHByaW50SlMoZGVjb2RlVVJJKGZpbGVVcmwpKTtcclxuICAgIH1cclxuXHJcbiAgICBkb3dubG9hZEJ5SWZyYW1lKF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLCBmaWxlSWQpIHtcclxuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmdldEZpbGVEb3dubG9hZFVybChmaWxlSWQpO1xyXG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IGA8aWZyYW1lIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHdpZHRoPVwiMFwiIGhlaWdodD1cIjBcIiBzcmM9XCIke3VybH1cIj48L2lmcmFtZT5gO1xyXG4gICAgICAgIF9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBpZnJhbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUVycm9yKGVycm9yOiBhbnkpIHtcclxuICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDEpIHtcclxuICAgICAgICAgICAgdGhpcy5fYXV0aGVuU2VydmljZS50cnlMb2dpbkFuZExvZ291dElmRmFsc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICBzdXBwb3J0RGlnaXRhbFNpZ25hdHVyZShmaWxlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT09IC0xKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgZmlsZUV4dEFyciA9IGZpbGVOYW1lLnNwbGl0KCcuJyk7XHJcbiAgICAgICAgcmV0dXJuIGZpbGVFeHRBcnJbZmlsZUV4dEFyci5sZW5ndGggLSAxXS50b0xvd2VyQ2FzZSgpID09PSAncGRmJztcclxuICAgIH1cclxuXHJcbiAgICBzYXZlU2lnbmVkRmlsZShkYXRhOiBhbnkpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAucG9zdDxSZXNwb25zZVJlc3VsdD4oYCR7dGhpcy5fc2VydmljZVVyaX0vU2lnbmF0dXJlL1NhdmVTaWduZWRGaWxlYCwgZGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2lnbmF0dXJlSW5mb0J5RmlsZUlkKGZpbGVJZDogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oYCR7dGhpcy5fc2VydmljZVVyaX0vU2lnbmF0dXJlL0dldExpc3RTaWduYXR1cmVCeUZpbGVJZD9maWxlSWQ9JHtmaWxlSWR9YCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2lnbmF0dXJlSW5mb0J5RmlsZVZlcnNpb25JZChmaWxlVmVyc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0PihgJHt0aGlzLl9zZXJ2aWNlVXJpfS9TaWduYXR1cmUvR2V0TGlzdFNpZ25hdHVyZUJ5RmlsZVZlcnNpb25JZD9maWxlVmVyc2lvbklkPSR7ZmlsZVZlcnNpb25JZH1gKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJbWFnZUZpbGVCYXNlNjQoZmlsZUlkOiBzdHJpbmcsIGV4dGVuc2lvbiA9ICdqcGcnLCB3aWR0aCA9IDAsIGhlaWdodCA9IDApOiBQcm9taXNlPGFueT4geyAvLyByZXR1cm4gYmFzZSA2NFxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuX3NlcnZpY2VVcml9L0ZpbGUvZ2V0SW1hZ2VGaWxlQmFzZTY0P2ZpbGVJZD0ke2ZpbGVJZH0mZXh0ZW5zaW9uPSR7ZXh0ZW5zaW9ufSZ3aWR0aD0ke3dpZHRofSZoZWlnaHQ9JHtoZWlnaHR9YDtcclxuICAgICAgICAgICAgdGhpcy5faHR0cC5nZXQ8YW55Pih1cmwsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgYXMgJ2pzb24nIH0pXHJcbiAgICAgICAgICAgICAgICAudG9Qcm9taXNlKCkudGhlbihycyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZWFkZXIucmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICB9LCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKHJzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChudWxsKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFNlcnZpY2VGaWxlRXhwbG9yZXIobW9kZWw6IFNlcnZpY2VSZXF1ZXN0TW9kZWwpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9GaWxlL0dldFNlcnZpY2VGaWxlRXhwbG9yZXI/c2VydmljZT0ke21vZGVsLnNlcnZpY2V9JmVudGl0eT0ke21vZGVsLmVudGl0eX0mZW50aXR5SW5zdGFuY2VJZD0ke21vZGVsLmVudGl0eUluc3RhbmNlSWR9YDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHN2VXJsKVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpKVxyXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcbn1cclxuIl19
310
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1leHBsb3Jlci1uZXcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1leHBsb3Jlci9zZXJ2aWNlcy9maWxlLWV4cGxvcmVyLW5ldy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBYyxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxLQUFLLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFDckMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFLN0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7QUFNL0UscUJBQXFCO0FBQ3JCLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQztBQUt6QixNQUFNLE9BQU8sc0JBQXVCLFNBQVEsV0FBVztJQVNuRCxZQUNJLElBQWdCLEVBQ2hCLFFBQWtCLEVBQ1YsbUJBQXVDO1FBRS9DLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRmxCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUFYbkQsZ0JBQVcsR0FBRyxNQUFNLENBQUM7UUFDWixnQkFBVyxHQUFXLENBQUMsQ0FBQztRQUN4QixpQkFBWSxHQUFXLENBQUMsQ0FBQztRQVk5QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUVELFVBQVU7UUFDTixNQUFNLEtBQUssR0FBRyxHQUFHLElBQUksQ0FB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Q0FDdkUsQ0FBQztJQUNOLENBQUM7O21IQXhiUSxzQkFBc0I7dUhBQXRCLHNCQUFzQixjQUZuQixNQUFNOzJGQUVULHNCQUFzQjtrQkFIbEMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgRWxlbWVudFJlZiwgSW5qZWN0YWJsZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgcHJpbnRKU18gZnJvbSAncHJpbnQtanMnO1xyXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCByZXRyeSwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFJlc3BvbnNlUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3Jlc3BvbnNlLXJlc3VsdCc7XHJcbmltcG9ydCB7IEF1dGhlblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoZW4uc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYmFzZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NvbW1vbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW52aXJvbm1lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZW52aXJvbm1lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IENvcHlGaWxlRHRvIH0gZnJvbSAnLi4vbW9kZWxzL2NvcHktZmlsZS1kdG8nO1xyXG5pbXBvcnQgeyBGb2xkZXJDcmVhdGVBbmRTZXRQZXJtaXNzaW9uRFRPIH0gZnJvbSAnLi4vbW9kZWxzL2ZvbGRlci1jcmVhdGUtYW5kLXNldC1wZXJtaXNzaW9uLWR0byc7XHJcbmltcG9ydCB7IEdlbmVyYXRlTGlua0Rvd25sb2FkRFRPIH0gZnJvbSAnLi4vbW9kZWxzL2dlbmVyYXRlLWxpbmstZG93bmxvYWQtZHRvJztcclxuaW1wb3J0IHsgTW92ZUZpbGVEVE8gfSBmcm9tICcuLi9tb2RlbHMvbW92ZS1maWxlLWR0byc7XHJcbmltcG9ydCB7IFNlcnZpY2VSZXF1ZXN0TW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvc2VydmljZS1yZXF1ZXN0LW1vZGVsJztcclxuaW1wb3J0IHsgU2hhcmVGaWxlRFRPIH0gZnJvbSAnLi4vbW9kZWxzL3NoYXJlLWZpbGUtZHRvJztcclxuaW1wb3J0IHsgU2hhcmVGb2xkZXJEVE8gfSBmcm9tICcuLi9tb2RlbHMvc2hhcmUtZm9sZGVyLWR0byc7XHJcblxyXG4vLyBmaXggZm9yIGJ1aWxkIHByb2RcclxuY29uc3QgcHJpbnRKUyA9IHByaW50SlNfO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWxlRXhwbG9yZXJOZXdTZXJ2aWNlIGV4dGVuZHMgQmFzZVNlcnZpY2Uge1xyXG4gICAgc2VydmljZUNvZGUgPSAnZmlsZSc7XHJcbiAgICByZWFkb25seSBSRVRSWV9DT1VOVDogbnVtYmVyID0gMDtcclxuICAgIHJlYWRvbmx5IFJFUExBWV9DT1VOVDogbnVtYmVyID0gMTtcclxuICAgIF9kb2N1bWVudFNlcnZlclVybDogYW55O1xyXG4gICAgcmVhZG9ubHkgX3NlcnZpY2VVcmk7XHJcbiAgICBwcml2YXRlIF9hdXRoZW5TZXJ2aWNlOiBBdXRoZW5TZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSBfY29tbW9uU2VyaXZjZTogQ29tbW9uU2VydmljZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICBwcml2YXRlIF9lbnZpcm9ubWVudFNlcnZpY2U6IEVudmlyb25tZW50U2VydmljZVxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoaHR0cCwgaW5qZWN0b3IsICcnKTtcclxuICAgICAgICB0aGlzLnNlcnZpY2VVcmkgPSB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0SHR0cFNlcnZpY2VFbmRwb2ludE9sZCh0aGlzLnNlcnZpY2VDb2RlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNeUZpbGVzKCk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuX3NlcnZpY2VVcml9L0ZpbGUvR2V0TXlGaWxlc2A7XHJcblxyXG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KHRoaXMuUkVQTEFZX0NPVU5UKSxcclxuICAgICAgICAgICAgcmV0cnkodGhpcy5SRVRSWV9DT1VOVCksXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRCeUZvbGRlcklkKGZvbGRlcklkOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgaWYgKGZvbGRlcklkID09ICcwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh7IHN0YXR1czogNDAwIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9GaWxlP2ZvbGRlcklkPSR7Zm9sZGVySWR9YDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0PihzdlVybCkucGlwZShcclxuICAgICAgICAgICAgc2hhcmVSZXBsYXkodGhpcy5SRVBMQVlfQ09VTlQpLFxyXG4gICAgICAgICAgICByZXRyeSh0aGlzLlJFVFJZX0NPVU5UKSxcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKVxyXG4gICAgICAgICkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE15RHJpdmUoZm9sZGVySWQ6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBpZiAoZm9sZGVySWQgPT0gJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHsgc3RhdHVzOiA0MDAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuX3NlcnZpY2VVcml9L0ZpbGUvR2V0TXlEcml2ZT9mb2xkZXJJZD0ke2ZvbGRlcklkfWA7XHJcblxyXG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KHRoaXMuUkVQTEFZX0NPVU5UKSxcclxuICAgICAgICAgICAgcmV0cnkodGhpcy5SRVRSWV9DT1VOVCksXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNeVNoYXJlKHVzZXJJZDogbnVtYmVyKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGlmICh1c2VySWQgPCAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh7IHN0YXR1czogNDAwIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9Gb2xkZXIvR2V0TXlTaGFyZT91c2VySWQ9JHt1c2VySWR9YDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0PihzdlVybCkucGlwZShcclxuICAgICAgICAgICAgc2hhcmVSZXBsYXkodGhpcy5SRVBMQVlfQ09VTlQpLFxyXG4gICAgICAgICAgICByZXRyeSh0aGlzLlJFVFJZX0NPVU5UKSxcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKVxyXG4gICAgICAgICkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE15U2hhcmVUb090aGVyKG93bmVySWQ6IG51bWJlcik6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBpZiAob3duZXJJZCA8IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHsgc3RhdHVzOiA0MDAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuX3NlcnZpY2VVcml9L0ZvbGRlci9HZXRNeVNoYXJlVG9PdGhlcj9vd25lcklkPSR7b3duZXJJZH1gO1xyXG5cclxuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5faHR0cC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHN2VXJsKS5waXBlKFxyXG4gICAgICAgICAgICBzaGFyZVJlcGxheSh0aGlzLlJFUExBWV9DT1VOVCksXHJcbiAgICAgICAgICAgIHJldHJ5KHRoaXMuUkVUUllfQ09VTlQpLFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpXHJcbiAgICAgICAgKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Rm9sZGVyVHJlZShmb2xkZXJJZDogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGlmIChmb2xkZXJJZCA9PSAnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJykge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoeyBzdGF0dXM6IDQwMCB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFwaVVybCA9IGAke3RoaXMuX3NlcnZpY2VVcml9L0ZpbGUvR2V0VHJlZT9mb2xkZXJJZD0ke2ZvbGRlcklkfWA7XHJcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0PihhcGlVcmwpXHJcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSkpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBjb3B5RmlsZShjb3B5RmlsZUR0bzogQ29weUZpbGVEdG8pOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9GaWxlL0NvcHlGaWxlYDtcclxuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5faHR0cC5wb3N0PFJlc3BvbnNlUmVzdWx0PihzdlVybCwgY29weUZpbGVEdG8pLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApKTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVOZXdGb2xkZXIoZm9sZGVyOiBGb2xkZXJDcmVhdGVBbmRTZXRQZXJtaXNzaW9uRFRPKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5fc2VydmljZVVyaX0vRm9sZGVyYDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHAucG9zdDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwsIGZvbGRlcikucGlwZShcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKVxyXG4gICAgICAgICkpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZUZvbGRlcihmb2xkZXJJZDogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5fc2VydmljZVVyaX0vRm9sZGVyLyR7Zm9sZGVySWR9YDtcclxuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5faHR0cC5kZWxldGU8UmVzcG9uc2VSZXN1bHQ+KHN2VXJsKS5waXBlKFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpXHJcbiAgICAgICAgKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlTXVsdGlwbGVGb2xkZXIoZm9sZGVySWRzOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9Gb2xkZXIvZGVsZXRlTXVsdGlwbGVGb2xkZXIvJHtmb2xkZXJJZHN9YDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHAuZGVsZXRlPFJlc3BvbnNlUmVzdWx0PihzdlVybCkucGlwZShcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKVxyXG4gICAgICAgICkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmFtZUZvbGRlcihmb2xkZXJJZDogc3RyaW5nLCBuZXdGb2xkZXJOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9Gb2xkZXIvJHtmb2xkZXJJZH0vUmVuYW1lRm9sZGVyLyR7bmV3Rm9sZGVyTmFtZX1gO1xyXG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwLnBhdGNoPFJlc3BvbnNlUmVzdWx0PihzdlVybCwge30pLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApKTtcclxuICAgIH1cclxuXHJcbiAgICBzaGFyZUZvbGRlcihzaGFyZUZvbGRlcjogU2hhcmVGb2xkZXJEVE8pOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9Gb2xkZXIvU2hhcmVGb2xkZXJgO1xyXG5cclxuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5faHR0cC5wb3N0PFJlc3BvbnNlUmVzdWx0PihzdlVybCwgc2hhcmVGb2xkZXIpLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApKTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGVTaGFyZUZvbGRlcihmb2xkZXJJZDogc3RyaW5nLCBvYmplY3RJZDogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5fc2VydmljZVVyaX0vRm9sZGVyLyR7Zm9sZGVySWR9L0RlbGV0ZVNoYXJlRm9sZGVyLyR7b2JqZWN0SWR9YDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHAuZGVsZXRlPFJlc3BvbnNlUmVzdWx0PihzdlVybCkucGlwZShcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKVxyXG4gICAgICAgICkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVwbG9hZFVybCgpIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5fc2VydmljZVVyaX0vRmlsZWA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsZURvd25sb2FkVXJsKGZpbGVJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuX3NlcnZpY2VVcml9L0ZpbGUvJHtmaWxlSWR9L2Rvd25sb2FkYDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRCaW5hcnlGaWxlQnlGaWxlSWQoZmlsZUlkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHAuZ2V0KHRoaXMuZ2V0RmlsZURvd25sb2FkVXJsKGZpbGVJZCkpKS50aGVuKHJzID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJzKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4gcmVqZWN0KGVycikpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFNjYW5GaWxlVXBsb2FkRW5kcG9pbnQoY29ycmVsYXRpb25JZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuX3NlcnZpY2VVcml9L0ZpbGUvQ3JlYXRlU2Nhbm5lZEZpbGUvJHtjb3JyZWxhdGlvbklkfWA7XHJcbiAgICB9XHJcbiAgICBnZXRGaWxlKGZpbGVJZDogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5fc2VydmljZVVyaX0vRmlsZS8ke2ZpbGVJZH1gO1xyXG5cclxuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5faHR0cC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHN2VXJsKS5waXBlKFxyXG4gICAgICAgICAgICBzaGFyZVJlcGxheSh0aGlzLlJFUExBWV9DT1VOVCksXHJcbiAgICAgICAgICAgIHJldHJ5KHRoaXMuUkVUUllfQ09VTlQpLFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpXHJcbiAgICAgICAgKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsZVZlcnNpb25Eb3dubG9hZFVybChmaWxlVmVyc2lvbklkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5fc2VydmljZVVyaX0vRmlsZVZlcnNpb24vJHtmaWxlVmVyc2lvbklkfS9kb3dubG9hZGA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QW5vbnltb3VzRG93bmxvYWRVcmwoaGFzaDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuX3NlcnZpY2VVcml9L0Rvd25sb2FkLyR7aGFzaH1gO1xyXG4gICAgfVxyXG5cclxuICAgIGdlbmVyYXRlTGlua0Rvd25sb2FkKG1vZGVsOiBHZW5lcmF0ZUxpbmtEb3dubG9hZERUTyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuX3NlcnZpY2VVcml9L0Rvd25sb2FkL0dlbmVyYXRlRG93bmxvYWRMaW5rYDtcclxuXHJcbiAgICAgICAgaWYgKG1vZGVsLmlzRmlsZVZlcnNpb24gJiYgIW1vZGVsLmZpbGVWZXJzaW9uSWQpIHtcclxuICAgICAgICAgICAgbW9kZWwuZmlsZVZlcnNpb25JZCA9IG1vZGVsLmZpbGVJZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwLnBvc3Q8UmVzcG9uc2VSZXN1bHQ+KHN2VXJsLCBtb2RlbCkucGlwZShcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGRvd25sb2FkRmlsZShmaWxlSWQ6IHN0cmluZywgaXNGaWxlVmVyc2lvbjogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgbW9kZWwgPSBuZXcgR2VuZXJhdGVMaW5rRG93bmxvYWREVE8oKTtcclxuICAgICAgICBtb2RlbC5maWxlSWQgPSBmaWxlSWQ7XHJcbiAgICAgICAgbW9kZWwuaXNGaWxlVmVyc2lvbiA9IGlzRmlsZVZlcnNpb247XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUxpbmtEb3dubG9hZChtb2RlbCkudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvd25sb2FkVXJsID0gdGhpcy5nZXRBbm9ueW1vdXNEb3dubG9hZFVybChyZXNwb25zZS5kYXRhKTtcclxuICAgICAgICAgICAgd2luZG93Lm9wZW4oZG93bmxvYWRVcmwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdlbmVyYXRlTGlua0Rvd25sb2FkTXVsdGlwbGUobW9kZWw6IEdlbmVyYXRlTGlua0Rvd25sb2FkRFRPW10pOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9Eb3dubG9hZC9HZW5lcmF0ZURvd25sb2FkTXVsdGlwbGVMaW5rYDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHAucG9zdDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwsIG1vZGVsKS5waXBlKFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QmluYXJ5RmlsZShsaW5rRG93bmxvYWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwLmdldChsaW5rRG93bmxvYWQpKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRNb3ZlRmlsZUl0ZW0obW92ZUZpbGU6IE1vdmVGaWxlRFRPKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5fc2VydmljZVVyaX0vRmlsZS9Nb3ZlRmlsZWA7XHJcblxyXG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwLnBvc3Q8UmVzcG9uc2VSZXN1bHQ+KHN2VXJsLCBtb3ZlRmlsZSkucGlwZShcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKVxyXG4gICAgICAgICkpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZUZpbGUoZmlsZUlkOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9GaWxlLyR7ZmlsZUlkfWA7XHJcblxyXG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwLmRlbGV0ZTxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApKTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGVNdWx0aXBsZUZpbGUoZmlsZUlkczogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5fc2VydmljZVVyaX0vRmlsZS9kZWxldGVNdWx0aXBsZUZpbGUvJHtmaWxlSWRzfWA7XHJcblxyXG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwLmRlbGV0ZTxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApKTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGVGaWxlVmVyc2lvbihmaWxlVmVyc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9GaWxlVmVyc2lvbi8ke2ZpbGVWZXJzaW9uSWR9YDtcclxuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5faHR0cC5kZWxldGU8UmVzcG9uc2VSZXN1bHQ+KHN2VXJsKS5waXBlKFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpXHJcbiAgICAgICAgKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuYW1lRmlsZShmaWxlSWQ6IHN0cmluZywgbmV3RmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuX3NlcnZpY2VVcml9L0ZpbGUvJHtmaWxlSWR9L1JlbmFtZUZpbGUvJHtuZXdGaWxlTmFtZX1gO1xyXG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwLnBhdGNoPFJlc3BvbnNlUmVzdWx0PihzdlVybCwge30pLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApKTtcclxuICAgIH1cclxuXHJcbiAgICBzaGFyZUZpbGUoc2hhcmVGaWxlOiBTaGFyZUZpbGVEVE8pOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9GaWxlL1NoYXJlRmlsZWA7XHJcblxyXG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwLnBvc3Q8UmVzcG9uc2VSZXN1bHQ+KHN2VXJsLCBzaGFyZUZpbGUpLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcclxuICAgICAgICApKTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGVTaGFyZUZpbGUoZmlsZUlkOiBzdHJpbmcsIG9iamVjdElkOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3Qgc3ZVcmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9GaWxlLyR7ZmlsZUlkfS9EZWxldGVTaGFyZUZpbGUvJHtvYmplY3RJZH1gO1xyXG5cclxuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5faHR0cC5kZWxldGU8UmVzcG9uc2VSZXN1bHQ+KHN2VXJsKS5waXBlKFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpXHJcbiAgICAgICAgKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2hhcmVkRmlsZXMoZm9sZGVySWQ/OiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgbGV0IHN2VXJsID0gYCR7dGhpcy5fc2VydmljZVVyaX0vRmlsZS9HZXRNeVNoYXJlZEZpbGVzYDtcclxuICAgICAgICBpZiAoZm9sZGVySWQpIHtcclxuICAgICAgICAgICAgc3ZVcmwgPSBgJHtzdlVybH0/Zm9sZGVySWQ9JHtmb2xkZXJJZH1gO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0PihzdlVybCkucGlwZShcclxuICAgICAgICAgICAgc2hhcmVSZXBsYXkodGhpcy5SRVBMQVlfQ09VTlQpLFxyXG4gICAgICAgICAgICByZXRyeSh0aGlzLlJFVFJZX0NPVU5UKSxcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKVxyXG4gICAgICAgICkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVzZXJTaGFyaW5nQnlGaWxlKGZpbGVJZDogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGxldCBzdlVybCA9IGAke3RoaXMuX3NlcnZpY2VVcml9L0ZpbGUvR2V0VXNlclNoYXJpbmdCeUZpbGVgO1xyXG4gICAgICAgIGlmIChmaWxlSWQpIHtcclxuICAgICAgICAgICAgc3ZVcmwgPSBgJHtzdlVybH0/ZmlsZUlkPSR7ZmlsZUlkfWA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5faHR0cC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHN2VXJsKS5waXBlKFxyXG4gICAgICAgICAgICBzaGFyZVJlcGxheSh0aGlzLlJFUExBWV9DT1VOVCksXHJcbiAgICAgICAgICAgIHJldHJ5KHRoaXMuUkVUUllfQ09VTlQpLFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpXHJcbiAgICAgICAgKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Rm9sZGVySWQodXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgbGV0IHN2VXJsID0gYCR7dGhpcy5fc2VydmljZVVyaX0vRm9sZGVyL0dldEZvbGRlcklkYDtcclxuICAgICAgICBpZiAodXNlcklkKSB7XHJcbiAgICAgICAgICAgIHN2VXJsID0gYCR7c3ZVcmx9P3VzZXJJZD0ke3VzZXJJZH1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5faHR0cC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHN2VXJsKS5waXBlKFxyXG4gICAgICAgICAgICBzaGFyZVJlcGxheSh0aGlzLlJFUExBWV9DT1VOVCksXHJcbiAgICAgICAgICAgIHJldHJ5KHRoaXMuUkVUUllfQ09VTlQpLFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpXHJcbiAgICAgICAgKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNTdXBwb3J0ZWRWaWV3T25saW5lKGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICAvLyBmaWxlIGtow7RuZyBjw7MgxJF14buVaSAtPiBsb+G6oWlcclxuICAgICAgICBpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZmlsZVR5cGUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpO1xyXG5cclxuICAgICAgICBpZiAoKC8oZ2lmfGpwZ3xqcGVnfHRpZmZ8cG5nKSQvaSkudGVzdChmaWxlVHlwZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCgvKGRvY3xkb2NtfGRvY3h8ZG90fGRvdG18ZG90eHxlcHVifGZvZHR8aHRtfGh0bWx8bWh0fG9kdHxvdHR8cGRmfHJ0Znx0eHR8ZGp2dXx4cHMpJC9pKS50ZXN0KGZpbGVUeXBlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoKC8oY3N2fGZvZHN8b2RzfG90c3x4bHN8eGxzbXx4bHN4fHhsdHx4bHRtfHhsdHgpJC9pKS50ZXN0KGZpbGVUeXBlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoKC8oZm9kcHxvZHB8b3RwfHBvdHxwb3RtfHBvdHh8cHBzfHBwc218cHBzeHxwcHR8cHB0bXxwcHR4KSQvaSkudGVzdChmaWxlVHlwZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCgvKG1wNHxtb3Z8YXZpfHdtdnx2b2J8cm18YXNmfDNncCkkL2kpLnRlc3QoZmlsZVR5cGUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICgoLyhtcDN8d21hfHdhdnx3bXZ8b2dnKSQvaSkudGVzdChmaWxlVHlwZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsZVR5cGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFyciA9IGZpbGVOYW1lLnNwbGl0KCcuJyk7XHJcbiAgICAgICAgcmV0dXJuIGFyclthcnIubGVuZ3RoIC0gMV07XHJcbiAgICB9XHJcblxyXG4gICAgY29udmVydFRvUGRmKGZpbGVOYW1lOiBzdHJpbmcsIGZpbGVJZDogc3RyaW5nLCBpc0ZpbGVWZXJzaW9uOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gYCR7dGhpcy5fZG9jdW1lbnRTZXJ2ZXJVcmx9L0NvbnZlcnRTZXJ2aWNlLmFzaHhgO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUxpbmtEb3dubG9hZCg8R2VuZXJhdGVMaW5rRG93bmxvYWREVE8+e1xyXG4gICAgICAgICAgICAgICAgZmlsZUlkOiBmaWxlSWQsXHJcbiAgICAgICAgICAgICAgICBpc0ZpbGVWZXJzaW9uOiBpc0ZpbGVWZXJzaW9uXHJcbiAgICAgICAgICAgIH0pLnRoZW4ocnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZG93bmxvYWRVcmwgPSB0aGlzLmdldEFub255bW91c0Rvd25sb2FkVXJsKHJzLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2FzeW5jJzogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2ZpbGV0eXBlJzogdGhpcy5nZXRGaWxlVHlwZShmaWxlTmFtZSksXHJcbiAgICAgICAgICAgICAgICAgICAgJ2tleSc6IHRoaXMuX2NvbW1vblNlcml2Y2UucmFuZG9tU3RyaW5nV2l0aE5vdERlbGltaXRlcigpLFxyXG4gICAgICAgICAgICAgICAgICAgICdvdXRwdXR0eXBlJzogJ3BkZicsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3RpdGxlJzogZmlsZU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3VybCc6IGRvd25sb2FkVXJsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHAucG9zdChzZXJ2aWNlLCBpbnB1dCkpLnRoZW4oKHJzQ29udmVydDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyc0NvbnZlcnQuZmlsZVVybCk7XHJcbiAgICAgICAgICAgICAgICB9LCBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChudWxsKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LCBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcmludChmaWxlVXJsOiBzdHJpbmcpIHtcclxuICAgICAgICBwcmludEpTKGRlY29kZVVSSShmaWxlVXJsKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZG93bmxvYWRCeUlmcmFtZShfZWxlbWVudFJlZjogRWxlbWVudFJlZiwgZmlsZUlkKSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRGaWxlRG93bmxvYWRVcmwoZmlsZUlkKTtcclxuICAgICAgICBjb25zdCBpZnJhbWUgPSBgPGlmcmFtZSBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiB3aWR0aD1cIjBcIiBoZWlnaHQ9XCIwXCIgc3JjPVwiJHt1cmx9XCI+PC9pZnJhbWU+YDtcclxuICAgICAgICBfZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaWZyYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVFcnJvcihlcnJvcjogYW55KSB7XHJcbiAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2F1dGhlblNlcnZpY2UudHJ5TG9naW5BbmRMb2dvdXRJZkZhbHNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgc3VwcG9ydERpZ2l0YWxTaWduYXR1cmUoZmlsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpID09PSAtMSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGZpbGVFeHRBcnIgPSBmaWxlTmFtZS5zcGxpdCgnLicpO1xyXG4gICAgICAgIHJldHVybiBmaWxlRXh0QXJyW2ZpbGVFeHRBcnIubGVuZ3RoIC0gMV0udG9Mb3dlckNhc2UoKSA9PT0gJ3BkZic7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZVNpZ25lZEZpbGUoZGF0YTogYW55KTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwLnBvc3Q8UmVzcG9uc2VSZXN1bHQ+KGAke3RoaXMuX3NlcnZpY2VVcml9L1NpZ25hdHVyZS9TYXZlU2lnbmVkRmlsZWAsIGRhdGEpKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTaWduYXR1cmVJbmZvQnlGaWxlSWQoZmlsZUlkOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0PihgJHt0aGlzLl9zZXJ2aWNlVXJpfS9TaWduYXR1cmUvR2V0TGlzdFNpZ25hdHVyZUJ5RmlsZUlkP2ZpbGVJZD0ke2ZpbGVJZH1gKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2lnbmF0dXJlSW5mb0J5RmlsZVZlcnNpb25JZChmaWxlVmVyc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0PihgJHt0aGlzLl9zZXJ2aWNlVXJpfS9TaWduYXR1cmUvR2V0TGlzdFNpZ25hdHVyZUJ5RmlsZVZlcnNpb25JZD9maWxlVmVyc2lvbklkPSR7ZmlsZVZlcnNpb25JZH1gKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SW1hZ2VGaWxlQmFzZTY0KGZpbGVJZDogc3RyaW5nLCBleHRlbnNpb24gPSAnanBnJywgd2lkdGggPSAwLCBoZWlnaHQgPSAwKTogUHJvbWlzZTxhbnk+IHsgLy8gcmV0dXJuIGJhc2UgNjRcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLl9zZXJ2aWNlVXJpfS9GaWxlL2dldEltYWdlRmlsZUJhc2U2ND9maWxlSWQ9JHtmaWxlSWR9JmV4dGVuc2lvbj0ke2V4dGVuc2lvbn0md2lkdGg9JHt3aWR0aH0maGVpZ2h0PSR7aGVpZ2h0fWA7XHJcbiAgICAgICAgICAgIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHAuZ2V0PGFueT4odXJsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIGFzICdqc29uJyB9KSlcclxuICAgICAgICAgICAgICAgIC50aGVuKHJzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwocnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2VydmljZUZpbGVFeHBsb3Jlcihtb2RlbDogU2VydmljZVJlcXVlc3RNb2RlbCk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuX3NlcnZpY2VVcml9L0ZpbGUvR2V0U2VydmljZUZpbGVFeHBsb3Jlcj9zZXJ2aWNlPSR7bW9kZWwuc2VydmljZX0mZW50aXR5PSR7bW9kZWwuZW50aXR5fSZlbnRpdHlJbnN0YW5jZUlkPSR7bW9kZWwuZW50aXR5SW5zdGFuY2VJZH1gO1xyXG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpXHJcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSkpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG4iXX0=