@cqa-lib/cqa-ui 1.1.137 → 1.1.139

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 (27) hide show
  1. package/esm2020/lib/execution-screen/ai-agent-step/ai-agent-step.component.mjs +36 -5
  2. package/esm2020/lib/execution-screen/api-step/api-step.component.mjs +9 -3
  3. package/esm2020/lib/execution-screen/basic-step/basic-step.component.mjs +9 -3
  4. package/esm2020/lib/execution-screen/condition-step/condition-step.component.mjs +12 -3
  5. package/esm2020/lib/execution-screen/db-verification-step/db-verification-step.component.mjs +7 -4
  6. package/esm2020/lib/execution-screen/execution-step.models.mjs +1 -1
  7. package/esm2020/lib/execution-screen/file-download-step/file-download-step.component.mjs +6 -3
  8. package/esm2020/lib/execution-screen/live-execution-step/live-execution-step.component.mjs +9 -3
  9. package/esm2020/lib/execution-screen/loop-step/loop-step.component.mjs +9 -3
  10. package/esm2020/lib/execution-screen/step-group/step-group.component.mjs +7 -4
  11. package/esm2020/lib/execution-screen/step-renderer/step-renderer.component.mjs +52 -3
  12. package/fesm2015/cqa-lib-cqa-ui.mjs +150 -28
  13. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  14. package/fesm2020/cqa-lib-cqa-ui.mjs +146 -24
  15. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  16. package/lib/execution-screen/ai-agent-step/ai-agent-step.component.d.ts +2 -1
  17. package/lib/execution-screen/api-step/api-step.component.d.ts +2 -1
  18. package/lib/execution-screen/basic-step/basic-step.component.d.ts +2 -1
  19. package/lib/execution-screen/condition-step/condition-step.component.d.ts +2 -1
  20. package/lib/execution-screen/db-verification-step/db-verification-step.component.d.ts +2 -1
  21. package/lib/execution-screen/execution-step.models.d.ts +1 -0
  22. package/lib/execution-screen/file-download-step/file-download-step.component.d.ts +2 -1
  23. package/lib/execution-screen/live-execution-step/live-execution-step.component.d.ts +2 -1
  24. package/lib/execution-screen/loop-step/loop-step.component.d.ts +2 -1
  25. package/lib/execution-screen/step-group/step-group.component.d.ts +2 -1
  26. package/package.json +1 -1
  27. package/styles.css +1 -1
@@ -154,7 +154,7 @@ export class StepRendererComponent {
154
154
  const importantProperties = ['status', 'duration', 'expanded', 'subSteps', 'children', 'nestedSteps', 'steps',
155
155
  'executionData', 'action', 'title', 'result', 'method', 'endpoint', 'statusCode', 'branches',
156
156
  'responseTime', 'actions', 'prompt', 'optimizedRun', 'actionCount', 'iterations', 'selectedIterationId', 'stepNumber',
157
- 'isUploadingBaseline', 'isMakingCurrentBaseline'];
157
+ 'isUploadingBaseline', 'isMakingCurrentBaseline', 'selectedTabInput', 'stepDeleted'];
158
158
  // Update important properties
159
159
  importantProperties.forEach(key => {
160
160
  // For selectedIterationId on loop steps, prioritize the input value over step value
@@ -201,6 +201,31 @@ export class StepRendererComponent {
201
201
  hasChanges = true;
202
202
  }
203
203
  }
204
+ else if (key === 'action' && currentStep.type === 'ai-agent') {
205
+ // For ai-agent steps, ensure title and prompt are set from action
206
+ const currentValue = currentStep[key];
207
+ const previousValue = previousStep[key];
208
+ if (this.hasValueChanged(currentValue, previousValue)) {
209
+ // Update action
210
+ instance[key] = currentValue;
211
+ hasChanges = true;
212
+ // Also update title and prompt from action if they're not set or empty
213
+ if (currentValue) {
214
+ if (!instance.title || !instance.title.trim()) {
215
+ instance.title = currentValue;
216
+ if (instance.config) {
217
+ instance.config.title = currentValue;
218
+ }
219
+ }
220
+ if (!instance.prompt || !instance.prompt.trim()) {
221
+ instance.prompt = currentValue;
222
+ if (instance.config) {
223
+ instance.config.prompt = currentValue;
224
+ }
225
+ }
226
+ }
227
+ }
228
+ }
204
229
  else {
205
230
  const currentValue = currentStep[key];
206
231
  const previousValue = previousStep[key];
@@ -513,7 +538,7 @@ export class StepRendererComponent {
513
538
  const totalSubSteps = (step.branches || []).reduce((sum, branch) => {
514
539
  return sum + (branch.subSteps?.length || 0);
515
540
  }, 0);
516
- return `${step.id || ''}_${executionStatus}_${step.status || ''}_${step.duration || ''}_${step.expanded || false}_${(step.children || []).length}_${(step.nestedSteps || []).length}_${(step.steps || []).length}_${branchesLength}_${totalSubSteps}_${step.stepNumber || ''}`;
541
+ return `${step.id || ''}_${executionStatus}_${step.status || ''}_${step.duration || ''}_${step.expanded || false}_${(step.children || []).length}_${(step.nestedSteps || []).length}_${(step.steps || []).length}_${branchesLength}_${totalSubSteps}_${step.stepNumber || ''}_${step.stepDeleted || false}`;
517
542
  }
518
543
  loadComponent() {
519
544
  if (!this.container || !this.step)
@@ -685,6 +710,30 @@ export class StepRendererComponent {
685
710
  instance.activeBranchStepId = this.step.activeBranchStepId;
686
711
  }
687
712
  }
713
+ // Special handling for ai-agent-step: ensure title and prompt are set from action
714
+ if (this.step.type === 'ai-agent') {
715
+ // Set title from action if title is not present or empty
716
+ if ((!instance.title || !instance.title.trim()) && this.step.action) {
717
+ instance.title = this.step.action;
718
+ }
719
+ // Set prompt from action if prompt is not present or empty
720
+ if ((!instance.prompt || !instance.prompt.trim()) && this.step.action) {
721
+ instance.prompt = this.step.action;
722
+ }
723
+ // Ensure actions array is set if not present
724
+ if (!instance.actions && this.formatActionsHandler) {
725
+ instance.actions = this.formatActionsHandler(this.step);
726
+ }
727
+ // Set actionCount if not present
728
+ if (instance.actionCount === undefined) {
729
+ const actions = instance.actions || [];
730
+ instance.actionCount = actions.length;
731
+ }
732
+ // Set selectedTabInput if not present
733
+ if (!instance.selectedTabInput) {
734
+ instance.selectedTabInput = 'action-trace';
735
+ }
736
+ }
688
737
  // Wire up common event emitters for api, ai-agent, loop, condition, and basic steps
689
738
  if (this.step.type === 'api' || this.step.type === 'ai-agent' || this.step.type === 'loop' || this.step.type === 'condition' || this.step.type === 'basic') {
690
739
  // Subscribe to common output events and call handlers
@@ -976,4 +1025,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
976
1025
  }], componentReady: [{
977
1026
  type: Output
978
1027
  }] } });
979
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2V4ZWN1dGlvbi1zY3JlZW4vc3RlcC1yZW5kZXJlci9zdGVwLXJlbmRlcmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBMEQsTUFBTSxFQUFFLGlCQUFpQixFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUVyTSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFFNUQ7Ozs7R0FJRztBQUtILE1BQU0sT0FBTyxxQkFBcUI7SUFtQ2hDLFlBQ3NDLFlBQW9DLEVBQ2hFLEdBQXNCO1FBRE0saUJBQVksR0FBWixZQUFZLENBQXdCO1FBQ2hFLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBWnZCLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDdkIsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDLENBQUMsMENBQTBDO1FBS3ZGLGVBQVUsR0FBMkIsSUFBSSxDQUFDO1FBQzFDLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxvQkFBZSxHQUFXLEVBQUUsQ0FBQztJQUtqQyxDQUFDO0lBRUwsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBRTFDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztRQUMvRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsYUFBYSxDQUFDO1FBRXBELDhEQUE4RDtRQUM5RCxNQUFNO1FBQ04scUVBQXFFO1FBQ3JFLGdF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LG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBQ0csNkJBQTZCO3NCQUFyQyxLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQzhDLFNBQVM7c0JBQTVELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUN6QyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVHlwZSwgQWZ0ZXJWaWV3SW5pdCwgRG9DaGVjaywgSW5qZWN0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFeGVjdXRpb25TdGVwQ29uZmlnIH0gZnJvbSAnLi4vZXhlY3V0aW9uLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IFNURVBfQ09NUE9ORU5UX01BUCB9IGZyb20gJy4uL3N0ZXAtcmVnaXN0cnkudG9rZW4nO1xuXG4vKipcbiAqIENvbXBvbmVudCB0aGF0IHJlbmRlcnMgdGhlIGFwcHJvcHJpYXRlIHN0ZXAgY29tcG9uZW50IGJhc2VkIG9uIHRoZSBzdGVwIHR5cGUuXG4gKiBVc2VzIGR5bmFtaWMgY29tcG9uZW50IGxvYWRpbmcgYW5kIGFuIGluamVjdGlvbiB0b2tlbiB0byBicmVhayBjaXJjdWxhciBkZXBlbmRlbmNpZXNcbiAqIGJldHdlZW4gc3RlcCBjb21wb25lbnRzIGluIEFuZ3VsYXIgSXZ5IHBhcnRpYWwgY29tcGlsYXRpb24gbW9kZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN0ZXAtcmVuZGVyZXInLFxuICB0ZW1wbGF0ZTogJzxuZy1jb250YWluZXIgI2NvbnRhaW5lcj48L25nLWNvbnRhaW5lcj4nXG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBSZW5kZXJlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgRG9DaGVjayB7XG4gIEBJbnB1dCgpIHN0ZXAhOiBFeGVjdXRpb25TdGVwQ29uZmlnO1xuICBASW5wdXQoKSBvbkV4cGFuZEhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgQElucHV0KCkgZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueTtcbiAgQElucHV0KCkgaXNTdGVwTG9hZGluZ0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgaXNTdGVwRXhwYW5kZWRIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXI/OiAoZHVyYXRpb246IG51bWJlcikgPT4gbnVtYmVyO1xuICBASW5wdXQoKSBmb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55O1xuICBASW5wdXQoKSBnZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnk7XG4gIEBJbnB1dCgpIG9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXI/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25VcGxvYWRCYXNlbGluZUhhbmRsZXI/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25BbmFseXplSGFuZGxlcj86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uVmlld0Z1bGxMb2dzSGFuZGxlcj86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGlzVXBsb2FkaW5nQmFzZWxpbmU/OiBhbnk7XG4gIEBJbnB1dCgpIGlzTWFraW5nQ3VycmVudEJhc2VsaW5lPzogYW55O1xuICBASW5wdXQoKSBzZWxlY3RlZEl0ZXJhdGlvbklkPzogYW55O1xuICBASW5wdXQoKSBnZXRMb29wSXRlcmF0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55W107XG4gIEBJbnB1dCgpIGdldEFwaUFzc2VydGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueVtdO1xuICBASW5wdXQoKSBmb3JtYXRBY3Rpb25zSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnlbXTtcbiAgQElucHV0KCkgb25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgQElucHV0KCkgb25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXI/OiAoc3RlcDogYW55LCBicmFuY2g6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25TdGVwQ2xpY2tIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcsIGV2ZW50PzogRXZlbnQpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uSnNvblBhdGhDb3BpZWRIYW5kbGVyPzogKGV2ZW50OiB7IHBhdGg6IHN0cmluZzsgc291cmNlOiAncmVxdWVzdEJvZHknIHwgJ3Jlc3BvbnNlQm9keScgfCAncmVxdWVzdEhlYWRlcnMnIHwgJ3Jlc3BvbnNlSGVhZGVycycgfSkgPT4gdm9pZDtcbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIGNvbnRhaW5lciE6IFZpZXdDb250YWluZXJSZWY7XG4gIEBJbnB1dCgpIGlzTGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgY29tcG9uZW50UmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiBjb21wb25lbnQgaXMgbG9hZGVkIGFuZCByZWFkeVxuXG4gIC8vIFVzZSBXZWFrTWFwIHRvIHRyYWNrIGNvbXBvbmVudCBpbnN0YW5jZXMgd2l0aG91dCBzdG9yaW5nIHRoZW0gYXMgY2xhc3MgcHJvcGVydGllc1xuICBwcml2YXRlIHN0YXRpYyBjb21wb25lbnRJbnN0YW5jZXMgPSBuZXcgV2Vha01hcDxWaWV3Q29udGFpbmVyUmVmLCBhbnk+KCk7XG4gIHByaXZhdGUgc3RhdGljIGNvbXBvbmVudFJlZnMgPSBuZXcgV2Vha01hcDxWaWV3Q29udGFpbmVyUmVmLCBDb21wb25lbnRSZWY8YW55Pj4oKTtcbiAgcHJpdmF0ZSBsYXN0U3RlcElkOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0U3RlcFR5cGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHByZXZpb3VzU3RlcEtleTogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChTVEVQX0NPTVBPTkVOVF9NQVApIHByaXZhdGUgY29tcG9uZW50TWFwOiBNYXA8c3RyaW5nLCBUeXBlPGFueT4+LFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHsgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyIHx8ICF0aGlzLnN0ZXApIHJldHVybjtcblxuICAgIGNvbnN0IGN1cnJlbnRTdGVwID0gY2hhbmdlc1snc3RlcCddPy5jdXJyZW50VmFsdWUgfHwgdGhpcy5zdGVwO1xuICAgIGNvbnN0IHByZXZpb3VzU3RlcCA9IGNoYW5nZXNbJ3N0ZXAnXT8ucHJldmlvdXNWYWx1ZTtcblxuICAgIC8vIENoZWNrIGlmIHNlbGVjdGVkSXRlcmF0aW9uSWQgaW5wdXQgY2hhbmdlZCAoZm9yIGxvb3Agc3RlcHMpXG4gICAgLy8gJiYgXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RlcC50eXBlID09PSAnbG9vcCcgJiYgXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5sZW5ndGggPiAwO1xuXG4gICAgLy8gSWYgc2VsZWN0ZWRJdGVyYXRpb25JZCBjaGFuZ2VkIGZvciBhIGxvb3Agc3RlcCwgdXBkYXRlIGl0IGRpcmVjdGx5XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXSAmJiBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10uY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10ucHJldmlvdXNWYWx1ZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UgJiYgY29tcG9uZW50UmVmKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXS5jdXJyZW50VmFsdWU7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10ucHJldmlvdXNWYWx1ZTtcblxuICAgICAgICAvLyBBbHdheXMgdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uSWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGZyb20gcGFyZW50XG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRyeSB0byB1cGRhdGUgc2VsZWN0ZWRJdGVyYXRpb24gaWYgaXRlcmF0aW9ucyBhcmUgYXZhaWxhYmxlXG4gICAgICAgICAgdGhpcy51cGRhdGVMb29wU3RlcFNlbGVjdGVkSXRlcmF0aW9uKGluc3RhbmNlLCBjdXJyZW50VmFsdWUpO1xuXG4gICAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBsb29wLXN0ZXAgY29tcG9uZW50XG4gICAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIGlzVXBsb2FkaW5nQmFzZWxpbmUgb3IgaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUgY2hhbmdlZCwgdXBkYXRlIG5lc3RlZCBjb21wb25lbnQgaW5zdGFuY2VzXG4gICAgaWYgKGNoYW5nZXNbJ2lzVXBsb2FkaW5nQmFzZWxpbmUnXSB8fCBjaGFuZ2VzWydpc01ha2luZ0N1cnJlbnRCYXNlbGluZSddKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG5cbiAgICAgIGlmIChpbnN0YW5jZSAmJiBjb21wb25lbnRSZWYpIHtcbiAgICAgICAgLy8gVXBkYXRlIGlzVXBsb2FkaW5nQmFzZWxpbmUgaWYgaXQgY2hhbmdlZFxuICAgICAgICBpZiAoY2hhbmdlc1snaXNVcGxvYWRpbmdCYXNlbGluZSddKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNVcGxvYWRpbmdCYXNlbGluZSA9IHRoaXMuaXNVcGxvYWRpbmdCYXNlbGluZTtcbiAgICAgICAgICAvLyBBbHNvIHVwZGF0ZSBpbiBjb25maWcgaWYgaXQgZXhpc3RzXG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmlzVXBsb2FkaW5nQmFzZWxpbmUgPSB0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGlzTWFraW5nQ3VycmVudEJhc2VsaW5lIGlmIGl0IGNoYW5nZWRcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2lzTWFraW5nQ3VycmVudEJhc2VsaW5lJ10pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc01ha2luZ0N1cnJlbnRCYXNlbGluZSA9IHRoaXMuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmU7XG4gICAgICAgICAgLy8gQWxzbyB1cGRhdGUgaW4gY29uZmlnIGlmIGl0IGV4aXN0c1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5pc01ha2luZ0N1cnJlbnRCYXNlbGluZSA9IHRoaXMuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIGluc3RhbmNlQ2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgc3RlcCBpZGVudGlmaWVyc1xuICAgIGNvbnN0IGN1cnJlbnRTdGVwSWQgPSBjdXJyZW50U3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IGN1cnJlbnRTdGVwLmlkO1xuICAgIGNvbnN0IGN1cnJlbnRTdGVwVHlwZSA9IGN1cnJlbnRTdGVwLnR5cGU7XG5cbiAgICAvLyBVc2Ugc3RvcmVkIGxhc3RTdGVwSWQgYW5kIGxhc3RTdGVwVHlwZSB0byBwcm9wZXJseSBkZXRlY3QgY2hhbmdlc1xuICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVuIHN0ZXAgb2JqZWN0IHJlZmVyZW5jZSBkb2Vzbid0IGNoYW5nZSBidXQgcHJvcGVydGllcyBkb1xuICAgIC8vIE9ubHkgY2hlY2sgZm9yIGFjdHVhbCBJRC90eXBlIGNoYW5nZXMsIG5vdCBqdXN0IHJlZmVyZW5jZSBjaGFuZ2VzXG4gICAgLy8gY29uc3Qgc3RlcFR5cGVDaGFuZ2VkID0gIXByZXZpb3VzU3RlcCB8fCBjdXJyZW50U3RlcFR5cGUgIT09IChwcmV2aW91c1N0ZXAudHlwZSB8fCB0aGlzLmxhc3RTdGVwVHlwZSk7XG4gICAgLy8gY29uc3Qgc3RlcElkQ2hhbmdlZCA9ICFwcmV2aW91c1N0ZXAgfHwgY3VycmVudFN0ZXBJZCAhPT0gKHByZXZpb3VzU3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IHByZXZpb3VzU3RlcC5pZCB8fCB0aGlzLmxhc3RTdGVwSWQpO1xuICAgIGNvbnN0IHN0ZXBUeXBlQ2hhbmdlZCA9IGN1cnJlbnRTdGVwVHlwZSAhPT0gdGhpcy5sYXN0U3RlcFR5cGU7XG4gICAgY29uc3Qgc3RlcElkQ2hhbmdlZCA9IGN1cnJlbnRTdGVwSWQgIT09IHRoaXMubGFzdFN0ZXBJZDtcbiAgICBcbiAgICAvLyBPbmx5IGxvYWQgY29tcG9uZW50IGlmIHN0ZXAgSUQgb3IgdHlwZSBhY3R1YWxseSBjaGFuZ2VkXG4gICAgLy8gVGhpcyBwcmV2ZW50cyB1bm5lY2Vzc2FyeSByZWxvYWRzIHdoZW4gb25seSBuZXN0ZWQgcHJvcGVydGllcyBjaGFuZ2VcbiAgICBpZiAoc3RlcFR5cGVDaGFuZ2VkIHx8IHN0ZXBJZENoYW5nZWQpIHtcbiAgICAgIHRoaXMubGFzdFN0ZXBJZCA9IGN1cnJlbnRTdGVwSWQ7XG4gICAgICB0aGlzLmxhc3RTdGVwVHlwZSA9IGN1cnJlbnRTdGVwVHlwZTtcbiAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICB0aGlzLmxvYWRDb21wb25lbnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IG5lc3RlZCBkYXRhIGNoYW5nZWQgKGNoaWxkcmVuLCBuZXN0ZWRTdGVwcywgc3RlcHMsIGV4cGFuZGVkKSwgXG4gICAgLy8gdXBkYXRlIHByb3BlcnRpZXMgd2l0aG91dCByZWNyZWF0aW5nIGNvbXBvbmVudCB0byBwcmV2ZW50IGJsaW5raW5nXG4gICAgLy8gVGhpcyBwcmV2ZW50cyBwYXJlbnQgc3RlcHMgZnJvbSBibGlua2luZyB3aGVuIG5lc3RlZCBzdGVwcyBleHBhbmRcbiAgICBjb25zdCBvbmx5TmVzdGVkRGF0YUNoYW5nZWQgPSBwcmV2aW91c1N0ZXAgJiYgKFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyB8fFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4gIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5jaGlsZHJlbiB8fFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuc3RlcHMgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5zdGVwcyB8fFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuZXhwYW5kZWQgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5leHBhbmRlZCB8fFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuYWN0aXZlQnJhbmNoU3RlcElkICE9PSAocHJldmlvdXNTdGVwIGFzIGFueSkuYWN0aXZlQnJhbmNoU3RlcElkIHx8XG4gICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5icmFuY2hlcyAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmJyYW5jaGVzIHx8XG4gICAgICAoKGN1cnJlbnRTdGVwIGFzIGFueSkuY29uZmlnICYmIChjdXJyZW50U3RlcCBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmNvbmZpZz8uZXhwYW5kZWQpXG4gICAgKTtcblxuICAgIC8vIFVwZGF0ZSBwcm9wZXJ0aWVzIHdpdGhvdXQgcmVjcmVhdGluZyBjb21wb25lbnQgdG8gcHJldmVudCBibGlua2luZ1xuICAgIGlmIChvbmx5TmVzdGVkRGF0YUNoYW5nZWQgJiYgdGhpcy5jb250YWluZXIubGVuZ3RoID4gMCkge1xuICAgICAgLy8gR2V0IHRoZSBzdG9yZWQgY29tcG9uZW50IGluc3RhbmNlXG4gICAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG5cbiAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAvLyBVc2UgY29tcHJlaGVuc2l2ZSB1cGRhdGUgbWV0aG9kIGZyb20gb3JpZ2luYWxcbiAgICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRJbnN0YW5jZShjdXJyZW50U3RlcCwgcHJldmlvdXNTdGVwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGb3Igb3RoZXIgY2hhbmdlcywgdXNlIGNvbXByZWhlbnNpdmUgdXBkYXRlIGlmIGNvbXBvbmVudCBleGlzdHNcbiAgICBpZiAodGhpcy5jb250YWluZXIubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UgJiYgcHJldmlvdXNTdGVwICYmIGN1cnJlbnRTdGVwICYmXG4gICAgICAgIHByZXZpb3VzU3RlcC50eXBlID09PSBjdXJyZW50U3RlcC50eXBlICYmXG4gICAgICAgIChwcmV2aW91c1N0ZXAudGVzdFN0ZXBSZXN1bHRJZCB8fCBwcmV2aW91c1N0ZXAuaWQpID09PSAoY3VycmVudFN0ZXAudGVzdFN0ZXBSZXN1bHRJZCB8fCBjdXJyZW50U3RlcC5pZCkpIHtcbiAgICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIGNvbXBvbmVudCBpbnN0YW5jZSB3aXRoIG5ldyBzdGVwIHByb3BlcnRpZXNcbiAgICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRJbnN0YW5jZShjdXJyZW50U3RlcCwgcHJldmlvdXNTdGVwKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9ubHkgbG9hZCBjb21wb25lbnQgaWYgY29udGFpbmVyIGlzIGVtcHR5IChjb21wb25lbnQgZG9lc24ndCBleGlzdCB5ZXQpXG4gICAgLy8gVGhpcyBwcmV2ZW50cyB1bm5lY2Vzc2FyeSByZWxvYWRzXG4gICAgaWYgKHRoaXMuY29udGFpbmVyICYmIHRoaXMuY29udGFpbmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5sb2FkQ29tcG9uZW50KCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb21wb25lbnRJbnN0YW5jZShjdXJyZW50U3RlcDogYW55LCBwcmV2aW91c1N0ZXA6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG5cbiAgICBpZiAoIWluc3RhbmNlIHx8ICFjb21wb25lbnRSZWYgfHwgIXRoaXMuY29udGFpbmVyKSByZXR1cm47XG5cbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgLy8gTGlzdCBvZiBwcm9wZXJ0aWVzIHRoYXQgY29tbW9ubHkgY2hhbmdlIGFuZCBuZWVkIHRvIGJlIHVwZGF0ZWRcbiAgICBjb25zdCBpbXBvcnRhbnRQcm9wZXJ0aWVzID0gWydzdGF0dXMnLCAnZHVyYXRpb24nLCAnZXhwYW5kZWQnLCAnc3ViU3RlcHMnLCAnY2hpbGRyZW4nLCAnbmVzdGVkU3RlcHMnLCAnc3RlcHMnLFxuICAgICAgJ2V4ZWN1dGlvbkRhdGEnLCAnYWN0aW9uJywgJ3RpdGxlJywgJ3Jlc3VsdCcsICdtZXRob2QnLCAnZW5kcG9pbnQnLCAnc3RhdHVzQ29kZScsICdicmFuY2hlcycsXG4gICAgICAncmVzcG9uc2VUaW1lJywgJ2FjdGlvbnMnLCAncHJvbXB0JywgJ29wdGltaXplZFJ1bicsICdhY3Rpb25Db3VudCcsICdpdGVyYXRpb25zJywgJ3NlbGVjdGVkSXRlcmF0aW9uSWQnLCAnc3RlcE51bWJlcicsXG4gICAgICAnaXNVcGxvYWRpbmdCYXNlbGluZScsICdpc01ha2luZ0N1cnJlbnRCYXNlbGluZSddO1xuXG4gICAgLy8gVXBkYXRlIGltcG9ydGFudCBwcm9wZXJ0aWVzXG4gICAgaW1wb3J0YW50UHJvcGVydGllcy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAvLyBGb3Igc2VsZWN0ZWRJdGVyYXRpb25JZCBvbiBsb29wIHN0ZXBzLCBwcmlvcml0aXplIHRoZSBpbnB1dCB2YWx1ZSBvdmVyIHN0ZXAgdmFsdWVcbiAgICAgIGlmIChrZXkgPT09ICdzZWxlY3RlZEl0ZXJhdGlvbklkJyAmJiBjdXJyZW50U3RlcC50eXBlID09PSAnbG9vcCcgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKGluc3RhbmNlIGFzIGFueSlba2V5XTtcbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZ1trZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUcnkgdG8gdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uIGlmIGl0ZXJhdGlvbnMgYXJlIGF2YWlsYWJsZVxuICAgICAgICAgIHRoaXMudXBkYXRlTG9vcFN0ZXBTZWxlY3RlZEl0ZXJhdGlvbihpbnN0YW5jZSwgY3VycmVudFZhbHVlKTtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdpdGVyYXRpb25zJyAmJiBjdXJyZW50U3RlcC50eXBlID09PSAnbG9vcCcpIHtcbiAgICAgICAgLy8gV2hlbiBpdGVyYXRpb25zIGFyZSB1cGRhdGVkLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSBzZWxlY3RlZEl0ZXJhdGlvblxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSAoY3VycmVudFN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZ1trZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIEFmdGVyIGl0ZXJhdGlvbnMgYXJlIHVwZGF0ZWQsIHRyeSB0byB1cGRhdGUgc2VsZWN0ZWRJdGVyYXRpb24gaWYgc2VsZWN0ZWRJdGVyYXRpb25JZCBpcyBzZXRcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZXJhdGlvbklkID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCB8fCB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTG9vcFN0ZXBTZWxlY3RlZEl0ZXJhdGlvbihpbnN0YW5jZSwgc2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2lzVXBsb2FkaW5nQmFzZWxpbmUnIHx8IGtleSA9PT0gJ2lzTWFraW5nQ3VycmVudEJhc2VsaW5lJykge1xuICAgICAgICAvLyBGb3IgbG9hZGluZyBzdGF0ZSBvYmplY3RzLCBhbHdheXMgdXNlIHRoZSBpbnB1dCB2YWx1ZSAodGhleSdyZSBwYXNzZWQgZnJvbSBwYXJlbnQpXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGtleSA9PT0gJ2lzVXBsb2FkaW5nQmFzZWxpbmUnID8gdGhpcy5pc1VwbG9hZGluZ0Jhc2VsaW5lIDogdGhpcy5pc01ha2luZ0N1cnJlbnRCYXNlbGluZTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IChpbnN0YW5jZSBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgLy8gQWx3YXlzIHVwZGF0ZSBpZiB0aGUgcmVmZXJlbmNlIGNoYW5nZWQgKG5ldyBvYmplY3QgY3JlYXRlZClcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSAoY3VycmVudFN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgLy8gVXNlIGRlZXAgY29tcGFyaXNvbiBmb3Igb2JqZWN0cy9hcnJheXMsIHNoYWxsb3cgZm9yIHByaW1pdGl2ZXNcbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBBbHNvIHVwZGF0ZSBhbGwgb3RoZXIgcHJvcGVydGllc1xuICAgIE9iamVjdC5rZXlzKGN1cnJlbnRTdGVwKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoa2V5ICE9PSAndHlwZScgJiYgIWltcG9ydGFudFByb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSAoY3VycmVudFN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgc3BlY2lhbCBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgbmVlZCBzcGVjaWFsIGhhbmRsaW5nXG4gICAgaWYgKGN1cnJlbnRTdGVwLnR5cGUgPT09ICdsb29wJyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbiAmJiAhKGN1cnJlbnRTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMpIHtcbiAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5uZXN0ZWRTdGVwcyAhPT0gKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4pIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbjtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5uZXN0ZWRTdGVwcyA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdXJyZW50U3RlcC50eXBlID09PSAnc3RlcC1ncm91cCcgJiYgKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4gJiYgIShjdXJyZW50U3RlcCBhcyBhbnkpLnN0ZXBzKSB7XG4gICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuc3RlcHMgIT09IChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBzID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc3RlcHMgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogZW5zdXJlIGJyYW5jaGVzIGlzIHByb3Blcmx5IHVwZGF0ZWRcbiAgICAvLyBVc2UgZGVlcCBjb21wYXJpc29uIHRvIGRldGVjdCBjaGFuZ2VzIGluIG5lc3RlZCBzdWJTdGVwc1xuICAgIGlmIChjdXJyZW50U3RlcC50eXBlID09PSAnY29uZGl0aW9uJyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5icmFuY2hlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50QnJhbmNoZXMgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5icmFuY2hlcyB8fCBbXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzQnJhbmNoZXMgPSAocHJldmlvdXNTdGVwIGFzIGFueSkuYnJhbmNoZXMgfHwgW107XG5cbiAgICAgIC8vIFVzZSBkZWVwIGNvbXBhcmlzb24gdG8gZGV0ZWN0IG5lc3RlZCBzdWJTdGVwcyBjaGFuZ2VzXG4gICAgICBpZiAodGhpcy5oYXNCcmFuY2hlc0NoYW5nZWQoY3VycmVudEJyYW5jaGVzLCBwcmV2aW91c0JyYW5jaGVzKSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIGVuc3VyZSBjaGFuZ2UgZGV0ZWN0aW9uIHRyaWdnZXJzXG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzID0gWy4uLmN1cnJlbnRCcmFuY2hlcy5tYXAoKGJyYW5jaDogYW55KSA9PiAoe1xuICAgICAgICAgIC4uLmJyYW5jaCxcbiAgICAgICAgICBzdWJTdGVwczogYnJhbmNoLnN1YlN0ZXBzID8gWy4uLmJyYW5jaC5zdWJTdGVwc10gOiBbXVxuICAgICAgICB9KSldO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmJyYW5jaGVzID0gKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXM7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgY29uZGl0aW9uLXN0ZXA6IGVuc3VyZSBuZXN0ZWRTdGVwcyBpcyBwcm9wZXJseSB1cGRhdGVkXG4gICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgd2hlbiBjaGlsZHJlbiBhcmUgbG9hZGVkIGZyb20gdGhlIEFQSSBvciB3aGVuIHN3aXRjaGluZyBicmFuY2hlc1xuICAgIGlmIChjdXJyZW50U3RlcC50eXBlID09PSAnY29uZGl0aW9uJyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50TmVzdGVkU3RlcHMgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyB8fCBbXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzTmVzdGVkU3RlcHMgPSAocHJldmlvdXNTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMgfHwgW107XG4gICAgICBjb25zb2xlLmxvZygn8J+UhCBzdGVwLXJlbmRlcmVyOiBjdXJyZW50TmVzdGVkU3RlcHMnLCBjdXJyZW50TmVzdGVkU3RlcHMpO1xuICAgICAgY29uc29sZS5sb2coJ/CflIQgc3RlcC1yZW5kZXJlcjogcHJldmlvdXNOZXN0ZWRTdGVwcycsIHByZXZpb3VzTmVzdGVkU3RlcHMpO1xuICAgICAgLy8gVXNlIGRlZXAgY29tcGFyaXNvbiB0byBkZXRlY3QgY29udGVudCBjaGFuZ2VzLCBub3QganVzdCByZWZlcmVuY2UgY2hhbmdlc1xuICAgICAgLy8gVGhpcyBpcyBjcml0aWNhbCB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIElGIGFuZCBFTFNFX0lGIGJyYW5jaGVzXG4gICAgICBpZiAodGhpcy5oYXNOZXN0ZWRTdGVwc0NoYW5nZWQoY3VycmVudE5lc3RlZFN0ZXBzLCBwcmV2aW91c05lc3RlZFN0ZXBzKSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIGVuc3VyZSBjaGFuZ2UgZGV0ZWN0aW9uIHRyaWdnZXJzXG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzID0gWy4uLmN1cnJlbnROZXN0ZWRTdGVwc107XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcubmVzdGVkU3RlcHMgPSBbLi4uY3VycmVudE5lc3RlZFN0ZXBzXTtcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS5sb2coJ/CflIQgc3RlcC1yZW5kZXJlcjogbmVzdGVkU3RlcHMgdXBkYXRlZCBmb3IgY29uZGl0aW9uLXN0ZXAnLCB7XG4gICAgICAgICAgc3RlcElkOiBjdXJyZW50U3RlcC5pZCxcbiAgICAgICAgICBwcmV2aW91c0NvdW50OiBwcmV2aW91c05lc3RlZFN0ZXBzLmxlbmd0aCxcbiAgICAgICAgICBjdXJyZW50Q291bnQ6IGN1cnJlbnROZXN0ZWRTdGVwcy5sZW5ndGhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBlbnN1cmUgc2VsZWN0ZWRJdGVyYXRpb25JZCBmcm9tIGlucHV0IGlzIHVzZWRcbiAgICBpZiAoY3VycmVudFN0ZXAudHlwZSA9PT0gJ2xvb3AnICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZCA9IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgIGNvbnN0IGluc3RhbmNlU2VsZWN0ZWRJdGVyYXRpb25JZCA9IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG5cbiAgICAgIC8vIE5vcm1hbGl6ZSB2YWx1ZXMgdG8gaGFuZGxlIG51bGwvdW5kZWZpbmVkIGNvbnNpc3RlbnRseVxuICAgICAgY29uc3Qgbm9ybWFsaXplVmFsdWUgPSAodmFsOiBhbnkpID0+IHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKHZhbCk7XG4gICAgICBjb25zdCBjdXJyZW50Tm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZhbHVlKGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgIGNvbnN0IGluc3RhbmNlTm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZhbHVlKGluc3RhbmNlU2VsZWN0ZWRJdGVyYXRpb25JZCk7XG5cbiAgICAgIGlmIChjdXJyZW50Tm9ybWFsaXplZCAhPT0gaW5zdGFuY2VOb3JtYWxpemVkKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBlbnN1cmUgc2VsZWN0ZWRJdGVyYXRpb25JZCBmcm9tIGlucHV0IGlzIHVzZWRcbiAgICBpZiAoY3VycmVudFN0ZXAudHlwZSA9PT0gJ2xvb3AnICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZCA9IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgIGNvbnN0IGluc3RhbmNlU2VsZWN0ZWRJdGVyYXRpb25JZCA9IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG5cbiAgICAgIC8vIE5vcm1hbGl6ZSB2YWx1ZXMgdG8gaGFuZGxlIG51bGwvdW5kZWZpbmVkIGNvbnNpc3RlbnRseVxuICAgICAgY29uc3Qgbm9ybWFsaXplVmFsdWUgPSAodmFsOiBhbnkpID0+IHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKHZhbCk7XG4gICAgICBjb25zdCBjdXJyZW50Tm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZhbHVlKGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgIGNvbnN0IGluc3RhbmNlTm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZhbHVlKGluc3RhbmNlU2VsZWN0ZWRJdGVyYXRpb25JZCk7XG5cbiAgICAgIGlmIChjdXJyZW50Tm9ybWFsaXplZCAhPT0gaW5zdGFuY2VOb3JtYWxpemVkKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGV4cGFuZGVkIHN0YXRlXG4gICAgaWYgKHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyICYmIGN1cnJlbnRTdGVwKSB7XG4gICAgICBjb25zdCBleHBhbmRlZFN0YXRlID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIoY3VycmVudFN0ZXApO1xuICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkICE9PSBleHBhbmRlZFN0YXRlKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkID0gZXhwYW5kZWRTdGF0ZTtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCA9IGV4cGFuZGVkU3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgoY3VycmVudFN0ZXAgYXMgYW55KS5leHBhbmRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQgIT09IChjdXJyZW50U3RlcCBhcyBhbnkpLmV4cGFuZGVkKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuZXhwYW5kZWQ7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZXhwYW5kZWQgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY29uZmlnIHJlZmVyZW5jZSAtIGVuc3VyZSBhbGwgcHJvcGVydGllcyBpbmNsdWRpbmcgYnJhbmNoZXMgYXJlIGluY2x1ZGVkXG4gICAgaWYgKCdjb25maWcnIGluIGluc3RhbmNlKSB7XG4gICAgICAvLyBVcGRhdGUgY29uZmlnIHdpdGggY3VycmVudCBzdGVwIHRvIGVuc3VyZSBhbGwgcHJvcGVydGllcyBpbmNsdWRpbmcgYnJhbmNoZXMgYXJlIHN5bmNlZFxuICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0geyAuLi4oaW5zdGFuY2UgYXMgYW55KS5jb25maWcsIC4uLmN1cnJlbnRTdGVwIH07XG4gICAgICAvLyBFeHBsaWNpdGx5IGVuc3VyZSBicmFuY2hlcyBpcyB1cGRhdGVkIGZvciBjb25kaXRpb24tc3RlcCAoaW4gY2FzZSBpdCB3YXMgbmVzdGVkKVxuICAgICAgLy8gVXNlIHRoZSBhbHJlYWR5IHVwZGF0ZWQgYnJhbmNoZXMgZnJvbSBpbnN0YW5jZSB0byBtYWludGFpbiByZWZlcmVuY2UgY29uc2lzdGVuY3lcbiAgICAgIGlmIChjdXJyZW50U3RlcC50eXBlID09PSAnY29uZGl0aW9uJyAmJiAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5icmFuY2hlcyA9IChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBzdGVwIHByb3BlcnR5IGlmIGl0IGV4aXN0cyBvbiB0aGUgaW5zdGFuY2VcbiAgICBpZiAoJ3N0ZXAnIGluIGluc3RhbmNlKSB7XG4gICAgICAoaW5zdGFuY2UgYXMgYW55KS5zdGVwID0gY3VycmVudFN0ZXA7XG4gICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSBpZiB0aGVyZSB3ZXJlIGNoYW5nZXNcbiAgICAvLyBUaGlzIGVuc3VyZXMgb25seSB0aGUgbmVzdGVkIHN0ZXAgdXBkYXRlcyB3aXRob3V0IGFmZmVjdGluZyBwYXJlbnQgc3RlcHNcbiAgICBpZiAoaGFzQ2hhbmdlcykge1xuICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICBpbnN0YW5jZUNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoKGluc3RhbmNlIGFzIGFueSkuY2RyKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9IGVsc2UgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IGNhbGwgbWFya0ZvckNoZWNrIG9uIHRoaXMgY29tcG9uZW50IHRvIGF2b2lkIHRyaWdnZXJpbmcgcGFyZW50IHJlLXJlbmRlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byB1cGRhdGUgbG9vcC1zdGVwIHNlbGVjdGVkSXRlcmF0aW9uIHdoZW4gc2VsZWN0ZWRJdGVyYXRpb25JZCBjaGFuZ2VzXG4gICAqIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBpdGVyYXRpb25zIG1pZ2h0IG5vdCBiZSBsb2FkZWQgeWV0XG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUxvb3BTdGVwU2VsZWN0ZWRJdGVyYXRpb24oaW5zdGFuY2U6IGFueSwgc2VsZWN0ZWRJdGVyYXRpb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgaXRlcmF0aW9ucyA9IChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMgfHwgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnPy5pdGVyYXRpb25zIHx8IFtdO1xuXG4gICAgaWYgKGl0ZXJhdGlvbnMgJiYgaXRlcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgICBjb25zdCBmb3VuZCA9IGl0ZXJhdGlvbnMuZmluZCgoaXRlcjogYW55KSA9PiBpdGVyLmlkID09PSBzZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb24gPSBmb3VuZDtcbiAgICAgICAgICAvLyBTeW5jIHVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkIHdpdGggdGhlIGlucHV0IHZhbHVlXG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkID0gc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgbm90IGZvdW5kLCBzZWxlY3QgZGVmYXVsdFxuICAgICAgICAgIGlmICh0eXBlb2YgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgbm8gdmFsdWUgcHJvdmlkZWQsIHNlbGVjdCBkZWZhdWx0XG4gICAgICAgIGlmICh0eXBlb2YgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiBpdGVyYXRpb25zIGFyZSBub3QgYXZhaWxhYmxlIHlldCwgdGhlIHNlbGVjdGVkSXRlcmF0aW9uSWQgaXMgYWxyZWFkeSBzZXRcbiAgICAvLyBhbmQgd2lsbCBiZSB1c2VkIHdoZW4gaXRlcmF0aW9ucyBiZWNvbWUgYXZhaWxhYmxlIChoYW5kbGVkIGluIHVwZGF0ZUNvbXBvbmVudEluc3RhbmNlIGFuZCBuZ0RvQ2hlY2spXG4gIH1cblxuICBwcml2YXRlIGhhc1ZhbHVlQ2hhbmdlZChjdXJyZW50OiBhbnksIHByZXZpb3VzOiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyBTaGFsbG93IGNvbXBhcmlzb24gZm9yIHByaW1pdGl2ZXNcbiAgICBpZiAoY3VycmVudCA9PT0gcHJldmlvdXMpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIEhhbmRsZSBudWxsL3VuZGVmaW5lZFxuICAgIGlmIChjdXJyZW50ID09IG51bGwgfHwgcHJldmlvdXMgPT0gbnVsbCkgcmV0dXJuIGN1cnJlbnQgIT09IHByZXZpb3VzO1xuXG4gICAgLy8gRm9yIGFycmF5cywgY2hlY2sgbGVuZ3RoIGFuZCByZWZlcmVuY2VcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSB8fCBBcnJheS5pc0FycmF5KHByZXZpb3VzKSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkgIT09IEFycmF5LmlzQXJyYXkocHJldmlvdXMpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChjdXJyZW50Lmxlbmd0aCAhPT0gcHJldmlvdXMubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBjdXJyZW50ICE9PSBwcmV2aW91czsgLy8gUmVmZXJlbmNlIGNoZWNrXG4gICAgfVxuXG4gICAgLy8gRm9yIG9iamVjdHMsIGRvIHNoYWxsb3cgY29tcGFyaXNvbiAoY2hlY2sgcmVmZXJlbmNlKVxuICAgIGlmICh0eXBlb2YgY3VycmVudCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHByZXZpb3VzID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGN1cnJlbnQgIT09IHByZXZpb3VzOyAvLyBSZWZlcmVuY2UgY2hlY2tcbiAgICB9XG5cbiAgICAvLyBGb3IgcHJpbWl0aXZlc1xuICAgIHJldHVybiBjdXJyZW50ICE9PSBwcmV2aW91cztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWVwIGNvbXBhcmlzb24gZm9yIGJyYW5jaGVzIGFycmF5IHRvIGRldGVjdCBjaGFuZ2VzIGluIG5lc3RlZCBzdWJTdGVwc1xuICAgKi9cbiAgcHJpdmF0ZSBoYXNCcmFuY2hlc0NoYW5nZWQoY3VycmVudDogYW55W10sIHByZXZpb3VzOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIGlmICghY3VycmVudCAmJiAhcHJldmlvdXMpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWN1cnJlbnQgfHwgIXByZXZpb3VzKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoY3VycmVudC5sZW5ndGggIT09IHByZXZpb3VzLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGN1cnJlbnQgPT09IHByZXZpb3VzKSByZXR1cm4gZmFsc2U7IC8vIFNhbWUgcmVmZXJlbmNlXG5cbiAgICAvLyBDb21wYXJlIGVhY2ggYnJhbmNoIGFuZCBpdHMgc3ViU3RlcHNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRCcmFuY2ggPSBjdXJyZW50W2ldO1xuICAgICAgY29uc3QgcHJldmlvdXNCcmFuY2ggPSBwcmV2aW91c1tpXTtcblxuICAgICAgaWYgKCFwcmV2aW91c0JyYW5jaCkgcmV0dXJuIHRydWU7XG5cbiAgICAgIC8vIENoZWNrIGlmIGJyYW5jaCBwcm9wZXJ0aWVzIGNoYW5nZWRcbiAgICAgIGlmIChjdXJyZW50QnJhbmNoLnR5cGUgIT09IHByZXZpb3VzQnJhbmNoLnR5cGUgfHxcbiAgICAgICAgY3VycmVudEJyYW5jaC5sYWJlbCAhPT0gcHJldmlvdXNCcmFuY2gubGFiZWwgfHxcbiAgICAgICAgY3VycmVudEJyYW5jaC5leGVjdXRlZCAhPT0gcHJldmlvdXNCcmFuY2guZXhlY3V0ZWQgfHxcbiAgICAgICAgY3VycmVudEJyYW5jaC5jb25kaXRpb25UeXBlICE9PSBwcmV2aW91c0JyYW5jaC5jb25kaXRpb25UeXBlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBzdWJTdGVwcyBhcnJheSBjaGFuZ2VkIChsZW5ndGggb3IgcmVmZXJlbmNlKVxuICAgICAgY29uc3QgY3VycmVudFN1YlN0ZXBzID0gY3VycmVudEJyYW5jaC5zdWJTdGVwcyB8fCBbXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3ViU3RlcHMgPSBwcmV2aW91c0JyYW5jaC5zdWJTdGVwcyB8fCBbXTtcblxuICAgICAgaWYgKGN1cnJlbnRTdWJTdGVwcy5sZW5ndGggIT09IHByZXZpb3VzU3ViU3RlcHMubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChjdXJyZW50U3ViU3RlcHMgIT09IHByZXZpb3VzU3ViU3RlcHMpIHJldHVybiB0cnVlOyAvLyBSZWZlcmVuY2UgY2hlY2tcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRGVlcCBjb21wYXJpc29uIGZvciBuZXN0ZWRTdGVwcyBhcnJheSB0byBkZXRlY3QgY29udGVudCBjaGFuZ2VzXG4gICAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBjb25kaXRpb24gc3RlcHMgd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBicmFuY2hlc1xuICAgKi9cbiAgcHJpdmF0ZSBoYXNOZXN0ZWRTdGVwc0NoYW5nZWQoY3VycmVudDogYW55W10sIHByZXZpb3VzOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIGlmICghY3VycmVudCAmJiAhcHJldmlvdXMpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWN1cnJlbnQgfHwgIXByZXZpb3VzKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoY3VycmVudC5sZW5ndGggIT09IHByZXZpb3VzLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGN1cnJlbnQgPT09IHByZXZpb3VzKSByZXR1cm4gZmFsc2U7IC8vIFNhbWUgcmVmZXJlbmNlXG5cbiAgICAvLyBDb21wYXJlIGVhY2ggc3RlcCBieSBJRCB0byBkZXRlY3QgY29udGVudCBjaGFuZ2VzXG4gICAgLy8gVGhpcyBoYW5kbGVzIGNhc2VzIHdoZXJlIGFycmF5IGxlbmd0aCBpcyBzYW1lIGJ1dCBjb250ZW50IGRpZmZlcnMgKGUuZy4sIHN3aXRjaGluZyBicmFuY2hlcylcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGVwID0gY3VycmVudFtpXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3RlcCA9IHByZXZpb3VzW2ldO1xuXG4gICAgICBpZiAoIXByZXZpb3VzU3RlcCkgcmV0dXJuIHRydWU7XG5cbiAgICAgIC8vIENvbXBhcmUgc3RlcCBJRHMgLSBpZiBJRHMgZGlmZmVyLCBjb250ZW50IGhhcyBjaGFuZ2VkXG4gICAgICBjb25zdCBjdXJyZW50U3RlcElkID0gY3VycmVudFN0ZXAuaWQgfHwgY3VycmVudFN0ZXAudGVzdFN0ZXBSZXN1bHRJZDtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3RlcElkID0gcHJldmlvdXNTdGVwLmlkIHx8IHByZXZpb3VzU3RlcC50ZXN0U3RlcFJlc3VsdElkO1xuXG4gICAgICBpZiAoY3VycmVudFN0ZXBJZCAhPT0gcHJldmlvdXNTdGVwSWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFsc28gY2hlY2sgaWYgdGhlIHN0ZXAgdHlwZSBjaGFuZ2VkIChpbXBvcnRhbnQgZm9yIGJyYW5jaCBzd2l0Y2hpbmcpXG4gICAgICBpZiAoY3VycmVudFN0ZXAudHlwZSAhPT0gcHJldmlvdXNTdGVwLnR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRlc3RTdGVwVHlwZSBjaGFuZ2VkIChJRiB2cyBFTFNFX0lGIHZzIEVMU0UpXG4gICAgICBpZiAoY3VycmVudFN0ZXAudGVzdFN0ZXBUeXBlICE9PSBwcmV2aW91c1N0ZXAudGVzdFN0ZXBUeXBlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3IgdXBkYXRlIHRva2VuIGlmIHByZXNlbnQgKHVzZWQgdG8gZm9yY2UgcmUtcmVuZGVyKVxuICAgICAgaWYgKGN1cnJlbnRTdGVwLl91cGRhdGVUb2tlbiAmJiBjdXJyZW50U3RlcC5fdXBkYXRlVG9rZW4gIT09IHByZXZpb3VzU3RlcC5fdXBkYXRlVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGVwS2V5KHN0ZXA6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFzdGVwKSByZXR1cm4gJyc7XG4gICAgLy8gQ3JlYXRlIGEga2V5IGZyb20gaW1wb3J0YW50IHByb3BlcnRpZXMgdGhhdCBjaGFuZ2VcbiAgICAvLyBJbmNsdWRlIGV4ZWN1dGlvbkRhdGEuc3RlcFN0YXR1cyBmb3IgbGl2ZSBleGVjdXRpb24gc2NlbmFyaW9zXG4gICAgY29uc3QgZXhlY3V0aW9uU3RhdHVzID0gc3RlcC5leGVjdXRpb25EYXRhPy5zdGVwU3RhdHVzIHx8IHN0ZXAuc3RhdHVzIHx8ICcnO1xuICAgIC8vIEluY2x1ZGUgYnJhbmNoZXMgbGVuZ3RoIGZvciBjb25kaXRpb24tc3RlcCBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgY29uc3QgYnJhbmNoZXNMZW5ndGggPSAoc3RlcC5icmFuY2hlcyB8fCBbXSkubGVuZ3RoO1xuICAgIC8vIEluY2x1ZGUgdG90YWwgc3ViU3RlcHMgY291bnQgYWNyb3NzIGFsbCBicmFuY2hlcyBmb3IgbmVzdGVkIGNoYW5nZSBkZXRlY3Rpb25cbiAgICBjb25zdCB0b3RhbFN1YlN0ZXBzID0gKHN0ZXAuYnJhbmNoZXMgfHwgW10pLnJlZHVjZSgoc3VtOiBudW1iZXIsIGJyYW5jaDogYW55KSA9PiB7XG4gICAgICByZXR1cm4gc3VtICsgKGJyYW5jaC5zdWJTdGVwcz8ubGVuZ3RoIHx8IDApO1xuICAgIH0sIDApO1xuICAgIHJldHVybiBgJHtzdGVwLmlkIHx8ICcnfV8ke2V4ZWN1dGlvblN0YXR1c31fJHtzdGVwLnN0YXR1cyB8fCAnJ31fJHtzdGVwLmR1cmF0aW9uIHx8ICcnfV8ke3N0ZXAuZXhwYW5kZWQgfHwgZmFsc2V9XyR7KHN0ZXAuY2hpbGRyZW4gfHwgW10pLmxlbmd0aH1fJHsoc3RlcC5uZXN0ZWRTdGVwcyB8fCBbXSkubGVuZ3RofV8keyhzdGVwLnN0ZXBzIHx8IFtdKS5sZW5ndGh9XyR7YnJhbmNoZXNMZW5ndGh9XyR7dG90YWxTdWJTdGVwc31fJHtzdGVwLnN0ZXBOdW1iZXIgfHwgJyd9YDtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZENvbXBvbmVudCgpIHtcbiAgICBcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyIHx8ICF0aGlzLnN0ZXApIHJldHVybjtcblxuICAgIGNvbnN0IGN1cnJlbnRTdGVwSWQgPSAodGhpcy5zdGVwIGFzIGFueSkudGVzdFN0ZXBSZXN1bHRJZCB8fCB0aGlzLnN0ZXAuaWQ7XG4gICAgY29uc3QgY3VycmVudFN0ZXBUeXBlID0gdGhpcy5zdGVwLnR5cGU7XG5cbiAgICAvLyBPbmx5IGNsZWFyIGFuZCByZWNyZWF0ZSBpZiBzdGVwIElEIG9yIHR5cGUgYWN0dWFsbHkgY2hhbmdlZFxuICAgIGNvbnN0IG5lZWRzUmVjcmVhdGlvbiA9IHRoaXMubGFzdFN0ZXBJZCAhPT0gY3VycmVudFN0ZXBJZCB8fCB0aGlzLmxhc3RTdGVwVHlwZSAhPT0gY3VycmVudFN0ZXBUeXBlO1xuXG4gICAgaWYgKG5lZWRzUmVjcmVhdGlvbikge1xuICAgICAgdGhpcy5jb250YWluZXIuY2xlYXIoKTtcbiAgICAgIC8vIENsZWFyIHN0b3JlZCBpbnN0YW5jZSB3aGVuIHJlY3JlYXRpbmdcbiAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZGVsZXRlKHRoaXMuY29udGFpbmVyKTtcbiAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmRlbGV0ZSh0aGlzLmNvbnRhaW5lcik7XG4gICAgICB0aGlzLmxhc3RTdGVwSWQgPSBjdXJyZW50U3RlcElkO1xuICAgICAgdGhpcy5sYXN0U3RlcFR5cGUgPSBjdXJyZW50U3RlcFR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHNhbWUgc3RlcCwganVzdCB1cGRhdGUgcHJvcGVydGllcyB3aXRob3V0IGNsZWFyaW5nXG4gICAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAvLyBVcGRhdGUgYWxsIHByb3BlcnRpZXNcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5zdGVwKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgaWYgKGtleSAhPT0gJ3R5cGUnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gKHRoaXMuc3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZyA9IHsgLi4uKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLCAuLi50aGlzLnN0ZXAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUga2V5IGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgIHRoaXMucHJldmlvdXNTdGVwS2V5ID0gdGhpcy5nZXRTdGVwS2V5KHRoaXMuc3RlcCk7XG4gICAgICAgIC8vIENvbXBvbmVudCBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgcmVhZHksIGVtaXQgaW1tZWRpYXRlbHlcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnRSZWFkeS5lbWl0KCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcG9uZW50VHlwZSA9IHRoaXMuY29tcG9uZW50TWFwLmdldCh0aGlzLnN0ZXAudHlwZSk7XG5cbiAgICBpZiAoY29tcG9uZW50VHlwZSkge1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5jb250YWluZXIuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudFR5cGUpO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2U7XG5cbiAgICAgIC8vIFN0b3JlIGNvbXBvbmVudCBpbnN0YW5jZSBhbmQgcmVmIGluIFdlYWtNYXAgZm9yIGZ1dHVyZSB1cGRhdGVzXG4gICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLnNldCh0aGlzLmNvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuc2V0KHRoaXMuY29udGFpbmVyLCBjb21wb25lbnRSZWYpO1xuXG4gICAgICAvLyBTdG9yZSBjb21wb25lbnQgcmVmZXJlbmNlIGZvciBjbGVhbnVwXG4gICAgICAoY29tcG9uZW50UmVmIGFzIGFueSkuX2NvbXBvbmVudFJlZiA9IGNvbXBvbmVudFJlZjtcblxuICAgICAgLy8gU3ByZWFkIGNvbmZpZyBwcm9wZXJ0aWVzIGFzIGluZGl2aWR1YWwgaW5wdXRzIGZvciBjb21wb25lbnRzIHRoYXQgdXNlIGluZGl2aWR1YWwgaW5wdXRzXG4gICAgICAvLyBUaGlzIHN1cHBvcnRzIGJvdGggcGF0dGVybnM6IGNvbXBvbmVudHMgdGhhdCBhY2NlcHQgY29uZmlnIGRpcmVjdGx5IGFuZCB0aG9zZSB0aGF0IHVzZSBpbmRpdmlkdWFsIGlucHV0c1xuICAgICAgT2JqZWN0LmtleXModGhpcy5zdGVwKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGlmIChrZXkgIT09ICd0eXBlJykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSAodGhpcy5zdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogbWFwIGNoaWxkcmVuIHRvIG5lc3RlZFN0ZXBzIGlmIG5lc3RlZFN0ZXBzIGlzIG5vdCBwcmVzZW50XG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdsb29wJyAmJiAodGhpcy5zdGVwIGFzIGFueSkuY2hpbGRyZW4gJiYgISh0aGlzLnN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcykge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5uZXN0ZWRTdGVwcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5jaGlsZHJlbjtcbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBzZXQgbG9vcFR5cGUgYmFzZWQgb24gYWN0aW9uTmFtZSBvciB0ZXN0U3RlcFR5cGVcbiAgICAgIGlmICh0aGlzLnN0ZXAudHlwZSA9PT0gJ2xvb3AnKSB7XG4gICAgICAgIC8vIFNldCBsb29wVHlwZSBpZiBub3QgYWxyZWFkeSBzZXRcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5sb29wVHlwZSkge1xuICAgICAgICAgIGNvbnN0IGFjdGlvbk5hbWUgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uTmFtZTtcbiAgICAgICAgICBjb25zdCB0ZXN0U3RlcFR5cGUgPSAodGhpcy5zdGVwIGFzIGFueSkudGVzdFN0ZXBUeXBlO1xuICAgICAgICAgIGlmIChhY3Rpb25OYW1lID09PSAnRk9SX0xPT1AnIHx8IHRlc3RTdGVwVHlwZSA9PT0gJ0ZPUl9MT09QJykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubG9vcFR5cGUgPSAnZm9yJztcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbk5hbWUgPT09ICdXSElMRV9MT09QJyB8fCB0ZXN0U3RlcFR5cGUgPT09ICdXSElMRV9MT09QJykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubG9vcFR5cGUgPSAnd2hpbGUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgdGl0bGUgaXMgc2V0IGZyb20gYWN0aW9uIGlmIHRpdGxlIGlzIG5vdCBwcmVzZW50IG9yIGVtcHR5XG4gICAgICAgIGlmICgoIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlIHx8ICEoaW5zdGFuY2UgYXMgYW55KS50aXRsZS50cmltKCkpICYmICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS50aXRsZSA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBpbml0aWFsaXplIGl0ZXJhdGlvbnMgaWYgbm90IHByZXNlbnRcbiAgICAgIGlmICh0aGlzLnN0ZXAudHlwZSA9PT0gJ2xvb3AnICYmICEoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiIGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXSBzdGVwXCIsIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCwgKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucylcbiAgICAgICAgLy8gVXNlIGhhbmRsZXIgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdHJ5IHRvIGluaXRpYWxpemUgZnJvbSBzdGVwLmV4ZWN1dGVkUmVzdWx0LnN0ZXBSZXN1bHRcbiAgICAgICAgaWYgKHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucyA9IHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLmV4ZWN1dGVkUmVzdWx0Py5zdGVwUmVzdWx0ICYmIEFycmF5LmlzQXJyYXkoKHRoaXMuc3RlcCBhcyBhbnkpLmV4ZWN1dGVkUmVzdWx0LnN0ZXBSZXN1bHQpKSB7XG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSBpdGVyYXRpb25zIGRpcmVjdGx5IGZyb20gc3RlcFJlc3VsdFxuICAgICAgICAgIGNvbnN0IGl0ZXJhdGlvbnM6IGFueVtdID0gW107XG4gICAgICAgICAgKHRoaXMuc3RlcCBhcyBhbnkpLmV4ZWN1dGVkUmVzdWx0LnN0ZXBSZXN1bHQuZm9yRWFjaCgoaXRlcmF0aW9uOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZXJhdGlvbkluZGV4ID0gaXRlcmF0aW9uLmluZGV4ICE9PSB1bmRlZmluZWQgJiYgaXRlcmF0aW9uLmluZGV4ICE9PSBudWxsID8gaXRlcmF0aW9uLmluZGV4IDogaXRlcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgc3RhdHVzOiAnc3VjY2VzcycgfCAnZmFpbGVkJyB8ICdwZW5kaW5nJyB8ICdydW5uaW5nJyA9ICdwZW5kaW5nJztcbiAgICAgICAgICAgIGlmIChpdGVyYXRpb24uc3RhdHVzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXR1c0xvd2VyID0gaXRlcmF0aW9uLnN0YXR1cy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICBpZiAoc3RhdHVzTG93ZXIgPT09ICdzdWNjZXNzJyB8fCBzdGF0dXNMb3dlciA9PT0gJ3Bhc3NlZCcpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSAnc3VjY2Vzcyc7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzTG93ZXIgPT09ICdmYWlsdXJlJyB8fCBzdGF0dXNMb3dlciA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSAnZmFpbGVkJztcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXNMb3dlciA9PT0gJ3J1bm5pbmcnIHx8IHN0YXR1c0xvd2VyID09PSAnaW5fcHJvZ3Jlc3MnKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzID0gJ3J1bm5pbmcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICBpZDogYGl0ZXItJHtpdGVyYXRpb25JbmRleH1gLFxuICAgICAgICAgICAgICBsYWJlbDogYGl0ZXIgJHtpdGVyYXRpb25JbmRleH1gLFxuICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcbiAgICAgICAgICAgICAgc3ViU3RlcHM6IFtdLFxuICAgICAgICAgICAgICBpbmRleDogaXRlcmF0aW9uSW5kZXhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMgPSBpdGVyYXRpb25zO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogc2V0IGRlZmF1bHRJdGVyYXRpb24gYW5kIHNlbGVjdGVkSXRlcmF0aW9uSWRcbiAgICAgIGlmICh0aGlzLnN0ZXAudHlwZSA9PT0gJ2xvb3AnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiIGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXSBzdGVwIDJcIiwgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkLCAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zKVxuICAgICAgICAvLyBTZXQgZGVmYXVsdEl0ZXJhdGlvbiB0byAnbGFzdCcgaWYgbm90IGFscmVhZHkgc2V0XG4gICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkuZGVmYXVsdEl0ZXJhdGlvbikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRlZmF1bHRJdGVyYXRpb24gPSAnbGFzdCc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgc2VsZWN0ZWRJdGVyYXRpb25JZCAtIHByaW9yaXRpemUgaW5wdXQgdmFsdWUsIHRoZW4gc3RlcCB2YWx1ZSwgdGhlbiBsYXN0IGl0ZXJhdGlvblxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gKHRoaXMuc3RlcCBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2V0IHNlbGVjdGVkSXRlcmF0aW9uSWQgdG8gbGFzdCBpdGVyYXRpb24gaWYgbm90IGFscmVhZHkgc2V0XG4gICAgICAgICAgY29uc3QgaXRlcmF0aW9ucyA9IChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnM7XG4gICAgICAgICAgaWYgKGl0ZXJhdGlvbnMgJiYgQXJyYXkuaXNBcnJheShpdGVyYXRpb25zKSAmJiBpdGVyYXRpb25zLmxlbmd0aCA+IDAgJiYgIShpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RJdGVyYXRpb24gPSBpdGVyYXRpb25zW2l0ZXJhdGlvbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gbGFzdEl0ZXJhdGlvbi5pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3Igc3RlcC1ncm91cDogbWFwIGNoaWxkcmVuIHRvIHN0ZXBzIGlmIHN0ZXBzIGlzIG5vdCBwcmVzZW50XG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdzdGVwLWdyb3VwJyAmJiAodGhpcy5zdGVwIGFzIGFueSkuY2hpbGRyZW4gJiYgISh0aGlzLnN0ZXAgYXMgYW55KS5zdGVwcykge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zdGVwcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5jaGlsZHJlbjtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZ3JvdXBOYW1lID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgY29uZGl0aW9uLXN0ZXA6IHNldCBicmFuY2hlcyBhbmQgY29uZGl0aW9uVGV4dFxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnY29uZGl0aW9uJykge1xuICAgICAgICAvLyBTZXQgYnJhbmNoZXMgLSBwcmlvcml0aXplIHN0ZXAuYnJhbmNoZXMgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIGhhbmRsZXJcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5icmFuY2hlcyAmJiBBcnJheS5pc0FycmF5KCh0aGlzLnN0ZXAgYXMgYW55KS5icmFuY2hlcykpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgZGVlcCBjb3B5IHRvIGVuc3VyZSBwcm9wZXIgY2hhbmdlIGRldGVjdGlvblxuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzID0gKHRoaXMuc3RlcCBhcyBhbnkpLmJyYW5jaGVzLm1hcCgoYnJhbmNoOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAuLi5icmFuY2gsXG4gICAgICAgICAgICBzdWJTdGVwczogYnJhbmNoLnN1YlN0ZXBzID8gWy4uLmJyYW5jaC5zdWJTdGVwc10gOiBbXVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmICghKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgJiYgdGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXIpIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVyQnJhbmNoZXMgPSB0aGlzLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgICAgIC8vIENyZWF0ZSBkZWVwIGNvcHkgdG8gZW5zdXJlIHByb3BlciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgPSBoYW5kbGVyQnJhbmNoZXMubWFwKChicmFuY2g6IGFueSkgPT4gKHtcbiAgICAgICAgICAgIC4uLmJyYW5jaCxcbiAgICAgICAgICAgIHN1YlN0ZXBzOiBicmFuY2guc3ViU3RlcHMgPyBbLi4uYnJhbmNoLnN1YlN0ZXBzXSA6IFtdXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCBjb25kaXRpb25UZXh0IGZyb20gYWN0aW9uIGlmIGNvbmRpdGlvblRleHQgaXMgbm90IHByZXNlbnRcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5jb25kaXRpb25UZXh0ICYmICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25kaXRpb25UZXh0ID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgaXNMb2FkaW5nIHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmICh0aGlzLmlzU3RlcExvYWRpbmdIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNMb2FkaW5nID0gdGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBhc3MgYWN0aXZlQnJhbmNoU3RlcElkIGlmIHByZXNlbnRcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gV2lyZSB1cCBjb21tb24gZXZlbnQgZW1pdHRlcnMgZm9yIGFwaSwgYWktYWdlbnQsIGxvb3AsIGNvbmRpdGlvbiwgYW5kIGJhc2ljIHN0ZXBzXG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdhcGknIHx8IHRoaXMuc3RlcC50eXBlID09PSAnYWktYWdlbnQnIHx8IHRoaXMuc3RlcC50eXBlID09PSAnbG9vcCcgfHwgdGhpcy5zdGVwLnR5cGUgPT09ICdjb25kaXRpb24nIHx8IHRoaXMuc3RlcC50eXBlID09PSAnYmFzaWMnKSB7XG4gICAgICAgIC8vIFN1YnNjcmliZSB0byBjb21tb24gb3V0cHV0IGV2ZW50cyBhbmQgY2FsbCBoYW5kbGVyc1xuICAgICAgICAvLyBFdmVudEVtaXR0ZXJzIGFyZSBTdWJqZWN0cywgc28gd2UgY2FuIHN1YnNjcmliZSB0byB0aGVtXG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5tYWtlQ3VycmVudEJhc2VsaW5lICYmIHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm1ha2VDdXJyZW50QmFzZWxpbmUuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXI/LihldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnVwbG9hZEJhc2VsaW5lICYmIHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS51cGxvYWRCYXNlbGluZS5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXI/LihldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmFuYWx5emUgJiYgdGhpcy5vbkFuYWx5emVIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYW5hbHl6ZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkFuYWx5emVIYW5kbGVyPy4oKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkudmlld0Z1bGxMb2dzICYmIHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudmlld0Z1bGxMb2dzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uVmlld0Z1bGxMb2dzSGFuZGxlcj8uKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQWN0aW9uICYmIHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFjdGlvbi5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXI/LihldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90ZTogb25Kc29uUGF0aENvcGllZEhhbmRsZXIgaXMgc2V0IGFzIGlucHV0IHByb3BlcnR5IChsaW5lIDgyNSksIHNvIHdlIGRvbid0IG5lZWQgdG8gc3Vic2NyaWJlIHRvIGpzb25QYXRoQ29waWVkIGV2ZW50XG4gICAgICAgIC8vIFRoZSBBUEkgc3RlcCBjb21wb25lbnQgY2FsbHMgdGhlIGhhbmRsZXIgZGlyZWN0bHksIGF2b2lkaW5nIGR1cGxpY2F0ZSBjYWxsc1xuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IHdpcmUgdXAgb25WaWV3QWxsSXRlcmF0aW9ucyBldmVudFxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnbG9vcCcpIHtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLm9uVmlld0FsbEl0ZXJhdGlvbnMgJiYgdGhpcy5vblZpZXdBbGxJdGVyYXRpb25zSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm9uVmlld0FsbEl0ZXJhdGlvbnMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXI/Lih0aGlzLnN0ZXApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbmRpdGlvbi1zdGVwOiB3aXJlIHVwIG9uRXhwYW5kIGV2ZW50XG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdjb25kaXRpb24nKSB7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5vbkV4cGFuZCAmJiB0aGlzLm9uRXhwYW5kSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm9uRXhwYW5kLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBDYWxsIG9uRXhwYW5kSGFuZGxlciB3aXRoIHRoZSBzdGVwIGNvbmZpZ1xuICAgICAgICAgICAgdGhpcy5vbkV4cGFuZEhhbmRsZXI/Lih0aGlzLnN0ZXApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdpcmUgdXAgb25CcmFuY2hDbGlja0V2ZW50IGZvciBuZXN0ZWQgY29uZGl0aW9uIHN0ZXBzXG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5vbkJyYW5jaENsaWNrRXZlbnQgJiYgdGhpcy5vbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm9uQnJhbmNoQ2xpY2tFdmVudC5zdWJzY3JpYmUoKGJyYW5jaDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uQ29uZGl0aW9uQnJhbmNoQ2xpY2tIYW5kbGVyPy4odGhpcy5zdGVwLCBicmFuY2gpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEVuc3VyZSBleHBhbmRlZCBwcm9wZXJ0eSBpcyBwYXNzZWQgY29ycmVjdGx5XG4gICAgICAvLyBVc2UgaXNTdGVwRXhwYW5kZWRIYW5kbGVyIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBzdGVwLmV4cGFuZGVkIG9yIHN0ZXAuY29uZmlnLmV4cGFuZGVkXG4gICAgICBpZiAodGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIgJiYgdGhpcy5zdGVwKSB7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkU3RhdGUgPSB0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZCA9IGV4cGFuZGVkU3RhdGU7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZXhwYW5kZWQgPSBleHBhbmRlZFN0YXRlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkID0gKHRoaXMuc3RlcCBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmV4cGFuZGVkID0gKHRoaXMuc3RlcCBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFBhc3MgaGFuZGxlciBmdW5jdGlvbnMgdG8gdGhlIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgaWYgKHRoaXMub25FeHBhbmRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkV4cGFuZEhhbmRsZXIgPSB0aGlzLm9uRXhwYW5kSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyID0gdGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuaXNTdGVwTG9hZGluZ0hhbmRsZXIgPSB0aGlzLmlzU3RlcExvYWRpbmdIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIgPSB0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXIgPSB0aGlzLmNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5mb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlciA9IHRoaXMuZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyID0gdGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmdldExvb3BJdGVyYXRpb25zSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyID0gdGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRBcGlBc3NlcnRpb25zSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZ2V0QXBpQXNzZXJ0aW9uc0hhbmRsZXIgPSB0aGlzLmdldEFwaUFzc2VydGlvbnNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZm9ybWF0QWN0aW9uc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmZvcm1hdEFjdGlvbnNIYW5kbGVyID0gdGhpcy5mb3JtYXRBY3Rpb25zSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblZpZXdBbGxJdGVyYXRpb25zSGFuZGxlciA9IHRoaXMub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyID0gdGhpcy5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyID0gdGhpcy5vblVwbG9hZEJhc2VsaW5lSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uQW5hbHl6ZUhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uQW5hbHl6ZUhhbmRsZXIgPSB0aGlzLm9uQW5hbHl6ZUhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vblZpZXdGdWxsTG9nc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uVmlld0Z1bGxMb2dzSGFuZGxlciA9IHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyID0gdGhpcy5vblNlbGZIZWFsQWN0aW9uSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uQ29uZGl0aW9uQnJhbmNoQ2xpY2tIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlciA9IHRoaXMub25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vblN0ZXBDbGlja0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uU3RlcENsaWNrSGFuZGxlciA9IHRoaXMub25TdGVwQ2xpY2tIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25Kc29uUGF0aENvcGllZEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uSnNvblBhdGhDb3BpZWRIYW5kbGVyID0gdGhpcy5vbkpzb25QYXRoQ29waWVkSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmUgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuaXNVcGxvYWRpbmdCYXNlbGluZSA9IHRoaXMuaXNVcGxvYWRpbmdCYXNlbGluZTtcbiAgICAgIGlmICh0aGlzLmlzTWFraW5nQ3VycmVudEJhc2VsaW5lICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmlzTWFraW5nQ3VycmVudEJhc2VsaW5lID0gdGhpcy5pc01ha2luZ0N1cnJlbnRCYXNlbGluZTtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgIGlmICh0aGlzLmlzTGl2ZSAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5pc0xpdmUgPSB0aGlzLmlzTGl2ZTtcbiAgICAgIC8vIFBhc3MgdGhlIHN0ZXAgb2JqZWN0IHNvIHRvZ2dsZUhlYWRlciBjYW4gdXNlIGl0XG4gICAgICBpZiAodGhpcy5zdGVwKSAoaW5zdGFuY2UgYXMgYW55KS5zdGVwID0gdGhpcy5zdGVwO1xuXG4gICAgICAvLyBVcGRhdGUgY29uZGl0aW9uLXN0ZXAgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgY2hhbmdlIGRldGVjdGlvblxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnY29uZGl0aW9uJykge1xuICAgICAgICAvLyBVcGRhdGUgYWN0aXZlQnJhbmNoU3RlcElkIGlmIGl0IGNoYW5nZWRcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgYnJhbmNoZXMgaWYgdGhleSBjaGFuZ2VkXG4gICAgICAgIGlmICgodGhpcy5zdGVwIGFzIGFueSkuYnJhbmNoZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzID0gKHRoaXMuc3RlcCBhcyBhbnkpLmJyYW5jaGVzO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5icmFuY2hlcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5icmFuY2hlcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgbmVzdGVkU3RlcHMgaWYgdGhleSBjaGFuZ2VkXG4gICAgICAgIGlmICgodGhpcy5zdGVwIGFzIGFueSkubmVzdGVkU3RlcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzID0gKHRoaXMuc3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5uZXN0ZWRTdGVwcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuXG4gICAgICAvLyBBbHNvIHNldCBjb25maWcgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBjb21wb25lbnRzIHRoYXQgc3RpbGwgdXNlIGNvbmZpZyBpbnB1dFxuICAgICAgaWYgKCdjb25maWcnIGluIGluc3RhbmNlKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZyA9IHRoaXMuc3RlcDtcbiAgICAgIH1cblxuICAgICAgLy8gU3RvcmUga2V5IGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICB0aGlzLnByZXZpb3VzU3RlcEtleSA9IHRoaXMuZ2V0U3RlcEtleSh0aGlzLnN0ZXApO1xuXG4gICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbWl0IHJlYWR5IGV2ZW50IGFmdGVyIGNvbXBvbmVudCBpcyBjcmVhdGVkIGFuZCBpbml0aWFsaXplZFxuICAgICAgLy8gVXNlIHNldFRpbWVvdXQgdG8gZW5zdXJlIHRoZSBjb21wb25lbnQgaXMgZnVsbHkgcmVuZGVyZWRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlYWR5LmVtaXQoKTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIG5nRG9DaGVjaygpOiB2b2lkIHtcbiAgICAvLyBVc2UgbmdEb0NoZWNrIHRvIGRldGVjdCBjaGFuZ2VzIGluIG5lc3RlZCBwcm9wZXJ0aWVzIHRoYXQgbmdPbkNoYW5nZXMgbWlnaHQgbWlzc1xuICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG5cbiAgICBpZiAoaW5zdGFuY2UgJiYgY29tcG9uZW50UmVmICYmIHRoaXMuc3RlcCkge1xuICAgICAgLy8gQ2hlY2sgaWYgaXRlcmF0aW9ucyBhcmUgbm93IGF2YWlsYWJsZSBhbmQgd2UgbmVlZCB0byB1cGRhdGUgc2VsZWN0ZWRJdGVyYXRpb25cbiAgICAgIGlmICh0aGlzLnN0ZXAudHlwZSA9PT0gJ2xvb3AnICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgICBjb25zdCBpdGVyYXRpb25zID0gKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucyB8fCAoaW5zdGFuY2UgYXMgYW55KS5jb25maWc/Lml0ZXJhdGlvbnMgfHwgW107XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlcmF0aW9uSWQgPSAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkIHx8IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgY29uc3QgY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb247XG5cbiAgICAgICAgLy8gSWYgaXRlcmF0aW9ucyBhcmUgYXZhaWxhYmxlLCBzZWxlY3RlZEl0ZXJhdGlvbklkIGlzIHNldCwgYnV0IHNlbGVjdGVkSXRlcmF0aW9uIGlzIG5vdCBzZXQgb3IgZG9lc24ndCBtYXRjaFxuICAgICAgICBpZiAoaXRlcmF0aW9ucy5sZW5ndGggPiAwICYmIHNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgICBjb25zdCBzaG91bGRCZVNlbGVjdGVkID0gaXRlcmF0aW9ucy5maW5kKChpdGVyOiBhbnkpID0+IGl0ZXIuaWQgPT09IHNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuICAgICAgICAgIGlmIChzaG91bGRCZVNlbGVjdGVkICYmIGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbj8uaWQgIT09IHNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTG9vcFN0ZXBTZWxlY3RlZEl0ZXJhdGlvbihpbnN0YW5jZSwgc2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50UmVmLmluamVjdG9yKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlQ2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgIGluc3RhbmNlQ2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50S2V5ID0gdGhpcy5nZXRTdGVwS2V5KHRoaXMuc3RlcCk7XG5cbiAgICAgIC8vIElmIHN0ZXAgcHJvcGVydGllcyBjaGFuZ2VkIChldmVuIGlmIHJlZmVyZW5jZSBkaWRuJ3QpLCB1cGRhdGUgdGhlIGluc3RhbmNlXG4gICAgICBpZiAoY3VycmVudEtleSAhPT0gdGhpcy5wcmV2aW91c1N0ZXBLZXkpIHtcbiAgICAgICAgLy8gV2UgbmVlZCB0aGUgcHJldmlvdXMgc3RlcCB0byBjb21wYXJlLCBzbyB3ZSdsbCB1cGRhdGUgYmFzZWQgb24gY3VycmVudCBzdGF0ZVxuICAgICAgICAvLyBDcmVhdGUgYSBtaW5pbWFsIHByZXZpb3VzIHN0ZXAgZnJvbSB0aGUgaW5zdGFuY2UncyBjdXJyZW50IHN0YXRlXG4gICAgICAgIGNvbnN0IHByZXZpb3VzU3RlcDogYW55ID0ge1xuICAgICAgICAgIGlkOiAoaW5zdGFuY2UgYXMgYW55KS5pZCxcbiAgICAgICAgICB0eXBlOiAoaW5zdGFuY2UgYXMgYW55KS50eXBlLFxuICAgICAgICAgIHN0YXR1czogKGluc3RhbmNlIGFzIGFueSkuc3RhdHVzLFxuICAgICAgICAgIGR1cmF0aW9uOiAoaW5zdGFuY2UgYXMgYW55KS5kdXJhdGlvbixcbiAgICAgICAgICBleHBhbmRlZDogKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQsXG4gICAgICAgICAgY2hpbGRyZW46IChpbnN0YW5jZSBhcyBhbnkpLmNoaWxkcmVuLFxuICAgICAgICAgIG5lc3RlZFN0ZXBzOiAoaW5zdGFuY2UgYXMgYW55KS5uZXN0ZWRTdGVwcyxcbiAgICAgICAgICBzdGVwczogKGluc3RhbmNlIGFzIGFueSkuc3RlcHMsXG4gICAgICAgICAgZXhlY3V0aW9uRGF0YTogKGluc3RhbmNlIGFzIGFueSkuZXhlY3V0aW9uRGF0YSxcbiAgICAgICAgICBhY3Rpb246IChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbixcbiAgICAgICAgICB0aXRsZTogKGluc3RhbmNlIGFzIGFueSkudGl0bGUsXG4gICAgICAgICAgcmVzdWx0OiAoaW5zdGFuY2UgYXMgYW55KS5yZXN1bHQsXG4gICAgICAgICAgbWV0aG9kOiAoaW5zdGFuY2UgYXMgYW55KS5tZXRob2QsXG4gICAgICAgICAgZW5kcG9pbnQ6IChpbnN0YW5jZSBhcyBhbnkpLmVuZHBvaW50LFxuICAgICAgICAgIHN0YXR1c0NvZGU6IChpbnN0YW5jZSBhcyBhbnkpLnN0YXR1c0NvZGUsXG4gICAgICAgICAgcmVzcG9uc2VUaW1lOiAoaW5zdGFuY2UgYXMgYW55KS5yZXNwb25zZVRpbWUsXG4gICAgICAgICAgYWN0aW9uczogKGluc3RhbmNlIGFzIGFueSkuYWN0aW9ucyxcbiAgICAgICAgICBwcm9tcHQ6IChpbnN0YW5jZSBhcyBhbnkpLnByb21wdCxcbiAgICAgICAgICBvcHRpbWl6ZWRSdW46IChpbnN0YW5jZSBhcyBhbnkpLm9wdGltaXplZFJ1bixcbiAgICAgICAgICBhY3Rpb25Db3VudDogKGluc3RhbmNlIGFzIGFueSkuYWN0aW9uQ291bnQsXG4gICAgICAgICAgaXRlcmF0aW9uczogKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucyxcbiAgICAgICAgICBzZWxlY3RlZEl0ZXJhdGlvbklkOiAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkLFxuICAgICAgICAgIGJyYW5jaGVzOiAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyxcbiAgICAgICAgICBzdGVwTnVtYmVyOiAoaW5zdGFuY2UgYXMgYW55KS5zdGVwTnVtYmVyLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UodGhpcy5zdGVwLCBwcmV2aW91c1N0ZXApO1xuICAgICAgICB0aGlzLnByZXZpb3VzU3RlcEtleSA9IGN1cnJlbnRLZXk7XG4gICAgICB9XG4gICAgfVxuICB9XG59Il19
1028
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2V4ZWN1dGlvbi1zY3JlZW4vc3RlcC1yZW5kZXJlci9zdGVwLXJlbmRlcmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBMEQsTUFBTSxFQUFFLGlCQUFpQixFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUVyTSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFFNUQ7Ozs7R0FJRztBQUtILE1BQU0sT0FBTyxxQkFBcUI7SUFtQ2hDLFlBQ3NDLFlBQW9DLEVBQ2hFLEdBQXNCO1FBRE0saUJBQVksR0FBWixZQUFZLENBQXdCO1FBQ2hFLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBWnZCLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDdkIsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDLENBQUMsMENBQTBDO1FBS3ZGLGVBQVUsR0FBMkIsSUFBSSxDQUFDO1FBQzFDLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxvQkFBZSxHQUFXLEVBQUUsQ0FBQztJQUtqQyxDQUFDO0lBRUwsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBRTFDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztRQUMvRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsYUFBYSxDQUFDO1FBRXBELDhEQUE4RDtRQUM5RCxNQUFNO1FBQ04scUVBQXFFO1FBQ3JFLGdF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QjtzQkFBMUIsS0FBSztnQkFDRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQzhDLFNBQVM7c0JBQTVELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUN6QyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVHlwZSwgQWZ0ZXJWaWV3SW5pdCwgRG9DaGVjaywgSW5qZWN0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFeGVjdXRpb25TdGVwQ29uZmlnIH0gZnJvbSAnLi4vZXhlY3V0aW9uLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IFNURVBfQ09NUE9ORU5UX01BUCB9IGZyb20gJy4uL3N0ZXAtcmVnaXN0cnkudG9rZW4nO1xuXG4vKipcbiAqIENvbXBvbmVudCB0aGF0IHJlbmRlcnMgdGhlIGFwcHJvcHJpYXRlIHN0ZXAgY29tcG9uZW50IGJhc2VkIG9uIHRoZSBzdGVwIHR5cGUuXG4gKiBVc2VzIGR5bmFtaWMgY29tcG9uZW50IGxvYWRpbmcgYW5kIGFuIGluamVjdGlvbiB0b2tlbiB0byBicmVhayBjaXJjdWxhciBkZXBlbmRlbmNpZXNcbiAqIGJldHdlZW4gc3RlcCBjb21wb25lbnRzIGluIEFuZ3VsYXIgSXZ5IHBhcnRpYWwgY29tcGlsYXRpb24gbW9kZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN0ZXAtcmVuZGVyZXInLFxuICB0ZW1wbGF0ZTogJzxuZy1jb250YWluZXIgI2NvbnRhaW5lcj48L25nLWNvbnRhaW5lcj4nXG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBSZW5kZXJlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgRG9DaGVjayB7XG4gIEBJbnB1dCgpIHN0ZXAhOiBFeGVjdXRpb25TdGVwQ29uZmlnO1xuICBASW5wdXQoKSBvbkV4cGFuZEhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgQElucHV0KCkgZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueTtcbiAgQElucHV0KCkgaXNTdGVwTG9hZGluZ0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgaXNTdGVwRXhwYW5kZWRIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXI/OiAoZHVyYXRpb246IG51bWJlcikgPT4gbnVtYmVyO1xuICBASW5wdXQoKSBmb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55O1xuICBASW5wdXQoKSBnZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnk7XG4gIEBJbnB1dCgpIG9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXI/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25VcGxvYWRCYXNlbGluZUhhbmRsZXI/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25BbmFseXplSGFuZGxlcj86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uVmlld0Z1bGxMb2dzSGFuZGxlcj86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGlzVXBsb2FkaW5nQmFzZWxpbmU/OiBhbnk7XG4gIEBJbnB1dCgpIGlzTWFraW5nQ3VycmVudEJhc2VsaW5lPzogYW55O1xuICBASW5wdXQoKSBzZWxlY3RlZEl0ZXJhdGlvbklkPzogYW55O1xuICBASW5wdXQoKSBnZXRMb29wSXRlcmF0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55W107XG4gIEBJbnB1dCgpIGdldEFwaUFzc2VydGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueVtdO1xuICBASW5wdXQoKSBmb3JtYXRBY3Rpb25zSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnlbXTtcbiAgQElucHV0KCkgb25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgQElucHV0KCkgb25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXI/OiAoc3RlcDogYW55LCBicmFuY2g6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25TdGVwQ2xpY2tIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcsIGV2ZW50PzogRXZlbnQpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uSnNvblBhdGhDb3BpZWRIYW5kbGVyPzogKGV2ZW50OiB7IHBhdGg6IHN0cmluZzsgc291cmNlOiAncmVxdWVzdEJvZHknIHwgJ3Jlc3BvbnNlQm9keScgfCAncmVxdWVzdEhlYWRlcnMnIHwgJ3Jlc3BvbnNlSGVhZGVycycgfSkgPT4gdm9pZDtcbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIGNvbnRhaW5lciE6IFZpZXdDb250YWluZXJSZWY7XG4gIEBJbnB1dCgpIGlzTGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgY29tcG9uZW50UmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiBjb21wb25lbnQgaXMgbG9hZGVkIGFuZCByZWFkeVxuXG4gIC8vIFVzZSBXZWFrTWFwIHRvIHRyYWNrIGNvbXBvbmVudCBpbnN0YW5jZXMgd2l0aG91dCBzdG9yaW5nIHRoZW0gYXMgY2xhc3MgcHJvcGVydGllc1xuICBwcml2YXRlIHN0YXRpYyBjb21wb25lbnRJbnN0YW5jZXMgPSBuZXcgV2Vha01hcDxWaWV3Q29udGFpbmVyUmVmLCBhbnk+KCk7XG4gIHByaXZhdGUgc3RhdGljIGNvbXBvbmVudFJlZnMgPSBuZXcgV2Vha01hcDxWaWV3Q29udGFpbmVyUmVmLCBDb21wb25lbnRSZWY8YW55Pj4oKTtcbiAgcHJpdmF0ZSBsYXN0U3RlcElkOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0U3RlcFR5cGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHByZXZpb3VzU3RlcEtleTogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChTVEVQX0NPTVBPTkVOVF9NQVApIHByaXZhdGUgY29tcG9uZW50TWFwOiBNYXA8c3RyaW5nLCBUeXBlPGFueT4+LFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHsgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyIHx8ICF0aGlzLnN0ZXApIHJldHVybjtcblxuICAgIGNvbnN0IGN1cnJlbnRTdGVwID0gY2hhbmdlc1snc3RlcCddPy5jdXJyZW50VmFsdWUgfHwgdGhpcy5zdGVwO1xuICAgIGNvbnN0IHByZXZpb3VzU3RlcCA9IGNoYW5nZXNbJ3N0ZXAnXT8ucHJldmlvdXNWYWx1ZTtcblxuICAgIC8vIENoZWNrIGlmIHNlbGVjdGVkSXRlcmF0aW9uSWQgaW5wdXQgY2hhbmdlZCAoZm9yIGxvb3Agc3RlcHMpXG4gICAgLy8gJiYgXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RlcC50eXBlID09PSAnbG9vcCcgJiYgXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5sZW5ndGggPiAwO1xuXG4gICAgLy8gSWYgc2VsZWN0ZWRJdGVyYXRpb25JZCBjaGFuZ2VkIGZvciBhIGxvb3Agc3RlcCwgdXBkYXRlIGl0IGRpcmVjdGx5XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXSAmJiBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10uY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10ucHJldmlvdXNWYWx1ZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UgJiYgY29tcG9uZW50UmVmKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXS5jdXJyZW50VmFsdWU7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10ucHJldmlvdXNWYWx1ZTtcblxuICAgICAgICAvLyBBbHdheXMgdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uSWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGZyb20gcGFyZW50XG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRyeSB0byB1cGRhdGUgc2VsZWN0ZWRJdGVyYXRpb24gaWYgaXRlcmF0aW9ucyBhcmUgYXZhaWxhYmxlXG4gICAgICAgICAgdGhpcy51cGRhdGVMb29wU3RlcFNlbGVjdGVkSXRlcmF0aW9uKGluc3RhbmNlLCBjdXJyZW50VmFsdWUpO1xuXG4gICAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBsb29wLXN0ZXAgY29tcG9uZW50XG4gICAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIGlzVXBsb2FkaW5nQmFzZWxpbmUgb3IgaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUgY2hhbmdlZCwgdXBkYXRlIG5lc3RlZCBjb21wb25lbnQgaW5zdGFuY2VzXG4gICAgaWYgKGNoYW5nZXNbJ2lzVXBsb2FkaW5nQmFzZWxpbmUnXSB8fCBjaGFuZ2VzWydpc01ha2luZ0N1cnJlbnRCYXNlbGluZSddKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG5cbiAgICAgIGlmIChpbnN0YW5jZSAmJiBjb21wb25lbnRSZWYpIHtcbiAgICAgICAgLy8gVXBkYXRlIGlzVXBsb2FkaW5nQmFzZWxpbmUgaWYgaXQgY2hhbmdlZFxuICAgICAgICBpZiAoY2hhbmdlc1snaXNVcGxvYWRpbmdCYXNlbGluZSddKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNVcGxvYWRpbmdCYXNlbGluZSA9IHRoaXMuaXNVcGxvYWRpbmdCYXNlbGluZTtcbiAgICAgICAgICAvLyBBbHNvIHVwZGF0ZSBpbiBjb25maWcgaWYgaXQgZXhpc3RzXG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmlzVXBsb2FkaW5nQmFzZWxpbmUgPSB0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGlzTWFraW5nQ3VycmVudEJhc2VsaW5lIGlmIGl0IGNoYW5nZWRcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2lzTWFraW5nQ3VycmVudEJhc2VsaW5lJ10pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc01ha2luZ0N1cnJlbnRCYXNlbGluZSA9IHRoaXMuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmU7XG4gICAgICAgICAgLy8gQWxzbyB1cGRhdGUgaW4gY29uZmlnIGlmIGl0IGV4aXN0c1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5pc01ha2luZ0N1cnJlbnRCYXNlbGluZSA9IHRoaXMuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIGluc3RhbmNlQ2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgc3RlcCBpZGVudGlmaWVyc1xuICAgIGNvbnN0IGN1cnJlbnRTdGVwSWQgPSBjdXJyZW50U3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IGN1cnJlbnRTdGVwLmlkO1xuICAgIGNvbnN0IGN1cnJlbnRTdGVwVHlwZSA9IGN1cnJlbnRTdGVwLnR5cGU7XG5cbiAgICAvLyBVc2Ugc3RvcmVkIGxhc3RTdGVwSWQgYW5kIGxhc3RTdGVwVHlwZSB0byBwcm9wZXJseSBkZXRlY3QgY2hhbmdlc1xuICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVuIHN0ZXAgb2JqZWN0IHJlZmVyZW5jZSBkb2Vzbid0IGNoYW5nZSBidXQgcHJvcGVydGllcyBkb1xuICAgIC8vIE9ubHkgY2hlY2sgZm9yIGFjdHVhbCBJRC90eXBlIGNoYW5nZXMsIG5vdCBqdXN0IHJlZmVyZW5jZSBjaGFuZ2VzXG4gICAgLy8gY29uc3Qgc3RlcFR5cGVDaGFuZ2VkID0gIXByZXZpb3VzU3RlcCB8fCBjdXJyZW50U3RlcFR5cGUgIT09IChwcmV2aW91c1N0ZXAudHlwZSB8fCB0aGlzLmxhc3RTdGVwVHlwZSk7XG4gICAgLy8gY29uc3Qgc3RlcElkQ2hhbmdlZCA9ICFwcmV2aW91c1N0ZXAgfHwgY3VycmVudFN0ZXBJZCAhPT0gKHByZXZpb3VzU3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IHByZXZpb3VzU3RlcC5pZCB8fCB0aGlzLmxhc3RTdGVwSWQpO1xuICAgIGNvbnN0IHN0ZXBUeXBlQ2hhbmdlZCA9IGN1cnJlbnRTdGVwVHlwZSAhPT0gdGhpcy5sYXN0U3RlcFR5cGU7XG4gICAgY29uc3Qgc3RlcElkQ2hhbmdlZCA9IGN1cnJlbnRTdGVwSWQgIT09IHRoaXMubGFzdFN0ZXBJZDtcbiAgICBcbiAgICAvLyBPbmx5IGxvYWQgY29tcG9uZW50IGlmIHN0ZXAgSUQgb3IgdHlwZSBhY3R1YWxseSBjaGFuZ2VkXG4gICAgLy8gVGhpcyBwcmV2ZW50cyB1bm5lY2Vzc2FyeSByZWxvYWRzIHdoZW4gb25seSBuZXN0ZWQgcHJvcGVydGllcyBjaGFuZ2VcbiAgICBpZiAoc3RlcFR5cGVDaGFuZ2VkIHx8IHN0ZXBJZENoYW5nZWQpIHtcbiAgICAgIHRoaXMubGFzdFN0ZXBJZCA9IGN1cnJlbnRTdGVwSWQ7XG4gICAgICB0aGlzLmxhc3RTdGVwVHlwZSA9IGN1cnJlbnRTdGVwVHlwZTtcbiAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICB0aGlzLmxvYWRDb21wb25lbnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IG5lc3RlZCBkYXRhIGNoYW5nZWQgKGNoaWxkcmVuLCBuZXN0ZWRTdGVwcywgc3RlcHMsIGV4cGFuZGVkKSwgXG4gICAgLy8gdXBkYXRlIHByb3BlcnRpZXMgd2l0aG91dCByZWNyZWF0aW5nIGNvbXBvbmVudCB0byBwcmV2ZW50IGJsaW5raW5nXG4gICAgLy8gVGhpcyBwcmV2ZW50cyBwYXJlbnQgc3RlcHMgZnJvbSBibGlua2luZyB3aGVuIG5lc3RlZCBzdGVwcyBleHBhbmRcbiAgICBjb25zdCBvbmx5TmVzdGVkRGF0YUNoYW5nZWQgPSBwcmV2aW91c1N0ZXAgJiYgKFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyB8fFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4gIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5jaGlsZHJlbiB8fFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuc3RlcHMgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5zdGVwcyB8fFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuZXhwYW5kZWQgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5leHBhbmRlZCB8fFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuYWN0aXZlQnJhbmNoU3RlcElkICE9PSAocHJldmlvdXNTdGVwIGFzIGFueSkuYWN0aXZlQnJhbmNoU3RlcElkIHx8XG4gICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5icmFuY2hlcyAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmJyYW5jaGVzIHx8XG4gICAgICAoKGN1cnJlbnRTdGVwIGFzIGFueSkuY29uZmlnICYmIChjdXJyZW50U3RlcCBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmNvbmZpZz8uZXhwYW5kZWQpXG4gICAgKTtcblxuICAgIC8vIFVwZGF0ZSBwcm9wZXJ0aWVzIHdpdGhvdXQgcmVjcmVhdGluZyBjb21wb25lbnQgdG8gcHJldmVudCBibGlua2luZ1xuICAgIGlmIChvbmx5TmVzdGVkRGF0YUNoYW5nZWQgJiYgdGhpcy5jb250YWluZXIubGVuZ3RoID4gMCkge1xuICAgICAgLy8gR2V0IHRoZSBzdG9yZWQgY29tcG9uZW50IGluc3RhbmNlXG4gICAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG5cbiAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAvLyBVc2UgY29tcHJlaGVuc2l2ZSB1cGRhdGUgbWV0aG9kIGZyb20gb3JpZ2luYWxcbiAgICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRJbnN0YW5jZShjdXJyZW50U3RlcCwgcHJldmlvdXNTdGVwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGb3Igb3RoZXIgY2hhbmdlcywgdXNlIGNvbXByZWhlbnNpdmUgdXBkYXRlIGlmIGNvbXBvbmVudCBleGlzdHNcbiAgICBpZiAodGhpcy5jb250YWluZXIubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UgJiYgcHJldmlvdXNTdGVwICYmIGN1cnJlbnRTdGVwICYmXG4gICAgICAgIHByZXZpb3VzU3RlcC50eXBlID09PSBjdXJyZW50U3RlcC50eXBlICYmXG4gICAgICAgIChwcmV2aW91c1N0ZXAudGVzdFN0ZXBSZXN1bHRJZCB8fCBwcmV2aW91c1N0ZXAuaWQpID09PSAoY3VycmVudFN0ZXAudGVzdFN0ZXBSZXN1bHRJZCB8fCBjdXJyZW50U3RlcC5pZCkpIHtcbiAgICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIGNvbXBvbmVudCBpbnN0YW5jZSB3aXRoIG5ldyBzdGVwIHByb3BlcnRpZXNcbiAgICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRJbnN0YW5jZShjdXJyZW50U3RlcCwgcHJldmlvdXNTdGVwKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9ubHkgbG9hZCBjb21wb25lbnQgaWYgY29udGFpbmVyIGlzIGVtcHR5IChjb21wb25lbnQgZG9lc24ndCBleGlzdCB5ZXQpXG4gICAgLy8gVGhpcyBwcmV2ZW50cyB1bm5lY2Vzc2FyeSByZWxvYWRzXG4gICAgaWYgKHRoaXMuY29udGFpbmVyICYmIHRoaXMuY29udGFpbmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5sb2FkQ29tcG9uZW50KCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb21wb25lbnRJbnN0YW5jZShjdXJyZW50U3RlcDogYW55LCBwcmV2aW91c1N0ZXA6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG5cbiAgICBpZiAoIWluc3RhbmNlIHx8ICFjb21wb25lbnRSZWYgfHwgIXRoaXMuY29udGFpbmVyKSByZXR1cm47XG5cbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgLy8gTGlzdCBvZiBwcm9wZXJ0aWVzIHRoYXQgY29tbW9ubHkgY2hhbmdlIGFuZCBuZWVkIHRvIGJlIHVwZGF0ZWRcbiAgICBjb25zdCBpbXBvcnRhbnRQcm9wZXJ0aWVzID0gWydzdGF0dXMnLCAnZHVyYXRpb24nLCAnZXhwYW5kZWQnLCAnc3ViU3RlcHMnLCAnY2hpbGRyZW4nLCAnbmVzdGVkU3RlcHMnLCAnc3RlcHMnLFxuICAgICAgJ2V4ZWN1dGlvbkRhdGEnLCAnYWN0aW9uJywgJ3RpdGxlJywgJ3Jlc3VsdCcsICdtZXRob2QnLCAnZW5kcG9pbnQnLCAnc3RhdHVzQ29kZScsICdicmFuY2hlcycsXG4gICAgICAncmVzcG9uc2VUaW1lJywgJ2FjdGlvbnMnLCAncHJvbXB0JywgJ29wdGltaXplZFJ1bicsICdhY3Rpb25Db3VudCcsICdpdGVyYXRpb25zJywgJ3NlbGVjdGVkSXRlcmF0aW9uSWQnLCAnc3RlcE51bWJlcicsXG4gICAgICAnaXNVcGxvYWRpbmdCYXNlbGluZScsICdpc01ha2luZ0N1cnJlbnRCYXNlbGluZScsICdzZWxlY3RlZFRhYklucHV0JywgJ3N0ZXBEZWxldGVkJ107XG5cbiAgICAvLyBVcGRhdGUgaW1wb3J0YW50IHByb3BlcnRpZXNcbiAgICBpbXBvcnRhbnRQcm9wZXJ0aWVzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIC8vIEZvciBzZWxlY3RlZEl0ZXJhdGlvbklkIG9uIGxvb3Agc3RlcHMsIHByaW9yaXRpemUgdGhlIGlucHV0IHZhbHVlIG92ZXIgc3RlcCB2YWx1ZVxuICAgICAgaWYgKGtleSA9PT0gJ3NlbGVjdGVkSXRlcmF0aW9uSWQnICYmIGN1cnJlbnRTdGVwLnR5cGUgPT09ICdsb29wJyAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAoaW5zdGFuY2UgYXMgYW55KVtrZXldO1xuICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZUNoYW5nZWQoY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRyeSB0byB1cGRhdGUgc2VsZWN0ZWRJdGVyYXRpb24gaWYgaXRlcmF0aW9ucyBhcmUgYXZhaWxhYmxlXG4gICAgICAgICAgdGhpcy51cGRhdGVMb29wU3RlcFNlbGVjdGVkSXRlcmF0aW9uKGluc3RhbmNlLCBjdXJyZW50VmFsdWUpO1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2l0ZXJhdGlvbnMnICYmIGN1cnJlbnRTdGVwLnR5cGUgPT09ICdsb29wJykge1xuICAgICAgICAvLyBXaGVuIGl0ZXJhdGlvbnMgYXJlIHVwZGF0ZWQsIGNoZWNrIGlmIHdlIG5lZWQgdG8gdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50U3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAocHJldmlvdXNTdGVwIGFzIGFueSlba2V5XTtcblxuICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZUNoYW5nZWQoY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gQWZ0ZXIgaXRlcmF0aW9ucyBhcmUgdXBkYXRlZCwgdHJ5IHRvIHVwZGF0ZSBzZWxlY3RlZEl0ZXJhdGlvbiBpZiBzZWxlY3RlZEl0ZXJhdGlvbklkIGlzIHNldFxuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlcmF0aW9uSWQgPSAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkIHx8IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMb29wU3RlcFNlbGVjdGVkSXRlcmF0aW9uKGluc3RhbmNlLCBzZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnaXNVcGxvYWRpbmdCYXNlbGluZScgfHwga2V5ID09PSAnaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUnKSB7XG4gICAgICAgIC8vIEZvciBsb2FkaW5nIHN0YXRlIG9iamVjdHMsIGFsd2F5cyB1c2UgdGhlIGlucHV0IHZhbHVlICh0aGV5J3JlIHBhc3NlZCBmcm9tIHBhcmVudClcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0ga2V5ID09PSAnaXNVcGxvYWRpbmdCYXNlbGluZScgPyB0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmUgOiB0aGlzLmlzTWFraW5nQ3VycmVudEJhc2VsaW5lO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKGluc3RhbmNlIGFzIGFueSlba2V5XTtcblxuICAgICAgICAvLyBBbHdheXMgdXBkYXRlIGlmIHRoZSByZWZlcmVuY2UgY2hhbmdlZCAobmV3IG9iamVjdCBjcmVhdGVkKVxuICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWdba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnYWN0aW9uJyAmJiBjdXJyZW50U3RlcC50eXBlID09PSAnYWktYWdlbnQnKSB7XG4gICAgICAgIC8vIEZvciBhaS1hZ2VudCBzdGVwcywgZW5zdXJlIHRpdGxlIGFuZCBwcm9tcHQgYXJlIHNldCBmcm9tIGFjdGlvblxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSAoY3VycmVudFN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAvLyBVcGRhdGUgYWN0aW9uXG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIEFsc28gdXBkYXRlIHRpdGxlIGFuZCBwcm9tcHQgZnJvbSBhY3Rpb24gaWYgdGhleSdyZSBub3Qgc2V0IG9yIGVtcHR5XG4gICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS50aXRsZSB8fCAhKGluc3RhbmNlIGFzIGFueSkudGl0bGUudHJpbSgpKSB7XG4gICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnRpdGxlID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnRpdGxlID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLnByb21wdCB8fCAhKGluc3RhbmNlIGFzIGFueSkucHJvbXB0LnRyaW0oKSkge1xuICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQgPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcucHJvbXB0ID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSAoY3VycmVudFN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgLy8gVXNlIGRlZXAgY29tcGFyaXNvbiBmb3Igb2JqZWN0cy9hcnJheXMsIHNoYWxsb3cgZm9yIHByaW1pdGl2ZXNcbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBBbHNvIHVwZGF0ZSBhbGwgb3RoZXIgcHJvcGVydGllc1xuICAgIE9iamVjdC5rZXlzKGN1cnJlbnRTdGVwKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoa2V5ICE9PSAndHlwZScgJiYgIWltcG9ydGFudFByb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSAoY3VycmVudFN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgc3BlY2lhbCBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgbmVlZCBzcGVjaWFsIGhhbmRsaW5nXG4gICAgaWYgKGN1cnJlbnRTdGVwLnR5cGUgPT09ICdsb29wJyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbiAmJiAhKGN1cnJlbnRTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMpIHtcbiAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5uZXN0ZWRTdGVwcyAhPT0gKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4pIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbjtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5uZXN0ZWRTdGVwcyA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdXJyZW50U3RlcC50eXBlID09PSAnc3RlcC1ncm91cCcgJiYgKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4gJiYgIShjdXJyZW50U3RlcCBhcyBhbnkpLnN0ZXBzKSB7XG4gICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuc3RlcHMgIT09IChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBzID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc3RlcHMgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogZW5zdXJlIGJyYW5jaGVzIGlzIHByb3Blcmx5IHVwZGF0ZWRcbiAgICAvLyBVc2UgZGVlcCBjb21wYXJpc29uIHRvIGRldGVjdCBjaGFuZ2VzIGluIG5lc3RlZCBzdWJTdGVwc1xuICAgIGlmIChjdXJyZW50U3RlcC50eXBlID09PSAnY29uZGl0aW9uJyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5icmFuY2hlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50QnJhbmNoZXMgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5icmFuY2hlcyB8fCBbXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzQnJhbmNoZXMgPSAocHJldmlvdXNTdGVwIGFzIGFueSkuYnJhbmNoZXMgfHwgW107XG5cbiAgICAgIC8vIFVzZSBkZWVwIGNvbXBhcmlzb24gdG8gZGV0ZWN0IG5lc3RlZCBzdWJTdGVwcyBjaGFuZ2VzXG4gICAgICBpZiAodGhpcy5oYXNCcmFuY2hlc0NoYW5nZWQoY3VycmVudEJyYW5jaGVzLCBwcmV2aW91c0JyYW5jaGVzKSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIGVuc3VyZSBjaGFuZ2UgZGV0ZWN0aW9uIHRyaWdnZXJzXG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzID0gWy4uLmN1cnJlbnRCcmFuY2hlcy5tYXAoKGJyYW5jaDogYW55KSA9PiAoe1xuICAgICAgICAgIC4uLmJyYW5jaCxcbiAgICAgICAgICBzdWJTdGVwczogYnJhbmNoLnN1YlN0ZXBzID8gWy4uLmJyYW5jaC5zdWJTdGVwc10gOiBbXVxuICAgICAgICB9KSldO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmJyYW5jaGVzID0gKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXM7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgY29uZGl0aW9uLXN0ZXA6IGVuc3VyZSBuZXN0ZWRTdGVwcyBpcyBwcm9wZXJseSB1cGRhdGVkXG4gICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgd2hlbiBjaGlsZHJlbiBhcmUgbG9hZGVkIGZyb20gdGhlIEFQSSBvciB3aGVuIHN3aXRjaGluZyBicmFuY2hlc1xuICAgIGlmIChjdXJyZW50U3RlcC50eXBlID09PSAnY29uZGl0aW9uJyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50TmVzdGVkU3RlcHMgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyB8fCBbXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzTmVzdGVkU3RlcHMgPSAocHJldmlvdXNTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMgfHwgW107XG4gICAgICBjb25zb2xlLmxvZygn8J+UhCBzdGVwLXJlbmRlcmVyOiBjdXJyZW50TmVzdGVkU3RlcHMnLCBjdXJyZW50TmVzdGVkU3RlcHMpO1xuICAgICAgY29uc29sZS5sb2coJ/CflIQgc3RlcC1yZW5kZXJlcjogcHJldmlvdXNOZXN0ZWRTdGVwcycsIHByZXZpb3VzTmVzdGVkU3RlcHMpO1xuICAgICAgLy8gVXNlIGRlZXAgY29tcGFyaXNvbiB0byBkZXRlY3QgY29udGVudCBjaGFuZ2VzLCBub3QganVzdCByZWZlcmVuY2UgY2hhbmdlc1xuICAgICAgLy8gVGhpcyBpcyBjcml0aWNhbCB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIElGIGFuZCBFTFNFX0lGIGJyYW5jaGVzXG4gICAgICBpZiAodGhpcy5oYXNOZXN0ZWRTdGVwc0NoYW5nZWQoY3VycmVudE5lc3RlZFN0ZXBzLCBwcmV2aW91c05lc3RlZFN0ZXBzKSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIGVuc3VyZSBjaGFuZ2UgZGV0ZWN0aW9uIHRyaWdnZXJzXG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzID0gWy4uLmN1cnJlbnROZXN0ZWRTdGVwc107XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcubmVzdGVkU3RlcHMgPSBbLi4uY3VycmVudE5lc3RlZFN0ZXBzXTtcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS5sb2coJ/CflIQgc3RlcC1yZW5kZXJlcjogbmVzdGVkU3RlcHMgdXBkYXRlZCBmb3IgY29uZGl0aW9uLXN0ZXAnLCB7XG4gICAgICAgICAgc3RlcElkOiBjdXJyZW50U3RlcC5pZCxcbiAgICAgICAgICBwcmV2aW91c0NvdW50OiBwcmV2aW91c05lc3RlZFN0ZXBzLmxlbmd0aCxcbiAgICAgICAgICBjdXJyZW50Q291bnQ6IGN1cnJlbnROZXN0ZWRTdGVwcy5sZW5ndGhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBlbnN1cmUgc2VsZWN0ZWRJdGVyYXRpb25JZCBmcm9tIGlucHV0IGlzIHVzZWRcbiAgICBpZiAoY3VycmVudFN0ZXAudHlwZSA9PT0gJ2xvb3AnICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZCA9IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgIGNvbnN0IGluc3RhbmNlU2VsZWN0ZWRJdGVyYXRpb25JZCA9IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG5cbiAgICAgIC8vIE5vcm1hbGl6ZSB2YWx1ZXMgdG8gaGFuZGxlIG51bGwvdW5kZWZpbmVkIGNvbnNpc3RlbnRseVxuICAgICAgY29uc3Qgbm9ybWFsaXplVmFsdWUgPSAodmFsOiBhbnkpID0+IHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKHZhbCk7XG4gICAgICBjb25zdCBjdXJyZW50Tm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZhbHVlKGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgIGNvbnN0IGluc3RhbmNlTm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZhbHVlKGluc3RhbmNlU2VsZWN0ZWRJdGVyYXRpb25JZCk7XG5cbiAgICAgIGlmIChjdXJyZW50Tm9ybWFsaXplZCAhPT0gaW5zdGFuY2VOb3JtYWxpemVkKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBlbnN1cmUgc2VsZWN0ZWRJdGVyYXRpb25JZCBmcm9tIGlucHV0IGlzIHVzZWRcbiAgICBpZiAoY3VycmVudFN0ZXAudHlwZSA9PT0gJ2xvb3AnICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZCA9IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgIGNvbnN0IGluc3RhbmNlU2VsZWN0ZWRJdGVyYXRpb25JZCA9IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG5cbiAgICAgIC8vIE5vcm1hbGl6ZSB2YWx1ZXMgdG8gaGFuZGxlIG51bGwvdW5kZWZpbmVkIGNvbnNpc3RlbnRseVxuICAgICAgY29uc3Qgbm9ybWFsaXplVmFsdWUgPSAodmFsOiBhbnkpID0+IHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKHZhbCk7XG4gICAgICBjb25zdCBjdXJyZW50Tm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZhbHVlKGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgIGNvbnN0IGluc3RhbmNlTm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZhbHVlKGluc3RhbmNlU2VsZWN0ZWRJdGVyYXRpb25JZCk7XG5cbiAgICAgIGlmIChjdXJyZW50Tm9ybWFsaXplZCAhPT0gaW5zdGFuY2VOb3JtYWxpemVkKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGV4cGFuZGVkIHN0YXRlXG4gICAgaWYgKHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyICYmIGN1cnJlbnRTdGVwKSB7XG4gICAgICBjb25zdCBleHBhbmRlZFN0YXRlID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIoY3VycmVudFN0ZXApO1xuICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkICE9PSBleHBhbmRlZFN0YXRlKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkID0gZXhwYW5kZWRTdGF0ZTtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCA9IGV4cGFuZGVkU3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgoY3VycmVudFN0ZXAgYXMgYW55KS5leHBhbmRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQgIT09IChjdXJyZW50U3RlcCBhcyBhbnkpLmV4cGFuZGVkKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuZXhwYW5kZWQ7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZXhwYW5kZWQgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY29uZmlnIHJlZmVyZW5jZSAtIGVuc3VyZSBhbGwgcHJvcGVydGllcyBpbmNsdWRpbmcgYnJhbmNoZXMgYXJlIGluY2x1ZGVkXG4gICAgaWYgKCdjb25maWcnIGluIGluc3RhbmNlKSB7XG4gICAgICAvLyBVcGRhdGUgY29uZmlnIHdpdGggY3VycmVudCBzdGVwIHRvIGVuc3VyZSBhbGwgcHJvcGVydGllcyBpbmNsdWRpbmcgYnJhbmNoZXMgYXJlIHN5bmNlZFxuICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0geyAuLi4oaW5zdGFuY2UgYXMgYW55KS5jb25maWcsIC4uLmN1cnJlbnRTdGVwIH07XG4gICAgICAvLyBFeHBsaWNpdGx5IGVuc3VyZSBicmFuY2hlcyBpcyB1cGRhdGVkIGZvciBjb25kaXRpb24tc3RlcCAoaW4gY2FzZSBpdCB3YXMgbmVzdGVkKVxuICAgICAgLy8gVXNlIHRoZSBhbHJlYWR5IHVwZGF0ZWQgYnJhbmNoZXMgZnJvbSBpbnN0YW5jZSB0byBtYWludGFpbiByZWZlcmVuY2UgY29uc2lzdGVuY3lcbiAgICAgIGlmIChjdXJyZW50U3RlcC50eXBlID09PSAnY29uZGl0aW9uJyAmJiAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5icmFuY2hlcyA9IChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBzdGVwIHByb3BlcnR5IGlmIGl0IGV4aXN0cyBvbiB0aGUgaW5zdGFuY2VcbiAgICBpZiAoJ3N0ZXAnIGluIGluc3RhbmNlKSB7XG4gICAgICAoaW5zdGFuY2UgYXMgYW55KS5zdGVwID0gY3VycmVudFN0ZXA7XG4gICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSBpZiB0aGVyZSB3ZXJlIGNoYW5nZXNcbiAgICAvLyBUaGlzIGVuc3VyZXMgb25seSB0aGUgbmVzdGVkIHN0ZXAgdXBkYXRlcyB3aXRob3V0IGFmZmVjdGluZyBwYXJlbnQgc3RlcHNcbiAgICBpZiAoaGFzQ2hhbmdlcykge1xuICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICBpbnN0YW5jZUNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoKGluc3RhbmNlIGFzIGFueSkuY2RyKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9IGVsc2UgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IGNhbGwgbWFya0ZvckNoZWNrIG9uIHRoaXMgY29tcG9uZW50IHRvIGF2b2lkIHRyaWdnZXJpbmcgcGFyZW50IHJlLXJlbmRlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byB1cGRhdGUgbG9vcC1zdGVwIHNlbGVjdGVkSXRlcmF0aW9uIHdoZW4gc2VsZWN0ZWRJdGVyYXRpb25JZCBjaGFuZ2VzXG4gICAqIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBpdGVyYXRpb25zIG1pZ2h0IG5vdCBiZSBsb2FkZWQgeWV0XG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUxvb3BTdGVwU2VsZWN0ZWRJdGVyYXRpb24oaW5zdGFuY2U6IGFueSwgc2VsZWN0ZWRJdGVyYXRpb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgaXRlcmF0aW9ucyA9IChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMgfHwgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnPy5pdGVyYXRpb25zIHx8IFtdO1xuXG4gICAgaWYgKGl0ZXJhdGlvbnMgJiYgaXRlcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgICBjb25zdCBmb3VuZCA9IGl0ZXJhdGlvbnMuZmluZCgoaXRlcjogYW55KSA9PiBpdGVyLmlkID09PSBzZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb24gPSBmb3VuZDtcbiAgICAgICAgICAvLyBTeW5jIHVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkIHdpdGggdGhlIGlucHV0IHZhbHVlXG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkID0gc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgbm90IGZvdW5kLCBzZWxlY3QgZGVmYXVsdFxuICAgICAgICAgIGlmICh0eXBlb2YgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgbm8gdmFsdWUgcHJvdmlkZWQsIHNlbGVjdCBkZWZhdWx0XG4gICAgICAgIGlmICh0eXBlb2YgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiBpdGVyYXRpb25zIGFyZSBub3QgYXZhaWxhYmxlIHlldCwgdGhlIHNlbGVjdGVkSXRlcmF0aW9uSWQgaXMgYWxyZWFkeSBzZXRcbiAgICAvLyBhbmQgd2lsbCBiZSB1c2VkIHdoZW4gaXRlcmF0aW9ucyBiZWNvbWUgYXZhaWxhYmxlIChoYW5kbGVkIGluIHVwZGF0ZUNvbXBvbmVudEluc3RhbmNlIGFuZCBuZ0RvQ2hlY2spXG4gIH1cblxuICBwcml2YXRlIGhhc1ZhbHVlQ2hhbmdlZChjdXJyZW50OiBhbnksIHByZXZpb3VzOiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyBTaGFsbG93IGNvbXBhcmlzb24gZm9yIHByaW1pdGl2ZXNcbiAgICBpZiAoY3VycmVudCA9PT0gcHJldmlvdXMpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIEhhbmRsZSBudWxsL3VuZGVmaW5lZFxuICAgIGlmIChjdXJyZW50ID09IG51bGwgfHwgcHJldmlvdXMgPT0gbnVsbCkgcmV0dXJuIGN1cnJlbnQgIT09IHByZXZpb3VzO1xuXG4gICAgLy8gRm9yIGFycmF5cywgY2hlY2sgbGVuZ3RoIGFuZCByZWZlcmVuY2VcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSB8fCBBcnJheS5pc0FycmF5KHByZXZpb3VzKSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkgIT09IEFycmF5LmlzQXJyYXkocHJldmlvdXMpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChjdXJyZW50Lmxlbmd0aCAhPT0gcHJldmlvdXMubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBjdXJyZW50ICE9PSBwcmV2aW91czsgLy8gUmVmZXJlbmNlIGNoZWNrXG4gICAgfVxuXG4gICAgLy8gRm9yIG9iamVjdHMsIGRvIHNoYWxsb3cgY29tcGFyaXNvbiAoY2hlY2sgcmVmZXJlbmNlKVxuICAgIGlmICh0eXBlb2YgY3VycmVudCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHByZXZpb3VzID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGN1cnJlbnQgIT09IHByZXZpb3VzOyAvLyBSZWZlcmVuY2UgY2hlY2tcbiAgICB9XG5cbiAgICAvLyBGb3IgcHJpbWl0aXZlc1xuICAgIHJldHVybiBjdXJyZW50ICE9PSBwcmV2aW91cztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWVwIGNvbXBhcmlzb24gZm9yIGJyYW5jaGVzIGFycmF5IHRvIGRldGVjdCBjaGFuZ2VzIGluIG5lc3RlZCBzdWJTdGVwc1xuICAgKi9cbiAgcHJpdmF0ZSBoYXNCcmFuY2hlc0NoYW5nZWQoY3VycmVudDogYW55W10sIHByZXZpb3VzOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIGlmICghY3VycmVudCAmJiAhcHJldmlvdXMpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWN1cnJlbnQgfHwgIXByZXZpb3VzKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoY3VycmVudC5sZW5ndGggIT09IHByZXZpb3VzLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGN1cnJlbnQgPT09IHByZXZpb3VzKSByZXR1cm4gZmFsc2U7IC8vIFNhbWUgcmVmZXJlbmNlXG5cbiAgICAvLyBDb21wYXJlIGVhY2ggYnJhbmNoIGFuZCBpdHMgc3ViU3RlcHNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRCcmFuY2ggPSBjdXJyZW50W2ldO1xuICAgICAgY29uc3QgcHJldmlvdXNCcmFuY2ggPSBwcmV2aW91c1tpXTtcblxuICAgICAgaWYgKCFwcmV2aW91c0JyYW5jaCkgcmV0dXJuIHRydWU7XG5cbiAgICAgIC8vIENoZWNrIGlmIGJyYW5jaCBwcm9wZXJ0aWVzIGNoYW5nZWRcbiAgICAgIGlmIChjdXJyZW50QnJhbmNoLnR5cGUgIT09IHByZXZpb3VzQnJhbmNoLnR5cGUgfHxcbiAgICAgICAgY3VycmVudEJyYW5jaC5sYWJlbCAhPT0gcHJldmlvdXNCcmFuY2gubGFiZWwgfHxcbiAgICAgICAgY3VycmVudEJyYW5jaC5leGVjdXRlZCAhPT0gcHJldmlvdXNCcmFuY2guZXhlY3V0ZWQgfHxcbiAgICAgICAgY3VycmVudEJyYW5jaC5jb25kaXRpb25UeXBlICE9PSBwcmV2aW91c0JyYW5jaC5jb25kaXRpb25UeXBlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBzdWJTdGVwcyBhcnJheSBjaGFuZ2VkIChsZW5ndGggb3IgcmVmZXJlbmNlKVxuICAgICAgY29uc3QgY3VycmVudFN1YlN0ZXBzID0gY3VycmVudEJyYW5jaC5zdWJTdGVwcyB8fCBbXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3ViU3RlcHMgPSBwcmV2aW91c0JyYW5jaC5zdWJTdGVwcyB8fCBbXTtcblxuICAgICAgaWYgKGN1cnJlbnRTdWJTdGVwcy5sZW5ndGggIT09IHByZXZpb3VzU3ViU3RlcHMubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChjdXJyZW50U3ViU3RlcHMgIT09IHByZXZpb3VzU3ViU3RlcHMpIHJldHVybiB0cnVlOyAvLyBSZWZlcmVuY2UgY2hlY2tcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRGVlcCBjb21wYXJpc29uIGZvciBuZXN0ZWRTdGVwcyBhcnJheSB0byBkZXRlY3QgY29udGVudCBjaGFuZ2VzXG4gICAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBjb25kaXRpb24gc3RlcHMgd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBicmFuY2hlc1xuICAgKi9cbiAgcHJpdmF0ZSBoYXNOZXN0ZWRTdGVwc0NoYW5nZWQoY3VycmVudDogYW55W10sIHByZXZpb3VzOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIGlmICghY3VycmVudCAmJiAhcHJldmlvdXMpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWN1cnJlbnQgfHwgIXByZXZpb3VzKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoY3VycmVudC5sZW5ndGggIT09IHByZXZpb3VzLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGN1cnJlbnQgPT09IHByZXZpb3VzKSByZXR1cm4gZmFsc2U7IC8vIFNhbWUgcmVmZXJlbmNlXG5cbiAgICAvLyBDb21wYXJlIGVhY2ggc3RlcCBieSBJRCB0byBkZXRlY3QgY29udGVudCBjaGFuZ2VzXG4gICAgLy8gVGhpcyBoYW5kbGVzIGNhc2VzIHdoZXJlIGFycmF5IGxlbmd0aCBpcyBzYW1lIGJ1dCBjb250ZW50IGRpZmZlcnMgKGUuZy4sIHN3aXRjaGluZyBicmFuY2hlcylcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGVwID0gY3VycmVudFtpXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3RlcCA9IHByZXZpb3VzW2ldO1xuXG4gICAgICBpZiAoIXByZXZpb3VzU3RlcCkgcmV0dXJuIHRydWU7XG5cbiAgICAgIC8vIENvbXBhcmUgc3RlcCBJRHMgLSBpZiBJRHMgZGlmZmVyLCBjb250ZW50IGhhcyBjaGFuZ2VkXG4gICAgICBjb25zdCBjdXJyZW50U3RlcElkID0gY3VycmVudFN0ZXAuaWQgfHwgY3VycmVudFN0ZXAudGVzdFN0ZXBSZXN1bHRJZDtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3RlcElkID0gcHJldmlvdXNTdGVwLmlkIHx8IHByZXZpb3VzU3RlcC50ZXN0U3RlcFJlc3VsdElkO1xuXG4gICAgICBpZiAoY3VycmVudFN0ZXBJZCAhPT0gcHJldmlvdXNTdGVwSWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFsc28gY2hlY2sgaWYgdGhlIHN0ZXAgdHlwZSBjaGFuZ2VkIChpbXBvcnRhbnQgZm9yIGJyYW5jaCBzd2l0Y2hpbmcpXG4gICAgICBpZiAoY3VycmVudFN0ZXAudHlwZSAhPT0gcHJldmlvdXNTdGVwLnR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRlc3RTdGVwVHlwZSBjaGFuZ2VkIChJRiB2cyBFTFNFX0lGIHZzIEVMU0UpXG4gICAgICBpZiAoY3VycmVudFN0ZXAudGVzdFN0ZXBUeXBlICE9PSBwcmV2aW91c1N0ZXAudGVzdFN0ZXBUeXBlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3IgdXBkYXRlIHRva2VuIGlmIHByZXNlbnQgKHVzZWQgdG8gZm9yY2UgcmUtcmVuZGVyKVxuICAgICAgaWYgKGN1cnJlbnRTdGVwLl91cGRhdGVUb2tlbiAmJiBjdXJyZW50U3RlcC5fdXBkYXRlVG9rZW4gIT09IHByZXZpb3VzU3RlcC5fdXBkYXRlVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGVwS2V5KHN0ZXA6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFzdGVwKSByZXR1cm4gJyc7XG4gICAgLy8gQ3JlYXRlIGEga2V5IGZyb20gaW1wb3J0YW50IHByb3BlcnRpZXMgdGhhdCBjaGFuZ2VcbiAgICAvLyBJbmNsdWRlIGV4ZWN1dGlvbkRhdGEuc3RlcFN0YXR1cyBmb3IgbGl2ZSBleGVjdXRpb24gc2NlbmFyaW9zXG4gICAgY29uc3QgZXhlY3V0aW9uU3RhdHVzID0gc3RlcC5leGVjdXRpb25EYXRhPy5zdGVwU3RhdHVzIHx8IHN0ZXAuc3RhdHVzIHx8ICcnO1xuICAgIC8vIEluY2x1ZGUgYnJhbmNoZXMgbGVuZ3RoIGZvciBjb25kaXRpb24tc3RlcCBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgY29uc3QgYnJhbmNoZXNMZW5ndGggPSAoc3RlcC5icmFuY2hlcyB8fCBbXSkubGVuZ3RoO1xuICAgIC8vIEluY2x1ZGUgdG90YWwgc3ViU3RlcHMgY291bnQgYWNyb3NzIGFsbCBicmFuY2hlcyBmb3IgbmVzdGVkIGNoYW5nZSBkZXRlY3Rpb25cbiAgICBjb25zdCB0b3RhbFN1YlN0ZXBzID0gKHN0ZXAuYnJhbmNoZXMgfHwgW10pLnJlZHVjZSgoc3VtOiBudW1iZXIsIGJyYW5jaDogYW55KSA9PiB7XG4gICAgICByZXR1cm4gc3VtICsgKGJyYW5jaC5zdWJTdGVwcz8ubGVuZ3RoIHx8IDApO1xuICAgIH0sIDApO1xuICAgIHJldHVybiBgJHtzdGVwLmlkIHx8ICcnfV8ke2V4ZWN1dGlvblN0YXR1c31fJHtzdGVwLnN0YXR1cyB8fCAnJ31fJHtzdGVwLmR1cmF0aW9uIHx8ICcnfV8ke3N0ZXAuZXhwYW5kZWQgfHwgZmFsc2V9XyR7KHN0ZXAuY2hpbGRyZW4gfHwgW10pLmxlbmd0aH1fJHsoc3RlcC5uZXN0ZWRTdGVwcyB8fCBbXSkubGVuZ3RofV8keyhzdGVwLnN0ZXBzIHx8IFtdKS5sZW5ndGh9XyR7YnJhbmNoZXNMZW5ndGh9XyR7dG90YWxTdWJTdGVwc31fJHtzdGVwLnN0ZXBOdW1iZXIgfHwgJyd9XyR7c3RlcC5zdGVwRGVsZXRlZCB8fCBmYWxzZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQ29tcG9uZW50KCkge1xuICAgIFxuICAgIGlmICghdGhpcy5jb250YWluZXIgfHwgIXRoaXMuc3RlcCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3VycmVudFN0ZXBJZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS50ZXN0U3RlcFJlc3VsdElkIHx8IHRoaXMuc3RlcC5pZDtcbiAgICBjb25zdCBjdXJyZW50U3RlcFR5cGUgPSB0aGlzLnN0ZXAudHlwZTtcblxuICAgIC8vIE9ubHkgY2xlYXIgYW5kIHJlY3JlYXRlIGlmIHN0ZXAgSUQgb3IgdHlwZSBhY3R1YWxseSBjaGFuZ2VkXG4gICAgY29uc3QgbmVlZHNSZWNyZWF0aW9uID0gdGhpcy5sYXN0U3RlcElkICE9PSBjdXJyZW50U3RlcElkIHx8IHRoaXMubGFzdFN0ZXBUeXBlICE9PSBjdXJyZW50U3RlcFR5cGU7XG5cbiAgICBpZiAobmVlZHNSZWNyZWF0aW9uKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5jbGVhcigpO1xuICAgICAgLy8gQ2xlYXIgc3RvcmVkIGluc3RhbmNlIHdoZW4gcmVjcmVhdGluZ1xuICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5kZWxldGUodGhpcy5jb250YWluZXIpO1xuICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZGVsZXRlKHRoaXMuY29udGFpbmVyKTtcbiAgICAgIHRoaXMubGFzdFN0ZXBJZCA9IGN1cnJlbnRTdGVwSWQ7XG4gICAgICB0aGlzLmxhc3RTdGVwVHlwZSA9IGN1cnJlbnRTdGVwVHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgc2FtZSBzdGVwLCBqdXN0IHVwZGF0ZSBwcm9wZXJ0aWVzIHdpdGhvdXQgY2xlYXJpbmdcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIC8vIFVwZGF0ZSBhbGwgcHJvcGVydGllc1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnN0ZXApLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBpZiAoa2V5ICE9PSAndHlwZScpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSAodGhpcy5zdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0geyAuLi4oaW5zdGFuY2UgYXMgYW55KS5jb25maWcsIC4uLnRoaXMuc3RlcCB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSBrZXkgZm9yIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgICAgdGhpcy5wcmV2aW91c1N0ZXBLZXkgPSB0aGlzLmdldFN0ZXBLZXkodGhpcy5zdGVwKTtcbiAgICAgICAgLy8gQ29tcG9uZW50IGFscmVhZHkgZXhpc3RzIGFuZCBpcyByZWFkeSwgZW1pdCBpbW1lZGlhdGVseVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlYWR5LmVtaXQoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wb25lbnRUeXBlID0gdGhpcy5jb21wb25lbnRNYXAuZ2V0KHRoaXMuc3RlcC50eXBlKTtcblxuICAgIGlmIChjb21wb25lbnRUeXBlKSB7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLmNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50VHlwZSk7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZTtcblxuICAgICAgLy8gU3RvcmUgY29tcG9uZW50IGluc3RhbmNlIGFuZCByZWYgaW4gV2Vha01hcCBmb3IgZnV0dXJlIHVwZGF0ZXNcbiAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuc2V0KHRoaXMuY29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5zZXQodGhpcy5jb250YWluZXIsIGNvbXBvbmVudFJlZik7XG5cbiAgICAgIC8vIFN0b3JlIGNvbXBvbmVudCByZWZlcmVuY2UgZm9yIGNsZWFudXBcbiAgICAgIChjb21wb25lbnRSZWYgYXMgYW55KS5fY29tcG9uZW50UmVmID0gY29tcG9uZW50UmVmO1xuXG4gICAgICAvLyBTcHJlYWQgY29uZmlnIHByb3BlcnRpZXMgYXMgaW5kaXZpZHVhbCBpbnB1dHMgZm9yIGNvbXBvbmVudHMgdGhhdCB1c2UgaW5kaXZpZHVhbCBpbnB1dHNcbiAgICAgIC8vIFRoaXMgc3VwcG9ydHMgYm90aCBwYXR0ZXJuczogY29tcG9uZW50cyB0aGF0IGFjY2VwdCBjb25maWcgZGlyZWN0bHkgYW5kIHRob3NlIHRoYXQgdXNlIGluZGl2aWR1YWwgaW5wdXRzXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnN0ZXApLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKGtleSAhPT0gJ3R5cGUnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9ICh0aGlzLnN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBtYXAgY2hpbGRyZW4gdG8gbmVzdGVkU3RlcHMgaWYgbmVzdGVkU3RlcHMgaXMgbm90IHByZXNlbnRcbiAgICAgIGlmICh0aGlzLnN0ZXAudHlwZSA9PT0gJ2xvb3AnICYmICh0aGlzLnN0ZXAgYXMgYW55KS5jaGlsZHJlbiAmJiAhKHRoaXMuc3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzID0gKHRoaXMuc3RlcCBhcyBhbnkpLmNoaWxkcmVuO1xuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IHNldCBsb29wVHlwZSBiYXNlZCBvbiBhY3Rpb25OYW1lIG9yIHRlc3RTdGVwVHlwZVxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnbG9vcCcpIHtcbiAgICAgICAgLy8gU2V0IGxvb3BUeXBlIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLmxvb3BUeXBlKSB7XG4gICAgICAgICAgY29uc3QgYWN0aW9uTmFtZSA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb25OYW1lO1xuICAgICAgICAgIGNvbnN0IHRlc3RTdGVwVHlwZSA9ICh0aGlzLnN0ZXAgYXMgYW55KS50ZXN0U3RlcFR5cGU7XG4gICAgICAgICAgaWYgKGFjdGlvbk5hbWUgPT09ICdGT1JfTE9PUCcgfHwgdGVzdFN0ZXBUeXBlID09PSAnRk9SX0xPT1AnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5sb29wVHlwZSA9ICdmb3InO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uTmFtZSA9PT0gJ1dISUxFX0xPT1AnIHx8IHRlc3RTdGVwVHlwZSA9PT0gJ1dISUxFX0xPT1AnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5sb29wVHlwZSA9ICd3aGlsZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSB0aXRsZSBpcyBzZXQgZnJvbSBhY3Rpb24gaWYgdGl0bGUgaXMgbm90IHByZXNlbnQgb3IgZW1wdHlcbiAgICAgICAgaWYgKCghKGluc3RhbmNlIGFzIGFueSkudGl0bGUgfHwgIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlLnRyaW0oKSkgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnRpdGxlID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IGluaXRpYWxpemUgaXRlcmF0aW9ucyBpZiBub3QgcHJlc2VudFxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnbG9vcCcgJiYgIShpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCIgY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddIHN0ZXBcIiwgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkLCAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zKVxuICAgICAgICAvLyBVc2UgaGFuZGxlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB0cnkgdG8gaW5pdGlhbGl6ZSBmcm9tIHN0ZXAuZXhlY3V0ZWRSZXN1bHQuc3RlcFJlc3VsdFxuICAgICAgICBpZiAodGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zID0gdGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgICAgfSBlbHNlIGlmICgodGhpcy5zdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQ/LnN0ZXBSZXN1bHQgJiYgQXJyYXkuaXNBcnJheSgodGhpcy5zdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQuc3RlcFJlc3VsdCkpIHtcbiAgICAgICAgICAvLyBJbml0aWFsaXplIGl0ZXJhdGlvbnMgZGlyZWN0bHkgZnJvbSBzdGVwUmVzdWx0XG4gICAgICAgICAgY29uc3QgaXRlcmF0aW9uczogYW55W10gPSBbXTtcbiAgICAgICAgICAodGhpcy5zdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQuc3RlcFJlc3VsdC5mb3JFYWNoKChpdGVyYXRpb246IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlcmF0aW9uSW5kZXggPSBpdGVyYXRpb24uaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpdGVyYXRpb24uaW5kZXggIT09IG51bGwgPyBpdGVyYXRpb24uaW5kZXggOiBpdGVyYXRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBzdGF0dXM6ICdzdWNjZXNzJyB8ICdmYWlsZWQnIHwgJ3BlbmRpbmcnIHwgJ3J1bm5pbmcnID0gJ3BlbmRpbmcnO1xuICAgICAgICAgICAgaWYgKGl0ZXJhdGlvbi5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzTG93ZXIgPSBpdGVyYXRpb24uc3RhdHVzLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgIGlmIChzdGF0dXNMb3dlciA9PT0gJ3N1Y2Nlc3MnIHx8IHN0YXR1c0xvd2VyID09PSAncGFzc2VkJykge1xuICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdzdWNjZXNzJztcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXNMb3dlciA9PT0gJ2ZhaWx1cmUnIHx8IHN0YXR1c0xvd2VyID09PSAnZmFpbGVkJykge1xuICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdmYWlsZWQnO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1c0xvd2VyID09PSAncnVubmluZycgfHwgc3RhdHVzTG93ZXIgPT09ICdpbl9wcm9ncmVzcycpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSAncnVubmluZyc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgIGlkOiBgaXRlci0ke2l0ZXJhdGlvbkluZGV4fWAsXG4gICAgICAgICAgICAgIGxhYmVsOiBgaXRlciAke2l0ZXJhdGlvbkluZGV4fWAsXG4gICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgICAgICAgICBzdWJTdGVwczogW10sXG4gICAgICAgICAgICAgIGluZGV4OiBpdGVyYXRpb25JbmRleFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucyA9IGl0ZXJhdGlvbnM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBzZXQgZGVmYXVsdEl0ZXJhdGlvbiBhbmQgc2VsZWN0ZWRJdGVyYXRpb25JZFxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnbG9vcCcpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCIgY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddIHN0ZXAgMlwiLCB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQsIChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMpXG4gICAgICAgIC8vIFNldCBkZWZhdWx0SXRlcmF0aW9uIHRvICdsYXN0JyBpZiBub3QgYWxyZWFkeSBzZXRcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5kZWZhdWx0SXRlcmF0aW9uKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZGVmYXVsdEl0ZXJhdGlvbiA9ICdsYXN0JztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBzZWxlY3RlZEl0ZXJhdGlvbklkIC0gcHJpb3JpdGl6ZSBpbnB1dCB2YWx1ZSwgdGhlbiBzdGVwIHZhbHVlLCB0aGVuIGxhc3QgaXRlcmF0aW9uXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSAodGhpcy5zdGVwIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTZXQgc2VsZWN0ZWRJdGVyYXRpb25JZCB0byBsYXN0IGl0ZXJhdGlvbiBpZiBub3QgYWxyZWFkeSBzZXRcbiAgICAgICAgICBjb25zdCBpdGVyYXRpb25zID0gKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucztcbiAgICAgICAgICBpZiAoaXRlcmF0aW9ucyAmJiBBcnJheS5pc0FycmF5KGl0ZXJhdGlvbnMpICYmIGl0ZXJhdGlvbnMubGVuZ3RoID4gMCAmJiAhKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgICAgICAgY29uc3QgbGFzdEl0ZXJhdGlvbiA9IGl0ZXJhdGlvbnNbaXRlcmF0aW9ucy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSBsYXN0SXRlcmF0aW9uLmlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBzdGVwLWdyb3VwOiBtYXAgY2hpbGRyZW4gdG8gc3RlcHMgaWYgc3RlcHMgaXMgbm90IHByZXNlbnRcbiAgICAgIGlmICh0aGlzLnN0ZXAudHlwZSA9PT0gJ3N0ZXAtZ3JvdXAnICYmICh0aGlzLnN0ZXAgYXMgYW55KS5jaGlsZHJlbiAmJiAhKHRoaXMuc3RlcCBhcyBhbnkpLnN0ZXBzKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBzID0gKHRoaXMuc3RlcCBhcyBhbnkpLmNoaWxkcmVuO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5ncm91cE5hbWUgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uO1xuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogc2V0IGJyYW5jaGVzIGFuZCBjb25kaXRpb25UZXh0XG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdjb25kaXRpb24nKSB7XG4gICAgICAgIC8vIFNldCBicmFuY2hlcyAtIHByaW9yaXRpemUgc3RlcC5icmFuY2hlcyBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgaGFuZGxlclxuICAgICAgICBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLmJyYW5jaGVzICYmIEFycmF5LmlzQXJyYXkoKHRoaXMuc3RlcCBhcyBhbnkpLmJyYW5jaGVzKSkge1xuICAgICAgICAgIC8vIENyZWF0ZSBkZWVwIGNvcHkgdG8gZW5zdXJlIHByb3BlciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgPSAodGhpcy5zdGVwIGFzIGFueSkuYnJhbmNoZXMubWFwKChicmFuY2g6IGFueSkgPT4gKHtcbiAgICAgICAgICAgIC4uLmJyYW5jaCxcbiAgICAgICAgICAgIHN1YlN0ZXBzOiBicmFuY2guc3ViU3RlcHMgPyBbLi4uYnJhbmNoLnN1YlN0ZXBzXSA6IFtdXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyAmJiB0aGlzLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZXJCcmFuY2hlcyA9IHRoaXMuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgICAgLy8gQ3JlYXRlIGRlZXAgY29weSB0byBlbnN1cmUgcHJvcGVyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyA9IGhhbmRsZXJCcmFuY2hlcy5tYXAoKGJyYW5jaDogYW55KSA9PiAoe1xuICAgICAgICAgICAgLi4uYnJhbmNoLFxuICAgICAgICAgICAgc3ViU3RlcHM6IGJyYW5jaC5zdWJTdGVwcyA/IFsuLi5icmFuY2guc3ViU3RlcHNdIDogW11cbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IGNvbmRpdGlvblRleHQgZnJvbSBhY3Rpb24gaWYgY29uZGl0aW9uVGV4dCBpcyBub3QgcHJlc2VudFxuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLmNvbmRpdGlvblRleHQgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmRpdGlvblRleHQgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCBpc0xvYWRpbmcgdXNpbmcgaGFuZGxlciBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc0xvYWRpbmcgPSB0aGlzLmlzU3RlcExvYWRpbmdIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGFzcyBhY3RpdmVCcmFuY2hTdGVwSWQgaWYgcHJlc2VudFxuICAgICAgICBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYWN0aXZlQnJhbmNoU3RlcElkID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBhaS1hZ2VudC1zdGVwOiBlbnN1cmUgdGl0bGUgYW5kIHByb21wdCBhcmUgc2V0IGZyb20gYWN0aW9uXG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdhaS1hZ2VudCcpIHtcbiAgICAgICAgLy8gU2V0IHRpdGxlIGZyb20gYWN0aW9uIGlmIHRpdGxlIGlzIG5vdCBwcmVzZW50IG9yIGVtcHR5XG4gICAgICAgIGlmICgoIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlIHx8ICEoaW5zdGFuY2UgYXMgYW55KS50aXRsZS50cmltKCkpICYmICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS50aXRsZSA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IHByb21wdCBmcm9tIGFjdGlvbiBpZiBwcm9tcHQgaXMgbm90IHByZXNlbnQgb3IgZW1wdHlcbiAgICAgICAgaWYgKCghKGluc3RhbmNlIGFzIGFueSkucHJvbXB0IHx8ICEoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQudHJpbSgpKSAmJiAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkucHJvbXB0ID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgYWN0aW9ucyBhcnJheSBpcyBzZXQgaWYgbm90IHByZXNlbnRcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25zICYmIHRoaXMuZm9ybWF0QWN0aW9uc0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25zID0gdGhpcy5mb3JtYXRBY3Rpb25zSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCBhY3Rpb25Db3VudCBpZiBub3QgcHJlc2VudFxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuYWN0aW9uQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSAoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25zIHx8IFtdO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbkNvdW50ID0gYWN0aW9ucy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IHNlbGVjdGVkVGFiSW5wdXQgaWYgbm90IHByZXNlbnRcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZFRhYklucHV0KSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRUYWJJbnB1dCA9ICdhY3Rpb24tdHJhY2UnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFdpcmUgdXAgY29tbW9uIGV2ZW50IGVtaXR0ZXJzIGZvciBhcGksIGFpLWFnZW50LCBsb29wLCBjb25kaXRpb24sIGFuZCBiYXNpYyBzdGVwc1xuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnYXBpJyB8fCB0aGlzLnN0ZXAudHlwZSA9PT0gJ2FpLWFnZW50JyB8fCB0aGlzLnN0ZXAudHlwZSA9PT0gJ2xvb3AnIHx8IHRoaXMuc3RlcC50eXBlID09PSAnY29uZGl0aW9uJyB8fCB0aGlzLnN0ZXAudHlwZSA9PT0gJ2Jhc2ljJykge1xuICAgICAgICAvLyBTdWJzY3JpYmUgdG8gY29tbW9uIG91dHB1dCBldmVudHMgYW5kIGNhbGwgaGFuZGxlcnNcbiAgICAgICAgLy8gRXZlbnRFbWl0dGVycyBhcmUgU3ViamVjdHMsIHNvIHdlIGNhbiBzdWJzY3JpYmUgdG8gdGhlbVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkubWFrZUN1cnJlbnRCYXNlbGluZSAmJiB0aGlzLm9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5tYWtlQ3VycmVudEJhc2VsaW5lLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyPy4oZXZlbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS51cGxvYWRCYXNlbGluZSAmJiB0aGlzLm9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudXBsb2FkQmFzZWxpbmUuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyPy4oZXZlbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5hbmFseXplICYmIHRoaXMub25BbmFseXplSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFuYWx5emUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25BbmFseXplSGFuZGxlcj8uKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnZpZXdGdWxsTG9ncyAmJiB0aGlzLm9uVmlld0Z1bGxMb2dzSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnZpZXdGdWxsTG9ncy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblZpZXdGdWxsTG9nc0hhbmRsZXI/LigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFjdGlvbiAmJiB0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBY3Rpb24uc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyPy4oZXZlbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6IG9uSnNvblBhdGhDb3BpZWRIYW5kbGVyIGlzIHNldCBhcyBpbnB1dCBwcm9wZXJ0eSAobGluZSA4MjUpLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHN1YnNjcmliZSB0byBqc29uUGF0aENvcGllZCBldmVudFxuICAgICAgICAvLyBUaGUgQVBJIHN0ZXAgY29tcG9uZW50IGNhbGxzIHRoZSBoYW5kbGVyIGRpcmVjdGx5LCBhdm9pZGluZyBkdXBsaWNhdGUgY2FsbHNcbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiB3aXJlIHVwIG9uVmlld0FsbEl0ZXJhdGlvbnMgZXZlbnRcbiAgICAgIGlmICh0aGlzLnN0ZXAudHlwZSA9PT0gJ2xvb3AnKSB7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5vblZpZXdBbGxJdGVyYXRpb25zICYmIHRoaXMub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5vblZpZXdBbGxJdGVyYXRpb25zLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyPy4odGhpcy5zdGVwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogd2lyZSB1cCBvbkV4cGFuZCBldmVudFxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnY29uZGl0aW9uJykge1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkub25FeHBhbmQgJiYgdGhpcy5vbkV4cGFuZEhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5vbkV4cGFuZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQ2FsbCBvbkV4cGFuZEhhbmRsZXIgd2l0aCB0aGUgc3RlcCBjb25maWdcbiAgICAgICAgICAgIHRoaXMub25FeHBhbmRIYW5kbGVyPy4odGhpcy5zdGVwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaXJlIHVwIG9uQnJhbmNoQ2xpY2tFdmVudCBmb3IgbmVzdGVkIGNvbmRpdGlvbiBzdGVwc1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkub25CcmFuY2hDbGlja0V2ZW50ICYmIHRoaXMub25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5vbkJyYW5jaENsaWNrRXZlbnQuc3Vic2NyaWJlKChicmFuY2g6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlcj8uKHRoaXMuc3RlcCwgYnJhbmNoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFbnN1cmUgZXhwYW5kZWQgcHJvcGVydHkgaXMgcGFzc2VkIGNvcnJlY3RseVxuICAgICAgLy8gVXNlIGlzU3RlcEV4cGFuZGVkSGFuZGxlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2Ugc3RlcC5leHBhbmRlZCBvciBzdGVwLmNvbmZpZy5leHBhbmRlZFxuICAgICAgaWYgKHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyICYmIHRoaXMuc3RlcCkge1xuICAgICAgICBjb25zdCBleHBhbmRlZFN0YXRlID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQgPSBleHBhbmRlZFN0YXRlO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmV4cGFuZGVkID0gZXhwYW5kZWRTdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgodGhpcy5zdGVwIGFzIGFueSkuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQYXNzIGhhbmRsZXIgZnVuY3Rpb25zIHRvIHRoZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICAgIGlmICh0aGlzLm9uRXhwYW5kSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25FeHBhbmRIYW5kbGVyID0gdGhpcy5vbkV4cGFuZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlciA9IHRoaXMuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmlzU3RlcExvYWRpbmdIYW5kbGVyID0gdGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuaXNTdGVwRXhwYW5kZWRIYW5kbGVyID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyID0gdGhpcy5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5mb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXIgPSB0aGlzLmZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlciA9IHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldExvb3BJdGVyYXRpb25zSGFuZGxlciA9IHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZ2V0QXBpQXNzZXJ0aW9uc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldEFwaUFzc2VydGlvbnNIYW5kbGVyID0gdGhpcy5nZXRBcGlBc3NlcnRpb25zSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmZvcm1hdEFjdGlvbnNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5mb3JtYXRBY3Rpb25zSGFuZGxlciA9IHRoaXMuZm9ybWF0QWN0aW9uc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vblZpZXdBbGxJdGVyYXRpb25zSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXIgPSB0aGlzLm9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlciA9IHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblVwbG9hZEJhc2VsaW5lSGFuZGxlciA9IHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbkFuYWx5emVIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkFuYWx5emVIYW5kbGVyID0gdGhpcy5vbkFuYWx5emVIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblZpZXdGdWxsTG9nc0hhbmRsZXIgPSB0aGlzLm9uVmlld0Z1bGxMb2dzSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblNlbGZIZWFsQWN0aW9uSGFuZGxlciA9IHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXIgPSB0aGlzLm9uQ29uZGl0aW9uQnJhbmNoQ2xpY2tIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25TdGVwQ2xpY2tIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblN0ZXBDbGlja0hhbmRsZXIgPSB0aGlzLm9uU3RlcENsaWNrSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uSnNvblBhdGhDb3BpZWRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkpzb25QYXRoQ29waWVkSGFuZGxlciA9IHRoaXMub25Kc29uUGF0aENvcGllZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5pc1VwbG9hZGluZ0Jhc2VsaW5lICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmlzVXBsb2FkaW5nQmFzZWxpbmUgPSB0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmU7XG4gICAgICBpZiAodGhpcy5pc01ha2luZ0N1cnJlbnRCYXNlbGluZSAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5pc01ha2luZ0N1cnJlbnRCYXNlbGluZSA9IHRoaXMuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmU7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICBpZiAodGhpcy5pc0xpdmUgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuaXNMaXZlID0gdGhpcy5pc0xpdmU7XG4gICAgICAvLyBQYXNzIHRoZSBzdGVwIG9iamVjdCBzbyB0b2dnbGVIZWFkZXIgY2FuIHVzZSBpdFxuICAgICAgaWYgKHRoaXMuc3RlcCkgKGluc3RhbmNlIGFzIGFueSkuc3RlcCA9IHRoaXMuc3RlcDtcblxuICAgICAgLy8gVXBkYXRlIGNvbmRpdGlvbi1zdGVwIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIGlmICh0aGlzLnN0ZXAudHlwZSA9PT0gJ2NvbmRpdGlvbicpIHtcbiAgICAgICAgLy8gVXBkYXRlIGFjdGl2ZUJyYW5jaFN0ZXBJZCBpZiBpdCBjaGFuZ2VkXG4gICAgICAgIGlmICgodGhpcy5zdGVwIGFzIGFueSkuYWN0aXZlQnJhbmNoU3RlcElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aXZlQnJhbmNoU3RlcElkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGJyYW5jaGVzIGlmIHRoZXkgY2hhbmdlZFxuICAgICAgICBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLmJyYW5jaGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5icmFuY2hlcztcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuYnJhbmNoZXMgPSAodGhpcy5zdGVwIGFzIGFueSkuYnJhbmNoZXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIG5lc3RlZFN0ZXBzIGlmIHRoZXkgY2hhbmdlZFxuICAgICAgICBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5uZXN0ZWRTdGVwcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcztcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcubmVzdGVkU3RlcHMgPSAodGhpcy5zdGVwIGFzIGFueSkubmVzdGVkU3RlcHM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cblxuICAgICAgLy8gQWxzbyBzZXQgY29uZmlnIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggY29tcG9uZW50cyB0aGF0IHN0aWxsIHVzZSBjb25maWcgaW5wdXRcbiAgICAgIGlmICgnY29uZmlnJyBpbiBpbnN0YW5jZSkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcgPSB0aGlzLnN0ZXA7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIGtleSBmb3IgY2hhbmdlIGRldGVjdGlvblxuICAgICAgdGhpcy5wcmV2aW91c1N0ZXBLZXkgPSB0aGlzLmdldFN0ZXBLZXkodGhpcy5zdGVwKTtcblxuICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRW1pdCByZWFkeSBldmVudCBhZnRlciBjb21wb25lbnQgaXMgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWRcbiAgICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGVuc3VyZSB0aGUgY29tcG9uZW50IGlzIGZ1bGx5IHJlbmRlcmVkXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWFkeS5lbWl0KCk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBuZ0RvQ2hlY2soKTogdm9pZCB7XG4gICAgLy8gVXNlIG5nRG9DaGVjayB0byBkZXRlY3QgY2hhbmdlcyBpbiBuZXN0ZWQgcHJvcGVydGllcyB0aGF0IG5nT25DaGFuZ2VzIG1pZ2h0IG1pc3NcbiAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgaWYgKGluc3RhbmNlICYmIGNvbXBvbmVudFJlZiAmJiB0aGlzLnN0ZXApIHtcbiAgICAgIC8vIENoZWNrIGlmIGl0ZXJhdGlvbnMgYXJlIG5vdyBhdmFpbGFibGUgYW5kIHdlIG5lZWQgdG8gdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uXG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdsb29wJyAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgY29uc3QgaXRlcmF0aW9ucyA9IChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMgfHwgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnPy5pdGVyYXRpb25zIHx8IFtdO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZXJhdGlvbklkID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCB8fCB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbiA9IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uO1xuXG4gICAgICAgIC8vIElmIGl0ZXJhdGlvbnMgYXJlIGF2YWlsYWJsZSwgc2VsZWN0ZWRJdGVyYXRpb25JZCBpcyBzZXQsIGJ1dCBzZWxlY3RlZEl0ZXJhdGlvbiBpcyBub3Qgc2V0IG9yIGRvZXNuJ3QgbWF0Y2hcbiAgICAgICAgaWYgKGl0ZXJhdGlvbnMubGVuZ3RoID4gMCAmJiBzZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkQmVTZWxlY3RlZCA9IGl0ZXJhdGlvbnMuZmluZCgoaXRlcjogYW55KSA9PiBpdGVyLmlkID09PSBzZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgICAgICBpZiAoc2hvdWxkQmVTZWxlY3RlZCAmJiBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb24/LmlkICE9PSBzZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxvb3BTdGVwU2VsZWN0ZWRJdGVyYXRpb24oaW5zdGFuY2UsIHNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudEtleSA9IHRoaXMuZ2V0U3RlcEtleSh0aGlzLnN0ZXApO1xuXG4gICAgICAvLyBJZiBzdGVwIHByb3BlcnRpZXMgY2hhbmdlZCAoZXZlbiBpZiByZWZlcmVuY2UgZGlkbid0KSwgdXBkYXRlIHRoZSBpbnN0YW5jZVxuICAgICAgaWYgKGN1cnJlbnRLZXkgIT09IHRoaXMucHJldmlvdXNTdGVwS2V5KSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdGhlIHByZXZpb3VzIHN0ZXAgdG8gY29tcGFyZSwgc28gd2UnbGwgdXBkYXRlIGJhc2VkIG9uIGN1cnJlbnQgc3RhdGVcbiAgICAgICAgLy8gQ3JlYXRlIGEgbWluaW1hbCBwcmV2aW91cyBzdGVwIGZyb20gdGhlIGluc3RhbmNlJ3MgY3VycmVudCBzdGF0ZVxuICAgICAgICBjb25zdCBwcmV2aW91c1N0ZXA6IGFueSA9IHtcbiAgICAgICAgICBpZDogKGluc3RhbmNlIGFzIGFueSkuaWQsXG4gICAgICAgICAgdHlwZTogKGluc3RhbmNlIGFzIGFueSkudHlwZSxcbiAgICAgICAgICBzdGF0dXM6IChpbnN0YW5jZSBhcyBhbnkpLnN0YXR1cyxcbiAgICAgICAgICBkdXJhdGlvbjogKGluc3RhbmNlIGFzIGFueSkuZHVyYXRpb24sXG4gICAgICAgICAgZXhwYW5kZWQ6IChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkLFxuICAgICAgICAgIGNoaWxkcmVuOiAoaW5zdGFuY2UgYXMgYW55KS5jaGlsZHJlbixcbiAgICAgICAgICBuZXN0ZWRTdGVwczogKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMsXG4gICAgICAgICAgc3RlcHM6IChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBzLFxuICAgICAgICAgIGV4ZWN1dGlvbkRhdGE6IChpbnN0YW5jZSBhcyBhbnkpLmV4ZWN1dGlvbkRhdGEsXG4gICAgICAgICAgYWN0aW9uOiAoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb24sXG4gICAgICAgICAgdGl0bGU6IChpbnN0YW5jZSBhcyBhbnkpLnRpdGxlLFxuICAgICAgICAgIHJlc3VsdDogKGluc3RhbmNlIGFzIGFueSkucmVzdWx0LFxuICAgICAgICAgIG1ldGhvZDogKGluc3RhbmNlIGFzIGFueSkubWV0aG9kLFxuICAgICAgICAgIGVuZHBvaW50OiAoaW5zdGFuY2UgYXMgYW55KS5lbmRwb2ludCxcbiAgICAgICAgICBzdGF0dXNDb2RlOiAoaW5zdGFuY2UgYXMgYW55KS5zdGF0dXNDb2RlLFxuICAgICAgICAgIHJlc3BvbnNlVGltZTogKGluc3RhbmNlIGFzIGFueSkucmVzcG9uc2VUaW1lLFxuICAgICAgICAgIGFjdGlvbnM6IChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbnMsXG4gICAgICAgICAgcHJvbXB0OiAoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQsXG4gICAgICAgICAgb3B0aW1pemVkUnVuOiAoaW5zdGFuY2UgYXMgYW55KS5vcHRpbWl6ZWRSdW4sXG4gICAgICAgICAgYWN0aW9uQ291bnQ6IChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbkNvdW50LFxuICAgICAgICAgIGl0ZXJhdGlvbnM6IChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMsXG4gICAgICAgICAgc2VsZWN0ZWRJdGVyYXRpb25JZDogKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCxcbiAgICAgICAgICBicmFuY2hlczogKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMsXG4gICAgICAgICAgc3RlcE51bWJlcjogKGluc3RhbmNlIGFzIGFueSkuc3RlcE51bWJlcixcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKHRoaXMuc3RlcCwgcHJldmlvdXNTdGVwKTtcbiAgICAgICAgdGhpcy5wcmV2aW91c1N0ZXBLZXkgPSBjdXJyZW50S2V5O1xuICAgICAgfVxuICAgIH1cbiAgfVxufSJdfQ==