@hmcts/ccd-case-ui-toolkit 7.0.37 → 7.0.38-client-context-2

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 (65) hide show
  1. package/esm2020/lib/shared/components/case-editor/case-edit/case-edit.component.mjs +11 -11
  2. package/esm2020/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.mjs +83 -38
  3. package/esm2020/lib/shared/components/case-editor/case-editor.module.mjs +6 -5
  4. package/esm2020/lib/shared/components/case-editor/case-event-completion/components/case-event-completion-task-reassigned/case-event-completion-task-reassigned.component.mjs +16 -14
  5. package/esm2020/lib/shared/components/case-editor/services/case-worker.service.mjs +3 -3
  6. package/esm2020/lib/shared/components/case-editor/services/cases.service.mjs +53 -27
  7. package/esm2020/lib/shared/components/case-editor/services/event-completion-state-machine.service.mjs +14 -6
  8. package/esm2020/lib/shared/components/event-start/event-guard/event-start.guard.mjs +13 -5
  9. package/esm2020/lib/shared/components/event-start/services/event-start-state-machine.service.mjs +11 -3
  10. package/esm2020/lib/shared/components/palette/address/write-address-field.component.mjs +3 -5
  11. package/esm2020/lib/shared/components/palette/base-field/abstract-form-field.component.mjs +1 -1
  12. package/esm2020/lib/shared/components/palette/case-flag/write-case-flag-field.component.mjs +1 -1
  13. package/esm2020/lib/shared/components/palette/collection/write-collection-field.component.mjs +2 -4
  14. package/esm2020/lib/shared/components/palette/complex/write-complex-field.component.mjs +2 -4
  15. package/esm2020/lib/shared/components/palette/document/write-document-field.component.mjs +2 -2
  16. package/esm2020/lib/shared/components/palette/dynamic-multi-select-list/write-dynamic-multi-select-list-field.component.mjs +5 -5
  17. package/esm2020/lib/shared/components/palette/markdown/markdown.component.mjs +43 -3
  18. package/esm2020/lib/shared/components/palette/query-management/components/query-list/query-list.component.mjs +2 -2
  19. package/esm2020/lib/shared/components/palette/text/write-text-field.component.mjs +1 -1
  20. package/esm2020/lib/shared/components/palette/utils/first-error.pipe.mjs +4 -1
  21. package/esm2020/lib/shared/components/search-result/search-result.component.mjs +2 -2
  22. package/esm2020/lib/shared/domain/definition/case-field.model.mjs +4 -2
  23. package/esm2020/lib/shared/domain/work-allocation/Task.mjs +1 -1
  24. package/esm2020/lib/shared/services/fields/fields.utils.mjs +8 -1
  25. package/esm2020/lib/shared/services/form/field-type-sanitiser.mjs +13 -2
  26. package/esm2020/lib/shared/services/form/form-validators.service.mjs +28 -2
  27. package/esm2020/lib/shared/services/profile/profile.service.mjs +2 -1
  28. package/fesm2015/hmcts-ccd-case-ui-toolkit.mjs +366 -169
  29. package/fesm2015/hmcts-ccd-case-ui-toolkit.mjs.map +1 -1
  30. package/fesm2020/hmcts-ccd-case-ui-toolkit.mjs +351 -169
  31. package/fesm2020/hmcts-ccd-case-ui-toolkit.mjs.map +1 -1
  32. package/lib/shared/components/case-editor/case-edit/case-edit.component.d.ts.map +1 -1
  33. package/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.d.ts +8 -3
  34. package/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.d.ts.map +1 -1
  35. package/lib/shared/components/case-editor/case-event-completion/components/case-event-completion-task-reassigned/case-event-completion-task-reassigned.component.d.ts +1 -2
  36. package/lib/shared/components/case-editor/case-event-completion/components/case-event-completion-task-reassigned/case-event-completion-task-reassigned.component.d.ts.map +1 -1
  37. package/lib/shared/components/case-editor/services/cases.service.d.ts +2 -1
  38. package/lib/shared/components/case-editor/services/cases.service.d.ts.map +1 -1
  39. package/lib/shared/components/case-editor/services/event-completion-state-machine.service.d.ts +1 -0
  40. package/lib/shared/components/case-editor/services/event-completion-state-machine.service.d.ts.map +1 -1
  41. package/lib/shared/components/event-start/event-guard/event-start.guard.d.ts +1 -1
  42. package/lib/shared/components/event-start/event-guard/event-start.guard.d.ts.map +1 -1
  43. package/lib/shared/components/event-start/services/event-start-state-machine.service.d.ts.map +1 -1
  44. package/lib/shared/components/palette/address/write-address-field.component.d.ts +1 -2
  45. package/lib/shared/components/palette/address/write-address-field.component.d.ts.map +1 -1
  46. package/lib/shared/components/palette/base-field/abstract-form-field.component.d.ts.map +1 -1
  47. package/lib/shared/components/palette/case-flag/write-case-flag-field.component.d.ts +0 -1
  48. package/lib/shared/components/palette/case-flag/write-case-flag-field.component.d.ts.map +1 -1
  49. package/lib/shared/components/palette/collection/write-collection-field.component.d.ts +1 -2
  50. package/lib/shared/components/palette/collection/write-collection-field.component.d.ts.map +1 -1
  51. package/lib/shared/components/palette/complex/write-complex-field.component.d.ts +1 -2
  52. package/lib/shared/components/palette/complex/write-complex-field.component.d.ts.map +1 -1
  53. package/lib/shared/components/palette/markdown/markdown.component.d.ts +6 -1
  54. package/lib/shared/components/palette/markdown/markdown.component.d.ts.map +1 -1
  55. package/lib/shared/components/palette/utils/first-error.pipe.d.ts.map +1 -1
  56. package/lib/shared/domain/definition/case-field.model.d.ts.map +1 -1
  57. package/lib/shared/domain/work-allocation/Task.d.ts +4 -0
  58. package/lib/shared/domain/work-allocation/Task.d.ts.map +1 -1
  59. package/lib/shared/services/fields/fields.utils.d.ts +2 -0
  60. package/lib/shared/services/fields/fields.utils.d.ts.map +1 -1
  61. package/lib/shared/services/form/field-type-sanitiser.d.ts +1 -0
  62. package/lib/shared/services/form/field-type-sanitiser.d.ts.map +1 -1
  63. package/lib/shared/services/form/form-validators.service.d.ts +4 -0
  64. package/lib/shared/services/form/form-validators.service.d.ts.map +1 -1
  65. package/package.json +1 -1
@@ -153,11 +153,9 @@ export class CaseEditComponent {
153
153
  this.isSubmitting = true;
154
154
  // We have to run the event completion checks if task in session storage
155
155
  // and if the task is in session storage, then is it associated to the case
156
- let taskInSessionStorage;
157
- const taskStr = this.sessionStorageService.getItem('taskToComplete');
158
- if (taskStr) {
159
- taskInSessionStorage = JSON.parse(taskStr);
160
- }
156
+ const clientContextStr = this.sessionStorageService.getItem('clientContext');
157
+ const userTask = FieldsUtils.getUserTaskFromClientContext(clientContextStr);
158
+ const taskInSessionStorage = userTask ? userTask.task_data : null;
161
159
  if (taskInSessionStorage && taskInSessionStorage.case_id === this.getCaseId(caseDetails)) {
162
160
  // Show event completion component to perform event completion checks
163
161
  this.eventCompletionParams = ({
@@ -356,14 +354,16 @@ export class CaseEditComponent {
356
354
  });
357
355
  }
358
356
  postCompleteTaskIfRequired() {
359
- const taskStr = this.sessionStorageService.getItem('taskToComplete');
357
+ const clientContextStr = this.sessionStorageService.getItem('clientContext');
358
+ const userTask = FieldsUtils.getUserTaskFromClientContext(clientContextStr);
359
+ const [task, taskToBeCompleted] = userTask ? [userTask.task_data, userTask.complete_task] : [null, false];
360
360
  const assignNeeded = this.sessionStorageService.getItem('assignNeeded') === 'true';
361
- if (taskStr && assignNeeded) {
362
- const task = JSON.parse(taskStr);
361
+ if (task && assignNeeded && taskToBeCompleted) {
362
+ // const task: Task = JSON.parse(taskStr);
363
363
  return this.workAllocationService.assignAndCompleteTask(task.id);
364
364
  }
365
- else if (taskStr) {
366
- const task = JSON.parse(taskStr);
365
+ else if (task && taskToBeCompleted) {
366
+ // const task: Task = JSON.parse(taskStr);
367
367
  return this.workAllocationService.completeTask(task.id);
368
368
  }
369
369
  return of(true);
@@ -429,4 +429,4 @@ CaseEditComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CaseEditC
429
429
  }], submitted: [{
430
430
  type: Output
431
431
  }] }); })();
432
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzZS1lZGl0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NjZC1jYXNlLXVpLXRvb2xraXQvc3JjL2xpYi9zaGFyZWQvY29tcG9uZW50cy9jYXNlLWVkaXRvci9jYXNlLWVkaXQvY2FzZS1lZGl0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NjZC1jYXNlLXVpLXRvb2xraXQvc3JjL2xpYi9zaGFyZWQvY29tcG9uZW50cy9jYXNlLWVkaXRvci9jYXNlLWVkaXQvY2FzZS1lZGl0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsY0FBYyxFQUFVLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBYyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLCtCQUErQixFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RGLE9BQU8sRUFJVSxnQkFBZ0IsRUFDL0IsUUFBUSxFQUNULE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUNMLFlBQVksRUFDWixZQUFZLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFDN0UscUJBQXFCLEVBQUUsYUFBYSxFQUNyQyxNQUFNLG1CQUFtQixDQUFDO0FBRTNCLE9BQU8sRUFBRSxZ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O1FBQy9CLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDNUgsQ0FBQztJQUVPLGlCQUFpQixDQUFDLFFBQWdCO1FBQ3hDLE9BQU8sUUFBUSxDQUFDLDBCQUEwQixDQUFDLEtBQUssb0JBQW9CLENBQUM7SUFDdkUsQ0FBQzs7QUFsZXNCLG9DQUFrQixHQUFHLFFBQVEsQ0FBQztBQUM5QiwrQkFBYSxHQUFHLG9GQUFvRixDQUFDO2tGQUZqSCxpQkFBaUI7b0VBQWpCLGlCQUFpQixzUUFGakIsQ0FBQyxjQUFjLENBQUM7UUM5QjdCLGdDQUErQjs7dUZEZ0NsQixpQkFBaUI7Y0FON0IsU0FBUzsyQkFDRSxlQUFlLGFBR2QsQ0FBQyxjQUFjLENBQUM7d2hCQU9wQixZQUFZO2tCQURsQixLQUFLO1lBSUMsTUFBTTtrQkFEWixLQUFLO1lBSUMsUUFBUTtrQkFEZCxLQUFLO1lBSUMsU0FBUztrQkFEZixLQUFLO1lBSUMsV0FBVztrQkFEakIsS0FBSztZQUlDLFNBQVM7a0JBRGYsTUFBTTtZQUlBLFNBQVM7a0JBRGYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbmFsaXplLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb25kaXRpb25hbFNob3dSZWdpc3RyYXJTZXJ2aWNlLCBHcmV5QmFyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZXMnO1xuaW1wb3J0IHtcbiAgQ2FzZUVkaXRDYXNlU3VibWl0LCBDYXNlRWRpdEdlbmVyYXRlQ2FzZUV2ZW50RGF0YSwgQ2FzZUVkaXRHZXROZXh0UGFnZSxcbiAgQ2FzZUVkaXRTdWJtaXRGb3JtLFxuICBDYXNlRWRpdG9uRXZlbnRDYW5CZUNvbXBsZXRlZCxcbiAgQ2FzZUV2ZW50RGF0YSwgQ2FzZUV2ZW50VHJpZ2dlciwgQ2FzZUZpZWxkLFxuICBDYXNlVmlldywgRHJhZnQsIEh0dHBFcnJvciwgUHJvZmlsZVxufSBmcm9tICcuLi8uLi8uLi9kb21haW4nO1xuaW1wb3J0IHsgVGFzayB9IGZyb20gJy4uLy4uLy4uL2RvbWFpbi93b3JrLWFsbG9jYXRpb24vVGFzayc7XG5pbXBvcnQge1xuICBBbGVydFNlcnZpY2UsXG4gIEZpZWxkc1B1cmdlciwgRmllbGRzVXRpbHMsIEZvcm1FcnJvclNlcnZpY2UsIEZvcm1WYWx1ZVNlcnZpY2UsIExvYWRpbmdTZXJ2aWNlLFxuICBTZXNzaW9uU3RvcmFnZVNlcnZpY2UsIFdpbmRvd1NlcnZpY2Vcbn0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgU2hvd0NvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZXMvY29uZGl0aW9uYWwtc2hvdy9kb21haW4vY29uZGl0aW9uYWwtc2hvdy5tb2RlbCc7XG5pbXBvcnQgeyBDb25maXJtYXRpb24sIFdpemFyZCwgV2l6YXJkUGFnZSB9IGZyb20gJy4uL2RvbWFpbic7XG5pbXBvcnQgeyBFdmVudENvbXBsZXRpb25QYXJhbXMgfSBmcm9tICcuLi9kb21haW4vZXZlbnQtY29tcGxldGlvbi1wYXJhbXMubW9kZWwnO1xuaW1wb3J0IHsgQ2FzZU5vdGlmaWVyLCBXaXphcmRGYWN0b3J5U2VydmljZSwgV29ya0FsbG9jYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgVmFsaWRQYWdlTGlzdENhc2VGaWVsZHNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdmFsaWQtcGFnZS1saXN0LWNhc2VGaWVsZHMuc2VydmljZSc7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi8uLi8uLi9jb21tb25zL2NvbnN0YW50cyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NjZC1jYXNlLWVkaXQnLFxuICB0ZW1wbGF0ZVVybDogJ2Nhc2UtZWRpdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuLi9jYXNlLWVkaXQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtHcmV5QmFyU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgQ2FzZUVkaXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgT1JJR0lOX1FVRVJZX1BBUkFNID0gJ29yaWdpbic7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQUxFUlRfTUVTU0FHRSA9ICdQYWdlIGlzIGJlaW5nIHJlZnJlc2hlZCBzbyB5b3Ugd2lsbCBiZSByZWRpcmVjdGVkIHRvIHRoZSBmaXJzdCBwYWdlIG9mIHRoaXMgZXZlbnQuJztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZXZlbnRUcmlnZ2VyOiBDYXNlRXZlbnRUcmlnZ2VyO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzdWJtaXQ6IChjYXNlRXZlbnREYXRhOiBDYXNlRXZlbnREYXRhLCBwcm9maWxlPzogUHJvZmlsZSkgPT4gT2JzZXJ2YWJsZTxvYmplY3Q+O1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB2YWxpZGF0ZTogKGNhc2VFdmVudERhdGE6IENhc2VFdmVudERhdGEsIHBhZ2VJZDogc3RyaW5nKSA9PiBPYnNlcnZhYmxlPG9iamVjdD47XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNhdmVEcmFmdDogKGNhc2VFdmVudERhdGE6IENhc2VFdmVudERhdGEpID0+IE9ic2VydmFibGU8RHJhZnQ+O1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjYXNlRGV0YWlsczogQ2FzZVZpZXc7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBjYW5jZWxsZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgc3VibWl0dGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwdWJsaWMgd2l6YXJkOiBXaXphcmQ7XG5cbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcblxuICBwdWJsaWMgY29uZmlybWF0aW9uOiBDb25maXJtYXRpb247XG5cbiAgcHVibGljIG5hdmlnYXRpb25PcmlnaW46IGFueTtcblxuICBwdWJsaWMgaW5pdGlhbFVybDogc3RyaW5nO1xuXG4gIHB1YmxpYyBpc1BhZ2VSZWZyZXNoZWQ6IGJvb2xlYW47XG5cbiAgcHVibGljIGlzU3VibWl0dGluZzogYm9vbGVhbjtcblxuICBwdWJsaWMgZXZlbnRDb21wbGV0aW9uUGFyYW1zOiBFdmVudENvbXBsZXRpb25QYXJhbXM7XG5cbiAgcHVibGljIHN1Ym1pdFJlc3BvbnNlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gIHB1YmxpYyBpc0V2ZW50Q29tcGxldGlvbkNoZWNrc1JlcXVpcmVkID0gZmFsc2U7XG5cbiAgcHVibGljIGlzQ2FzZUZsYWdTdWJtaXNzaW9uID0gZmFsc2U7XG5cbiAgcHVibGljIGlnbm9yZVdhcm5pbmcgPSBmYWxzZTtcblxuICBwdWJsaWMgaXNMaW5rZWRDYXNlc1N1Ym1pc3Npb24gPSBmYWxzZTtcblxuICBwdWJsaWMgZXJyb3I6IEh0dHBFcnJvcjtcblxuICBwdWJsaWMgY2FsbGJhY2tFcnJvcnNTdWJqZWN0OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHB1YmxpYyB2YWxpZFBhZ2VMaXN0OiBXaXphcmRQYWdlW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhc2VOb3RpZmllcjogQ2FzZU5vdGlmaWVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWVsZHNVdGlsczogRmllbGRzVXRpbHMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWVsZHNQdXJnZXI6IEZpZWxkc1B1cmdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJhclNlcnZpY2U6IENvbmRpdGlvbmFsU2hvd1JlZ2lzdHJhclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB3aXphcmRGYWN0b3J5OiBXaXphcmRGYWN0b3J5U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25TdG9yYWdlU2VydmljZTogU2Vzc2lvblN0b3JhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd2luZG93c1NlcnZpY2U6IFdpbmRvd1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmb3JtVmFsdWVTZXJ2aWNlOiBGb3JtVmFsdWVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZm9ybUVycm9yU2VydmljZTogRm9ybUVycm9yU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvYWRpbmdTZXJ2aWNlOiBMb2FkaW5nU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkUGFnZUxpc3RDYXNlRmllbGRzU2VydmljZTogVmFsaWRQYWdlTGlzdENhc2VGaWVsZHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd29ya0FsbG9jYXRpb25TZXJ2aWNlOiBXb3JrQWxsb2NhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZVxuICApIHt9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMud2l6YXJkID0gdGhpcy53aXphcmRGYWN0b3J5LmNyZWF0ZSh0aGlzLmV2ZW50VHJpZ2dlcik7XG4gICAgdGhpcy5pbml0aWFsVXJsID0gdGhpcy5zZXNzaW9uU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbSgnZXZlbnRVcmwnKTtcbiAgICB0aGlzLmlzUGFnZVJlZnJlc2hlZCA9IEpTT04ucGFyc2UodGhpcy5zZXNzaW9uU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbSgnaXNQYWdlUmVmcmVzaGVkJykpO1xuXG4gICAgdGhpcy5jaGVja1BhZ2VSZWZyZXNoKCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5yb3V0ZXIudXJsICYmICF0aGlzLmlzUGFnZVJlZnJlc2hlZCkge1xuICAgICAgdGhpcy5zZXNzaW9uU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSgnZXZlbnRVcmwnLCB0aGlzLnJvdXRlci51cmwpO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZGF0YTogbmV3IEZvcm1Hcm91cCh7fSksXG4gICAgICBldmVudDogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIGlkOiBbdGhpcy5ldmVudFRyaWdnZXIuaWQsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBzdW1tYXJ5OiBbJyddLFxuICAgICAgICBkZXNjcmlwdGlvbjogWycnXVxuICAgICAgfSlcbiAgICB9KTtcblxuICAgIHRoaXMucm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChwYXJhbXM6IFBhcmFtcykgPT4ge1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uT3JpZ2luID0gcGFyYW1zW0Nhc2VFZGl0Q29tcG9uZW50Lk9SSUdJTl9RVUVSWV9QQVJBTV07XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5jYWxsYmFja0Vycm9yc1N1YmplY3QpIHtcbiAgICAgIHRoaXMuY2FsbGJhY2tFcnJvcnNTdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNoZWNrUGFnZVJlZnJlc2goKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNQYWdlUmVmcmVzaGVkICYmIHRoaXMuaW5pdGlhbFVybCkge1xuICAgICAgdGhpcy5zZXNzaW9uU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbSgnZXZlbnRVcmwnKTtcbiAgICAgIHRoaXMud2luZG93c1NlcnZpY2UuYWxlcnQoQ2FzZUVkaXRDb21wb25lbnQuQUxFUlRfTUVTU0FHRSk7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5pbml0aWFsVXJsXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYWdlKHBhZ2VJZDogc3RyaW5nKTogV2l6YXJkUGFnZSB7XG4gICAgcmV0dXJuIHRoaXMud2l6YXJkLmdldFBhZ2UocGFnZUlkLCB0aGlzLmZpZWxkc1V0aWxzLmJ1aWxkQ2FuU2hvd1ByZWRpY2F0ZSh0aGlzLmV2ZW50VHJpZ2dlciwgdGhpcy5mb3JtKSk7XG4gIH1cblxuICBwdWJsaWMgZmlyc3QoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZmlyc3RQYWdlID0gdGhpcy53aXphcmQuZmlyc3RQYWdlKHRoaXMuZmllbGRzVXRpbHMuYnVpbGRDYW5TaG93UHJlZGljYXRlKHRoaXMuZXZlbnRUcmlnZ2VyLCB0aGlzLmZvcm0pKTtcbiAgICByZXR1cm4gdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2ZpcnN0UGFnZSA/IGZpcnN0UGFnZS5pZCA6ICdzdWJtaXQnXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xuICB9XG5cbiAgcHVibGljIG5hdmlnYXRlVG9QYWdlKHBhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcGFnZSA9IHRoaXMuZ2V0UGFnZShwYWdlSWQpO1xuICAgIHJldHVybiB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbcGFnZSA/IHBhZ2UuaWQgOiAnc3VibWl0J10sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZXh0KGN1cnJlbnRQYWdlSWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuaW5pdGlhbFVybCA9IHRoaXMuc2Vzc2lvblN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oJ2V2ZW50VXJsJyk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5yb3V0ZXIudXJsICYmICF0aGlzLmluaXRpYWxVcmwpIHtcbiAgICAgIHRoaXMuc2Vzc2lvblN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oJ2V2ZW50VXJsJywgdGhpcy5yb3V0ZXIudXJsKTtcbiAgICB9XG4gICAgdGhpcy5maWVsZHNQdXJnZXIuY2xlYXJIaWRkZW5GaWVsZHModGhpcy5mb3JtLCB0aGlzLndpemFyZCwgdGhpcy5ldmVudFRyaWdnZXIsIGN1cnJlbnRQYWdlSWQpO1xuICAgIGNvbnN0IG5leHRQYWdlID0gdGhpcy5nZXROZXh0UGFnZSh7XG4gICAgICBjdXJyZW50UGFnZUlkLFxuICAgICAgd2l6YXJkOiB0aGlzLndpemFyZCxcbiAgICAgIGV2ZW50VHJpZ2dlcjogdGhpcy5ldmVudFRyaWdnZXIsXG4gICAgICBmb3JtOiB0aGlzLmZvcm0sXG4gICAgfSk7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICghbmV4dFBhZ2UgJiZcbiAgICAgICEodGhpcy5ldmVudFRyaWdnZXIuc2hvd19zdW1tYXJ5IHx8IHRoaXMuZXZlbnRUcmlnZ2VyLnNob3dfc3VtbWFyeSA9PT0gbnVsbCkgJiZcbiAgICAgICF0aGlzLmV2ZW50VHJpZ2dlci5zaG93X2V2ZW50X25vdGVzKSB7XG4gICAgICB0aGlzLnN1Ym1pdEZvcm0oe1xuICAgICAgICBldmVudFRyaWdnZXI6IHRoaXMuZXZlbnRUcmlnZ2VyLFxuICAgICAgICBmb3JtOiB0aGlzLmZvcm0sXG4gICAgICAgIHN1Ym1pdDogdGhpcy5zdWJtaXQsXG4gICAgICAgIGNhc2VEZXRhaWxzOiB0aGlzLmNhc2VEZXRhaWxzLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZWdpc3RyYXJTZXJ2aWNlLnJlc2V0KCk7XG5cbiAgICBjb25zdCB0aGVRdWVyeVBhcmFtczogUGFyYW1zID0ge307XG4gICAgdGhlUXVlcnlQYXJhbXNbQ2FzZUVkaXRDb21wb25lbnQuT1JJR0lOX1FVRVJZX1BBUkFNXSA9IHRoaXMubmF2aWdhdGlvbk9yaWdpbjtcbiAgICByZXR1cm4gdGhpcy5yb3V0ZXIubmF2aWdhdGUoW25leHRQYWdlID8gbmV4dFBhZ2UuaWQgOiAnc3VibWl0J10sIHsgcXVlcnlQYXJhbXM6IHRoZVF1ZXJ5UGFyYW1zLCByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xuICB9XG5cbiAgcHVibGljIHByZXZpb3VzKGN1cnJlbnRQYWdlSWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuZmllbGRzUHVyZ2VyLmNsZWFySGlkZGVuRmllbGRzKHRoaXMuZm9ybSwgdGhpcy53aXphcmQsIHRoaXMuZXZlbnRUcmlnZ2VyLCBjdXJyZW50UGFnZUlkKTtcbiAgICB0aGlzLnJlZ2lzdHJhclNlcnZpY2UucmVzZXQoKTtcblxuICAgIGNvbnN0IHByZXZpb3VzUGFnZSA9IHRoaXMud2l6YXJkLnByZXZpb3VzUGFnZShjdXJyZW50UGFnZUlkLCB0aGlzLmZpZWxkc1V0aWxzLmJ1aWxkQ2FuU2hvd1ByZWRpY2F0ZSh0aGlzLmV2ZW50VHJpZ2dlciwgdGhpcy5mb3JtKSk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoIXByZXZpb3VzUGFnZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGhlUXVlcnlQYXJhbXM6IFBhcmFtcyA9IHt9O1xuICAgIHRoZVF1ZXJ5UGFyYW1zW0Nhc2VFZGl0Q29tcG9uZW50Lk9SSUdJTl9RVUVSWV9QQVJBTV0gPSB0aGlzLm5hdmlnYXRpb25PcmlnaW47XG4gICAgcmV0dXJuIHRoaXMucm91dGVyLm5hdmlnYXRlKFtwcmV2aW91c1BhZ2UuaWRdLCB7IHF1ZXJ5UGFyYW1zOiB0aGVRdWVyeVBhcmFtcywgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNQcmV2aW91cyhjdXJyZW50UGFnZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy53aXphcmQuaGFzUHJldmlvdXNQYWdlKGN1cnJlbnRQYWdlSWQsIHRoaXMuZmllbGRzVXRpbHMuYnVpbGRDYW5TaG93UHJlZGljYXRlKHRoaXMuZXZlbnRUcmlnZ2VyLCB0aGlzLmZvcm0pKTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxsZWQuZW1pdCgpO1xuICB9XG5cbiAgcHVibGljIGVtaXRTdWJtaXR0ZWQocmVzcG9uc2U6IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLnN1Ym1pdHRlZC5lbWl0KHsgY2FzZUlkOiByZXNwb25zZVsnaWQnXSwgc3RhdHVzOiB0aGlzLmdldFN0YXR1cyhyZXNwb25zZSkgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TmV4dFBhZ2UoeyB3aXphcmQsIGN1cnJlbnRQYWdlSWQsIGV2ZW50VHJpZ2dlciwgZm9ybSB9OiBDYXNlRWRpdEdldE5leHRQYWdlKTogV2l6YXJkUGFnZSB7XG4gICAgcmV0dXJuIHdpemFyZC5uZXh0UGFnZShcbiAgICAgIGN1cnJlbnRQYWdlSWQsXG4gICAgICB0aGlzLmZpZWxkc1V0aWxzLmJ1aWxkQ2FuU2hvd1ByZWRpY2F0ZShldmVudFRyaWdnZXIsIGZvcm0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25maXJtKGNvbmZpcm1hdGlvbjogQ29uZmlybWF0aW9uKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5jb25maXJtYXRpb24gPSBjb25maXJtYXRpb247XG4gICAgcmV0dXJuIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnY29uZmlybSddLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gIH1cblxuICBwdWJsaWMgc3VibWl0Rm9ybSh7IGV2ZW50VHJpZ2dlciwgZm9ybSwgY2FzZURldGFpbHMsIHN1Ym1pdCB9OiBDYXNlRWRpdFN1Ym1pdEZvcm0pOiB2b2lkIHtcbiAgICB0aGlzLmlzU3VibWl0dGluZyA9IHRydWU7XG4gICAgLy8gV2UgaGF2ZSB0byBydW4gdGhlIGV2ZW50IGNvbXBsZXRpb24gY2hlY2tzIGlmIHRhc2sgaW4gc2Vzc2lvbiBzdG9yYWdlXG4gICAgLy8gYW5kIGlmIHRoZSB0YXNrIGlzIGluIHNlc3Npb24gc3RvcmFnZSwgdGhlbiBpcyBpdCBhc3NvY2lhdGVkIHRvIHRoZSBjYXNlXG4gICAgbGV0IHRhc2tJblNlc3Npb25TdG9yYWdlOiBUYXNrO1xuICAgIGNvbnN0IHRhc2tTdHIgPSB0aGlzLnNlc3Npb25TdG9yYWdlU2VydmljZS5nZXRJdGVtKCd0YXNrVG9Db21wbGV0ZScpO1xuICAgIGlmICh0YXNrU3RyKSB7XG4gICAgICB0YXNrSW5TZXNzaW9uU3RvcmFnZSA9IEpTT04ucGFyc2UodGFza1N0cik7XG4gICAgfVxuXG4gICAgaWYgKHRhc2tJblNlc3Npb25TdG9yYWdlICYmIHRhc2tJblNlc3Npb25TdG9yYWdlLmNhc2VfaWQgPT09IHRoaXMuZ2V0Q2FzZUlkKGNhc2VEZXRhaWxzKSkge1xuICAgICAgLy8gU2hvdyBldmVudCBjb21wbGV0aW9uIGNvbXBvbmVudCB0byBwZXJmb3JtIGV2ZW50IGNvbXBsZXRpb24gY2hlY2tzXG4gICAgICB0aGlzLmV2ZW50Q29tcGxldGlvblBhcmFtcyA9ICh7XG4gICAgICAgIGNhc2VJZDogdGhpcy5nZXRDYXNlSWQoY2FzZURldGFpbHMpLFxuICAgICAgICBldmVudElkOiB0aGlzLmdldEV2ZW50SWQoZm9ybSksXG4gICAgICAgIHRhc2s6IHRhc2tJblNlc3Npb25TdG9yYWdlXG4gICAgICB9KTtcbiAgICAgIHRoaXMuaXNFdmVudENvbXBsZXRpb25DaGVja3NSZXF1aXJlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRhc2sgbm90IGluIHNlc3Npb24gc3RvcmFnZSwgcHJvY2VlZCB0byBzdWJtaXRcbiAgICAgIGNvbnN0IGNhc2VFdmVudERhdGEgPSB0aGlzLmdlbmVyYXRlQ2FzZUV2ZW50RGF0YSh7XG4gICAgICAgIGV2ZW50VHJpZ2dlcixcbiAgICAgICAgZm9ybVxuICAgICAgfSk7XG4gICAgICB0aGlzLmNhc2VTdWJtaXQoe2Zvcm0sXG4gICAgICAgIGNhc2VFdmVudERhdGEsXG4gICAgICAgIHN1Ym1pdFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldENhc2VJZChjYXNlRGV0YWlsczogQ2FzZVZpZXcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoY2FzZURldGFpbHMgPyBjYXNlRGV0YWlscy5jYXNlX2lkIDogJycpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFdmVudElkKGZvcm06IEZvcm1Hcm91cCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZvcm0udmFsdWUuZXZlbnQuaWQ7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlQ2FzZUV2ZW50RGF0YSh7IGV2ZW50VHJpZ2dlciwgZm9ybSB9OiBDYXNlRWRpdEdlbmVyYXRlQ2FzZUV2ZW50RGF0YSApOiBDYXNlRXZlbnREYXRhIHtcbiAgICBjb25zdCBjYXNlRXZlbnREYXRhOiBDYXNlRXZlbnREYXRhID0ge1xuICAgICAgZGF0YTogdGhpcy5yZXBsYWNlRW1wdHlDb21wbGV4RmllbGRWYWx1ZXMoXG4gICAgICAgIHRoaXMuZm9ybVZhbHVlU2VydmljZS5zYW5pdGlzZShcbiAgICAgICAgICB0aGlzLnJlcGxhY2VIaWRkZW5Gb3JtVmFsdWVzV2l0aE9yaWdpbmFsQ2FzZURhdGEoXG4gICAgICAgICAgICBmb3JtLmdldCgnZGF0YScpIGFzIEZvcm1Hcm91cCwgZXZlbnRUcmlnZ2VyLmNhc2VfZmllbGRzKSkpLFxuICAgICAgZXZlbnQ6IGZvcm0udmFsdWUuZXZlbnRcbiAgICB9IGFzIENhc2VFdmVudERhdGE7XG4gICAgdGhpcy5mb3JtVmFsdWVTZXJ2aWNlLmNsZWFyTm9uQ2FzZUZpZWxkcyhjYXNlRXZlbnREYXRhLmRhdGEsIGV2ZW50VHJpZ2dlci5jYXNlX2ZpZWxkcyk7XG4gICAgdGhpcy5mb3JtVmFsdWVTZXJ2aWNlLnJlbW92ZU51bGxMYWJlbHMoY2FzZUV2ZW50RGF0YS5kYXRhLCBldmVudFRyaWdnZXIuY2FzZV9maWVsZHMpO1xuICAgIHRoaXMuZm9ybVZhbHVlU2VydmljZS5yZW1vdmVFbXB0eURvY3VtZW50cyhjYXNlRXZlbnREYXRhLmRhdGEsIGV2ZW50VHJpZ2dlci5jYXNlX2ZpZWxkcyk7XG4gICAgLy8gUmVtb3ZlIGNvbGxlY3Rpb24gZmllbGRzIHRoYXQgaGF2ZSBcIm1pblwiIHZhbGlkYXRpb24gb2YgZ3JlYXRlciB0aGFuIHplcm8gc2V0IG9uIHRoZSBGaWVsZFR5cGUgYnV0IGFyZSBlbXB0eTtcbiAgICAvLyB0aGVzZSB3aWxsIGZhaWwgdmFsaWRhdGlvblxuICAgIHRoaXMuZm9ybVZhbHVlU2VydmljZS5yZW1vdmVFbXB0eUNvbGxlY3Rpb25zV2l0aE1pblZhbGlkYXRpb24oY2FzZUV2ZW50RGF0YS5kYXRhLCBldmVudFRyaWdnZXIuY2FzZV9maWVsZHMpO1xuICAgIC8vIEZvciBDYXNlIEZsYWcgc3VibWlzc2lvbnMgKHdoZXJlIGEgRmxhZ0xhdW5jaGVyIGZpZWxkIGlzIHByZXNlbnQgaW4gdGhlIGV2ZW50IHRyaWdnZXIpLCB0aGUgZmxhZyBkZXRhaWxzIGRhdGFcbiAgICAvLyBuZWVkcyBwb3B1bGF0aW5nIGZvciBlYWNoIEZsYWdzIGZpZWxkLCB0aGVuIHRoZSBGbGFnTGF1bmNoZXIgZmllbGQgbmVlZHMgcmVtb3ZpbmdcbiAgICB0aGlzLmZvcm1WYWx1ZVNlcnZpY2UucmVwb3B1bGF0ZUZvcm1EYXRhRnJvbUNhc2VGaWVsZFZhbHVlcyhjYXNlRXZlbnREYXRhLmRhdGEsIGV2ZW50VHJpZ2dlci5jYXNlX2ZpZWxkcyk7XG4gICAgLy8gRGF0YSBwb3B1bGF0aW9uIHN0ZXAgcmVxdWlyZWQgZm9yIExpbmtlZCBDYXNlc1xuICAgIHRoaXMuZm9ybVZhbHVlU2VydmljZS5wb3B1bGF0ZUxpbmtlZENhc2VzRGV0YWlsc0Zyb21DYXNlRmllbGRzKGNhc2VFdmVudERhdGEuZGF0YSwgZXZlbnRUcmlnZ2VyLmNhc2VfZmllbGRzKTtcbiAgICAvLyBSZW1vdmUgXCJMYXVuY2hlclwiLXR5cGUgZmllbGRzICh0aGVzZSBoYXZlIG5vIHZhbHVlcyBhbmQgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBwZXJzaXN0ZWQpXG4gICAgdGhpcy5mb3JtVmFsdWVTZXJ2aWNlLnJlbW92ZUNhc2VGaWVsZHNPZlR5cGUoY2FzZUV2ZW50RGF0YS5kYXRhLCBldmVudFRyaWdnZXIuY2FzZV9maWVsZHMsIFsnRmxhZ0xhdW5jaGVyJywgJ0NvbXBvbmVudExhdW5jaGVyJ10pO1xuXG4gICAgLy8gZGVsZXRlIGZpZWxkcyB3aGljaCBhcmUgbm90IHBhcnQgb2YgdGhlIGNhc2UgZXZlbnQgam91cm5leSB3aXphcmQgcGFnZXMgY2FzZSBmaWVsZHNcbiAgICB0aGlzLnZhbGlkUGFnZUxpc3RDYXNlRmllbGRzU2VydmljZS5kZWxldGVOb25WYWxpZGF0ZWRGaWVsZHModGhpcy52YWxpZFBhZ2VMaXN0LCBjYXNlRXZlbnREYXRhLmRhdGEsIGV2ZW50VHJpZ2dlci5jYXNlX2ZpZWxkcywgZmFsc2UsIGZvcm0uY29udHJvbHNbJ2RhdGEnXS52YWx1ZSk7XG4gICAgY29uc3QgcGFnZUxpc3RDYXNlRmllbGRzID0gdGhpcy52YWxpZFBhZ2VMaXN0Q2FzZUZpZWxkc1NlcnZpY2UudmFsaWRQYWdlTGlzdENhc2VGaWVsZHModGhpcy52YWxpZFBhZ2VMaXN0LCBldmVudFRyaWdnZXIuY2FzZV9maWVsZHMsIGZvcm0uY29udHJvbHNbJ2RhdGEnXS52YWx1ZSk7XG4gICAgLy8gUmVtb3ZlIHVubmVjZXNzYXJ5IGNhc2UgZmllbGRzIHdoaWNoIGFyZSBoaWRkZW4sIG9ubHkgaWYgdGhlIHN1Ym1pc3Npb24gaXMgKm5vdCogZm9yIENhc2UgRmxhZ3NcbiAgICBpZiAoIXRoaXMuaXNDYXNlRmxhZ1N1Ym1pc3Npb24pIHtcbiAgICAgIHRoaXMuZm9ybVZhbHVlU2VydmljZS5yZW1vdmVVbm5lY2Vzc2FyeUZpZWxkcyhjYXNlRXZlbnREYXRhLmRhdGEsIHBhZ2VMaXN0Q2FzZUZpZWxkcywgdHJ1ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgY2FzZUV2ZW50RGF0YS5ldmVudF90b2tlbiA9IGV2ZW50VHJpZ2dlci5ldmVudF90b2tlbjtcbiAgICBjYXNlRXZlbnREYXRhLmlnbm9yZV93YXJuaW5nID0gdGhpcy5pZ25vcmVXYXJuaW5nO1xuICAgIGlmICh0aGlzLmNvbmZpcm1hdGlvbikge1xuICAgICAgY2FzZUV2ZW50RGF0YS5kYXRhID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhc2VFdmVudERhdGE7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgbm9uLWFycmF5IHZhbHVlIG9iamVjdHMgd2l0aCBgbnVsbGAgZm9yIGFueSBDb21wbGV4LXR5cGUgZmllbGRzIHdob3NlIHZhbHVlIGlzIGVmZmVjdGl2ZWx5IGVtcHR5LCBpLmUuXG4gICAqIGFsbCBpdHMgc3ViLWZpZWxkcyBhbmQgZGVzY2VuZGFudHMgYXJlIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgVGhlIG9iamVjdCB0cmVlIHJlcHJlc2VudGluZyBhbGwgdGhlIGZvcm0gZmllbGQgZGF0YVxuICAgKiBAcmV0dXJucyBUaGUgZm9ybSBmaWVsZCBkYXRhIG1vZGlmaWVkIGFjY29yZGluZ2x5XG4gICAqL1xuICBwcml2YXRlIHJlcGxhY2VFbXB0eUNvbXBsZXhGaWVsZFZhbHVlcyhkYXRhOiBvYmplY3QpOiBvYmplY3Qge1xuICAgIE9iamVjdC5rZXlzKGRhdGEpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGFba2V5XSkgJiYgdHlwZW9mIGRhdGFba2V5XSA9PT0gJ29iamVjdCcgJiYgIUZpZWxkc1V0aWxzLmNvbnRhaW5zTm9uRW1wdHlWYWx1ZXMoZGF0YVtrZXldKSkge1xuICAgICAgICBkYXRhW2tleV0gPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogVHJhdmVyc2UgKmFsbCogdmFsdWVzIG9mIGEge0BsaW5rIEZvcm1Hcm91cH0sIGluY2x1ZGluZyB0aG9zZSBmb3IgZGlzYWJsZWQgZmllbGRzIChpLmUuIGhpZGRlbiBvbmVzKSwgcmVwbGFjaW5nIHRoZVxuICAgKiB2YWx1ZSBvZiBhbnkgdGhhdCBhcmUgaGlkZGVuIEFORCBoYXZlIGByZXRhaW5faGlkZGVuX3ZhbHVlYCBzZXQgdG8gYHRydWVgIGluIHRoZSBjb3JyZXNwb25kaW5nIGBDYXNlRmllbGRgLCB3aXRoXG4gICAqIHRoZSAqb3JpZ2luYWwqIHZhbHVlIGhlbGQgaW4gdGhlIGBDYXNlRmllbGRgIG9iamVjdC5cbiAgICpcbiAgICogVGhpcyBpcyBhcyBwZXIgZGVzaWduIGluIEVVSS0zNjIyLCB3aGVyZSBhbnkgdXNlci1kcml2ZW4gdXBkYXRlcyB0byBoaWRkZW4gZmllbGRzIHdpdGggYHJldGFpbl9oaWRkZW5fdmFsdWVgID1cbiAgICogYHRydWVgIGFyZSBpZ25vcmVkICh0aHVzIHJldGFpbmluZyB0aGUgdmFsdWUgZGlzcGxheWVkIG9yaWdpbmFsbHkpLlxuICAgKlxuICAgKiAqIEZvciBDb21wbGV4IGZpZWxkIHR5cGVzLCB0aGUgcmVwbGFjZW1lbnQgYWJvdmUgaXMgcGVyZm9ybWVkIHJlY3Vyc2l2ZWx5IGZvciBhbGwgaGlkZGVuIHN1Yi1maWVsZHMgd2l0aFxuICAgKiBgcmV0YWluX2hpZGRlbl92YWx1ZWAgPSBgdHJ1ZWAuXG4gICAqXG4gICAqICogRm9yIENvbGxlY3Rpb24gZmllbGQgdHlwZXMsIGluY2x1ZGluZyBjb2xsZWN0aW9ucyBvZiBDb21wbGV4IGFuZCBEb2N1bWVudCBmaWVsZCB0eXBlcywgdGhlIHJlcGxhY2VtZW50IGlzXG4gICAqIHBlcmZvcm1lZCBmb3IgYWxsIGZpZWxkcyBpbiB0aGUgY29sbGVjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGZvcm1Hcm91cCBUaGUgYEZvcm1Hcm91cGAgaW5zdGFuY2Ugd2hvc2UgcmF3IHZhbHVlcyBhcmUgdG8gYmUgdHJhdmVyc2VkXG4gICAqIEBwYXJhbSBjYXNlRmllbGRzIFRoZSBhcnJheSBvZiB7QGxpbmsgQ2FzZUZpZWxkfSBkb21haW4gbW9kZWwgb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvIGZpZWxkcyBpbiBgZm9ybUdyb3VwYFxuICAgKiBAcGFyYW0gcGFyZW50RmllbGQgUmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgYENhc2VGaWVsZGAuIFVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHN1Yi1maWVsZCB2YWx1ZXMgb2YgYSBDb21wbGV4IGZpZWxkXG4gICAqIHRvIHBlcmZvcm0gcmVjdXJzaXZlIHJlcGxhY2VtZW50IC0gdGhlIHN1Yi1maWVsZCBgQ2FzZUZpZWxkYHMgdGhlbXNlbHZlcyBkbyAqbm90KiBjb250YWluIGFueSB2YWx1ZXNcbiAgICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdGhlICpyYXcqIGZvcm0gdmFsdWUgZGF0YSAoYXMga2V5LXZhbHVlIHBhaXJzKSwgd2l0aCBhbnkgdmFsdWUgcmVwbGFjZW1lbnRzIGFzIG5lY2Vzc2FyeVxuICAgKi9cbiAgcHJpdmF0ZSByZXBsYWNlSGlkZGVuRm9ybVZhbHVlc1dpdGhPcmlnaW5hbENhc2VEYXRhKGZvcm1Hcm91cDogRm9ybUdyb3VwLCBjYXNlRmllbGRzOiBDYXNlRmllbGRbXSwgcGFyZW50RmllbGQ/OiBDYXNlRmllbGQpOiBvYmplY3Qge1xuICAgIC8vIEdldCB0aGUgcmF3IGZvcm0gdmFsdWUgZGF0YSwgd2hpY2ggaW5jbHVkZXMgdGhlIHZhbHVlcyBvZiBhbnkgZGlzYWJsZWQgY29udHJvbHMsIGFzIGtleS12YWx1ZSBwYWlyc1xuICAgIGNvbnN0IHJhd0Zvcm1WYWx1ZURhdGEgPSBmb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKTtcblxuICAgIC8vIFBsYWNlIGFsbCBjYXNlIGZpZWxkcyBpbiBhIGxvb2t1cCBvYmplY3QsIHNvIHRoZXkgY2FuIGJlIHJldHJpZXZlZCBieSBpZFxuICAgIGNvbnN0IGNhc2VGaWVsZHNMb29rdXAgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY2FzZUZpZWxkcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY2FzZUZpZWxkc0xvb2t1cFtjYXNlRmllbGRzW2ldLmlkXSA9IGNhc2VGaWVsZHNbaV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZSBhbnkgZm9ybSB2YWx1ZSB3aXRoIHRoZSBvcmlnaW5hbCwgd2hlcmUgaXRzIENhc2VGaWVsZCBpcyBoaWRkZW4gQU5EIGhhcyB0aGUgcmV0YWluX2hpZGRlbl92YWx1ZSBmbGFnIHNldFxuICAgICAqIHRvIHRydWUuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgQ2FzZUZpZWxkJ3MgYGhpZGRlbmAgYXR0cmlidXRlIGlzIG51bGwgb3IgdW5kZWZpbmVkLCB0aGVuIGNoZWNrIHRoaXMgYXR0cmlidXRlIGluIHRoZSBwYXJlbnQgQ2FzZUZpZWxkIChpZlxuICAgICAqIG9uZSBleGlzdHMpLiBUaGlzIGlzIG9jY3VycmluZyAoYW5kIGlzIHBvc3NpYmx5IGEgYnVnKSB3aGVuIGEgQ2FzZUZpZWxkIGlzIGEgc3ViLWZpZWxkIG9mIGEgQ29tcGxleCB0eXBlLCBvciBhblxuICAgICAqIGl0ZW0gaW4gYSBDb2xsZWN0aW9uIHR5cGUuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgZmllbGQgaXMgYSBDb21wbGV4IHR5cGUgd2l0aCByZXRhaW5faGlkZGVuX3ZhbHVlID0gdHJ1ZSwgcGVyZm9ybSBhIHJlY3Vyc2l2ZSByZXBsYWNlbWVudCBmb3IgYWxsIChoaWRkZW4pXG4gICAgICogc3ViLWZpZWxkcyB3aXRoIHJldGFpbl9oaWRkZW5fdmFsdWUgPSB0cnVlLCB1c2luZyB0aGVpciBvcmlnaW5hbCBDYXNlRmllbGQgdmFsdWVzIChmcm9tIHRoZSBgZm9ybWF0dGVkX3ZhbHVlYFxuICAgICAqIGF0dHJpYnV0ZSkuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgZmllbGQgaXMgYSBDb2xsZWN0aW9uIHR5cGUgd2l0aCByZXRhaW5faGlkZGVuX3ZhbHVlID0gdHJ1ZSwgdGhlIGVudGlyZSBjb2xsZWN0aW9uIGlzIHJlcGxhY2VkIHdpdGggdGhlXG4gICAgICogb3JpZ2luYWwgZnJvbSBgZm9ybWF0dGVkX3ZhbHVlYC4gVGhpcyBhcHBsaWVzIHRvICphbGwqIHR5cGVzIG9mIENvbGxlY3Rpb25zLlxuICAgICAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgT2JqZWN0LmtleXMocmF3Rm9ybVZhbHVlRGF0YSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBjYXNlRmllbGQ6IENhc2VGaWVsZCA9IGNhc2VGaWVsZHNMb29rdXBba2V5XTtcbiAgICAgIC8vIElmIGNhc2VGaWVsZC5oaWRkZW4gaXMgTk9UIHRydXRoeSBhbmQgYWxzbyBOT1QgZXF1YWwgdG8gZmFsc2UsIHRoZW4gaXQgbXVzdCBiZSBudWxsL3VuZGVmaW5lZCAocmVtZW1iZXIgdGhhdFxuICAgICAgLy8gYm90aCBudWxsIGFuZCB1bmRlZmluZWQgYXJlIGVxdWFsIHRvICpuZWl0aGVyIGZhbHNlIG5vciB0cnVlKilcbiAgICAgIGlmIChjYXNlRmllbGQgJiYgY2FzZUZpZWxkLnJldGFpbl9oaWRkZW5fdmFsdWUgJiZcbiAgICAgICAgKGNhc2VGaWVsZC5oaWRkZW4gfHwgKGNhc2VGaWVsZC5oaWRkZW4gIT09IGZhbHNlICYmIHBhcmVudEZpZWxkICYmIHBhcmVudEZpZWxkLmhpZGRlbikpKSB7XG4gICAgICAgIGlmIChjYXNlRmllbGQuZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcpIHtcbiAgICAgICAgICAvLyBOb3RlOiBEZWxpYmVyYXRlIHVzZSBvZiBlcXVhbGl0eSAoPT0pIGFuZCBub24tZXF1YWxpdHkgKCE9KSBvcGVyYXRvcnMgZm9yIG51bGwgY2hlY2tzIHRocm91Z2hvdXQsIHRvXG4gICAgICAgICAgLy8gaGFuZGxlIGJvdGggbnVsbCBhbmQgdW5kZWZpbmVkIHZhbHVlc1xuICAgICAgICAgIGlmIChjYXNlRmllbGQudmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5IHRvIHJlcGxhY2UgdGhlIENvbXBsZXggZmllbGQncyBzdWItZmllbGRzIGFzIG5lY2Vzc2FyeSwgcGFzc2luZyB0aGVcbiAgICAgICAgICAgIC8vIENhc2VGaWVsZCBpdHNlbGYgKHRoZSBzdWItZmllbGRzIGRvIG5vdCBjb250YWluIGFueSB2YWx1ZXMsIHNvIHRoZXNlIG5lZWQgdG8gYmUgb2J0YWluZWQgZnJvbSB0aGVcbiAgICAgICAgICAgIC8vIHBhcmVudClcbiAgICAgICAgICAgIC8vIFVwZGF0ZSByYXdGb3JtVmFsdWVEYXRhIGZvciB0aGlzIGZpZWxkXG4gICAgICAgICAgICAvLyBjcmVhdGluZyBmb3JtIGdyb3VwIGFuZCBhZGRpbmcgY29udHJvbCBpbnRvIGl0IGluIGNhc2UgY2FzZUZpZWxkIGlzIG9mIGNvbXBsZXh0IHR5cGUgYW5kIGFuZCBwYXJ0IG9mIGZvcm1Hcm91cFxuICAgICAgICAgICAgY29uc3QgZm9ybTogRm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gICAgICAgICAgICBpZiAoZm9ybUdyb3VwLmNvbnRyb2xzW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZm9ybUdyb3VwLmNvbnRyb2xzW2tleV0udmFsdWUpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBmb3JtLmFkZENvbnRyb2woaXRlbSwgbmV3IEZvcm1Db250cm9sKGZvcm1Hcm91cC5jb250cm9sc1trZXldLnZhbHVlW2l0ZW1dKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmF3Rm9ybVZhbHVlRGF0YVtrZXldID0gdGhpcy5yZXBsYWNlSGlkZGVuRm9ybVZhbHVlc1dpdGhPcmlnaW5hbENhc2VEYXRhKFxuICAgICAgICAgICAgICBmb3JtLCBjYXNlRmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcywgY2FzZUZpZWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGVmYXVsdCBjYXNlIGFsc28gaGFuZGxlcyBjb2xsZWN0aW9ucyBvZiAqYWxsKiB0eXBlczsgdGhlIGVudGlyZSBjb2xsZWN0aW9uIGluIHJhd0Zvcm1WYWx1ZURhdGEgd2lsbCBiZVxuICAgICAgICAgIC8vIHJlcGxhY2VkIHdpdGggdGhlIG9yaWdpbmFsIGZyb20gZm9ybWF0dGVkX3ZhbHVlXG4gICAgICAgICAgLy8gVXNlIHRoZSBDYXNlRmllbGQncyBleGlzdGluZyAqZm9ybWF0dGVkX3ZhbHVlKiBmcm9tIHRoZSBwYXJlbnQsIGlmIGF2YWlsYWJsZS4gKFRoaXMgaXMgbmVjZXNzYXJ5IGZvclxuICAgICAgICAgIC8vIENvbXBsZXggZmllbGRzLCB3aG9zZSBzdWItZmllbGRzIGRvIG5vdCBob2xkIGFueSB2YWx1ZXMgaW4gdGhlIG1vZGVsLikgT3RoZXJ3aXNlLCB1c2UgZm9ybWF0dGVkX3ZhbHVlXG4gICAgICAgICAgLy8gZnJvbSB0aGUgQ2FzZUZpZWxkIGl0c2VsZi5cbiAgICAgICAgICBpZiAocGFyZW50RmllbGQgJiYgcGFyZW50RmllbGQuZm9ybWF0dGVkX3ZhbHVlKSB7XG4gICAgICAgICAgICByYXdGb3JtVmFsdWVEYXRhW2tleV0gPSBwYXJlbnRGaWVsZC5mb3JtYXR0ZWRfdmFsdWVbY2FzZUZpZWxkLmlkXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCEoY2FzZUZpZWxkLmhpZGRlbiAmJiBjYXNlRmllbGQucmV0YWluX2hpZGRlbl92YWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmF3Rm9ybVZhbHVlRGF0YVtrZXldID0gY2FzZUZpZWxkLmZvcm1hdHRlZF92YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByYXdGb3JtVmFsdWVEYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBjYXNlU3VibWl0KHsgZm9ybSwgY2FzZUV2ZW50RGF0YSwgc3VibWl0IH06IENhc2VFZGl0Q2FzZVN1Ym1pdCk6IHZvaWQge1xuICAgIGNvbnN0IGxvYWRpbmdTcGlubmVyVG9rZW4gPSB0aGlzLmxvYWRpbmdTZXJ2aWNlLnJlZ2lzdGVyKCk7XG4gICAgLy8ga2VlcCB0aGUgaW5pdGlhbCBldmVudCByZXNwb25zZSB0byBmaW5hbGlzZSBwcm9jZXNzIGFmdGVyIHRhc2sgY29tcGxldGlvblxuICAgIGxldCBldmVudFJlc3BvbnNlOiBvYmplY3Q7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSgndGFza0NvbXBsZXRpb25FcnJvcicsICdmYWxzZScpO1xuICAgIHN1Ym1pdChjYXNlRXZlbnREYXRhKS5waXBlKHN3aXRjaE1hcCgocmVzcG9uc2UpID0+IHtcbiAgICAgIGV2ZW50UmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgIHJldHVybiB0aGlzLnBvc3RDb21wbGV0ZVRhc2tJZlJlcXVpcmVkKCk7XG4gICAgfSksZmluYWxpemUoKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmdTZXJ2aWNlLnVucmVnaXN0ZXIobG9hZGluZ1NwaW5uZXJUb2tlbik7XG4gICAgICB9KSlcbiAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmZpbmlzaEV2ZW50Q29tcGxldGlvbkxvZ2ljKGV2ZW50UmVzcG9uc2UpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvciA9PiB7XG4gICAgICAgICAgaWYgKCFldmVudFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAvLyBldmVudCBzdWJtaXNzaW9uIGVycm9yXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrRXJyb3JzU3ViamVjdC5uZXh0KGVycm9yKTtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgICBpZiAodGhpcy5lcnJvci5kZXRhaWxzKSB7XG4gICAgICAgICAgICAgIHRoaXMuZm9ybUVycm9yU2VydmljZVxuICAgICAgICAgICAgICAgIC5tYXBGaWVsZEVycm9ycyh0aGlzLmVycm9yLmRldGFpbHMuZmllbGRfZXJyb3JzLCBmb3JtLmNvbnRyb2xzWydkYXRhJ10gYXMgRm9ybUdyb3VwLCAndmFsaWRhdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSgndGFza0NvbXBsZXRpb25FcnJvcicsICd0cnVlJyk7XG4gICAgICAgICAgICAvLyB0YXNrIGFzc2lnbm1lbnQvY29tcGxldGlvbiBlcnJvciAtIGhhbmRsZWQgd2l0aGluIHdvcmthbGxvY2F0aW9uIHNlcnZpY2VcbiAgICAgICAgICAgIC8vIGNvdWxkIHNldCB0YXNrIHRvIGJlIGRlbGV0ZWQgKG9yIGNvbXBsZXRlZCBsYXRlcik/XG4gICAgICAgICAgICB0aGlzLmZpbmlzaEV2ZW50Q29tcGxldGlvbkxvZ2ljKGV2ZW50UmVzcG9uc2UpO1xuICAgICAgICAgICAgLy8gYmVsb3cgYWxsb3dzIGVycm9yIHRvIGJlIHNob3duIG9uIG5hdmlnYXRpb24gdG8gY29uZmlybWF0aW9uIHBhZ2VcbiAgICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnNldFByZXNlcnZlQWxlcnRzKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3Ioe3BocmFzZTogQ29uc3RhbnRzLlRBU0tfQ09NUExFVElPTl9FUlJPUn0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcG9zdENvbXBsZXRlVGFza0lmUmVxdWlyZWQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCB0YXNrU3RyID0gdGhpcy5zZXNzaW9uU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbSgndGFza1RvQ29tcGxldGUnKTtcbiAgICBjb25zdCBhc3NpZ25OZWVkZWQgPSB0aGlzLnNlc3Npb25TdG9yYWdlU2VydmljZS5nZXRJdGVtKCdhc3NpZ25OZWVkZWQnKSA9PT0gJ3RydWUnO1xuICAgIGlmICh0YXNrU3RyICYmIGFzc2lnbk5lZWRlZCkge1xuICAgICAgY29uc3QgdGFzazogVGFzayA9IEpTT04ucGFyc2UodGFza1N0cik7XG4gICAgICByZXR1cm4gdGhpcy53b3JrQWxsb2NhdGlvblNlcnZpY2UuYXNzaWduQW5kQ29tcGxldGVUYXNrKHRhc2suaWQpO1xuICAgIH0gZWxzZSBpZiAodGFza1N0cikge1xuICAgICAgY29uc3QgdGFzazogVGFzayA9IEpTT04ucGFyc2UodGFza1N0cik7XG4gICAgICByZXR1cm4gdGhpcy53b3JrQWxsb2NhdGlvblNlcnZpY2UuY29tcGxldGVUYXNrKHRhc2suaWQpO1xuICAgIH1cbiAgICByZXR1cm4gb2YodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmlzaEV2ZW50Q29tcGxldGlvbkxvZ2ljKGV2ZW50UmVzcG9uc2U6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY2FzZU5vdGlmaWVyLmNhY2hlZENhc2VWaWV3ID0gbnVsbDtcbiAgICB0aGlzLnNlc3Npb25TdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKCdldmVudFVybCcpO1xuICAgIGNvbnN0IGNvbmZpcm1hdGlvbjogQ29uZmlybWF0aW9uID0gdGhpcy5idWlsZENvbmZpcm1hdGlvbihldmVudFJlc3BvbnNlKTtcbiAgICBpZiAoY29uZmlybWF0aW9uICYmIChjb25maXJtYXRpb24uZ2V0SGVhZGVyKCkgfHwgY29uZmlybWF0aW9uLmdldEJvZHkoKSkpIHtcbiAgICAgIHRoaXMuY29uZmlybShjb25maXJtYXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXRTdWJtaXR0ZWQoZXZlbnRSZXNwb25zZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENvbmZpcm1hdGlvbihyZXNwb25zZTogb2JqZWN0KTogQ29uZmlybWF0aW9uIHtcbiAgICBpZiAocmVzcG9uc2VbJ2FmdGVyX3N1Ym1pdF9jYWxsYmFja19yZXNwb25zZSddKSB7XG4gICAgICByZXR1cm4gbmV3IENvbmZpcm1hdGlvbihcbiAgICAgICAgcmVzcG9uc2VbJ2lkJ10sXG4gICAgICAgIHJlc3BvbnNlWydjYWxsYmFja19yZXNwb25zZV9zdGF0dXMnXSxcbiAgICAgICAgcmVzcG9uc2VbJ2FmdGVyX3N1Ym1pdF9jYWxsYmFja19yZXNwb25zZSddWydjb25maXJtYXRpb25faGVhZGVyJ10sXG4gICAgICAgIHJlc3BvbnNlWydhZnRlcl9zdWJtaXRfY2FsbGJhY2tfcmVzcG9uc2UnXVsnY29uZmlybWF0aW9uX2JvZHknXVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uRXZlbnRDYW5CZUNvbXBsZXRlZCh7IGV2ZW50VHJpZ2dlciwgZXZlbnRDYW5CZUNvbXBsZXRlZCwgY2FzZURldGFpbHMsIGZvcm0sIHN1Ym1pdCB9OiBDYXNlRWRpdG9uRXZlbnRDYW5CZUNvbXBsZXRlZCk6IHZvaWQge1xuICAgIGlmIChldmVudENhbkJlQ29tcGxldGVkKSB7XG4gICAgICAvLyBTdWJtaXRcbiAgICAgIGNvbnN0IGNhc2VFdmVudERhdGEgPSB0aGlzLmdlbmVyYXRlQ2FzZUV2ZW50RGF0YSh7IGV2ZW50VHJpZ2dlciwgZm9ybSB9KTtcbiAgICAgIHRoaXMuY2FzZVN1Ym1pdCh7IGZvcm0sIGNhc2VFdmVudERhdGEsIHN1Ym1pdCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmF2aWdhdGUgdG8gdGFza3MgdGFiIG9uIGNhc2UgZGV0YWlscyBwYWdlXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYC9jYXNlcy9jYXNlLWRldGFpbHMvJHt0aGlzLmdldENhc2VJZChjYXNlRGV0YWlscyl9L3Rhc2tzYF0sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0U3RhdHVzKHJlc3BvbnNlOiBvYmplY3QpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmhhc0NhbGxiYWNrRmFpbGVkKHJlc3BvbnNlKSA/IHJlc3BvbnNlWydjYWxsYmFja19yZXNwb25zZV9zdGF0dXMnXSA6IHJlc3BvbnNlWydkZWxldGVfZHJhZnRfcmVzcG9uc2Vfc3RhdHVzJ107XG4gIH1cblxuICBwcml2YXRlIGhhc0NhbGxiYWNrRmFpbGVkKHJlc3BvbnNlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcmVzcG9uc2VbJ2NhbGxiYWNrX3Jlc3BvbnNlX3N0YXR1cyddICE9PSAnQ0FMTEJBQ0tfQ09NUExFVEVEJztcbiAgfVxufVxuIiwiPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxuIl19
432
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzZS1lZGl0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NjZC1jYXNlLXVpLXRvb2xraXQvc3JjL2xpYi9zaGFyZWQvY29tcG9uZW50cy9jYXNlLWVkaXRvci9jYXNlLWVkaXQvY2FzZS1lZGl0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NjZC1jYXNlLXVpLXRvb2xraXQvc3JjL2xpYi9zaGFyZWQvY29tcG9uZW50cy9jYXNlLWVkaXRvci9jYXNlLWVkaXQvY2FzZS1lZGl0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsY0FBYyxFQUFVLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBYyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLCtCQUErQixFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RGLE9BQU8sRUFJVSxnQkFBZ0IsRUFDL0IsUUFBUSxFQUNULE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUNMLFlBQVksRUFDWixZQUFZLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFDN0UscUJBQXFCLEVBQUUsYUFBYSxFQUNyQyxNQUFNLG1CQUFtQixDQUFDO0FBRTNCLE9BQU8sRUFBRSxZ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RDthQUFNO1lBQ0wsNkNBQTZDO1lBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsdUJBQXVCLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ2hIO0lBQ0gsQ0FBQztJQUVNLFNBQVMsQ0FBQyxRQUFnQjtRQUMvQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQzVILENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxRQUFnQjtRQUN4QyxPQUFPLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLG9CQUFvQixDQUFDO0lBQ3ZFLENBQUM7O0FBbGVzQixvQ0FBa0IsR0FBRyxRQUFRLENBQUM7QUFDOUIsK0JBQWEsR0FBRyxvRkFBb0YsQ0FBQztrRkFGakgsaUJBQWlCO29FQUFqQixpQkFBaUIsc1FBRmpCLENBQUMsY0FBYyxDQUFDO1FDN0I3QixnQ0FBK0I7O3VGRCtCbEIsaUJBQWlCO2NBTjdCLFNBQVM7MkJBQ0UsZUFBZSxhQUdkLENBQUMsY0FBYyxDQUFDO3doQkFPcEIsWUFBWTtrQkFEbEIsS0FBSztZQUlDLE1BQU07a0JBRFosS0FBSztZQUlDLFFBQVE7a0JBRGQsS0FBSztZQUlDLFNBQVM7a0JBRGYsS0FBSztZQUlDLFdBQVc7a0JBRGpCLEtBQUs7WUFJQyxTQUFTO2tCQURmLE1BQU07WUFJQSxTQUFTO2tCQURmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFBhcmFtcywgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ29uZGl0aW9uYWxTaG93UmVnaXN0cmFyU2VydmljZSwgR3JleUJhclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzJztcbmltcG9ydCB7XG4gIENhc2VFZGl0Q2FzZVN1Ym1pdCwgQ2FzZUVkaXRHZW5lcmF0ZUNhc2VFdmVudERhdGEsIENhc2VFZGl0R2V0TmV4dFBhZ2UsXG4gIENhc2VFZGl0U3VibWl0Rm9ybSxcbiAgQ2FzZUVkaXRvbkV2ZW50Q2FuQmVDb21wbGV0ZWQsXG4gIENhc2VFdmVudERhdGEsIENhc2VFdmVudFRyaWdnZXIsIENhc2VGaWVsZCxcbiAgQ2FzZVZpZXcsIERyYWZ0LCBIdHRwRXJyb3IsIFByb2ZpbGVcbn0gZnJvbSAnLi4vLi4vLi4vZG9tYWluJztcbmltcG9ydCB7XG4gIEFsZXJ0U2VydmljZSxcbiAgRmllbGRzUHVyZ2VyLCBGaWVsZHNVdGlscywgRm9ybUVycm9yU2VydmljZSwgRm9ybVZhbHVlU2VydmljZSwgTG9hZGluZ1NlcnZpY2UsXG4gIFNlc3Npb25TdG9yYWdlU2VydmljZSwgV2luZG93U2VydmljZVxufSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBTaG93Q29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcy9jb25kaXRpb25hbC1zaG93L2RvbWFpbi9jb25kaXRpb25hbC1zaG93Lm1vZGVsJztcbmltcG9ydCB7IENvbmZpcm1hdGlvbiwgV2l6YXJkLCBXaXphcmRQYWdlIH0gZnJvbSAnLi4vZG9tYWluJztcbmltcG9ydCB7IEV2ZW50Q29tcGxldGlvblBhcmFtcyB9IGZyb20gJy4uL2RvbWFpbi9ldmVudC1jb21wbGV0aW9uLXBhcmFtcy5tb2RlbCc7XG5pbXBvcnQgeyBDYXNlTm90aWZpZXIsIFdpemFyZEZhY3RvcnlTZXJ2aWNlLCBXb3JrQWxsb2NhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBWYWxpZFBhZ2VMaXN0Q2FzZUZpZWxkc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy92YWxpZC1wYWdlLWxpc3QtY2FzZUZpZWxkcy5zZXJ2aWNlJztcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbnMvY29uc3RhbnRzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2NkLWNhc2UtZWRpdCcsXG4gIHRlbXBsYXRlVXJsOiAnY2FzZS1lZGl0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4uL2Nhc2UtZWRpdC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW0dyZXlCYXJTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBDYXNlRWRpdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBPUklHSU5fUVVFUllfUEFSQU0gPSAnb3JpZ2luJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBBTEVSVF9NRVNTQUdFID0gJ1BhZ2UgaXMgYmVpbmcgcmVmcmVzaGVkIHNvIHlvdSB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhpcyBldmVudC4nO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBldmVudFRyaWdnZXI6IENhc2VFdmVudFRyaWdnZXI7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHN1Ym1pdDogKGNhc2VFdmVudERhdGE6IENhc2VFdmVudERhdGEsIHByb2ZpbGU/OiBQcm9maWxlKSA9PiBPYnNlcnZhYmxlPG9iamVjdD47XG5cbiAgQElucHV0KClcbiAgcHVibGljIHZhbGlkYXRlOiAoY2FzZUV2ZW50RGF0YTogQ2FzZUV2ZW50RGF0YSwgcGFnZUlkOiBzdHJpbmcpID0+IE9ic2VydmFibGU8b2JqZWN0PjtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2F2ZURyYWZ0OiAoY2FzZUV2ZW50RGF0YTogQ2FzZUV2ZW50RGF0YSkgPT4gT2JzZXJ2YWJsZTxEcmFmdD47XG5cbiAgQElucHV0KClcbiAgcHVibGljIGNhc2VEZXRhaWxzOiBDYXNlVmlldztcblxuICBAT3V0cHV0KClcbiAgcHVibGljIGNhbmNlbGxlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzdWJtaXR0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHB1YmxpYyB3aXphcmQ6IFdpemFyZDtcblxuICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwO1xuXG4gIHB1YmxpYyBjb25maXJtYXRpb246IENvbmZpcm1hdGlvbjtcblxuICBwdWJsaWMgbmF2aWdhdGlvbk9yaWdpbjogYW55O1xuXG4gIHB1YmxpYyBpbml0aWFsVXJsOiBzdHJpbmc7XG5cbiAgcHVibGljIGlzUGFnZVJlZnJlc2hlZDogYm9vbGVhbjtcblxuICBwdWJsaWMgaXNTdWJtaXR0aW5nOiBib29sZWFuO1xuXG4gIHB1YmxpYyBldmVudENvbXBsZXRpb25QYXJhbXM6IEV2ZW50Q29tcGxldGlvblBhcmFtcztcblxuICBwdWJsaWMgc3VibWl0UmVzcG9uc2U6IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgcHVibGljIGlzRXZlbnRDb21wbGV0aW9uQ2hlY2tzUmVxdWlyZWQgPSBmYWxzZTtcblxuICBwdWJsaWMgaXNDYXNlRmxhZ1N1Ym1pc3Npb24gPSBmYWxzZTtcblxuICBwdWJsaWMgaWdub3JlV2FybmluZyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBpc0xpbmtlZENhc2VzU3VibWlzc2lvbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBlcnJvcjogSHR0cEVycm9yO1xuXG4gIHB1YmxpYyBjYWxsYmFja0Vycm9yc1N1YmplY3Q6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHVibGljIHZhbGlkUGFnZUxpc3Q6IFdpemFyZFBhZ2VbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FzZU5vdGlmaWVyOiBDYXNlTm90aWZpZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZpZWxkc1V0aWxzOiBGaWVsZHNVdGlscyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZpZWxkc1B1cmdlcjogRmllbGRzUHVyZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cmFyU2VydmljZTogQ29uZGl0aW9uYWxTaG93UmVnaXN0cmFyU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdpemFyZEZhY3Rvcnk6IFdpemFyZEZhY3RvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvblN0b3JhZ2VTZXJ2aWNlOiBTZXNzaW9uU3RvcmFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB3aW5kb3dzU2VydmljZTogV2luZG93U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZvcm1WYWx1ZVNlcnZpY2U6IEZvcm1WYWx1ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmb3JtRXJyb3JTZXJ2aWNlOiBGb3JtRXJyb3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9hZGluZ1NlcnZpY2U6IExvYWRpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRQYWdlTGlzdENhc2VGaWVsZHNTZXJ2aWNlOiBWYWxpZFBhZ2VMaXN0Q2FzZUZpZWxkc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB3b3JrQWxsb2NhdGlvblNlcnZpY2U6IFdvcmtBbGxvY2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlXG4gICkge31cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy53aXphcmQgPSB0aGlzLndpemFyZEZhY3RvcnkuY3JlYXRlKHRoaXMuZXZlbnRUcmlnZ2VyKTtcbiAgICB0aGlzLmluaXRpYWxVcmwgPSB0aGlzLnNlc3Npb25TdG9yYWdlU2VydmljZS5nZXRJdGVtKCdldmVudFVybCcpO1xuICAgIHRoaXMuaXNQYWdlUmVmcmVzaGVkID0gSlNPTi5wYXJzZSh0aGlzLnNlc3Npb25TdG9yYWdlU2VydmljZS5nZXRJdGVtKCdpc1BhZ2VSZWZyZXNoZWQnKSk7XG5cbiAgICB0aGlzLmNoZWNrUGFnZVJlZnJlc2goKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLnJvdXRlci51cmwgJiYgIXRoaXMuaXNQYWdlUmVmcmVzaGVkKSB7XG4gICAgICB0aGlzLnNlc3Npb25TdG9yYWdlU2VydmljZS5zZXRJdGVtKCdldmVudFVybCcsIHRoaXMucm91dGVyLnVybCk7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBkYXRhOiBuZXcgRm9ybUdyb3VwKHt9KSxcbiAgICAgIGV2ZW50OiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgaWQ6IFt0aGlzLmV2ZW50VHJpZ2dlci5pZCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIHN1bW1hcnk6IFsnJ10sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBbJyddXG4gICAgICB9KVxuICAgIH0pO1xuXG4gICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5zdWJzY3JpYmUoKHBhcmFtczogUGFyYW1zKSA9PiB7XG4gICAgICB0aGlzLm5hdmlnYXRpb25PcmlnaW4gPSBwYXJhbXNbQ2FzZUVkaXRDb21wb25lbnQuT1JJR0lOX1FVRVJZX1BBUkFNXTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLmNhbGxiYWNrRXJyb3JzU3ViamVjdCkge1xuICAgICAgdGhpcy5jYWxsYmFja0Vycm9yc1N1YmplY3QudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2hlY2tQYWdlUmVmcmVzaCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1BhZ2VSZWZyZXNoZWQgJiYgdGhpcy5pbml0aWFsVXJsKSB7XG4gICAgICB0aGlzLnNlc3Npb25TdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKCdldmVudFVybCcpO1xuICAgICAgdGhpcy53aW5kb3dzU2VydmljZS5hbGVydChDYXNlRWRpdENvbXBvbmVudC5BTEVSVF9NRVNTQUdFKTtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmluaXRpYWxVcmxdLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldFBhZ2UocGFnZUlkOiBzdHJpbmcpOiBXaXphcmRQYWdlIHtcbiAgICByZXR1cm4gdGhpcy53aXphcmQuZ2V0UGFnZShwYWdlSWQsIHRoaXMuZmllbGRzVXRpbHMuYnVpbGRDYW5TaG93UHJlZGljYXRlKHRoaXMuZXZlbnRUcmlnZ2VyLCB0aGlzLmZvcm0pKTtcbiAgfVxuXG4gIHB1YmxpYyBmaXJzdCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBmaXJzdFBhZ2UgPSB0aGlzLndpemFyZC5maXJzdFBhZ2UodGhpcy5maWVsZHNVdGlscy5idWlsZENhblNob3dQcmVkaWNhdGUodGhpcy5ldmVudFRyaWdnZXIsIHRoaXMuZm9ybSkpO1xuICAgIHJldHVybiB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbZmlyc3RQYWdlID8gZmlyc3RQYWdlLmlkIDogJ3N1Ym1pdCddLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gIH1cblxuICBwdWJsaWMgbmF2aWdhdGVUb1BhZ2UocGFnZUlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBwYWdlID0gdGhpcy5nZXRQYWdlKHBhZ2VJZCk7XG4gICAgcmV0dXJuIHRoaXMucm91dGVyLm5hdmlnYXRlKFtwYWdlID8gcGFnZS5pZCA6ICdzdWJtaXQnXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xuICB9XG5cbiAgcHVibGljIG5leHQoY3VycmVudFBhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5pbml0aWFsVXJsID0gdGhpcy5zZXNzaW9uU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbSgnZXZlbnRVcmwnKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLnJvdXRlci51cmwgJiYgIXRoaXMuaW5pdGlhbFVybCkge1xuICAgICAgdGhpcy5zZXNzaW9uU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSgnZXZlbnRVcmwnLCB0aGlzLnJvdXRlci51cmwpO1xuICAgIH1cbiAgICB0aGlzLmZpZWxkc1B1cmdlci5jbGVhckhpZGRlbkZpZWxkcyh0aGlzLmZvcm0sIHRoaXMud2l6YXJkLCB0aGlzLmV2ZW50VHJpZ2dlciwgY3VycmVudFBhZ2VJZCk7XG4gICAgY29uc3QgbmV4dFBhZ2UgPSB0aGlzLmdldE5leHRQYWdlKHtcbiAgICAgIGN1cnJlbnRQYWdlSWQsXG4gICAgICB3aXphcmQ6IHRoaXMud2l6YXJkLFxuICAgICAgZXZlbnRUcmlnZ2VyOiB0aGlzLmV2ZW50VHJpZ2dlcixcbiAgICAgIGZvcm06IHRoaXMuZm9ybSxcbiAgICB9KTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKCFuZXh0UGFnZSAmJlxuICAgICAgISh0aGlzLmV2ZW50VHJpZ2dlci5zaG93X3N1bW1hcnkgfHwgdGhpcy5ldmVudFRyaWdnZXIuc2hvd19zdW1tYXJ5ID09PSBudWxsKSAmJlxuICAgICAgIXRoaXMuZXZlbnRUcmlnZ2VyLnNob3dfZXZlbnRfbm90ZXMpIHtcbiAgICAgIHRoaXMuc3VibWl0Rm9ybSh7XG4gICAgICAgIGV2ZW50VHJpZ2dlcjogdGhpcy5ldmVudFRyaWdnZXIsXG4gICAgICAgIGZvcm06IHRoaXMuZm9ybSxcbiAgICAgICAgc3VibWl0OiB0aGlzLnN1Ym1pdCxcbiAgICAgICAgY2FzZURldGFpbHM6IHRoaXMuY2FzZURldGFpbHMsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlZ2lzdHJhclNlcnZpY2UucmVzZXQoKTtcblxuICAgIGNvbnN0IHRoZVF1ZXJ5UGFyYW1zOiBQYXJhbXMgPSB7fTtcbiAgICB0aGVRdWVyeVBhcmFtc1tDYXNlRWRpdENvbXBvbmVudC5PUklHSU5fUVVFUllfUEFSQU1dID0gdGhpcy5uYXZpZ2F0aW9uT3JpZ2luO1xuICAgIHJldHVybiB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbbmV4dFBhZ2UgPyBuZXh0UGFnZS5pZCA6ICdzdWJtaXQnXSwgeyBxdWVyeVBhcmFtczogdGhlUXVlcnlQYXJhbXMsIHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gIH1cblxuICBwdWJsaWMgcHJldmlvdXMoY3VycmVudFBhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5maWVsZHNQdXJnZXIuY2xlYXJIaWRkZW5GaWVsZHModGhpcy5mb3JtLCB0aGlzLndpemFyZCwgdGhpcy5ldmVudFRyaWdnZXIsIGN1cnJlbnRQYWdlSWQpO1xuICAgIHRoaXMucmVnaXN0cmFyU2VydmljZS5yZXNldCgpO1xuXG4gICAgY29uc3QgcHJldmlvdXNQYWdlID0gdGhpcy53aXphcmQucHJldmlvdXNQYWdlKGN1cnJlbnRQYWdlSWQsIHRoaXMuZmllbGRzVXRpbHMuYnVpbGRDYW5TaG93UHJlZGljYXRlKHRoaXMuZXZlbnRUcmlnZ2VyLCB0aGlzLmZvcm0pKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICghcHJldmlvdXNQYWdlKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aGVRdWVyeVBhcmFtczogUGFyYW1zID0ge307XG4gICAgdGhlUXVlcnlQYXJhbXNbQ2FzZUVkaXRDb21wb25lbnQuT1JJR0lOX1FVRVJZX1BBUkFNXSA9IHRoaXMubmF2aWdhdGlvbk9yaWdpbjtcbiAgICByZXR1cm4gdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3ByZXZpb3VzUGFnZS5pZF0sIHsgcXVlcnlQYXJhbXM6IHRoZVF1ZXJ5UGFyYW1zLCByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xuICB9XG5cbiAgcHVibGljIGhhc1ByZXZpb3VzKGN1cnJlbnRQYWdlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLndpemFyZC5oYXNQcmV2aW91c1BhZ2UoY3VycmVudFBhZ2VJZCwgdGhpcy5maWVsZHNVdGlscy5idWlsZENhblNob3dQcmVkaWNhdGUodGhpcy5ldmVudFRyaWdnZXIsIHRoaXMuZm9ybSkpO1xuICB9XG5cbiAgcHVibGljIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgZW1pdFN1Ym1pdHRlZChyZXNwb25zZTogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIHRoaXMuc3VibWl0dGVkLmVtaXQoeyBjYXNlSWQ6IHJlc3BvbnNlWydpZCddLCBzdGF0dXM6IHRoaXMuZ2V0U3RhdHVzKHJlc3BvbnNlKSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXROZXh0UGFnZSh7IHdpemFyZCwgY3VycmVudFBhZ2VJZCwgZXZlbnRUcmlnZ2VyLCBmb3JtIH06IENhc2VFZGl0R2V0TmV4dFBhZ2UpOiBXaXphcmRQYWdlIHtcbiAgICByZXR1cm4gd2l6YXJkLm5leHRQYWdlKFxuICAgICAgY3VycmVudFBhZ2VJZCxcbiAgICAgIHRoaXMuZmllbGRzVXRpbHMuYnVpbGRDYW5TaG93UHJlZGljYXRlKGV2ZW50VHJpZ2dlciwgZm9ybSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNvbmZpcm0oY29uZmlybWF0aW9uOiBDb25maXJtYXRpb24pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmNvbmZpcm1hdGlvbiA9IGNvbmZpcm1hdGlvbjtcbiAgICByZXR1cm4gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydjb25maXJtJ10sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdWJtaXRGb3JtKHsgZXZlbnRUcmlnZ2VyLCBmb3JtLCBjYXNlRGV0YWlscywgc3VibWl0IH06IENhc2VFZGl0U3VibWl0Rm9ybSk6IHZvaWQge1xuICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gdHJ1ZTtcbiAgICAvLyBXZSBoYXZlIHRvIHJ1biB0aGUgZXZlbnQgY29tcGxldGlvbiBjaGVja3MgaWYgdGFzayBpbiBzZXNzaW9uIHN0b3JhZ2VcbiAgICAvLyBhbmQgaWYgdGhlIHRhc2sgaXMgaW4gc2Vzc2lvbiBzdG9yYWdlLCB0aGVuIGlzIGl0IGFzc29jaWF0ZWQgdG8gdGhlIGNhc2VcbiAgICBjb25zdCBjbGllbnRDb250ZXh0U3RyID0gdGhpcy5zZXNzaW9uU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbSgnY2xpZW50Q29udGV4dCcpO1xuICAgIGNvbnN0IHVzZXJUYXNrID0gRmllbGRzVXRpbHMuZ2V0VXNlclRhc2tGcm9tQ2xpZW50Q29udGV4dChjbGllbnRDb250ZXh0U3RyKTtcbiAgICBjb25zdCB0YXNrSW5TZXNzaW9uU3RvcmFnZSA9IHVzZXJUYXNrID8gdXNlclRhc2sudGFza19kYXRhIDogbnVsbDtcblxuICAgIGlmICh0YXNrSW5TZXNzaW9uU3RvcmFnZSAmJiB0YXNrSW5TZXNzaW9uU3RvcmFnZS5jYXNlX2lkID09PSB0aGlzLmdldENhc2VJZChjYXNlRGV0YWlscykpIHtcbiAgICAgIC8vIFNob3cgZXZlbnQgY29tcGxldGlvbiBjb21wb25lbnQgdG8gcGVyZm9ybSBldmVudCBjb21wbGV0aW9uIGNoZWNrc1xuICAgICAgdGhpcy5ldmVudENvbXBsZXRpb25QYXJhbXMgPSAoe1xuICAgICAgICBjYXNlSWQ6IHRoaXMuZ2V0Q2FzZUlkKGNhc2VEZXRhaWxzKSxcbiAgICAgICAgZXZlbnRJZDogdGhpcy5nZXRFdmVudElkKGZvcm0pLFxuICAgICAgICB0YXNrOiB0YXNrSW5TZXNzaW9uU3RvcmFnZVxuICAgICAgfSk7XG4gICAgICB0aGlzLmlzRXZlbnRDb21wbGV0aW9uQ2hlY2tzUmVxdWlyZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUYXNrIG5vdCBpbiBzZXNzaW9uIHN0b3JhZ2UsIHByb2NlZWQgdG8gc3VibWl0XG4gICAgICBjb25zdCBjYXNlRXZlbnREYXRhID0gdGhpcy5nZW5lcmF0ZUNhc2VFdmVudERhdGEoe1xuICAgICAgICBldmVudFRyaWdnZXIsXG4gICAgICAgIGZvcm1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5jYXNlU3VibWl0KHtmb3JtLFxuICAgICAgICBjYXNlRXZlbnREYXRhLFxuICAgICAgICBzdWJtaXRcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRDYXNlSWQoY2FzZURldGFpbHM6IENhc2VWaWV3KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKGNhc2VEZXRhaWxzID8gY2FzZURldGFpbHMuY2FzZV9pZCA6ICcnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXZlbnRJZChmb3JtOiBGb3JtR3JvdXApOiBzdHJpbmcge1xuICAgIHJldHVybiBmb3JtLnZhbHVlLmV2ZW50LmlkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZUNhc2VFdmVudERhdGEoeyBldmVudFRyaWdnZXIsIGZvcm0gfTogQ2FzZUVkaXRHZW5lcmF0ZUNhc2VFdmVudERhdGEgKTogQ2FzZUV2ZW50RGF0YSB7XG4gICAgY29uc3QgY2FzZUV2ZW50RGF0YTogQ2FzZUV2ZW50RGF0YSA9IHtcbiAgICAgIGRhdGE6IHRoaXMucmVwbGFjZUVtcHR5Q29tcGxleEZpZWxkVmFsdWVzKFxuICAgICAgICB0aGlzLmZvcm1WYWx1ZVNlcnZpY2Uuc2FuaXRpc2UoXG4gICAgICAgICAgdGhpcy5yZXBsYWNlSGlkZGVuRm9ybVZhbHVlc1dpdGhPcmlnaW5hbENhc2VEYXRhKFxuICAgICAgICAgICAgZm9ybS5nZXQoJ2RhdGEnKSBhcyBGb3JtR3JvdXAsIGV2ZW50VHJpZ2dlci5jYXNlX2ZpZWxkcykpKSxcbiAgICAgIGV2ZW50OiBmb3JtLnZhbHVlLmV2ZW50XG4gICAgfSBhcyBDYXNlRXZlbnREYXRhO1xuICAgIHRoaXMuZm9ybVZhbHVlU2VydmljZS5jbGVhck5vbkNhc2VGaWVsZHMoY2FzZUV2ZW50RGF0YS5kYXRhLCBldmVudFRyaWdnZXIuY2FzZV9maWVsZHMpO1xuICAgIHRoaXMuZm9ybVZhbHVlU2VydmljZS5yZW1vdmVOdWxsTGFiZWxzKGNhc2VFdmVudERhdGEuZGF0YSwgZXZlbnRUcmlnZ2VyLmNhc2VfZmllbGRzKTtcbiAgICB0aGlzLmZvcm1WYWx1ZVNlcnZpY2UucmVtb3ZlRW1wdHlEb2N1bWVudHMoY2FzZUV2ZW50RGF0YS5kYXRhLCBldmVudFRyaWdnZXIuY2FzZV9maWVsZHMpO1xuICAgIC8vIFJlbW92ZSBjb2xsZWN0aW9uIGZpZWxkcyB0aGF0IGhhdmUgXCJtaW5cIiB2YWxpZGF0aW9uIG9mIGdyZWF0ZXIgdGhhbiB6ZXJvIHNldCBvbiB0aGUgRmllbGRUeXBlIGJ1dCBhcmUgZW1wdHk7XG4gICAgLy8gdGhlc2Ugd2lsbCBmYWlsIHZhbGlkYXRpb25cbiAgICB0aGlzLmZvcm1WYWx1ZVNlcnZpY2UucmVtb3ZlRW1wdHlDb2xsZWN0aW9uc1dpdGhNaW5WYWxpZGF0aW9uKGNhc2VFdmVudERhdGEuZGF0YSwgZXZlbnRUcmlnZ2VyLmNhc2VfZmllbGRzKTtcbiAgICAvLyBGb3IgQ2FzZSBGbGFnIHN1Ym1pc3Npb25zICh3aGVyZSBhIEZsYWdMYXVuY2hlciBmaWVsZCBpcyBwcmVzZW50IGluIHRoZSBldmVudCB0cmlnZ2VyKSwgdGhlIGZsYWcgZGV0YWlscyBkYXRhXG4gICAgLy8gbmVlZHMgcG9wdWxhdGluZyBmb3IgZWFjaCBGbGFncyBmaWVsZCwgdGhlbiB0aGUgRmxhZ0xhdW5jaGVyIGZpZWxkIG5lZWRzIHJlbW92aW5nXG4gICAgdGhpcy5mb3JtVmFsdWVTZXJ2aWNlLnJlcG9wdWxhdGVGb3JtRGF0YUZyb21DYXNlRmllbGRWYWx1ZXMoY2FzZUV2ZW50RGF0YS5kYXRhLCBldmVudFRyaWdnZXIuY2FzZV9maWVsZHMpO1xuICAgIC8vIERhdGEgcG9wdWxhdGlvbiBzdGVwIHJlcXVpcmVkIGZvciBMaW5rZWQgQ2FzZXNcbiAgICB0aGlzLmZvcm1WYWx1ZVNlcnZpY2UucG9wdWxhdGVMaW5rZWRDYXNlc0RldGFpbHNGcm9tQ2FzZUZpZWxkcyhjYXNlRXZlbnREYXRhLmRhdGEsIGV2ZW50VHJpZ2dlci5jYXNlX2ZpZWxkcyk7XG4gICAgLy8gUmVtb3ZlIFwiTGF1bmNoZXJcIi10eXBlIGZpZWxkcyAodGhlc2UgaGF2ZSBubyB2YWx1ZXMgYW5kIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgcGVyc2lzdGVkKVxuICAgIHRoaXMuZm9ybVZhbHVlU2VydmljZS5yZW1vdmVDYXNlRmllbGRzT2ZUeXBlKGNhc2VFdmVudERhdGEuZGF0YSwgZXZlbnRUcmlnZ2VyLmNhc2VfZmllbGRzLCBbJ0ZsYWdMYXVuY2hlcicsICdDb21wb25lbnRMYXVuY2hlciddKTtcblxuICAgIC8vIGRlbGV0ZSBmaWVsZHMgd2hpY2ggYXJlIG5vdCBwYXJ0IG9mIHRoZSBjYXNlIGV2ZW50IGpvdXJuZXkgd2l6YXJkIHBhZ2VzIGNhc2UgZmllbGRzXG4gICAgdGhpcy52YWxpZFBhZ2VMaXN0Q2FzZUZpZWxkc1NlcnZpY2UuZGVsZXRlTm9uVmFsaWRhdGVkRmllbGRzKHRoaXMudmFsaWRQYWdlTGlzdCwgY2FzZUV2ZW50RGF0YS5kYXRhLCBldmVudFRyaWdnZXIuY2FzZV9maWVsZHMsIGZhbHNlLCBmb3JtLmNvbnRyb2xzWydkYXRhJ10udmFsdWUpO1xuICAgIGNvbnN0IHBhZ2VMaXN0Q2FzZUZpZWxkcyA9IHRoaXMudmFsaWRQYWdlTGlzdENhc2VGaWVsZHNTZXJ2aWNlLnZhbGlkUGFnZUxpc3RDYXNlRmllbGRzKHRoaXMudmFsaWRQYWdlTGlzdCwgZXZlbnRUcmlnZ2VyLmNhc2VfZmllbGRzLCBmb3JtLmNvbnRyb2xzWydkYXRhJ10udmFsdWUpO1xuICAgIC8vIFJlbW92ZSB1bm5lY2Vzc2FyeSBjYXNlIGZpZWxkcyB3aGljaCBhcmUgaGlkZGVuLCBvbmx5IGlmIHRoZSBzdWJtaXNzaW9uIGlzICpub3QqIGZvciBDYXNlIEZsYWdzXG4gICAgaWYgKCF0aGlzLmlzQ2FzZUZsYWdTdWJtaXNzaW9uKSB7XG4gICAgICB0aGlzLmZvcm1WYWx1ZVNlcnZpY2UucmVtb3ZlVW5uZWNlc3NhcnlGaWVsZHMoY2FzZUV2ZW50RGF0YS5kYXRhLCBwYWdlTGlzdENhc2VGaWVsZHMsIHRydWUsIHRydWUpO1xuICAgIH1cblxuICAgIGNhc2VFdmVudERhdGEuZXZlbnRfdG9rZW4gPSBldmVudFRyaWdnZXIuZXZlbnRfdG9rZW47XG4gICAgY2FzZUV2ZW50RGF0YS5pZ25vcmVfd2FybmluZyA9IHRoaXMuaWdub3JlV2FybmluZztcbiAgICBpZiAodGhpcy5jb25maXJtYXRpb24pIHtcbiAgICAgIGNhc2VFdmVudERhdGEuZGF0YSA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiBjYXNlRXZlbnREYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIG5vbi1hcnJheSB2YWx1ZSBvYmplY3RzIHdpdGggYG51bGxgIGZvciBhbnkgQ29tcGxleC10eXBlIGZpZWxkcyB3aG9zZSB2YWx1ZSBpcyBlZmZlY3RpdmVseSBlbXB0eSwgaS5lLlxuICAgKiBhbGwgaXRzIHN1Yi1maWVsZHMgYW5kIGRlc2NlbmRhbnRzIGFyZSBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBvYmplY3QgdHJlZSByZXByZXNlbnRpbmcgYWxsIHRoZSBmb3JtIGZpZWxkIGRhdGFcbiAgICogQHJldHVybnMgVGhlIGZvcm0gZmllbGQgZGF0YSBtb2RpZmllZCBhY2NvcmRpbmdseVxuICAgKi9cbiAgcHJpdmF0ZSByZXBsYWNlRW1wdHlDb21wbGV4RmllbGRWYWx1ZXMoZGF0YTogb2JqZWN0KTogb2JqZWN0IHtcbiAgICBPYmplY3Qua2V5cyhkYXRhKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhW2tleV0pICYmIHR5cGVvZiBkYXRhW2tleV0gPT09ICdvYmplY3QnICYmICFGaWVsZHNVdGlscy5jb250YWluc05vbkVtcHR5VmFsdWVzKGRhdGFba2V5XSkpIHtcbiAgICAgICAgZGF0YVtrZXldID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYXZlcnNlICphbGwqIHZhbHVlcyBvZiBhIHtAbGluayBGb3JtR3JvdXB9LCBpbmNsdWRpbmcgdGhvc2UgZm9yIGRpc2FibGVkIGZpZWxkcyAoaS5lLiBoaWRkZW4gb25lcyksIHJlcGxhY2luZyB0aGVcbiAgICogdmFsdWUgb2YgYW55IHRoYXQgYXJlIGhpZGRlbiBBTkQgaGF2ZSBgcmV0YWluX2hpZGRlbl92YWx1ZWAgc2V0IHRvIGB0cnVlYCBpbiB0aGUgY29ycmVzcG9uZGluZyBgQ2FzZUZpZWxkYCwgd2l0aFxuICAgKiB0aGUgKm9yaWdpbmFsKiB2YWx1ZSBoZWxkIGluIHRoZSBgQ2FzZUZpZWxkYCBvYmplY3QuXG4gICAqXG4gICAqIFRoaXMgaXMgYXMgcGVyIGRlc2lnbiBpbiBFVUktMzYyMiwgd2hlcmUgYW55IHVzZXItZHJpdmVuIHVwZGF0ZXMgdG8gaGlkZGVuIGZpZWxkcyB3aXRoIGByZXRhaW5faGlkZGVuX3ZhbHVlYCA9XG4gICAqIGB0cnVlYCBhcmUgaWdub3JlZCAodGh1cyByZXRhaW5pbmcgdGhlIHZhbHVlIGRpc3BsYXllZCBvcmlnaW5hbGx5KS5cbiAgICpcbiAgICogKiBGb3IgQ29tcGxleCBmaWVsZCB0eXBlcywgdGhlIHJlcGxhY2VtZW50IGFib3ZlIGlzIHBlcmZvcm1lZCByZWN1cnNpdmVseSBmb3IgYWxsIGhpZGRlbiBzdWItZmllbGRzIHdpdGhcbiAgICogYHJldGFpbl9oaWRkZW5fdmFsdWVgID0gYHRydWVgLlxuICAgKlxuICAgKiAqIEZvciBDb2xsZWN0aW9uIGZpZWxkIHR5cGVzLCBpbmNsdWRpbmcgY29sbGVjdGlvbnMgb2YgQ29tcGxleCBhbmQgRG9jdW1lbnQgZmllbGQgdHlwZXMsIHRoZSByZXBsYWNlbWVudCBpc1xuICAgKiBwZXJmb3JtZWQgZm9yIGFsbCBmaWVsZHMgaW4gdGhlIGNvbGxlY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBmb3JtR3JvdXAgVGhlIGBGb3JtR3JvdXBgIGluc3RhbmNlIHdob3NlIHJhdyB2YWx1ZXMgYXJlIHRvIGJlIHRyYXZlcnNlZFxuICAgKiBAcGFyYW0gY2FzZUZpZWxkcyBUaGUgYXJyYXkgb2Yge0BsaW5rIENhc2VGaWVsZH0gZG9tYWluIG1vZGVsIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byBmaWVsZHMgaW4gYGZvcm1Hcm91cGBcbiAgICogQHBhcmFtIHBhcmVudEZpZWxkIFJlZmVyZW5jZSB0byB0aGUgcGFyZW50IGBDYXNlRmllbGRgLiBVc2VkIGZvciByZXRyaWV2aW5nIHRoZSBzdWItZmllbGQgdmFsdWVzIG9mIGEgQ29tcGxleCBmaWVsZFxuICAgKiB0byBwZXJmb3JtIHJlY3Vyc2l2ZSByZXBsYWNlbWVudCAtIHRoZSBzdWItZmllbGQgYENhc2VGaWVsZGBzIHRoZW1zZWx2ZXMgZG8gKm5vdCogY29udGFpbiBhbnkgdmFsdWVzXG4gICAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSAqcmF3KiBmb3JtIHZhbHVlIGRhdGEgKGFzIGtleS12YWx1ZSBwYWlycyksIHdpdGggYW55IHZhbHVlIHJlcGxhY2VtZW50cyBhcyBuZWNlc3NhcnlcbiAgICovXG4gIHByaXZhdGUgcmVwbGFjZUhpZGRlbkZvcm1WYWx1ZXNXaXRoT3JpZ2luYWxDYXNlRGF0YShmb3JtR3JvdXA6IEZvcm1Hcm91cCwgY2FzZUZpZWxkczogQ2FzZUZpZWxkW10sIHBhcmVudEZpZWxkPzogQ2FzZUZpZWxkKTogb2JqZWN0IHtcbiAgICAvLyBHZXQgdGhlIHJhdyBmb3JtIHZhbHVlIGRhdGEsIHdoaWNoIGluY2x1ZGVzIHRoZSB2YWx1ZXMgb2YgYW55IGRpc2FibGVkIGNvbnRyb2xzLCBhcyBrZXktdmFsdWUgcGFpcnNcbiAgICBjb25zdCByYXdGb3JtVmFsdWVEYXRhID0gZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XG5cbiAgICAvLyBQbGFjZSBhbGwgY2FzZSBmaWVsZHMgaW4gYSBsb29rdXAgb2JqZWN0LCBzbyB0aGV5IGNhbiBiZSByZXRyaWV2ZWQgYnkgaWRcbiAgICBjb25zdCBjYXNlRmllbGRzTG9va3VwID0ge307XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhc2VGaWVsZHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNhc2VGaWVsZHNMb29rdXBbY2FzZUZpZWxkc1tpXS5pZF0gPSBjYXNlRmllbGRzW2ldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2UgYW55IGZvcm0gdmFsdWUgd2l0aCB0aGUgb3JpZ2luYWwsIHdoZXJlIGl0cyBDYXNlRmllbGQgaXMgaGlkZGVuIEFORCBoYXMgdGhlIHJldGFpbl9oaWRkZW5fdmFsdWUgZmxhZyBzZXRcbiAgICAgKiB0byB0cnVlLlxuICAgICAqXG4gICAgICogSWYgdGhlIENhc2VGaWVsZCdzIGBoaWRkZW5gIGF0dHJpYnV0ZSBpcyBudWxsIG9yIHVuZGVmaW5lZCwgdGhlbiBjaGVjayB0aGlzIGF0dHJpYnV0ZSBpbiB0aGUgcGFyZW50IENhc2VGaWVsZCAoaWZcbiAgICAgKiBvbmUgZXhpc3RzKS4gVGhpcyBpcyBvY2N1cnJpbmcgKGFuZCBpcyBwb3NzaWJseSBhIGJ1Zykgd2hlbiBhIENhc2VGaWVsZCBpcyBhIHN1Yi1maWVsZCBvZiBhIENvbXBsZXggdHlwZSwgb3IgYW5cbiAgICAgKiBpdGVtIGluIGEgQ29sbGVjdGlvbiB0eXBlLlxuICAgICAqXG4gICAgICogSWYgdGhlIGZpZWxkIGlzIGEgQ29tcGxleCB0eXBlIHdpdGggcmV0YWluX2hpZGRlbl92YWx1ZSA9IHRydWUsIHBlcmZvcm0gYSByZWN1cnNpdmUgcmVwbGFjZW1lbnQgZm9yIGFsbCAoaGlkZGVuKVxuICAgICAqIHN1Yi1maWVsZHMgd2l0aCByZXRhaW5faGlkZGVuX3ZhbHVlID0gdHJ1ZSwgdXNpbmcgdGhlaXIgb3JpZ2luYWwgQ2FzZUZpZWxkIHZhbHVlcyAoZnJvbSB0aGUgYGZvcm1hdHRlZF92YWx1ZWBcbiAgICAgKiBhdHRyaWJ1dGUpLlxuICAgICAqXG4gICAgICogSWYgdGhlIGZpZWxkIGlzIGEgQ29sbGVjdGlvbiB0eXBlIHdpdGggcmV0YWluX2hpZGRlbl92YWx1ZSA9IHRydWUsIHRoZSBlbnRpcmUgY29sbGVjdGlvbiBpcyByZXBsYWNlZCB3aXRoIHRoZVxuICAgICAqIG9yaWdpbmFsIGZyb20gYGZvcm1hdHRlZF92YWx1ZWAuIFRoaXMgYXBwbGllcyB0byAqYWxsKiB0eXBlcyBvZiBDb2xsZWN0aW9ucy5cbiAgICAgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIE9iamVjdC5rZXlzKHJhd0Zvcm1WYWx1ZURhdGEpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgY2FzZUZpZWxkOiBDYXNlRmllbGQgPSBjYXNlRmllbGRzTG9va3VwW2tleV07XG4gICAgICAvLyBJZiBjYXNlRmllbGQuaGlkZGVuIGlzIE5PVCB0cnV0aHkgYW5kIGFsc28gTk9UIGVxdWFsIHRvIGZhbHNlLCB0aGVuIGl0IG11c3QgYmUgbnVsbC91bmRlZmluZWQgKHJlbWVtYmVyIHRoYXRcbiAgICAgIC8vIGJvdGggbnVsbCBhbmQgdW5kZWZpbmVkIGFyZSBlcXVhbCB0byAqbmVpdGhlciBmYWxzZSBub3IgdHJ1ZSopXG4gICAgICBpZiAoY2FzZUZpZWxkICYmIGNhc2VGaWVsZC5yZXRhaW5faGlkZGVuX3ZhbHVlICYmXG4gICAgICAgIChjYXNlRmllbGQuaGlkZGVuIHx8IChjYXNlRmllbGQuaGlkZGVuICE9PSBmYWxzZSAmJiBwYXJlbnRGaWVsZCAmJiBwYXJlbnRGaWVsZC5oaWRkZW4pKSkge1xuICAgICAgICBpZiAoY2FzZUZpZWxkLmZpZWxkX3R5cGUudHlwZSA9PT0gJ0NvbXBsZXgnKSB7XG4gICAgICAgICAgLy8gTm90ZTogRGVsaWJlcmF0ZSB1c2Ugb2YgZXF1YWxpdHkgKD09KSBhbmQgbm9uLWVxdWFsaXR5ICghPSkgb3BlcmF0b3JzIGZvciBudWxsIGNoZWNrcyB0aHJvdWdob3V0LCB0b1xuICAgICAgICAgIC8vIGhhbmRsZSBib3RoIG51bGwgYW5kIHVuZGVmaW5lZCB2YWx1ZXNcbiAgICAgICAgICBpZiAoY2FzZUZpZWxkLnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIENhbGwgdGhpcyBmdW5jdGlvbiByZWN1cnNpdmVseSB0byByZXBsYWNlIHRoZSBDb21wbGV4IGZpZWxkJ3Mgc3ViLWZpZWxkcyBhcyBuZWNlc3NhcnksIHBhc3NpbmcgdGhlXG4gICAgICAgICAgICAvLyBDYXNlRmllbGQgaXRzZWxmICh0aGUgc3ViLWZpZWxkcyBkbyBub3QgY29udGFpbiBhbnkgdmFsdWVzLCBzbyB0aGVzZSBuZWVkIHRvIGJlIG9idGFpbmVkIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBwYXJlbnQpXG4gICAgICAgICAgICAvLyBVcGRhdGUgcmF3Rm9ybVZhbHVlRGF0YSBmb3IgdGhpcyBmaWVsZFxuICAgICAgICAgICAgLy8gY3JlYXRpbmcgZm9ybSBncm91cCBhbmQgYWRkaW5nIGNvbnRyb2wgaW50byBpdCBpbiBjYXNlIGNhc2VGaWVsZCBpcyBvZiBjb21wbGV4dCB0eXBlIGFuZCBhbmQgcGFydCBvZiBmb3JtR3JvdXBcbiAgICAgICAgICAgIGNvbnN0IGZvcm06IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuICAgICAgICAgICAgaWYgKGZvcm1Hcm91cC5jb250cm9sc1trZXldLnZhbHVlKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKGZvcm1Hcm91cC5jb250cm9sc1trZXldLnZhbHVlKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9ybS5hZGRDb250cm9sKGl0ZW0sIG5ldyBGb3JtQ29udHJvbChmb3JtR3JvdXAuY29udHJvbHNba2V5XS52YWx1ZVtpdGVtXSkpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJhd0Zvcm1WYWx1ZURhdGFba2V5XSA9IHRoaXMucmVwbGFjZUhpZGRlbkZvcm1WYWx1ZXNXaXRoT3JpZ2luYWxDYXNlRGF0YShcbiAgICAgICAgICAgICAgZm9ybSwgY2FzZUZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMsIGNhc2VGaWVsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERlZmF1bHQgY2FzZSBhbHNvIGhhbmRsZXMgY29sbGVjdGlvbnMgb2YgKmFsbCogdHlwZXM7IHRoZSBlbnRpcmUgY29sbGVjdGlvbiBpbiByYXdGb3JtVmFsdWVEYXRhIHdpbGwgYmVcbiAgICAgICAgICAvLyByZXBsYWNlZCB3aXRoIHRoZSBvcmlnaW5hbCBmcm9tIGZvcm1hdHRlZF92YWx1ZVxuICAgICAgICAgIC8vIFVzZSB0aGUgQ2FzZUZpZWxkJ3MgZXhpc3RpbmcgKmZvcm1hdHRlZF92YWx1ZSogZnJvbSB0aGUgcGFyZW50LCBpZiBhdmFpbGFibGUuIChUaGlzIGlzIG5lY2Vzc2FyeSBmb3JcbiAgICAgICAgICAvLyBDb21wbGV4IGZpZWxkcywgd2hvc2Ugc3ViLWZpZWxkcyBkbyBub3QgaG9sZCBhbnkgdmFsdWVzIGluIHRoZSBtb2RlbC4pIE90aGVyd2lzZSwgdXNlIGZvcm1hdHRlZF92YWx1ZVxuICAgICAgICAgIC8vIGZyb20gdGhlIENhc2VGaWVsZCBpdHNlbGYuXG4gICAgICAgICAgaWYgKHBhcmVudEZpZWxkICYmIHBhcmVudEZpZWxkLmZvcm1hdHRlZF92YWx1ZSkge1xuICAgICAgICAgICAgcmF3Rm9ybVZhbHVlRGF0YVtrZXldID0gcGFyZW50RmllbGQuZm9ybWF0dGVkX3ZhbHVlW2Nhc2VGaWVsZC5pZF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghKGNhc2VGaWVsZC5oaWRkZW4gJiYgY2FzZUZpZWxkLnJldGFpbl9oaWRkZW5fdmFsdWUpKSB7XG4gICAgICAgICAgICAgIHJhd0Zvcm1WYWx1ZURhdGFba2V5XSA9IGNhc2VGaWVsZC5mb3JtYXR0ZWRfdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmF3Rm9ybVZhbHVlRGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgY2FzZVN1Ym1pdCh7IGZvcm0sIGNhc2VFdmVudERhdGEsIHN1Ym1pdCB9OiBDYXNlRWRpdENhc2VTdWJtaXQpOiB2b2lkIHtcbiAgICBjb25zdCBsb2FkaW5nU3Bpbm5lclRva2VuID0gdGhpcy5sb2FkaW5nU2VydmljZS5yZWdpc3RlcigpO1xuICAgIC8vIGtlZXAgdGhlIGluaXRpYWwgZXZlbnQgcmVzcG9uc2UgdG8gZmluYWxpc2UgcHJvY2VzcyBhZnRlciB0YXNrIGNvbXBsZXRpb25cbiAgICBsZXQgZXZlbnRSZXNwb25zZTogb2JqZWN0O1xuICAgIHRoaXMuc2Vzc2lvblN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oJ3Rhc2tDb21wbGV0aW9uRXJyb3InLCAnZmFsc2UnKTtcbiAgICBzdWJtaXQoY2FzZUV2ZW50RGF0YSkucGlwZShzd2l0Y2hNYXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICBldmVudFJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICByZXR1cm4gdGhpcy5wb3N0Q29tcGxldGVUYXNrSWZSZXF1aXJlZCgpO1xuICAgIH0pLGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nU2VydmljZS51bnJlZ2lzdGVyKGxvYWRpbmdTcGlubmVyVG9rZW4pO1xuICAgICAgfSkpXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5maW5pc2hFdmVudENvbXBsZXRpb25Mb2dpYyhldmVudFJlc3BvbnNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgIGlmICghZXZlbnRSZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gZXZlbnQgc3VibWlzc2lvbiBlcnJvclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja0Vycm9yc1N1YmplY3QubmV4dChlcnJvcik7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgICAgaWYgKHRoaXMuZXJyb3IuZGV0YWlscykge1xuICAgICAgICAgICAgICB0aGlzLmZvcm1FcnJvclNlcnZpY2VcbiAgICAgICAgICAgICAgICAubWFwRmllbGRFcnJvcnModGhpcy5lcnJvci5kZXRhaWxzLmZpZWxkX2Vycm9ycywgZm9ybS5jb250cm9sc1snZGF0YSddIGFzIEZvcm1Hcm91cCwgJ3ZhbGlkYXRpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvblN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oJ3Rhc2tDb21wbGV0aW9uRXJyb3InLCAndHJ1ZScpO1xuICAgICAgICAgICAgLy8gdGFzayBhc3NpZ25tZW50L2NvbXBsZXRpb24gZXJyb3IgLSBoYW5kbGVkIHdpdGhpbiB3b3JrYWxsb2NhdGlvbiBzZXJ2aWNlXG4gICAgICAgICAgICAvLyBjb3VsZCBzZXQgdGFzayB0byBiZSBkZWxldGVkIChvciBjb21wbGV0ZWQgbGF0ZXIpP1xuICAgICAgICAgICAgdGhpcy5maW5pc2hFdmVudENvbXBsZXRpb25Mb2dpYyhldmVudFJlc3BvbnNlKTtcbiAgICAgICAgICAgIC8vIGJlbG93IGFsbG93cyBlcnJvciB0byBiZSBzaG93biBvbiBuYXZpZ2F0aW9uIHRvIGNvbmZpcm1hdGlvbiBwYWdlXG4gICAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5zZXRQcmVzZXJ2ZUFsZXJ0cyh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmVycm9yKHtwaHJhc2U6IENvbnN0YW50cy5UQVNLX0NPTVBMRVRJT05fRVJST1J9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIHBvc3RDb21wbGV0ZVRhc2tJZlJlcXVpcmVkKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgY2xpZW50Q29udGV4dFN0ciA9IHRoaXMuc2Vzc2lvblN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oJ2NsaWVudENvbnRleHQnKTtcbiAgICBjb25zdCB1c2VyVGFzayA9IEZpZWxkc1V0aWxzLmdldFVzZXJUYXNrRnJvbUNsaWVudENvbnRleHQoY2xpZW50Q29udGV4dFN0cik7XG4gICAgY29uc3QgW3Rhc2ssIHRhc2tUb0JlQ29tcGxldGVkXSA9IHVzZXJUYXNrID8gW3VzZXJUYXNrLnRhc2tfZGF0YSwgdXNlclRhc2suY29tcGxldGVfdGFza10gOiBbbnVsbCwgZmFsc2VdO1xuICAgIGNvbnN0IGFzc2lnbk5lZWRlZCA9IHRoaXMuc2Vzc2lvblN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oJ2Fzc2lnbk5lZWRlZCcpID09PSAndHJ1ZSc7XG4gICAgaWYgKHRhc2sgJiYgYXNzaWduTmVlZGVkICYmIHRhc2tUb0JlQ29tcGxldGVkKSB7XG4gICAgICAvLyBjb25zdCB0YXNrOiBUYXNrID0gSlNPTi5wYXJzZSh0YXNrU3RyKTtcbiAgICAgIHJldHVybiB0aGlzLndvcmtBbGxvY2F0aW9uU2VydmljZS5hc3NpZ25BbmRDb21wbGV0ZVRhc2sodGFzay5pZCk7XG4gICAgfSBlbHNlIGlmICh0YXNrICYmIHRhc2tUb0JlQ29tcGxldGVkKSB7XG4gICAgICAvLyBjb25zdCB0YXNrOiBUYXNrID0gSlNPTi5wYXJzZSh0YXNrU3RyKTtcbiAgICAgIHJldHVybiB0aGlzLndvcmtBbGxvY2F0aW9uU2VydmljZS5jb21wbGV0ZVRhc2sodGFzay5pZCk7XG4gICAgfVxuICAgIHJldHVybiBvZih0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluaXNoRXZlbnRDb21wbGV0aW9uTG9naWMoZXZlbnRSZXNwb25zZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5jYXNlTm90aWZpZXIuY2FjaGVkQ2FzZVZpZXcgPSBudWxsO1xuICAgIHRoaXMuc2Vzc2lvblN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oJ2V2ZW50VXJsJyk7XG4gICAgY29uc3QgY29uZmlybWF0aW9uOiBDb25maXJtYXRpb24gPSB0aGlzLmJ1aWxkQ29uZmlybWF0aW9uKGV2ZW50UmVzcG9uc2UpO1xuICAgIGlmIChjb25maXJtYXRpb24gJiYgKGNvbmZpcm1hdGlvbi5nZXRIZWFkZXIoKSB8fCBjb25maXJtYXRpb24uZ2V0Qm9keSgpKSkge1xuICAgICAgdGhpcy5jb25maXJtKGNvbmZpcm1hdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdFN1Ym1pdHRlZChldmVudFJlc3BvbnNlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQ29uZmlybWF0aW9uKHJlc3BvbnNlOiBvYmplY3QpOiBDb25maXJtYXRpb24ge1xuICAgIGlmIChyZXNwb25zZVsnYWZ0ZXJfc3VibWl0X2NhbGxiYWNrX3Jlc3BvbnNlJ10pIHtcbiAgICAgIHJldHVybiBuZXcgQ29uZmlybWF0aW9uKFxuICAgICAgICByZXNwb25zZVsnaWQnXSxcbiAgICAgICAgcmVzcG9uc2VbJ2NhbGxiYWNrX3Jlc3BvbnNlX3N0YXR1cyddLFxuICAgICAgICByZXNwb25zZVsnYWZ0ZXJfc3VibWl0X2NhbGxiYWNrX3Jlc3BvbnNlJ11bJ2NvbmZpcm1hdGlvbl9oZWFkZXInXSxcbiAgICAgICAgcmVzcG9uc2VbJ2FmdGVyX3N1Ym1pdF9jYWxsYmFja19yZXNwb25zZSddWydjb25maXJtYXRpb25fYm9keSddXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25FdmVudENhbkJlQ29tcGxldGVkKHsgZXZlbnRUcmlnZ2VyLCBldmVudENhbkJlQ29tcGxldGVkLCBjYXNlRGV0YWlscywgZm9ybSwgc3VibWl0IH06IENhc2VFZGl0b25FdmVudENhbkJlQ29tcGxldGVkKTogdm9pZCB7XG4gICAgaWYgKGV2ZW50Q2FuQmVDb21wbGV0ZWQpIHtcbiAgICAgIC8vIFN1Ym1pdFxuICAgICAgY29uc3QgY2FzZUV2ZW50RGF0YSA9IHRoaXMuZ2VuZXJhdGVDYXNlRXZlbnREYXRhKHsgZXZlbnRUcmlnZ2VyLCBmb3JtIH0pO1xuICAgICAgdGhpcy5jYXNlU3VibWl0KHsgZm9ybSwgY2FzZUV2ZW50RGF0YSwgc3VibWl0IH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOYXZpZ2F0ZSB0byB0YXNrcyB0YWIgb24gY2FzZSBkZXRhaWxzIHBhZ2VcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgL2Nhc2VzL2Nhc2UtZGV0YWlscy8ke3RoaXMuZ2V0Q2FzZUlkKGNhc2VEZXRhaWxzKX0vdGFza3NgXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRTdGF0dXMocmVzcG9uc2U6IG9iamVjdCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzQ2FsbGJhY2tGYWlsZWQocmVzcG9uc2UpID8gcmVzcG9uc2VbJ2NhbGxiYWNrX3Jlc3BvbnNlX3N0YXR1cyddIDogcmVzcG9uc2VbJ2RlbGV0ZV9kcmFmdF9yZXNwb25zZV9zdGF0dXMnXTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzQ2FsbGJhY2tGYWlsZWQocmVzcG9uc2U6IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZXNwb25zZVsnY2FsbGJhY2tfcmVzcG9uc2Vfc3RhdHVzJ10gIT09ICdDQUxMQkFDS19DT01QTEVURUQnO1xuICB9XG59XG4iLCI8cm91dGVyLW91dGxldD48L3JvdXRlci1vdXRsZXQ+XG4iXX0=