@cqa-lib/cqa-ui 1.1.236 → 1.1.238

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 (21) hide show
  1. package/esm2020/lib/add-prerequisite-cases-section/add-prerequisite-cases-section.component.mjs +3 -3
  2. package/esm2020/lib/compare-runs/compare-runs.component.mjs +1 -1
  3. package/esm2020/lib/execution-screen/db-query-execution-item/db-query-execution-item.component.mjs +1 -1
  4. package/esm2020/lib/execution-screen/db-verification-step/db-verification-step.component.mjs +1 -1
  5. package/esm2020/lib/iterations-loop/iterations-loop.component.mjs +1 -1
  6. package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +100 -12
  7. package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +45 -3
  8. package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +45 -3
  9. package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +1055 -54
  10. package/esm2020/lib/templates/table-template.component.mjs +79 -5
  11. package/fesm2015/cqa-lib-cqa-ui.mjs +1330 -72
  12. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  13. package/fesm2020/cqa-lib-cqa-ui.mjs +1317 -70
  14. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  15. package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +50 -3
  16. package/lib/step-builder/step-builder-condition/step-builder-condition.component.d.ts +23 -1
  17. package/lib/step-builder/step-builder-loop/step-builder-loop.component.d.ts +20 -1
  18. package/lib/step-builder/template-variables-form/template-variables-form.component.d.ts +142 -4
  19. package/lib/templates/table-template.component.d.ts +7 -1
  20. package/package.json +1 -1
  21. package/styles.css +1 -1
@@ -1,10 +1,11 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
1
+ import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
2
2
  import { FormControl } from '@angular/forms';
3
+ import { TemplateVariablesFormComponent } from '../template-variables-form/template-variables-form.component';
3
4
  import * as i0 from "@angular/core";
4
5
  import * as i1 from "@angular/forms";
5
6
  import * as i2 from "../../search-bar/search-bar.component";
6
- import * as i3 from "../template-variables-form/template-variables-form.component";
7
- import * as i4 from "../../button/button.component";
7
+ import * as i3 from "../../button/button.component";
8
+ import * as i4 from "../template-variables-form/template-variables-form.component";
8
9
  import * as i5 from "@angular/common";
9
10
  export class StepBuilderActionComponent {
10
11
  constructor(fb) {
@@ -26,6 +27,18 @@ export class StepBuilderActionComponent {
26
27
  this.hasMoreScreenNames = false;
27
28
  /** True while parent is loading screen names (search or load more) */
28
29
  this.isLoadingScreenNames = false;
30
+ /** Parameter options for test data parameter dropdown (from API) */
31
+ this.parameterOptions = []; // TestData[] - raw test data profiles
32
+ /** Whether more parameters are available for infinite scroll */
33
+ this.hasMoreParameters = false;
34
+ /** True while parent is loading parameters (search or load more) */
35
+ this.isLoadingParameters = false;
36
+ /** Environment options for environment parameter dropdown (from API) */
37
+ this.environmentOptions = [];
38
+ /** Whether more environments are available for infinite scroll */
39
+ this.hasMoreEnvironments = false;
40
+ /** True while parent is loading environments (search or load more) */
41
+ this.isLoadingEnvironments = false;
29
42
  this.templateChanged = new EventEmitter();
30
43
  this.loadMoreElements = new EventEmitter(); // Emit when load more is requested
31
44
  this.searchElements = new EventEmitter(); // Emit when user searches for elements
@@ -33,10 +46,16 @@ export class StepBuilderActionComponent {
33
46
  this.searchScreenName = new EventEmitter(); // Emit when user searches screen names
34
47
  this.loadMoreScreenNames = new EventEmitter(); // Emit when user scrolls to load more screen names
35
48
  this.createScreenNameRequest = new EventEmitter(); // Emit when user requests to create a new screen name
49
+ this.searchParameters = new EventEmitter(); // Emit when user searches for parameters
50
+ this.loadMoreParameters = new EventEmitter(); // Emit when user scrolls to load more parameters
51
+ this.searchEnvironments = new EventEmitter(); // Emit when user searches for environments
52
+ this.loadMoreEnvironments = new EventEmitter(); // Emit when user scrolls to load more environments
36
53
  /** Emit when step is created */
37
54
  this.createStep = new EventEmitter();
38
55
  /** Emit when cancelled */
39
56
  this.cancelled = new EventEmitter();
57
+ this.redirectToParameter = new EventEmitter();
58
+ this.redirectToEnvironment = new EventEmitter();
40
59
  this.filteredTemplates = [];
41
60
  this.searchValue = '';
42
61
  this.selectedTemplate = null;
@@ -45,8 +64,7 @@ export class StepBuilderActionComponent {
45
64
  this.advancedExpanded = false;
46
65
  this.templateVariables = [];
47
66
  this.updatedHtmlGrammar = ''; // Updated HTML grammar with variable values
48
- // Track element form visibility
49
- this.isElementFormVisible = false;
67
+ this.createElementVisible = false;
50
68
  // Cache for select configs to avoid recalculating on every change detection
51
69
  this.selectConfigCache = new Map();
52
70
  this.formValidCache = false;
@@ -58,7 +76,10 @@ export class StepBuilderActionComponent {
58
76
  * Handle element form visibility change
59
77
  */
60
78
  onElementFormVisibilityChange(visible) {
61
- this.isElementFormVisible = visible;
79
+ this.createElementVisible = visible;
80
+ }
81
+ onShowElementForm() {
82
+ this.createElementVisible = true;
62
83
  }
63
84
  ngOnInit() {
64
85
  this.filteredTemplates = [...this.templates];
@@ -179,7 +200,7 @@ export class StepBuilderActionComponent {
179
200
  });
180
201
  // Add dataType control for test-data variables if needed
181
202
  const label = variable.label?.toLowerCase() || '';
182
- if (label === 'test-data' || label === 'source-value' || label === 'target-value' ||
203
+ if (label === 'test_data' || label === 'source-value' || label === 'target-value' ||
183
204
  label === 'source_value' || label === 'target_value') {
184
205
  // Parse the value to determine data type
185
206
  const valueStr = String(defaultValue || '');
@@ -256,7 +277,7 @@ export class StepBuilderActionComponent {
256
277
  });
257
278
  // Add dataType control for test-data variables if needed
258
279
  const label = variable.label?.toLowerCase() || '';
259
- if (label === 'test-data' || label === 'source-value' || label === 'target-value' ||
280
+ if (label === 'test_data' || label === 'source-value' || label === 'target-value' ||
260
281
  label === 'source_value' || label === 'target_value') {
261
282
  const valueStr = String(defaultValue || '');
262
283
  let dataType = 'plain-text';
@@ -373,14 +394,18 @@ export class StepBuilderActionComponent {
373
394
  if (!this.isFormValid()) {
374
395
  return;
375
396
  }
397
+ // Get environment IDs from template variables (if any environment type variables are selected)
398
+ const environmentIds = this.templateVariablesForm?.getEnvironmentIdsForVariables() || new Map();
376
399
  const stepData = {
377
400
  template: this.selectedTemplate,
378
401
  metadata: this.metadata,
379
402
  description: this.description,
380
- templateVariables: this.templateVariables
403
+ templateVariables: this.templateVariables,
404
+ environmentIds: environmentIds // Map of variable name to environment ID
381
405
  };
382
406
  console.log("stepData", stepData);
383
407
  console.log("variablesForm", this.variablesForm.value);
408
+ console.log("environmentIds", environmentIds);
384
409
  this.createStep.emit(stepData);
385
410
  }
386
411
  toggleAdvanced() {
@@ -459,12 +484,44 @@ export class StepBuilderActionComponent {
459
484
  this.updatedHtmlGrammar = updatedHtml;
460
485
  }
461
486
  }
487
+ /**
488
+ * Check if selector variable is available in templateVariables
489
+ */
490
+ get selectorVariableAvailable() {
491
+ return this.templateVariables.some(v => v.dataKey === 'element' || v.dataKey === 'label');
492
+ }
493
+ /**
494
+ * Check if parameter variable is available (testData with parameter type)
495
+ */
496
+ get parameterVariableAvailable() {
497
+ return this.templateVariables.some(v => {
498
+ const dataKey = v.dataKey?.toLowerCase() || '';
499
+ if (dataKey === 'test_data' || dataKey === 'source_value' || dataKey === 'target_value') {
500
+ // const dataType = this.variableDataTypes.get(v.name) || 'plain-text';
501
+ return true;
502
+ }
503
+ return false;
504
+ });
505
+ }
506
+ /**
507
+ * Check if environment variable is available (testData with environment type)
508
+ */
509
+ get environmentVariableAvailable() {
510
+ return this.templateVariables.some(v => {
511
+ const dataKey = v.dataKey?.toLowerCase() || '';
512
+ if (dataKey === 'test_data' || dataKey === 'source_value' || dataKey === 'target_value') {
513
+ // const dataType = this.variableDataTypes.get(v.name) || 'plain-text';
514
+ return true;
515
+ }
516
+ return false;
517
+ });
518
+ }
462
519
  }
463
520
  StepBuilderActionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderActionComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
464
- StepBuilderActionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: { showHeader: "showHeader", templates: "templates", searchPlaceholder: "searchPlaceholder", setTemplateVariables: "setTemplateVariables", preventSelectTemplate: "preventSelectTemplate", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames" }, outputs: { templateChanged: "templateChanged", loadMoreElements: "loadMoreElements", searchElements: "searchElements", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", createStep: "createStep", cancelled: "cancelled" }, host: { styleAttribute: "display: block;height: 100%;width: 100%;", classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white\" [ngClass]=\"{'cqa-px-4': showHeader, 'cqa-py-2': showHeader && !selectedTemplate}\">\n <!-- Header -->\n <h2 *ngIf=\"showHeader\" class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-1\">\n Create an action step\n </h2>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates; trackBy: trackByTemplate\"\n class=\"cqa-action-format cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm mb-6\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-overflow-y-auto\" style=\"flex: 1 1 0 !important;\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"updatedHtmlGrammar || selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto cqa-flex-1 cqa-pb-2\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap cqa-pb-4\">\n <!-- Template Variables Form Component -->\n <cqa-template-variables-form\n style=\"width: 100%;\"\n [templateVariables]=\"templateVariables\"\n [variablesForm]=\"variablesForm\"\n [metadata]=\"metadata\"\n [description]=\"description\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n (variableValueChange)=\"onVariableValueChange($event.name, $event.value)\"\n (variableBooleanChange)=\"onVariableBooleanChange($event.name, $event.value)\"\n (metadataChange)=\"metadata = $event\"\n (descriptionChange)=\"description = $event\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (elementFormVisibilityChange)=\"onElementFormVisibilityChange($event)\">\n </cqa-template-variables-form>\n </div>\n\n <!-- Advanced (Expandable) -->\n <!-- <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n </div>\n </div> -->\n <div>\n \n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div *ngIf=\"!isElementFormVisible\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200 cqa-pb-2\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n </div>\n</div>", components: [{ type: i2.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i3.TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: ["templateVariables", "variablesForm", "metadata", "description", "elementOptions", "hasMoreElements", "isLoadingElements", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames"], outputs: ["variableValueChange", "variableBooleanChange", "metadataChange", "descriptionChange", "loadMoreElements", "searchElements", "createElement", "searchScreenName", "loadMoreScreenNames", "createScreenNameRequest", "cancelElementForm", "elementFormVisibilityChange"] }, { type: i4.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
521
+ StepBuilderActionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: { showHeader: "showHeader", templates: "templates", searchPlaceholder: "searchPlaceholder", setTemplateVariables: "setTemplateVariables", preventSelectTemplate: "preventSelectTemplate", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames", parameterOptions: "parameterOptions", hasMoreParameters: "hasMoreParameters", isLoadingParameters: "isLoadingParameters", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex" }, outputs: { templateChanged: "templateChanged", loadMoreElements: "loadMoreElements", searchElements: "searchElements", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", createStep: "createStep", cancelled: "cancelled", redirectToParameter: "redirectToParameter", redirectToEnvironment: "redirectToEnvironment" }, host: { styleAttribute: "display: block;height: 100%;width: 100%;", classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "templateVariablesForm", first: true, predicate: TemplateVariablesFormComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white\" [ngClass]=\"{'cqa-px-4': showHeader, 'cqa-py-2': showHeader && !selectedTemplate}\">\n <!-- Header -->\n \n <h2 *ngIf=\"showHeader\" class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-1\">\n Create an action step\n </h2>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates; trackBy: trackByTemplate\"\n class=\"cqa-action-format cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm mb-6\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-overflow-y-auto\" style=\"flex: 1 1 0 !important;\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"updatedHtmlGrammar || selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n \n <div class=\"cqa-flex cqa-justify-end cqa-pt-2\" *ngIf=\"!createElementVisible\">\n <cqa-button \n *ngIf=\"selectorVariableAvailable\"\n variant=\"text\" \n size=\"sm\"\n text=\"Create Element\"\n (clicked)=\"onShowElementForm()\">\n </cqa-button>\n <cqa-button \n *ngIf=\"parameterVariableAvailable\"\n variant=\"text\" \n size=\"sm\"\n text=\"Create Parameter\"\n (clicked)=\"redirectToParameter.emit()\">\n </cqa-button>\n <cqa-button \n *ngIf=\"environmentVariableAvailable\"\n variant=\"text\" \n size=\"sm\"\n text=\"Create Environment\"\n (clicked)=\"redirectToEnvironment.emit()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto cqa-flex-1 cqa-pb-2\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap cqa-pb-4\">\n <!-- Template Variables Form Component -->\n <cqa-template-variables-form\n #templateVariablesForm\n style=\"width: 100%;\"\n [templateVariables]=\"templateVariables\"\n [variablesForm]=\"variablesForm\"\n [metadata]=\"metadata\"\n [description]=\"description\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n [createElementVisible]=\"createElementVisible\"\n (variableValueChange)=\"onVariableValueChange($event.name, $event.value)\"\n (variableBooleanChange)=\"onVariableBooleanChange($event.name, $event.value)\"\n (metadataChange)=\"metadata = $event\"\n (descriptionChange)=\"description = $event\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\"\n (elementFormVisibilityChange)=\"onElementFormVisibilityChange($event)\">\n </cqa-template-variables-form>\n </div>\n\n <!-- Advanced (Expandable) -->\n <!-- <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n </div>\n </div> -->\n <div>\n \n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div *ngIf=\"!createElementVisible\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200 cqa-pb-2\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n </div>\n</div>", components: [{ type: i2.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i4.TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: ["templateVariables", "variablesForm", "metadata", "description", "elementOptions", "hasMoreElements", "isLoadingElements", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames", "parameterOptions", "hasMoreParameters", "isLoadingParameters", "environmentOptions", "hasMoreEnvironments", "isLoadingEnvironments", "defaultTestDataProfileId", "defaultTestDataStartIndex", "createElementVisible"], outputs: ["variableValueChange", "variableBooleanChange", "metadataChange", "descriptionChange", "loadMoreElements", "searchElements", "createElement", "searchScreenName", "loadMoreScreenNames", "createScreenNameRequest", "searchParameters", "loadMoreParameters", "searchEnvironments", "loadMoreEnvironments", "cancelElementForm", "elementFormVisibilityChange"] }], directives: [{ type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
465
522
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderActionComponent, decorators: [{
466
523
  type: Component,
467
- args: [{ selector: 'cqa-step-builder-action', host: { class: 'cqa-ui-root', style: 'display: block;height: 100%;width: 100%;' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white\" [ngClass]=\"{'cqa-px-4': showHeader, 'cqa-py-2': showHeader && !selectedTemplate}\">\n <!-- Header -->\n <h2 *ngIf=\"showHeader\" class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-1\">\n Create an action step\n </h2>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates; trackBy: trackByTemplate\"\n class=\"cqa-action-format cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm mb-6\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-overflow-y-auto\" style=\"flex: 1 1 0 !important;\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"updatedHtmlGrammar || selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto cqa-flex-1 cqa-pb-2\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap cqa-pb-4\">\n <!-- Template Variables Form Component -->\n <cqa-template-variables-form\n style=\"width: 100%;\"\n [templateVariables]=\"templateVariables\"\n [variablesForm]=\"variablesForm\"\n [metadata]=\"metadata\"\n [description]=\"description\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n (variableValueChange)=\"onVariableValueChange($event.name, $event.value)\"\n (variableBooleanChange)=\"onVariableBooleanChange($event.name, $event.value)\"\n (metadataChange)=\"metadata = $event\"\n (descriptionChange)=\"description = $event\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (elementFormVisibilityChange)=\"onElementFormVisibilityChange($event)\">\n </cqa-template-variables-form>\n </div>\n\n <!-- Advanced (Expandable) -->\n <!-- <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n </div>\n </div> -->\n <div>\n \n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div *ngIf=\"!isElementFormVisible\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200 cqa-pb-2\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n </div>\n</div>", styles: [] }]
524
+ args: [{ selector: 'cqa-step-builder-action', host: { class: 'cqa-ui-root', style: 'display: block;height: 100%;width: 100%;' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white\" [ngClass]=\"{'cqa-px-4': showHeader, 'cqa-py-2': showHeader && !selectedTemplate}\">\n <!-- Header -->\n \n <h2 *ngIf=\"showHeader\" class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-1\">\n Create an action step\n </h2>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates; trackBy: trackByTemplate\"\n class=\"cqa-action-format cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm mb-6\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-overflow-y-auto\" style=\"flex: 1 1 0 !important;\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"updatedHtmlGrammar || selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n \n <div class=\"cqa-flex cqa-justify-end cqa-pt-2\" *ngIf=\"!createElementVisible\">\n <cqa-button \n *ngIf=\"selectorVariableAvailable\"\n variant=\"text\" \n size=\"sm\"\n text=\"Create Element\"\n (clicked)=\"onShowElementForm()\">\n </cqa-button>\n <cqa-button \n *ngIf=\"parameterVariableAvailable\"\n variant=\"text\" \n size=\"sm\"\n text=\"Create Parameter\"\n (clicked)=\"redirectToParameter.emit()\">\n </cqa-button>\n <cqa-button \n *ngIf=\"environmentVariableAvailable\"\n variant=\"text\" \n size=\"sm\"\n text=\"Create Environment\"\n (clicked)=\"redirectToEnvironment.emit()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto cqa-flex-1 cqa-pb-2\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap cqa-pb-4\">\n <!-- Template Variables Form Component -->\n <cqa-template-variables-form\n #templateVariablesForm\n style=\"width: 100%;\"\n [templateVariables]=\"templateVariables\"\n [variablesForm]=\"variablesForm\"\n [metadata]=\"metadata\"\n [description]=\"description\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n [createElementVisible]=\"createElementVisible\"\n (variableValueChange)=\"onVariableValueChange($event.name, $event.value)\"\n (variableBooleanChange)=\"onVariableBooleanChange($event.name, $event.value)\"\n (metadataChange)=\"metadata = $event\"\n (descriptionChange)=\"description = $event\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\"\n (elementFormVisibilityChange)=\"onElementFormVisibilityChange($event)\">\n </cqa-template-variables-form>\n </div>\n\n <!-- Advanced (Expandable) -->\n <!-- <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n </div>\n </div> -->\n <div>\n \n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div *ngIf=\"!createElementVisible\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200 cqa-pb-2\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n </div>\n</div>", styles: [] }]
468
525
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { showHeader: [{
469
526
  type: Input
470
527
  }], templates: [{
@@ -487,6 +544,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
487
544
  type: Input
488
545
  }], isLoadingScreenNames: [{
489
546
  type: Input
547
+ }], parameterOptions: [{
548
+ type: Input
549
+ }], hasMoreParameters: [{
550
+ type: Input
551
+ }], isLoadingParameters: [{
552
+ type: Input
553
+ }], environmentOptions: [{
554
+ type: Input
555
+ }], hasMoreEnvironments: [{
556
+ type: Input
557
+ }], isLoadingEnvironments: [{
558
+ type: Input
559
+ }], defaultTestDataProfileId: [{
560
+ type: Input
561
+ }], defaultTestDataStartIndex: [{
562
+ type: Input
490
563
  }], templateChanged: [{
491
564
  type: Output
492
565
  }], loadMoreElements: [{
@@ -501,9 +574,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
501
574
  type: Output
502
575
  }], createScreenNameRequest: [{
503
576
  type: Output
577
+ }], searchParameters: [{
578
+ type: Output
579
+ }], loadMoreParameters: [{
580
+ type: Output
581
+ }], searchEnvironments: [{
582
+ type: Output
583
+ }], loadMoreEnvironments: [{
584
+ type: Output
504
585
  }], createStep: [{
505
586
  type: Output
506
587
  }], cancelled: [{
507
588
  type: Output
589
+ }], redirectToParameter: [{
590
+ type: Output
591
+ }], redirectToEnvironment: [{
592
+ type: Output
593
+ }], templateVariablesForm: [{
594
+ type: ViewChild,
595
+ args: [TemplateVariablesFormComponent, { static: false }]
508
596
  }] } });
509
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3N0ZXAtYnVpbGRlci9zdGVwLWJ1aWxkZXItYWN0aW9uL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWFjdGlvbi9zdGVwLWJ1aWxkZXItYWN0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTBELE1BQU0sZUFBZSxDQUFDO0FBQy9ILE9BQU8sRUFBMEIsV0FBVyxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUFnRGhGLE1BQU0sT0FBTywwQkFBMEI7SUFzRHJDLFlBQW9CLEVBQWU7UUFBZixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBckQxQixlQUFVLEdBQVksSUFBSSxDQUFDO1FBQ3BDLDBDQUEwQztRQUNqQyxjQUFTLEdBQXFCLEVBQUUsQ0FBQztRQUUxQyx3Q0FBd0M7UUFDL0Isc0JBQWlCLEdBQVcsZ0JBQWdCLENBQUM7UUFFdEQsbUdBQW1HO1FBQzFGLHlCQUFvQixHQUF1QyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQSxDQUFBLENBQUMsQ0FBQztRQUU5RSwwQkFBcUIsR0FBYSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDM0QsbUJBQWMsR0FBYyxFQUFFLENBQUMsQ0FBQyx1Q0FBdUM7UUFDdkUsb0JBQWUsR0FBWSxLQUFLLENBQUMsQ0FBQyxzQ0FBc0M7UUFDeEUsc0JBQWlCLEdBQVksS0FBSyxDQUFDLENBQUMsNkJBQTZCO1FBQzFFLG1FQUFtRTtRQUMxRCxzQkFBaUIsR0FBb0MsRUFBRSxDQUFDO1FBQ2pFLGtFQUFrRTtRQUN6RCx1QkFBa0IsR0FB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QkFBeEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUVHLFVBQVU7c0JBQW5CLE1BQU07Z0JBR0csU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgT25EZXN0cm95LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBGb3JtQXJyYXkgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRlbXBsYXRlVmFyaWFibGVzRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL3RlbXBsYXRlLXZhcmlhYmxlcy1mb3JtL3RlbXBsYXRlLXZhcmlhYmxlcy1mb3JtLmNvbXBvbmVudCc7XG5cbi8vIEltcG9ydCBFbGVtZW50IHR5cGUgLSB1c2luZyBhbnkgZm9yIG5vdyBzaW5jZSBFbGVtZW50IGlzIGZyb20gdHMtcG9ydGFsLXVpXG4vLyBJbiBhIHJlYWwgc2NlbmFyaW8sIHlvdSBtaWdodCB3YW50IHRvIGNyZWF0ZSBhIHNoYXJlZCBpbnRlcmZhY2Ugb3IgaW1wb3J0IGZyb20gYSBzaGFyZWQgcGFja2FnZVxuaW50ZXJmYWNlIEVsZW1lbnQge1xuICBpZD86IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBsb2NhdG9yVmFsdWU/OiBzdHJpbmc7XG4gIG90aGVyTG9jYXRvcj86IHN0cmluZ1tdO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFyaWFibGVEZWZpbml0aW9uIHtcbiAgcGF0aDogc3RyaW5nO1xuICBkZWZhdWx0OiBzdHJpbmcgfCBib29sZWFuO1xuICBtdXRhYmxlOiBib29sZWFuO1xuICB0eXBlPzogc3RyaW5nO1xuICBvcHRpb25zPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uVGVtcGxhdGUge1xuICBpZD86IG51bWJlcjtcbiAgbmF0dXJhbFRleHQ/OiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICBodG1sR3JhbW1hcj86IHN0cmluZztcbiAgc2VhcmNoYWJsZUdyYW1tYXI/OiBzdHJpbmc7XG4gIHdvcmtzcGFjZVR5cGU/OiBzdHJpbmc7XG4gIGFjdGlvbj86IHN0cmluZztcbiAgaXNBZGRvbj86IGJvb2xlYW47XG4gIHZhcmlhYmxlcz86IFJlY29yZDxzdHJpbmcsIFZhcmlhYmxlRGVmaW5pdGlvbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudEZpZWxkIHtcbiAga2V5OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHR5cGU6ICdlbGVtZW50JyB8ICd0ZXN0LWRhdGEnIHwgJ2F0dHJpYnV0ZSc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zdGVwLWJ1aWxkZXItYWN0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnLCBzdHlsZTogJ2Rpc3BsYXk6IGJsb2NrO2hlaWdodDogMTAwJTt3aWR0aDogMTAwJTsnIH1cbn0pXG5leHBvcnQgY2xhc3MgU3RlcEJ1aWxkZXJBY3Rpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQElucHV0KCkgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XG4gIC8qKiBMaXN0IG9mIGFjdGlvbiB0ZW1wbGF0ZXMgdG8gZGlzcGxheSAqL1xuICBASW5wdXQoKSB0ZW1wbGF0ZXM6IEFjdGlvblRlbXBsYXRlW10gPSBbXTtcblxuICAvKiogUGxhY2Vob2xkZXIgdGV4dCBmb3Igc2VhcmNoIGlucHV0ICovXG4gIEBJbnB1dCgpIHNlYXJjaFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VhcmNoIGxpYnJhcnknO1xuXG4gIC8qKiBGdW5jdGlvbiB0byBoYW5kbGUgdmFyaWFibGUgcHJvY2Vzc2luZyBvciBjdXN0b20gbG9naWMuIENhbiBiZSBwYXNzZWQgZnJvbSBwYXJlbnQgY29tcG9uZW50LiAqL1xuICBASW5wdXQoKSBzZXRUZW1wbGF0ZVZhcmlhYmxlczogKHZhcmlhYmxlczogQWN0aW9uVGVtcGxhdGUpID0+IGFueSA9ICgpID0+IHsgcmV0dXJuIFtdfTtcblxuICBASW5wdXQoKSBwcmV2ZW50U2VsZWN0VGVtcGxhdGU6IHN0cmluZ1tdID0gWydkYXRhYmFzZXZlcmlmaWNhdGlvbiddO1xuICBASW5wdXQoKSBlbGVtZW50T3B0aW9uczogRWxlbWVudFtdID0gW107IC8vIEVsZW1lbnQgb2JqZWN0cyBmb3IgZWxlbWVudCBkcm9wZG93blxuICBASW5wdXQoKSBoYXNNb3JlRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZTsgLy8gV2hldGhlciBtb3JlIGVsZW1lbnRzIGFyZSBhdmFpbGFibGVcbiAgQElucHV0KCkgaXNMb2FkaW5nRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZTsgLy8gTG9hZGluZyBzdGF0ZSBmb3IgZWxlbWVudHNcbiAgLyoqIFNjcmVlbiBuYW1lIG9wdGlvbnMgZm9yIGVsZW1lbnQgZm9ybSBhdXRvY29tcGxldGUgKGZyb20gQVBJKSAqL1xuICBASW5wdXQoKSBzY3JlZW5OYW1lT3B0aW9uczogeyBpZD86IG51bWJlcjsgbmFtZTogc3RyaW5nIH1bXSA9IFtdO1xuICAvKiogV2hldGhlciBtb3JlIHNjcmVlbiBuYW1lcyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwgKi9cbiAgQElucHV0KCkgaGFzTW9yZVNjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIHNjcmVlbiBuYW1lcyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nU2NyZWVuTmFtZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIHRlbXBsYXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QWN0aW9uVGVtcGxhdGU+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZUVsZW1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gbG9hZCBtb3JlIGlzIHJlcXVlc3RlZFxuICBAT3V0cHV0KCkgc2VhcmNoRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIGVsZW1lbnRzXG4gIEBPdXRwdXQoKSBjcmVhdGVFbGVtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7IC8vIEVtaXQgd2hlbiBlbGVtZW50IGlzIGNyZWF0ZWRcbiAgQE91dHB1dCgpIHNlYXJjaFNjcmVlbk5hbWUgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgc2NyZWVuIG5hbWVzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZVNjcmVlbk5hbWVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIHNjcmVlbiBuYW1lc1xuICBAT3V0cHV0KCkgY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgcmVxdWVzdHMgdG8gY3JlYXRlIGEgbmV3IHNjcmVlbiBuYW1lXG4gIC8qKiBFbWl0IHdoZW4gc3RlcCBpcyBjcmVhdGVkICovXG4gIEBPdXRwdXQoKSBjcmVhdGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBjYW5jZWxsZWQgKi9cbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBmaWx0ZXJlZFRlbXBsYXRlczogQWN0aW9uVGVtcGxhdGVbXSA9IFtdO1xuICBzZWFyY2hWYWx1ZTogc3RyaW5nID0gJyc7XG4gIHNlbGVjdGVkVGVtcGxhdGU6IEFjdGlvblRlbXBsYXRlIHwgbnVsbCA9IG51bGw7XG4gIG1ldGFkYXRhOiBzdHJpbmcgPSAnJztcbiAgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnO1xuICBhZHZhbmNlZEV4cGFuZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHRlbXBsYXRlVmFyaWFibGVzOiBhbnlbXSA9IFtdO1xuICB2YXJpYWJsZXNGb3JtOiBGb3JtQXJyYXk7XG4gIHVwZGF0ZWRIdG1sR3JhbW1hcjogc3RyaW5nID0gJyc7IC8vIFVwZGF0ZWQgSFRNTCBncmFtbWFyIHdpdGggdmFyaWFibGUgdmFsdWVzXG4gIFxuICAvLyBUcmFjayBlbGVtZW50IGZvcm0gdmlzaWJpbGl0eVxuICBpc0VsZW1lbnRGb3JtVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLy8gQ2FjaGUgZm9yIHNlbGVjdCBjb25maWdzIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICBwcml2YXRlIHNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGZvcm1WYWxpZENhY2hlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgbGFzdEZvcm1WYWxpZGF0aW9uVGltZTogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBGT1JNX1ZBTElEQVRJT05fQ0FDSEVfTVMgPSAxMDA7IC8vIENhY2hlIGZvciAxMDBtc1xuICBwcml2YXRlIGZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgICB0aGlzLnZhcmlhYmxlc0Zvcm0gPSB0aGlzLmZiLmFycmF5KFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZWxlbWVudCBmb3JtIHZpc2liaWxpdHkgY2hhbmdlXG4gICAqL1xuICBvbkVsZW1lbnRGb3JtVmlzaWJpbGl0eUNoYW5nZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc0VsZW1lbnRGb3JtVmlzaWJsZSA9IHZpc2libGU7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcmVkVGVtcGxhdGVzID0gWy4uLnRoaXMudGVtcGxhdGVzXTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndGVtcGxhdGVzJ10pIHtcbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgICB9XG4gIH1cblxuICBvblNlYXJjaENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIG9uU2VhcmNoU3VibWl0KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgb25TZWFyY2hDbGVhcmVkKCk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJztcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gIH1cblxuICBhcHBseUZpbHRlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoVmFsdWUgfHwgdGhpcy5zZWFyY2hWYWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkVGVtcGxhdGVzID0gWy4uLnRoaXMudGVtcGxhdGVzXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWFyY2hUZXJtID0gdGhpcy5zZWFyY2hWYWx1ZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICB0aGlzLmZpbHRlcmVkVGVtcGxhdGVzID0gdGhpcy50ZW1wbGF0ZXMuZmlsdGVyKHRlbXBsYXRlID0+IHtcbiAgICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gdGVtcGxhdGUubmF0dXJhbFRleHQ/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICAvLyBTdHJpcCBIVE1MIHRhZ3MgZnJvbSBodG1sR3JhbW1hciBmb3Igc2VhcmNoaW5nIChvbmx5IHNlYXJjaCB0ZXh0IGNvbnRlbnQsIG5vdCBIVE1MIG1hcmt1cClcbiAgICAgIGNvbnN0IGh0bWxHcmFtbWFyVGV4dCA9IHRoaXMuc3RyaXBIdG1sVGFncyh0ZW1wbGF0ZS5odG1sR3JhbW1hciB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHNlYXJjaGFibGVHcmFtbWFyID0gdGVtcGxhdGUuc2VhcmNoYWJsZUdyYW1tYXI/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBcbiAgICAgIHJldHVybiBuYXR1cmFsVGV4dC5pbmNsdWRlcyhzZWFyY2hUZXJtKSB8fCBcbiAgICAgICAgICAgICAgaHRtbEdyYW1tYXJUZXh0LmluY2x1ZGVzKHNlYXJjaFRlcm0pIHx8IFxuICAgICAgICAgICAgIHNlYXJjaGFibGVHcmFtbWFyLmluY2x1ZGVzKHNlYXJjaFRlcm0pO1xuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKFwiZmlsdGVyZWRUZW1wbGF0ZXNcIiwgdGhpcy5maWx0ZXJlZFRlbXBsYXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogU3RyaXAgSFRNTCB0YWdzIGZyb20gYSBzdHJpbmcsIHJldHVybmluZyBvbmx5IHRoZSB0ZXh0IGNvbnRlbnRcbiAgICogQHBhcmFtIGh0bWxTdHJpbmcgLSBIVE1MIHN0cmluZyB0byBzdHJpcCB0YWdzIGZyb21cbiAgICogQHJldHVybnMgUGxhaW4gdGV4dCB3aXRob3V0IEhUTUwgdGFnc1xuICAgKi9cbiAgcHJpdmF0ZSBzdHJpcEh0bWxUYWdzKGh0bWxTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFodG1sU3RyaW5nKSByZXR1cm4gJyc7XG4gICAgXG4gICAgLy8gVXNlIGJyb3dzZXIncyBET01QYXJzZXIgaWYgYXZhaWxhYmxlXG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0ZW1wRGl2LmlubmVySFRNTCA9IGh0bWxTdHJpbmc7XG4gICAgICAgIHJldHVybiB0ZW1wRGl2LnRleHRDb250ZW50IHx8IHRlbXBEaXYuaW5uZXJUZXh0IHx8ICcnO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gcmVnZXggaWYgRE9NIHBhcnNpbmcgZmFpbHNcbiAgICAgICAgcmV0dXJuIGh0bWxTdHJpbmcucmVwbGFjZSgvPFtePl0qPi9nLCAnJyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEZhbGxiYWNrOiByZWdleC1iYXNlZCB0YWcgcmVtb3ZhbCBmb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nXG4gICAgcmV0dXJuIGh0bWxTdHJpbmcucmVwbGFjZSgvPFtePl0qPi9nLCAnJyk7XG4gIH1cblxuICBzZWxlY3RUZW1wbGF0ZSh0ZW1wbGF0ZTogQWN0aW9uVGVtcGxhdGUpOiB2b2lkIHtcbiAgICBpZih0aGlzLnByZXZlbnRTZWxlY3RUZW1wbGF0ZS5pbmNsdWRlcyh0ZW1wbGF0ZS5kaXNwbGF5TmFtZSB8fCAnJykpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVDaGFuZ2VkLmVtaXQodGVtcGxhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRlbXBsYXRlQ2hhbmdlZC5lbWl0KHRlbXBsYXRlKTtcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICBcbiAgICAvLyBDbGVhciBjYWNoZSB3aGVuIHRlbXBsYXRlIGNoYW5nZXNcbiAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5mb3JtVmFsaWRDYWNoZSA9IGZhbHNlO1xuICAgIFxuICAgIGlmKHRoaXMuc2V0VGVtcGxhdGVWYXJpYWJsZXMgJiYgdGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICAvLyBVc2Ugc2V0VGltZW91dCB0byBkZWZlciBoZWF2eSBvcGVyYXRpb25zIGFuZCBwcmV2ZW50IFVJIGZyZWV6aW5nXG4gICAgICAvLyBUaGlzIGFsbG93cyB0aGUgVUkgdG8gdXBkYXRlIGZpcnN0LCB0aGVuIHByb2Nlc3MgdGhlIHRlbXBsYXRlIHZhcmlhYmxlc1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuc2V0VGVtcGxhdGVWYXJpYWJsZXModGVtcGxhdGUpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidGVtcGxhdGVWYXJpYWJsZXNcIiwgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyk7XG4gICAgICAgICAgXG4gICAgICAgICAgdGhpcy5idWlsZFZhcmlhYmxlc0Zvcm0oKTtcbiAgICAgICAgICAvLyBJbml0aWFsaXplIHVwZGF0ZWQgSFRNTCBncmFtbWFyXG4gICAgICAgICAgdGhpcy51cGRhdGVIdG1sR3JhbW1hcigpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHByb2Nlc3NpbmcgdGVtcGxhdGUgdmFyaWFibGVzOicsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluaXRpYWxpemUgd2l0aCB0ZW1wbGF0ZSdzIEhUTUwgZ3JhbW1hciBpZiBubyB2YXJpYWJsZXNcbiAgICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gdGVtcGxhdGUuaHRtbEdyYW1tYXIgfHwgdGVtcGxhdGUubmF0dXJhbFRleHQgfHwgJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFZhcmlhYmxlc0Zvcm0oKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgZm9ybSBhcnJheVxuICAgIHdoaWxlICh0aGlzLnZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucmVtb3ZlQXQoMCk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgY2FjaGUgd2hlbiBmb3JtIGlzIHJlYnVpbHRcbiAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5mb3JtVmFsaWRDYWNoZSA9IGZhbHNlO1xuXG4gICAgLy8gVW5zdWJzY3JpYmUgZnJvbSBwcmV2aW91cyBzdWJzY3JpcHRpb24gaWYgaXQgZXhpc3RzXG4gICAgaWYgKHRoaXMuZm9ybVZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5mb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGZvcm0gZ3JvdXBzIGZvciBlYWNoIHZhcmlhYmxlXG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIC8vIEhhbmRsZSBib29sZWFuIHZhcmlhYmxlcyAtIHVzZSBib29sZWFuIHZhbHVlLCBvdGhlcnMgdXNlIHN0cmluZ1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nIFxuICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgICA6ICh2YXJpYWJsZS52YWx1ZSB8fCAnJyk7XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBhIEZvcm1Hcm91cCBmb3IgZWFjaCB2YXJpYWJsZSB3aXRoIG5hbWUgYW5kIHZhbHVlXG4gICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG5hbWU6IFt2YXJpYWJsZS5uYW1lXSxcbiAgICAgICAgdmFsdWU6IFtkZWZhdWx0VmFsdWVdLFxuICAgICAgICB0eXBlOiBbdmFyaWFibGUudHlwZSB8fCAnc3RyaW5nJ10sXG4gICAgICAgIGxhYmVsOiBbdmFyaWFibGUubGFiZWwgfHwgJyddLFxuICAgICAgICBvcHRpb25zOiBbdmFyaWFibGUub3B0aW9ucyB8fCBbXV1cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBBZGQgZGF0YVR5cGUgY29udHJvbCBmb3IgdGVzdC1kYXRhIHZhcmlhYmxlcyBpZiBuZWVkZWRcbiAgICAgIGNvbnN0IGxhYmVsID0gdmFyaWFibGUubGFiZWw/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBpZiAobGFiZWwgPT09ICd0ZXN0LWRhdGEnIHx8IGxhYmVsID09PSAnc291cmNlLXZhbHVlJyB8fCBsYWJlbCA9PT0gJ3RhcmdldC12YWx1ZScgfHwgXG4gICAgICAgICAgbGFiZWwgPT09ICdzb3VyY2VfdmFsdWUnIHx8IGxhYmVsID09PSAndGFyZ2V0X3ZhbHVlJykge1xuICAgICAgICAvLyBQYXJzZSB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIGRhdGEgdHlwZVxuICAgICAgICBjb25zdCB2YWx1ZVN0ciA9IFN0cmluZyhkZWZhdWx0VmFsdWUgfHwgJycpO1xuICAgICAgICBsZXQgZGF0YVR5cGUgPSAncGxhaW4tdGV4dCc7XG4gICAgICAgIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCdAfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgICBkYXRhVHlwZSA9ICdwYXJhbWV0ZXInO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlU3RyLnN0YXJ0c1dpdGgoJyR8JykgJiYgdmFsdWVTdHIuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgICAgIGRhdGFUeXBlID0gJ3J1bnRpbWUnO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlU3RyLnN0YXJ0c1dpdGgoJyp8JykgJiYgdmFsdWVTdHIuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgICAgIGRhdGFUeXBlID0gJ2Vudmlyb25tZW50JztcbiAgICAgICAgfVxuICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2RhdGFUeXBlJywgbmV3IEZvcm1Db250cm9sKGRhdGFUeXBlKSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIFN1YnNjcmliZSB0byBmb3JtIHZhbHVlIGNoYW5nZXMgdG8gaW52YWxpZGF0ZSBjYWNoZSAob25seSB3aGVuIHVzZXIgYWN0dWFsbHkgY2hhbmdlcyB2YWx1ZXMpXG4gICAgLy8gTm90ZTogV2UgdXNlIGVtaXRFdmVudDogZmFsc2Ugd2hlbiBwcm9ncmFtbWF0aWNhbGx5IHNldHRpbmcgdmFsdWVzLCBzbyB0aGlzIHdvbid0IGZpcmUgdW5uZWNlc3NhcmlseVxuICAgIHRoaXMuZm9ybVZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IHRoaXMudmFyaWFibGVzRm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuICBcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gQ2xlYW4gdXAgc3Vic2NyaXB0aW9uIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAgaWYgKHRoaXMuZm9ybVZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5mb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBhbnksIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIFVzZSBjYWNoZSB0byBhdm9pZCByZWNhbGN1bGF0aW5nIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb25cbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9XyR7dmFyaWFibGUub3B0aW9ucz8uam9pbignLCcpIHx8ICcnfWA7XG4gICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSAodmFyaWFibGUub3B0aW9ucyB8fCBbXSkubWFwKChvcHQ6IHN0cmluZykgPT4gKHtcbiAgICAgIGlkOiBvcHQsXG4gICAgICB2YWx1ZTogb3B0LFxuICAgICAgbmFtZTogb3B0LFxuICAgICAgbGFiZWw6IG9wdFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiBgdmFsdWVgLCAvLyBVc2UgJ3ZhbHVlJyBhcyBrZXkgc2luY2Ugd2UncmUgYWNjZXNzaW5nIGZyb20gRm9ybUFycmF5XG4gICAgICBwbGFjZWhvbGRlcjogYFNlbGVjdCAke3ZhcmlhYmxlLmxhYmVsfWAsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgdGhpcy5zZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBcbiAgLyoqIEdldCBmb3JtIGdyb3VwIGZvciBhIHZhcmlhYmxlIGJ5IG5hbWUgKi9cbiAgZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBGb3JtR3JvdXAgfCBudWxsIHtcbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy52YXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gdGhpcy52YXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgXG4gIC8qKiBBZGQgYSBuZXcgdmFyaWFibGUgdG8gdGhlIGZvcm0gYXJyYXkgZHluYW1pY2FsbHkgKi9cbiAgYWRkVmFyaWFibGUodmFyaWFibGU6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyBcbiAgICAgID8gKHZhcmlhYmxlLnZhbHVlID09PSB0cnVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAndHJ1ZScgfHwgdmFyaWFibGUudmFsdWUgPT09IDEpXG4gICAgICA6ICh2YXJpYWJsZS52YWx1ZSB8fCAnJyk7XG4gICAgXG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgbmFtZTogW3ZhcmlhYmxlLm5hbWVdLFxuICAgICAgdmFsdWU6IFtkZWZhdWx0VmFsdWVdLFxuICAgICAgdHlwZTogW3ZhcmlhYmxlLnR5cGUgfHwgJ3N0cmluZyddLFxuICAgICAgbGFiZWw6IFt2YXJpYWJsZS5sYWJlbCB8fCAnJ10sXG4gICAgICBvcHRpb25zOiBbdmFyaWFibGUub3B0aW9ucyB8fCBbXV1cbiAgICB9KTtcbiAgICBcbiAgICAvLyBBZGQgZGF0YVR5cGUgY29udHJvbCBmb3IgdGVzdC1kYXRhIHZhcmlhYmxlcyBpZiBuZWVkZWRcbiAgICBjb25zdCBsYWJlbCA9IHZhcmlhYmxlLmxhYmVsPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgIGlmIChsYWJlbCA9PT0gJ3Rlc3QtZGF0YScgfHwgbGFiZWwgPT09ICdzb3VyY2UtdmFsdWUnIHx8IGxhYmVsID09PSAndGFyZ2V0LXZhbHVlJyB8fCBcbiAgICAgICAgbGFiZWwgPT09ICdzb3VyY2VfdmFsdWUnIHx8IGxhYmVsID09PSAndGFyZ2V0X3ZhbHVlJykge1xuICAgICAgY29uc3QgdmFsdWVTdHIgPSBTdHJpbmcoZGVmYXVsdFZhbHVlIHx8ICcnKTtcbiAgICAgIGxldCBkYXRhVHlwZSA9ICdwbGFpbi10ZXh0JztcbiAgICAgIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCdAfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgZGF0YVR5cGUgPSAncGFyYW1ldGVyJztcbiAgICAgIH0gZWxzZSBpZiAodmFsdWVTdHIuc3RhcnRzV2l0aCgnJHwnKSAmJiB2YWx1ZVN0ci5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICAgIGRhdGFUeXBlID0gJ3J1bnRpbWUnO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCcqfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgZGF0YVR5cGUgPSAnZW52aXJvbm1lbnQnO1xuICAgICAgfVxuICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdkYXRhVHlwZScsIG5ldyBGb3JtQ29udHJvbChkYXRhVHlwZSkpO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucHVzaCh2YXJpYWJsZUdyb3VwKTtcbiAgICB0aGlzLmZvcm1WYWxpZENhY2hlID0gZmFsc2U7XG4gIH1cblxuICBvblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhcIm9uVmFyaWFibGVWYWx1ZUNoYW5nZVwiLCB2YXJpYWJsZU5hbWUsIHZhbHVlKTtcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvLyBBbHNvIHVwZGF0ZSBmb3JtIGFycmF5ICh1c2UgZW1pdEV2ZW50OiBmYWxzZSB0byBwcmV2ZW50IHRyaWdnZXJpbmcgdmFsdWVDaGFuZ2VzKVxuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLnZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5hdCh2YXJpYWJsZUluZGV4KS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICAgIC8vIEludmFsaWRhdGUgZm9ybSB2YWxpZGF0aW9uIGNhY2hlXG4gICAgdGhpcy5mb3JtVmFsaWRDYWNoZSA9IGZhbHNlO1xuICAgIC8vIFVwZGF0ZSBIVE1MIGdyYW1tYXIgd2l0aCBuZXcgdmFsdWVcbiAgICB0aGlzLnVwZGF0ZUh0bWxHcmFtbWFyKCk7XG4gIH1cblxuICBvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvLyBBbHNvIHVwZGF0ZSBmb3JtIGFycmF5ICh1c2UgZW1pdEV2ZW50OiBmYWxzZSB0byBwcmV2ZW50IHRyaWdnZXJpbmcgdmFsdWVDaGFuZ2VzKVxuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLnZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5hdCh2YXJpYWJsZUluZGV4KS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBuZXcgZm9ybSBncm91cCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG5hbWU6IFt2YXJpYWJsZU5hbWVdLFxuICAgICAgICB2YWx1ZTogW3ZhbHVlXSxcbiAgICAgICAgdHlwZTogWydib29sZWFuJ10sXG4gICAgICAgIGxhYmVsOiBbdmFyaWFibGU/LmxhYmVsIHx8ICcnXSxcbiAgICAgICAgb3B0aW9uczogW3ZhcmlhYmxlPy5vcHRpb25zIHx8IFtdXVxuICAgICAgfSk7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucHVzaCh2YXJpYWJsZUdyb3VwKTtcbiAgICB9XG4gICAgLy8gSW52YWxpZGF0ZSBmb3JtIHZhbGlkYXRpb24gY2FjaGVcbiAgICB0aGlzLmZvcm1WYWxpZENhY2hlID0gZmFsc2U7XG4gICAgLy8gVXBkYXRlIEhUTUwgZ3JhbW1hciB3aXRoIG5ldyB2YWx1ZVxuICAgIHRoaXMudXBkYXRlSHRtbEdyYW1tYXIoKTtcbiAgfVxuXG4gIG9uQmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBudWxsO1xuICAgIHRoaXMubWV0YWRhdGEgPSAnJztcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gJyc7XG4gICAgdGhpcy5hZHZhbmNlZEV4cGFuZGVkID0gZmFsc2U7XG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IFtdO1xuICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gJyc7XG4gICAgLy8gQ2xlYXIgZm9ybSBhcnJheVxuICAgIHdoaWxlICh0aGlzLnZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucmVtb3ZlQXQoMCk7XG4gICAgfVxuICAgIC8vIFJlYXBwbHkgZmlsdGVyIHRvIG1haW50YWluIHNlYXJjaCBzdGF0ZVxuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMub25CYWNrKCk7XG4gICAgdGhpcy5jYW5jZWxsZWQuZW1pdCgpO1xuICB9XG5cbiAgaXNGb3JtVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkVGVtcGxhdGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXNlIGNhY2hlZCByZXN1bHQgaWYgYXZhaWxhYmxlIGFuZCByZWNlbnRcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmICh0aGlzLmZvcm1WYWxpZENhY2hlICYmIChub3cgLSB0aGlzLmxhc3RGb3JtVmFsaWRhdGlvblRpbWUpIDwgdGhpcy5GT1JNX1ZBTElEQVRJT05fQ0FDSEVfTVMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1WYWxpZENhY2hlO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBpZiBhbGwgcmVxdWlyZWQgdmFyaWFibGVzIGFyZSBmaWxsZWRcbiAgICAvLyBsZXQgaXNWYWxpZCA9IHRydWU7XG4gICAgLy8gaWYgKHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgLy8gICBpc1ZhbGlkID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5ldmVyeSh2YXJpYWJsZSA9PiB7XG4gICAgLy8gICAgIC8vIEJvb2xlYW4gdmFyaWFibGVzIGFyZSBhbHdheXMgdmFsaWQgKHRoZXkgaGF2ZSBhIGRlZmF1bHQgdmFsdWUpXG4gICAgLy8gICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICAvLyBDaGVjayBpZiB2YXJpYWJsZSBoYXMgYSB2YWx1ZVxuICAgIC8vICAgICBjb25zdCB2YWx1ZSA9IHZhcmlhYmxlLnZhbHVlO1xuICAgIC8vICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gJyc7XG4gICAgLy8gICB9KTtcbiAgICAvLyB9XG4gICAgXG4gICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSB0aGlzLnZhcmlhYmxlc0Zvcm0udmFsaWQ7IFxuICAgIHRoaXMubGFzdEZvcm1WYWxpZGF0aW9uVGltZSA9IG5vdztcbiAgICByZXR1cm4gdGhpcy52YXJpYWJsZXNGb3JtLnZhbGlkO1xuICB9XG4gIFxuICB0cmFja0J5VGVtcGxhdGUoaW5kZXg6IG51bWJlciwgdGVtcGxhdGU6IEFjdGlvblRlbXBsYXRlKTogYW55IHtcbiAgICByZXR1cm4gdGVtcGxhdGUuaWQgfHwgdGVtcGxhdGUuZGlzcGxheU5hbWUgfHwgaW5kZXg7XG4gIH1cbiAgXG4gIHRyYWNrQnlWYXJpYWJsZShpbmRleDogbnVtYmVyLCB2YXJpYWJsZTogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmFyaWFibGUubmFtZSB8fCBpbmRleDtcbiAgfVxuXG4gIG9uQ3JlYXRlU3RlcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNGb3JtVmFsaWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdGVwRGF0YSA9IHtcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnNlbGVjdGVkVGVtcGxhdGUsXG4gICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgdGVtcGxhdGVWYXJpYWJsZXM6IHRoaXMudGVtcGxhdGVWYXJpYWJsZXNcbiAgICB9O1xuICAgIGNvbnNvbGUubG9nKFwic3RlcERhdGFcIiwgc3RlcERhdGEpO1xuICAgIGNvbnNvbGUubG9nKFwidmFyaWFibGVzRm9ybVwiLCB0aGlzLnZhcmlhYmxlc0Zvcm0udmFsdWUpO1xuICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgfVxuXG4gIHRvZ2dsZUFkdmFuY2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYWR2YW5jZWRFeHBhbmRlZCA9ICF0aGlzLmFkdmFuY2VkRXhwYW5kZWQ7XG4gIH1cblxuXG4gIG9uRWxlbWVudENsaWNrKGVsZW1lbnRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEZvY3VzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IGZpZWxkXG4gICAgLy8gVGhpcyBjYW4gYmUgZW5oYW5jZWQgdG8gc2Nyb2xsIHRvIG9yIGhpZ2hsaWdodCB0aGUgZmllbGRcbiAgfVxuXG4gIG9uRWxlbWVudFZhbHVlQ2hhbmdlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coa2V5LCB2YWx1ZSk7XG4gIH1cblxuICBvblRlc3REYXRhVmFsdWVDaGFuZ2Uoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgSFRNTCBncmFtbWFyIGJ5IHJlcGxhY2luZyBwbGFjZWhvbGRlciBzcGFucyB3aXRoIGFjdHVhbCB2YXJpYWJsZSB2YWx1ZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlSHRtbEdyYW1tYXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkVGVtcGxhdGUpIHtcbiAgICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaHRtbEdyYW1tYXIgPSB0aGlzLnNlbGVjdGVkVGVtcGxhdGUuaHRtbEdyYW1tYXIgfHwgdGhpcy5zZWxlY3RlZFRlbXBsYXRlLm5hdHVyYWxUZXh0IHx8ICcnO1xuICAgIGlmICghaHRtbEdyYW1tYXIpIHtcbiAgICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbWFwIG9mIHZhcmlhYmxlIHZhbHVlcyBieSBuYW1lIGZvciBxdWljayBsb29rdXBcbiAgICBjb25zdCB2YWx1ZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgaWYgKHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnRlbXBsYXRlVmFyaWFibGVzKSkge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZTogYW55KSA9PiB7XG4gICAgICAgIGlmICh2YXJpYWJsZS5uYW1lICYmIHZhcmlhYmxlLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFyaWFibGUudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBDb252ZXJ0IHZhbHVlIHRvIHN0cmluZywgaGFuZGxpbmcgYm9vbGVhbiB2YWx1ZXNcbiAgICAgICAgICBjb25zdCB2YWx1ZVN0ciA9IHR5cGVvZiB2YXJpYWJsZS52YWx1ZSA9PT0gJ2Jvb2xlYW4nIFxuICAgICAgICAgICAgPyAodmFyaWFibGUudmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnKVxuICAgICAgICAgICAgOiBTdHJpbmcodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgICAgICAgIHZhbHVlTWFwLnNldCh2YXJpYWJsZS5uYW1lLCB2YWx1ZVN0cik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFVzZSBicm93c2VyJ3MgRE9NUGFyc2VyIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGxiYWNrIHRvIHN0cmluZyByZXBsYWNlbWVudFxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGVtcERpdi5pbm5lckhUTUwgPSBTdHJpbmcoaHRtbEdyYW1tYXIpO1xuXG4gICAgICAgIC8vIEZpbmQgYWxsIHNwYW5zIHdpdGggZGF0YS1ldmVudC1rZXkgYXR0cmlidXRlXG4gICAgICAgIGNvbnN0IHNwYW5zID0gdGVtcERpdi5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50Pignc3BhbltkYXRhLWV2ZW50LWtleV0nKTtcbiAgICAgICAgc3BhbnMuZm9yRWFjaCgoc3BhbjogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICBjb25zdCBldmVudEtleSA9IHNwYW4uZ2V0QXR0cmlidXRlKCdkYXRhLWV2ZW50LWtleScpO1xuICAgICAgICAgIGlmIChldmVudEtleSAmJiB2YWx1ZU1hcC5oYXMoZXZlbnRLZXkpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlTWFwLmdldChldmVudEtleSk7XG4gICAgICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgc3BhbiBzdHJ1Y3R1cmUgYnV0IHVwZGF0ZSB0aGUgY29udGVudFxuICAgICAgICAgICAgc3Bhbi5pbm5lckhUTUwgPSB2YWx1ZSB8fCAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gdGVtcERpdi5pbm5lckhUTUw7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB1cGRhdGluZyBIVE1MIGdyYW1tYXI6JywgZXJyb3IpO1xuICAgICAgICAvLyBGYWxsYmFjayB0byBvcmlnaW5hbCBIVE1MIGdyYW1tYXJcbiAgICAgICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSBTdHJpbmcoaHRtbEdyYW1tYXIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGYWxsYmFjazogc2ltcGxlIHN0cmluZyByZXBsYWNlbWVudCBmb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nXG4gICAgICBsZXQgdXBkYXRlZEh0bWwgPSBTdHJpbmcoaHRtbEdyYW1tYXIpO1xuICAgICAgdmFsdWVNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAvLyBSZXBsYWNlIHNwYW5zIHdpdGggZGF0YS1ldmVudC1rZXkgbWF0Y2hpbmcgdGhlIHZhcmlhYmxlIG5hbWVcbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGA8c3BhbltePl0qZGF0YS1ldmVudC1rZXk9XCIke2tleX1cIltePl0qPi4qPzwvc3Bhbj5gLCAnZ2knKTtcbiAgICAgICAgdXBkYXRlZEh0bWwgPSB1cGRhdGVkSHRtbC5yZXBsYWNlKHJlZ2V4LCAobWF0Y2gpID0+IHtcbiAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBjb250ZW50IGluc2lkZSB0aGUgc3BhblxuICAgICAgICAgIHJldHVybiBtYXRjaC5yZXBsYWNlKC8+Lio/PC8sIGA+JHt2YWx1ZX08YCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnVwZGF0ZWRIdG1sR3JhbW1hciA9IHVwZGF0ZWRIdG1sO1xuICAgIH1cbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGwgY3FhLWJnLXdoaXRlXCIgW25nQ2xhc3NdPVwieydjcWEtcHgtNCc6IHNob3dIZWFkZXIsICdjcWEtcHktMic6IHNob3dIZWFkZXIgJiYgIXNlbGVjdGVkVGVtcGxhdGV9XCI+XG4gIDwhLS0gSGVhZGVyIC0tPlxuICA8aDIgKm5nSWY9XCJzaG93SGVhZGVyXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtYmxhY2stMTAwIGNxYS1tYi0xXCI+XG4gICAgQ3JlYXRlIGFuIGFjdGlvbiBzdGVwXG4gIDwvaDI+XG4gIDxkaXYgKm5nSWY9XCIhc2VsZWN0ZWRUZW1wbGF0ZVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGwgY3FhLWZsZXgtMVwiXG4gICAgW25nQ2xhc3NdPVwieydjcWEtcHgtMyc6IHNob3dIZWFkZXJ9XCI+XG5cbiAgICA8IS0tIFNlYXJjaCBCYXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1wYi0xXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXBiLTFcIiAqbmdJZj1cInNob3dIZWFkZXJcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICBUZW1wbGF0ZSBsaWJyYXJ5XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGNxYS1zZWFyY2gtYmFyIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlclwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFt2YWx1ZV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblNlYXJjaENoYW5nZSgkZXZlbnQpXCIgKHNlYXJjaCk9XCJvblNlYXJjaFN1Ym1pdCgkZXZlbnQpXCIgKGNsZWFyZWQpPVwib25TZWFyY2hDbGVhcmVkKClcIj5cbiAgICAgIDwvY3FhLXNlYXJjaC1iYXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFRlbXBsYXRlIExpc3QgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW92ZXJmbG93LXktYXV0byBjcWEtcHgtMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1weS0yXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHRlbXBsYXRlIG9mIGZpbHRlcmVkVGVtcGxhdGVzOyB0cmFja0J5OiB0cmFja0J5VGVtcGxhdGVcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWFjdGlvbi1mb3JtYXQgY3FhLWJnLXdoaXRlIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1hbGwgaG92ZXI6Y3FhLWJvcmRlci1ibHVlLTUwMCBob3ZlcjpjcWEtc2hhZG93LXNtIG1iLTZcIlxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUZW1wbGF0ZSh0ZW1wbGF0ZSlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyM3B4XSBjcWEtdGV4dC1ibGFjay0xMDBcIlxuICAgICAgICAgICAgW2lubmVySFRNTF09XCJ0ZW1wbGF0ZS5odG1sR3JhbW1hciB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJ1wiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyZWRUZW1wbGF0ZXMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJjcWEtdGV4dC1jZW50ZXIgY3FhLXB5LTggY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtWzEycHhdXCI+XG4gICAgICAgICAgTm8gdGVtcGxhdGVzIGZvdW5kXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJzZWxlY3RlZFRlbXBsYXRlXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLW92ZXJmbG93LXktYXV0b1wiIHN0eWxlPVwiZmxleDogMSAxIDAgIWltcG9ydGFudDtcIj5cbiAgICA8IS0tIEluc3RydWN0aW9uIFRleHQgd2l0aCBFbGVtZW50IEJ1dHRvbnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1tYi00IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWZsZXgtd3JhcCBjcWEtZ2FwLTEgY3FhLXRleHQtc20gY3FhLXRleHQtZ3JheS03MDBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYWN0aW9uLWZvcm1hdCBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIzcHhdIGNxYS10ZXh0LWJsYWNrLTEwMFwiXG4gICAgICAgIFtpbm5lckhUTUxdPVwidXBkYXRlZEh0bWxHcmFtbWFyIHx8IHNlbGVjdGVkVGVtcGxhdGUuaHRtbEdyYW1tYXIgfHwgc2VsZWN0ZWRUZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJ1wiPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEZvcm0gRmllbGRzIGluIFR3byBDb2x1bW5zIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1mbGV4LTEgY3FhLXBiLTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAteC02IGNxYS1mbGV4LXdyYXAgY3FhLXBiLTRcIj5cbiAgICAgICAgICA8IS0tIFRlbXBsYXRlIFZhcmlhYmxlcyBGb3JtIENvbXBvbmVudCAtLT5cbiAgICAgICAgICA8Y3FhLXRlbXBsYXRlLXZhcmlhYmxlcy1mb3JtXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlO1wiXG4gICAgICAgICAgICBbdGVtcGxhdGVWYXJpYWJsZXNdPVwidGVtcGxhdGVWYXJpYWJsZXNcIlxuICAgICAgICAgICAgW3ZhcmlhYmxlc0Zvcm1dPVwidmFyaWFibGVzRm9ybVwiXG4gICAgICAgICAgICBbbWV0YWRhdGFdPVwibWV0YWRhdGFcIlxuICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgIFtlbGVtZW50T3B0aW9uc109XCJlbGVtZW50T3B0aW9uc1wiXG4gICAgICAgICAgICBbaGFzTW9yZUVsZW1lbnRzXT1cImhhc01vcmVFbGVtZW50c1wiXG4gICAgICAgICAgICBbaXNMb2FkaW5nRWxlbWVudHNdPVwiaXNMb2FkaW5nRWxlbWVudHNcIlxuICAgICAgICAgICAgW3NjcmVlbk5hbWVPcHRpb25zXT1cInNjcmVlbk5hbWVPcHRpb25zXCJcbiAgICAgICAgICAgIFtoYXNNb3JlU2NyZWVuTmFtZXNdPVwiaGFzTW9yZVNjcmVlbk5hbWVzXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmdTY3JlZW5OYW1lc109XCJpc0xvYWRpbmdTY3JlZW5OYW1lc1wiXG4gICAgICAgICAgICAodmFyaWFibGVWYWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlVmFsdWVDaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgKHZhcmlhYmxlQm9vbGVhbkNoYW5nZSk9XCJvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSgkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAobWV0YWRhdGFDaGFuZ2UpPVwibWV0YWRhdGEgPSAkZXZlbnRcIlxuICAgICAgICAgICAgKGRlc2NyaXB0aW9uQ2hhbmdlKT1cImRlc2NyaXB0aW9uID0gJGV2ZW50XCJcbiAgICAgICAgICAgIChsb2FkTW9yZUVsZW1lbnRzKT1cImxvYWRNb3JlRWxlbWVudHMuZW1pdCgpXCJcbiAgICAgICAgICAgIChzZWFyY2hFbGVtZW50cyk9XCJzZWFyY2hFbGVtZW50cy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGNyZWF0ZUVsZW1lbnQpPVwiY3JlYXRlRWxlbWVudC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKHNlYXJjaFNjcmVlbk5hbWUpPVwic2VhcmNoU2NyZWVuTmFtZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlU2NyZWVuTmFtZXMpPVwibG9hZE1vcmVTY3JlZW5OYW1lcy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0KT1cImNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZWxlbWVudEZvcm1WaXNpYmlsaXR5Q2hhbmdlKT1cIm9uRWxlbWVudEZvcm1WaXNpYmlsaXR5Q2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICA8L2NxYS10ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBBZHZhbmNlZCAoRXhwYW5kYWJsZSkgLS0+XG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLXctZnVsbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gIGNxYS1nYXAtMiBjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXAtMCBjcWEtbWItMS41XCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVBZHZhbmNlZCgpXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XVwiPkFkdmFuY2VkPC9zcGFuPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtYmFzZVwiIFtjbGFzcy5jcWEtcm90YXRlLTE4MF09XCJhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgIGV4cGFuZF9tb3JlXG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhZHZhbmNlZEV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtbXQtMlwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cblxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRWxlbWVudEZvcm1WaXNpYmxlXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1nYXAtMiBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1ncmF5LTIwMCBjcWEtcGItMlwiPlxuICAgICAgPGNxYS1idXR0b24gY2xhc3M9XCJjcWEtdy0xLzJcIiB2YXJpYW50PVwib3V0bGluZWRcIiB0ZXh0PVwiQ2FuY2VsXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPGNxYS1idXR0b24gY2xhc3M9XCJjcWEtdy0xLzJcIiB2YXJpYW50PVwiZmlsbGVkXCIgdGV4dD1cIkNyZWF0ZSBTdGVwXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0Zvcm1WYWxpZCgpXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DcmVhdGVTdGVwKClcIj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
597
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3N0ZXAtYnVpbGRlci9zdGVwLWJ1aWxkZXItYWN0aW9uL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWFjdGlvbi9zdGVwLWJ1aWxkZXItYWN0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQStDLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvSCxPQUFPLEVBQTBCLFdBQVcsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBR2hGLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDOzs7Ozs7O0FBa0Q5RyxNQUFNLE9BQU8sMEJBQTBCO0lBNkVyQyxZQUFvQixFQUFlO1FBQWYsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQTVFMUIsZUFBVSxHQUFZLElBQUksQ0FBQztRQUNwQywwQ0FBMEM7UUFDakMsY0FBUyxHQUFxQixFQUFFLENBQUM7UUFFMUMsd0NBQXdDO1FBQy9CLHNCQUFpQixHQUFXLGdCQUFnQixDQUFDO1FBRXRELG1HQUFtRztRQUMxRix5QkFBb0IsR0FBdUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUEsQ0FBQSxDQUFDLENBQUM7UUFFOUUsMEJBQXFCLEdBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzNELG1CQUFjLEdBQWMsRUFBRSxDQUFDLENBQUMsdUNBQXVDO1FBQ3ZFLG9CQUFlLEdBQVksS0FBSyxDQUFDLENBQUMsc0NBQXNDO1FBQ3hFLHNCQUFpQixHQUFZLEtBQUssQ0FBQyxDQUFDLDZCQUE2QjtRQUMxRSxtRUFBbUU7UUFD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eUI7c0JBQWpDLEtBQUs7Z0JBQ0ksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFFRyxVQUFVO3NCQUFuQixNQUFNO2dCQUdHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFjdUQscUJBQXFCO3NCQUFsRixTQUFTO3VCQUFDLDhCQUE4QixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgT25EZXN0cm95LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBGb3JtQXJyYXkgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRlbXBsYXRlVmFyaWFibGVzRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL3RlbXBsYXRlLXZhcmlhYmxlcy1mb3JtL3RlbXBsYXRlLXZhcmlhYmxlcy1mb3JtLmNvbXBvbmVudCc7XG5cbi8vIEltcG9ydCBFbGVtZW50IHR5cGUgLSB1c2luZyBhbnkgZm9yIG5vdyBzaW5jZSBFbGVtZW50IGlzIGZyb20gdHMtcG9ydGFsLXVpXG4vLyBJbiBhIHJlYWwgc2NlbmFyaW8sIHlvdSBtaWdodCB3YW50IHRvIGNyZWF0ZSBhIHNoYXJlZCBpbnRlcmZhY2Ugb3IgaW1wb3J0IGZyb20gYSBzaGFyZWQgcGFja2FnZVxuaW50ZXJmYWNlIEVsZW1lbnQge1xuICBpZD86IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBsb2NhdG9yVmFsdWU/OiBzdHJpbmc7XG4gIG90aGVyTG9jYXRvcj86IHN0cmluZ1tdO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFyaWFibGVEZWZpbml0aW9uIHtcbiAgcGF0aDogc3RyaW5nO1xuICBkZWZhdWx0OiBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgbnVsbDtcbiAgbXV0YWJsZTogYm9vbGVhbjtcbiAgdHlwZT86IHN0cmluZztcbiAgb3B0aW9ucz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvblRlbXBsYXRlIHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hdHVyYWxUZXh0Pzogc3RyaW5nO1xuICBkaXNwbGF5TmFtZT86IHN0cmluZztcbiAgaHRtbEdyYW1tYXI/OiBzdHJpbmc7XG4gIHNlYXJjaGFibGVHcmFtbWFyPzogc3RyaW5nO1xuICB3b3Jrc3BhY2VUeXBlPzogc3RyaW5nO1xuICBhY3Rpb24/OiBzdHJpbmc7XG4gIGlzQWRkb24/OiBib29sZWFuO1xuICB2YXJpYWJsZXM/OiBSZWNvcmQ8c3RyaW5nLCBWYXJpYWJsZURlZmluaXRpb24+O1xuICBhbGxvd2VkVmFsdWVzPzogYW55O1xuICBkYXRhPzogYW55O1xuICBzdGVwQWN0aW9uVHlwZT86IGFueTtcbiAgc3RlcFR5cGU/OiBhbnk7XG4gIGRpc3BsYXlPcmRlcj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50RmllbGQge1xuICBrZXk6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgdHlwZTogJ2VsZW1lbnQnIHwgJ3Rlc3QtZGF0YScgfCAnYXR0cmlidXRlJztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN0ZXAtYnVpbGRlci1hY3Rpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcsIHN0eWxlOiAnZGlzcGxheTogYmxvY2s7aGVpZ2h0OiAxMDAlO3dpZHRoOiAxMDAlOycgfVxufSlcbmV4cG9ydCBjbGFzcyBTdGVwQnVpbGRlckFjdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBzaG93SGVhZGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqIExpc3Qgb2YgYWN0aW9uIHRlbXBsYXRlcyB0byBkaXNwbGF5ICovXG4gIEBJbnB1dCgpIHRlbXBsYXRlczogQWN0aW9uVGVtcGxhdGVbXSA9IFtdO1xuXG4gIC8qKiBQbGFjZWhvbGRlciB0ZXh0IGZvciBzZWFyY2ggaW5wdXQgKi9cbiAgQElucHV0KCkgc2VhcmNoUGxhY2Vob2xkZXI6IHN0cmluZyA9ICdTZWFyY2ggbGlicmFyeSc7XG5cbiAgLyoqIEZ1bmN0aW9uIHRvIGhhbmRsZSB2YXJpYWJsZSBwcm9jZXNzaW5nIG9yIGN1c3RvbSBsb2dpYy4gQ2FuIGJlIHBhc3NlZCBmcm9tIHBhcmVudCBjb21wb25lbnQuICovXG4gIEBJbnB1dCgpIHNldFRlbXBsYXRlVmFyaWFibGVzOiAodmFyaWFibGVzOiBBY3Rpb25UZW1wbGF0ZSkgPT4gYW55ID0gKCkgPT4geyByZXR1cm4gW119O1xuXG4gIEBJbnB1dCgpIHByZXZlbnRTZWxlY3RUZW1wbGF0ZTogc3RyaW5nW10gPSBbJ2RhdGFiYXNldmVyaWZpY2F0aW9uJ107XG4gIEBJbnB1dCgpIGVsZW1lbnRPcHRpb25zOiBFbGVtZW50W10gPSBbXTsgLy8gRWxlbWVudCBvYmplY3RzIGZvciBlbGVtZW50IGRyb3Bkb3duXG4gIEBJbnB1dCgpIGhhc01vcmVFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBXaGV0aGVyIG1vcmUgZWxlbWVudHMgYXJlIGF2YWlsYWJsZVxuICBASW5wdXQoKSBpc0xvYWRpbmdFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBMb2FkaW5nIHN0YXRlIGZvciBlbGVtZW50c1xuICAvKiogU2NyZWVuIG5hbWUgb3B0aW9ucyBmb3IgZWxlbWVudCBmb3JtIGF1dG9jb21wbGV0ZSAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIHNjcmVlbk5hbWVPcHRpb25zOiB7IGlkPzogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfVtdID0gW107XG4gIC8qKiBXaGV0aGVyIG1vcmUgc2NyZWVuIG5hbWVzIGFyZSBhdmFpbGFibGUgZm9yIGluZmluaXRlIHNjcm9sbCAqL1xuICBASW5wdXQoKSBoYXNNb3JlU2NyZWVuTmFtZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgc2NyZWVuIG5hbWVzIChzZWFyY2ggb3IgbG9hZCBtb3JlKSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdTY3JlZW5OYW1lczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogUGFyYW1ldGVyIG9wdGlvbnMgZm9yIHRlc3QgZGF0YSBwYXJhbWV0ZXIgZHJvcGRvd24gKGZyb20gQVBJKSAqL1xuICBASW5wdXQoKSBwYXJhbWV0ZXJPcHRpb25zOiBhbnlbXSA9IFtdOyAvLyBUZXN0RGF0YVtdIC0gcmF3IHRlc3QgZGF0YSBwcm9maWxlc1xuICAvKiogV2hldGhlciBtb3JlIHBhcmFtZXRlcnMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIHBhcmFtZXRlcnMgKHNlYXJjaCBvciBsb2FkIG1vcmUpICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ1BhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEVudmlyb25tZW50IG9wdGlvbnMgZm9yIGVudmlyb25tZW50IHBhcmFtZXRlciBkcm9wZG93biAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIGVudmlyb25tZW50T3B0aW9uczogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGVudmlyb25tZW50OiBzdHJpbmcgfVtdID0gW107XG4gIC8qKiBXaGV0aGVyIG1vcmUgZW52aXJvbm1lbnRzIGFyZSBhdmFpbGFibGUgZm9yIGluZmluaXRlIHNjcm9sbCAqL1xuICBASW5wdXQoKSBoYXNNb3JlRW52aXJvbm1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIGVudmlyb25tZW50cyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nRW52aXJvbm1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBEZWZhdWx0IHRlc3QgZGF0YSBwcm9maWxlIElEIGZyb20gdGVzdCBjYXNlIChpZiBhdmFpbGFibGUsIHByb2ZpbGUgYW5kIGRhdGEgc2V0IGRyb3Bkb3ducyB3aWxsIGJlIGRpc2FibGVkKSAqL1xuICBASW5wdXQoKSBkZWZhdWx0VGVzdERhdGFQcm9maWxlSWQ/OiBudW1iZXI7XG4gIC8qKiBEZWZhdWx0IHRlc3QgZGF0YSBzdGFydCBpbmRleCBmcm9tIHRlc3QgY2FzZSAoZGF0YSBzZXQgaW5kZXggaW4gdGhlIHByb2ZpbGUpICovXG4gIEBJbnB1dCgpIGRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXg/OiBudW1iZXI7XG4gIEBPdXRwdXQoKSB0ZW1wbGF0ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEFjdGlvblRlbXBsYXRlPigpO1xuICBAT3V0cHV0KCkgbG9hZE1vcmVFbGVtZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIGxvYWQgbW9yZSBpcyByZXF1ZXN0ZWRcbiAgQE91dHB1dCgpIHNlYXJjaEVsZW1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciBlbGVtZW50c1xuICBAT3V0cHV0KCkgY3JlYXRlRWxlbWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpOyAvLyBFbWl0IHdoZW4gZWxlbWVudCBpcyBjcmVhdGVkXG4gIEBPdXRwdXQoKSBzZWFyY2hTY3JlZW5OYW1lID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIHNjcmVlbiBuYW1lc1xuICBAT3V0cHV0KCkgbG9hZE1vcmVTY3JlZW5OYW1lcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBzY3JlZW4gbmFtZXNcbiAgQE91dHB1dCgpIGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHJlcXVlc3RzIHRvIGNyZWF0ZSBhIG5ldyBzY3JlZW4gbmFtZVxuICBAT3V0cHV0KCkgc2VhcmNoUGFyYW1ldGVycyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgcGFyYW1ldGVyc1xuICBAT3V0cHV0KCkgbG9hZE1vcmVQYXJhbWV0ZXJzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBwYXJhbWV0ZXJzXG4gIEBPdXRwdXQoKSBzZWFyY2hFbnZpcm9ubWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIGVudmlyb25tZW50c1xuICBAT3V0cHV0KCkgbG9hZE1vcmVFbnZpcm9ubWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIGVudmlyb25tZW50c1xuICAvKiogRW1pdCB3aGVuIHN0ZXAgaXMgY3JlYXRlZCAqL1xuICBAT3V0cHV0KCkgY3JlYXRlU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gY2FuY2VsbGVkICovXG4gIEBPdXRwdXQoKSBjYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSByZWRpcmVjdFRvUGFyYW1ldGVyID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVkaXJlY3RUb0Vudmlyb25tZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGZpbHRlcmVkVGVtcGxhdGVzOiBBY3Rpb25UZW1wbGF0ZVtdID0gW107XG4gIHNlYXJjaFZhbHVlOiBzdHJpbmcgPSAnJztcbiAgc2VsZWN0ZWRUZW1wbGF0ZTogQWN0aW9uVGVtcGxhdGUgfCBudWxsID0gbnVsbDtcbiAgbWV0YWRhdGE6IHN0cmluZyA9ICcnO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG4gIGFkdmFuY2VkRXhwYW5kZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdGVtcGxhdGVWYXJpYWJsZXM6IGFueVtdID0gW107XG4gIHZhcmlhYmxlc0Zvcm06IEZvcm1BcnJheTtcbiAgdXBkYXRlZEh0bWxHcmFtbWFyOiBzdHJpbmcgPSAnJzsgLy8gVXBkYXRlZCBIVE1MIGdyYW1tYXIgd2l0aCB2YXJpYWJsZSB2YWx1ZXNcbiAgY3JlYXRlRWxlbWVudFZpc2libGUgPSBmYWxzZTtcbiAgLy8gVHJhY2sgZWxlbWVudCBmb3JtIHZpc2liaWxpdHlcbiAgXG4gIEBWaWV3Q2hpbGQoVGVtcGxhdGVWYXJpYWJsZXNGb3JtQ29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSkgdGVtcGxhdGVWYXJpYWJsZXNGb3JtPzogVGVtcGxhdGVWYXJpYWJsZXNGb3JtQ29tcG9uZW50O1xuICBcbiAgLy8gQ2FjaGUgZm9yIHNlbGVjdCBjb25maWdzIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICBwcml2YXRlIHNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGZvcm1WYWxpZENhY2hlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgbGFzdEZvcm1WYWxpZGF0aW9uVGltZTogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBGT1JNX1ZBTElEQVRJT05fQ0FDSEVfTVMgPSAxMDA7IC8vIENhY2hlIGZvciAxMDBtc1xuICBwcml2YXRlIGZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgICB0aGlzLnZhcmlhYmxlc0Zvcm0gPSB0aGlzLmZiLmFycmF5KFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZWxlbWVudCBmb3JtIHZpc2liaWxpdHkgY2hhbmdlXG4gICAqL1xuICBvbkVsZW1lbnRGb3JtVmlzaWJpbGl0eUNoYW5nZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVFbGVtZW50VmlzaWJsZSA9IHZpc2libGU7XG4gIH1cblxuICBvblNob3dFbGVtZW50Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmNyZWF0ZUVsZW1lbnRWaXNpYmxlID0gdHJ1ZTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyZWRUZW1wbGF0ZXMgPSBbLi4udGhpcy50ZW1wbGF0ZXNdO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd0ZW1wbGF0ZXMnXSkge1xuICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VhcmNoQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgb25TZWFyY2hTdWJtaXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gIH1cblxuICBvblNlYXJjaENsZWFyZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICcnO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWFyY2hWYWx1ZSB8fCB0aGlzLnNlYXJjaFZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRUZW1wbGF0ZXMgPSBbLi4udGhpcy50ZW1wbGF0ZXNdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0aGlzLnNlYXJjaFZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIHRoaXMuZmlsdGVyZWRUZW1wbGF0ZXMgPSB0aGlzLnRlbXBsYXRlcy5maWx0ZXIodGVtcGxhdGUgPT4ge1xuICAgICAgY29uc3QgbmF0dXJhbFRleHQgPSB0ZW1wbGF0ZS5uYXR1cmFsVGV4dD8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIC8vIFN0cmlwIEhUTUwgdGFncyBmcm9tIGh0bWxHcmFtbWFyIGZvciBzZWFyY2hpbmcgKG9ubHkgc2VhcmNoIHRleHQgY29udGVudCwgbm90IEhUTUwgbWFya3VwKVxuICAgICAgY29uc3QgaHRtbEdyYW1tYXJUZXh0ID0gdGhpcy5zdHJpcEh0bWxUYWdzKHRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3Qgc2VhcmNoYWJsZUdyYW1tYXIgPSB0ZW1wbGF0ZS5zZWFyY2hhYmxlR3JhbW1hcj8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIFxuICAgICAgcmV0dXJuIG5hdHVyYWxUZXh0LmluY2x1ZGVzKHNlYXJjaFRlcm0pIHx8IFxuICAgICAgICAgICAgICBodG1sR3JhbW1hclRleHQuaW5jbHVkZXMoc2VhcmNoVGVybSkgfHwgXG4gICAgICAgICAgICAgc2VhcmNoYWJsZUdyYW1tYXIuaW5jbHVkZXMoc2VhcmNoVGVybSk7XG4gICAgfSk7XG4gICAgY29uc29sZS5sb2coXCJmaWx0ZXJlZFRlbXBsYXRlc1wiLCB0aGlzLmZpbHRlcmVkVGVtcGxhdGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpcCBIVE1MIHRhZ3MgZnJvbSBhIHN0cmluZywgcmV0dXJuaW5nIG9ubHkgdGhlIHRleHQgY29udGVudFxuICAgKiBAcGFyYW0gaHRtbFN0cmluZyAtIEhUTUwgc3RyaW5nIHRvIHN0cmlwIHRhZ3MgZnJvbVxuICAgKiBAcmV0dXJucyBQbGFpbiB0ZXh0IHdpdGhvdXQgSFRNTCB0YWdzXG4gICAqL1xuICBwcml2YXRlIHN0cmlwSHRtbFRhZ3MoaHRtbFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWh0bWxTdHJpbmcpIHJldHVybiAnJztcbiAgICBcbiAgICAvLyBVc2UgYnJvd3NlcidzIERPTVBhcnNlciBpZiBhdmFpbGFibGVcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gaHRtbFN0cmluZztcbiAgICAgICAgcmV0dXJuIHRlbXBEaXYudGV4dENvbnRlbnQgfHwgdGVtcERpdi5pbm5lclRleHQgfHwgJyc7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBGYWxsYmFjayB0byByZWdleCBpZiBET00gcGFyc2luZyBmYWlsc1xuICAgICAgICByZXR1cm4gaHRtbFN0cmluZy5yZXBsYWNlKC88W14+XSo+L2csICcnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gRmFsbGJhY2s6IHJlZ2V4LWJhc2VkIHRhZyByZW1vdmFsIGZvciBzZXJ2ZXItc2lkZSByZW5kZXJpbmdcbiAgICByZXR1cm4gaHRtbFN0cmluZy5yZXBsYWNlKC88W14+XSo+L2csICcnKTtcbiAgfVxuXG4gIHNlbGVjdFRlbXBsYXRlKHRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSk6IHZvaWQge1xuICAgIGlmKHRoaXMucHJldmVudFNlbGVjdFRlbXBsYXRlLmluY2x1ZGVzKHRlbXBsYXRlLmRpc3BsYXlOYW1lIHx8ICcnKSkge1xuICAgICAgdGhpcy50ZW1wbGF0ZUNoYW5nZWQuZW1pdCh0ZW1wbGF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudGVtcGxhdGVDaGFuZ2VkLmVtaXQodGVtcGxhdGUpO1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIFxuICAgIC8vIENsZWFyIGNhY2hlIHdoZW4gdGVtcGxhdGUgY2hhbmdlc1xuICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLmZvcm1WYWxpZENhY2hlID0gZmFsc2U7XG4gICAgXG4gICAgaWYodGhpcy5zZXRUZW1wbGF0ZVZhcmlhYmxlcyAmJiB0ZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGRlZmVyIGhlYXZ5IG9wZXJhdGlvbnMgYW5kIHByZXZlbnQgVUkgZnJlZXppbmdcbiAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBVSSB0byB1cGRhdGUgZmlyc3QsIHRoZW4gcHJvY2VzcyB0aGUgdGVtcGxhdGUgdmFyaWFibGVzXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRUZW1wbGF0ZVZhcmlhYmxlcyh0ZW1wbGF0ZSk7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJ0ZW1wbGF0ZVZhcmlhYmxlc1wiLCB0aGlzLnRlbXBsYXRlVmFyaWFibGVzKTtcbiAgICAgICAgICBcbiAgICAgICAgICB0aGlzLmJ1aWxkVmFyaWFibGVzRm9ybSgpO1xuICAgICAgICAgIC8vIEluaXRpYWxpemUgdXBkYXRlZCBIVE1MIGdyYW1tYXJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUh0bWxHcmFtbWFyKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcHJvY2Vzc2luZyB0ZW1wbGF0ZSB2YXJpYWJsZXM6JywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIHRlbXBsYXRlJ3MgSFRNTCBncmFtbWFyIGlmIG5vIHZhcmlhYmxlc1xuICAgICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSB0ZW1wbGF0ZS5odG1sR3JhbW1hciB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVmFyaWFibGVzRm9ybSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBleGlzdGluZyBmb3JtIGFycmF5XG4gICAgd2hpbGUgKHRoaXMudmFyaWFibGVzRm9ybS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5yZW1vdmVBdCgwKTtcbiAgICB9XG5cbiAgICAvLyBDbGVhciBjYWNoZSB3aGVuIGZvcm0gaXMgcmVidWlsdFxuICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLmZvcm1WYWxpZENhY2hlID0gZmFsc2U7XG5cbiAgICAvLyBVbnN1YnNjcmliZSBmcm9tIHByZXZpb3VzIHN1YnNjcmlwdGlvbiBpZiBpdCBleGlzdHNcbiAgICBpZiAodGhpcy5mb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZm9ybSBncm91cHMgZm9yIGVhY2ggdmFyaWFibGVcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gdmFyaWFibGVzIC0gdXNlIGJvb2xlYW4gdmFsdWUsIG90aGVycyB1c2Ugc3RyaW5nXG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbicgXG4gICAgICAgID8gKHZhcmlhYmxlLnZhbHVlID09PSB0cnVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAndHJ1ZScgfHwgdmFyaWFibGUudmFsdWUgPT09IDEpXG4gICAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIGEgRm9ybUdyb3VwIGZvciBlYWNoIHZhcmlhYmxlIHdpdGggbmFtZSBhbmQgdmFsdWVcbiAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmFtZTogW3ZhcmlhYmxlLm5hbWVdLFxuICAgICAgICB2YWx1ZTogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICAgIHR5cGU6IFt2YXJpYWJsZS50eXBlIHx8ICdzdHJpbmcnXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZS5sYWJlbCB8fCAnJ10sXG4gICAgICAgIG9wdGlvbnM6IFt2YXJpYWJsZS5vcHRpb25zIHx8IFtdXVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIEFkZCBkYXRhVHlwZSBjb250cm9sIGZvciB0ZXN0LWRhdGEgdmFyaWFibGVzIGlmIG5lZWRlZFxuICAgICAgY29uc3QgbGFiZWwgPSB2YXJpYWJsZS5sYWJlbD8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIGlmIChsYWJlbCA9PT0gJ3Rlc3RfZGF0YScgfHwgbGFiZWwgPT09ICdzb3VyY2UtdmFsdWUnIHx8IGxhYmVsID09PSAndGFyZ2V0LXZhbHVlJyB8fCBcbiAgICAgICAgICBsYWJlbCA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgbGFiZWwgPT09ICd0YXJnZXRfdmFsdWUnKSB7XG4gICAgICAgIC8vIFBhcnNlIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgZGF0YSB0eXBlXG4gICAgICAgIGNvbnN0IHZhbHVlU3RyID0gU3RyaW5nKGRlZmF1bHRWYWx1ZSB8fCAnJyk7XG4gICAgICAgIGxldCBkYXRhVHlwZSA9ICdwbGFpbi10ZXh0JztcbiAgICAgICAgaWYgKHZhbHVlU3RyLnN0YXJ0c1dpdGgoJ0B8JykgJiYgdmFsdWVTdHIuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgICAgIGRhdGFUeXBlID0gJ3BhcmFtZXRlcic7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVTdHIuc3RhcnRzV2l0aCgnJHwnKSAmJiB2YWx1ZVN0ci5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICAgICAgZGF0YVR5cGUgPSAncnVudGltZSc7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVTdHIuc3RhcnRzV2l0aCgnKnwnKSAmJiB2YWx1ZVN0ci5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICAgICAgZGF0YVR5cGUgPSAnZW52aXJvbm1lbnQnO1xuICAgICAgICB9XG4gICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnZGF0YVR5cGUnLCBuZXcgRm9ybUNvbnRyb2woZGF0YVR5cGUpKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLnB1c2godmFyaWFibGVHcm91cCk7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gU3Vic2NyaWJlIHRvIGZvcm0gdmFsdWUgY2hhbmdlcyB0byBpbnZhbGlkYXRlIGNhY2hlIChvbmx5IHdoZW4gdXNlciBhY3R1YWxseSBjaGFuZ2VzIHZhbHVlcylcbiAgICAvLyBOb3RlOiBXZSB1c2UgZW1pdEV2ZW50OiBmYWxzZSB3aGVuIHByb2dyYW1tYXRpY2FsbHkgc2V0dGluZyB2YWx1ZXMsIHNvIHRoaXMgd29uJ3QgZmlyZSB1bm5lY2Vzc2FyaWx5XG4gICAgdGhpcy5mb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uID0gdGhpcy52YXJpYWJsZXNGb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5mb3JtVmFsaWRDYWNoZSA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG4gIFxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhbiB1cCBzdWJzY3JpcHRpb24gdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICBpZiAodGhpcy5mb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBnZXRTZWxlY3RDb25maWcodmFyaWFibGU6IGFueSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fJHt2YXJpYWJsZS5vcHRpb25zPy5qb2luKCcsJykgfHwgJyd9YDtcbiAgICBpZiAodGhpcy5zZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9ICh2YXJpYWJsZS5vcHRpb25zIHx8IFtdKS5tYXAoKG9wdDogc3RyaW5nKSA9PiAoe1xuICAgICAgaWQ6IG9wdCxcbiAgICAgIHZhbHVlOiBvcHQsXG4gICAgICBuYW1lOiBvcHQsXG4gICAgICBsYWJlbDogb3B0XG4gICAgfSkpO1xuXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6IGB2YWx1ZWAsIC8vIFVzZSAndmFsdWUnIGFzIGtleSBzaW5jZSB3ZSdyZSBhY2Nlc3NpbmcgZnJvbSBGb3JtQXJyYXlcbiAgICAgIHBsYWNlaG9sZGVyOiBgU2VsZWN0ICR7dmFyaWFibGUubGFiZWx9YCxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIFxuICAvKiogR2V0IGZvcm0gZ3JvdXAgZm9yIGEgdmFyaWFibGUgYnkgbmFtZSAqL1xuICBnZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IEZvcm1Hcm91cCB8IG51bGwge1xuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLnZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhcmlhYmxlc0Zvcm0uYXQodmFyaWFibGVJbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBcbiAgLyoqIEFkZCBhIG5ldyB2YXJpYWJsZSB0byB0aGUgZm9ybSBhcnJheSBkeW5hbWljYWxseSAqL1xuICBhZGRWYXJpYWJsZSh2YXJpYWJsZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nIFxuICAgICAgPyAodmFyaWFibGUudmFsdWUgPT09IHRydWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICd0cnVlJyB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gMSlcbiAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICBcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICB2YWx1ZTogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICB0eXBlOiBbdmFyaWFibGUudHlwZSB8fCAnc3RyaW5nJ10sXG4gICAgICBsYWJlbDogW3ZhcmlhYmxlLmxhYmVsIHx8ICcnXSxcbiAgICAgIG9wdGlvbnM6IFt2YXJpYWJsZS5vcHRpb25zIHx8IFtdXVxuICAgIH0pO1xuICAgIFxuICAgIC8vIEFkZCBkYXRhVHlwZSBjb250cm9sIGZvciB0ZXN0LWRhdGEgdmFyaWFibGVzIGlmIG5lZWRlZFxuICAgIGNvbnN0IGxhYmVsID0gdmFyaWFibGUubGFiZWw/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgaWYgKGxhYmVsID09PSAndGVzdF9kYXRhJyB8fCBsYWJlbCA9PT0gJ3NvdXJjZS12YWx1ZScgfHwgbGFiZWwgPT09ICd0YXJnZXQtdmFsdWUnIHx8IFxuICAgICAgICBsYWJlbCA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgbGFiZWwgPT09ICd0YXJnZXRfdmFsdWUnKSB7XG4gICAgICBjb25zdCB2YWx1ZVN0ciA9IFN0cmluZyhkZWZhdWx0VmFsdWUgfHwgJycpO1xuICAgICAgbGV0IGRhdGFUeXBlID0gJ3BsYWluLXRleHQnO1xuICAgICAgaWYgKHZhbHVlU3RyLnN0YXJ0c1dpdGgoJ0B8JykgJiYgdmFsdWVTdHIuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgICBkYXRhVHlwZSA9ICdwYXJhbWV0ZXInO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCckfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgZGF0YVR5cGUgPSAncnVudGltZSc7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlU3RyLnN0YXJ0c1dpdGgoJyp8JykgJiYgdmFsdWVTdHIuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgICBkYXRhVHlwZSA9ICdlbnZpcm9ubWVudCc7XG4gICAgICB9XG4gICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2RhdGFUeXBlJywgbmV3IEZvcm1Db250cm9sKGRhdGFUeXBlKSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMudmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcbiAgfVxuXG4gIG9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKFwib25WYXJpYWJsZVZhbHVlQ2hhbmdlXCIsIHZhcmlhYmxlTmFtZSwgdmFsdWUpO1xuICAgIC8vIFVwZGF0ZSB0aGUgdmFyaWFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gYXJyYXkgKHVzZSBlbWl0RXZlbnQ6IGZhbHNlIHRvIHByZXZlbnQgdHJpZ2dlcmluZyB2YWx1ZUNoYW5nZXMpXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMudmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgLy8gSW52YWxpZGF0ZSBmb3JtIHZhbGlkYXRpb24gY2FjaGVcbiAgICB0aGlzLmZvcm1WYWxpZENhY2hlID0gZmFsc2U7XG4gICAgLy8gVXBkYXRlIEhUTUwgZ3JhbW1hciB3aXRoIG5ldyB2YWx1ZVxuICAgIHRoaXMudXBkYXRlSHRtbEdyYW1tYXIoKTtcbiAgfVxuXG4gIG9uVmFyaWFibGVCb29sZWFuQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgdmFyaWFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gYXJyYXkgKHVzZSBlbWl0RXZlbnQ6IGZhbHNlIHRvIHByZXZlbnQgdHJpZ2dlcmluZyB2YWx1ZUNoYW5nZXMpXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMudmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIG5ldyBmb3JtIGdyb3VwIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmFtZTogW3ZhcmlhYmxlTmFtZV0sXG4gICAgICAgIHZhbHVlOiBbdmFsdWVdLFxuICAgICAgICB0eXBlOiBbJ2Jvb2xlYW4nXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZT8ubGFiZWwgfHwgJyddLFxuICAgICAgICBvcHRpb25zOiBbdmFyaWFibGU/Lm9wdGlvbnMgfHwgW11dXG4gICAgICB9KTtcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIH1cbiAgICAvLyBJbnZhbGlkYXRlIGZvcm0gdmFsaWRhdGlvbiBjYWNoZVxuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcbiAgICAvLyBVcGRhdGUgSFRNTCBncmFtbWFyIHdpdGggbmV3IHZhbHVlXG4gICAgdGhpcy51cGRhdGVIdG1sR3JhbW1hcigpO1xuICB9XG5cbiAgb25CYWNrKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IG51bGw7XG4gICAgdGhpcy5tZXRhZGF0YSA9ICcnO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSAnJztcbiAgICB0aGlzLmFkdmFuY2VkRXhwYW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSAnJztcbiAgICAvLyBDbGVhciBmb3JtIGFycmF5XG4gICAgd2hpbGUgKHRoaXMudmFyaWFibGVzRm9ybS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5yZW1vdmVBdCgwKTtcbiAgICB9XG4gICAgLy8gUmVhcHBseSBmaWx0ZXIgdG8gbWFpbnRhaW4gc2VhcmNoIHN0YXRlXG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5vbkJhY2soKTtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBVc2UgY2FjaGVkIHJlc3VsdCBpZiBhdmFpbGFibGUgYW5kIHJlY2VudFxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgaWYgKHRoaXMuZm9ybVZhbGlkQ2FjaGUgJiYgKG5vdyAtIHRoaXMubGFzdEZvcm1WYWxpZGF0aW9uVGltZSkgPCB0aGlzLkZPUk1fVkFMSURBVElPTl9DQUNIRV9NUykge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybVZhbGlkQ2FjaGU7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGlmIGFsbCByZXF1aXJlZCB2YXJpYWJsZXMgYXJlIGZpbGxlZFxuICAgIC8vIGxldCBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAvLyBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAvLyAgIGlzVmFsaWQgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmV2ZXJ5KHZhcmlhYmxlID0+IHtcbiAgICAvLyAgICAgLy8gQm9vbGVhbiB2YXJpYWJsZXMgYXJlIGFsd2F5cyB2YWxpZCAodGhleSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSlcbiAgICAvLyAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgIC8vICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIC8vIENoZWNrIGlmIHZhcmlhYmxlIGhhcyBhIHZhbHVlXG4gICAgLy8gICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGUudmFsdWU7XG4gICAgLy8gICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJztcbiAgICAvLyAgIH0pO1xuICAgIC8vIH1cbiAgICBcbiAgICAvLyBDYWNoZSB0aGUgcmVzdWx0XG4gICAgdGhpcy5mb3JtVmFsaWRDYWNoZSA9IHRoaXMudmFyaWFibGVzRm9ybS52YWxpZDsgXG4gICAgdGhpcy5sYXN0Rm9ybVZhbGlkYXRpb25UaW1lID0gbm93O1xuICAgIHJldHVybiB0aGlzLnZhcmlhYmxlc0Zvcm0udmFsaWQ7XG4gIH1cbiAgXG4gIHRyYWNrQnlUZW1wbGF0ZShpbmRleDogbnVtYmVyLCB0ZW1wbGF0ZTogQWN0aW9uVGVtcGxhdGUpOiBhbnkge1xuICAgIHJldHVybiB0ZW1wbGF0ZS5pZCB8fCB0ZW1wbGF0ZS5kaXNwbGF5TmFtZSB8fCBpbmRleDtcbiAgfVxuICBcbiAgdHJhY2tCeVZhcmlhYmxlKGluZGV4OiBudW1iZXIsIHZhcmlhYmxlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2YXJpYWJsZS5uYW1lIHx8IGluZGV4O1xuICB9XG5cbiAgb25DcmVhdGVTdGVwKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0Zvcm1WYWxpZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIEdldCBlbnZpcm9ubWVudCBJRHMgZnJvbSB0ZW1wbGF0ZSB2YXJpYWJsZXMgKGlmIGFueSBlbnZpcm9ubWVudCB0eXBlIHZhcmlhYmxlcyBhcmUgc2VsZWN0ZWQpXG4gICAgY29uc3QgZW52aXJvbm1lbnRJZHMgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybT8uZ2V0RW52aXJvbm1lbnRJZHNGb3JWYXJpYWJsZXMoKSB8fCBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIFxuICAgIGNvbnN0IHN0ZXBEYXRhID0ge1xuICAgICAgdGVtcGxhdGU6IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSxcbiAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICB0ZW1wbGF0ZVZhcmlhYmxlczogdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyxcbiAgICAgIGVudmlyb25tZW50SWRzOiBlbnZpcm9ubWVudElkcyAvLyBNYXAgb2YgdmFyaWFibGUgbmFtZSB0byBlbnZpcm9ubWVudCBJRFxuICAgIH07XG4gICAgY29uc29sZS5sb2coXCJzdGVwRGF0YVwiLCBzdGVwRGF0YSk7XG4gICAgY29uc29sZS5sb2coXCJ2YXJpYWJsZXNGb3JtXCIsIHRoaXMudmFyaWFibGVzRm9ybS52YWx1ZSk7XG4gICAgY29uc29sZS5sb2coXCJlbnZpcm9ubWVudElkc1wiLCBlbnZpcm9ubWVudElkcyk7XG4gICAgdGhpcy5jcmVhdGVTdGVwLmVtaXQoc3RlcERhdGEpO1xuICB9XG5cbiAgdG9nZ2xlQWR2YW5jZWQoKTogdm9pZCB7XG4gICAgdGhpcy5hZHZhbmNlZEV4cGFuZGVkID0gIXRoaXMuYWR2YW5jZWRFeHBhbmRlZDtcbiAgfVxuXG5cbiAgb25FbGVtZW50Q2xpY2soZWxlbWVudEtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gRm9jdXMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQgZmllbGRcbiAgICAvLyBUaGlzIGNhbiBiZSBlbmhhbmNlZCB0byBzY3JvbGwgdG8gb3IgaGlnaGxpZ2h0IHRoZSBmaWVsZFxuICB9XG5cbiAgb25FbGVtZW50VmFsdWVDaGFuZ2Uoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhrZXksIHZhbHVlKTtcbiAgfVxuXG4gIG9uVGVzdERhdGFWYWx1ZUNoYW5nZShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBIVE1MIGdyYW1tYXIgYnkgcmVwbGFjaW5nIHBsYWNlaG9sZGVyIHNwYW5zIHdpdGggYWN0dWFsIHZhcmlhYmxlIHZhbHVlc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVIdG1sR3JhbW1hcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSkge1xuICAgICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBodG1sR3JhbW1hciA9IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZS5odG1sR3JhbW1hciB8fCB0aGlzLnNlbGVjdGVkVGVtcGxhdGUubmF0dXJhbFRleHQgfHwgJyc7XG4gICAgaWYgKCFodG1sR3JhbW1hcikge1xuICAgICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBtYXAgb2YgdmFyaWFibGUgdmFsdWVzIGJ5IG5hbWUgZm9yIHF1aWNrIGxvb2t1cFxuICAgIGNvbnN0IHZhbHVlTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyAmJiBBcnJheS5pc0FycmF5KHRoaXMudGVtcGxhdGVWYXJpYWJsZXMpKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHZhcmlhYmxlLm5hbWUgJiYgdmFyaWFibGUudmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YXJpYWJsZS52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIENvbnZlcnQgdmFsdWUgdG8gc3RyaW5nLCBoYW5kbGluZyBib29sZWFuIHZhbHVlc1xuICAgICAgICAgIGNvbnN0IHZhbHVlU3RyID0gdHlwZW9mIHZhcmlhYmxlLnZhbHVlID09PSAnYm9vbGVhbicgXG4gICAgICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZScpXG4gICAgICAgICAgICA6IFN0cmluZyh2YXJpYWJsZS52YWx1ZSB8fCAnJyk7XG4gICAgICAgICAgdmFsdWVNYXAuc2V0KHZhcmlhYmxlLm5hbWUsIHZhbHVlU3RyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVXNlIGJyb3dzZXIncyBET01QYXJzZXIgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbGJhY2sgdG8gc3RyaW5nIHJlcGxhY2VtZW50XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0ZW1wRGl2LmlubmVySFRNTCA9IFN0cmluZyhodG1sR3JhbW1hcik7XG5cbiAgICAgICAgLy8gRmluZCBhbGwgc3BhbnMgd2l0aCBkYXRhLWV2ZW50LWtleSBhdHRyaWJ1dGVcbiAgICAgICAgY29uc3Qgc3BhbnMgPSB0ZW1wRGl2LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdzcGFuW2RhdGEtZXZlbnQta2V5XScpO1xuICAgICAgICBzcGFucy5mb3JFYWNoKChzcGFuOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGV2ZW50S2V5ID0gc3Bhbi5nZXRBdHRyaWJ1dGUoJ2RhdGEtZXZlbnQta2V5Jyk7XG4gICAgICAgICAgaWYgKGV2ZW50S2V5ICYmIHZhbHVlTWFwLmhhcyhldmVudEtleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVNYXAuZ2V0KGV2ZW50S2V5KTtcbiAgICAgICAgICAgIC8vIFByZXNlcnZlIHRoZSBzcGFuIHN0cnVjdHVyZSBidXQgdXBkYXRlIHRoZSBjb250ZW50XG4gICAgICAgICAgICBzcGFuLmlubmVySFRNTCA9IHZhbHVlIHx8ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSB0ZW1wRGl2LmlubmVySFRNTDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHVwZGF0aW5nIEhUTUwgZ3JhbW1hcjonLCBlcnJvcik7XG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIG9yaWdpbmFsIEhUTUwgZ3JhbW1hclxuICAgICAgICB0aGlzLnVwZGF0ZWRIdG1sR3JhbW1hciA9IFN0cmluZyhodG1sR3JhbW1hcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGxiYWNrOiBzaW1wbGUgc3RyaW5nIHJlcGxhY2VtZW50IGZvciBzZXJ2ZXItc2lkZSByZW5kZXJpbmdcbiAgICAgIGxldCB1cGRhdGVkSHRtbCA9IFN0cmluZyhodG1sR3JhbW1hcik7XG4gICAgICB2YWx1ZU1hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIC8vIFJlcGxhY2Ugc3BhbnMgd2l0aCBkYXRhLWV2ZW50LWtleSBtYXRjaGluZyB0aGUgdmFyaWFibGUgbmFtZVxuICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYDxzcGFuW14+XSpkYXRhLWV2ZW50LWtleT1cIiR7a2V5fVwiW14+XSo+Lio/PC9zcGFuPmAsICdnaScpO1xuICAgICAgICB1cGRhdGVkSHRtbCA9IHVwZGF0ZWRIdG1sLnJlcGxhY2UocmVnZXgsIChtYXRjaCkgPT4ge1xuICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIGNvbnRlbnQgaW5zaWRlIHRoZSBzcGFuXG4gICAgICAgICAgcmV0dXJuIG1hdGNoLnJlcGxhY2UoLz4uKj88LywgYD4ke3ZhbHVlfTxgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gdXBkYXRlZEh0bWw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHNlbGVjdG9yIHZhcmlhYmxlIGlzIGF2YWlsYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlc1xuICAgKi9cbiAgZ2V0IHNlbGVjdG9yVmFyaWFibGVBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuc29tZSh2ID0+IHYuZGF0YUtleSA9PT0gJ2VsZW1lbnQnIHx8IHYuZGF0YUtleSA9PT0gJ2xhYmVsJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcGFyYW1ldGVyIHZhcmlhYmxlIGlzIGF2YWlsYWJsZSAodGVzdERhdGEgd2l0aCBwYXJhbWV0ZXIgdHlwZSlcbiAgICovXG4gIGdldCBwYXJhbWV0ZXJWYXJpYWJsZUF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5zb21lKHYgPT4ge1xuICAgICAgY29uc3QgZGF0YUtleSA9IHYuZGF0YUtleT8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIGlmIChkYXRhS2V5ID09PSAndGVzdF9kYXRhJyB8fCBkYXRhS2V5ID09PSAnc291cmNlX3ZhbHVlJyB8fCBkYXRhS2V5ID09PSAndGFyZ2V0X3ZhbHVlJykge1xuICAgICAgICAvLyBjb25zdCBkYXRhVHlwZSA9IHRoaXMudmFyaWFibGVEYXRhVHlwZXMuZ2V0KHYubmFtZSkgfHwgJ3BsYWluLXRleHQnO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBhdmFpbGFibGUgKHRlc3REYXRhIHdpdGggZW52aXJvbm1lbnQgdHlwZSlcbiAgICovXG4gIGdldCBlbnZpcm9ubWVudFZhcmlhYmxlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLnNvbWUodiA9PiB7XG4gICAgICBjb25zdCBkYXRhS2V5ID0gdi5kYXRhS2V5Py50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgaWYgKGRhdGFLZXkgPT09ICd0ZXN0X2RhdGEnIHx8IGRhdGFLZXkgPT09ICdzb3VyY2VfdmFsdWUnIHx8IGRhdGFLZXkgPT09ICd0YXJnZXRfdmFsdWUnKSB7XG4gICAgICAgIC8vIGNvbnN0IGRhdGFUeXBlID0gdGhpcy52YXJpYWJsZURhdGFUeXBlcy5nZXQodi5uYW1lKSB8fCAncGxhaW4tdGV4dCc7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWgtZnVsbCBjcWEtYmctd2hpdGVcIiBbbmdDbGFzc109XCJ7J2NxYS1weC00Jzogc2hvd0hlYWRlciwgJ2NxYS1weS0yJzogc2hvd0hlYWRlciAmJiAhc2VsZWN0ZWRUZW1wbGF0ZX1cIj5cbiAgPCEtLSBIZWFkZXIgLS0+XG4gIFxuICA8aDIgKm5nSWY9XCJzaG93SGVhZGVyXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtYmxhY2stMTAwIGNxYS1tYi0xXCI+XG4gICAgQ3JlYXRlIGFuIGFjdGlvbiBzdGVwXG4gIDwvaDI+XG4gIDxkaXYgKm5nSWY9XCIhc2VsZWN0ZWRUZW1wbGF0ZVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGwgY3FhLWZsZXgtMVwiXG4gICAgW25nQ2xhc3NdPVwieydjcWEtcHgtMyc6IHNob3dIZWFkZXJ9XCI+XG5cbiAgICA8IS0tIFNlYXJjaCBCYXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1wYi0xXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXBiLTFcIiAqbmdJZj1cInNob3dIZWFkZXJcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICBUZW1wbGF0ZSBsaWJyYXJ5XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGNxYS1zZWFyY2gtYmFyIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlclwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFt2YWx1ZV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblNlYXJjaENoYW5nZSgkZXZlbnQpXCIgKHNlYXJjaCk9XCJvblNlYXJjaFN1Ym1pdCgkZXZlbnQpXCIgKGNsZWFyZWQpPVwib25TZWFyY2hDbGVhcmVkKClcIj5cbiAgICAgIDwvY3FhLXNlYXJjaC1iYXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFRlbXBsYXRlIExpc3QgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW92ZXJmbG93LXktYXV0byBjcWEtcHgtMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1weS0yXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHRlbXBsYXRlIG9mIGZpbHRlcmVkVGVtcGxhdGVzOyB0cmFja0J5OiB0cmFja0J5VGVtcGxhdGVcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWFjdGlvbi1mb3JtYXQgY3FhLWJnLXdoaXRlIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1hbGwgaG92ZXI6Y3FhLWJvcmRlci1ibHVlLTUwMCBob3ZlcjpjcWEtc2hhZG93LXNtIG1iLTZcIlxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUZW1wbGF0ZSh0ZW1wbGF0ZSlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyM3B4XSBjcWEtdGV4dC1ibGFjay0xMDBcIlxuICAgICAgICAgICAgW2lubmVySFRNTF09XCJ0ZW1wbGF0ZS5odG1sR3JhbW1hciB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJ1wiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyZWRUZW1wbGF0ZXMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJjcWEtdGV4dC1jZW50ZXIgY3FhLXB5LTggY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtWzEycHhdXCI+XG4gICAgICAgICAgTm8gdGVtcGxhdGVzIGZvdW5kXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJzZWxlY3RlZFRlbXBsYXRlXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLW92ZXJmbG93LXktYXV0b1wiIHN0eWxlPVwiZmxleDogMSAxIDAgIWltcG9ydGFudDtcIj5cbiAgICA8IS0tIEluc3RydWN0aW9uIFRleHQgd2l0aCBFbGVtZW50IEJ1dHRvbnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1tYi00IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWZsZXgtd3JhcCBjcWEtZ2FwLTEgY3FhLXRleHQtc20gY3FhLXRleHQtZ3JheS03MDBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYWN0aW9uLWZvcm1hdCBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIzcHhdIGNxYS10ZXh0LWJsYWNrLTEwMFwiXG4gICAgICAgIFtpbm5lckhUTUxdPVwidXBkYXRlZEh0bWxHcmFtbWFyIHx8IHNlbGVjdGVkVGVtcGxhdGUuaHRtbEdyYW1tYXIgfHwgc2VsZWN0ZWRUZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJ1wiPlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtanVzdGlmeS1lbmQgY3FhLXB0LTJcIiAqbmdJZj1cIiFjcmVhdGVFbGVtZW50VmlzaWJsZVwiPlxuICAgICAgICA8Y3FhLWJ1dHRvbiBcbiAgICAgICAgICAqbmdJZj1cInNlbGVjdG9yVmFyaWFibGVBdmFpbGFibGVcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJ0ZXh0XCIgXG4gICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICB0ZXh0PVwiQ3JlYXRlIEVsZW1lbnRcIlxuICAgICAgICAgIChjbGlja2VkKT1cIm9uU2hvd0VsZW1lbnRGb3JtKClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWJ1dHRvbiBcbiAgICAgICAgICAqbmdJZj1cInBhcmFtZXRlclZhcmlhYmxlQXZhaWxhYmxlXCJcbiAgICAgICAgICB2YXJpYW50PVwidGV4dFwiIFxuICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgdGV4dD1cIkNyZWF0ZSBQYXJhbWV0ZXJcIlxuICAgICAgICAgIChjbGlja2VkKT1cInJlZGlyZWN0VG9QYXJhbWV0ZXIuZW1pdCgpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPGNxYS1idXR0b24gXG4gICAgICAgICAgKm5nSWY9XCJlbnZpcm9ubWVudFZhcmlhYmxlQXZhaWxhYmxlXCJcbiAgICAgICAgICB2YXJpYW50PVwidGV4dFwiIFxuICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgdGV4dD1cIkNyZWF0ZSBFbnZpcm9ubWVudFwiXG4gICAgICAgICAgKGNsaWNrZWQpPVwicmVkaXJlY3RUb0Vudmlyb25tZW50LmVtaXQoKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRm9ybSBGaWVsZHMgaW4gVHdvIENvbHVtbnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1vdmVyZmxvdy15LWF1dG8gY3FhLWZsZXgtMSBjcWEtcGItMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWdhcC14LTYgY3FhLWZsZXgtd3JhcCBjcWEtcGItNFwiPlxuICAgICAgICAgIDwhLS0gVGVtcGxhdGUgVmFyaWFibGVzIEZvcm0gQ29tcG9uZW50IC0tPlxuICAgICAgICAgIDxjcWEtdGVtcGxhdGUtdmFyaWFibGVzLWZvcm1cbiAgICAgICAgICAgICN0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm1cbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7XCJcbiAgICAgICAgICAgIFt0ZW1wbGF0ZVZhcmlhYmxlc109XCJ0ZW1wbGF0ZVZhcmlhYmxlc1wiXG4gICAgICAgICAgICBbdmFyaWFibGVzRm9ybV09XCJ2YXJpYWJsZXNGb3JtXCJcbiAgICAgICAgICAgIFttZXRhZGF0YV09XCJtZXRhZGF0YVwiXG4gICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgW2VsZW1lbnRPcHRpb25zXT1cImVsZW1lbnRPcHRpb25zXCJcbiAgICAgICAgICAgIFtoYXNNb3JlRWxlbWVudHNdPVwiaGFzTW9yZUVsZW1lbnRzXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmdFbGVtZW50c109XCJpc0xvYWRpbmdFbGVtZW50c1wiXG4gICAgICAgICAgICBbc2NyZWVuTmFtZU9wdGlvbnNdPVwic2NyZWVuTmFtZU9wdGlvbnNcIlxuICAgICAgICAgICAgW2hhc01vcmVTY3JlZW5OYW1lc109XCJoYXNNb3JlU2NyZWVuTmFtZXNcIlxuICAgICAgICAgICAgW2lzTG9hZGluZ1NjcmVlbk5hbWVzXT1cImlzTG9hZGluZ1NjcmVlbk5hbWVzXCJcbiAgICAgICAgICAgIFtwYXJhbWV0ZXJPcHRpb25zXT1cInBhcmFtZXRlck9wdGlvbnNcIlxuICAgICAgICAgICAgW2hhc01vcmVQYXJhbWV0ZXJzXT1cImhhc01vcmVQYXJhbWV0ZXJzXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmdQYXJhbWV0ZXJzXT1cImlzTG9hZGluZ1BhcmFtZXRlcnNcIlxuICAgICAgICAgICAgW2Vudmlyb25tZW50T3B0aW9uc109XCJlbnZpcm9ubWVudE9wdGlvbnNcIlxuICAgICAgICAgICAgW2hhc01vcmVFbnZpcm9ubWVudHNdPVwiaGFzTW9yZUVudmlyb25tZW50c1wiXG4gICAgICAgICAgICBbaXNMb2FkaW5nRW52aXJvbm1lbnRzXT1cImlzTG9hZGluZ0Vudmlyb25tZW50c1wiXG4gICAgICAgICAgICBbZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkXT1cImRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZFwiXG4gICAgICAgICAgICBbZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleF09XCJkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4XCJcbiAgICAgICAgICAgIFtjcmVhdGVFbGVtZW50VmlzaWJsZV09XCJjcmVhdGVFbGVtZW50VmlzaWJsZVwiXG4gICAgICAgICAgICAodmFyaWFibGVWYWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlVmFsdWVDaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgKHZhcmlhYmxlQm9vbGVhbkNoYW5nZSk9XCJvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSgkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAobWV0YWRhdGFDaGFuZ2UpPVwibWV0YWRhdGEgPSAkZXZlbnRcIlxuICAgICAgICAgICAgKGRlc2NyaXB0aW9uQ2hhbmdlKT1cImRlc2NyaXB0aW9uID0gJGV2ZW50XCJcbiAgICAgICAgICAgIChsb2FkTW9yZUVsZW1lbnRzKT1cImxvYWRNb3JlRWxlbWVudHMuZW1pdCgpXCJcbiAgICAgICAgICAgIChzZWFyY2hFbGVtZW50cyk9XCJzZWFyY2hFbGVtZW50cy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGNyZWF0ZUVsZW1lbnQpPVwiY3JlYXRlRWxlbWVudC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKHNlYXJjaFNjcmVlbk5hbWUpPVwic2VhcmNoU2NyZWVuTmFtZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlU2NyZWVuTmFtZXMpPVwibG9hZE1vcmVTY3JlZW5OYW1lcy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0KT1cImNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VhcmNoUGFyYW1ldGVycyk9XCJzZWFyY2hQYXJhbWV0ZXJzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmVQYXJhbWV0ZXJzKT1cImxvYWRNb3JlUGFyYW1ldGVycy5lbWl0KClcIlxuICAgICAgICAgICAgKHNlYXJjaEVudmlyb25tZW50cyk9XCJzZWFyY2hFbnZpcm9ubWVudHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsb2FkTW9yZUVudmlyb25tZW50cyk9XCJsb2FkTW9yZUVudmlyb25tZW50cy5lbWl0KClcIlxuICAgICAgICAgICAgKGVsZW1lbnRGb3JtVmlzaWJpbGl0eUNoYW5nZSk9XCJvbkVsZW1lbnRGb3JtVmlzaWJpbGl0eUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQWR2YW5jZWQgKEV4cGFuZGFibGUpIC0tPlxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLXctZnVsbFwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuICBjcWEtZ2FwLTIgY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1wLTAgY3FhLW1iLTEuNVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQWR2YW5jZWQoKVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTBweF1cIj5BZHZhbmNlZDwvc3Bhbj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LWJhc2VcIiBbY2xhc3MuY3FhLXJvdGF0ZS0xODBdPVwiYWR2YW5jZWRFeHBhbmRlZFwiPlxuICAgICAgICAgICAgICBleHBhbmRfbW9yZVxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWR2YW5jZWRFeHBhbmRlZFwiIGNsYXNzPVwiY3FhLW10LTJcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIFxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFjcmVhdGVFbGVtZW50VmlzaWJsZVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLXctZnVsbCBjcWEtZ2FwLTIgY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZ3JheS0yMDAgY3FhLXBiLTJcIj5cbiAgICAgIDxjcWEtYnV0dG9uIGNsYXNzPVwiY3FhLXctMS8yXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgdGV4dD1cIkNhbmNlbFwiIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uQ2FuY2VsKClcIj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgIDxjcWEtYnV0dG9uIGNsYXNzPVwiY3FhLXctMS8yXCIgdmFyaWFudD1cImZpbGxlZFwiIHRleHQ9XCJDcmVhdGUgU3RlcFwiIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhaXNGb3JtVmFsaWQoKVwiXG4gICAgICAgIChjbGlja2VkKT1cIm9uQ3JlYXRlU3RlcCgpXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19