@cqa-lib/cqa-ui 1.1.261 → 1.1.263

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.
@@ -1,5 +1,5 @@
1
1
  import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
2
- import { FormControl } from '@angular/forms';
2
+ import { FormArray, FormControl } from '@angular/forms';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "@angular/forms";
5
5
  import * as i2 from "../../button/button.component";
@@ -7,7 +7,9 @@ import * as i3 from "../../dynamic-select/dynamic-select-field.component";
7
7
  import * as i4 from "../../custom-input/custom-input.component";
8
8
  import * as i5 from "../../custom-textarea/custom-textarea.component";
9
9
  import * as i6 from "../../segment-control/segment-control.component";
10
- import * as i7 from "@angular/common";
10
+ import * as i7 from "@angular/material/icon";
11
+ import * as i8 from "../../step-builder/advanced-variables-form/advanced-variables-form.component";
12
+ import * as i9 from "@angular/common";
11
13
  export const API_EDIT_STEP_LABELS = {
12
14
  REQUEST_DETAILS: 'Request Details',
13
15
  STORE_RESPONSE: 'Store Response',
@@ -338,6 +340,10 @@ export class ApiEditStepComponent {
338
340
  options: [...ApiEditStepComponent.DEFAULT_STATUS_VERIFICATION_OPTIONS],
339
341
  };
340
342
  this.responsePreview = ``;
343
+ // Advanced settings: generic advanced variables for this API step (can be provided by parent)
344
+ this.advancedExpanded = true;
345
+ this.advancedSettingsVariables = [];
346
+ this.advancedVariablesForm = new FormArray([]);
341
347
  }
342
348
  /** The label for the current step only (used when showing a single step in the indicator). */
343
349
  get activeStepLabel() {
@@ -816,6 +822,10 @@ export class ApiEditStepComponent {
816
822
  this.validatePayloadJson();
817
823
  });
818
824
  this.validatePayloadJson();
825
+ // Build advanced settings form only from input variables (no local initialization)
826
+ if (this.advancedSettingsVariables && this.advancedSettingsVariables.length > 0) {
827
+ this.buildAdvancedVariablesForm();
828
+ }
819
829
  }
820
830
  ngAfterViewInit() {
821
831
  this.setupPayloadTextareaScrollSync();
@@ -1269,6 +1279,52 @@ export class ApiEditStepComponent {
1269
1279
  trackByStatusVerification(index) {
1270
1280
  return index;
1271
1281
  }
1282
+ /**
1283
+ * Build reactive form for advanced settings variables.
1284
+ */
1285
+ buildAdvancedVariablesForm() {
1286
+ while (this.advancedVariablesForm.length !== 0) {
1287
+ this.advancedVariablesForm.removeAt(0);
1288
+ }
1289
+ this.advancedSettingsVariables.forEach(variable => {
1290
+ const defaultValue = variable.type === 'boolean' || typeof variable.value === 'boolean'
1291
+ ? (variable.value === true || variable.value === 'true' || variable.value === 1)
1292
+ : (variable.value || '');
1293
+ const variableGroup = this.fb.group({
1294
+ name: [variable.name],
1295
+ value: [defaultValue],
1296
+ type: [variable.type || 'string'],
1297
+ label: [variable.label || '']
1298
+ });
1299
+ this.advancedVariablesForm.push(variableGroup);
1300
+ });
1301
+ }
1302
+ /**
1303
+ * Handle advanced boolean changes and keep both data and form in sync.
1304
+ */
1305
+ onAdvancedVariableBooleanChange(variableName, value) {
1306
+ const variable = this.advancedSettingsVariables.find(v => v.name === variableName);
1307
+ if (variable) {
1308
+ variable.value = value;
1309
+ }
1310
+ const variableIndex = this.advancedVariablesForm.controls.findIndex(control => control.get('name')?.value === variableName);
1311
+ if (variableIndex !== -1) {
1312
+ this.advancedVariablesForm.at(variableIndex).get('value')?.setValue(value, { emitEvent: false });
1313
+ }
1314
+ }
1315
+ /**
1316
+ * Handle non-boolean advanced values (kept for API compatibility; currently unused).
1317
+ */
1318
+ onAdvancedVariableValueChange(variableName, value) {
1319
+ const variable = this.advancedSettingsVariables.find(v => v.name === variableName);
1320
+ if (variable) {
1321
+ variable.value = value;
1322
+ }
1323
+ const variableIndex = this.advancedVariablesForm.controls.findIndex(control => control.get('name')?.value === variableName);
1324
+ if (variableIndex !== -1) {
1325
+ this.advancedVariablesForm.at(variableIndex).get('value')?.setValue(value, { emitEvent: false });
1326
+ }
1327
+ }
1272
1328
  /** Emit all entered details (environment, HTTP method, URL, headers, body, step2 variable, step3 verifications) when user clicks Create. */
1273
1329
  onCreate() {
1274
1330
  console.log('9999999');
@@ -1322,6 +1378,7 @@ export class ApiEditStepComponent {
1322
1378
  responseBodyVerifications: [],
1323
1379
  statusVerifications: [],
1324
1380
  },
1381
+ advancedSettingsVariables: this.advancedSettingsVariables,
1325
1382
  };
1326
1383
  }
1327
1384
  /** Normalize form control value to string (handles object or string). */
@@ -1406,6 +1463,7 @@ export class ApiEditStepComponent {
1406
1463
  responseBodyVerifications,
1407
1464
  statusVerifications,
1408
1465
  },
1466
+ advancedSettingsVariables: this.advancedSettingsVariables,
1409
1467
  };
1410
1468
  }
1411
1469
  /** Current header rows from form (for consumers that read headers) */
@@ -1653,10 +1711,10 @@ ApiEditStepComponent.DEFAULT_STATUS_VERIFICATION_OPTIONS = [
1653
1711
  { id: 'greater-than', value: 'greater-than', name: 'Greater than', label: 'Greater than' },
1654
1712
  ];
1655
1713
  ApiEditStepComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ApiEditStepComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1656
- ApiEditStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ApiEditStepComponent, selector: "cqa-api-edit-step", inputs: { initialMethod: "initialMethod", initialEnvironment: "initialEnvironment", initialStep: "initialStep", initialUrl: "initialUrl", initialPayloadTab: "initialPayloadTab", initialHeaders: "initialHeaders", initialResponsePreview: "initialResponsePreview", initialVariableName: "initialVariableName", editMode: "editMode", httpMethodOptions: "httpMethodOptions", environmentOptions: "environmentOptions", authTypeOptions: "authTypeOptions", initialAuthType: "initialAuthType", formatOptions: "formatOptions", initialFormat: "initialFormat", headerNameOptions: "headerNameOptions", verificationOptions: "verificationOptions", verificationDataTypeOptions: "verificationDataTypeOptions", statusVerificationOptions: "statusVerificationOptions" }, outputs: { importCurl: "importCurl", importCurlCancel: "importCurlCancel", sendRequest: "sendRequest", back: "back", cancel: "cancel", next: "next", create: "create", headersChange: "headersChange" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "payloadEditorWithLinesRef", first: true, predicate: ["payloadEditorWithLinesRef"], descendants: true }, { propertyName: "payloadTextareaRef", first: true, predicate: ["payloadTextareaRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-api-edit-step-container cqa-bg-[#ffffff] cqa-flex cqa-flex-col cqa-w-full cqa-h-full cqa-p-[16px] cqa-gap-[12px] cqa-overflow-y-auto cqa-overflow-x-hidden cqa-box-border\">\n\n <h2 class=\"cqa-api-edit-step-title cqa-font-inter cqa-text-[12px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#000000] cqa-m-0\">\n {{ editMode ? 'Update API Test Step' : 'Create API Test Step' }}\n </h2>\n\n <div class=\"cqa-api-edit-step-indicator cqa-flex cqa-items-center cqa-gap-0 cqa-max-[767px]:cqa-flex-wrap cqa-max-[767px]:cqa-gap-2 cqa-max-[767px]:cqa-justify-start\"\n [class.cqa-justify-start]=\"stepLabels.length === 1\"\n [class.cqa-justify-between]=\"stepLabels.length !== 1\">\n <ng-container *ngFor=\"let step of stepLabels; let i = index\">\n <cqa-button type=\"button\" variant=\"text\"\n customClass=\"cqa-api-edit-step-indicator-item cqa-api-edit-step-indicator-item--clickable cqa-flex cqa-items-center cqa-gap-[10px] cqa-cursor-pointer cqa-border-none cqa-p-0 cqa-font-inherit cqa-text-inherit cqa-text-left !cqa-bg-transparent\"\n [attr.aria-label]=\"'Step ' + step.index + ': ' + step.label\" [attr.aria-pressed]=\"step.index === currentStep\"\n (clicked)=\"setStep(step.index)\">\n <span class=\"cqa-api-edit-step-indicator-circle cqa-w-8 cqa-h-8 cqa-rounded-full cqa-inline-flex cqa-items-center cqa-justify-center cqa-text-sm cqa-font-medium cqa-leading-none cqa-border-none cqa-shrink-0\"\n [ngClass]=\"step.index === currentStep ? 'cqa-bg-[#4F46E5] cqa-text-white' : 'cqa-bg-[#E0E0E0] cqa-text-[#666666]'\">\n {{ step.index }}\n </span>\n <span class=\"cqa-api-edit-step-indicator-label cqa-text-sm cqa-leading-[18px] cqa-font-normal cqa-max-[767px]:cqa-text-xs\"\n [ngClass]=\"step.index === currentStep ? 'cqa-text-[#4F46E5]' : 'cqa-text-[#666666]'\">\n {{ step.label }}\n </span>\n <div *ngIf=\"i < stepLabels.length - 1\" class=\"cqa-api-edit-step-indicator-line cqa-w-[96px] cqa-h-[2px] cqa-bg-[#E0E0E0] cqa-my-0 cqa-mx-[6px] cqa-shrink-0 cqa-self-center cqa-max-[767px]:cqa-w-[24px] cqa-max-[767px]:cqa-mx-1\" aria-hidden=\"true\"></div>\n </cqa-button>\n </ng-container>\n </div>\n\n <!-- Step content viewport: only the active step body is shown (*ngIf) -->\n <div class=\"cqa-api-edit-step-viewport cqa-w-full\">\n <!-- Step 1: Environment, request, body, response -->\n <div *ngIf=\"currentStep === 1\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <!-- Environment row: new line, select aligned right -->\n <div class=\"cqa-api-edit-step-environment-row cqa-flex cqa-justify-end cqa-items-center\">\n <cqa-dynamic-select *ngIf=\"environmentForm\" [form]=\"environmentForm\" [config]=\"environmentSelectConfig\"\n class=\"cqa-api-edit-step-environment-select cqa-shrink-0 cqa-w-auto cqa-min-w-[315px] cqa-max-w-[315px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full [&_.mat-form-field-wrapper]:cqa-pb-0\" aria-label=\"Environment\"\n (selectionChange)=\"onEnvironmentSelectionChange($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Request row: method, URL, buttons -->\n <div class=\"cqa-api-edit-step-request-row cqa-flex cqa-items-center cqa-gap-3 cqa-flex-wrap cqa-max-[767px]:cqa-flex-col cqa-max-[767px]:cqa-items-stretch cqa-max-[767px]:cqa-gap-2.5\">\n <cqa-dynamic-select *ngIf=\"methodForm\" [form]=\"methodForm\" [config]=\"methodSelectConfig\"\n class=\"cqa-api-edit-step-method-select cqa-shrink-0 cqa-w-auto cqa-min-w-[152px] cqa-max-w-[152px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full\" aria-label=\"HTTP method\"\n (selectionChange)=\"onMethodSelectionChange($event)\">\n </cqa-dynamic-select>\n <div class=\"cqa-api-edit-step-url-wrap cqa-flex-1 cqa-min-w-[200px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-w-full [&_cqa-custom-input_.cqa-relative_input]:cqa-h-[40px] [&_cqa-custom-input_.cqa-relative_input]:cqa-bg-white [&_cqa-custom-input_.cqa-relative_input]:cqa-border [&_cqa-custom-input_.cqa-relative_input]:cqa-border-solid [&_cqa-custom-input_.cqa-relative_input]:cqa-border-[#D1D5DB] [&_cqa-custom-input_.cqa-relative_input]:cqa-rounded-md [&_cqa-custom-input_.cqa-relative_input]:cqa-text-sm [&_cqa-custom-input_.cqa-relative_input]:cqa-text-[#374151]\">\n <cqa-custom-input [(value)]=\"url\" [label]=\"''\" placeholder=\"\" [fullWidth]=\"true\" size=\"md\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-trigger cqa-contents cqa-max-[767px]:cqa-w-full cqa-max-[767px]:!cqa-flex\" (click)=\"openImportCurlPanel()\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Import API cURL\"\n customClass=\"cqa-api-edit-step-btn-outline !cqa-bg-white !cqa-border !cqa-border-solid !cqa-border-[#6B7280] cqa-text-[#414146] cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal hover:!cqa-bg-[#F9FAFB] hover:!cqa-text-[#414146] cqa-max-[767px]:cqa-w-full\">\n </cqa-button>\n </div>\n <cqa-button variant=\"filled\" btnSize=\"lg\" text=\"Send Request\" (clicked)=\"onSendRequest()\"\n customClass=\"cqa-api-edit-step-btn-primary cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal !cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] !cqa-border-none cqa-py-2.5 cqa-px-6 cqa-gap-2 cqa-rounded-lg cqa-min-h-[37px] cqa-box-border hover:!cqa-bg-[#1B1FEB] cqa-max-[767px]:cqa-w-full\">\n </cqa-button>\n </div>\n\n\n\n <!-- Body content: header section (default) OR import cURL section -->\n <ng-container *ngIf=\"bodyView === 'import-curl'\">\n <div class=\"cqa-api-edit-step-import-curl-panel cqa-flex cqa-flex-col cqa-bg-white cqa-rounded-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-shadow-[0_1px_3px_rgba(0,0,0,0.08)] cqa-overflow-hidden\">\n <div class=\"cqa-api-edit-step-import-curl-header cqa-flex cqa-items-center cqa-justify-between cqa-py-3 cqa-px-5 cqa-border-b cqa-border-solid cqa-border-[#E2E8F0] cqa-bg-[#F9FAFB] cqa-rounded-t-lg cqa-max-[767px]:cqa-px-4\">\n <h3 class=\"cqa-api-edit-step-import-curl-title cqa-m-0 cqa-text-xs cqa-font-bold cqa-leading-[18px] cqa-text-[#374151]\">Import API cURL</h3>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-separator cqa-h-px cqa-bg-[#E2E8F0] cqa-my-0 cqa-mx-5\"></div>\n <div class=\"cqa-api-edit-step-import-curl-body\">\n <cqa-custom-textarea [value]=\"importCurlControl.value\"\n (valueChange)=\"importCurlControl.setValue($event)\"\n placeholder=\"Paste your cURL command here (e.g., curl -X POST https://api.example.com/users)\"\n [fullWidth]=\"true\" [rows]=\"8\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-import-curl-textarea\">\n </cqa-custom-textarea>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-footer\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-import-curl-btn-cancel\" (clicked)=\"onCancelImportCurl()\"></cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Import\"\n customClass=\"cqa-api-edit-step-import-curl-btn-import\" (clicked)=\"onImportCurlConfirm()\"></cqa-button>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"bodyView === 'headers'\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of payloadTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activePayloadTab === tab.value ? ' cqa-api-edit-step-tab--active' : '') + (isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params') ? ' cqa-api-edit-step-tab--disabled' : '')\"\n [disabled]=\"isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params')\"\n (clicked)=\"setPayloadTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Payload content (Authorization) -->\n <div *ngIf=\"activePayloadTab === 'authorization'\" class=\"cqa-api-edit-step-payload\"\n [attr.style]=\"'padding: 20px; min-height: 200px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 20px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 8px; width: fit-content;'\">\n <span [attr.style]=\"'font-size: 11px; font-weight: 600; letter-spacing: 0.02em; color: #6B7280; text-transform: uppercase; line-height: 1.25;'\">AUTH TYPE</span>\n <cqa-dynamic-select *ngIf=\"authTypeForm\" [form]=\"authTypeForm\" [config]=\"authTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-type-select\" aria-label=\"Auth type\"\n [attr.style]=\"'min-width: 160px;'\">\n </cqa-dynamic-select>\n </div>\n <!-- No Auth: centered message -->\n <div *ngIf=\"selectedAuthType === 'no-auth'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; min-width: 0; text-align: center;'\">\n <div aria-hidden=\"true\"\n [attr.style]=\"'width: 48px; height: 48px; border-radius: 10px; background: #F3F4F6; display: flex; align-items: center; justify-content: center; flex-shrink: 0;'\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <rect x=\"5\" y=\"11\" width=\"14\" height=\"2\" rx=\"1\" fill=\"#9CA3AF\"/>\n </svg>\n </div>\n <span [attr.style]=\"'font-size: 16px; font-weight: 600; color: #374151; line-height: 1.25;'\">No Auth</span>\n <div [attr.style]=\"'display: flex; align-items: center; justify-content: center; gap: 6px; flex-wrap: wrap;'\">\n <span [attr.style]=\"'font-size: 14px; font-weight: 400; color: #9CA3AF; line-height: 1.4;'\">This request does not use any authorization.</span>\n <span role=\"img\" aria-label=\"More information\" title=\"This request does not use any authorization.\"\n [attr.style]=\"'display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; color: #9CA3AF; flex-shrink: 0;'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" fill=\"none\"/>\n <path d=\"M8 7v4M8 5v.5\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n </div>\n </div>\n <!-- Bearer Token: Token label + textarea -->\n <div *ngIf=\"selectedAuthType === 'bearer'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; gap: 10px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Token</span>\n <cqa-custom-textarea [(value)]=\"bearerToken\"\n placeholder=\"Enter bearer token\"\n [fullWidth]=\"true\" [rows]=\"6\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-auth-token-textarea\" ariaLabel=\"Bearer token\">\n </cqa-custom-textarea>\n </div>\n <!-- OAuth 2.0: Grant Type, Access Token URL, Client ID, Client Secret, Scope, Client Authentication -->\n <div *ngIf=\"selectedAuthType === 'oauth2' && oauth2Form\"\n class=\"cqa-api-edit-step-oauth2-grid\"\n [attr.style]=\"'display: grid; grid-template-columns: 1fr 1fr; gap: 16px 24px; width: 100%;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Grant Type</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2GrantTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"OAuth grant type\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth grant type</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Access Token URL</span>\n <cqa-custom-input [value]=\"oauth2Form.get('accessTokenUrl')?.value\"\n (valueChange)=\"oauth2Form.get('accessTokenUrl')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth token endpoint\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Access Token URL\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth token endpoint</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client ID</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientId')?.value\"\n (valueChange)=\"oauth2Form.get('clientId')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth client identifier\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client ID\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client identifier</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Secret</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientSecret')?.value\"\n (valueChange)=\"oauth2Form.get('clientSecret')?.setValue($event)\"\n type=\"password\" [label]=\"''\" placeholder=\"Enter OAuth client secret\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client Secret\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client secret</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Scope</span>\n <cqa-custom-input [value]=\"oauth2Form.get('scope')?.value\"\n (valueChange)=\"oauth2Form.get('scope')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter space-separated scopes\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Scope\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Space-separated scopes</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Authentication</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2ClientAuthSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"Client authentication method\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Client authentication method</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Payload content (Headers) -->\n <div *ngIf=\"activePayloadTab === 'headers'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-headers-grid\">\n <span class=\"cqa-api-edit-step-headers-label\">Header Name</span>\n <span class=\"cqa-api-edit-step-headers-label\">Header Value</span>\n <span class=\"cqa-api-edit-step-headers-label cqa-api-edit-step-headers-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of headerRows; let i = index; trackBy: trackByHeader\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-header-row\">\n <cqa-dynamic-select [form]=\"row\" [config]=\"headerNameSelectConfig\"\n (addCustomValue)=\"onHeaderNameAddCustomValue($event, row)\"\n class=\"cqa-api-edit-step-header-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-header-value-input\" ariaLabel=\"Header value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-header-delete'\"\n [tooltip]=\"'Remove header'\" (clicked)=\"removeHeader(i)\">\n <svg class=\"cqa-api-edit-step-header-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-add-header-wrap\">\n <cqa-button type=\"button\" variant=\"text\" text=\"+ Add Header\"\n [customClass]=\"'cqa-api-edit-step-add-header-link'\" (clicked)=\"addHeader()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Params): Key\u2013Value table with add/delete rows -->\n <div *ngIf=\"activePayloadTab === 'params'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of paramsRows; let i = index; trackBy: trackByParams\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeParamsRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addParamsRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Body only): type, format, text area, Back/Next -->\n <div *ngIf=\"activePayloadTab === 'body'\"\n class=\"cqa-api-edit-step-payload cqa-api-edit-step-payload-editor\">\n <div class=\"cqa-api-edit-step-payload-type-row\">\n <span class=\"cqa-api-edit-step-payload-type-label\">Type</span>\n <div class=\"cqa-api-edit-step-payload-type-radios\">\n <cqa-segment-control [value]=\"payloadType\" [segments]=\"payloadTypeSegments\"\n (valueChange)=\"onPayloadTypeChange($event)\"\n class=\"cqa-api-edit-step-payload-type-segment\">\n </cqa-segment-control>\n </div>\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-format-wrap\">\n <span class=\"cqa-api-edit-step-payload-format-label\">Format:</span>\n <cqa-dynamic-select *ngIf=\"payloadFormatForm\" [form]=\"payloadFormatForm\"\n [config]=\"payloadFormatSelectConfig\" class=\"cqa-api-edit-step-payload-format-select\"\n aria-label=\"Format\">\n </cqa-dynamic-select>\n </div>\n </div>\n <!-- Raw: text area with line numbers (Postman-style payload body) -->\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-body\" #payloadEditorWithLinesRef>\n <div class=\"cqa-api-edit-step-payload-editor-with-lines\">\n <div class=\"cqa-api-edit-step-payload-line-numbers\" aria-hidden=\"true\">\n <span *ngFor=\"let n of payloadLineNumbers\" class=\"cqa-api-edit-step-payload-line-num\">\n <span *ngIf=\"payloadJsonError && payloadJsonError.line === n\"\n class=\"cqa-api-edit-step-payload-line-error-icon\" [title]=\"payloadJsonErrorTooltip\"\n aria-label=\"Parse error on this line\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" fill=\"#EF4444\"/>\n <path d=\"M4 4l6 6M10 4l-6 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-api-edit-step-payload-line-num-text\">{{ n }}</span>\n </span>\n </div>\n <div class=\"cqa-api-edit-step-payload-textarea-cell\">\n <div class=\"cqa-api-edit-step-payload-textarea cqa-w-full cqa-flex cqa-flex-col cqa-min-h-0\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea--error': payloadJsonError}\">\n <textarea #payloadTextareaRef\n class=\"cqa-api-edit-step-payload-textarea-input cqa-w-full cqa-outline-none cqa-box-border\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea-input--error': payloadJsonError}\"\n [value]=\"payloadText\"\n placeholder=\"\"\n [attr.aria-label]=\"'Payload'\"\n [attr.aria-invalid]=\"!!payloadJsonError\"\n (input)=\"onPayloadInput($event)\"\n (keydown)=\"onPayloadKeydown($event)\">\n </textarea>\n </div>\n </div>\n </div>\n <p *ngIf=\"payloadJsonError\" class=\"cqa-api-edit-step-payload-json-error-msg\">\n Invalid JSON format. Please check your syntax.\n </p>\n </div>\n\n <!-- x-www-form-urlencoded: Key\u2013Value rows, add/remove dynamically -->\n <div *ngIf=\"payloadType === 'x-www-form-urlencoded'\" class=\"cqa-api-edit-step-key-value\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyValueRows; let i = index; trackBy: trackByKeyValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addKeyValueRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Data: Key\u2013Type\u2013Value rows; Type is a dropdown (Text/File), add/remove dynamically -->\n <div *ngIf=\"payloadType === 'form-data'\" class=\"cqa-api-edit-step-key-type-value\">\n <div class=\"cqa-api-edit-step-key-type-value-header\">\n <span class=\"cqa-api-edit-step-key-type-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Type</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-type-value-label cqa-api-edit-step-key-type-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyTypeValueRows; let i = index; trackBy: trackByKeyTypeValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-type-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"keyTypeValueTypeSelectConfig\"\n class=\"cqa-api-edit-step-key-type-value-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-type-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyTypeValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-type-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-type-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-type-value-add-btn\" (clicked)=\"addKeyTypeValueRow()\">\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n <!-- Step 2: Variable Name: input, validation, Back / Next -->\n <div *ngIf=\"currentStep === 2\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-variable-section\">\n <div class=\"cqa-api-edit-step-variable-input-wrap\">\n <cqa-custom-input [(value)]=\"variableName\" [label]=\"''\" placeholder=\"Variable Name\" [fullWidth]=\"true\"\n size=\"md\" (valueChange)=\"onVariableNameChange()\" aria-label=\"Variable Name\">\n </cqa-custom-input>\n </div>\n <p *ngIf=\"variableNameError\" class=\"cqa-api-edit-step-variable-error\" role=\"alert\">{{ variableNameError }}</p>\n </div>\n </div>\n <!-- Step 3: Response Body / Status tabs -->\n <div *ngIf=\"currentStep === 3\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of responseVerificationTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activeResponseVerificationTab === tab.value ? ' cqa-api-edit-step-tab--active' : '')\"\n (clicked)=\"setResponseVerificationTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Response Body tab content: verification grid -->\n <div *ngIf=\"activeResponseVerificationTab === 'response-body'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-verification\">\n <div class=\"cqa-api-edit-step-verification-grid cqa-api-edit-step-verification-grid-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">JSON Path</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Data Type</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of verificationRows; let i = index; trackBy: trackByVerification\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-custom-input [value]=\"row.get('jsonPath')?.value ?? ''\"\n (valueChange)=\"row.get('jsonPath')?.setValue($event)\" placeholder=\"Json Path\" [fullWidth]=\"true\"\n size=\"sm\" class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"JSON Path\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationDataTypeSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\"\n (selectionChange)=\"onVerificationDataTypeChange(row, $event)\">\n </cqa-dynamic-select>\n <!-- Expected Value: text for String/Array/Object, number for Number, dropdown for Boolean -->\n <ng-container [ngSwitch]=\"row.get('dataType')?.value\">\n <cqa-dynamic-select *ngSwitchCase=\"'boolean'\" [form]=\"row\"\n [config]=\"verificationExpectedValueBooleanSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-api-edit-step-verification-expected-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input *ngSwitchCase=\"'number'\" [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value (number)\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input cqa-api-edit-step-verification-expected-number\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-custom-input *ngSwitchDefault [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\"\n placeholder=\"Expected Value in String\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n </ng-container>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Status tab content: S.no, Verification dropdown, Expected Value, add/remove rows -->\n <div *ngIf=\"activeResponseVerificationTab === 'status'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addStatusVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-status-verification\">\n <div class=\"cqa-api-edit-step-status-verification-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of statusVerificationRows; let i = index; trackBy: trackByStatusVerification\"\n [formGroup]=\"row\" class=\"cqa-api-edit-step-status-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-dynamic-select [form]=\"row\" [config]=\"statusVerificationSelectConfig\"\n class=\"cqa-api-edit-step-status-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\" class=\"cqa-api-edit-step-verification-input\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeStatusVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Response Preview -->\n <div class=\"cqa-api-edit-step-response\">\n <h3 class=\"cqa-api-edit-step-response-title cqa-text-[14px] cqa-font-bold cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-mb-[12px] cqa-shrink-0\">Response Preview</h3>\n <pre class=\"cqa-api-edit-step-response-content\">{{ responsePreview }}</pre>\n </div>\n\n <!-- Step actions: one row, full width. Step 1: Cancel + Next; Step 2: Back + Next; Step 3: Back + Create -->\n <div class=\"cqa-api-edit-step-actions\">\n <ng-container [ngSwitch]=\"currentStep\">\n <ng-container *ngSwitchCase=\"1\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-actions-btn-cancel\" (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" [text]=\"editMode ? 'Update' : 'Create'\"\n customClass=\"cqa-api-edit-step-actions-btn-create\" (clicked)=\"onCreate()\">\n </cqa-button>\n </ng-container>\n </ng-container>\n </div>\n</div>", components: [{ type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i5.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "enableMarkdown", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i6.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor"], outputs: ["valueChange"] }], directives: [{ type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i7.NgSwitchDefault, selector: "[ngSwitchDefault]" }], changeDetection: i0.ChangeDetectionStrategy.Default });
1714
+ ApiEditStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ApiEditStepComponent, selector: "cqa-api-edit-step", inputs: { initialMethod: "initialMethod", initialEnvironment: "initialEnvironment", initialStep: "initialStep", initialUrl: "initialUrl", initialPayloadTab: "initialPayloadTab", initialHeaders: "initialHeaders", initialResponsePreview: "initialResponsePreview", initialVariableName: "initialVariableName", editMode: "editMode", httpMethodOptions: "httpMethodOptions", environmentOptions: "environmentOptions", authTypeOptions: "authTypeOptions", initialAuthType: "initialAuthType", formatOptions: "formatOptions", initialFormat: "initialFormat", headerNameOptions: "headerNameOptions", verificationOptions: "verificationOptions", verificationDataTypeOptions: "verificationDataTypeOptions", statusVerificationOptions: "statusVerificationOptions", advancedSettingsVariables: "advancedSettingsVariables" }, outputs: { importCurl: "importCurl", importCurlCancel: "importCurlCancel", sendRequest: "sendRequest", back: "back", cancel: "cancel", next: "next", create: "create", headersChange: "headersChange" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "payloadEditorWithLinesRef", first: true, predicate: ["payloadEditorWithLinesRef"], descendants: true }, { propertyName: "payloadTextareaRef", first: true, predicate: ["payloadTextareaRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-api-edit-step-container cqa-bg-[#ffffff] cqa-flex cqa-flex-col cqa-w-full cqa-h-full cqa-p-[16px] cqa-gap-[12px] cqa-overflow-y-auto cqa-overflow-x-hidden cqa-box-border\">\n\n <h2 class=\"cqa-api-edit-step-title cqa-font-inter cqa-text-[12px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#000000] cqa-m-0\">\n {{ editMode ? 'Update API Test Step' : 'Create API Test Step' }}\n </h2>\n\n <div class=\"cqa-api-edit-step-indicator cqa-flex cqa-items-center cqa-gap-0 cqa-max-[767px]:cqa-flex-wrap cqa-max-[767px]:cqa-gap-2 cqa-max-[767px]:cqa-justify-start\"\n [class.cqa-justify-start]=\"stepLabels.length === 1\"\n [class.cqa-justify-between]=\"stepLabels.length !== 1\">\n <ng-container *ngFor=\"let step of stepLabels; let i = index\">\n <cqa-button type=\"button\" variant=\"text\"\n customClass=\"cqa-api-edit-step-indicator-item cqa-api-edit-step-indicator-item--clickable cqa-flex cqa-items-center cqa-gap-[10px] cqa-cursor-pointer cqa-border-none cqa-p-0 cqa-font-inherit cqa-text-inherit cqa-text-left !cqa-bg-transparent\"\n [attr.aria-label]=\"'Step ' + step.index + ': ' + step.label\" [attr.aria-pressed]=\"step.index === currentStep\"\n (clicked)=\"setStep(step.index)\">\n <span class=\"cqa-api-edit-step-indicator-circle cqa-w-8 cqa-h-8 cqa-rounded-full cqa-inline-flex cqa-items-center cqa-justify-center cqa-text-sm cqa-font-medium cqa-leading-none cqa-border-none cqa-shrink-0\"\n [ngClass]=\"step.index === currentStep ? 'cqa-bg-[#4F46E5] cqa-text-white' : 'cqa-bg-[#E0E0E0] cqa-text-[#666666]'\">\n {{ step.index }}\n </span>\n <span class=\"cqa-api-edit-step-indicator-label cqa-text-sm cqa-leading-[18px] cqa-font-normal cqa-max-[767px]:cqa-text-xs\"\n [ngClass]=\"step.index === currentStep ? 'cqa-text-[#4F46E5]' : 'cqa-text-[#666666]'\">\n {{ step.label }}\n </span>\n <div *ngIf=\"i < stepLabels.length - 1\" class=\"cqa-api-edit-step-indicator-line cqa-w-[96px] cqa-h-[2px] cqa-bg-[#E0E0E0] cqa-my-0 cqa-mx-[6px] cqa-shrink-0 cqa-self-center cqa-max-[767px]:cqa-w-[24px] cqa-max-[767px]:cqa-mx-1\" aria-hidden=\"true\"></div>\n </cqa-button>\n </ng-container>\n </div>\n\n <!-- Step content viewport: only the active step body is shown (*ngIf) -->\n <div class=\"cqa-api-edit-step-viewport cqa-w-full\">\n <!-- Step 1: Environment, request, body, response -->\n <div *ngIf=\"currentStep === 1\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <!-- Environment row: label on top, select below (aligned right on desktop) -->\n <div class=\"cqa-api-edit-step-environment-row cqa-flex cqa-flex-col cqa-gap-1.5 cqa-items-end cqa-max-[767px]:cqa-items-stretch\">\n <span class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-max-[767px]:cqa-items-stretch\">\n <label class=\"cqa-api-edit-step-environment-label cqa-m-0 cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal\">Environments</label>\n <cqa-dynamic-select *ngIf=\"environmentForm\" [form]=\"environmentForm\" [config]=\"environmentSelectConfig\"\n class=\"cqa-api-edit-step-environment-select cqa-shrink-0 cqa-w-auto cqa-min-w-[315px] cqa-max-w-[315px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full [&_.mat-form-field-wrapper]:cqa-pb-0\" aria-label=\"Environment\"\n (selectionChange)=\"onEnvironmentSelectionChange($event)\">\n </cqa-dynamic-select>\n </span>\n </div>\n\n <!-- Request row: method, URL, buttons -->\n <div class=\"cqa-api-edit-step-request-row cqa-flex cqa-items-center cqa-gap-3 cqa-flex-wrap cqa-max-[767px]:cqa-flex-col cqa-max-[767px]:cqa-items-stretch cqa-max-[767px]:cqa-gap-2.5\">\n <cqa-dynamic-select *ngIf=\"methodForm\" [form]=\"methodForm\" [config]=\"methodSelectConfig\"\n class=\"cqa-api-edit-step-method-select cqa-shrink-0 cqa-w-auto cqa-min-w-[152px] cqa-max-w-[152px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full\" aria-label=\"HTTP method\"\n (selectionChange)=\"onMethodSelectionChange($event)\">\n </cqa-dynamic-select>\n <div class=\"cqa-api-edit-step-url-wrap cqa-flex-1 cqa-min-w-[200px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-w-full [&_cqa-custom-input_.cqa-relative_input]:cqa-h-[40px] [&_cqa-custom-input_.cqa-relative_input]:cqa-bg-white [&_cqa-custom-input_.cqa-relative_input]:cqa-border [&_cqa-custom-input_.cqa-relative_input]:cqa-border-solid [&_cqa-custom-input_.cqa-relative_input]:cqa-border-[#D1D5DB] [&_cqa-custom-input_.cqa-relative_input]:cqa-rounded-md [&_cqa-custom-input_.cqa-relative_input]:cqa-text-sm [&_cqa-custom-input_.cqa-relative_input]:cqa-text-[#374151]\">\n <cqa-custom-input [(value)]=\"url\" [label]=\"''\" placeholder=\"Enter request URL\" [fullWidth]=\"true\" size=\"md\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-trigger cqa-contents cqa-max-[767px]:cqa-w-full cqa-max-[767px]:!cqa-flex\" (click)=\"openImportCurlPanel()\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Import API cURL\"\n customClass=\"cqa-api-edit-step-btn-outline !cqa-bg-white !cqa-border !cqa-border-solid !cqa-border-[#6B7280] cqa-text-[#414146] cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal hover:!cqa-bg-[#F9FAFB] hover:!cqa-text-[#414146] cqa-max-[767px]:cqa-w-full\">\n </cqa-button>\n </div>\n <cqa-button variant=\"filled\" btnSize=\"lg\" text=\"Send Request\" (clicked)=\"onSendRequest()\"\n customClass=\"cqa-api-edit-step-btn-primary cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal !cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] !cqa-border-none cqa-py-2.5 cqa-px-6 cqa-gap-2 cqa-rounded-lg cqa-min-h-[37px] cqa-box-border hover:!cqa-bg-[#1B1FEB] cqa-max-[767px]:cqa-w-full\">\n </cqa-button>\n </div>\n\n\n\n <!-- Body content: header section (default) OR import cURL section -->\n <ng-container *ngIf=\"bodyView === 'import-curl'\">\n <div class=\"cqa-api-edit-step-import-curl-panel cqa-flex cqa-flex-col cqa-bg-white cqa-rounded-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-shadow-[0_1px_3px_rgba(0,0,0,0.08)] cqa-overflow-hidden\">\n <div class=\"cqa-api-edit-step-import-curl-header cqa-flex cqa-items-center cqa-justify-between cqa-py-3 cqa-px-5 cqa-border-b cqa-border-solid cqa-border-[#E2E8F0] cqa-bg-[#F9FAFB] cqa-rounded-t-lg cqa-max-[767px]:cqa-px-4\">\n <h3 class=\"cqa-api-edit-step-import-curl-title cqa-m-0 cqa-text-xs cqa-font-bold cqa-leading-[18px] cqa-text-[#374151]\">Import API cURL</h3>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-separator cqa-h-px cqa-bg-[#E2E8F0] cqa-my-0 cqa-mx-5\"></div>\n <div class=\"cqa-api-edit-step-import-curl-body\">\n <cqa-custom-textarea [value]=\"importCurlControl.value\"\n (valueChange)=\"importCurlControl.setValue($event)\"\n placeholder=\"Paste your cURL command here (e.g., curl -X POST https://api.example.com/users)\"\n [fullWidth]=\"true\" [rows]=\"8\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-import-curl-textarea\">\n </cqa-custom-textarea>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-footer\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-import-curl-btn-cancel\" (clicked)=\"onCancelImportCurl()\"></cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Import\"\n customClass=\"cqa-api-edit-step-import-curl-btn-import\" (clicked)=\"onImportCurlConfirm()\"></cqa-button>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"bodyView === 'headers'\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of payloadTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activePayloadTab === tab.value ? ' cqa-api-edit-step-tab--active' : '') + (isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params') ? ' cqa-api-edit-step-tab--disabled' : '')\"\n [disabled]=\"isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params')\"\n (clicked)=\"setPayloadTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Payload content (Authorization) -->\n <div *ngIf=\"activePayloadTab === 'authorization'\" class=\"cqa-api-edit-step-payload\"\n [attr.style]=\"'padding: 20px; min-height: 200px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 20px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 8px; width: fit-content;'\">\n <span [attr.style]=\"'font-size: 11px; font-weight: 600; letter-spacing: 0.02em; color: #6B7280; text-transform: uppercase; line-height: 1.25;'\">AUTH TYPE</span>\n <cqa-dynamic-select *ngIf=\"authTypeForm\" [form]=\"authTypeForm\" [config]=\"authTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-type-select\" aria-label=\"Auth type\"\n [attr.style]=\"'min-width: 160px;'\">\n </cqa-dynamic-select>\n </div>\n <!-- No Auth: centered message -->\n <div *ngIf=\"selectedAuthType === 'no-auth'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; min-width: 0; text-align: center;'\">\n <div aria-hidden=\"true\"\n [attr.style]=\"'width: 48px; height: 48px; border-radius: 10px; background: #F3F4F6; display: flex; align-items: center; justify-content: center; flex-shrink: 0;'\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <rect x=\"5\" y=\"11\" width=\"14\" height=\"2\" rx=\"1\" fill=\"#9CA3AF\"/>\n </svg>\n </div>\n <span [attr.style]=\"'font-size: 16px; font-weight: 600; color: #374151; line-height: 1.25;'\">No Auth</span>\n <div [attr.style]=\"'display: flex; align-items: center; justify-content: center; gap: 6px; flex-wrap: wrap;'\">\n <span [attr.style]=\"'font-size: 14px; font-weight: 400; color: #9CA3AF; line-height: 1.4;'\">This request does not use any authorization.</span>\n <span role=\"img\" aria-label=\"More information\" title=\"This request does not use any authorization.\"\n [attr.style]=\"'display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; color: #9CA3AF; flex-shrink: 0;'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" fill=\"none\"/>\n <path d=\"M8 7v4M8 5v.5\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n </div>\n </div>\n <!-- Bearer Token: Token label + textarea -->\n <div *ngIf=\"selectedAuthType === 'bearer'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; gap: 10px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Token</span>\n <cqa-custom-textarea [(value)]=\"bearerToken\"\n placeholder=\"Enter bearer token\"\n [fullWidth]=\"true\" [rows]=\"6\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-auth-token-textarea\" ariaLabel=\"Bearer token\">\n </cqa-custom-textarea>\n </div>\n <!-- OAuth 2.0: Grant Type, Access Token URL, Client ID, Client Secret, Scope, Client Authentication -->\n <div *ngIf=\"selectedAuthType === 'oauth2' && oauth2Form\"\n class=\"cqa-api-edit-step-oauth2-grid\"\n [attr.style]=\"'display: grid; grid-template-columns: 1fr 1fr; gap: 16px 24px; width: 100%;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Grant Type</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2GrantTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"OAuth grant type\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth grant type</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Access Token URL</span>\n <cqa-custom-input [value]=\"oauth2Form.get('accessTokenUrl')?.value\"\n (valueChange)=\"oauth2Form.get('accessTokenUrl')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth token endpoint\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Access Token URL\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth token endpoint</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client ID</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientId')?.value\"\n (valueChange)=\"oauth2Form.get('clientId')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth client identifier\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client ID\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client identifier</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Secret</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientSecret')?.value\"\n (valueChange)=\"oauth2Form.get('clientSecret')?.setValue($event)\"\n type=\"password\" [label]=\"''\" placeholder=\"Enter OAuth client secret\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client Secret\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client secret</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Scope</span>\n <cqa-custom-input [value]=\"oauth2Form.get('scope')?.value\"\n (valueChange)=\"oauth2Form.get('scope')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter space-separated scopes\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Scope\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Space-separated scopes</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Authentication</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2ClientAuthSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"Client authentication method\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Client authentication method</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Payload content (Headers) -->\n <div *ngIf=\"activePayloadTab === 'headers'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-headers-grid\">\n <span class=\"cqa-api-edit-step-headers-label\">Header Name</span>\n <span class=\"cqa-api-edit-step-headers-label\">Header Value</span>\n <span class=\"cqa-api-edit-step-headers-label cqa-api-edit-step-headers-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of headerRows; let i = index; trackBy: trackByHeader\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-header-row\">\n <cqa-dynamic-select [form]=\"row\" [config]=\"headerNameSelectConfig\"\n (addCustomValue)=\"onHeaderNameAddCustomValue($event, row)\"\n class=\"cqa-api-edit-step-header-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-header-value-input\" ariaLabel=\"Header value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-header-delete'\"\n [tooltip]=\"'Remove header'\" (clicked)=\"removeHeader(i)\">\n <svg class=\"cqa-api-edit-step-header-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-add-header-wrap\">\n <cqa-button type=\"button\" variant=\"text\" text=\"+ Add Header\"\n [customClass]=\"'cqa-api-edit-step-add-header-link'\" (clicked)=\"addHeader()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Params): Key\u2013Value table with add/delete rows -->\n <div *ngIf=\"activePayloadTab === 'params'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of paramsRows; let i = index; trackBy: trackByParams\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeParamsRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addParamsRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Body only): type, format, text area, Back/Next -->\n <div *ngIf=\"activePayloadTab === 'body'\"\n class=\"cqa-api-edit-step-payload cqa-api-edit-step-payload-editor\">\n <div class=\"cqa-api-edit-step-payload-type-row\">\n <span class=\"cqa-api-edit-step-payload-type-label\">Type</span>\n <div class=\"cqa-api-edit-step-payload-type-radios\">\n <cqa-segment-control [value]=\"payloadType\" [segments]=\"payloadTypeSegments\"\n (valueChange)=\"onPayloadTypeChange($event)\"\n class=\"cqa-api-edit-step-payload-type-segment\">\n </cqa-segment-control>\n </div>\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-format-wrap\">\n <span class=\"cqa-api-edit-step-payload-format-label\">Format:</span>\n <cqa-dynamic-select *ngIf=\"payloadFormatForm\" [form]=\"payloadFormatForm\"\n [config]=\"payloadFormatSelectConfig\" class=\"cqa-api-edit-step-payload-format-select\"\n aria-label=\"Format\">\n </cqa-dynamic-select>\n </div>\n </div>\n <!-- Raw: text area with line numbers (Postman-style payload body) -->\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-body\" #payloadEditorWithLinesRef>\n <div class=\"cqa-api-edit-step-payload-editor-with-lines\">\n <div class=\"cqa-api-edit-step-payload-line-numbers\" aria-hidden=\"true\">\n <span *ngFor=\"let n of payloadLineNumbers\" class=\"cqa-api-edit-step-payload-line-num\">\n <span *ngIf=\"payloadJsonError && payloadJsonError.line === n\"\n class=\"cqa-api-edit-step-payload-line-error-icon\" [title]=\"payloadJsonErrorTooltip\"\n aria-label=\"Parse error on this line\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" fill=\"#EF4444\"/>\n <path d=\"M4 4l6 6M10 4l-6 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-api-edit-step-payload-line-num-text\">{{ n }}</span>\n </span>\n </div>\n <div class=\"cqa-api-edit-step-payload-textarea-cell\">\n <div class=\"cqa-api-edit-step-payload-textarea cqa-w-full cqa-flex cqa-flex-col cqa-min-h-0\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea--error': payloadJsonError}\">\n <textarea #payloadTextareaRef\n class=\"cqa-api-edit-step-payload-textarea-input cqa-w-full cqa-outline-none cqa-box-border\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea-input--error': payloadJsonError}\"\n [value]=\"payloadText\"\n placeholder=\"\"\n [attr.aria-label]=\"'Payload'\"\n [attr.aria-invalid]=\"!!payloadJsonError\"\n (input)=\"onPayloadInput($event)\"\n (keydown)=\"onPayloadKeydown($event)\">\n </textarea>\n </div>\n </div>\n </div>\n <p *ngIf=\"payloadJsonError\" class=\"cqa-api-edit-step-payload-json-error-msg\">\n Invalid JSON format. Please check your syntax.\n </p>\n </div>\n\n <!-- x-www-form-urlencoded: Key\u2013Value rows, add/remove dynamically -->\n <div *ngIf=\"payloadType === 'x-www-form-urlencoded'\" class=\"cqa-api-edit-step-key-value\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyValueRows; let i = index; trackBy: trackByKeyValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addKeyValueRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Data: Key\u2013Type\u2013Value rows; Type is a dropdown (Text/File), add/remove dynamically -->\n <div *ngIf=\"payloadType === 'form-data'\" class=\"cqa-api-edit-step-key-type-value\">\n <div class=\"cqa-api-edit-step-key-type-value-header\">\n <span class=\"cqa-api-edit-step-key-type-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Type</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-type-value-label cqa-api-edit-step-key-type-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyTypeValueRows; let i = index; trackBy: trackByKeyTypeValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-type-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"keyTypeValueTypeSelectConfig\"\n class=\"cqa-api-edit-step-key-type-value-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-type-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyTypeValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-type-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-type-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-type-value-add-btn\" (clicked)=\"addKeyTypeValueRow()\">\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Advanced settings (step-level) -->\n <div class=\"cqa-mt-4\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-py-2 cqa-border-b cqa-border-gray-200\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-lg cqa-transition-transform\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form\n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n\n </div>\n <!-- Step 2: Variable Name: input, validation, Back / Next -->\n <div *ngIf=\"currentStep === 2\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-variable-section\">\n <div class=\"cqa-api-edit-step-variable-input-wrap\">\n <cqa-custom-input [(value)]=\"variableName\" [label]=\"''\" placeholder=\"Variable Name\" [fullWidth]=\"true\"\n size=\"md\" (valueChange)=\"onVariableNameChange()\" aria-label=\"Variable Name\">\n </cqa-custom-input>\n </div>\n <p *ngIf=\"variableNameError\" class=\"cqa-api-edit-step-variable-error\" role=\"alert\">{{ variableNameError }}</p>\n </div>\n </div>\n <!-- Step 3: Response Body / Status tabs -->\n <div *ngIf=\"currentStep === 3\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of responseVerificationTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activeResponseVerificationTab === tab.value ? ' cqa-api-edit-step-tab--active' : '')\"\n (clicked)=\"setResponseVerificationTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Response Body tab content: verification grid -->\n <div *ngIf=\"activeResponseVerificationTab === 'response-body'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-verification\">\n <div class=\"cqa-api-edit-step-verification-grid cqa-api-edit-step-verification-grid-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">JSON Path</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Data Type</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of verificationRows; let i = index; trackBy: trackByVerification\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-custom-input [value]=\"row.get('jsonPath')?.value ?? ''\"\n (valueChange)=\"row.get('jsonPath')?.setValue($event)\" placeholder=\"Json Path\" [fullWidth]=\"true\"\n size=\"sm\" class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"JSON Path\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationDataTypeSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\"\n (selectionChange)=\"onVerificationDataTypeChange(row, $event)\">\n </cqa-dynamic-select>\n <!-- Expected Value: text for String/Array/Object, number for Number, dropdown for Boolean -->\n <ng-container [ngSwitch]=\"row.get('dataType')?.value\">\n <cqa-dynamic-select *ngSwitchCase=\"'boolean'\" [form]=\"row\"\n [config]=\"verificationExpectedValueBooleanSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-api-edit-step-verification-expected-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input *ngSwitchCase=\"'number'\" [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value (number)\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input cqa-api-edit-step-verification-expected-number\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-custom-input *ngSwitchDefault [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\"\n placeholder=\"Expected Value in String\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n </ng-container>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Status tab content: S.no, Verification dropdown, Expected Value, add/remove rows -->\n <div *ngIf=\"activeResponseVerificationTab === 'status'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addStatusVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-status-verification\">\n <div class=\"cqa-api-edit-step-status-verification-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of statusVerificationRows; let i = index; trackBy: trackByStatusVerification\"\n [formGroup]=\"row\" class=\"cqa-api-edit-step-status-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-dynamic-select [form]=\"row\" [config]=\"statusVerificationSelectConfig\"\n class=\"cqa-api-edit-step-status-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\" class=\"cqa-api-edit-step-verification-input\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeStatusVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Response Preview -->\n <div class=\"cqa-api-edit-step-response\">\n <h3 class=\"cqa-api-edit-step-response-title cqa-text-[14px] cqa-font-bold cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-mb-[12px] cqa-shrink-0\">Response Preview</h3>\n <pre class=\"cqa-api-edit-step-response-content\">{{ responsePreview }}</pre>\n </div>\n\n <!-- Step actions: one row, full width. Step 1: Cancel + Next; Step 2: Back + Next; Step 3: Back + Create -->\n <div class=\"cqa-api-edit-step-actions\">\n <ng-container [ngSwitch]=\"currentStep\">\n <ng-container *ngSwitchCase=\"1\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-actions-btn-cancel\" (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" [text]=\"editMode ? 'Update' : 'Create'\"\n customClass=\"cqa-api-edit-step-actions-btn-create\" (clicked)=\"onCreate()\">\n </cqa-button>\n </ng-container>\n </ng-container>\n </div>\n</div>", components: [{ type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i5.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "enableMarkdown", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i6.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor"], outputs: ["valueChange"] }, { type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i8.AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: ["advancedVariables", "advancedVariableForm"], outputs: ["variableBooleanChange", "variableValueChange"] }], directives: [{ type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i9.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i9.NgSwitchDefault, selector: "[ngSwitchDefault]" }], changeDetection: i0.ChangeDetectionStrategy.Default });
1657
1715
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ApiEditStepComponent, decorators: [{
1658
1716
  type: Component,
1659
- args: [{ selector: 'cqa-api-edit-step', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.Default, template: "<div class=\"cqa-api-edit-step-container cqa-bg-[#ffffff] cqa-flex cqa-flex-col cqa-w-full cqa-h-full cqa-p-[16px] cqa-gap-[12px] cqa-overflow-y-auto cqa-overflow-x-hidden cqa-box-border\">\n\n <h2 class=\"cqa-api-edit-step-title cqa-font-inter cqa-text-[12px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#000000] cqa-m-0\">\n {{ editMode ? 'Update API Test Step' : 'Create API Test Step' }}\n </h2>\n\n <div class=\"cqa-api-edit-step-indicator cqa-flex cqa-items-center cqa-gap-0 cqa-max-[767px]:cqa-flex-wrap cqa-max-[767px]:cqa-gap-2 cqa-max-[767px]:cqa-justify-start\"\n [class.cqa-justify-start]=\"stepLabels.length === 1\"\n [class.cqa-justify-between]=\"stepLabels.length !== 1\">\n <ng-container *ngFor=\"let step of stepLabels; let i = index\">\n <cqa-button type=\"button\" variant=\"text\"\n customClass=\"cqa-api-edit-step-indicator-item cqa-api-edit-step-indicator-item--clickable cqa-flex cqa-items-center cqa-gap-[10px] cqa-cursor-pointer cqa-border-none cqa-p-0 cqa-font-inherit cqa-text-inherit cqa-text-left !cqa-bg-transparent\"\n [attr.aria-label]=\"'Step ' + step.index + ': ' + step.label\" [attr.aria-pressed]=\"step.index === currentStep\"\n (clicked)=\"setStep(step.index)\">\n <span class=\"cqa-api-edit-step-indicator-circle cqa-w-8 cqa-h-8 cqa-rounded-full cqa-inline-flex cqa-items-center cqa-justify-center cqa-text-sm cqa-font-medium cqa-leading-none cqa-border-none cqa-shrink-0\"\n [ngClass]=\"step.index === currentStep ? 'cqa-bg-[#4F46E5] cqa-text-white' : 'cqa-bg-[#E0E0E0] cqa-text-[#666666]'\">\n {{ step.index }}\n </span>\n <span class=\"cqa-api-edit-step-indicator-label cqa-text-sm cqa-leading-[18px] cqa-font-normal cqa-max-[767px]:cqa-text-xs\"\n [ngClass]=\"step.index === currentStep ? 'cqa-text-[#4F46E5]' : 'cqa-text-[#666666]'\">\n {{ step.label }}\n </span>\n <div *ngIf=\"i < stepLabels.length - 1\" class=\"cqa-api-edit-step-indicator-line cqa-w-[96px] cqa-h-[2px] cqa-bg-[#E0E0E0] cqa-my-0 cqa-mx-[6px] cqa-shrink-0 cqa-self-center cqa-max-[767px]:cqa-w-[24px] cqa-max-[767px]:cqa-mx-1\" aria-hidden=\"true\"></div>\n </cqa-button>\n </ng-container>\n </div>\n\n <!-- Step content viewport: only the active step body is shown (*ngIf) -->\n <div class=\"cqa-api-edit-step-viewport cqa-w-full\">\n <!-- Step 1: Environment, request, body, response -->\n <div *ngIf=\"currentStep === 1\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <!-- Environment row: new line, select aligned right -->\n <div class=\"cqa-api-edit-step-environment-row cqa-flex cqa-justify-end cqa-items-center\">\n <cqa-dynamic-select *ngIf=\"environmentForm\" [form]=\"environmentForm\" [config]=\"environmentSelectConfig\"\n class=\"cqa-api-edit-step-environment-select cqa-shrink-0 cqa-w-auto cqa-min-w-[315px] cqa-max-w-[315px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full [&_.mat-form-field-wrapper]:cqa-pb-0\" aria-label=\"Environment\"\n (selectionChange)=\"onEnvironmentSelectionChange($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Request row: method, URL, buttons -->\n <div class=\"cqa-api-edit-step-request-row cqa-flex cqa-items-center cqa-gap-3 cqa-flex-wrap cqa-max-[767px]:cqa-flex-col cqa-max-[767px]:cqa-items-stretch cqa-max-[767px]:cqa-gap-2.5\">\n <cqa-dynamic-select *ngIf=\"methodForm\" [form]=\"methodForm\" [config]=\"methodSelectConfig\"\n class=\"cqa-api-edit-step-method-select cqa-shrink-0 cqa-w-auto cqa-min-w-[152px] cqa-max-w-[152px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full\" aria-label=\"HTTP method\"\n (selectionChange)=\"onMethodSelectionChange($event)\">\n </cqa-dynamic-select>\n <div class=\"cqa-api-edit-step-url-wrap cqa-flex-1 cqa-min-w-[200px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-w-full [&_cqa-custom-input_.cqa-relative_input]:cqa-h-[40px] [&_cqa-custom-input_.cqa-relative_input]:cqa-bg-white [&_cqa-custom-input_.cqa-relative_input]:cqa-border [&_cqa-custom-input_.cqa-relative_input]:cqa-border-solid [&_cqa-custom-input_.cqa-relative_input]:cqa-border-[#D1D5DB] [&_cqa-custom-input_.cqa-relative_input]:cqa-rounded-md [&_cqa-custom-input_.cqa-relative_input]:cqa-text-sm [&_cqa-custom-input_.cqa-relative_input]:cqa-text-[#374151]\">\n <cqa-custom-input [(value)]=\"url\" [label]=\"''\" placeholder=\"\" [fullWidth]=\"true\" size=\"md\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-trigger cqa-contents cqa-max-[767px]:cqa-w-full cqa-max-[767px]:!cqa-flex\" (click)=\"openImportCurlPanel()\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Import API cURL\"\n customClass=\"cqa-api-edit-step-btn-outline !cqa-bg-white !cqa-border !cqa-border-solid !cqa-border-[#6B7280] cqa-text-[#414146] cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal hover:!cqa-bg-[#F9FAFB] hover:!cqa-text-[#414146] cqa-max-[767px]:cqa-w-full\">\n </cqa-button>\n </div>\n <cqa-button variant=\"filled\" btnSize=\"lg\" text=\"Send Request\" (clicked)=\"onSendRequest()\"\n customClass=\"cqa-api-edit-step-btn-primary cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal !cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] !cqa-border-none cqa-py-2.5 cqa-px-6 cqa-gap-2 cqa-rounded-lg cqa-min-h-[37px] cqa-box-border hover:!cqa-bg-[#1B1FEB] cqa-max-[767px]:cqa-w-full\">\n </cqa-button>\n </div>\n\n\n\n <!-- Body content: header section (default) OR import cURL section -->\n <ng-container *ngIf=\"bodyView === 'import-curl'\">\n <div class=\"cqa-api-edit-step-import-curl-panel cqa-flex cqa-flex-col cqa-bg-white cqa-rounded-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-shadow-[0_1px_3px_rgba(0,0,0,0.08)] cqa-overflow-hidden\">\n <div class=\"cqa-api-edit-step-import-curl-header cqa-flex cqa-items-center cqa-justify-between cqa-py-3 cqa-px-5 cqa-border-b cqa-border-solid cqa-border-[#E2E8F0] cqa-bg-[#F9FAFB] cqa-rounded-t-lg cqa-max-[767px]:cqa-px-4\">\n <h3 class=\"cqa-api-edit-step-import-curl-title cqa-m-0 cqa-text-xs cqa-font-bold cqa-leading-[18px] cqa-text-[#374151]\">Import API cURL</h3>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-separator cqa-h-px cqa-bg-[#E2E8F0] cqa-my-0 cqa-mx-5\"></div>\n <div class=\"cqa-api-edit-step-import-curl-body\">\n <cqa-custom-textarea [value]=\"importCurlControl.value\"\n (valueChange)=\"importCurlControl.setValue($event)\"\n placeholder=\"Paste your cURL command here (e.g., curl -X POST https://api.example.com/users)\"\n [fullWidth]=\"true\" [rows]=\"8\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-import-curl-textarea\">\n </cqa-custom-textarea>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-footer\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-import-curl-btn-cancel\" (clicked)=\"onCancelImportCurl()\"></cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Import\"\n customClass=\"cqa-api-edit-step-import-curl-btn-import\" (clicked)=\"onImportCurlConfirm()\"></cqa-button>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"bodyView === 'headers'\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of payloadTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activePayloadTab === tab.value ? ' cqa-api-edit-step-tab--active' : '') + (isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params') ? ' cqa-api-edit-step-tab--disabled' : '')\"\n [disabled]=\"isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params')\"\n (clicked)=\"setPayloadTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Payload content (Authorization) -->\n <div *ngIf=\"activePayloadTab === 'authorization'\" class=\"cqa-api-edit-step-payload\"\n [attr.style]=\"'padding: 20px; min-height: 200px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 20px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 8px; width: fit-content;'\">\n <span [attr.style]=\"'font-size: 11px; font-weight: 600; letter-spacing: 0.02em; color: #6B7280; text-transform: uppercase; line-height: 1.25;'\">AUTH TYPE</span>\n <cqa-dynamic-select *ngIf=\"authTypeForm\" [form]=\"authTypeForm\" [config]=\"authTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-type-select\" aria-label=\"Auth type\"\n [attr.style]=\"'min-width: 160px;'\">\n </cqa-dynamic-select>\n </div>\n <!-- No Auth: centered message -->\n <div *ngIf=\"selectedAuthType === 'no-auth'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; min-width: 0; text-align: center;'\">\n <div aria-hidden=\"true\"\n [attr.style]=\"'width: 48px; height: 48px; border-radius: 10px; background: #F3F4F6; display: flex; align-items: center; justify-content: center; flex-shrink: 0;'\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <rect x=\"5\" y=\"11\" width=\"14\" height=\"2\" rx=\"1\" fill=\"#9CA3AF\"/>\n </svg>\n </div>\n <span [attr.style]=\"'font-size: 16px; font-weight: 600; color: #374151; line-height: 1.25;'\">No Auth</span>\n <div [attr.style]=\"'display: flex; align-items: center; justify-content: center; gap: 6px; flex-wrap: wrap;'\">\n <span [attr.style]=\"'font-size: 14px; font-weight: 400; color: #9CA3AF; line-height: 1.4;'\">This request does not use any authorization.</span>\n <span role=\"img\" aria-label=\"More information\" title=\"This request does not use any authorization.\"\n [attr.style]=\"'display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; color: #9CA3AF; flex-shrink: 0;'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" fill=\"none\"/>\n <path d=\"M8 7v4M8 5v.5\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n </div>\n </div>\n <!-- Bearer Token: Token label + textarea -->\n <div *ngIf=\"selectedAuthType === 'bearer'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; gap: 10px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Token</span>\n <cqa-custom-textarea [(value)]=\"bearerToken\"\n placeholder=\"Enter bearer token\"\n [fullWidth]=\"true\" [rows]=\"6\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-auth-token-textarea\" ariaLabel=\"Bearer token\">\n </cqa-custom-textarea>\n </div>\n <!-- OAuth 2.0: Grant Type, Access Token URL, Client ID, Client Secret, Scope, Client Authentication -->\n <div *ngIf=\"selectedAuthType === 'oauth2' && oauth2Form\"\n class=\"cqa-api-edit-step-oauth2-grid\"\n [attr.style]=\"'display: grid; grid-template-columns: 1fr 1fr; gap: 16px 24px; width: 100%;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Grant Type</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2GrantTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"OAuth grant type\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth grant type</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Access Token URL</span>\n <cqa-custom-input [value]=\"oauth2Form.get('accessTokenUrl')?.value\"\n (valueChange)=\"oauth2Form.get('accessTokenUrl')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth token endpoint\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Access Token URL\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth token endpoint</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client ID</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientId')?.value\"\n (valueChange)=\"oauth2Form.get('clientId')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth client identifier\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client ID\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client identifier</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Secret</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientSecret')?.value\"\n (valueChange)=\"oauth2Form.get('clientSecret')?.setValue($event)\"\n type=\"password\" [label]=\"''\" placeholder=\"Enter OAuth client secret\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client Secret\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client secret</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Scope</span>\n <cqa-custom-input [value]=\"oauth2Form.get('scope')?.value\"\n (valueChange)=\"oauth2Form.get('scope')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter space-separated scopes\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Scope\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Space-separated scopes</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Authentication</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2ClientAuthSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"Client authentication method\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Client authentication method</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Payload content (Headers) -->\n <div *ngIf=\"activePayloadTab === 'headers'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-headers-grid\">\n <span class=\"cqa-api-edit-step-headers-label\">Header Name</span>\n <span class=\"cqa-api-edit-step-headers-label\">Header Value</span>\n <span class=\"cqa-api-edit-step-headers-label cqa-api-edit-step-headers-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of headerRows; let i = index; trackBy: trackByHeader\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-header-row\">\n <cqa-dynamic-select [form]=\"row\" [config]=\"headerNameSelectConfig\"\n (addCustomValue)=\"onHeaderNameAddCustomValue($event, row)\"\n class=\"cqa-api-edit-step-header-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-header-value-input\" ariaLabel=\"Header value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-header-delete'\"\n [tooltip]=\"'Remove header'\" (clicked)=\"removeHeader(i)\">\n <svg class=\"cqa-api-edit-step-header-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-add-header-wrap\">\n <cqa-button type=\"button\" variant=\"text\" text=\"+ Add Header\"\n [customClass]=\"'cqa-api-edit-step-add-header-link'\" (clicked)=\"addHeader()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Params): Key\u2013Value table with add/delete rows -->\n <div *ngIf=\"activePayloadTab === 'params'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of paramsRows; let i = index; trackBy: trackByParams\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeParamsRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addParamsRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Body only): type, format, text area, Back/Next -->\n <div *ngIf=\"activePayloadTab === 'body'\"\n class=\"cqa-api-edit-step-payload cqa-api-edit-step-payload-editor\">\n <div class=\"cqa-api-edit-step-payload-type-row\">\n <span class=\"cqa-api-edit-step-payload-type-label\">Type</span>\n <div class=\"cqa-api-edit-step-payload-type-radios\">\n <cqa-segment-control [value]=\"payloadType\" [segments]=\"payloadTypeSegments\"\n (valueChange)=\"onPayloadTypeChange($event)\"\n class=\"cqa-api-edit-step-payload-type-segment\">\n </cqa-segment-control>\n </div>\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-format-wrap\">\n <span class=\"cqa-api-edit-step-payload-format-label\">Format:</span>\n <cqa-dynamic-select *ngIf=\"payloadFormatForm\" [form]=\"payloadFormatForm\"\n [config]=\"payloadFormatSelectConfig\" class=\"cqa-api-edit-step-payload-format-select\"\n aria-label=\"Format\">\n </cqa-dynamic-select>\n </div>\n </div>\n <!-- Raw: text area with line numbers (Postman-style payload body) -->\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-body\" #payloadEditorWithLinesRef>\n <div class=\"cqa-api-edit-step-payload-editor-with-lines\">\n <div class=\"cqa-api-edit-step-payload-line-numbers\" aria-hidden=\"true\">\n <span *ngFor=\"let n of payloadLineNumbers\" class=\"cqa-api-edit-step-payload-line-num\">\n <span *ngIf=\"payloadJsonError && payloadJsonError.line === n\"\n class=\"cqa-api-edit-step-payload-line-error-icon\" [title]=\"payloadJsonErrorTooltip\"\n aria-label=\"Parse error on this line\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" fill=\"#EF4444\"/>\n <path d=\"M4 4l6 6M10 4l-6 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-api-edit-step-payload-line-num-text\">{{ n }}</span>\n </span>\n </div>\n <div class=\"cqa-api-edit-step-payload-textarea-cell\">\n <div class=\"cqa-api-edit-step-payload-textarea cqa-w-full cqa-flex cqa-flex-col cqa-min-h-0\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea--error': payloadJsonError}\">\n <textarea #payloadTextareaRef\n class=\"cqa-api-edit-step-payload-textarea-input cqa-w-full cqa-outline-none cqa-box-border\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea-input--error': payloadJsonError}\"\n [value]=\"payloadText\"\n placeholder=\"\"\n [attr.aria-label]=\"'Payload'\"\n [attr.aria-invalid]=\"!!payloadJsonError\"\n (input)=\"onPayloadInput($event)\"\n (keydown)=\"onPayloadKeydown($event)\">\n </textarea>\n </div>\n </div>\n </div>\n <p *ngIf=\"payloadJsonError\" class=\"cqa-api-edit-step-payload-json-error-msg\">\n Invalid JSON format. Please check your syntax.\n </p>\n </div>\n\n <!-- x-www-form-urlencoded: Key\u2013Value rows, add/remove dynamically -->\n <div *ngIf=\"payloadType === 'x-www-form-urlencoded'\" class=\"cqa-api-edit-step-key-value\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyValueRows; let i = index; trackBy: trackByKeyValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addKeyValueRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Data: Key\u2013Type\u2013Value rows; Type is a dropdown (Text/File), add/remove dynamically -->\n <div *ngIf=\"payloadType === 'form-data'\" class=\"cqa-api-edit-step-key-type-value\">\n <div class=\"cqa-api-edit-step-key-type-value-header\">\n <span class=\"cqa-api-edit-step-key-type-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Type</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-type-value-label cqa-api-edit-step-key-type-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyTypeValueRows; let i = index; trackBy: trackByKeyTypeValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-type-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"keyTypeValueTypeSelectConfig\"\n class=\"cqa-api-edit-step-key-type-value-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-type-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyTypeValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-type-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-type-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-type-value-add-btn\" (clicked)=\"addKeyTypeValueRow()\">\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n <!-- Step 2: Variable Name: input, validation, Back / Next -->\n <div *ngIf=\"currentStep === 2\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-variable-section\">\n <div class=\"cqa-api-edit-step-variable-input-wrap\">\n <cqa-custom-input [(value)]=\"variableName\" [label]=\"''\" placeholder=\"Variable Name\" [fullWidth]=\"true\"\n size=\"md\" (valueChange)=\"onVariableNameChange()\" aria-label=\"Variable Name\">\n </cqa-custom-input>\n </div>\n <p *ngIf=\"variableNameError\" class=\"cqa-api-edit-step-variable-error\" role=\"alert\">{{ variableNameError }}</p>\n </div>\n </div>\n <!-- Step 3: Response Body / Status tabs -->\n <div *ngIf=\"currentStep === 3\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of responseVerificationTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activeResponseVerificationTab === tab.value ? ' cqa-api-edit-step-tab--active' : '')\"\n (clicked)=\"setResponseVerificationTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Response Body tab content: verification grid -->\n <div *ngIf=\"activeResponseVerificationTab === 'response-body'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-verification\">\n <div class=\"cqa-api-edit-step-verification-grid cqa-api-edit-step-verification-grid-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">JSON Path</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Data Type</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of verificationRows; let i = index; trackBy: trackByVerification\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-custom-input [value]=\"row.get('jsonPath')?.value ?? ''\"\n (valueChange)=\"row.get('jsonPath')?.setValue($event)\" placeholder=\"Json Path\" [fullWidth]=\"true\"\n size=\"sm\" class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"JSON Path\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationDataTypeSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\"\n (selectionChange)=\"onVerificationDataTypeChange(row, $event)\">\n </cqa-dynamic-select>\n <!-- Expected Value: text for String/Array/Object, number for Number, dropdown for Boolean -->\n <ng-container [ngSwitch]=\"row.get('dataType')?.value\">\n <cqa-dynamic-select *ngSwitchCase=\"'boolean'\" [form]=\"row\"\n [config]=\"verificationExpectedValueBooleanSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-api-edit-step-verification-expected-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input *ngSwitchCase=\"'number'\" [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value (number)\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input cqa-api-edit-step-verification-expected-number\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-custom-input *ngSwitchDefault [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\"\n placeholder=\"Expected Value in String\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n </ng-container>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Status tab content: S.no, Verification dropdown, Expected Value, add/remove rows -->\n <div *ngIf=\"activeResponseVerificationTab === 'status'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addStatusVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-status-verification\">\n <div class=\"cqa-api-edit-step-status-verification-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of statusVerificationRows; let i = index; trackBy: trackByStatusVerification\"\n [formGroup]=\"row\" class=\"cqa-api-edit-step-status-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-dynamic-select [form]=\"row\" [config]=\"statusVerificationSelectConfig\"\n class=\"cqa-api-edit-step-status-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\" class=\"cqa-api-edit-step-verification-input\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeStatusVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Response Preview -->\n <div class=\"cqa-api-edit-step-response\">\n <h3 class=\"cqa-api-edit-step-response-title cqa-text-[14px] cqa-font-bold cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-mb-[12px] cqa-shrink-0\">Response Preview</h3>\n <pre class=\"cqa-api-edit-step-response-content\">{{ responsePreview }}</pre>\n </div>\n\n <!-- Step actions: one row, full width. Step 1: Cancel + Next; Step 2: Back + Next; Step 3: Back + Create -->\n <div class=\"cqa-api-edit-step-actions\">\n <ng-container [ngSwitch]=\"currentStep\">\n <ng-container *ngSwitchCase=\"1\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-actions-btn-cancel\" (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" [text]=\"editMode ? 'Update' : 'Create'\"\n customClass=\"cqa-api-edit-step-actions-btn-create\" (clicked)=\"onCreate()\">\n </cqa-button>\n </ng-container>\n </ng-container>\n </div>\n</div>" }]
1717
+ args: [{ selector: 'cqa-api-edit-step', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.Default, template: "<div class=\"cqa-api-edit-step-container cqa-bg-[#ffffff] cqa-flex cqa-flex-col cqa-w-full cqa-h-full cqa-p-[16px] cqa-gap-[12px] cqa-overflow-y-auto cqa-overflow-x-hidden cqa-box-border\">\n\n <h2 class=\"cqa-api-edit-step-title cqa-font-inter cqa-text-[12px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal cqa-text-[#000000] cqa-m-0\">\n {{ editMode ? 'Update API Test Step' : 'Create API Test Step' }}\n </h2>\n\n <div class=\"cqa-api-edit-step-indicator cqa-flex cqa-items-center cqa-gap-0 cqa-max-[767px]:cqa-flex-wrap cqa-max-[767px]:cqa-gap-2 cqa-max-[767px]:cqa-justify-start\"\n [class.cqa-justify-start]=\"stepLabels.length === 1\"\n [class.cqa-justify-between]=\"stepLabels.length !== 1\">\n <ng-container *ngFor=\"let step of stepLabels; let i = index\">\n <cqa-button type=\"button\" variant=\"text\"\n customClass=\"cqa-api-edit-step-indicator-item cqa-api-edit-step-indicator-item--clickable cqa-flex cqa-items-center cqa-gap-[10px] cqa-cursor-pointer cqa-border-none cqa-p-0 cqa-font-inherit cqa-text-inherit cqa-text-left !cqa-bg-transparent\"\n [attr.aria-label]=\"'Step ' + step.index + ': ' + step.label\" [attr.aria-pressed]=\"step.index === currentStep\"\n (clicked)=\"setStep(step.index)\">\n <span class=\"cqa-api-edit-step-indicator-circle cqa-w-8 cqa-h-8 cqa-rounded-full cqa-inline-flex cqa-items-center cqa-justify-center cqa-text-sm cqa-font-medium cqa-leading-none cqa-border-none cqa-shrink-0\"\n [ngClass]=\"step.index === currentStep ? 'cqa-bg-[#4F46E5] cqa-text-white' : 'cqa-bg-[#E0E0E0] cqa-text-[#666666]'\">\n {{ step.index }}\n </span>\n <span class=\"cqa-api-edit-step-indicator-label cqa-text-sm cqa-leading-[18px] cqa-font-normal cqa-max-[767px]:cqa-text-xs\"\n [ngClass]=\"step.index === currentStep ? 'cqa-text-[#4F46E5]' : 'cqa-text-[#666666]'\">\n {{ step.label }}\n </span>\n <div *ngIf=\"i < stepLabels.length - 1\" class=\"cqa-api-edit-step-indicator-line cqa-w-[96px] cqa-h-[2px] cqa-bg-[#E0E0E0] cqa-my-0 cqa-mx-[6px] cqa-shrink-0 cqa-self-center cqa-max-[767px]:cqa-w-[24px] cqa-max-[767px]:cqa-mx-1\" aria-hidden=\"true\"></div>\n </cqa-button>\n </ng-container>\n </div>\n\n <!-- Step content viewport: only the active step body is shown (*ngIf) -->\n <div class=\"cqa-api-edit-step-viewport cqa-w-full\">\n <!-- Step 1: Environment, request, body, response -->\n <div *ngIf=\"currentStep === 1\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <!-- Environment row: label on top, select below (aligned right on desktop) -->\n <div class=\"cqa-api-edit-step-environment-row cqa-flex cqa-flex-col cqa-gap-1.5 cqa-items-end cqa-max-[767px]:cqa-items-stretch\">\n <span class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-max-[767px]:cqa-items-stretch\">\n <label class=\"cqa-api-edit-step-environment-label cqa-m-0 cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal\">Environments</label>\n <cqa-dynamic-select *ngIf=\"environmentForm\" [form]=\"environmentForm\" [config]=\"environmentSelectConfig\"\n class=\"cqa-api-edit-step-environment-select cqa-shrink-0 cqa-w-auto cqa-min-w-[315px] cqa-max-w-[315px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full [&_.mat-form-field-wrapper]:cqa-pb-0\" aria-label=\"Environment\"\n (selectionChange)=\"onEnvironmentSelectionChange($event)\">\n </cqa-dynamic-select>\n </span>\n </div>\n\n <!-- Request row: method, URL, buttons -->\n <div class=\"cqa-api-edit-step-request-row cqa-flex cqa-items-center cqa-gap-3 cqa-flex-wrap cqa-max-[767px]:cqa-flex-col cqa-max-[767px]:cqa-items-stretch cqa-max-[767px]:cqa-gap-2.5\">\n <cqa-dynamic-select *ngIf=\"methodForm\" [form]=\"methodForm\" [config]=\"methodSelectConfig\"\n class=\"cqa-api-edit-step-method-select cqa-shrink-0 cqa-w-auto cqa-min-w-[152px] cqa-max-w-[152px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-max-w-full cqa-max-[767px]:cqa-w-full\" aria-label=\"HTTP method\"\n (selectionChange)=\"onMethodSelectionChange($event)\">\n </cqa-dynamic-select>\n <div class=\"cqa-api-edit-step-url-wrap cqa-flex-1 cqa-min-w-[200px] cqa-max-[767px]:cqa-min-w-0 cqa-max-[767px]:cqa-w-full [&_cqa-custom-input_.cqa-relative_input]:cqa-h-[40px] [&_cqa-custom-input_.cqa-relative_input]:cqa-bg-white [&_cqa-custom-input_.cqa-relative_input]:cqa-border [&_cqa-custom-input_.cqa-relative_input]:cqa-border-solid [&_cqa-custom-input_.cqa-relative_input]:cqa-border-[#D1D5DB] [&_cqa-custom-input_.cqa-relative_input]:cqa-rounded-md [&_cqa-custom-input_.cqa-relative_input]:cqa-text-sm [&_cqa-custom-input_.cqa-relative_input]:cqa-text-[#374151]\">\n <cqa-custom-input [(value)]=\"url\" [label]=\"''\" placeholder=\"Enter request URL\" [fullWidth]=\"true\" size=\"md\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-trigger cqa-contents cqa-max-[767px]:cqa-w-full cqa-max-[767px]:!cqa-flex\" (click)=\"openImportCurlPanel()\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Import API cURL\"\n customClass=\"cqa-api-edit-step-btn-outline !cqa-bg-white !cqa-border !cqa-border-solid !cqa-border-[#6B7280] cqa-text-[#414146] cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal hover:!cqa-bg-[#F9FAFB] hover:!cqa-text-[#414146] cqa-max-[767px]:cqa-w-full\">\n </cqa-button>\n </div>\n <cqa-button variant=\"filled\" btnSize=\"lg\" text=\"Send Request\" (clicked)=\"onSendRequest()\"\n customClass=\"cqa-api-edit-step-btn-primary cqa-font-inter cqa-text-[14px] cqa-font-semibold cqa-leading-[100%] cqa-tracking-normal !cqa-bg-[#3F43EE] cqa-text-[#FBFCFF] !cqa-border-none cqa-py-2.5 cqa-px-6 cqa-gap-2 cqa-rounded-lg cqa-min-h-[37px] cqa-box-border hover:!cqa-bg-[#1B1FEB] cqa-max-[767px]:cqa-w-full\">\n </cqa-button>\n </div>\n\n\n\n <!-- Body content: header section (default) OR import cURL section -->\n <ng-container *ngIf=\"bodyView === 'import-curl'\">\n <div class=\"cqa-api-edit-step-import-curl-panel cqa-flex cqa-flex-col cqa-bg-white cqa-rounded-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-shadow-[0_1px_3px_rgba(0,0,0,0.08)] cqa-overflow-hidden\">\n <div class=\"cqa-api-edit-step-import-curl-header cqa-flex cqa-items-center cqa-justify-between cqa-py-3 cqa-px-5 cqa-border-b cqa-border-solid cqa-border-[#E2E8F0] cqa-bg-[#F9FAFB] cqa-rounded-t-lg cqa-max-[767px]:cqa-px-4\">\n <h3 class=\"cqa-api-edit-step-import-curl-title cqa-m-0 cqa-text-xs cqa-font-bold cqa-leading-[18px] cqa-text-[#374151]\">Import API cURL</h3>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-separator cqa-h-px cqa-bg-[#E2E8F0] cqa-my-0 cqa-mx-5\"></div>\n <div class=\"cqa-api-edit-step-import-curl-body\">\n <cqa-custom-textarea [value]=\"importCurlControl.value\"\n (valueChange)=\"importCurlControl.setValue($event)\"\n placeholder=\"Paste your cURL command here (e.g., curl -X POST https://api.example.com/users)\"\n [fullWidth]=\"true\" [rows]=\"8\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-import-curl-textarea\">\n </cqa-custom-textarea>\n </div>\n <div class=\"cqa-api-edit-step-import-curl-footer\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-import-curl-btn-cancel\" (clicked)=\"onCancelImportCurl()\"></cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Import\"\n customClass=\"cqa-api-edit-step-import-curl-btn-import\" (clicked)=\"onImportCurlConfirm()\"></cqa-button>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"bodyView === 'headers'\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of payloadTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activePayloadTab === tab.value ? ' cqa-api-edit-step-tab--active' : '') + (isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params') ? ' cqa-api-edit-step-tab--disabled' : '')\"\n [disabled]=\"isMethodWithoutBody && (tab.value === 'body' || tab.value === 'params')\"\n (clicked)=\"setPayloadTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Payload content (Authorization) -->\n <div *ngIf=\"activePayloadTab === 'authorization'\" class=\"cqa-api-edit-step-payload\"\n [attr.style]=\"'padding: 20px; min-height: 200px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 20px;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 8px; width: fit-content;'\">\n <span [attr.style]=\"'font-size: 11px; font-weight: 600; letter-spacing: 0.02em; color: #6B7280; text-transform: uppercase; line-height: 1.25;'\">AUTH TYPE</span>\n <cqa-dynamic-select *ngIf=\"authTypeForm\" [form]=\"authTypeForm\" [config]=\"authTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-type-select\" aria-label=\"Auth type\"\n [attr.style]=\"'min-width: 160px;'\">\n </cqa-dynamic-select>\n </div>\n <!-- No Auth: centered message -->\n <div *ngIf=\"selectedAuthType === 'no-auth'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; min-width: 0; text-align: center;'\">\n <div aria-hidden=\"true\"\n [attr.style]=\"'width: 48px; height: 48px; border-radius: 10px; background: #F3F4F6; display: flex; align-items: center; justify-content: center; flex-shrink: 0;'\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <rect x=\"5\" y=\"11\" width=\"14\" height=\"2\" rx=\"1\" fill=\"#9CA3AF\"/>\n </svg>\n </div>\n <span [attr.style]=\"'font-size: 16px; font-weight: 600; color: #374151; line-height: 1.25;'\">No Auth</span>\n <div [attr.style]=\"'display: flex; align-items: center; justify-content: center; gap: 6px; flex-wrap: wrap;'\">\n <span [attr.style]=\"'font-size: 14px; font-weight: 400; color: #9CA3AF; line-height: 1.4;'\">This request does not use any authorization.</span>\n <span role=\"img\" aria-label=\"More information\" title=\"This request does not use any authorization.\"\n [attr.style]=\"'display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; color: #9CA3AF; flex-shrink: 0;'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display: block;\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" fill=\"none\"/>\n <path d=\"M8 7v4M8 5v.5\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n </div>\n </div>\n <!-- Bearer Token: Token label + textarea -->\n <div *ngIf=\"selectedAuthType === 'bearer'\"\n [attr.style]=\"'flex: 1; display: flex; flex-direction: column; gap: 10px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Token</span>\n <cqa-custom-textarea [(value)]=\"bearerToken\"\n placeholder=\"Enter bearer token\"\n [fullWidth]=\"true\" [rows]=\"6\" resize=\"vertical\" size=\"md\"\n class=\"cqa-api-edit-step-auth-token-textarea\" ariaLabel=\"Bearer token\">\n </cqa-custom-textarea>\n </div>\n <!-- OAuth 2.0: Grant Type, Access Token URL, Client ID, Client Secret, Scope, Client Authentication -->\n <div *ngIf=\"selectedAuthType === 'oauth2' && oauth2Form\"\n class=\"cqa-api-edit-step-oauth2-grid\"\n [attr.style]=\"'display: grid; grid-template-columns: 1fr 1fr; gap: 16px 24px; width: 100%;'\">\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Grant Type</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2GrantTypeSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"OAuth grant type\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth grant type</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Access Token URL</span>\n <cqa-custom-input [value]=\"oauth2Form.get('accessTokenUrl')?.value\"\n (valueChange)=\"oauth2Form.get('accessTokenUrl')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth token endpoint\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Access Token URL\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth token endpoint</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client ID</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientId')?.value\"\n (valueChange)=\"oauth2Form.get('clientId')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter OAuth client identifier\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client ID\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client identifier</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Secret</span>\n <cqa-custom-input [value]=\"oauth2Form.get('clientSecret')?.value\"\n (valueChange)=\"oauth2Form.get('clientSecret')?.setValue($event)\"\n type=\"password\" [label]=\"''\" placeholder=\"Enter OAuth client secret\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Client Secret\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">OAuth client secret</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Scope</span>\n <cqa-custom-input [value]=\"oauth2Form.get('scope')?.value\"\n (valueChange)=\"oauth2Form.get('scope')?.setValue($event)\"\n [label]=\"''\" placeholder=\"Enter space-separated scopes\" [fullWidth]=\"true\" size=\"md\"\n ariaLabel=\"Scope\">\n </cqa-custom-input>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Space-separated scopes</span>\n </div>\n <div [attr.style]=\"'display: flex; flex-direction: column; gap: 6px; min-width: 0;'\">\n <span [attr.style]=\"'font-size: 12px; font-weight: 600; color: #374151; line-height: 1.25;'\">Client Authentication</span>\n <cqa-dynamic-select *ngIf=\"oauth2Form\" [form]=\"oauth2Form\" [config]=\"oauth2ClientAuthSelectConfig\"\n class=\"cqa-api-edit-step-auth-oauth-select\" aria-label=\"Client authentication method\"\n [attr.style]=\"'min-width: 0; width: 100%;'\">\n </cqa-dynamic-select>\n <span [attr.style]=\"'font-size: 11px; font-style: italic; color: #6B7280; line-height: 1.3;'\">Client authentication method</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Payload content (Headers) -->\n <div *ngIf=\"activePayloadTab === 'headers'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-headers-grid\">\n <span class=\"cqa-api-edit-step-headers-label\">Header Name</span>\n <span class=\"cqa-api-edit-step-headers-label\">Header Value</span>\n <span class=\"cqa-api-edit-step-headers-label cqa-api-edit-step-headers-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of headerRows; let i = index; trackBy: trackByHeader\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-header-row\">\n <cqa-dynamic-select [form]=\"row\" [config]=\"headerNameSelectConfig\"\n (addCustomValue)=\"onHeaderNameAddCustomValue($event, row)\"\n class=\"cqa-api-edit-step-header-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-header-value-input\" ariaLabel=\"Header value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-header-delete'\"\n [tooltip]=\"'Remove header'\" (clicked)=\"removeHeader(i)\">\n <svg class=\"cqa-api-edit-step-header-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-add-header-wrap\">\n <cqa-button type=\"button\" variant=\"text\" text=\"+ Add Header\"\n [customClass]=\"'cqa-api-edit-step-add-header-link'\" (clicked)=\"addHeader()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Params): Key\u2013Value table with add/delete rows -->\n <div *ngIf=\"activePayloadTab === 'params'\" class=\"cqa-api-edit-step-payload\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of paramsRows; let i = index; trackBy: trackByParams\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeParamsRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addParamsRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Payload content (Body only): type, format, text area, Back/Next -->\n <div *ngIf=\"activePayloadTab === 'body'\"\n class=\"cqa-api-edit-step-payload cqa-api-edit-step-payload-editor\">\n <div class=\"cqa-api-edit-step-payload-type-row\">\n <span class=\"cqa-api-edit-step-payload-type-label\">Type</span>\n <div class=\"cqa-api-edit-step-payload-type-radios\">\n <cqa-segment-control [value]=\"payloadType\" [segments]=\"payloadTypeSegments\"\n (valueChange)=\"onPayloadTypeChange($event)\"\n class=\"cqa-api-edit-step-payload-type-segment\">\n </cqa-segment-control>\n </div>\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-format-wrap\">\n <span class=\"cqa-api-edit-step-payload-format-label\">Format:</span>\n <cqa-dynamic-select *ngIf=\"payloadFormatForm\" [form]=\"payloadFormatForm\"\n [config]=\"payloadFormatSelectConfig\" class=\"cqa-api-edit-step-payload-format-select\"\n aria-label=\"Format\">\n </cqa-dynamic-select>\n </div>\n </div>\n <!-- Raw: text area with line numbers (Postman-style payload body) -->\n <div *ngIf=\"payloadType === 'raw'\" class=\"cqa-api-edit-step-payload-body\" #payloadEditorWithLinesRef>\n <div class=\"cqa-api-edit-step-payload-editor-with-lines\">\n <div class=\"cqa-api-edit-step-payload-line-numbers\" aria-hidden=\"true\">\n <span *ngFor=\"let n of payloadLineNumbers\" class=\"cqa-api-edit-step-payload-line-num\">\n <span *ngIf=\"payloadJsonError && payloadJsonError.line === n\"\n class=\"cqa-api-edit-step-payload-line-error-icon\" [title]=\"payloadJsonErrorTooltip\"\n aria-label=\"Parse error on this line\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" fill=\"#EF4444\"/>\n <path d=\"M4 4l6 6M10 4l-6 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-api-edit-step-payload-line-num-text\">{{ n }}</span>\n </span>\n </div>\n <div class=\"cqa-api-edit-step-payload-textarea-cell\">\n <div class=\"cqa-api-edit-step-payload-textarea cqa-w-full cqa-flex cqa-flex-col cqa-min-h-0\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea--error': payloadJsonError}\">\n <textarea #payloadTextareaRef\n class=\"cqa-api-edit-step-payload-textarea-input cqa-w-full cqa-outline-none cqa-box-border\"\n [ngClass]=\"{'cqa-api-edit-step-payload-textarea-input--error': payloadJsonError}\"\n [value]=\"payloadText\"\n placeholder=\"\"\n [attr.aria-label]=\"'Payload'\"\n [attr.aria-invalid]=\"!!payloadJsonError\"\n (input)=\"onPayloadInput($event)\"\n (keydown)=\"onPayloadKeydown($event)\">\n </textarea>\n </div>\n </div>\n </div>\n <p *ngIf=\"payloadJsonError\" class=\"cqa-api-edit-step-payload-json-error-msg\">\n Invalid JSON format. Please check your syntax.\n </p>\n </div>\n\n <!-- x-www-form-urlencoded: Key\u2013Value rows, add/remove dynamically -->\n <div *ngIf=\"payloadType === 'x-www-form-urlencoded'\" class=\"cqa-api-edit-step-key-value\">\n <div class=\"cqa-api-edit-step-key-value-grid cqa-api-edit-step-key-value-header\">\n <span class=\"cqa-api-edit-step-key-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-value-label cqa-api-edit-step-key-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyValueRows; let i = index; trackBy: trackByKeyValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-value-add-btn\" (clicked)=\"addKeyValueRow()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Data: Key\u2013Type\u2013Value rows; Type is a dropdown (Text/File), add/remove dynamically -->\n <div *ngIf=\"payloadType === 'form-data'\" class=\"cqa-api-edit-step-key-type-value\">\n <div class=\"cqa-api-edit-step-key-type-value-header\">\n <span class=\"cqa-api-edit-step-key-type-value-label\">Key</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Type</span>\n <span class=\"cqa-api-edit-step-key-type-value-label\">Value</span>\n <span class=\"cqa-api-edit-step-key-type-value-label cqa-api-edit-step-key-type-value-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of keyTypeValueRows; let i = index; trackBy: trackByKeyTypeValue\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-key-type-value-row\">\n <cqa-custom-input [value]=\"row.get('key')?.value ?? ''\"\n (valueChange)=\"row.get('key')?.setValue($event)\" placeholder=\"Key\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Key\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"keyTypeValueTypeSelectConfig\"\n class=\"cqa-api-edit-step-key-type-value-type-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('value')?.value ?? ''\"\n (valueChange)=\"row.get('value')?.setValue($event)\" placeholder=\"Value\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-key-type-value-input\" ariaLabel=\"Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-key-type-value-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeKeyTypeValueRow(i)\">\n <svg class=\"cqa-api-edit-step-key-type-value-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-key-type-value-add-wrap\">\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"+ Add Row\"\n customClass=\"cqa-api-edit-step-key-type-value-add-btn\" (clicked)=\"addKeyTypeValueRow()\">\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Advanced settings (step-level) -->\n <div class=\"cqa-mt-4\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-gray-700 cqa-py-2 cqa-border-b cqa-border-gray-200\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-lg cqa-transition-transform\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form\n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n\n </div>\n <!-- Step 2: Variable Name: input, validation, Back / Next -->\n <div *ngIf=\"currentStep === 2\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-variable-section\">\n <div class=\"cqa-api-edit-step-variable-input-wrap\">\n <cqa-custom-input [(value)]=\"variableName\" [label]=\"''\" placeholder=\"Variable Name\" [fullWidth]=\"true\"\n size=\"md\" (valueChange)=\"onVariableNameChange()\" aria-label=\"Variable Name\">\n </cqa-custom-input>\n </div>\n <p *ngIf=\"variableNameError\" class=\"cqa-api-edit-step-variable-error\" role=\"alert\">{{ variableNameError }}</p>\n </div>\n </div>\n <!-- Step 3: Response Body / Status tabs -->\n <div *ngIf=\"currentStep === 3\" class=\"cqa-api-edit-step-panel cqa-flex cqa-flex-col cqa-gap-6 cqa-box-border cqa-w-full\">\n <div class=\"cqa-api-edit-step-tabs-wrapper cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-api-edit-step-tabs\">\n <cqa-button *ngFor=\"let tab of responseVerificationTabs\" type=\"button\" variant=\"text\" [text]=\"tab.label\"\n [customClass]=\"'cqa-api-edit-step-tab' + (activeResponseVerificationTab === tab.value ? ' cqa-api-edit-step-tab--active' : '')\"\n (clicked)=\"setResponseVerificationTab(tab.value)\">\n </cqa-button>\n </div>\n\n <!-- Response Body tab content: verification grid -->\n <div *ngIf=\"activeResponseVerificationTab === 'response-body'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-verification\">\n <div class=\"cqa-api-edit-step-verification-grid cqa-api-edit-step-verification-grid-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">JSON Path</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Data Type</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of verificationRows; let i = index; trackBy: trackByVerification\" [formGroup]=\"row\"\n class=\"cqa-api-edit-step-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-custom-input [value]=\"row.get('jsonPath')?.value ?? ''\"\n (valueChange)=\"row.get('jsonPath')?.setValue($event)\" placeholder=\"Json Path\" [fullWidth]=\"true\"\n size=\"sm\" class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"JSON Path\">\n </cqa-custom-input>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"row\" [config]=\"verificationDataTypeSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-w-full\"\n (selectionChange)=\"onVerificationDataTypeChange(row, $event)\">\n </cqa-dynamic-select>\n <!-- Expected Value: text for String/Array/Object, number for Number, dropdown for Boolean -->\n <ng-container [ngSwitch]=\"row.get('dataType')?.value\">\n <cqa-dynamic-select *ngSwitchCase=\"'boolean'\" [form]=\"row\"\n [config]=\"verificationExpectedValueBooleanSelectConfig\"\n class=\"cqa-api-edit-step-verification-select cqa-api-edit-step-verification-expected-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input *ngSwitchCase=\"'number'\" [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value (number)\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input cqa-api-edit-step-verification-expected-number\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-custom-input *ngSwitchDefault [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\"\n placeholder=\"Expected Value in String\" [fullWidth]=\"true\" size=\"sm\"\n class=\"cqa-api-edit-step-verification-input\" ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n </ng-container>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Status tab content: S.no, Verification dropdown, Expected Value, add/remove rows -->\n <div *ngIf=\"activeResponseVerificationTab === 'status'\" class=\"cqa-api-edit-step-step3-content\">\n <div class=\"cqa-api-edit-step-verification-header-row cqa-flex cqa-flex-row cqa-justify-end cqa-items-center cqa-pt-0 cqa-pr-0 cqa-pb-2 cqa-pl-0\">\n <span></span>\n <cqa-button type=\"button\" variant=\"text\" text=\"Add Verification\"\n customClass=\"cqa-api-edit-step-verification-add-link\" (clicked)=\"addStatusVerificationRow()\">\n </cqa-button>\n </div>\n <div class=\"cqa-api-edit-step-status-verification\">\n <div class=\"cqa-api-edit-step-status-verification-header\">\n <span class=\"cqa-api-edit-step-verification-label\">S.no</span>\n <span class=\"cqa-api-edit-step-verification-label\">Verification</span>\n <span class=\"cqa-api-edit-step-verification-label\">Expected Value</span>\n <span class=\"cqa-api-edit-step-verification-label cqa-api-edit-step-verification-label--empty\"\n aria-hidden=\"true\"></span>\n </div>\n <div *ngFor=\"let row of statusVerificationRows; let i = index; trackBy: trackByStatusVerification\"\n [formGroup]=\"row\" class=\"cqa-api-edit-step-status-verification-row\">\n <span class=\"cqa-api-edit-step-verification-sno\">{{ i + 1 }}</span>\n <cqa-dynamic-select [form]=\"row\" [config]=\"statusVerificationSelectConfig\"\n class=\"cqa-api-edit-step-status-verification-select cqa-w-full\">\n </cqa-dynamic-select>\n <cqa-custom-input [value]=\"row.get('expectedValue')?.value ?? ''\"\n (valueChange)=\"row.get('expectedValue')?.setValue($event)\" placeholder=\"Expected Value\"\n type=\"number\" [fullWidth]=\"true\" size=\"sm\" class=\"cqa-api-edit-step-verification-input\"\n ariaLabel=\"Expected Value\">\n </cqa-custom-input>\n <cqa-button type=\"button\" variant=\"text\" [customClass]=\"'cqa-api-edit-step-verification-delete'\"\n [tooltip]=\"'Remove row'\" (clicked)=\"removeStatusVerificationRow(i)\">\n <svg class=\"cqa-api-edit-step-verification-delete-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M10.6663 6V12.6667H5.33301V6H10.6663ZM9.66634 2H6.33301L5.66634 2.66667H3.33301V4H12.6663V2.66667H10.333L9.66634 2ZM11.9997 4.66667H3.99967V12.6667C3.99967 13.4 4.59967 14 5.33301 14H10.6663C11.3997 14 11.9997 13.4 11.9997 12.6667V4.66667Z\"\n fill=\"#F9BFBF\" />\n </svg>\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Response Preview -->\n <div class=\"cqa-api-edit-step-response\">\n <h3 class=\"cqa-api-edit-step-response-title cqa-text-[14px] cqa-font-bold cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-mb-[12px] cqa-shrink-0\">Response Preview</h3>\n <pre class=\"cqa-api-edit-step-response-content\">{{ responsePreview }}</pre>\n </div>\n\n <!-- Step actions: one row, full width. Step 1: Cancel + Next; Step 2: Back + Next; Step 3: Back + Create -->\n <div class=\"cqa-api-edit-step-actions\">\n <ng-container [ngSwitch]=\"currentStep\">\n <ng-container *ngSwitchCase=\"1\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Cancel\"\n customClass=\"cqa-api-edit-step-actions-btn-cancel\" (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" text=\"Next\"\n customClass=\"cqa-api-edit-step-actions-btn-next\" (clicked)=\"onNext()\">\n </cqa-button>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <cqa-button type=\"button\" variant=\"outlined\" btnSize=\"lg\" text=\"Back\"\n customClass=\"cqa-api-edit-step-actions-btn-back\" (clicked)=\"onBack()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"filled\" btnSize=\"lg\" [text]=\"editMode ? 'Update' : 'Create'\"\n customClass=\"cqa-api-edit-step-actions-btn-create\" (clicked)=\"onCreate()\">\n </cqa-button>\n </ng-container>\n </ng-container>\n </div>\n</div>" }]
1660
1718
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { initialMethod: [{
1661
1719
  type: Input
1662
1720
  }], initialEnvironment: [{
@@ -1717,5 +1775,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
1717
1775
  type: Input
1718
1776
  }], statusVerificationOptions: [{
1719
1777
  type: Input
1778
+ }], advancedSettingsVariables: [{
1779
+ type: Input
1720
1780
  }] } });
1721
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1lZGl0LXN0ZXAvYXBpLWVkaXQtc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1lZGl0LXN0ZXAvYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUEwQixXQUFXLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7O0FBSWhGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxVQUFVLEVBQUUsWUFBWTtDQUNoQixDQUFDO0FBd0ZYLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBRXZELDhFQUE4RTtBQUM5RSxNQUFNLHdCQUF3QixHQUEyQixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQVVwRyxTQUFTLGFBQWEsQ0FBQyxFQUFVO0lBQy9CLE9BQU8sRUFBRSxLQUFLLEdBQUcsSUFBSSxFQUFFLEtBQUssUUFBUSxJQUFJLEVBQUUsS0FBSyxRQUFRLENBQUM7QUFDMUQsQ0FBQztBQUNELFNBQVMsYUFBYSxDQUFDLEVBQVU7SUFDL0IsT0FBTyxFQUFFLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxRQUFR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SztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFHSSxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFFRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUVHLE1BQU07c0JBQWYsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQTRDRSxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBK0JHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFnREcsZUFBZTtzQkFBdkIsS0FBSztnQkFHRyxlQUFlO3NCQUF2QixLQUFLO2dCQWdNRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBaUtrQyx5QkFBeUI7c0JBQWhFLFNBQVM7dUJBQUMsMkJBQTJCO2dCQUNMLGtCQUFrQjtzQkFBbEQsU0FBUzt1QkFBQyxvQkFBb0I7Z0JBK0N0QixpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBc0dHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkE4Q0csMkJBQTJCO3NCQUFuQyxLQUFLO2dCQWdFRyx5QkFBeUI7c0JBQWpDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuXG5leHBvcnQgY29uc3QgQVBJX0VESVRfU1RFUF9MQUJFTFMgPSB7XG4gIFJFUVVFU1RfREVUQUlMUzogJ1JlcXVlc3QgRGV0YWlscycsXG4gIFNUT1JFX1JFU1BPTlNFOiAnU3RvcmUgUmVzcG9uc2UnLFxuICBWQUxJREFUSU9OOiAnVmFsaWRhdGlvbicsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBBcGlFZGl0UGF5bG9hZFRhYiA9ICdoZWFkZXJzJyB8ICdib2R5JyB8ICdwYXJhbXMnIHwgJ2F1dGhvcml6YXRpb24nO1xuXG4vKiogV2hpY2ggYm9keSBjb250ZW50IGJsb2NrIGlzIHZpc2libGU6IGhlYWRlcnMgKHRhYnMpIG9yIGltcG9ydCBjVVJMIHRleHRhcmVhLiAqL1xuZXhwb3J0IHR5cGUgQXBpRWRpdEJvZHlWaWV3ID0gJ2hlYWRlcnMnIHwgJ2ltcG9ydC1jdXJsJztcblxuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0SGVhZGVyUm93IHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKiBQYXlsb2FkIGVtaXR0ZWQgd2hlbiB1c2VyIGNsaWNrcyBTZW5kIFJlcXVlc3QgKGVudmlyb25tZW50LCBtZXRob2QsIHVybCwgaGVhZGVycykuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRTZW5kUmVxdWVzdFBheWxvYWQge1xuICBlbnZpcm9ubWVudDogc3RyaW5nO1xuICBtZXRob2Q6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGhlYWRlcnM6IEFwaUVkaXRIZWFkZXJSb3dbXTtcbn1cblxuLyoqIE9BdXRoIDIuMCBhdXRoIGZpZWxkcyAod2hlbiBhdXRoIHR5cGUgaXMgT0F1dGggMi4wKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdE9BdXRoMlBheWxvYWQge1xuICBncmFudFR5cGU6IHN0cmluZztcbiAgYWNjZXNzVG9rZW5Vcmw6IHN0cmluZztcbiAgY2xpZW50SWQ6IHN0cmluZztcbiAgY2xpZW50U2VjcmV0OiBzdHJpbmc7XG4gIHNjb3BlOiBzdHJpbmc7XG4gIGNsaWVudEF1dGhlbnRpY2F0aW9uOiBzdHJpbmc7XG59XG5cbi8qKiBTdGVwIDEgcmVxdWVzdCArIGJvZHkgcGF5bG9hZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdFN0ZXAxUGF5bG9hZCB7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgaGVhZGVyczogQXBpRWRpdEhlYWRlclJvd1tdO1xuICAvKiogU2VsZWN0ZWQgYXV0aCB0eXBlOiBlLmcuICduby1hdXRoJywgJ2JlYXJlcicsICdvYXV0aDInLiAqL1xuICBhdXRoVHlwZTogc3RyaW5nO1xuICAvKiogQmVhcmVyIHRva2VuIHZhbHVlIHdoZW4gYXV0aFR5cGUgaXMgJ2JlYXJlcicuICovXG4gIGJlYXJlclRva2VuPzogc3RyaW5nO1xuICAvKiogT0F1dGggMi4wIGZpZWxkcyB3aGVuIGF1dGhUeXBlIGlzICdvYXV0aDInLiAqL1xuICBvYXV0aDI/OiBBcGlFZGl0T0F1dGgyUGF5bG9hZDtcbiAgYWN0aXZlUGF5bG9hZFRhYjogQXBpRWRpdFBheWxvYWRUYWI7XG4gIHBheWxvYWRUeXBlOiAncmF3JyB8ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnIHwgJ2Zvcm0tZGF0YSc7XG4gIHBheWxvYWRGb3JtYXQ6IHN0cmluZztcbiAgcGF5bG9hZFRleHQ6IHN0cmluZztcbiAga2V5VmFsdWVSb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXTtcbiAga2V5VHlwZVZhbHVlUm93czogeyBrZXk6IHN0cmluZzsgdHlwZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXTtcbiAgcGFyYW1zUm93czogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W107XG59XG5cbi8qKiBTdGVwIDIgc3RvcmUtcmVzcG9uc2UgcGF5bG9hZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdFN0ZXAyUGF5bG9hZCB7XG4gIHZhcmlhYmxlTmFtZTogc3RyaW5nO1xufVxuXG4vKiogUmVzcG9uc2UgYm9keSB2ZXJpZmljYXRpb24gcm93LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0UmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9uUm93IHtcbiAganNvblBhdGg6IHN0cmluZztcbiAgdmVyaWZpY2F0aW9uOiBzdHJpbmc7XG4gIGRhdGFUeXBlOiBzdHJpbmc7XG4gIGV4cGVjdGVkVmFsdWU6IHN0cmluZztcbn1cblxuLyoqIFN0YXR1cyB2ZXJpZmljYXRpb24gcm93LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0U3RhdHVzVmVyaWZpY2F0aW9uUm93IHtcbiAgdmVyaWZpY2F0aW9uOiBzdHJpbmc7XG4gIGV4cGVjdGVkVmFsdWU6IHN0cmluZztcbn1cblxuLyoqIFN0ZXAgMyB2YWxpZGF0aW9uIHBheWxvYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRTdGVwM1BheWxvYWQge1xuICBhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYjogJ3Jlc3BvbnNlLWJvZHknIHwgJ3N0YXR1cyc7XG4gIHJlc3BvbnNlQm9keVZlcmlmaWNhdGlvbnM6IEFwaUVkaXRSZXNwb25zZUJvZHlWZXJpZmljYXRpb25Sb3dbXTtcbiAgc3RhdHVzVmVyaWZpY2F0aW9uczogQXBpRWRpdFN0YXR1c1ZlcmlmaWNhdGlvblJvd1tdO1xufVxuXG4vKiogRnVsbCBwYXlsb2FkIGVtaXR0ZWQgd2hlbiB1c2VyIGNsaWNrcyBDcmVhdGUgKGFsbCBzdGVwc+KAmSBkYXRhKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdENyZWF0ZVBheWxvYWQge1xuICBzdGVwMTogQXBpRWRpdFN0ZXAxUGF5bG9hZDtcbiAgc3RlcDI6IEFwaUVkaXRTdGVwMlBheWxvYWQ7XG4gIHN0ZXAzOiBBcGlFZGl0U3RlcDNQYXlsb2FkO1xufVxuXG4vKiogRW52aXJvbm1lbnQgb3B0aW9uOiBlaXRoZXIgYSBzdHJpbmcgKGRpc3BsYXkgPSB2YWx1ZSkgb3IgYW4gb2JqZWN0IHdpdGggaWQsIG5hbWUsIHZhbHVlLCBsYWJlbC4gKi9cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50T3B0aW9uSW5wdXQgPSBzdHJpbmcgfCBTZWxlY3RPcHRpb247XG5cbmNvbnN0IE1FVEhPRFNfV0lUSE9VVF9CT0RZID0gWydHRVQnLCAnSEVBRCcsICdERUxFVEUnXTtcblxuLyoqIEF1dG8tY2xvc2UgcGFpcnMgZm9yIHBheWxvYWQgSlNPTiBlZGl0b3I6IG9wZW5pbmcgY2hhciAtPiBjbG9zaW5nIGNoYXIuICovXG5jb25zdCBQQVlMT0FEX0FVVE9fQ0xPU0VfUEFJUlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7ICd7JzogJ30nLCAnWyc6ICddJywgJ1wiJzogJ1wiJywgXCInXCI6IFwiJ1wiIH07XG5cbi8qKiBSZXN1bHQgb2YgcGFyc2luZyBhIGNVUkwgY29tbWFuZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkQ3VybCB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgaGVhZGVyczogQXBpRWRpdEhlYWRlclJvd1tdO1xuICBib2R5OiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGlzU2luZ2xlUXVvdGUoY2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2ggPT09IFwiJ1wiIHx8IGNoID09PSAnXFx1MjAxOCcgfHwgY2ggPT09ICdcXHUyMDE5Jztcbn1cbmZ1bmN0aW9uIGlzRG91YmxlUXVvdGUoY2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2ggPT09ICdcIicgfHwgY2ggPT09ICdcXHUyMDFDJyB8fCBjaCA9PT0gJ1xcdTIwMUQnO1xufVxuZnVuY3Rpb24gaXNDbG9zaW5nUXVvdGUoY2g6IHN0cmluZywgb3BlblF1b3RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGlzU2luZ2xlUXVvdGUob3BlblF1b3RlKSkgcmV0dXJuIGlzU2luZ2xlUXVvdGUoY2gpO1xuICBpZiAoaXNEb3VibGVRdW90ZShvcGVuUXVvdGUpKSByZXR1cm4gaXNEb3VibGVRdW90ZShjaCk7XG4gIHJldHVybiBjaCA9PT0gb3BlblF1b3RlO1xufVxuXG4vKipcbiAqIFRva2VuaXplIGEgc3RyaW5nIHJlc3BlY3Rpbmcgc2luZ2xlLSBhbmQgZG91YmxlLXF1b3RlZCBzZWdtZW50cyAoZm9yIGNVUkwgYXJncykuXG4gKiBIYW5kbGVzIHN0cmFpZ2h0IGFuZCBzbWFydC9jdXJseSBxdW90ZXMgc28gcGFzdGVkIGNVUkxzIGZyb20gYnJvd3NlcnMvZG9jcyB3b3JrLlxuICovXG5mdW5jdGlvbiB0b2tlbml6ZUN1cmxMaW5lKGxpbmU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaSA9IDA7XG4gIGNvbnN0IG4gPSBsaW5lLmxlbmd0aDtcbiAgd2hpbGUgKGkgPCBuKSB7XG4gICAgd2hpbGUgKGkgPCBuICYmIC9cXHMvLnRlc3QobGluZVtpXSkpIGkrKztcbiAgICBpZiAoaSA+PSBuKSBicmVhaztcbiAgICBjb25zdCBjaCA9IGxpbmVbaV07XG4gICAgaWYgKGlzU2luZ2xlUXVvdGUoY2gpIHx8IGlzRG91YmxlUXVvdGUoY2gpKSB7XG4gICAgICBjb25zdCBxdW90ZSA9IGNoO1xuICAgICAgaSsrO1xuICAgICAgbGV0IHZhbHVlID0gJyc7XG4gICAgICB3aGlsZSAoaSA8IG4gJiYgIWlzQ2xvc2luZ1F1b3RlKGxpbmVbaV0sIHF1b3RlKSkge1xuICAgICAgICBpZiAobGluZVtpXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgaSsrO1xuICAgICAgICAgIGlmIChpIDwgbikgdmFsdWUgKz0gbGluZVtpKytdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlICs9IGxpbmVbaSsrXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPCBuKSBpKys7XG4gICAgICB0b2tlbnMucHVzaCh2YWx1ZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgbGV0IHdvcmQgPSAnJztcbiAgICB3aGlsZSAoaSA8IG4gJiYgIS9cXHMvLnRlc3QobGluZVtpXSkgJiYgIWlzU2luZ2xlUXVvdGUobGluZVtpXSkgJiYgIWlzRG91YmxlUXVvdGUobGluZVtpXSkpIHtcbiAgICAgIHdvcmQgKz0gbGluZVtpKytdO1xuICAgIH1cbiAgICBpZiAod29yZCkgdG9rZW5zLnB1c2god29yZCk7XG4gIH1cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuLyoqIFN0cmlwIG9uZSBsYXllciBvZiBzdXJyb3VuZGluZyBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyBmcm9tIGEgc3RyaW5nIChlLmcuICd7XCJ4XCI6MX0nIC0+IHtcInhcIjoxfSkuICovXG5mdW5jdGlvbiBzdHJpcFN1cnJvdW5kaW5nUXVvdGVzKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChzLmxlbmd0aCA+PSAyICYmIChzLnN0YXJ0c1dpdGgoXCInXCIpICYmIHMuZW5kc1dpdGgoXCInXCIpKSB8fCAocy5zdGFydHNXaXRoKCdcIicpICYmIHMuZW5kc1dpdGgoJ1wiJykpKSB7XG4gICAgcmV0dXJuIHMuc2xpY2UoMSwgLTEpO1xuICB9XG4gIHJldHVybiBzO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgY1VSTCBjb21tYW5kIHN0cmluZyBhbmQgcmV0dXJuIG1ldGhvZCwgdXJsLCBoZWFkZXJzLCBhbmQgYm9keS5cbiAqIFN1cHBvcnRzIC1YLy0tcmVxdWVzdCwgLUgvLS1oZWFkZXIsIC1kLy0tZGF0YS8tLWRhdGEtcmF3Ly0tZGF0YS1iaW5hcnksIGFuZCBVUkwuXG4gKiBIYW5kbGVzIGxpbmUgY29udGludWF0aW9ucyAoYmFja3NsYXNoLW5ld2xpbmUpIGFuZCBxdW90ZWQgYm9keSBwYXlsb2Fkcy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VDdXJsKGN1cmxTdHJpbmc6IHN0cmluZyk6IFBhcnNlZEN1cmwgfCBudWxsIHtcbiAgY29uc3QgcmF3ID0gKGN1cmxTdHJpbmcgPz8gJycpLnRyaW0oKTtcbiAgaWYgKCFyYXcpIHJldHVybiBudWxsO1xuICAvLyBSZW1vdmUgbGluZSBjb250aW51YXRpb25zIChiYWNrc2xhc2ggZm9sbG93ZWQgYnkgbmV3bGluZSkgc28gdGhleSBkb24ndCBicmVhayB0b2tlbml6YXRpb25cbiAgY29uc3Qgbm9Db250aW51YXRpb25zID0gcmF3LnJlcGxhY2UoL1xcXFxcXHMqXFxyP1xcblxccyovZywgJyAnKTtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vQ29udGludWF0aW9ucy5yZXBsYWNlKC9cXHI/XFxuL2csICcgJykucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZUN1cmxMaW5lKG5vcm1hbGl6ZWQpO1xuICBsZXQgbWV0aG9kID0gJ0dFVCc7XG4gIGxldCB1cmwgPSAnJztcbiAgY29uc3QgaGVhZGVyczogQXBpRWRpdEhlYWRlclJvd1tdID0gW107XG4gIGxldCBib2R5ID0gJyc7XG4gIGNvbnN0IHVybFBhdHRlcm4gPSAvXmh0dHBzPzpcXC9cXC8vaTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0ID0gdG9rZW5zW2ldO1xuICAgIGNvbnN0IGNvbnN1bWVOZXh0ID0gKCkgPT4ge1xuICAgICAgaSsrO1xuICAgICAgcmV0dXJuIHRva2Vuc1tpXTtcbiAgICB9O1xuICAgIGlmICh0ID09PSAnLVgnIHx8IHQgPT09ICctLXJlcXVlc3QnKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnN1bWVOZXh0KCk7XG4gICAgICBpZiAodmFsdWUpIG1ldGhvZCA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHQgPT09ICctSCcgfHwgdCA9PT0gJy0taGVhZGVyJykge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb25zdW1lTmV4dCgpO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNvbG9uID0gdmFsdWUuaW5kZXhPZignOicpO1xuICAgICAgICBpZiAoY29sb24gIT09IC0xKSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IHZhbHVlLnNsaWNlKDAsIGNvbG9uKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgaGVhZGVyVmFsdWUgPSB2YWx1ZS5zbGljZShjb2xvbiArIDEpLnRyaW0oKTtcbiAgICAgICAgICBpZiAobmFtZSkgaGVhZGVycy5wdXNoKHsgbmFtZSwgdHlwZTogJ3N0cmluZycsIHZhbHVlOiBoZWFkZXJWYWx1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0ID09PSAnLWQnIHx8IHQgPT09ICctLWRhdGEnIHx8IHQgPT09ICctLWRhdGEtcmF3JyB8fCB0ID09PSAnLS1kYXRhLWJpbmFyeScgfHwgdCA9PT0gJy0tZGF0YS1hc2NpaScpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29uc3VtZU5leHQoKTtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICFTdHJpbmcodmFsdWUpLnN0YXJ0c1dpdGgoJ0AnKSkgYm9keSA9IHN0cmlwU3Vycm91bmRpbmdRdW90ZXModmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0LnN0YXJ0c1dpdGgoJy0tZGF0YT0nKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0LnNsaWNlKDcpO1xuICAgICAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKCdAJykpIGJvZHkgPSBzdHJpcFN1cnJvdW5kaW5nUXVvdGVzKHZhbHVlLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgJycpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodC5zdGFydHNXaXRoKCctLWRhdGEtcmF3PScpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHQuc2xpY2UoMTEpO1xuICAgICAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKCdAJykpIGJvZHkgPSBzdHJpcFN1cnJvdW5kaW5nUXVvdGVzKHZhbHVlLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgJycpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodC5zdGFydHNXaXRoKCctZCcpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHQubGVuZ3RoID4gMiA/IHQuc2xpY2UoMikgOiBjb25zdW1lTmV4dCgpO1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgIXZhbHVlLnN0YXJ0c1dpdGgoJ0AnKSkgYm9keSA9IHN0cmlwU3Vycm91bmRpbmdRdW90ZXModmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh1cmxQYXR0ZXJuLnRlc3QodCkpIHtcbiAgICAgIGlmICghdXJsKSB1cmwgPSB0O1xuICAgIH1cbiAgfVxuICBpZiAoIXVybCkge1xuICAgIGNvbnN0IGZpcnN0VXJsID0gdG9rZW5zLmZpbmQoKHRvaykgPT4gdXJsUGF0dGVybi50ZXN0KHRvaykpO1xuICAgIGlmIChmaXJzdFVybCkgdXJsID0gZmlyc3RVcmw7XG4gIH1cbiAgLy8gTWFueSBjVVJMcyAoZS5nLiBmcm9tIGJyb3dzZXIgZGV2dG9vbHMpIG9taXQgLVggUE9TVCB3aGVuIHNlbmRpbmcgYSBib2R5OyBpbmZlciBQT1NUXG4gIGNvbnN0IGZpbmFsTWV0aG9kID0gKG1ldGhvZCB8fCAnR0VUJykudG9VcHBlckNhc2UoKTtcbiAgaWYgKGJvZHkgJiYgKGZpbmFsTWV0aG9kID09PSAnR0VUJyB8fCBmaW5hbE1ldGhvZCA9PT0gJ0hFQUQnKSkge1xuICAgIHJldHVybiB7IG1ldGhvZDogJ1BPU1QnLCB1cmwsIGhlYWRlcnMsIGJvZHkgfTtcbiAgfVxuICByZXR1cm4geyBtZXRob2Q6IGZpbmFsTWV0aG9kLCB1cmwsIGhlYWRlcnMsIGJvZHkgfTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWFwaS1lZGl0LXN0ZXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0LFxufSlcbmV4cG9ydCBjbGFzcyBBcGlFZGl0U3RlcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBpbml0aWFsTWV0aG9kPzogc3RyaW5nO1xuICBASW5wdXQoKSBpbml0aWFsRW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGluaXRpYWxTdGVwPzogbnVtYmVyO1xuICBASW5wdXQoKSBpbml0aWFsVXJsPzogc3RyaW5nO1xuICBASW5wdXQoKSBpbml0aWFsUGF5bG9hZFRhYj86IEFwaUVkaXRQYXlsb2FkVGFiO1xuICBASW5wdXQoKSBpbml0aWFsSGVhZGVycz86IEFwaUVkaXRIZWFkZXJSb3dbXTtcbiAgQElucHV0KCkgaW5pdGlhbFJlc3BvbnNlUHJldmlldz86IHN0cmluZztcbiAgQElucHV0KCkgaW5pdGlhbFZhcmlhYmxlTmFtZT86IHN0cmluZztcbiAgQElucHV0KCkgZWRpdE1vZGU/OiBib29sZWFuO1xuXG4gIC8qKiBFbWl0cyB0aGUgY1VSTCBzdHJpbmcgd2hlbiB1c2VyIGNsaWNrcyBJbXBvcnQgKHZhbHVlIGZyb20gdGhlIHRleHRhcmVhIGNvbnRyb2wpLiAqL1xuICBAT3V0cHV0KCkgaW1wb3J0Q3VybCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdHMgd2hlbiB1c2VyIGNhbmNlbHMgdGhlIEltcG9ydCBjVVJMIHBhbmVsIChjbGlja3MgQ2FuY2VsKS4gKi9cbiAgQE91dHB1dCgpIGltcG9ydEN1cmxDYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHVzZXIgY2xpY2tzIFNlbmQgUmVxdWVzdCwgd2l0aCBlbnZpcm9ubWVudCwgbWV0aG9kLCB1cmwsIGFuZCBoZWFkZXJzLiAqL1xuICBAT3V0cHV0KCkgc2VuZFJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPEFwaUVkaXRTZW5kUmVxdWVzdFBheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSBiYWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRW1pdHMgd2hlbiB1c2VyIGNsaWNrcyB0aGUgQ2FuY2VsIGJ1dHRvbiAoc3RlcCAxKS4gKi9cbiAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG5leHQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHVzZXIgY2xpY2tzIENyZWF0ZSB3aXRoIGFsbCBlbnRlcmVkIGRldGFpbHM6IHN0ZXAxIChlbnZpcm9ubWVudCwgSFRUUCBtZXRob2QsIFVSTCwgaGVhZGVycywgYm9keSksIHN0ZXAyICh2YXJpYWJsZSBuYW1lKSwgc3RlcDMgKHZlcmlmaWNhdGlvbnMpLiAqL1xuICBAT3V0cHV0KCkgY3JlYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxBcGlFZGl0Q3JlYXRlUGF5bG9hZD4oKTtcbiAgLyoqIEVtaXRzIHdoZW5ldmVyIGhlYWRlcnMgY2hhbmdlIChhZGQsIHJlbW92ZSwgb3IgZWRpdCkgc28gdGhlIHBhcmVudCBjYW4gcmVmbGVjdCB0aGVtIGluIHRoZSBjYW52YXMvY29udHJvbHMuICovXG4gIEBPdXRwdXQoKSBoZWFkZXJzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBcGlFZGl0SGVhZGVyUm93W10+KCk7XG5cbiAgLyoqIEZvcm0gY29udHJvbCBmb3IgSW1wb3J0IGNVUkwgdGV4dGFyZWE7IHZhbHVlIGlzIGVtaXR0ZWQgd2hlbiB1c2VyIGNsaWNrcyBJbXBvcnQuICovXG4gIHJlYWRvbmx5IGltcG9ydEN1cmxDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnKTtcblxuICB2YXJpYWJsZU5hbWUgPSAnJztcbiAgdmFyaWFibGVOYW1lRXJyb3IgPSAnJztcblxuICAvKiogQ29udHJvbHMgd2hpY2ggYm9keSBjb250ZW50IGlzIHZpc2libGU6IGhlYWRlcnMgKGRlZmF1bHQpIG9yIGltcG9ydC1jdXJsLiAqL1xuICBib2R5VmlldzogQXBpRWRpdEJvZHlWaWV3ID0gJ2hlYWRlcnMnO1xuXG4gIHJlYWRvbmx5IHN0ZXBMYWJlbHMgPSBbXG4gICAgeyBpbmRleDogMSwgbGFiZWw6IEFQSV9FRElUX1NURVBfTEFCRUxTLlJFUVVFU1RfREVUQUlMUyB9LFxuICAgIHsgaW5kZXg6IDIsIGxhYmVsOiBBUElfRURJVF9TVEVQX0xBQkVMUy5TVE9SRV9SRVNQT05TRSB9LFxuICAgIHsgaW5kZXg6IDMsIGxhYmVsOiBBUElfRURJVF9TVEVQX0xBQkVMUy5WQUxJREFUSU9OIH0sXG4gIF07XG4gIGN1cnJlbnRTdGVwID0gMTtcblxuICAvKiogVGhlIGxhYmVsIGZvciB0aGUgY3VycmVudCBzdGVwIG9ubHkgKHVzZWQgd2hlbiBzaG93aW5nIGEgc2luZ2xlIHN0ZXAgaW4gdGhlIGluZGljYXRvcikuICovXG4gIGdldCBhY3RpdmVTdGVwTGFiZWwoKTogeyBpbmRleDogbnVtYmVyOyBsYWJlbDogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0ZXBMYWJlbHNbdGhpcy5jdXJyZW50U3RlcCAtIDFdO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtaW5TdGVwID0gMTtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhTdGVwID0gMztcblxuICAvKiogUGVyY2VudGFnZSB0byB0cmFuc2xhdGUgdGhlIHN0ZXAgc3RyaXAgKDAsIC0zMy4zMzMsIC02Ni42NjYpIGZvciBDU1MgdHJhbnNpdGlvbi4gKi9cbiAgZ2V0IHN0cmlwVHJhbnNsYXRlUGVyY2VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5jdXJyZW50U3RlcCAtIDEpICogLTMzLjMzMztcbiAgfVxuXG4gIHNldFN0ZXAoc3RlcDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHN0ZXAgPj0gdGhpcy5taW5TdGVwICYmIHN0ZXAgPD0gdGhpcy5tYXhTdGVwKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTdGVwID0gc3RlcDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5SW5pdGlhbFN0ZXAodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm47XG4gICAgY29uc3QgY2xhbXBlZCA9IE1hdGgubWF4KHRoaXMubWluU3RlcCwgTWF0aC5taW4odGhpcy5tYXhTdGVwLCBNYXRoLmZsb29yKHZhbHVlKSkpO1xuICAgIHRoaXMuY3VycmVudFN0ZXAgPSBjbGFtcGVkO1xuICB9XG5cbiAgLyoqIEhUVFAgbWV0aG9kIG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB3aXRoIGlkLCBuYW1lLCB2YWx1ZSwgbGFiZWwgKHBhc3NlZCBmcm9tIHBhcmVudCkuICovXG4gIEBJbnB1dCgpIGh0dHBNZXRob2RPcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcblxuICAvKiogRm9ybSBmb3IgSFRUUCBtZXRob2Qgc2VsZWN0IChjcWEtZHluYW1pYy1zZWxlY3QpICovXG4gIG1ldGhvZEZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIENvbmZpZyBmb3IgbWV0aG9kIGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gaHR0cE1ldGhvZE9wdGlvbnMgY2hhbmdlcyB0byBhdm9pZCBuZXcgcmVmZXJlbmNlIGV2ZXJ5IENEKSAqL1xuICBtZXRob2RTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdtZXRob2QnLFxuICAgIHBsYWNlaG9sZGVyOiAnTWV0aG9kJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXSxcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZU1ldGhvZFNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID0gKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnMgPz8gW10pLm1hcCgobSkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24obSkpO1xuICAgIHRoaXMubWV0aG9kU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5tZXRob2RTZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldE1ldGhvZFZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuICh0aGlzLmh0dHBNZXRob2RPcHRpb25zID8/IFtdKVxuICAgICAgLm1hcCgobSkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUobSkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIC8qKiBGb3JtIGZvciBlbnZpcm9ubWVudCBzZWxlY3QgKGNxYS1keW5hbWljLXNlbGVjdCkgKi9cbiAgZW52aXJvbm1lbnRGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBFbnZpcm9ubWVudCBvcHRpb25zOiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgd2l0aCBpZCwgbmFtZSwgdmFsdWUsIGxhYmVsIChwYXNzZWQgZnJvbSBwYXJlbnQpLiAqL1xuICBASW5wdXQoKSBlbnZpcm9ubWVudE9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIC8qKiBDb25maWcgZm9yIGVudmlyb25tZW50IGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gZW52aXJvbm1lbnRPcHRpb25zIGNoYW5nZXMgdG8gYXZvaWQgbmV3IHJlZmVyZW5jZSBldmVyeSBDRCkgKi9cbiAgZW52aXJvbm1lbnRTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdlbnZpcm9ubWVudCcsXG4gICAgcGxhY2Vob2xkZXI6ICdFbnZpcm9ubWVudCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW10sXG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdG9TZWxlY3RPcHRpb24oaXRlbTogRW52aXJvbm1lbnRPcHRpb25JbnB1dCk6IFNlbGVjdE9wdGlvbiB7XG4gICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgaWQ6IGl0ZW0sIHZhbHVlOiBpdGVtLCBuYW1lOiBpdGVtLCBsYWJlbDogaXRlbSB9O1xuICAgIH1cbiAgICBjb25zdCBvID0gaXRlbSBhcyBTZWxlY3RPcHRpb247XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBvLmlkID8/IG8udmFsdWUsXG4gICAgICB2YWx1ZTogby52YWx1ZSA/PyBvLmlkLFxuICAgICAgbmFtZTogby5uYW1lID8/IG8ubGFiZWwgPz8gU3RyaW5nKG8udmFsdWUgPz8gby5pZCksXG4gICAgICBsYWJlbDogby5sYWJlbCA/PyBvLm5hbWUgPz8gU3RyaW5nKG8udmFsdWUgPz8gby5pZCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldE9wdGlvblZhbHVlKGl0ZW06IEVudmlyb25tZW50T3B0aW9uSW5wdXQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHJldHVybiBpdGVtO1xuICAgIGNvbnN0IG8gPSBpdGVtIGFzIFNlbGVjdE9wdGlvbjtcbiAgICBjb25zdCB2ID0gby52YWx1ZSA/PyBvLmlkO1xuICAgIHJldHVybiB2ICE9IG51bGwgPyBTdHJpbmcodikgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUVudmlyb25tZW50U2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSAodGhpcy5lbnZpcm9ubWVudE9wdGlvbnMgPz8gW10pLm1hcCgoZSkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24oZSkpO1xuICAgIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbnZpcm9ubWVudFZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuICh0aGlzLmVudmlyb25tZW50T3B0aW9ucyA/PyBbXSlcbiAgICAgIC5tYXAoKGUpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGUpKVxuICAgICAgLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+IHYgIT0gbnVsbCk7XG4gIH1cblxuICAvKiogRm9ybSBmb3IgQXV0aCBUeXBlIHNlbGVjdCAoQXV0aG9yaXphdGlvbiB0YWIpICovXG4gIGF1dGhUeXBlRm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogQXV0aCB0eXBlIG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB3aXRoIGlkLCBuYW1lLCB2YWx1ZSwgbGFiZWwgKHBhc3NlZCBmcm9tIHBhcmVudCkuIEZhbGxzIGJhY2sgdG8gYnVpbHQtaW4gbGlzdCB3aGVuIGVtcHR5LiAqL1xuICBASW5wdXQoKSBhdXRoVHlwZU9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIC8qKiBJbml0aWFsIGF1dGggdHlwZSAoc3RyaW5nIG9yIG9wdGlvbiBvYmplY3QpLiBXaGVuIG5vdCBzZXQsIGZpcnN0IG9mIGF1dGhUeXBlT3B0aW9ucyBvciBkZWZhdWx0IFwiTm8gQXV0aFwiIGlzIHVzZWQuICovXG4gIEBJbnB1dCgpIGluaXRpYWxBdXRoVHlwZT86IHN0cmluZyB8IEVudmlyb25tZW50T3B0aW9uSW5wdXQ7XG5cbiAgLyoqIERlZmF1bHQgb3B0aW9ucyB3aGVuIGF1dGhUeXBlT3B0aW9ucyBpcyBlbXB0eSAoc2FtZSBzaGFwZSBhcyBlbnZpcm9ubWVudCkgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9BVVRIX1RZUEVfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ25vLWF1dGgnLCB2YWx1ZTogJ25vLWF1dGgnLCBuYW1lOiAnTm8gQXV0aCcsIGxhYmVsOiAnTm8gQXV0aCcgfSxcbiAgICB7IGlkOiAnYmVhcmVyJywgdmFsdWU6ICdiZWFyZXInLCBuYW1lOiAnQmVhcmVyIFRva2VuJywgbGFiZWw6ICdCZWFyZXIgVG9rZW4nIH0sXG4gICAgeyBpZDogJ29hdXRoMicsIHZhbHVlOiAnb2F1dGgyJywgbmFtZTogJ09BdXRoIDIuMCcsIGxhYmVsOiAnT0F1dGggMi4wJyB9LFxuICBdO1xuXG4gIC8qKiBDb25maWcgZm9yIEF1dGggVHlwZSBkcm9wZG93biAodXBkYXRlZCB3aGVuIGF1dGhUeXBlT3B0aW9ucyBjaGFuZ2VzLCBsaWtlIGVudmlyb25tZW50KSAqL1xuICBhdXRoVHlwZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2F1dGhUeXBlJyxcbiAgICBwbGFjZWhvbGRlcjogJ05vIEF1dGgnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlQXV0aFR5cGVTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9XG4gICAgICB0aGlzLmF1dGhUeXBlT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuYXV0aFR5cGVPcHRpb25zLm1hcCgoYSkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24oYSkpXG4gICAgICAgIDogWy4uLkFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfQVVUSF9UWVBFX09QVElPTlNdO1xuICAgIHRoaXMuYXV0aFR5cGVTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmF1dGhUeXBlU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdXRoVHlwZVZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMuYXV0aFR5cGVPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5hdXRoVHlwZU9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9BVVRIX1RZUEVfT1BUSU9OUyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0W10pO1xuICAgIHJldHVybiBzb3VyY2VcbiAgICAgIC5tYXAoKGEpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGEgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIC8qKiBDdXJyZW50IGF1dGggdHlwZSB2YWx1ZSAoZS5nLiAnbm8tYXV0aCcpIGZvciB0ZW1wbGF0ZSAqL1xuICBnZXQgc2VsZWN0ZWRBdXRoVHlwZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHYgPSB0aGlzLmF1dGhUeXBlRm9ybT8uZ2V0KCdhdXRoVHlwZScpPy52YWx1ZTtcbiAgICBpZiAodiA9PSBudWxsIHx8IHYgPT09ICcnKSByZXR1cm4gJ25vLWF1dGgnO1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyAodj8udmFsdWUgPz8gdj8uaWQgPz8gJ25vLWF1dGgnKSA6IFN0cmluZyh2KTtcbiAgfVxuXG4gIC8qKiBCZWFyZXIgdG9rZW4gdmFsdWUgKEF1dGhvcml6YXRpb24gdGFiLCB3aGVuIGF1dGggdHlwZSBpcyBCZWFyZXIgVG9rZW4pLiAqL1xuICBiZWFyZXJUb2tlbiA9ICcnO1xuXG4gIC8qKiBGb3JtIGZvciBPQXV0aCAyLjAgZmllbGRzIChBdXRob3JpemF0aW9uIHRhYiB3aGVuIGF1dGggdHlwZSBpcyBPQXV0aCAyLjApLiAqL1xuICBvYXV0aDJGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBHcmFudCB0eXBlIG9wdGlvbnMgZm9yIE9BdXRoIDIuMCAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBPQVVUSF9HUkFOVF9UWVBFX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdjbGllbnRfY3JlZGVudGlhbHMnLCB2YWx1ZTogJ2NsaWVudF9jcmVkZW50aWFscycsIG5hbWU6ICdDbGllbnQgQ3JlZGVudGlhbHMnLCBsYWJlbDogJ0NsaWVudCBDcmVkZW50aWFscycgfSxcbiAgICB7IGlkOiAnYXV0aG9yaXphdGlvbl9jb2RlJywgdmFsdWU6ICdhdXRob3JpemF0aW9uX2NvZGUnLCBuYW1lOiAnQXV0aG9yaXphdGlvbiBDb2RlJywgbGFiZWw6ICdBdXRob3JpemF0aW9uIENvZGUnIH0sXG4gICAgeyBpZDogJ3Bhc3N3b3JkJywgdmFsdWU6ICdwYXNzd29yZCcsIG5hbWU6ICdQYXNzd29yZCcsIGxhYmVsOiAnUGFzc3dvcmQnIH0sXG4gICAgeyBpZDogJ2ltcGxpY2l0JywgdmFsdWU6ICdpbXBsaWNpdCcsIG5hbWU6ICdJbXBsaWNpdCcsIGxhYmVsOiAnSW1wbGljaXQnIH0sXG4gIF07XG5cbiAgLyoqIENsaWVudCBhdXRoZW50aWNhdGlvbiBtZXRob2Qgb3B0aW9ucyBmb3IgT0F1dGggMi4wICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE9BVVRIX0NMSUVOVF9BVVRIX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdiYXNpYycsIHZhbHVlOiAnYmFzaWMnLCBuYW1lOiAnU2VuZCBhcyBCYXNpYyBBdXRoIGhlYWRlcicsIGxhYmVsOiAnU2VuZCBhcyBCYXNpYyBBdXRoIGhlYWRlcicgfSxcbiAgICB7IGlkOiAnYm9keScsIHZhbHVlOiAnYm9keScsIG5hbWU6ICdTZW5kIGluIGJvZHknLCBsYWJlbDogJ1NlbmQgaW4gYm9keScgfSxcbiAgXTtcblxuICByZWFkb25seSBvYXV0aDJHcmFudFR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdncmFudFR5cGUnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGdyYW50IHR5cGUnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFsuLi5BcGlFZGl0U3RlcENvbXBvbmVudC5PQVVUSF9HUkFOVF9UWVBFX09QVElPTlNdLFxuICB9O1xuXG4gIHJlYWRvbmx5IG9hdXRoMkNsaWVudEF1dGhTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdjbGllbnRBdXRoZW50aWNhdGlvbicsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgbWV0aG9kJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuT0FVVEhfQ0xJRU5UX0FVVEhfT1BUSU9OU10sXG4gIH07XG5cbiAgLyoqIEN1cnJlbnQgSFRUUCBtZXRob2QgKGZyb20gZm9ybSBvciBkZWZhdWx0OiBmaXJzdCBvZiBodHRwTWV0aG9kT3B0aW9ucykuIFRyZWF0cyBlbXB0eSBzdHJpbmcgYXMgdW5zZXQuICovXG4gIGdldCBzZWxlY3RlZE1ldGhvZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5tZXRob2RGb3JtPy5nZXQoJ21ldGhvZCcpPy52YWx1ZTtcbiAgICBjb25zdCBmaXJzdFZhbHVlID0gdGhpcy5odHRwTWV0aG9kT3B0aW9ucz8ubGVuZ3RoXG4gICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnNbMF0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXNvbHZlZCA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT09ICcnID8gKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2YWx1ZSBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA6IFN0cmluZyh2YWx1ZSkpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXNvbHZlZCA/PyBmaXJzdFZhbHVlID8/ICdHRVQnO1xuICB9XG4gIHNldCBzZWxlY3RlZE1ldGhvZCh2OiBzdHJpbmcpIHtcbiAgICB0aGlzLm1ldGhvZEZvcm0/LnBhdGNoVmFsdWUoeyBtZXRob2Q6IHYgfSk7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIHRoZSBzZWxlY3RlZCBIVFRQIG1ldGhvZCBpcyBHRVQsIEhFQUQsIG9yIERFTEVURSAobm8gcmVxdWVzdCBib2R5KS4gKi9cbiAgZ2V0IGlzTWV0aG9kV2l0aG91dEJvZHkoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5zZWxlY3RlZE1ldGhvZCAhPSBudWxsID8gU3RyaW5nKHRoaXMuc2VsZWN0ZWRNZXRob2QpLnRvVXBwZXJDYXNlKCkgOiAnJztcbiAgICByZXR1cm4gTUVUSE9EU19XSVRIT1VUX0JPRFkuaW5jbHVkZXMobWV0aG9kKTtcbiAgfVxuXG4gIC8qKiBDYWNoZWQgZW52aXJvbm1lbnQgdmFsdWUgZnJvbSBsYXN0IHNlbGVjdGlvbiAoc28gQ3JlYXRlIHBheWxvYWQgaGFzIHRoZSBzZWxlY3RlZCB2YWx1ZSkuICovXG4gIHByaXZhdGUgY3VycmVudEVudmlyb25tZW50VmFsdWUgPSAnJztcblxuICAvKiogQ2FjaGVkIEhUVFAgbWV0aG9kIGZyb20gbGFzdCBzZWxlY3Rpb24gKHNvIENyZWF0ZSBwYXlsb2FkIGhhcyB0aGUgc2VsZWN0ZWQgdmFsdWUpLiAqL1xuICBwcml2YXRlIGN1cnJlbnRNZXRob2RWYWx1ZSA9ICcnO1xuXG4gIC8qKiBDdXJyZW50IGVudmlyb25tZW50IChmcm9tIGZvcm0gb3IgZGVmYXVsdDogZmlyc3Qgb2YgZW52aXJvbm1lbnRPcHRpb25zKS4gVHJlYXRzIGVtcHR5IHN0cmluZyBhcyB1bnNldC4gKi9cbiAgZ2V0IHNlbGVjdGVkRW52aXJvbm1lbnQoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZW52aXJvbm1lbnRGb3JtPy5nZXQoJ2Vudmlyb25tZW50Jyk/LnZhbHVlO1xuICAgIGNvbnN0IGZpcnN0VmFsdWUgPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucz8ubGVuZ3RoXG4gICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuZW52aXJvbm1lbnRPcHRpb25zWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSAnJyA/ICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodmFsdWUgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgOiBTdHJpbmcodmFsdWUpKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZWQgPz8gZmlyc3RWYWx1ZSA/PyAnRGV2ZWxvcG1lbnQnO1xuICB9XG4gIHNldCBzZWxlY3RlZEVudmlyb25tZW50KHY6IHN0cmluZykge1xuICAgIHRoaXMuZW52aXJvbm1lbnRGb3JtPy5wYXRjaFZhbHVlKHsgZW52aXJvbm1lbnQ6IHYgfSk7XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdXNlciBzZWxlY3RzIGFuIGVudmlyb25tZW50OyBrZWVwcyBjdXJyZW50RW52aXJvbm1lbnRWYWx1ZSBpbiBzeW5jIGZvciBjcmVhdGUgcGF5bG9hZC4gKi9cbiAgb25FbnZpcm9ubWVudFNlbGVjdGlvbkNoYW5nZShldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfSk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSBldmVudC52YWx1ZTtcbiAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID1cbiAgICAgIHYgIT0gbnVsbFxuICAgICAgICA/IHR5cGVvZiB2ID09PSAnb2JqZWN0J1xuICAgICAgICAgID8gKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpXG4gICAgICAgICAgOiBTdHJpbmcodilcbiAgICAgICAgOiAnJztcbiAgfVxuXG4gIC8qKiBDYWxsZWQgd2hlbiB1c2VyIHNlbGVjdHMgYW4gSFRUUCBtZXRob2Q7IGtlZXBzIGN1cnJlbnRNZXRob2RWYWx1ZSBpbiBzeW5jIGZvciBjcmVhdGUgcGF5bG9hZC4gKi9cbiAgb25NZXRob2RTZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gZXZlbnQudmFsdWU7XG4gICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPVxuICAgICAgdiAhPSBudWxsXG4gICAgICAgID8gdHlwZW9mIHYgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJylcbiAgICAgICAgICA6IFN0cmluZyh2KVxuICAgICAgICA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXJsID0gJyc7XG5cbiAgLyoqIFVSTCBmb3IgdGhlIHJlcXVlc3QuIEdldHRlci9zZXR0ZXIgc3luY3MgcXVlcnkgcGFyYW1zIHdpdGggdGhlIFBhcmFtcyB0YWIgKFBvc3RtYW4tc3R5bGUpLiAqL1xuICBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuICBzZXQgdXJsKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBuZXh0ID0gdmFsdWUgPz8gJyc7XG4gICAgaWYgKHRoaXMuX3VybCA9PT0gbmV4dCkgcmV0dXJuO1xuICAgIHRoaXMuX3VybCA9IG5leHQ7XG4gICAgaWYgKHRoaXMucGFyYW1zRm9ybUFycmF5KSB7XG4gICAgICB0aGlzLnBhcmFtc1N5bmNpbmdGcm9tVXJsID0gdHJ1ZTtcbiAgICAgIHRoaXMuc3luY1BhcmFtc0Zyb21VcmwoKTtcbiAgICAgIHRoaXMucGFyYW1zU3luY2luZ0Zyb21VcmwgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogV2hlbiB0cnVlLCBwYXJhbXMgZm9ybSBjaGFuZ2VzIHNob3VsZCBub3QgdXBkYXRlIHRoZSBVUkwgKHdlJ3JlIHN5bmNpbmcgZnJvbSBVUkwpLiAqL1xuICBwcml2YXRlIHBhcmFtc1N5bmNpbmdGcm9tVXJsID0gZmFsc2U7XG5cbiAgcmVhZG9ubHkgcGF5bG9hZFRhYnM6IHsgdmFsdWU6IEFwaUVkaXRQYXlsb2FkVGFiOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtcbiAgICB7IHZhbHVlOiAnYXV0aG9yaXphdGlvbicsIGxhYmVsOiAnQXV0aG9yaXphdGlvbicgfSxcbiAgICB7IHZhbHVlOiAnaGVhZGVycycsIGxhYmVsOiAnSGVhZGVycycgfSxcbiAgICB7IHZhbHVlOiAnYm9keScsIGxhYmVsOiAnQm9keScgfSxcbiAgICB7IHZhbHVlOiAncGFyYW1zJywgbGFiZWw6ICdQYXJhbXMnIH0sXG4gIF07XG4gIGFjdGl2ZVBheWxvYWRUYWI6IEFwaUVkaXRQYXlsb2FkVGFiID0gJ2hlYWRlcnMnO1xuXG4gIC8qKiBTdGVwIDM6IFJlc3BvbnNlIHZlcmlmaWNhdGlvbiB0YWJzICovXG4gIHJlYWRvbmx5IHJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiczogeyB2YWx1ZTogJ3Jlc3BvbnNlLWJvZHknIHwgJ3N0YXR1cyc7IGxhYmVsOiBzdHJpbmcgfVtdID0gW1xuICAgIHsgdmFsdWU6ICdyZXNwb25zZS1ib2R5JywgbGFiZWw6ICdSZXNwb25zZSBCb2R5JyB9LFxuICAgIHsgdmFsdWU6ICdzdGF0dXMnLCBsYWJlbDogJ1N0YXR1cycgfSxcbiAgXTtcbiAgYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWI6ICdyZXNwb25zZS1ib2R5JyB8ICdzdGF0dXMnID0gJ3Jlc3BvbnNlLWJvZHknO1xuXG4gIC8qKiBQYXlsb2FkIHR5cGUgZm9yIEJvZHkvUGFyYW1zL0F1dGhvcml6YXRpb246IHJhdywgeC13d3ctZm9ybS11cmxlbmNvZGVkLCBmb3JtLWRhdGEgKi9cbiAgcGF5bG9hZFR5cGU6ICdyYXcnIHwgJ3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfCAnZm9ybS1kYXRhJyA9ICdyYXcnO1xuXG4gIC8qKiBTZWdtZW50IG9wdGlvbnMgZm9yIHBheWxvYWQgdHlwZSAodXNlZCBieSBjcWEtc2VnbWVudC1jb250cm9sKSAqL1xuICByZWFkb25seSBwYXlsb2FkVHlwZVNlZ21lbnRzID0gW1xuICAgIHsgbGFiZWw6ICdSYXcnLCB2YWx1ZTogJ3JhdycgfSxcbiAgICB7IGxhYmVsOiAneC13d3ctZm9ybS11cmxlbmNvZGVkJywgdmFsdWU6ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnIH0sXG4gICAgeyBsYWJlbDogJ0Zvcm0gRGF0YScsIHZhbHVlOiAnZm9ybS1kYXRhJyB9LFxuICBdO1xuXG4gIG9uUGF5bG9hZFR5cGVDaGFuZ2UodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnBheWxvYWRUeXBlID0gdmFsIGFzICdyYXcnIHwgJ3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfCAnZm9ybS1kYXRhJztcbiAgfVxuXG4gIC8qKiBGb3JtIGZvciBGb3JtYXQgc2VsZWN0IChCb2R5L1BhcmFtcy9BdXRob3JpemF0aW9uKSAqL1xuICBwYXlsb2FkRm9ybWF0Rm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogRm9ybWF0IG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyAocGFzc2VkIGZyb20gcGFyZW50KS4gRmFsbHMgYmFjayB0byBKU09OLCBYTUwsIEhUTUwsIFRleHQgd2hlbiBlbXB0eS4gKi9cbiAgQElucHV0KCkgZm9ybWF0T3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgQElucHV0KCkgaW5pdGlhbEZvcm1hdD86IHN0cmluZztcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0ZPUk1BVF9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAnanNvbicsIHZhbHVlOiAnanNvbicsIG5hbWU6ICdKU09OJywgbGFiZWw6ICdKU09OJyB9LFxuICAgIHsgaWQ6ICd4bWwnLCB2YWx1ZTogJ3htbCcsIG5hbWU6ICdYTUwnLCBsYWJlbDogJ1hNTCcgfSxcbiAgICB7IGlkOiAnaHRtbCcsIHZhbHVlOiAnaHRtbCcsIG5hbWU6ICdIVE1MJywgbGFiZWw6ICdIVE1MJyB9LFxuICAgIHsgaWQ6ICd0ZXh0JywgdmFsdWU6ICd0ZXh0JywgbmFtZTogJ1RleHQnLCBsYWJlbDogJ1RleHQnIH0sXG4gIF07XG5cbiAgLyoqIENvbmZpZyBmb3IgRm9ybWF0IGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gZm9ybWF0T3B0aW9ucyBjaGFuZ2VzLCBsaWtlIE1ldGhvZCBkcm9wZG93bikgKi9cbiAgcGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2Zvcm1hdCcsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFsuLi5BcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0ZPUk1BVF9PUFRJT05TXSxcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZVBheWxvYWRGb3JtYXRTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9XG4gICAgICB0aGlzLmZvcm1hdE9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLmZvcm1hdE9wdGlvbnMubWFwKChmKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihmKSlcbiAgICAgICAgOiBBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0ZPUk1BVF9PUFRJT05TO1xuICAgIHRoaXMucGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMucGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZyxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rm9ybWF0VmFsdWVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzb3VyY2UgPVxuICAgICAgdGhpcy5mb3JtYXRPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5mb3JtYXRPcHRpb25zXG4gICAgICAgIDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfRk9STUFUX09QVElPTlMgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdKTtcbiAgICByZXR1cm4gc291cmNlXG4gICAgICAubWFwKChmKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShmIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpKVxuICAgICAgLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+IHYgIT0gbnVsbCk7XG4gIH1cblxuICAvKiogUGF5bG9hZCB0ZXh0IGFyZWEgdmFsdWUgZm9yIEJvZHkvUGFyYW1zL0F1dGhvcml6YXRpb24gKi9cbiAgcGF5bG9hZFRleHQgPSAnJztcblxuICAvKiogSlNPTiBwYXJzZSBlcnJvciB3aGVuIGZvcm1hdCBpcyBKU09OIGFuZCBwYXlsb2FkIGlzIGludmFsaWQ7IG51bGwgd2hlbiB2YWxpZCBvciBub3QgSlNPTi4gKi9cbiAgcGF5bG9hZEpzb25FcnJvcjoge1xuICAgIGxpbmU6IG51bWJlcjtcbiAgICBjb2x1bW46IG51bWJlcjtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgZXhjZXJwdDogc3RyaW5nO1xuICAgIGNhcmV0T2Zmc2V0OiBudW1iZXI7XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICAvKiogTGluZSBudW1iZXJzIGZvciBwYXlsb2FkIHRleHRhcmVhICgxLCAyLCAzLCAuLi4pIGJhc2VkIG9uIGN1cnJlbnQgbGluZSBjb3VudC4gKi9cbiAgZ2V0IHBheWxvYWRMaW5lTnVtYmVycygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgbiA9IE1hdGgubWF4KDEsICh0aGlzLnBheWxvYWRUZXh0IHx8ICcnKS5zcGxpdCgvXFxyP1xcbi8pLmxlbmd0aCk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IG4gfSwgKF8sIGkpID0+IGkgKyAxKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGN1cnJlbnQgcGF5bG9hZCBmb3JtYXQgaXMgSlNPTiAoc28gd2UgdmFsaWRhdGUgYW5kIHNob3cgSlNPTiBlZGl0b3IgYmVoYXZpb3IpLiAqL1xuICBnZXQgaXNQYXlsb2FkRm9ybWF0SnNvbigpOiBib29sZWFuIHtcbiAgICBjb25zdCBmb3JtYXQgPSB0aGlzLnBheWxvYWRGb3JtYXRGb3JtPy5nZXQoJ2Zvcm1hdCcpPy52YWx1ZTtcbiAgICByZXR1cm4gZm9ybWF0ID09PSAnanNvbic7XG4gIH1cblxuICAvKiogRXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBwYXlsb2FkIHRleHRhcmVhIChyZWQgYm9yZGVyICsgYm90dG9tIGxpbmUpLiAqL1xuICBnZXQgcGF5bG9hZEpzb25FcnJvcnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnBheWxvYWRKc29uRXJyb3IgPyBbJ0ludmFsaWQgSlNPTiBmb3JtYXQuIFBsZWFzZSBjaGVjayB5b3VyIHN5bnRheC4nXSA6IFtdO1xuICB9XG5cbiAgLyoqIFRvb2x0aXAgY29udGVudCBmb3IgdGhlIGxpbmUtbGV2ZWwgZXJyb3IgaWNvbiAocGFyc2UgZXJyb3Igb24gbGluZSBYLCBleGNlcnB0LCBjYXJldCwgbWVzc2FnZSkuICovXG4gIGdldCBwYXlsb2FkSnNvbkVycm9yVG9vbHRpcCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5wYXlsb2FkSnNvbkVycm9yKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZSA9IHRoaXMucGF5bG9hZEpzb25FcnJvcjtcbiAgICBjb25zdCBjYXJldCA9ICcgJy5yZXBlYXQoZS5jYXJldE9mZnNldCkgKyAnXic7XG4gICAgcmV0dXJuIGBQYXJzZSBlcnJvciBvbiBsaW5lICR7ZS5saW5lfTpcXG5cXG4ke2UuZXhjZXJwdH1cXG4ke2NhcmV0fVxcblxcbiR7ZS5tZXNzYWdlfWA7XG4gIH1cblxuICBvblBheWxvYWRUZXh0Q2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnBheWxvYWRUZXh0ID0gdmFsdWU7XG4gICAgdGhpcy52YWxpZGF0ZVBheWxvYWRKc29uKCk7XG4gIH1cblxuICBvblBheWxvYWRJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudCB8IG51bGw7XG4gICAgdGhpcy5vblBheWxvYWRUZXh0Q2hhbmdlKHRhcmdldD8udmFsdWUgPz8gJycpO1xuICB9XG5cbiAgb25QYXlsb2FkS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1BheWxvYWRGb3JtYXRKc29uKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gZXZlbnQua2V5O1xuICAgIGNvbnN0IGNsb3NlID0gUEFZTE9BRF9BVVRPX0NMT1NFX1BBSVJTW2tleV07XG4gICAgaWYgKCFjbG9zZSkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3Qgc3RhcnQgPSB0YXJnZXQuc2VsZWN0aW9uU3RhcnQgPz8gMDtcbiAgICBjb25zdCBlbmQgPSB0YXJnZXQuc2VsZWN0aW9uRW5kID8/IHN0YXJ0O1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMucGF5bG9hZFRleHQuc2xpY2UoMCwgc3RhcnQpO1xuICAgIGNvbnN0IGFmdGVyID0gdGhpcy5wYXlsb2FkVGV4dC5zbGljZShlbmQpO1xuICAgIGNvbnN0IGluc2VydFBvcyA9IHN0YXJ0ICsgMTtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IGJlZm9yZSArIGtleSArIGNsb3NlICsgYWZ0ZXI7XG4gICAgdGhpcy5wYXlsb2FkVGV4dCA9IG5ld1ZhbHVlO1xuICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5wYXlsb2FkVGV4dGFyZWFSZWY/Lm5hdGl2ZUVsZW1lbnQ/LnNldFNlbGVjdGlvblJhbmdlKGluc2VydFBvcywgaW5zZXJ0UG9zKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZSBwYXlsb2FkIHdoZW4gZm9ybWF0IGlzIEpTT047IHNldHMgcGF5bG9hZEpzb25FcnJvciBvciBjbGVhcnMgaXQuICovXG4gIHZhbGlkYXRlUGF5bG9hZEpzb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUGF5bG9hZEZvcm1hdEpzb24pIHtcbiAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRleHQgPSB0aGlzLnBheWxvYWRUZXh0ID8/ICcnO1xuICAgIGlmICh0ZXh0LnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBKU09OLnBhcnNlKHRleHQpO1xuICAgICAgdGhpcy5wYXlsb2FkSnNvbkVycm9yID0gbnVsbDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZXh0cmFjdFBvc2l0aW9uRnJvbUpzb25FcnJvcihtZXNzYWdlKTtcbiAgICAgIGNvbnN0IHsgbGluZSwgY29sdW1uIH0gPSB0aGlzLnBvc2l0aW9uVG9MaW5lQ29sdW1uKHRleHQsIHBvc2l0aW9uKTtcbiAgICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgvXFxyP1xcbi8pO1xuICAgICAgY29uc3QgbGluZUluZGV4ID0gTWF0aC5tYXgoMCwgbGluZSAtIDEpO1xuICAgICAgY29uc3QgbGluZUNvbnRlbnQgPSBsaW5lc1tsaW5lSW5kZXhdID8/ICcnO1xuICAgICAgY29uc3QgZXhjZXJwdCA9IGxpbmVDb250ZW50IHx8ICcgJztcbiAgICAgIGNvbnN0IGNhcmV0T2Zmc2V0ID0gbGluZUluZGV4ID09PSBsaW5lIC0gMSA/IE1hdGgubWluKGNvbHVtbiAtIDEsIGxpbmVDb250ZW50Lmxlbmd0aCkgOiAwO1xuICAgICAgdGhpcy5wYXlsb2FkSnNvbkVycm9yID0ge1xuICAgICAgICBsaW5lLFxuICAgICAgICBjb2x1bW4sXG4gICAgICAgIG1lc3NhZ2U6IHRoaXMubm9ybWFsaXplSnNvbkVycm9yTWVzc2FnZShtZXNzYWdlKSxcbiAgICAgICAgZXhjZXJwdCxcbiAgICAgICAgY2FyZXRPZmZzZXQsXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFBvc2l0aW9uRnJvbUpzb25FcnJvcihtZXNzYWdlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IG1hdGNoID0gbWVzc2FnZS5tYXRjaCgvcG9zaXRpb25cXHMrKFxcZCspL2kpIHx8IG1lc3NhZ2UubWF0Y2goL2F0XFxzK3Bvc2l0aW9uXFxzKyhcXGQrKS9pKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBwYXJzZUludChtYXRjaFsxXSwgMTApIDogMDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ub0xpbmVDb2x1bW4odGV4dDogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKTogeyBsaW5lOiBudW1iZXI7IGNvbHVtbjogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGJlZm9yZSA9IHRleHQuc2xpY2UoMCwgTWF0aC5taW4ocG9zaXRpb24sIHRleHQubGVuZ3RoKSk7XG4gICAgY29uc3QgbGluZXMgPSBiZWZvcmUuc3BsaXQoL1xccj9cXG4vKTtcbiAgICBjb25zdCBsaW5lID0gbGluZXMubGVuZ3RoO1xuICAgIGNvbnN0IGxhc3RMaW5lID0gbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPz8gJyc7XG4gICAgcmV0dXJuIHsgbGluZSwgY29sdW1uOiBsYXN0TGluZS5sZW5ndGggKyAxIH07XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUpzb25FcnJvck1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAobWVzc2FnZS5pbmNsdWRlcygnRXhwZWN0aW5nJykgfHwgbWVzc2FnZS5pbmNsdWRlcygnZXhwZWN0aW5nJykpIHJldHVybiBtZXNzYWdlO1xuICAgIGNvbnN0IHRva2VuTWF0Y2ggPSBtZXNzYWdlLm1hdGNoKC9VbmV4cGVjdGVkIHRva2VuXFxzK1snXCJdPyhbXidcIl0rKVsnXCJdPy9pKVxuICAgICAgfHwgbWVzc2FnZS5tYXRjaCgvdW5leHBlY3RlZCBjaGFyYWN0ZXIuKj8oW15cXHNdKykvaSk7XG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbk1hdGNoID8gdG9rZW5NYXRjaFsxXS50cmltKCkgOiAndW5kZWZpbmVkJztcbiAgICByZXR1cm4gYEV4cGVjdGluZyAnU1RSSU5HJywgJ05VTUJFUicsICdOVUxMJywgJ1RSVUUnLCAnRkFMU0UnLCAneycsICdbJywgZ290ICcke3Rva2VufSdgO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgncGF5bG9hZEVkaXRvcldpdGhMaW5lc1JlZicpIHBheWxvYWRFZGl0b3JXaXRoTGluZXNSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgncGF5bG9hZFRleHRhcmVhUmVmJykgcGF5bG9hZFRleHRhcmVhUmVmPzogRWxlbWVudFJlZjxIVE1MVGV4dEFyZWFFbGVtZW50PjtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0hFQURFUl9OQU1FX09QVElPTlM6IHN0cmluZ1tdID0gW1xuICAgICdBY2NlcHQnLFxuICAgICdBY2NlcHQtQ2hhcnNldCcsXG4gICAgJ0FjY2VwdC1FbmNvZGluZycsXG4gICAgJ0FjY2VwdC1MYW5ndWFnZScsXG4gICAgJ0FjY2Vzcy1Db250cm9sLVJlcXVlc3QtSGVhZGVycycsXG4gICAgJ0FjY2Vzcy1Db250cm9sLVJlcXVlc3QtTWV0aG9kJyxcbiAgICAnU2NyaXB0cycsXG4gICAgJ0NhY2hlLUNvbnRyb2wnLFxuICAgICdDb250ZW50LU1ENScsXG4gICAgJ0NvbnRlbnQtTGVuZ3RoJyxcbiAgICAnQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZycsXG4gICAgJ0NvbnRlbnQtVHlwZScsXG4gICAgJ0Nvb2tpZScsXG4gICAgJ0RhdGUnLFxuICAgICdFeHBlY3QnLFxuICAgICdGcm9tJyxcbiAgICAnSG9zdCcsXG4gICAgJ0lmLU1hdGNoJyxcbiAgICAnSWYtTW9kaWZpZWQtU2luY2UnLFxuICAgICdJZi1Ob25lLU1hdGNoJyxcbiAgICAnSWYtVW5tb2RpZmllZC1TaW5jZScsXG4gICAgJ0lmLVJhbmdlJyxcbiAgICAnS2VlcC1BbGl2ZScsXG4gICAgJ01heC1Gb3J3YXJkcycsXG4gICAgJ09yaWdpbicsXG4gICAgJ1ByYWdtYScsXG4gICAgJ1Byb3h5LUF1dGhvcml6YXRpb24nLFxuICAgICdSYW5nZScsXG4gICAgJ1JlZmVyZXInLFxuICAgICdURScsXG4gICAgJ1RyYWlsZXInLFxuICAgICdUcmFuc2Zlci1FbmNvZGluZycsXG4gICAgJ1VwZ3JhZGUnLFxuICAgICdVc2VyLUFnZW50JyxcbiAgICAnVmlhJyxcbiAgICAnV2FybmluZycsXG4gICAgJ1gtUmVxdWVzdGVkLVdpdGgnLFxuICAgICdYLURvLU5vdC1UcmFjaycsXG4gICAgJ0ROVCcsXG4gICAgJ3gtYXBpLWtleScsXG4gICAgJ0Nvbm5lY3Rpb24nLFxuICBdO1xuXG4gIC8qKiBIZWFkZXIgbmFtZSBvcHRpb25zOiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgd2l0aCBpZCwgbmFtZSwgdmFsdWUsIGxhYmVsIChwYXNzZWQgZnJvbSBwYXJlbnQpLiBGYWxscyBiYWNrIHRvIGJ1aWx0LWluIGxpc3Qgd2hlbiBlbXB0eS4gKi9cbiAgQElucHV0KCkgaGVhZGVyTmFtZU9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIC8qKiBGb3JtIGFycmF5IGZvciBoZWFkZXIgcm93czsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IG5hbWUsIHZhbHVlIH0pIGZvciBjcWEtZHluYW1pYy1zZWxlY3QgYW5kIHZhbHVlIGlucHV0ICovXG4gIGhlYWRlcnNGb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgLyoqIFR5cGVkIGFjY2Vzc29yIGZvciB0ZW1wbGF0ZSAoRm9ybUFycmF5LmNvbnRyb2xzIGlzIEFic3RyYWN0Q29udHJvbFtdKSAqL1xuICBnZXQgaGVhZGVyUm93cygpOiBGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuICh0aGlzLmhlYWRlcnNGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBDb25maWcgZm9yIGhlYWRlciBuYW1lIGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gaGVhZGVyTmFtZU9wdGlvbnMgY2hhbmdlcyB0byBhdm9pZCBuZXcgcmVmZXJlbmNlIGV2ZXJ5IENEKSAqL1xuICBoZWFkZXJOYW1lU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnbmFtZScsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgaGVhZGVyJyxcbiAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgIGFsbG93Q3VzdG9tVmFsdWU6IHRydWUsXG4gICAgb3B0aW9uczogW10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IHNvdXJjZSA9XG4gICAgICB0aGlzLmhlYWRlck5hbWVPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5oZWFkZXJOYW1lT3B0aW9uc1xuICAgICAgICA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0hFQURFUl9OQU1FX09QVElPTlMgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdKTtcbiAgICBjb25zdCBiYXNlT3B0aW9ucyA9IHNvdXJjZS5tYXAoKGgpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LnRvU2VsZWN0T3B0aW9uKGgpKTtcbiAgICBjb25zdCBiYXNlVmFsdWVzID0gbmV3IFNldChiYXNlT3B0aW9ucy5tYXAoKG8pID0+IFN0cmluZyhvLnZhbHVlID8/IG8uaWQgPz8gJycpLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pKTtcbiAgICBjb25zdCBjdXJyZW50TmFtZXNGcm9tRm9ybSA9IHRoaXMuZ2V0Q3VycmVudEhlYWRlck5hbWVzRnJvbUZvcm0oKTtcbiAgICBjb25zdCBleHRyYU9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gW107XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIGN1cnJlbnROYW1lc0Zyb21Gb3JtKSB7XG4gICAgICBjb25zdCBrZXkgPSBuYW1lLnRyaW0oKTtcbiAgICAgIGlmIChrZXkgJiYgIWJhc2VWYWx1ZXMuaGFzKGtleSkpIHtcbiAgICAgICAgYmFzZVZhbHVlcy5hZGQoa2V5KTtcbiAgICAgICAgZXh0cmFPcHRpb25zLnB1c2goeyBpZDoga2V5LCB2YWx1ZToga2V5LCBuYW1lOiBrZXksIGxhYmVsOiBrZXkgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnMgPSBbLi4uYmFzZU9wdGlvbnMsIC4uLmV4dHJhT3B0aW9uc107XG4gICAgdGhpcy5oZWFkZXJOYW1lU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5oZWFkZXJOYW1lU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIENvbGxlY3RzIGRpc3RpbmN0IG5vbi1lbXB0eSBoZWFkZXIgbmFtZXMgY3VycmVudGx5IGluIHRoZSBoZWFkZXJzIGZvcm0gKGZvciBkeW5hbWljIG9wdGlvbnMpLiAqL1xuICBwcml2YXRlIGdldEN1cnJlbnRIZWFkZXJOYW1lc0Zyb21Gb3JtKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBuYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgaWYgKCF0aGlzLmhlYWRlcnNGb3JtQXJyYXk/LmNvbnRyb2xzPy5sZW5ndGgpIHJldHVybiBuYW1lcztcbiAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5oZWFkZXJzRm9ybUFycmF5LmNvbnRyb2xzKSB7XG4gICAgICBjb25zdCBuYW1lID0gKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5nZXQoJ25hbWUnKT8udmFsdWU7XG4gICAgICBjb25zdCBzdHIgPSBuYW1lICE9IG51bGwgPyBTdHJpbmcobmFtZSkudHJpbSgpIDogJyc7XG4gICAgICBpZiAoc3RyICYmICFzZWVuLmhhcyhzdHIpKSB7XG4gICAgICAgIHNlZW4uYWRkKHN0cik7XG4gICAgICAgIG5hbWVzLnB1c2goc3RyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5hbWVzO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0SGVhZGVyczogQXBpRWRpdEhlYWRlclJvd1tdID0gW1xuICAgIHsgbmFtZTogJ0NvbnRlbnQtVHlwZScsIHR5cGU6ICdzdHJpbmcnLCB2YWx1ZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gIF07XG5cbiAgLyoqIEZvcm0gYXJyYXkgZm9yIGtleS12YWx1ZSByb3dzIChCb2R5IHBheWxvYWQpOyBlYWNoIGl0ZW0gaXMgRm9ybUdyb3VwKHsga2V5LCB2YWx1ZSB9KSAqL1xuICBrZXlWYWx1ZUZvcm1BcnJheSE6IEZvcm1BcnJheTtcblxuICBnZXQga2V5VmFsdWVSb3dzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMua2V5VmFsdWVGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBGb3JtIGFycmF5IGZvciBrZXktdHlwZS12YWx1ZSByb3dzOyBlYWNoIGl0ZW0gaXMgRm9ybUdyb3VwKHsga2V5LCB0eXBlLCB2YWx1ZSB9KSAqL1xuICBrZXlUeXBlVmFsdWVGb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgZ2V0IGtleVR5cGVWYWx1ZVJvd3MoKTogRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy5rZXlUeXBlVmFsdWVGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBGb3JtIGFycmF5IGZvciBQYXJhbXMgdGFiIGtleS12YWx1ZSByb3dzOyBlYWNoIGl0ZW0gaXMgRm9ybUdyb3VwKHsga2V5LCB2YWx1ZSB9KSAqL1xuICBwYXJhbXNGb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgZ2V0IHBhcmFtc1Jvd3MoKTogRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy5wYXJhbXNGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBDb25maWcgZm9yIFR5cGUgZHJvcGRvd24gaW4ga2V5LXR5cGUtdmFsdWUgcm93cyAoVGV4dCwgRmlsZSkgKi9cbiAgcmVhZG9ubHkga2V5VHlwZVZhbHVlVHlwZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3R5cGUnLFxuICAgIHBsYWNlaG9sZGVyOiAnVGV4dCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyBpZDogJ3RleHQnLCB2YWx1ZTogJ3RleHQnLCBuYW1lOiAnVGV4dCcsIGxhYmVsOiAnVGV4dCcgfSxcbiAgICAgIHsgaWQ6ICdmaWxlJywgdmFsdWU6ICdmaWxlJywgbmFtZTogJ0ZpbGUnLCBsYWJlbDogJ0ZpbGUnIH0sXG4gICAgXSxcbiAgfTtcblxuICAvKiogRm9ybSBhcnJheSBmb3IgcmVzcG9uc2UgYm9keSB2ZXJpZmljYXRpb24gcm93czsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IGpzb25QYXRoLCB2ZXJpZmljYXRpb24sIGRhdGFUeXBlLCBleHBlY3RlZFZhbHVlIH0pICovXG4gIHZlcmlmaWNhdGlvbkZvcm1BcnJheSE6IEZvcm1BcnJheTtcblxuICBnZXQgdmVyaWZpY2F0aW9uUm93cygpOiBGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuICh0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheT8uY29udHJvbHMgPz8gW10pIGFzIEZvcm1Hcm91cFtdO1xuICB9XG5cbiAgLyoqIFZlcmlmaWNhdGlvbiBvcHRpb25zOiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgKHBhc3NlZCBmcm9tIHBhcmVudCkuIEZhbGxzIGJhY2sgdG8gYnVpbHQtaW4gbGlzdCB3aGVuIGVtcHR5LiAqL1xuICBASW5wdXQoKSB2ZXJpZmljYXRpb25PcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1ZFUklGSUNBVElPTl9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAnZXF1YWxzJywgdmFsdWU6ICdlcXVhbHMnLCBuYW1lOiAnRXF1YWxzJywgbGFiZWw6ICdFcXVhbHMnIH0sXG4gICAgeyBpZDogJ25vdC1lcXVhbCcsIHZhbHVlOiAnbm90LWVxdWFsJywgbmFtZTogJ05vdCBlcXVhbCcsIGxhYmVsOiAnTm90IGVxdWFsJyB9LFxuICAgIHsgaWQ6ICdsZXNzLXRoYW4nLCB2YWx1ZTogJ2xlc3MtdGhhbicsIG5hbWU6ICdMZXNzIHRoYW4nLCBsYWJlbDogJ0xlc3MgdGhhbicgfSxcbiAgICB7IGlkOiAnZ3JlYXRlci10aGFuJywgdmFsdWU6ICdncmVhdGVyLXRoYW4nLCBuYW1lOiAnR3JlYXRlciB0aGFuJywgbGFiZWw6ICdHcmVhdGVyIHRoYW4nIH0sXG4gICAgeyBpZDogJ2lzLW51bGwnLCB2YWx1ZTogJ2lzLW51bGwnLCBuYW1lOiAnSXMgbnVsbCcsIGxhYmVsOiAnSXMgbnVsbCcgfSxcbiAgICB7IGlkOiAnaXMtbm90LW51bGwnLCB2YWx1ZTogJ2lzLW5vdC1udWxsJywgbmFtZTogJ0lzIG5vdCBudWxsJywgbGFiZWw6ICdJcyBub3QgbnVsbCcgfSxcbiAgXTtcblxuICAvKiogQ29uZmlnIGZvciBWZXJpZmljYXRpb24gZHJvcGRvd24gKHVwZGF0ZWQgd2hlbiB2ZXJpZmljYXRpb25PcHRpb25zIGNoYW5nZXMsIGxpa2UgTWV0aG9kIGRyb3Bkb3duKSAqL1xuICB2ZXJpZmljYXRpb25TZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd2ZXJpZmljYXRpb24nLFxuICAgIHBsYWNlaG9sZGVyOiAnRXF1YWxzJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9WRVJJRklDQVRJT05fT1BUSU9OU10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9XG4gICAgICB0aGlzLnZlcmlmaWNhdGlvbk9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnZlcmlmaWNhdGlvbk9wdGlvbnMubWFwKCh2KSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbih2KSlcbiAgICAgICAgOiBBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX1ZFUklGSUNBVElPTl9PUFRJT05TO1xuICAgIHRoaXMudmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy52ZXJpZmljYXRpb25TZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldFZlcmlmaWNhdGlvblZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMudmVyaWZpY2F0aW9uT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMudmVyaWZpY2F0aW9uT3B0aW9uc1xuICAgICAgICA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX1ZFUklGSUNBVElPTl9PUFRJT05TIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSk7XG4gICAgcmV0dXJuIHNvdXJjZVxuICAgICAgLm1hcCgodikgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSlcbiAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB2ICE9IG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0VmVyaWZpY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWZXJpZmljYXRpb25WYWx1ZXMoKTtcbiAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA+IDAgPyB2YWx1ZXNbMF0gOiAnZXF1YWxzJztcbiAgfVxuXG4gIC8qKiBEYXRhIFR5cGUgb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIChwYXNzZWQgZnJvbSBwYXJlbnQpLiBGYWxscyBiYWNrIHRvIGJ1aWx0LWluIGxpc3Qgd2hlbiBlbXB0eS4gKi9cbiAgQElucHV0KCkgdmVyaWZpY2F0aW9uRGF0YVR5cGVPcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0RBVEFfVFlQRV9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAnc3RyaW5nJywgdmFsdWU6ICdzdHJpbmcnLCBuYW1lOiAnU3RyaW5nJywgbGFiZWw6ICdTdHJpbmcnIH0sXG4gICAgeyBpZDogJ251bWJlcicsIHZhbHVlOiAnbnVtYmVyJywgbmFtZTogJ051bWJlcicsIGxhYmVsOiAnTnVtYmVyJyB9LFxuICAgIHsgaWQ6ICdib29sZWFuJywgdmFsdWU6ICdib29sZWFuJywgbmFtZTogJ0Jvb2xlYW4nLCBsYWJlbDogJ0Jvb2xlYW4nIH0sXG4gICAgeyBpZDogJ2FycmF5JywgdmFsdWU6ICdhcnJheScsIG5hbWU6ICdBcnJheScsIGxhYmVsOiAnQXJyYXknIH0sXG4gICAgeyBpZDogJ29iamVjdCcsIHZhbHVlOiAnb2JqZWN0JywgbmFtZTogJ09iamVjdCcsIGxhYmVsOiAnT2JqZWN0JyB9LFxuICBdO1xuXG4gIC8qKiBDb25maWcgZm9yIERhdGEgVHlwZSBkcm9wZG93biAodXBkYXRlZCB3aGVuIHZlcmlmaWNhdGlvbkRhdGFUeXBlT3B0aW9ucyBjaGFuZ2VzLCBsaWtlIE1ldGhvZCBkcm9wZG93bikgKi9cbiAgdmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdkYXRhVHlwZScsXG4gICAgcGxhY2Vob2xkZXI6ICdTdHJpbmcnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFsuLi5BcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0RBVEFfVFlQRV9PUFRJT05TXSxcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZVZlcmlmaWNhdGlvbkRhdGFUeXBlU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPVxuICAgICAgdGhpcy52ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnZlcmlmaWNhdGlvbkRhdGFUeXBlT3B0aW9ucy5tYXAoKGQpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LnRvU2VsZWN0T3B0aW9uKGQpKVxuICAgICAgICA6IEFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfREFUQV9UWVBFX09QVElPTlM7XG4gICAgdGhpcy52ZXJpZmljYXRpb25EYXRhVHlwZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMudmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldERhdGFUeXBlVmFsdWVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzb3VyY2UgPVxuICAgICAgdGhpcy52ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnZlcmlmaWNhdGlvbkRhdGFUeXBlT3B0aW9uc1xuICAgICAgICA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0RBVEFfVFlQRV9PUFRJT05TIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSk7XG4gICAgcmV0dXJuIHNvdXJjZVxuICAgICAgLm1hcCgoZCkgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZCBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSlcbiAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB2ICE9IG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0RGF0YVR5cGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldERhdGFUeXBlVmFsdWVzKCk7XG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPiAwID8gdmFsdWVzWzBdIDogJ3N0cmluZyc7XG4gIH1cblxuICAvKiogQ29uZmlnIGZvciBFeHBlY3RlZCBWYWx1ZSB3aGVuIERhdGEgVHlwZSBpcyBCb29sZWFuICh0cnVlL2ZhbHNlIGRyb3Bkb3duKSAqL1xuICByZWFkb25seSB2ZXJpZmljYXRpb25FeHBlY3RlZFZhbHVlQm9vbGVhblNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2V4cGVjdGVkVmFsdWUnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IGlkOiAndHJ1ZScsIHZhbHVlOiAndHJ1ZScsIG5hbWU6ICd0cnVlJywgbGFiZWw6ICd0cnVlJyB9LFxuICAgICAgeyBpZDogJ2ZhbHNlJywgdmFsdWU6ICdmYWxzZScsIG5hbWU6ICdmYWxzZScsIGxhYmVsOiAnZmFsc2UnIH0sXG4gICAgXSxcbiAgfTtcblxuICAvKiogRm9ybSBhcnJheSBmb3IgU3RhdHVzIHRhYiB2ZXJpZmljYXRpb24gcm93czsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IHZlcmlmaWNhdGlvbiwgZXhwZWN0ZWRWYWx1ZSB9KSAqL1xuICBzdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgZ2V0IHN0YXR1c1ZlcmlmaWNhdGlvblJvd3MoKTogRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBDb25maWcgZm9yIFN0YXR1cyB0YWIgVmVyaWZpY2F0aW9uIGRyb3Bkb3duIChFcXVhbHMsIE5vdCBlcXVhbCwgTGVzcyB0aGFuLCBHcmVhdGVyIHRoYW4pICovXG4gIC8qKiBTdGF0dXMgdGFiIFZlcmlmaWNhdGlvbiBvcHRpb25zIChFcXVhbHMsIE5vdCBlcXVhbCwgZXRjLikuIEZhbGxzIGJhY2sgdG8gYnVpbHQtaW4gbGlzdCB3aGVuIGVtcHR5LiAqL1xuICBASW5wdXQoKSBzdGF0dXNWZXJpZmljYXRpb25PcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1NUQVRVU19WRVJJRklDQVRJT05fT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ2VxdWFscycsIHZhbHVlOiAnZXF1YWxzJywgbmFtZTogJ0VxdWFscycsIGxhYmVsOiAnRXF1YWxzJyB9LFxuICAgIHsgaWQ6ICdub3QtZXF1YWwnLCB2YWx1ZTogJ25vdC1lcXVhbCcsIG5hbWU6ICdOb3QgZXF1YWwnLCBsYWJlbDogJ05vdCBlcXVhbCcgfSxcbiAgICB7IGlkOiAnbGVzcy10aGFuJywgdmFsdWU6ICdsZXNzLXRoYW4nLCBuYW1lOiAnTGVzcyB0aGFuJywgbGFiZWw6ICdMZXNzIHRoYW4nIH0sXG4gICAgeyBpZDogJ2dyZWF0ZXItdGhhbicsIHZhbHVlOiAnZ3JlYXRlci10aGFuJywgbmFtZTogJ0dyZWF0ZXIgdGhhbicsIGxhYmVsOiAnR3JlYXRlciB0aGFuJyB9LFxuICBdO1xuXG4gIC8qKiBDb25maWcgZm9yIFN0YXR1cyB0YWIgVmVyaWZpY2F0aW9uIGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9ucyBjaGFuZ2VzKS4gKi9cbiAgc3RhdHVzVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndmVyaWZpY2F0aW9uJyxcbiAgICBwbGFjZWhvbGRlcjogJ0VxdWFscycsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogWy4uLkFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfU1RBVFVTX1ZFUklGSUNBVElPTl9PUFRJT05TXSxcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZVN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID1cbiAgICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9ucy5tYXAoKG8pID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LnRvU2VsZWN0T3B0aW9uKG8pKVxuICAgICAgICA6IEFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfU1RBVFVTX1ZFUklGSUNBVElPTl9PUFRJT05TO1xuICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5zdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXR1c1ZlcmlmaWNhdGlvblZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9uc1xuICAgICAgICA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX1NUQVRVU19WRVJJRklDQVRJT05fT1BUSU9OUyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0W10pO1xuICAgIHJldHVybiBzb3VyY2VcbiAgICAgIC5tYXAoKG8pID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKG8gYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFN0YXR1c1ZlcmlmaWNhdGlvbigpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0U3RhdHVzVmVyaWZpY2F0aW9uVmFsdWVzKCk7XG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPiAwID8gdmFsdWVzWzBdIDogJ2VxdWFscyc7XG4gIH1cblxuICByZXNwb25zZVByZXZpZXcgPSBgYDtcblxuICBwcml2YXRlIG1ldGhvZENoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgZm9ybWF0Q2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBoZWFkZXJOYW1lT3B0aW9uc0NoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgZW52aXJvbm1lbnRGb3JtQ2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBtZXRob2RGb3JtQ2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBwYXJhbXNGb3JtQXJyYXlDaGFuZ2VzU3ViPzogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYXBwbHlJbml0aWFsU3RlcCh0aGlzLmluaXRpYWxTdGVwKTtcbiAgICB0aGlzLnVwZGF0ZU1ldGhvZFNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIGNvbnN0IGZpcnN0TWV0aG9kVmFsdWUgPSB0aGlzLmh0dHBNZXRob2RPcHRpb25zPy5sZW5ndGhcbiAgICAgID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5odHRwTWV0aG9kT3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlZmF1bHRNZXRob2QgPSB0aGlzLmluaXRpYWxNZXRob2QgPz8gZmlyc3RNZXRob2RWYWx1ZSA/PyAnR0VUJztcbiAgICB0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSA9IHR5cGVvZiBkZWZhdWx0TWV0aG9kID09PSAnc3RyaW5nJyA/IGRlZmF1bHRNZXRob2QgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdE1ldGhvZCBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgdGhpcy5tZXRob2RGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBtZXRob2Q6IFtkZWZhdWx0TWV0aG9kXSxcbiAgICB9KTtcbiAgICBjb25zdCBmaXJzdFZhbHVlID0gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmVudmlyb25tZW50T3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlZmF1bHRFbnYgPSB0aGlzLmluaXRpYWxFbnZpcm9ubWVudCA/PyBmaXJzdFZhbHVlID8/ICdEZXZlbG9wbWVudCc7XG4gICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9IHR5cGVvZiBkZWZhdWx0RW52ID09PSAnc3RyaW5nJyA/IGRlZmF1bHRFbnYgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdEVudiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgdGhpcy5lbnZpcm9ubWVudEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGVudmlyb25tZW50OiBbZGVmYXVsdEVudl0sXG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVBdXRoVHlwZVNlbGVjdENvbmZpZygpO1xuICAgIGNvbnN0IGZpcnN0QXV0aFZhbHVlID0gdGhpcy5nZXRBdXRoVHlwZVZhbHVlcygpWzBdO1xuICAgIGNvbnN0IGRlZmF1bHRBdXRoVHlwZSA9IHRoaXMuaW5pdGlhbEF1dGhUeXBlID8/IGZpcnN0QXV0aFZhbHVlID8/ICduby1hdXRoJztcbiAgICB0aGlzLmF1dGhUeXBlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgYXV0aFR5cGU6IFtkZWZhdWx0QXV0aFR5cGVdLFxuICAgIH0pO1xuICAgIHRoaXMub2F1dGgyRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZ3JhbnRUeXBlOiBbJ2NsaWVudF9jcmVkZW50aWFscyddLFxuICAgICAgYWNjZXNzVG9rZW5Vcmw6IFsnJ10sXG4gICAgICBjbGllbnRJZDogWycnXSxcbiAgICAgIGNsaWVudFNlY3JldDogWycnXSxcbiAgICAgIHNjb3BlOiBbJyddLFxuICAgICAgY2xpZW50QXV0aGVudGljYXRpb246IFsnYmFzaWMnXSxcbiAgICB9KTtcbiAgICB0aGlzLmVudmlyb25tZW50Rm9ybUNoYW5nZXNTdWIgPSB0aGlzLmVudmlyb25tZW50Rm9ybS5nZXQoJ2Vudmlyb25tZW50Jyk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCh2OiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBzID0gdiAhPSBudWxsICYmIHYgIT09ICcnID8gKHR5cGVvZiB2ID09PSAnb2JqZWN0JyA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgOiBTdHJpbmcodikpIDogJyc7XG4gICAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID0gcyA/PyAnJztcbiAgICB9KTtcbiAgICB0aGlzLm1ldGhvZEZvcm1DaGFuZ2VzU3ViID0gdGhpcy5tZXRob2RGb3JtLmdldCgnbWV0aG9kJyk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCh2OiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBzID0gdiAhPSBudWxsICYmIHYgIT09ICcnID8gKHR5cGVvZiB2ID09PSAnb2JqZWN0JyA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgOiBTdHJpbmcodikpIDogJyc7XG4gICAgICB0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSA9IHMgPz8gJyc7XG4gICAgfSk7XG4gICAgdGhpcy5idWlsZEhlYWRlcnNGb3JtQXJyYXkoXG4gICAgICB0aGlzLmluaXRpYWxIZWFkZXJzID8/IFt7IG5hbWU6ICcnLCB0eXBlOiAnc3RyaW5nJywgdmFsdWU6ICcnIH1dXG4gICAgKTtcbiAgICB0aGlzLmhlYWRlck5hbWVPcHRpb25zQ2hhbmdlc1N1YiA9IHRoaXMuaGVhZGVyc0Zvcm1BcnJheT8udmFsdWVDaGFuZ2VzPy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgICB0aGlzLmhlYWRlcnNDaGFuZ2UuZW1pdCh0aGlzLmhlYWRlcnMpO1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMuaGVhZGVyc0NoYW5nZS5lbWl0KHRoaXMuaGVhZGVycyk7XG4gICAgdGhpcy51cGRhdGVFbnZpcm9ubWVudFNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMudXBkYXRlUGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZygpO1xuICAgIGNvbnN0IGZpcnN0Rm9ybWF0VmFsdWUgPSB0aGlzLmdldEZvcm1hdFZhbHVlcygpWzBdO1xuICAgIGNvbnN0IGRlZmF1bHRGb3JtYXQgPSB0aGlzLmluaXRpYWxGb3JtYXQgPz8gZmlyc3RGb3JtYXRWYWx1ZSA/PyAnanNvbic7XG4gICAgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoeyBmb3JtYXQ6IFtkZWZhdWx0Rm9ybWF0XSB9KTtcbiAgICB0aGlzLmJ1aWxkS2V5VmFsdWVGb3JtQXJyYXkoKTtcbiAgICB0aGlzLmJ1aWxkS2V5VHlwZVZhbHVlRm9ybUFycmF5KCk7XG4gICAgdGhpcy5idWlsZFBhcmFtc0Zvcm1BcnJheSgpO1xuICAgIHRoaXMucGFyYW1zRm9ybUFycmF5Q2hhbmdlc1N1YiA9IHRoaXMucGFyYW1zRm9ybUFycmF5LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCgpID0+IHRoaXMuc3luY1VybEZyb21QYXJhbXMoKSk7XG4gICAgaWYgKHRoaXMuaW5pdGlhbFVybCAhPSBudWxsICYmIHRoaXMuaW5pdGlhbFVybCAhPT0gJycpIHtcbiAgICAgIHRoaXMuX3VybCA9IHRoaXMuaW5pdGlhbFVybDtcbiAgICAgIHRoaXMuc3luY1BhcmFtc0Zyb21VcmwoKTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6ZSB2YXJpYWJsZU5hbWUgZnJvbSBpbml0aWFsVmFyaWFibGVOYW1lXG4gICAgaWYgKHRoaXMuaW5pdGlhbFZhcmlhYmxlTmFtZSAhPSBudWxsICYmIHRoaXMuaW5pdGlhbFZhcmlhYmxlTmFtZSAhPT0gJycpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lID0gdGhpcy5pbml0aWFsVmFyaWFibGVOYW1lO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVZlcmlmaWNhdGlvblNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMudXBkYXRlVmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLmJ1aWxkVmVyaWZpY2F0aW9uRm9ybUFycmF5KCk7XG4gICAgdGhpcy51cGRhdGVTdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLmJ1aWxkU3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5KCk7XG4gICAgdGhpcy5tZXRob2RDaGFuZ2VzU3ViID0gdGhpcy5tZXRob2RGb3JtLmdldCgnbWV0aG9kJyk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBtZXRob2QgPSB2YWx1ZSAhPSBudWxsID8gU3RyaW5nKHZhbHVlKS50b1VwcGVyQ2FzZSgpIDogJyc7XG4gICAgICBpZiAoTUVUSE9EU19XSVRIT1VUX0JPRFkuaW5jbHVkZXMobWV0aG9kKSAmJiB0aGlzLmFjdGl2ZVBheWxvYWRUYWIgIT09ICdoZWFkZXJzJykge1xuICAgICAgICB0aGlzLmFjdGl2ZVBheWxvYWRUYWIgPSAnaGVhZGVycyc7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmZvcm1hdENoYW5nZXNTdWIgPSB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLmdldCgnZm9ybWF0Jyk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuICAgIH0pO1xuICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0dXBQYXlsb2FkVGV4dGFyZWFTY3JvbGxTeW5jKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm1ldGhvZENoYW5nZXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5mb3JtYXRDaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaGVhZGVyTmFtZU9wdGlvbnNDaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZW52aXJvbm1lbnRGb3JtQ2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm1ldGhvZEZvcm1DaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMucGFyYW1zRm9ybUFycmF5Q2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKiBTeW5jIGxpbmUgbnVtYmVycyBjb2x1bW4gc2Nyb2xsIHdpdGggcGF5bG9hZCB0ZXh0YXJlYSBzY3JvbGwgKFBvc3RtYW4tc3R5bGUpLiAqL1xuICBwcml2YXRlIHNldHVwUGF5bG9hZFRleHRhcmVhU2Nyb2xsU3luYygpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLnBheWxvYWRFZGl0b3JXaXRoTGluZXNSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWhvc3QpIHJldHVybjtcbiAgICAgIGNvbnN0IGxpbmVOdW1iZXJzRWwgPSBob3N0LnF1ZXJ5U2VsZWN0b3IoJy5jcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWxpbmUtbnVtYmVycycpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGNvbnN0IHRleHRhcmVhID0gaG9zdC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpIGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYgKCFsaW5lTnVtYmVyc0VsIHx8ICF0ZXh0YXJlYSkgcmV0dXJuO1xuICAgICAgdGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgICBsaW5lTnVtYmVyc0VsLnNjcm9sbFRvcCA9IHRleHRhcmVhLnNjcm9sbFRvcDtcbiAgICAgIH0pO1xuICAgICAgbGluZU51bWJlcnNFbC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB7XG4gICAgICAgIHRleHRhcmVhLnNjcm9sbFRvcCA9IGxpbmVOdW1iZXJzRWwuc2Nyb2xsVG9wO1xuICAgICAgfSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkS2V5VmFsdWVGb3JtQXJyYXkocm93cz86IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdKTogdm9pZCB7XG4gICAgY29uc3QgaW5pdGlhbCA9IHJvd3MgPz8gW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dO1xuICAgIGNvbnN0IGdyb3VwcyA9IGluaXRpYWwubWFwKChyKSA9PiB0aGlzLmZiLmdyb3VwKHsga2V5OiBbci5rZXldLCB2YWx1ZTogW3IudmFsdWVdIH0pKTtcbiAgICB0aGlzLmtleVZhbHVlRm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShncm91cHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEtleVR5cGVWYWx1ZUZvcm1BcnJheShyb3dzPzogeyBrZXk6IHN0cmluZzsgdHlwZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSk6IHZvaWQge1xuICAgIGNvbnN0IGluaXRpYWwgPSByb3dzID8/IFt7IGtleTogJycsIHR5cGU6ICd0ZXh0JywgdmFsdWU6ICcnIH1dO1xuICAgIGNvbnN0IGdyb3VwcyA9IGluaXRpYWwubWFwKChyKSA9PiB0aGlzLmZiLmdyb3VwKHsga2V5OiBbci5rZXldLCB0eXBlOiBbci50eXBlXSwgdmFsdWU6IFtyLnZhbHVlXSB9KSk7XG4gICAgdGhpcy5rZXlUeXBlVmFsdWVGb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KGdyb3Vwcyk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUGFyYW1zRm9ybUFycmF5KHJvd3M/OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSk6IHZvaWQge1xuICAgIGNvbnN0IGluaXRpYWwgPSByb3dzID8/IFt7IGtleTogJycsIHZhbHVlOiAnJyB9XTtcbiAgICBjb25zdCBncm91cHMgPSBpbml0aWFsLm1hcCgocikgPT4gdGhpcy5mYi5ncm91cCh7IGtleTogW3Iua2V5XSwgdmFsdWU6IFtyLnZhbHVlXSB9KSk7XG4gICAgaWYgKHRoaXMucGFyYW1zRm9ybUFycmF5KSB7XG4gICAgICB0aGlzLnBhcmFtc0Zvcm1BcnJheS5jbGVhcigpO1xuICAgICAgZ3JvdXBzLmZvckVhY2goKGcpID0+IHRoaXMucGFyYW1zRm9ybUFycmF5LnB1c2goZykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcmFtc0Zvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoZ3JvdXBzKTtcbiAgICB9XG4gIH1cblxuICAvKiogUGFyc2UgVVJMIGludG8gYmFzZSAod2l0aG91dCBxdWVyeS9mcmFnbWVudCkgYW5kIHF1ZXJ5IGtleS12YWx1ZSBwYWlycy4gUHJlc2VydmVzIHJlbGF0aXZlIFVSTHMuICovXG4gIHByaXZhdGUgcGFyc2VRdWVyeVBhcmFtc0Zyb21VcmwodXJsU3RyOiBzdHJpbmcpOiB7IGJhc2VVcmw6IHN0cmluZzsgcm93czogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gfSB7XG4gICAgY29uc3QgZW1wdHkgPSB7IGJhc2VVcmw6IHVybFN0ciwgcm93czogW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dIH07XG4gICAgaWYgKCF1cmxTdHIgfHwgIXVybFN0ci50cmltKCkpIHJldHVybiBlbXB0eTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaXNBYnNvbHV0ZSA9IC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QodXJsU3RyLnRyaW0oKSk7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHVybFN0ciwgJ2h0dHA6Ly9sb2NhbGhvc3QnKTtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBpc0Fic29sdXRlID8gdXJsLm9yaWdpbiArIHVybC5wYXRobmFtZSA6IHVybC5wYXRobmFtZTtcbiAgICAgIGNvbnN0IHJvd3M6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdID0gW107XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgcm93cy5wdXNoKHsga2V5LCB2YWx1ZSB9KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByb3dzLnB1c2goeyBrZXk6ICcnLCB2YWx1ZTogJycgfSk7XG4gICAgICByZXR1cm4geyBiYXNlVXJsLCByb3dzIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZW1wdHk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdldCBiYXNlIFVSTCAod2l0aG91dCBxdWVyeS9mcmFnbWVudCkgZm9yIGJ1aWxkaW5nIFVSTCBmcm9tIHBhcmFtcy4gUHJlc2VydmVzIHJlbGF0aXZlIFVSTHMuICovXG4gIHByaXZhdGUgZ2V0QmFzZVVybCh1cmxTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF1cmxTdHIgfHwgIXVybFN0ci50cmltKCkpIHJldHVybiB1cmxTdHI7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlzQWJzb2x1dGUgPSAvXmh0dHBzPzpcXC9cXC8vaS50ZXN0KHVybFN0ci50cmltKCkpO1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh1cmxTdHIsICdodHRwOi8vbG9jYWxob3N0Jyk7XG4gICAgICByZXR1cm4gaXNBYnNvbHV0ZSA/IHVybC5vcmlnaW4gKyB1cmwucGF0aG5hbWUgOiB1cmwucGF0aG5hbWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdXJsU3RyO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBQYXJzZSBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgYm9keSAoa2V5PXZhbHVlJi4uLikgaW50byBrZXktdmFsdWUgcm93cy4gKi9cbiAgcHJpdmF0ZSBwYXJzZUZvcm1VcmxFbmNvZGVkQm9keShib2R5OiBzdHJpbmcpOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IChib2R5ID8/ICcnKS50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkKSByZXR1cm4gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModHJpbW1lZCk7XG4gICAgICBjb25zdCByb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtdO1xuICAgICAgcGFyYW1zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHJvd3MucHVzaCh7IGtleSwgdmFsdWUgfSkpO1xuICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElmIGZvcm0gYm9keSBoYXMgYSBzaW5nbGUga2V5IHdob3NlIHZhbHVlIGlzIFVSTC1kZWNvZGVkIEpTT04sIHJldHVybiBpdCBwcmV0dHktcHJpbnRlZCBmb3IgUmF3IGJvZHkuXG4gICAqIE90aGVyd2lzZSByZXR1cm4gbnVsbCAoY2FsbGVyIGtlZXBzIHgtd3d3LWZvcm0tdXJsZW5jb2RlZCB2aWV3KS5cbiAgICovXG4gIHByaXZhdGUgdHJ5Rm9ybUJvZHlWYWx1ZUFzUmF3SnNvbihyb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmIChyb3dzLmxlbmd0aCAhPT0gMSB8fCAhcm93c1swXS52YWx1ZT8udHJpbSgpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB2YWx1ZSA9IHJvd3NbMF0udmFsdWUudHJpbSgpO1xuICAgIGlmICghKHZhbHVlLnN0YXJ0c1dpdGgoJ3snKSB8fCB2YWx1ZS5zdGFydHNXaXRoKCdbJykpKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCAyKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBVcGRhdGUgUGFyYW1zIHRhYmxlIGZyb20gY3VycmVudCBVUkwgcXVlcnkgc3RyaW5nIChQb3N0bWFuLXN0eWxlKS4gKi9cbiAgcHJpdmF0ZSBzeW5jUGFyYW1zRnJvbVVybCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IGJhc2VVcmw6IF9iLCByb3dzIH0gPSB0aGlzLnBhcnNlUXVlcnlQYXJhbXNGcm9tVXJsKHRoaXMuX3VybCk7XG4gICAgdGhpcy5idWlsZFBhcmFtc0Zvcm1BcnJheShyb3dzKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgVVJMIHF1ZXJ5IHN0cmluZyBmcm9tIFBhcmFtcyB0YWJsZSAoUG9zdG1hbi1zdHlsZSkuICovXG4gIHByaXZhdGUgc3luY1VybEZyb21QYXJhbXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFyYW1zU3luY2luZ0Zyb21VcmwgfHwgIXRoaXMucGFyYW1zRm9ybUFycmF5KSByZXR1cm47XG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMuZ2V0QmFzZVVybCh0aGlzLl91cmwpO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5wYXJhbXNGb3JtQXJyYXkuY29udHJvbHMpIHtcbiAgICAgIGNvbnN0IGtleSA9ICgoYyBhcyBGb3JtR3JvdXApLmdldCgna2V5Jyk/LnZhbHVlID8/ICcnKS50cmltKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJztcbiAgICAgIGlmIChrZXkgIT09ICcnKSBwYXJhbXMuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IHBhcmFtcy50b1N0cmluZygpO1xuICAgIGNvbnN0IG5ld1VybCA9IHF1ZXJ5U3RyaW5nID8gYCR7YmFzZVVybH0/JHtxdWVyeVN0cmluZ31gIDogYmFzZVVybDtcbiAgICBpZiAodGhpcy5fdXJsICE9PSBuZXdVcmwpIHtcbiAgICAgIHRoaXMuX3VybCA9IG5ld1VybDtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRWZXJpZmljYXRpb25Gb3JtQXJyYXkocm93cz86IHsganNvblBhdGg6IHN0cmluZzsgdmVyaWZpY2F0aW9uOiBzdHJpbmc7IGRhdGFUeXBlOiBzdHJpbmc7IGV4cGVjdGVkVmFsdWU6IHN0cmluZyB9W10pOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0VmVyaWZpY2F0aW9uID0gdGhpcy5nZXREZWZhdWx0VmVyaWZpY2F0aW9uKCk7XG4gICAgY29uc3QgZGVmYXVsdERhdGFUeXBlID0gdGhpcy5nZXREZWZhdWx0RGF0YVR5cGUoKTtcbiAgICBjb25zdCBpbml0aWFsID0gcm93cyA/PyBbeyBqc29uUGF0aDogJycsIHZlcmlmaWNhdGlvbjogZGVmYXVsdFZlcmlmaWNhdGlvbiwgZGF0YVR5cGU6IGRlZmF1bHREYXRhVHlwZSwgZXhwZWN0ZWRWYWx1ZTogJycgfV07XG4gICAgY29uc3QgZ3JvdXBzID0gaW5pdGlhbC5tYXAoKHIpID0+XG4gICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAganNvblBhdGg6IFtyLmpzb25QYXRoXSxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiBbci52ZXJpZmljYXRpb25dLFxuICAgICAgICBkYXRhVHlwZTogW3IuZGF0YVR5cGVdLFxuICAgICAgICBleHBlY3RlZFZhbHVlOiBbci5leHBlY3RlZFZhbHVlXSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoZ3JvdXBzKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkocm93cz86IHsgdmVyaWZpY2F0aW9uOiBzdHJpbmc7IGV4cGVjdGVkVmFsdWU6IHN0cmluZyB9W10pOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0VmVyaWZpY2F0aW9uID0gdGhpcy5nZXREZWZhdWx0U3RhdHVzVmVyaWZpY2F0aW9uKCk7XG4gICAgY29uc3QgaW5pdGlhbCA9IHJvd3MgPz8gW3sgdmVyaWZpY2F0aW9uOiBkZWZhdWx0VmVyaWZpY2F0aW9uLCBleHBlY3RlZFZhbHVlOiAnJyB9XTtcbiAgICBjb25zdCBncm91cHMgPSBpbml0aWFsLm1hcCgocikgPT5cbiAgICAgIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICB2ZXJpZmljYXRpb246IFtyLnZlcmlmaWNhdGlvbl0sXG4gICAgICAgIGV4cGVjdGVkVmFsdWU6IFtyLmV4cGVjdGVkVmFsdWVdLFxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShncm91cHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEhlYWRlcnNGb3JtQXJyYXkocm93czogQXBpRWRpdEhlYWRlclJvd1tdKTogdm9pZCB7XG4gICAgY29uc3QgZ3JvdXBzID0gcm93cy5tYXAoKGgpID0+XG4gICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmFtZTogW2gubmFtZV0sXG4gICAgICAgIHZhbHVlOiBbaC52YWx1ZV0sXG4gICAgICB9KVxuICAgICk7XG4gICAgaWYgKHRoaXMuaGVhZGVyc0Zvcm1BcnJheSkge1xuICAgICAgdGhpcy5oZWFkZXJzRm9ybUFycmF5LmNsZWFyKCk7XG4gICAgICBncm91cHMuZm9yRWFjaCgoZykgPT4gdGhpcy5oZWFkZXJzRm9ybUFycmF5LnB1c2goZykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlYWRlcnNGb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KGdyb3Vwcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc2V0IGFsbCB0aHJlZSBzdGVwcyBhbmQgYWxsIGVudGVyZWQgZGF0YSB0byBpbml0aWFsL2RlZmF1bHQgc3RhdGUuIFVzZWQgd2hlbiB1c2VyIGNhbmNlbHMgb24gc3RlcCAxLiAqL1xuICBwcml2YXRlIHJlc2V0QWxsU3RlcHNBbmREYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFN0ZXAgPSAxO1xuXG4gICAgY29uc3QgZmlyc3RNZXRob2RWYWx1ZSA9IHRoaXMuaHR0cE1ldGhvZE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmh0dHBNZXRob2RPcHRpb25zWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVmYXVsdE1ldGhvZCA9IHRoaXMuaW5pdGlhbE1ldGhvZCA/PyBmaXJzdE1ldGhvZFZhbHVlID8/ICdHRVQnO1xuICAgIGNvbnN0IG1ldGhvZFZhbCA9IHR5cGVvZiBkZWZhdWx0TWV0aG9kID09PSAnc3RyaW5nJyA/IGRlZmF1bHRNZXRob2QgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdE1ldGhvZCBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSBtZXRob2RWYWwgPz8gJyc7XG4gICAgaWYgKHRoaXMubWV0aG9kRm9ybSkgdGhpcy5tZXRob2RGb3JtLnBhdGNoVmFsdWUoeyBtZXRob2Q6IGRlZmF1bHRNZXRob2QgfSk7XG5cbiAgICBjb25zdCBmaXJzdEVudlZhbHVlID0gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmVudmlyb25tZW50T3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlZmF1bHRFbnYgPSB0aGlzLmluaXRpYWxFbnZpcm9ubWVudCA/PyBmaXJzdEVudlZhbHVlID8/ICdEZXZlbG9wbWVudCc7XG4gICAgY29uc3QgZW52VmFsID0gdHlwZW9mIGRlZmF1bHRFbnYgPT09ICdzdHJpbmcnID8gZGVmYXVsdEVudiA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShkZWZhdWx0RW52IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKTtcbiAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID0gZW52VmFsID8/ICcnO1xuICAgIGlmICh0aGlzLmVudmlyb25tZW50Rm9ybSkgdGhpcy5lbnZpcm9ubWVudEZvcm0ucGF0Y2hWYWx1ZSh7IGVudmlyb25tZW50OiBkZWZhdWx0RW52IH0pO1xuXG4gICAgdGhpcy51cmwgPSB0aGlzLmluaXRpYWxVcmwgPz8gJyc7XG4gICAgdGhpcy5idWlsZEhlYWRlcnNGb3JtQXJyYXkodGhpcy5pbml0aWFsSGVhZGVycyA/PyBbeyBuYW1lOiAnJywgdHlwZTogJ3N0cmluZycsIHZhbHVlOiAnJyB9XSk7XG4gICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy5oZWFkZXJzQ2hhbmdlLmVtaXQodGhpcy5oZWFkZXJzKTtcblxuICAgIHRoaXMuYm9keVZpZXcgPSAnaGVhZGVycyc7XG4gICAgdGhpcy5hY3RpdmVQYXlsb2FkVGFiID0gJ2hlYWRlcnMnO1xuICAgIHRoaXMucGF5bG9hZFR5cGUgPSAncmF3JztcbiAgICB0aGlzLnBheWxvYWRUZXh0ID0gJyc7XG4gICAgdGhpcy5wYXlsb2FkSnNvbkVycm9yID0gbnVsbDtcbiAgICBjb25zdCBkZWZhdWx0Rm9ybWF0ID0gdGhpcy5pbml0aWFsRm9ybWF0ID8/IHRoaXMuZ2V0Rm9ybWF0VmFsdWVzKClbMF0gPz8gJ2pzb24nO1xuICAgIGlmICh0aGlzLnBheWxvYWRGb3JtYXRGb3JtKSB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLnBhdGNoVmFsdWUoeyBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQgfSk7XG4gICAgdGhpcy5idWlsZEtleVZhbHVlRm9ybUFycmF5KCk7XG4gICAgdGhpcy5idWlsZEtleVR5cGVWYWx1ZUZvcm1BcnJheSgpO1xuICAgIHRoaXMuYnVpbGRQYXJhbXNGb3JtQXJyYXkoKTtcbiAgICB0aGlzLmltcG9ydEN1cmxDb250cm9sLnNldFZhbHVlKCcnKTtcblxuICAgIHRoaXMudmFyaWFibGVOYW1lID0gJyc7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuXG4gICAgdGhpcy5idWlsZFZlcmlmaWNhdGlvbkZvcm1BcnJheSgpO1xuICAgIHRoaXMuYnVpbGRTdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkoKTtcbiAgICB0aGlzLmFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiID0gJ3Jlc3BvbnNlLWJvZHknO1xuXG4gICAgdGhpcy52YWxpZGF0ZVBheWxvYWRKc29uKCk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqIEhhbmRsZXI6IHNob3cgaW1wb3J0IGNVUkwgcGFuZWwgKGNhbGxlZCB3aGVuIHVzZXIgY2xpY2tzIFwiSW1wb3J0IEFQSSBjVVJMXCIpLiBSZXNldHMgdGV4dGFyZWEgc28gaXQgaXMgY2xlYXJlZCBlYWNoIHRpbWUuICovXG4gIG9wZW5JbXBvcnRDdXJsUGFuZWwoKTogdm9pZCB7XG4gICAgdGhpcy5pbXBvcnRDdXJsQ29udHJvbC5zZXRWYWx1ZSgnJyk7XG4gICAgdGhpcy5ib2R5VmlldyA9ICdpbXBvcnQtY3VybCc7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqIFJlc2V0IFVSTCwgbWV0aG9kLCBoZWFkZXJzLCBib2R5LCBhbmQgcGFyYW1zIHRvIGVtcHR5L2RlZmF1bHQgYmVmb3JlIGFwcGx5aW5nIGltcG9ydGVkIGNVUkwuICovXG4gIHByaXZhdGUgcmVzZXRSZXF1ZXN0RmllbGRzQmVmb3JlQ3VybEltcG9ydCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaXJzdE1ldGhvZFZhbHVlID0gdGhpcy5odHRwTWV0aG9kT3B0aW9ucz8ubGVuZ3RoXG4gICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnNbMF0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkZWZhdWx0TWV0aG9kID0gdGhpcy5pbml0aWFsTWV0aG9kID8/IGZpcnN0TWV0aG9kVmFsdWUgPz8gJ0dFVCc7XG4gICAgdGhpcy5zZWxlY3RlZE1ldGhvZCA9IHR5cGVvZiBkZWZhdWx0TWV0aG9kID09PSAnc3RyaW5nJyA/IGRlZmF1bHRNZXRob2QgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdE1ldGhvZCBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJykgPz8gJ0dFVCc7XG4gICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSB0aGlzLnNlbGVjdGVkTWV0aG9kO1xuICAgIGlmICh0aGlzLm1ldGhvZEZvcm0pIHRoaXMubWV0aG9kRm9ybS5wYXRjaFZhbHVlKHsgbWV0aG9kOiBkZWZhdWx0TWV0aG9kIH0pO1xuXG4gICAgdGhpcy51cmwgPSAnJztcblxuICAgIHRoaXMuYnVpbGRIZWFkZXJzRm9ybUFycmF5KFt7IG5hbWU6ICcnLCB0eXBlOiAnc3RyaW5nJywgdmFsdWU6ICcnIH1dKTtcbiAgICB0aGlzLnVwZGF0ZUhlYWRlck5hbWVTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLmhlYWRlcnNDaGFuZ2UuZW1pdCh0aGlzLmhlYWRlcnMpO1xuXG4gICAgdGhpcy5wYXlsb2FkVHlwZSA9ICdyYXcnO1xuICAgIHRoaXMucGF5bG9hZFRleHQgPSAnJztcbiAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgIGNvbnN0IGRlZmF1bHRGb3JtYXQgPSB0aGlzLmluaXRpYWxGb3JtYXQgPz8gdGhpcy5nZXRGb3JtYXRWYWx1ZXMoKVswXSA/PyAnanNvbic7XG4gICAgaWYgKHRoaXMucGF5bG9hZEZvcm1hdEZvcm0pIHRoaXMucGF5bG9hZEZvcm1hdEZvcm0ucGF0Y2hWYWx1ZSh7IGZvcm1hdDogZGVmYXVsdEZvcm1hdCB9KTtcbiAgICB0aGlzLmJ1aWxkS2V5VmFsdWVGb3JtQXJyYXkoW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dKTtcbiAgICB0aGlzLmJ1aWxkS2V5VHlwZVZhbHVlRm9ybUFycmF5KFt7IGtleTogJycsIHR5cGU6ICd0ZXh0JywgdmFsdWU6ICcnIH1dKTtcbiAgICB0aGlzLmJ1aWxkUGFyYW1zRm9ybUFycmF5KFt7IGtleTogJycsIHZhbHVlOiAnJyB9XSk7XG5cbiAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogSGFuZGxlcjogcGFyc2UgY1VSTCBmcm9tIGNvbnRyb2wsIGJpbmQgdG8gZm9ybSBmaWVsZHMsIGVtaXQgYW5kIGNsb3NlIHBhbmVsLiBDYWxsZWQgd2hlbiB1c2VyIGNsaWNrcyBJbXBvcnQgYnV0dG9uLiAqL1xuICBvbkltcG9ydEN1cmxDb25maXJtKCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbXBvcnRDdXJsQ29udHJvbC52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBjdXJsU3RyID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogJyc7XG4gICAgdGhpcy5pbXBvcnRDdXJsLmVtaXQoY3VybFN0cik7XG5cbiAgICB0aGlzLnJlc2V0UmVxdWVzdEZpZWxkc0JlZm9yZUN1cmxJbXBvcnQoKTtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQ3VybChjdXJsU3RyKTtcbiAgICBpZiAocGFyc2VkKSB7XG4gICAgICBjb25zdCBtZXRob2RWYWx1ZSA9IHBhcnNlZC5tZXRob2QgJiYgdGhpcy5nZXRNZXRob2RWYWx1ZXMoKS5pbmNsdWRlcyhwYXJzZWQubWV0aG9kKVxuICAgICAgICA/IHBhcnNlZC5tZXRob2RcbiAgICAgICAgOiBwYXJzZWQubWV0aG9kIHx8ICdHRVQnO1xuICAgICAgdGhpcy5zZWxlY3RlZE1ldGhvZCA9IG1ldGhvZFZhbHVlO1xuICAgICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSBtZXRob2RWYWx1ZTtcbiAgICAgIGlmIChwYXJzZWQudXJsKSB0aGlzLnVybCA9IHBhcnNlZC51cmw7XG5cbiAgICAgIC8vIEJpbmQgQXV0aG9yaXphdGlvbiBoZWFkZXIgdG8gQXV0aG9yaXphdGlvbiBzZWN0aW9uIHdoZW4gcHJlc2VudCAoQmVhcmVyIG9yIG90aGVyIHNjaGVtZSlcbiAgICAgIGxldCBoZWFkZXJSb3dzOiBBcGlFZGl0SGVhZGVyUm93W10gPSBwYXJzZWQuaGVhZGVycztcbiAgICAgIGNvbnN0IGF1dGhIZWFkZXIgPSBoZWFkZXJSb3dzLmZpbmQoKGgpID0+IGgubmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYXV0aG9yaXphdGlvbicpO1xuICAgICAgaWYgKGF1dGhIZWFkZXI/LnZhbHVlPy50cmltKCkpIHtcbiAgICAgICAgY29uc3QgYXV0aFZhbHVlID0gYXV0aEhlYWRlci52YWx1ZS50cmltKCk7XG4gICAgICAgIGNvbnN0IGJlYXJlck1hdGNoID0gL15CZWFyZXJcXHMrKC4rKSQvaS5leGVjKGF1dGhWYWx1ZSk7XG4gICAgICAgIGlmIChiZWFyZXJNYXRjaCkge1xuICAgICAgICAgIGNvbnN0IHRva2VuID0gYmVhcmVyTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgICAgIGlmICh0aGlzLmdldEF1dGhUeXBlVmFsdWVzKCkuaW5jbHVkZXMoJ2JlYXJlcicpICYmIHRoaXMuYXV0aFR5cGVGb3JtKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGhUeXBlRm9ybS5wYXRjaFZhbHVlKHsgYXV0aFR5cGU6ICdiZWFyZXInIH0pO1xuICAgICAgICAgICAgdGhpcy5iZWFyZXJUb2tlbiA9IHRva2VuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoZWFkZXJSb3dzID0gaGVhZGVyUm93cy5maWx0ZXIoKGgpID0+IGgubmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnYXV0aG9yaXphdGlvbicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGhlYWRlclJvd3MgPSBoZWFkZXJSb3dzLmxlbmd0aCA+IDAgPyBoZWFkZXJSb3dzIDogW3sgbmFtZTogJycsIHR5cGU6ICdzdHJpbmcnLCB2YWx1ZTogJycgfV07XG4gICAgICB0aGlzLmJ1aWxkSGVhZGVyc0Zvcm1BcnJheShoZWFkZXJSb3dzKTtcbiAgICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgICAgdGhpcy5oZWFkZXJzQ2hhbmdlLmVtaXQodGhpcy5oZWFkZXJzKTtcblxuICAgICAgaWYgKHBhcnNlZC5ib2R5KSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcGFyc2VkLmhlYWRlcnNcbiAgICAgICAgICAuZmluZCgoaCkgPT4gaC5uYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LXR5cGUnKVxuICAgICAgICAgID8udmFsdWU/LnRvTG93ZXJDYXNlKCkgPz8gJyc7XG4gICAgICAgIGNvbnN0IGlzRm9ybVVybEVuY29kZWQgPSBjb250ZW50VHlwZS5pbmNsdWRlcygnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG5cbiAgICAgICAgaWYgKGlzRm9ybVVybEVuY29kZWQpIHtcbiAgICAgICAgICBjb25zdCByb3dzID0gdGhpcy5wYXJzZUZvcm1VcmxFbmNvZGVkQm9keShwYXJzZWQuYm9keSk7XG4gICAgICAgICAgdGhpcy5idWlsZEtleVZhbHVlRm9ybUFycmF5KHJvd3MubGVuZ3RoID4gMCA/IHJvd3MgOiBbeyBrZXk6ICcnLCB2YWx1ZTogJycgfV0pO1xuICAgICAgICAgIGNvbnN0IGRlY29kZWRBc0pzb24gPSB0aGlzLnRyeUZvcm1Cb2R5VmFsdWVBc1Jhd0pzb24ocm93cyk7XG4gICAgICAgICAgaWYgKGRlY29kZWRBc0pzb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5wYXlsb2FkVHlwZSA9ICdyYXcnO1xuICAgICAgICAgICAgdGhpcy5wYXlsb2FkVGV4dCA9IGRlY29kZWRBc0pzb247XG4gICAgICAgICAgICBpZiAodGhpcy5wYXlsb2FkRm9ybWF0Rm9ybSkgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiAnanNvbicgfSk7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZFR5cGUgPSAneC13d3ctZm9ybS11cmxlbmNvZGVkJztcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZFRleHQgPSAnJztcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucGF5bG9hZFRleHQgPSBwYXJzZWQuYm9keTtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICAgICAgICBjb25zdCB0cmltbWVkID0gcGFyc2VkLmJvZHkudHJpbSgpO1xuICAgICAgICAgIGlmICgodHJpbW1lZC5zdGFydHNXaXRoKCd7JykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnfScpKSB8fCAodHJpbW1lZC5zdGFydHNXaXRoKCdbJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnXScpKSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0VmFsdWVzID0gdGhpcy5nZXRGb3JtYXRWYWx1ZXMoKTtcbiAgICAgICAgICAgIGlmIChmb3JtYXRWYWx1ZXMuaW5jbHVkZXMoJ2pzb24nKSAmJiB0aGlzLnBheWxvYWRGb3JtYXRGb3JtKSB7XG4gICAgICAgICAgICAgIHRoaXMucGF5bG9hZEZvcm1hdEZvcm0ucGF0Y2hWYWx1ZSh7IGZvcm1hdDogJ2pzb24nIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHRoaXMuY2xvc2VJbXBvcnRDdXJsUGFuZWwoKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVyOiBlbWl0IGNhbmNlbCBhbmQgY2xvc2UgcGFuZWwuIENhbGxlZCB3aGVuIHVzZXIgY2xpY2tzIENhbmNlbCBpbiBpbXBvcnQgY1VSTCBwYW5lbC4gKi9cbiAgb25DYW5jZWxJbXBvcnRDdXJsKCk6IHZvaWQge1xuICAgIHRoaXMuaW1wb3J0Q3VybENhbmNlbC5lbWl0KCk7XG4gICAgdGhpcy5jbG9zZUltcG9ydEN1cmxQYW5lbCgpO1xuICB9XG5cbiAgLyoqIEhhbmRsZXI6IHNob3cgaGVhZGVycyBzZWN0aW9uIChjYWxsZWQgZnJvbSBDYW5jZWwgb3IgYWZ0ZXIgSW1wb3J0IGluIGltcG9ydCBwYW5lbCkuICovXG4gIGNsb3NlSW1wb3J0Q3VybFBhbmVsKCk6IHZvaWQge1xuICAgIHRoaXMuYm9keVZpZXcgPSAnaGVhZGVycyc7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgb25TZW5kUmVxdWVzdCgpOiB2b2lkIHtcbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudCAhPSBudWxsID8gU3RyaW5nKHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudCkgOiAnJztcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLnNlbGVjdGVkTWV0aG9kICE9IG51bGwgPyBTdHJpbmcodGhpcy5zZWxlY3RlZE1ldGhvZCkgOiAnJztcbiAgICB0aGlzLnNlbmRSZXF1ZXN0LmVtaXQoe1xuICAgICAgZW52aXJvbm1lbnQsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmw6IHRoaXMudXJsID8/ICcnLFxuICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgb25WYXJpYWJsZU5hbWVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuICB9XG5cbiAgb25CYWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID4gMSkge1xuICAgICAgdGhpcy5zZXRTdGVwKHRoaXMuY3VycmVudFN0ZXAgLSAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXNldEFsbFN0ZXBzQW5kRGF0YSgpO1xuICAgICAgdGhpcy5iYWNrLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdXNlciBjbGlja3MgdGhlIENhbmNlbCBidXR0b24gKHN0ZXAgMSkuIEVtaXRzIGNhbmNlbCB0aGVuIHJ1bnMgbm9ybWFsIGJhY2sgZmxvdy4gKi9cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMub25CYWNrKCk7XG4gIH1cblxuICBvbk5leHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY3VycmVudFN0ZXAgPT09IDIgJiYgIXRoaXMudmFyaWFibGVOYW1lPy50cmltKCkpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lRXJyb3IgPSAnVmFyaWFibGUgTmFtZSBpcyByZXF1aXJlZC4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZhcmlhYmxlTmFtZUVycm9yID0gJyc7XG4gICAgaWYgKHRoaXMuY3VycmVudFN0ZXAgPCB0aGlzLnN0ZXBMYWJlbHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNldFN0ZXAodGhpcy5jdXJyZW50U3RlcCArIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5leHQuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIHNldFBheWxvYWRUYWIodmFsdWU6IEFwaUVkaXRQYXlsb2FkVGFiKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVQYXlsb2FkVGFiID0gdmFsdWU7XG4gIH1cblxuICBzZXRSZXNwb25zZVZlcmlmaWNhdGlvblRhYih2YWx1ZTogJ3Jlc3BvbnNlLWJvZHknIHwgJ3N0YXR1cycpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiID0gdmFsdWU7XG4gIH1cblxuICBhZGRIZWFkZXIoKTogdm9pZCB7XG4gICAgdGhpcy5oZWFkZXJzRm9ybUFycmF5LnB1c2goXG4gICAgICB0aGlzLmZiLmdyb3VwKHsgbmFtZTogWycnXSwgdmFsdWU6IFsnJ10gfSlcbiAgICApO1xuICB9XG5cbiAgcmVtb3ZlSGVhZGVyKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmhlYWRlcnNGb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgLyoqIFdoZW4gdXNlciBhZGRzIGEgY3VzdG9tIGhlYWRlciBuYW1lIHZpYSB0aGUgZHJvcGRvd24gXCJBZGQgJ+KApidcIiBvcHRpb24sIHNldCB0aGUgY29udHJvbCB2YWx1ZS4gKi9cbiAgb25IZWFkZXJOYW1lQWRkQ3VzdG9tVmFsdWUoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSwgcm93OiBGb3JtR3JvdXApOiB2b2lkIHtcbiAgICBjb25zdCBjb250cm9sID0gcm93LmdldChldmVudC5rZXkpO1xuICAgIGlmIChjb250cm9sICYmIGV2ZW50LnZhbHVlICE9IG51bGwpIHtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUoZXZlbnQudmFsdWUudHJpbSgpKTtcbiAgICB9XG4gIH1cblxuICB0cmFja0J5SGVhZGVyKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGFkZEtleVZhbHVlUm93KCk6IHZvaWQge1xuICAgIHRoaXMua2V5VmFsdWVGb3JtQXJyYXkucHVzaCh0aGlzLmZiLmdyb3VwKHsga2V5OiBbJyddLCB2YWx1ZTogWycnXSB9KSk7XG4gIH1cblxuICByZW1vdmVLZXlWYWx1ZVJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5rZXlWYWx1ZUZvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG4gIH1cblxuICB0cmFja0J5S2V5VmFsdWUoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgYWRkS2V5VHlwZVZhbHVlUm93KCk6IHZvaWQge1xuICAgIHRoaXMua2V5VHlwZVZhbHVlRm9ybUFycmF5LnB1c2godGhpcy5mYi5ncm91cCh7IGtleTogWycnXSwgdHlwZTogWyd0ZXh0J10sIHZhbHVlOiBbJyddIH0pKTtcbiAgfVxuXG4gIHJlbW92ZUtleVR5cGVWYWx1ZVJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5rZXlUeXBlVmFsdWVGb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgdHJhY2tCeUtleVR5cGVWYWx1ZShpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBhZGRQYXJhbXNSb3coKTogdm9pZCB7XG4gICAgdGhpcy5wYXJhbXNGb3JtQXJyYXkucHVzaCh0aGlzLmZiLmdyb3VwKHsga2V5OiBbJyddLCB2YWx1ZTogWycnXSB9KSk7XG4gIH1cblxuICByZW1vdmVQYXJhbXNSb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGFyYW1zRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIHRyYWNrQnlQYXJhbXMoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgYWRkVmVyaWZpY2F0aW9uUm93KCk6IHZvaWQge1xuICAgIHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5LnB1c2goXG4gICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAganNvblBhdGg6IFsnJ10sXG4gICAgICAgIHZlcmlmaWNhdGlvbjogW3RoaXMuZ2V0RGVmYXVsdFZlcmlmaWNhdGlvbigpXSxcbiAgICAgICAgZGF0YVR5cGU6IFt0aGlzLmdldERlZmF1bHREYXRhVHlwZSgpXSxcbiAgICAgICAgZXhwZWN0ZWRWYWx1ZTogWycnXSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZVZlcmlmaWNhdGlvblJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgdHJhY2tCeVZlcmlmaWNhdGlvbihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKiogV2hlbiBEYXRhIFR5cGUgY2hhbmdlcyBpbiBSZXNwb25zZSBCb2R5IHZlcmlmaWNhdGlvbiwgcmVzZXQgRXhwZWN0ZWQgVmFsdWUgZm9yIHRoYXQgcm93LiAqL1xuICBvblZlcmlmaWNhdGlvbkRhdGFUeXBlQ2hhbmdlKHJvdzogRm9ybUdyb3VwLCBldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfSk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdkYXRhVHlwZScpIHtcbiAgICAgIHJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBhZGRTdGF0dXNWZXJpZmljYXRpb25Sb3coKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkucHVzaChcbiAgICAgIHRoaXMuZmIuZ3JvdXAoeyB2ZXJpZmljYXRpb246IFt0aGlzLmdldERlZmF1bHRTdGF0dXNWZXJpZmljYXRpb24oKV0sIGV4cGVjdGVkVmFsdWU6IFsnJ10gfSlcbiAgICApO1xuICB9XG5cbiAgcmVtb3ZlU3RhdHVzVmVyaWZpY2F0aW9uUm93KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG4gIH1cblxuICB0cmFja0J5U3RhdHVzVmVyaWZpY2F0aW9uKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKiBFbWl0IGFsbCBlbnRlcmVkIGRldGFpbHMgKGVudmlyb25tZW50LCBIVFRQIG1ldGhvZCwgVVJMLCBoZWFkZXJzLCBib2R5LCBzdGVwMiB2YXJpYWJsZSwgc3RlcDMgdmVyaWZpY2F0aW9ucykgd2hlbiB1c2VyIGNsaWNrcyBDcmVhdGUuICovXG4gIG9uQ3JlYXRlKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCc5OTk5OTk5Jyk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmdldENyZWF0ZVBheWxvYWQoKTtcbiAgICAgIGNvbnNvbGUubG9nKCc5OTk5OTk5IHBheWxvYWQnLCBwYXlsb2FkKTtcbiAgICAgIHRoaXMuY3JlYXRlLmVtaXQocGF5bG9hZCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdBcGlFZGl0U3RlcCBnZXRDcmVhdGVQYXlsb2FkIGVycm9yOicsIGVycik7XG4gICAgICB0aGlzLmNyZWF0ZS5lbWl0KHRoaXMuZ2V0Q3JlYXRlUGF5bG9hZEZhbGxiYWNrKCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBNaW5pbWFsIHBheWxvYWQgd2hlbiBnZXRDcmVhdGVQYXlsb2FkIHRocm93cyAoc28gY3JlYXRlIGFsd2F5cyBlbWl0cykuICovXG4gIHByaXZhdGUgZ2V0Q3JlYXRlUGF5bG9hZEZhbGxiYWNrKCk6IEFwaUVkaXRDcmVhdGVQYXlsb2FkIHtcbiAgICBjb25zdCBhdXRoVHlwZSA9IHRoaXMuc2VsZWN0ZWRBdXRoVHlwZTtcbiAgICBjb25zdCBiZWFyZXJUb2tlbiA9IGF1dGhUeXBlID09PSAnYmVhcmVyJyA/ICh0aGlzLmJlYXJlclRva2VuID8/ICcnKSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgb2F1dGgyOiBBcGlFZGl0T0F1dGgyUGF5bG9hZCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYXV0aFR5cGUgPT09ICdvYXV0aDInICYmIHRoaXMub2F1dGgyRm9ybSkge1xuICAgICAgY29uc3QgZ3JhbnRUeXBlID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0Q29udHJvbFZhbHVlKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2dyYW50VHlwZScpIGFzIHsgdmFsdWU6IHVua25vd24gfSB8IG51bGwpO1xuICAgICAgY29uc3QgY2xpZW50QXV0aCA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldENvbnRyb2xWYWx1ZSh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdjbGllbnRBdXRoZW50aWNhdGlvbicpIGFzIHsgdmFsdWU6IHVua25vd24gfSB8IG51bGwpO1xuICAgICAgb2F1dGgyID0ge1xuICAgICAgICBncmFudFR5cGU6IGdyYW50VHlwZSAhPT0gJycgPyBncmFudFR5cGUgOiAnY2xpZW50X2NyZWRlbnRpYWxzJyxcbiAgICAgICAgYWNjZXNzVG9rZW5Vcmw6ICh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdhY2Nlc3NUb2tlblVybCcpPy52YWx1ZSA/PyAnJykgYXMgc3RyaW5nLFxuICAgICAgICBjbGllbnRJZDogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2NsaWVudElkJyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIGNsaWVudFNlY3JldDogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2NsaWVudFNlY3JldCcpPy52YWx1ZSA/PyAnJykgYXMgc3RyaW5nLFxuICAgICAgICBzY29wZTogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ3Njb3BlJyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIGNsaWVudEF1dGhlbnRpY2F0aW9uOiBjbGllbnRBdXRoICE9PSAnJyA/IGNsaWVudEF1dGggOiAnYmFzaWMnLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0ZXAxOiB7XG4gICAgICAgIGVudmlyb25tZW50OiAnJyxcbiAgICAgICAgbWV0aG9kOiAnJyxcbiAgICAgICAgdXJsOiB0aGlzLnVybCA/PyAnJyxcbiAgICAgICAgaGVhZGVyczogW10sXG4gICAgICAgIGF1dGhUeXBlLFxuICAgICAgICAuLi4oYmVhcmVyVG9rZW4gIT09IHVuZGVmaW5lZCAmJiB7IGJlYXJlclRva2VuIH0pLFxuICAgICAgICAuLi4ob2F1dGgyICE9PSB1bmRlZmluZWQgJiYgeyBvYXV0aDIgfSksXG4gICAgICAgIGFjdGl2ZVBheWxvYWRUYWI6IHRoaXMuYWN0aXZlUGF5bG9hZFRhYixcbiAgICAgICAgcGF5bG9hZFR5cGU6IHRoaXMucGF5bG9hZFR5cGUsXG4gICAgICAgIHBheWxvYWRGb3JtYXQ6ICcnLFxuICAgICAgICBwYXlsb2FkVGV4dDogdGhpcy5wYXlsb2FkVGV4dCA/PyAnJyxcbiAgICAgICAga2V5VmFsdWVSb3dzOiBbXSxcbiAgICAgICAga2V5VHlwZVZhbHVlUm93czogW10sXG4gICAgICAgIHBhcmFtc1Jvd3M6IFtdLFxuICAgICAgfSxcbiAgICAgIHN0ZXAyOiB7IHZhcmlhYmxlTmFtZTogdGhpcy52YXJpYWJsZU5hbWUgPz8gJycgfSxcbiAgICAgIHN0ZXAzOiB7XG4gICAgICAgIGFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiOiB0aGlzLmFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiLFxuICAgICAgICByZXNwb25zZUJvZHlWZXJpZmljYXRpb25zOiBbXSxcbiAgICAgICAgc3RhdHVzVmVyaWZpY2F0aW9uczogW10sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKiogTm9ybWFsaXplIGZvcm0gY29udHJvbCB2YWx1ZSB0byBzdHJpbmcgKGhhbmRsZXMgb2JqZWN0IG9yIHN0cmluZykuICovXG4gIHByaXZhdGUgc3RhdGljIGdldENvbnRyb2xWYWx1ZShjb250cm9sOiB7IHZhbHVlOiB1bmtub3duIH0gfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBjb25zdCB2ID0gY29udHJvbD8udmFsdWU7XG4gICAgaWYgKHYgPT0gbnVsbCB8fCB2ID09PSAnJykgcmV0dXJuICcnO1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJykgOiBTdHJpbmcodik7XG4gIH1cblxuICAvKiogQnVpbGQgZnVsbCBjcmVhdGUgcGF5bG9hZDogZW52aXJvbm1lbnQsIEhUVFAgbWV0aG9kLCBVUkwsIGhlYWRlcnMsIGJvZHkgKHN0ZXAxKSwgdmFyaWFibGUgbmFtZSAoc3RlcDIpLCB2ZXJpZmljYXRpb25zIChzdGVwMykuICovXG4gIHByaXZhdGUgZ2V0Q3JlYXRlUGF5bG9hZCgpOiBBcGlFZGl0Q3JlYXRlUGF5bG9hZCB7XG4gICAgY29uc3QgZW52RnJvbUZvcm0gPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRDb250cm9sVmFsdWUodGhpcy5lbnZpcm9ubWVudEZvcm0/LmdldCgnZW52aXJvbm1lbnQnKSBhcyB7IHZhbHVlOiB1bmtub3duIH0gfCBudWxsKTtcbiAgICBjb25zdCBlbnZpcm9ubWVudCA9XG4gICAgICBlbnZGcm9tRm9ybSAhPT0gJycgPyBlbnZGcm9tRm9ybSA6ICh0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlICE9PSAnJyA/IHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgOiB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnQpO1xuICAgIGNvbnN0IG1ldGhvZEZyb21Gb3JtID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0Q29udHJvbFZhbHVlKHRoaXMubWV0aG9kRm9ybT8uZ2V0KCdtZXRob2QnKSBhcyB7IHZhbHVlOiB1bmtub3duIH0gfCBudWxsKTtcbiAgICBjb25zdCBtZXRob2QgPVxuICAgICAgbWV0aG9kRnJvbUZvcm0gIT09ICcnID8gbWV0aG9kRnJvbUZvcm0gOiAodGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgIT09ICcnID8gdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgOiB0aGlzLnNlbGVjdGVkTWV0aG9kKTtcbiAgICBjb25zdCBmb3JtYXQgPSB0aGlzLnBheWxvYWRGb3JtYXRGb3JtPy5nZXQoJ2Zvcm1hdCcpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBrZXlWYWx1ZUZvcm1BcnJheSA9IHRoaXMua2V5VmFsdWVGb3JtQXJyYXk7XG4gICAgY29uc3Qga2V5VmFsdWVSb3dzID0gKGtleVZhbHVlRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkubWFwKChjKSA9PiAoe1xuICAgICAga2V5OiAoYyBhcyBGb3JtR3JvdXApLmdldCgna2V5Jyk/LnZhbHVlID8/ICcnLFxuICAgICAgdmFsdWU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJyxcbiAgICB9KSk7XG4gICAgY29uc3Qga2V5VHlwZVZhbHVlRm9ybUFycmF5ID0gdGhpcy5rZXlUeXBlVmFsdWVGb3JtQXJyYXk7XG4gICAgY29uc3Qga2V5VHlwZVZhbHVlUm93cyA9IChrZXlUeXBlVmFsdWVGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKS5tYXAoKGMpID0+ICh7XG4gICAgICBrZXk6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCdrZXknKT8udmFsdWUgPz8gJycsXG4gICAgICB0eXBlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgndHlwZScpPy52YWx1ZSA/PyAndGV4dCcsXG4gICAgICB2YWx1ZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnLFxuICAgIH0pKTtcbiAgICBjb25zdCBwYXJhbXNGb3JtQXJyYXkgPSB0aGlzLnBhcmFtc0Zvcm1BcnJheTtcbiAgICBjb25zdCBwYXJhbXNSb3dzID0gKHBhcmFtc0Zvcm1BcnJheT8uY29udHJvbHMgPz8gW10pLm1hcCgoYykgPT4gKHtcbiAgICAgIGtleTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2tleScpPy52YWx1ZSA/PyAnJyxcbiAgICAgIHZhbHVlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgndmFsdWUnKT8udmFsdWUgPz8gJycsXG4gICAgfSkpO1xuICAgIGNvbnN0IHZlcmlmaWNhdGlvbkZvcm1BcnJheSA9IHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5O1xuICAgIGNvbnN0IHJlc3BvbnNlQm9keVZlcmlmaWNhdGlvbnMgPSAodmVyaWZpY2F0aW9uRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkubWFwKChjKSA9PiAoe1xuICAgICAganNvblBhdGg6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCdqc29uUGF0aCcpPy52YWx1ZSA/PyAnJyxcbiAgICAgIHZlcmlmaWNhdGlvbjogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZlcmlmaWNhdGlvbicpPy52YWx1ZSA/PyAnJyxcbiAgICAgIGRhdGFUeXBlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgnZGF0YVR5cGUnKT8udmFsdWUgPz8gJycsXG4gICAgICBleHBlY3RlZFZhbHVlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgnZXhwZWN0ZWRWYWx1ZScpPy52YWx1ZSA/PyAnJyxcbiAgICB9KSk7XG4gICAgY29uc3Qgc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5ID0gdGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXk7XG4gICAgY29uc3Qgc3RhdHVzVmVyaWZpY2F0aW9ucyA9IChzdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKS5tYXAoKGMpID0+ICh7XG4gICAgICB2ZXJpZmljYXRpb246IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2ZXJpZmljYXRpb24nKT8udmFsdWUgPz8gJycsXG4gICAgICBleHBlY3RlZFZhbHVlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgnZXhwZWN0ZWRWYWx1ZScpPy52YWx1ZSA/PyAnJyxcbiAgICB9KSk7XG4gICAgY29uc3QgYXV0aFR5cGUgPSB0aGlzLnNlbGVjdGVkQXV0aFR5cGU7XG4gICAgY29uc3QgYmVhcmVyVG9rZW4gPSBhdXRoVHlwZSA9PT0gJ2JlYXJlcicgPyAodGhpcy5iZWFyZXJUb2tlbiA/PyAnJykgOiB1bmRlZmluZWQ7XG4gICAgbGV0IG9hdXRoMjogQXBpRWRpdE9BdXRoMlBheWxvYWQgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGF1dGhUeXBlID09PSAnb2F1dGgyJyAmJiB0aGlzLm9hdXRoMkZvcm0pIHtcbiAgICAgIGNvbnN0IGdyYW50VHlwZSA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldENvbnRyb2xWYWx1ZSh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdncmFudFR5cGUnKSBhcyB7IHZhbHVlOiB1bmtub3duIH0gfCBudWxsKTtcbiAgICAgIGNvbnN0IGNsaWVudEF1dGggPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRDb250cm9sVmFsdWUodGhpcy5vYXV0aDJGb3JtLmdldCgnY2xpZW50QXV0aGVudGljYXRpb24nKSBhcyB7IHZhbHVlOiB1bmtub3duIH0gfCBudWxsKTtcbiAgICAgIG9hdXRoMiA9IHtcbiAgICAgICAgZ3JhbnRUeXBlOiBncmFudFR5cGUgIT09ICcnID8gZ3JhbnRUeXBlIDogJ2NsaWVudF9jcmVkZW50aWFscycsXG4gICAgICAgIGFjY2Vzc1Rva2VuVXJsOiAodGhpcy5vYXV0aDJGb3JtLmdldCgnYWNjZXNzVG9rZW5VcmwnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgY2xpZW50SWQ6ICh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdjbGllbnRJZCcpPy52YWx1ZSA/PyAnJykgYXMgc3RyaW5nLFxuICAgICAgICBjbGllbnRTZWNyZXQ6ICh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdjbGllbnRTZWNyZXQnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgc2NvcGU6ICh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdzY29wZScpPy52YWx1ZSA/PyAnJykgYXMgc3RyaW5nLFxuICAgICAgICBjbGllbnRBdXRoZW50aWNhdGlvbjogY2xpZW50QXV0aCAhPT0gJycgPyBjbGllbnRBdXRoIDogJ2Jhc2ljJyxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzdGVwMToge1xuICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICB1cmw6IHRoaXMudXJsID8/ICcnLFxuICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgIGF1dGhUeXBlLFxuICAgICAgICAuLi4oYmVhcmVyVG9rZW4gIT09IHVuZGVmaW5lZCAmJiB7IGJlYXJlclRva2VuIH0pLFxuICAgICAgICAuLi4ob2F1dGgyICE9PSB1bmRlZmluZWQgJiYgeyBvYXV0aDIgfSksXG4gICAgICAgIGFjdGl2ZVBheWxvYWRUYWI6IHRoaXMuYWN0aXZlUGF5bG9hZFRhYixcbiAgICAgICAgcGF5bG9hZFR5cGU6IHRoaXMucGF5bG9hZFR5cGUsXG4gICAgICAgIHBheWxvYWRGb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgcGF5bG9hZFRleHQ6IHRoaXMucGF5bG9hZFRleHQgPz8gJycsXG4gICAgICAgIGtleVZhbHVlUm93cyxcbiAgICAgICAga2V5VHlwZVZhbHVlUm93cyxcbiAgICAgICAgcGFyYW1zUm93cyxcbiAgICAgIH0sXG4gICAgICBzdGVwMjoge1xuICAgICAgICB2YXJpYWJsZU5hbWU6IHRoaXMudmFyaWFibGVOYW1lID8/ICcnLFxuICAgICAgfSxcbiAgICAgIHN0ZXAzOiB7XG4gICAgICAgIGFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiOiB0aGlzLmFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiLFxuICAgICAgICByZXNwb25zZUJvZHlWZXJpZmljYXRpb25zLFxuICAgICAgICBzdGF0dXNWZXJpZmljYXRpb25zLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEN1cnJlbnQgaGVhZGVyIHJvd3MgZnJvbSBmb3JtIChmb3IgY29uc3VtZXJzIHRoYXQgcmVhZCBoZWFkZXJzKSAqL1xuICBnZXQgaGVhZGVycygpOiBBcGlFZGl0SGVhZGVyUm93W10ge1xuICAgIGlmICghdGhpcy5oZWFkZXJzRm9ybUFycmF5KSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuaGVhZGVyc0Zvcm1BcnJheS5jb250cm9scy5tYXAoKGMpID0+ICh7XG4gICAgICBuYW1lOiAoYyBhcyBGb3JtR3JvdXApLmdldCgnbmFtZScpPy52YWx1ZSA/PyAnJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgdmFsdWU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJyxcbiAgICB9KSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxNZXRob2QnXT8uY3VycmVudFZhbHVlICE9IG51bGwgJiYgdGhpcy5tZXRob2RGb3JtKSB7XG4gICAgICBjb25zdCB2ID0gY2hhbmdlc1snaW5pdGlhbE1ldGhvZCddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID0gdHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKTtcbiAgICAgIHRoaXMubWV0aG9kRm9ybS5wYXRjaFZhbHVlKHsgbWV0aG9kOiB2IH0pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaHR0cE1ldGhvZE9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVNZXRob2RTZWxlY3RDb25maWcoKTtcbiAgICAgIGlmICh0aGlzLm1ldGhvZEZvcm0gJiYgdGhpcy5odHRwTWV0aG9kT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLm1ldGhvZEZvcm0uZ2V0KCdtZXRob2QnKT8udmFsdWU7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0TWV0aG9kVmFsdWVzKCk7XG4gICAgICAgIGNvbnN0IHZhbGlkID0gdmFsdWVzLmluY2x1ZGVzKGN1cnJlbnQpO1xuICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnNbMF0pO1xuICAgICAgICAgIGlmIChmaXJzdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID0gZmlyc3RWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMubWV0aG9kRm9ybS5wYXRjaFZhbHVlKHsgbWV0aG9kOiBmaXJzdFZhbHVlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbEVudmlyb25tZW50J10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsICYmIHRoaXMuZW52aXJvbm1lbnRGb3JtKSB7XG4gICAgICBjb25zdCB2ID0gY2hhbmdlc1snaW5pdGlhbEVudmlyb25tZW50J10uY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9IHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IHYgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgICB0aGlzLmVudmlyb25tZW50Rm9ybS5wYXRjaFZhbHVlKHsgZW52aXJvbm1lbnQ6IHYgfSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydlbnZpcm9ubWVudE9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVFbnZpcm9ubWVudFNlbGVjdENvbmZpZygpO1xuICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnRGb3JtICYmIHRoaXMuZW52aXJvbm1lbnRPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuZW52aXJvbm1lbnRGb3JtLmdldCgnZW52aXJvbm1lbnQnKT8udmFsdWU7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0RW52aXJvbm1lbnRWYWx1ZXMoKTtcbiAgICAgICAgY29uc3QgdmFsaWQgPSB2YWx1ZXMuaW5jbHVkZXMoY3VycmVudCk7XG4gICAgICAgIGlmICghdmFsaWQpIHtcbiAgICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5lbnZpcm9ubWVudE9wdGlvbnNbMF0pO1xuICAgICAgICAgIGlmIChmaXJzdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgPSBmaXJzdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5lbnZpcm9ubWVudEZvcm0ucGF0Y2hWYWx1ZSh7IGVudmlyb25tZW50OiBmaXJzdFZhbHVlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbEF1dGhUeXBlJ10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsICYmIHRoaXMuYXV0aFR5cGVGb3JtKSB7XG4gICAgICBjb25zdCB2ID0gY2hhbmdlc1snaW5pdGlhbEF1dGhUeXBlJ10uY3VycmVudFZhbHVlO1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPVxuICAgICAgICB0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyB2IDogQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KTtcbiAgICAgIGlmIChyZXNvbHZlZCAhPSBudWxsKSB0aGlzLmF1dGhUeXBlRm9ybS5wYXRjaFZhbHVlKHsgYXV0aFR5cGU6IHYgfSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydhdXRoVHlwZU9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVBdXRoVHlwZVNlbGVjdENvbmZpZygpO1xuICAgICAgaWYgKHRoaXMuYXV0aFR5cGVGb3JtKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0QXV0aFR5cGVWYWx1ZXMoKTtcbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuYXV0aFR5cGVGb3JtLmdldCgnYXV0aFR5cGUnKT8udmFsdWU7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbCA9XG4gICAgICAgICAgICBjdXJyZW50ICE9IG51bGwgJiYgY3VycmVudCAhPT0gJydcbiAgICAgICAgICAgICAgPyB0eXBlb2YgY3VycmVudCA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGN1cnJlbnQgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dClcbiAgICAgICAgICAgICAgICA6IFN0cmluZyhjdXJyZW50KVxuICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgY29uc3QgdmFsaWQgPSBjdXJyZW50VmFsICE9IG51bGwgJiYgdmFsdWVzLmluY2x1ZGVzKGN1cnJlbnRWYWwpO1xuICAgICAgICAgIGlmICghdmFsaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSB2YWx1ZXNbMF07XG4gICAgICAgICAgICBpZiAoZmlyc3RWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIHRoaXMuYXV0aFR5cGVGb3JtLnBhdGNoVmFsdWUoeyBhdXRoVHlwZTogZmlyc3RWYWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxTdGVwJ10pIHtcbiAgICAgIHRoaXMuYXBwbHlJbml0aWFsU3RlcChjaGFuZ2VzWydpbml0aWFsU3RlcCddLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsVXJsJ10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnVybCA9IGNoYW5nZXNbJ2luaXRpYWxVcmwnXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsUGF5bG9hZFRhYiddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5hY3RpdmVQYXlsb2FkVGFiID0gY2hhbmdlc1snaW5pdGlhbFBheWxvYWRUYWInXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydoZWFkZXJOYW1lT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUhlYWRlck5hbWVTZWxlY3RDb25maWcoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxIZWFkZXJzJ10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmJ1aWxkSGVhZGVyc0Zvcm1BcnJheShjaGFuZ2VzWydpbml0aWFsSGVhZGVycyddLmN1cnJlbnRWYWx1ZSBhcyBBcGlFZGl0SGVhZGVyUm93W10pO1xuICAgICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsUmVzcG9uc2VQcmV2aWV3J10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnJlc3BvbnNlUHJldmlldyA9IGNoYW5nZXNbJ2luaXRpYWxSZXNwb25zZVByZXZpZXcnXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsRm9ybWF0J10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsICYmIHRoaXMucGF5bG9hZEZvcm1hdEZvcm0pIHtcbiAgICAgIHRoaXMucGF5bG9hZEZvcm1hdEZvcm0ucGF0Y2hWYWx1ZSh7IGZvcm1hdDogY2hhbmdlc1snaW5pdGlhbEZvcm1hdCddLmN1cnJlbnRWYWx1ZSB9KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxWYXJpYWJsZU5hbWUnXT8uY3VycmVudFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lID0gY2hhbmdlc1snaW5pdGlhbFZhcmlhYmxlTmFtZSddLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2Zvcm1hdE9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVQYXlsb2FkRm9ybWF0U2VsZWN0Q29uZmlnKCk7XG4gICAgICBpZiAodGhpcy5wYXlsb2FkRm9ybWF0Rm9ybSkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5nZXQoJ2Zvcm1hdCcpPy52YWx1ZTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRGb3JtYXRWYWx1ZXMoKTtcbiAgICAgICAgY29uc3QgdmFsaWQgPSB2YWx1ZXMuaW5jbHVkZXMoY3VycmVudCk7XG4gICAgICAgIGlmICghdmFsaWQgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gdmFsdWVzWzBdO1xuICAgICAgICAgIHRoaXMucGF5bG9hZEZvcm1hdEZvcm0ucGF0Y2hWYWx1ZSh7IGZvcm1hdDogZmlyc3RWYWx1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndmVyaWZpY2F0aW9uT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZlcmlmaWNhdGlvblNlbGVjdENvbmZpZygpO1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWZXJpZmljYXRpb25WYWx1ZXMoKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRWZXJpZmljYXRpb24gPSB0aGlzLmdldERlZmF1bHRWZXJpZmljYXRpb24oKTtcbiAgICAgIGlmICh0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheSAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IChjb250cm9sIGFzIEZvcm1Hcm91cCkuZ2V0KCd2ZXJpZmljYXRpb24nKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgJiYgIXZhbHVlcy5pbmNsdWRlcyhjdXJyZW50KSkge1xuICAgICAgICAgICAgKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5wYXRjaFZhbHVlKHsgdmVyaWZpY2F0aW9uOiBkZWZhdWx0VmVyaWZpY2F0aW9uIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd2ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVWZXJpZmljYXRpb25EYXRhVHlwZVNlbGVjdENvbmZpZygpO1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXREYXRhVHlwZVZhbHVlcygpO1xuICAgICAgY29uc3QgZGVmYXVsdERhdGFUeXBlID0gdGhpcy5nZXREZWZhdWx0RGF0YVR5cGUoKTtcbiAgICAgIGlmICh0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheSAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IChjb250cm9sIGFzIEZvcm1Hcm91cCkuZ2V0KCdkYXRhVHlwZScpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoY3VycmVudCAmJiAhdmFsdWVzLmluY2x1ZGVzKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAoY29udHJvbCBhcyBGb3JtR3JvdXApLnBhdGNoVmFsdWUoeyBkYXRhVHlwZTogZGVmYXVsdERhdGFUeXBlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzdGF0dXNWZXJpZmljYXRpb25PcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlU3RhdHVzVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnKCk7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFN0YXR1c1ZlcmlmaWNhdGlvblZhbHVlcygpO1xuICAgICAgY29uc3QgZGVmYXVsdFZlcmlmaWNhdGlvbiA9IHRoaXMuZ2V0RGVmYXVsdFN0YXR1c1ZlcmlmaWNhdGlvbigpO1xuICAgICAgaWYgKHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5ICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5LmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZlcmlmaWNhdGlvbicpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoY3VycmVudCAmJiAhdmFsdWVzLmluY2x1ZGVzKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAoY29udHJvbCBhcyBGb3JtR3JvdXApLnBhdGNoVmFsdWUoeyB2ZXJpZmljYXRpb246IGRlZmF1bHRWZXJpZmljYXRpb24gfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1jb250YWluZXIgY3FhLWJnLVsjZmZmZmZmXSBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1wLVsxNnB4XSBjcWEtZ2FwLVsxMnB4XSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1vdmVyZmxvdy14LWhpZGRlbiBjcWEtYm94LWJvcmRlclwiPlxuXG4gIDxoMiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXRpdGxlIGNxYS1mb250LWludGVyIGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTAwJV0gY3FhLXRyYWNraW5nLW5vcm1hbCBjcWEtdGV4dC1bIzAwMDAwMF0gY3FhLW0tMFwiPlxuICAgIHt7IGVkaXRNb2RlID8gJ1VwZGF0ZSBBUEkgVGVzdCBTdGVwJyA6ICdDcmVhdGUgQVBJIFRlc3QgU3RlcCcgfX1cbiAgPC9oMj5cblxuICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW5kaWNhdG9yIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0wIGNxYS1tYXgtWzc2N3B4XTpjcWEtZmxleC13cmFwIGNxYS1tYXgtWzc2N3B4XTpjcWEtZ2FwLTIgY3FhLW1heC1bNzY3cHhdOmNxYS1qdXN0aWZ5LXN0YXJ0XCJcbiAgICBbY2xhc3MuY3FhLWp1c3RpZnktc3RhcnRdPVwic3RlcExhYmVscy5sZW5ndGggPT09IDFcIlxuICAgIFtjbGFzcy5jcWEtanVzdGlmeS1iZXR3ZWVuXT1cInN0ZXBMYWJlbHMubGVuZ3RoICE9PSAxXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3RlcCBvZiBzdGVwTGFiZWxzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIlxuICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvci1pdGVtIGNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvci1pdGVtLS1jbGlja2FibGUgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLVsxMHB4XSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWZvbnQtaW5oZXJpdCBjcWEtdGV4dC1pbmhlcml0IGNxYS10ZXh0LWxlZnQgIWNxYS1iZy10cmFuc3BhcmVudFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1N0ZXAgJyArIHN0ZXAuaW5kZXggKyAnOiAnICsgc3RlcC5sYWJlbFwiIFthdHRyLmFyaWEtcHJlc3NlZF09XCJzdGVwLmluZGV4ID09PSBjdXJyZW50U3RlcFwiXG4gICAgICAgIChjbGlja2VkKT1cInNldFN0ZXAoc3RlcC5pbmRleClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbmRpY2F0b3ItY2lyY2xlIGNxYS13LTggY3FhLWgtOCBjcWEtcm91bmRlZC1mdWxsIGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLWxlYWRpbmctbm9uZSBjcWEtYm9yZGVyLW5vbmUgY3FhLXNocmluay0wXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJzdGVwLmluZGV4ID09PSBjdXJyZW50U3RlcCA/ICdjcWEtYmctWyM0RjQ2RTVdIGNxYS10ZXh0LXdoaXRlJyA6ICdjcWEtYmctWyNFMEUwRTBdIGNxYS10ZXh0LVsjNjY2NjY2XSdcIj5cbiAgICAgICAgICB7eyBzdGVwLmluZGV4IH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbmRpY2F0b3ItbGFiZWwgY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtbWF4LVs3NjdweF06Y3FhLXRleHQteHNcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInN0ZXAuaW5kZXggPT09IGN1cnJlbnRTdGVwID8gJ2NxYS10ZXh0LVsjNEY0NkU1XScgOiAnY3FhLXRleHQtWyM2NjY2NjZdJ1wiPlxuICAgICAgICAgIHt7IHN0ZXAubGFiZWwgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaSA8IHN0ZXBMYWJlbHMubGVuZ3RoIC0gMVwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW5kaWNhdG9yLWxpbmUgY3FhLXctWzk2cHhdIGNxYS1oLVsycHhdIGNxYS1iZy1bI0UwRTBFMF0gY3FhLW15LTAgY3FhLW14LVs2cHhdIGNxYS1zaHJpbmstMCBjcWEtc2VsZi1jZW50ZXIgY3FhLW1heC1bNzY3cHhdOmNxYS13LVsyNHB4XSBjcWEtbWF4LVs3NjdweF06Y3FhLW14LTFcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2Rpdj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTdGVwIGNvbnRlbnQgdmlld3BvcnQ6IG9ubHkgdGhlIGFjdGl2ZSBzdGVwIGJvZHkgaXMgc2hvd24gKCpuZ0lmKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZpZXdwb3J0IGNxYS13LWZ1bGxcIj5cbiAgICA8IS0tIFN0ZXAgMTogRW52aXJvbm1lbnQsIHJlcXVlc3QsIGJvZHksIHJlc3BvbnNlIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50U3RlcCA9PT0gMVwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGFuZWwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNiBjcWEtYm94LWJvcmRlciBjcWEtdy1mdWxsXCI+XG4gICAgICAgIDwhLS0gRW52aXJvbm1lbnQgcm93OiBuZXcgbGluZSwgc2VsZWN0IGFsaWduZWQgcmlnaHQgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1lbnZpcm9ubWVudC1yb3cgY3FhLWZsZXggY3FhLWp1c3RpZnktZW5kIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0ICpuZ0lmPVwiZW52aXJvbm1lbnRGb3JtXCIgW2Zvcm1dPVwiZW52aXJvbm1lbnRGb3JtXCIgW2NvbmZpZ109XCJlbnZpcm9ubWVudFNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWVudmlyb25tZW50LXNlbGVjdCBjcWEtc2hyaW5rLTAgY3FhLXctYXV0byBjcWEtbWluLXctWzMxNXB4XSBjcWEtbWF4LXctWzMxNXB4XSBjcWEtbWF4LVs3NjdweF06Y3FhLW1pbi13LTAgY3FhLW1heC1bNzY3cHhdOmNxYS1tYXgtdy1mdWxsIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1mdWxsIFsmXy5tYXQtZm9ybS1maWVsZC13cmFwcGVyXTpjcWEtcGItMFwiIGFyaWEtbGFiZWw9XCJFbnZpcm9ubWVudFwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uRW52aXJvbm1lbnRTZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFJlcXVlc3Qgcm93OiBtZXRob2QsIFVSTCwgYnV0dG9ucyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXJlcXVlc3Qtcm93IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1mbGV4LXdyYXAgY3FhLW1heC1bNzY3cHhdOmNxYS1mbGV4LWNvbCBjcWEtbWF4LVs3NjdweF06Y3FhLWl0ZW1zLXN0cmV0Y2ggY3FhLW1heC1bNzY3cHhdOmNxYS1nYXAtMi41XCI+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdJZj1cIm1ldGhvZEZvcm1cIiBbZm9ybV09XCJtZXRob2RGb3JtXCIgW2NvbmZpZ109XCJtZXRob2RTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1tZXRob2Qtc2VsZWN0IGNxYS1zaHJpbmstMCBjcWEtdy1hdXRvIGNxYS1taW4tdy1bMTUycHhdIGNxYS1tYXgtdy1bMTUycHhdIGNxYS1tYXgtWzc2N3B4XTpjcWEtbWluLXctMCBjcWEtbWF4LVs3NjdweF06Y3FhLW1heC13LWZ1bGwgY3FhLW1heC1bNzY3cHhdOmNxYS13LWZ1bGxcIiBhcmlhLWxhYmVsPVwiSFRUUCBtZXRob2RcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbk1ldGhvZFNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXVybC13cmFwIGNxYS1mbGV4LTEgY3FhLW1pbi13LVsyMDBweF0gY3FhLW1heC1bNzY3cHhdOmNxYS1taW4tdy0wIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1mdWxsIFsmX2NxYS1jdXN0b20taW5wdXRfLmNxYS1yZWxhdGl2ZV9pbnB1dF06Y3FhLWgtWzQwcHhdIFsmX2NxYS1jdXN0b20taW5wdXRfLmNxYS1yZWxhdGl2ZV9pbnB1dF06Y3FhLWJnLXdoaXRlIFsmX2NxYS1jdXN0b20taW5wdXRfLmNxYS1yZWxhdGl2ZV9pbnB1dF06Y3FhLWJvcmRlciBbJl9jcWEtY3VzdG9tLWlucHV0Xy5jcWEtcmVsYXRpdmVfaW5wdXRdOmNxYS1ib3JkZXItc29saWQgWyZfY3FhLWN1c3RvbS1pbnB1dF8uY3FhLXJlbGF0aXZlX2lucHV0XTpjcWEtYm9yZGVyLVsjRDFENURCXSBbJl9jcWEtY3VzdG9tLWlucHV0Xy5jcWEtcmVsYXRpdmVfaW5wdXRdOmNxYS1yb3VuZGVkLW1kIFsmX2NxYS1jdXN0b20taW5wdXRfLmNxYS1yZWxhdGl2ZV9pbnB1dF06Y3FhLXRleHQtc20gWyZfY3FhLWN1c3RvbS1pbnB1dF8uY3FhLXJlbGF0aXZlX2lucHV0XTpjcWEtdGV4dC1bIzM3NDE1MV1cIj5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFsodmFsdWUpXT1cInVybFwiIFtsYWJlbF09XCInJ1wiIHBsYWNlaG9sZGVyPVwiXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cIm1kXCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXRyaWdnZXIgY3FhLWNvbnRlbnRzIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1mdWxsIGNxYS1tYXgtWzc2N3B4XTohY3FhLWZsZXhcIiAoY2xpY2spPVwib3BlbkltcG9ydEN1cmxQYW5lbCgpXCI+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIkltcG9ydCBBUEkgY1VSTFwiXG4gICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYnRuLW91dGxpbmUgIWNxYS1iZy13aGl0ZSAhY3FhLWJvcmRlciAhY3FhLWJvcmRlci1zb2xpZCAhY3FhLWJvcmRlci1bIzZCNzI4MF0gY3FhLXRleHQtWyM0MTQxNDZdIGNxYS1mb250LWludGVyIGNxYS10ZXh0LVsxNHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTAwJV0gY3FhLXRyYWNraW5nLW5vcm1hbCBob3ZlcjohY3FhLWJnLVsjRjlGQUZCXSBob3ZlcjohY3FhLXRleHQtWyM0MTQxNDZdIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJTZW5kIFJlcXVlc3RcIiAoY2xpY2tlZCk9XCJvblNlbmRSZXF1ZXN0KClcIlxuICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1idG4tcHJpbWFyeSBjcWEtZm9udC1pbnRlciBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzEwMCVdIGNxYS10cmFja2luZy1ub3JtYWwgIWNxYS1iZy1bIzNGNDNFRV0gY3FhLXRleHQtWyNGQkZDRkZdICFjcWEtYm9yZGVyLW5vbmUgY3FhLXB5LTIuNSBjcWEtcHgtNiBjcWEtZ2FwLTIgY3FhLXJvdW5kZWQtbGcgY3FhLW1pbi1oLVszN3B4XSBjcWEtYm94LWJvcmRlciBob3ZlcjohY3FhLWJnLVsjMUIxRkVCXSBjcWEtbWF4LVs3NjdweF06Y3FhLXctZnVsbFwiPlxuICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cblxuXG4gICAgICAgIDwhLS0gQm9keSBjb250ZW50OiBoZWFkZXIgc2VjdGlvbiAoZGVmYXVsdCkgT1IgaW1wb3J0IGNVUkwgc2VjdGlvbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJvZHlWaWV3ID09PSAnaW1wb3J0LWN1cmwnXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXBhbmVsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1zaGFkb3ctWzBfMXB4XzNweF9yZ2JhKDAsMCwwLDAuMDgpXSBjcWEtb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtaGVhZGVyIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcHktMyBjcWEtcHgtNSBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtYmctWyNGOUZBRkJdIGNxYS1yb3VuZGVkLXQtbGcgY3FhLW1heC1bNzY3cHhdOmNxYS1weC00XCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXRpdGxlIGNxYS1tLTAgY3FhLXRleHQteHMgY3FhLWZvbnQtYm9sZCBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRleHQtWyMzNzQxNTFdXCI+SW1wb3J0IEFQSSBjVVJMPC9oMz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXNlcGFyYXRvciBjcWEtaC1weCBjcWEtYmctWyNFMkU4RjBdIGNxYS1teS0wIGNxYS1teC01XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtYm9keVwiPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYSBbdmFsdWVdPVwiaW1wb3J0Q3VybENvbnRyb2wudmFsdWVcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJpbXBvcnRDdXJsQ29udHJvbC5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBhc3RlIHlvdXIgY1VSTCBjb21tYW5kIGhlcmUgKGUuZy4sIGN1cmwgLVggUE9TVCBodHRwczovL2FwaS5leGFtcGxlLmNvbS91c2VycylcIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFtyb3dzXT1cIjhcIiByZXNpemU9XCJ2ZXJ0aWNhbFwiIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC10ZXh0YXJlYVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJDYW5jZWxcIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtYnRuLWNhbmNlbFwiIChjbGlja2VkKT1cIm9uQ2FuY2VsSW1wb3J0Q3VybCgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJJbXBvcnRcIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtYnRuLWltcG9ydFwiIChjbGlja2VkKT1cIm9uSW1wb3J0Q3VybENvbmZpcm0oKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYm9keVZpZXcgPT09ICdoZWFkZXJzJ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10YWJzLXdyYXBwZXIgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXRhYnNcIj5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gKm5nRm9yPVwibGV0IHRhYiBvZiBwYXlsb2FkVGFic1wiIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFt0ZXh0XT1cInRhYi5sYWJlbFwiXG4gICAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC10YWInICsgKGFjdGl2ZVBheWxvYWRUYWIgPT09IHRhYi52YWx1ZSA/ICcgY3FhLWFwaS1lZGl0LXN0ZXAtdGFiLS1hY3RpdmUnIDogJycpICsgKGlzTWV0aG9kV2l0aG91dEJvZHkgJiYgKHRhYi52YWx1ZSA9PT0gJ2JvZHknIHx8IHRhYi52YWx1ZSA9PT0gJ3BhcmFtcycpID8gJyBjcWEtYXBpLWVkaXQtc3RlcC10YWItLWRpc2FibGVkJyA6ICcnKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTWV0aG9kV2l0aG91dEJvZHkgJiYgKHRhYi52YWx1ZSA9PT0gJ2JvZHknIHx8IHRhYi52YWx1ZSA9PT0gJ3BhcmFtcycpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJzZXRQYXlsb2FkVGFiKHRhYi52YWx1ZSlcIj5cbiAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gUGF5bG9hZCBjb250ZW50IChBdXRob3JpemF0aW9uKSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVQYXlsb2FkVGFiID09PSAnYXV0aG9yaXphdGlvbidcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWRcIlxuICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCIncGFkZGluZzogMjBweDsgbWluLWhlaWdodDogMjAwcHg7J1wiPlxuICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDIwcHg7J1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogOHB4OyB3aWR0aDogZml0LWNvbnRlbnQ7J1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC13ZWlnaHQ6IDYwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsgY29sb3I6ICM2QjcyODA7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5BVVRIIFRZUEU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0ICpuZ0lmPVwiYXV0aFR5cGVGb3JtXCIgW2Zvcm1dPVwiYXV0aFR5cGVGb3JtXCIgW2NvbmZpZ109XCJhdXRoVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYXV0aC10eXBlLXNlbGVjdFwiIGFyaWEtbGFiZWw9XCJBdXRoIHR5cGVcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInbWluLXdpZHRoOiAxNjBweDsnXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIE5vIEF1dGg6IGNlbnRlcmVkIG1lc3NhZ2UgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkQXV0aFR5cGUgPT09ICduby1hdXRoJ1wiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInZmxleDogMTsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGdhcDogMTJweDsgbWluLXdpZHRoOiAwOyB0ZXh0LWFsaWduOiBjZW50ZXI7J1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInd2lkdGg6IDQ4cHg7IGhlaWdodDogNDhweDsgYm9yZGVyLXJhZGl1czogMTBweDsgYmFja2dyb3VuZDogI0YzRjRGNjsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGZsZXgtc2hyaW5rOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jaztcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNVwiIHk9XCIxMVwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIyXCIgcng9XCIxXCIgZmlsbD1cIiM5Q0EzQUZcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxNnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPk5vIEF1dGg8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgZ2FwOiA2cHg7IGZsZXgtd3JhcDogd3JhcDsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA0MDA7IGNvbG9yOiAjOUNBM0FGOyBsaW5lLWhlaWdodDogMS40OydcIj5UaGlzIHJlcXVlc3QgZG9lcyBub3QgdXNlIGFueSBhdXRob3JpemF0aW9uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gcm9sZT1cImltZ1wiIGFyaWEtbGFiZWw9XCJNb3JlIGluZm9ybWF0aW9uXCIgdGl0bGU9XCJUaGlzIHJlcXVlc3QgZG9lcyBub3QgdXNlIGFueSBhdXRob3JpemF0aW9uLlwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgd2lkdGg6IDE4cHg7IGhlaWdodDogMThweDsgY29sb3I6ICM5Q0EzQUY7IGZsZXgtc2hyaW5rOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiN1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOCA3djRNOCA1di41XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gQmVhcmVyIFRva2VuOiBUb2tlbiBsYWJlbCArIHRleHRhcmVhIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEF1dGhUeXBlID09PSAnYmVhcmVyJ1wiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInZmxleDogMTsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxMHB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5Ub2tlbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRleHRhcmVhIFsodmFsdWUpXT1cImJlYXJlclRva2VuXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBiZWFyZXIgdG9rZW5cIlxuICAgICAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIiBbcm93c109XCI2XCIgcmVzaXplPVwidmVydGljYWxcIiBzaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWF1dGgtdG9rZW4tdGV4dGFyZWFcIiBhcmlhTGFiZWw9XCJCZWFyZXIgdG9rZW5cIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS10ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIE9BdXRoIDIuMDogR3JhbnQgVHlwZSwgQWNjZXNzIFRva2VuIFVSTCwgQ2xpZW50IElELCBDbGllbnQgU2VjcmV0LCBTY29wZSwgQ2xpZW50IEF1dGhlbnRpY2F0aW9uIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEF1dGhUeXBlID09PSAnb2F1dGgyJyAmJiBvYXV0aDJGb3JtXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtb2F1dGgyLWdyaWRcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsgZ2FwOiAxNnB4IDI0cHg7IHdpZHRoOiAxMDAlOydcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPkdyYW50IFR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgKm5nSWY9XCJvYXV0aDJGb3JtXCIgW2Zvcm1dPVwib2F1dGgyRm9ybVwiIFtjb25maWddPVwib2F1dGgyR3JhbnRUeXBlU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWF1dGgtb2F1dGgtc2VsZWN0XCIgYXJpYS1sYWJlbD1cIk9BdXRoIGdyYW50IHR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0eWxlXT1cIidtaW4td2lkdGg6IDA7IHdpZHRoOiAxMDAlOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDExcHg7IGZvbnQtc3R5bGU6IGl0YWxpYzsgY29sb3I6ICM2QjcyODA7IGxpbmUtaGVpZ2h0OiAxLjM7J1wiPk9BdXRoIGdyYW50IHR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPkFjY2VzcyBUb2tlbiBVUkw8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJvYXV0aDJGb3JtLmdldCgnYWNjZXNzVG9rZW5VcmwnKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvYXV0aDJGb3JtLmdldCgnYWNjZXNzVG9rZW5VcmwnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicnXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBPQXV0aCB0b2tlbiBlbmRwb2ludFwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiQWNjZXNzIFRva2VuIFVSTFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDExcHg7IGZvbnQtc3R5bGU6IGl0YWxpYzsgY29sb3I6ICM2QjcyODA7IGxpbmUtaGVpZ2h0OiAxLjM7J1wiPk9BdXRoIHRva2VuIGVuZHBvaW50PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDsgbWluLXdpZHRoOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5DbGllbnQgSUQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJvYXV0aDJGb3JtLmdldCgnY2xpZW50SWQnKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvYXV0aDJGb3JtLmdldCgnY2xpZW50SWQnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicnXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBPQXV0aCBjbGllbnQgaWRlbnRpZmllclwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiQ2xpZW50IElEXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC1zdHlsZTogaXRhbGljOyBjb2xvcjogIzZCNzI4MDsgbGluZS1oZWlnaHQ6IDEuMzsnXCI+T0F1dGggY2xpZW50IGlkZW50aWZpZXI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPkNsaWVudCBTZWNyZXQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJvYXV0aDJGb3JtLmdldCgnY2xpZW50U2VjcmV0Jyk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib2F1dGgyRm9ybS5nZXQoJ2NsaWVudFNlY3JldCcpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicGFzc3dvcmRcIiBbbGFiZWxdPVwiJydcIiBwbGFjZWhvbGRlcj1cIkVudGVyIE9BdXRoIGNsaWVudCBzZWNyZXRcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIkNsaWVudCBTZWNyZXRcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMXB4OyBmb250LXN0eWxlOiBpdGFsaWM7IGNvbG9yOiAjNkI3MjgwOyBsaW5lLWhlaWdodDogMS4zOydcIj5PQXV0aCBjbGllbnQgc2VjcmV0PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDsgbWluLXdpZHRoOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5TY29wZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cIm9hdXRoMkZvcm0uZ2V0KCdzY29wZScpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9hdXRoMkZvcm0uZ2V0KCdzY29wZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJydcIiBwbGFjZWhvbGRlcj1cIkVudGVyIHNwYWNlLXNlcGFyYXRlZCBzY29wZXNcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIlNjb3BlXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC1zdHlsZTogaXRhbGljOyBjb2xvcjogIzZCNzI4MDsgbGluZS1oZWlnaHQ6IDEuMzsnXCI+U3BhY2Utc2VwYXJhdGVkIHNjb3Blczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBbYXR0ci5zdHlsZV09XCInZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA2cHg7IG1pbi13aWR0aDogMDsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMzc0MTUxOyBsaW5lLWhlaWdodDogMS4yNTsnXCI+Q2xpZW50IEF1dGhlbnRpY2F0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0ICpuZ0lmPVwib2F1dGgyRm9ybVwiIFtmb3JtXT1cIm9hdXRoMkZvcm1cIiBbY29uZmlnXT1cIm9hdXRoMkNsaWVudEF1dGhTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYXV0aC1vYXV0aC1zZWxlY3RcIiBhcmlhLWxhYmVsPVwiQ2xpZW50IGF1dGhlbnRpY2F0aW9uIG1ldGhvZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ21pbi13aWR0aDogMDsgd2lkdGg6IDEwMCU7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC1zdHlsZTogaXRhbGljOyBjb2xvcjogIzZCNzI4MDsgbGluZS1oZWlnaHQ6IDEuMzsnXCI+Q2xpZW50IGF1dGhlbnRpY2F0aW9uIG1ldGhvZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFBheWxvYWQgY29udGVudCAoSGVhZGVycykgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlUGF5bG9hZFRhYiA9PT0gJ2hlYWRlcnMnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXJzLWdyaWRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWhlYWRlcnMtbGFiZWxcIj5IZWFkZXIgTmFtZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWhlYWRlcnMtbGFiZWxcIj5IZWFkZXIgVmFsdWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXJzLWxhYmVsIGNxYS1hcGktZWRpdC1zdGVwLWhlYWRlcnMtbGFiZWwtLWVtcHR5XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBoZWFkZXJSb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5SGVhZGVyXCIgW2Zvcm1Hcm91cF09XCJyb3dcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwicm93XCIgW2NvbmZpZ109XCJoZWFkZXJOYW1lU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgIChhZGRDdXN0b21WYWx1ZSk9XCJvbkhlYWRlck5hbWVBZGRDdXN0b21WYWx1ZSgkZXZlbnQsIHJvdylcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXItdHlwZS1zZWxlY3QgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXItdmFsdWUtaW5wdXRcIiBhcmlhTGFiZWw9XCJIZWFkZXIgdmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXItZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInUmVtb3ZlIGhlYWRlcidcIiAoY2xpY2tlZCk9XCJyZW1vdmVIZWFkZXIoaSlcIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXItZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0Y5QkZCRlwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYWRkLWhlYWRlci13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgdGV4dD1cIisgQWRkIEhlYWRlclwiXG4gICAgICAgICAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLWFkZC1oZWFkZXItbGluaydcIiAoY2xpY2tlZCk9XCJhZGRIZWFkZXIoKVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBQYXlsb2FkIGNvbnRlbnQgKFBhcmFtcyk6IEtleeKAk1ZhbHVlIHRhYmxlIHdpdGggYWRkL2RlbGV0ZSByb3dzIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVBheWxvYWRUYWIgPT09ICdwYXJhbXMnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtZ3JpZCBjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWxcIj5LZXk8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWxcIj5WYWx1ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1sYWJlbCBjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWwtLWVtcHR5XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBwYXJhbXNSb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5UGFyYW1zXCIgW2Zvcm1Hcm91cF09XCJyb3dcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCdrZXknKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2tleScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJLZXlcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtaW5wdXRcIiBhcmlhTGFiZWw9XCJLZXlcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJyb3cuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJWYWx1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIlZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSByb3cnXCIgKGNsaWNrZWQpPVwicmVtb3ZlUGFyYW1zUm93KGkpXCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWRlbGV0ZS1pY29uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNjY2MyA2VjEyLjY2NjdINS4zMzMwMVY2SDEwLjY2NjNaTTkuNjY2MzQgMkg2LjMzMzAxTDUuNjY2MzQgMi42NjY2N0gzLjMzMzAxVjRIMTIuNjY2M1YyLjY2NjY3SDEwLjMzM0w5LjY2NjM0IDJaTTExLjk5OTcgNC42NjY2N0gzLjk5OTY3VjEyLjY2NjdDMy45OTk2NyAxMy40IDQuNTk5NjcgMTQgNS4zMzMwMSAxNEgxMC42NjYzQzExLjM5OTcgMTQgMTEuOTk5NyAxMy40IDExLjk5OTcgMTIuNjY2N1Y0LjY2NjY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1hZGQtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIisgQWRkIFJvd1wiXG4gICAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1hZGQtYnRuXCIgKGNsaWNrZWQpPVwiYWRkUGFyYW1zUm93KClcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gUGF5bG9hZCBjb250ZW50IChCb2R5IG9ubHkpOiB0eXBlLCBmb3JtYXQsIHRleHQgYXJlYSwgQmFjay9OZXh0IC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVBheWxvYWRUYWIgPT09ICdib2R5J1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZCBjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWVkaXRvclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10eXBlLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10eXBlLWxhYmVsXCI+VHlwZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10eXBlLXJhZGlvc1wiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2wgW3ZhbHVlXT1cInBheWxvYWRUeXBlXCIgW3NlZ21lbnRzXT1cInBheWxvYWRUeXBlU2VnbWVudHNcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25QYXlsb2FkVHlwZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXR5cGUtc2VnbWVudFwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwYXlsb2FkVHlwZSA9PT0gJ3JhdydcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtZm9ybWF0LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1mb3JtYXQtbGFiZWxcIj5Gb3JtYXQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdJZj1cInBheWxvYWRGb3JtYXRGb3JtXCIgW2Zvcm1dPVwicGF5bG9hZEZvcm1hdEZvcm1cIlxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cInBheWxvYWRGb3JtYXRTZWxlY3RDb25maWdcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtZm9ybWF0LXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGb3JtYXRcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPCEtLSBSYXc6IHRleHQgYXJlYSB3aXRoIGxpbmUgbnVtYmVycyAoUG9zdG1hbi1zdHlsZSBwYXlsb2FkIGJvZHkpIC0tPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGF5bG9hZFR5cGUgPT09ICdyYXcnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWJvZHlcIiAjcGF5bG9hZEVkaXRvcldpdGhMaW5lc1JlZj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1lZGl0b3Itd2l0aC1saW5lc1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtbGluZS1udW1iZXJzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBuIG9mIHBheWxvYWRMaW5lTnVtYmVyc1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1saW5lLW51bVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicGF5bG9hZEpzb25FcnJvciAmJiBwYXlsb2FkSnNvbkVycm9yLmxpbmUgPT09IG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWxpbmUtZXJyb3ItaWNvblwiIFt0aXRsZV09XCJwYXlsb2FkSnNvbkVycm9yVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUGFyc2UgZXJyb3Igb24gdGhpcyBsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjdcIiBjeT1cIjdcIiByPVwiNlwiIGZpbGw9XCIjRUY0NDQ0XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNGw2IDZNMTAgNGwtNiA2XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1saW5lLW51bS10ZXh0XCI+e3sgbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10ZXh0YXJlYS1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXRleHRhcmVhIGNxYS13LWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1taW4taC0wXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdGV4dGFyZWEtLWVycm9yJzogcGF5bG9hZEpzb25FcnJvcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgI3BheWxvYWRUZXh0YXJlYVJlZlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXRleHRhcmVhLWlucHV0IGNxYS13LWZ1bGwgY3FhLW91dGxpbmUtbm9uZSBjcWEtYm94LWJvcmRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdGV4dGFyZWEtaW5wdXQtLWVycm9yJzogcGF5bG9hZEpzb25FcnJvcn1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInBheWxvYWRUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1BheWxvYWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCIhIXBheWxvYWRKc29uRXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uUGF5bG9hZElucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25QYXlsb2FkS2V5ZG93bigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cInBheWxvYWRKc29uRXJyb3JcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtanNvbi1lcnJvci1tc2dcIj5cbiAgICAgICAgICAgICAgICAgIEludmFsaWQgSlNPTiBmb3JtYXQuIFBsZWFzZSBjaGVjayB5b3VyIHN5bnRheC5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0geC13d3ctZm9ybS11cmxlbmNvZGVkOiBLZXnigJNWYWx1ZSByb3dzLCBhZGQvcmVtb3ZlIGR5bmFtaWNhbGx5IC0tPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGF5bG9hZFR5cGUgPT09ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWdyaWQgY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWxcIj5LZXk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1sYWJlbFwiPlZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWwgY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2Yga2V5VmFsdWVSb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5S2V5VmFsdWVcIiBbZm9ybUdyb3VwXT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCdrZXknKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgna2V5Jyk/LnNldFZhbHVlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIktleVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiS2V5XCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgndmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIlZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1kZWxldGUnXCJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSByb3cnXCIgKGNsaWNrZWQpPVwicmVtb3ZlS2V5VmFsdWVSb3coaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1kZWxldGUtaWNvblwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwLjY2NjMgNlYxMi42NjY3SDUuMzMzMDFWNkgxMC42NjYzWk05LjY2NjM0IDJINi4zMzMwMUw1LjY2NjM0IDIuNjY2NjdIMy4zMzMwMVY0SDEyLjY2NjNWMi42NjY2N0gxMC4zMzNMOS42NjYzNCAyWk0xMS45OTk3IDQuNjY2NjdIMy45OTk2N1YxMi42NjY3QzMuOTk5NjcgMTMuNCA0LjU5OTY3IDE0IDUuMzMzMDEgMTRIMTAuNjY2M0MxMS4zOTk3IDE0IDExLjk5OTcgMTMuNCAxMS45OTk3IDEyLjY2NjdWNC42NjY2N1pcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWFkZC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCIrIEFkZCBSb3dcIlxuICAgICAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1hZGQtYnRuXCIgKGNsaWNrZWQpPVwiYWRkS2V5VmFsdWVSb3coKVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIEZvcm0gRGF0YTogS2V54oCTVHlwZeKAk1ZhbHVlIHJvd3M7IFR5cGUgaXMgYSBkcm9wZG93biAoVGV4dC9GaWxlKSwgYWRkL3JlbW92ZSBkeW5hbWljYWxseSAtLT5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBheWxvYWRUeXBlID09PSAnZm9ybS1kYXRhJ1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsXCI+S2V5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1sYWJlbFwiPlR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsXCI+VmFsdWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsIGNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2Yga2V5VHlwZVZhbHVlUm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUtleVR5cGVWYWx1ZVwiIFtmb3JtR3JvdXBdPVwicm93XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtcm93XCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgna2V5Jyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2tleScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJLZXlcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiS2V5XCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cInJvd1wiIFtjb25maWddPVwia2V5VHlwZVZhbHVlVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtdHlwZS1zZWxlY3QgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgndmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidSZW1vdmUgcm93J1wiIChjbGlja2VkKT1cInJlbW92ZUtleVR5cGVWYWx1ZVJvdyhpKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjlCRkJGXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWFkZC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCIrIEFkZCBSb3dcIlxuICAgICAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWFkZC1idG5cIiAoY2xpY2tlZCk9XCJhZGRLZXlUeXBlVmFsdWVSb3coKVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwvZGl2PlxuICAgIDwhLS0gU3RlcCAyOiBWYXJpYWJsZSBOYW1lOiBpbnB1dCwgdmFsaWRhdGlvbiwgQmFjayAvIE5leHQgLS0+XG4gICAgPGRpdiAqbmdJZj1cImN1cnJlbnRTdGVwID09PSAyXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYW5lbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC02IGNxYS1ib3gtYm9yZGVyIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZhcmlhYmxlLXNlY3Rpb25cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmFyaWFibGUtaW5wdXQtd3JhcFwiPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgWyh2YWx1ZSldPVwidmFyaWFibGVOYW1lXCIgW2xhYmVsXT1cIicnXCIgcGxhY2Vob2xkZXI9XCJWYXJpYWJsZSBOYW1lXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgc2l6ZT1cIm1kXCIgKHZhbHVlQ2hhbmdlKT1cIm9uVmFyaWFibGVOYW1lQ2hhbmdlKClcIiBhcmlhLWxhYmVsPVwiVmFyaWFibGUgTmFtZVwiPlxuICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwICpuZ0lmPVwidmFyaWFibGVOYW1lRXJyb3JcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZhcmlhYmxlLWVycm9yXCIgcm9sZT1cImFsZXJ0XCI+e3sgdmFyaWFibGVOYW1lRXJyb3IgfX08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gU3RlcCAzOiBSZXNwb25zZSBCb2R5IC8gU3RhdHVzIHRhYnMgLS0+XG4gICAgPGRpdiAqbmdJZj1cImN1cnJlbnRTdGVwID09PSAzXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYW5lbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC02IGNxYS1ib3gtYm9yZGVyIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXRhYnMtd3JhcHBlciBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXRhYnNcIj5cbiAgICAgICAgICAgIDxjcWEtYnV0dG9uICpuZ0Zvcj1cImxldCB0YWIgb2YgcmVzcG9uc2VWZXJpZmljYXRpb25UYWJzXCIgdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgW3RleHRdPVwidGFiLmxhYmVsXCJcbiAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC10YWInICsgKGFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiID09PSB0YWIudmFsdWUgPyAnIGNxYS1hcGktZWRpdC1zdGVwLXRhYi0tYWN0aXZlJyA6ICcnKVwiXG4gICAgICAgICAgICAgIChjbGlja2VkKT1cInNldFJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiKHRhYi52YWx1ZSlcIj5cbiAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gUmVzcG9uc2UgQm9keSB0YWIgY29udGVudDogdmVyaWZpY2F0aW9uIGdyaWQgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiID09PSAncmVzcG9uc2UtYm9keSdcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXN0ZXAzLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24taGVhZGVyLXJvdyBjcWEtZmxleCBjcWEtZmxleC1yb3cgY3FhLWp1c3RpZnktZW5kIGNxYS1pdGVtcy1jZW50ZXIgY3FhLXB0LTAgY3FhLXByLTAgY3FhLXBiLTIgY3FhLXBsLTBcIj5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiB0ZXh0PVwiQWRkIFZlcmlmaWNhdGlvblwiXG4gICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tYWRkLWxpbmtcIiAoY2xpY2tlZCk9XCJhZGRWZXJpZmljYXRpb25Sb3coKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb25cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1ncmlkIGNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1ncmlkLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsXCI+Uy5ubzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPkpTT04gUGF0aDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPlZlcmlmaWNhdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPkRhdGEgVHlwZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPkV4cGVjdGVkIFZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsIGNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbC0tZW1wdHlcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIHZlcmlmaWNhdGlvblJvd3M7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlWZXJpZmljYXRpb25cIiBbZm9ybUdyb3VwXT1cInJvd1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tcm93XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tc25vXCI+e3sgaSArIDEgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ2pzb25QYXRoJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJyb3cuZ2V0KCdqc29uUGF0aCcpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJKc29uIFBhdGhcIiBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24taW5wdXRcIiBhcmlhTGFiZWw9XCJKU09OIFBhdGhcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJyb3dcIiBbY29uZmlnXT1cInZlcmlmaWNhdGlvblNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1zZWxlY3QgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwicm93XCIgW2NvbmZpZ109XCJ2ZXJpZmljYXRpb25EYXRhVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1zZWxlY3QgY3FhLXctZnVsbFwiXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uVmVyaWZpY2F0aW9uRGF0YVR5cGVDaGFuZ2Uocm93LCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPCEtLSBFeHBlY3RlZCBWYWx1ZTogdGV4dCBmb3IgU3RyaW5nL0FycmF5L09iamVjdCwgbnVtYmVyIGZvciBOdW1iZXIsIGRyb3Bkb3duIGZvciBCb29sZWFuIC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInJvdy5nZXQoJ2RhdGFUeXBlJyk/LnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0ICpuZ1N3aXRjaENhc2U9XCInYm9vbGVhbidcIiBbZm9ybV09XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cInZlcmlmaWNhdGlvbkV4cGVjdGVkVmFsdWVCb29sZWFuU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tc2VsZWN0IGNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1leHBlY3RlZC1zZWxlY3QgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIiBbdmFsdWVdPVwicm93LmdldCgnZXhwZWN0ZWRWYWx1ZScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJyb3cuZ2V0KCdleHBlY3RlZFZhbHVlJyk/LnNldFZhbHVlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIkV4cGVjdGVkIFZhbHVlIChudW1iZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWlucHV0IGNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1leHBlY3RlZC1udW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJFeHBlY3RlZCBWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgKm5nU3dpdGNoRGVmYXVsdCBbdmFsdWVdPVwicm93LmdldCgnZXhwZWN0ZWRWYWx1ZScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJyb3cuZ2V0KCdleHBlY3RlZFZhbHVlJyk/LnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkV4cGVjdGVkIFZhbHVlIGluIFN0cmluZ1wiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWlucHV0XCIgYXJpYUxhYmVsPVwiRXhwZWN0ZWQgVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1kZWxldGUnXCJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidSZW1vdmUgcm93J1wiIChjbGlja2VkKT1cInJlbW92ZVZlcmlmaWNhdGlvblJvdyhpKVwiPlxuICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1kZWxldGUtaWNvblwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwLjY2NjMgNlYxMi42NjY3SDUuMzMzMDFWNkgxMC42NjYzWk05LjY2NjM0IDJINi4zMzMwMUw1LjY2NjM0IDIuNjY2NjdIMy4zMzMwMVY0SDEyLjY2NjNWMi42NjY2N0gxMC4zMzNMOS42NjYzNCAyWk0xMS45OTk3IDQuNjY2NjdIMy45OTk2N1YxMi42NjY3QzMuOTk5NjcgMTMuNCA0LjU5OTY3IDE0IDUuMzMzMDEgMTRIMTAuNjY2M0MxMS4zOTk3IDE0IDExLjk5OTcgMTMuNCAxMS45OTk3IDEyLjY2NjdWNC42NjY2N1pcIlxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjlCRkJGXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gU3RhdHVzIHRhYiBjb250ZW50OiBTLm5vLCBWZXJpZmljYXRpb24gZHJvcGRvd24sIEV4cGVjdGVkIFZhbHVlLCBhZGQvcmVtb3ZlIHJvd3MgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiID09PSAnc3RhdHVzJ1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtc3RlcDMtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1oZWFkZXItcm93IGNxYS1mbGV4IGNxYS1mbGV4LXJvdyBjcWEtanVzdGlmeS1lbmQgY3FhLWl0ZW1zLWNlbnRlciBjcWEtcHQtMCBjcWEtcHItMCBjcWEtcGItMiBjcWEtcGwtMFwiPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIHRleHQ9XCJBZGQgVmVyaWZpY2F0aW9uXCJcbiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1hZGQtbGlua1wiIChjbGlja2VkKT1cImFkZFN0YXR1c1ZlcmlmaWNhdGlvblJvdygpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXN0YXR1cy12ZXJpZmljYXRpb25cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXN0YXR1cy12ZXJpZmljYXRpb24taGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5TLm5vPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsXCI+VmVyaWZpY2F0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsXCI+RXhwZWN0ZWQgVmFsdWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWwgY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2Ygc3RhdHVzVmVyaWZpY2F0aW9uUm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeVN0YXR1c1ZlcmlmaWNhdGlvblwiXG4gICAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJyb3dcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXN0YXR1cy12ZXJpZmljYXRpb24tcm93XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tc25vXCI+e3sgaSArIDEgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJyb3dcIiBbY29uZmlnXT1cInN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXN0YXR1cy12ZXJpZmljYXRpb24tc2VsZWN0IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgnZXhwZWN0ZWRWYWx1ZScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgnZXhwZWN0ZWRWYWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJFeHBlY3RlZCBWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cInNtXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24taW5wdXRcIlxuICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiRXhwZWN0ZWQgVmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInUmVtb3ZlIHJvdydcIiAoY2xpY2tlZCk9XCJyZW1vdmVTdGF0dXNWZXJpZmljYXRpb25Sb3coaSlcIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0Y5QkZCRlwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIFJlc3BvbnNlIFByZXZpZXcgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1yZXNwb25zZVwiPlxuICAgIDxoMyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXJlc3BvbnNlLXRpdGxlIGNxYS10ZXh0LVsxNHB4XSBjcWEtZm9udC1ib2xkIGNxYS1sZWFkaW5nLVsyMHB4XSBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMCBjcWEtbWItWzEycHhdIGNxYS1zaHJpbmstMFwiPlJlc3BvbnNlIFByZXZpZXc8L2gzPlxuICAgIDxwcmUgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1yZXNwb25zZS1jb250ZW50XCI+e3sgcmVzcG9uc2VQcmV2aWV3IH19PC9wcmU+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU3RlcCBhY3Rpb25zOiBvbmUgcm93LCBmdWxsIHdpZHRoLiBTdGVwIDE6IENhbmNlbCArIE5leHQ7IFN0ZXAgMjogQmFjayArIE5leHQ7IFN0ZXAgMzogQmFjayArIENyZWF0ZSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnNcIj5cbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjdXJyZW50U3RlcFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiMVwiPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIkNhbmNlbFwiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1jYW5jZWxcIiAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiTmV4dFwiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1uZXh0XCIgKGNsaWNrZWQpPVwib25OZXh0KClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIyXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiQmFja1wiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1iYWNrXCIgKGNsaWNrZWQpPVwib25CYWNrKClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJOZXh0XCJcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnMtYnRuLW5leHRcIiAoY2xpY2tlZCk9XCJvbk5leHQoKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIjNcIj5cbiAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJCYWNrXCJcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnMtYnRuLWJhY2tcIiAoY2xpY2tlZCk9XCJvbkJhY2soKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiZWRpdE1vZGUgPyAnVXBkYXRlJyA6ICdDcmVhdGUnXCJcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWFjdGlvbnMtYnRuLWNyZWF0ZVwiIChjbGlja2VkKT1cIm9uQ3JlYXRlKClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+Il19
1781
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1lZGl0LXN0ZXAvYXBpLWVkaXQtc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1lZGl0LXN0ZXAvYXBpLWVkaXQtc3RlcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBZSxXQUFXLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFJaEYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUc7SUFDbEMsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyxjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLFVBQVUsRUFBRSxZQUFZO0NBQ2hCLENBQUM7QUEwRlgsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFFdkQsOEVBQThFO0FBQzlFLE1BQU0sd0JBQXdCLEdBQTJCLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBVXBHLFNBQVMsYUFBYSxDQUFDLEVBQVU7SUFDL0IsT0FBTyxFQUFFLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxRQUFRLElBQUksRUFBRSxLQUFLLFFBQVEsQ0FBQztBQUMxRCxDQUFDO0FBQ0QsU0FBUyxhQUFhLENBQUMsRUFBVTtJQUMvQixPQUFPLEVBQUUsS0FBSyxHQUFHLElBQUksRUFB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S0FBSztnQkFzR0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQThDRywyQkFBMkI7c0JBQW5DLEtBQUs7Z0JBZ0VHLHlCQUF5QjtzQkFBakMsS0FBSztnQkFzREcseUJBQXlCO3NCQUFqQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcblxuZXhwb3J0IGNvbnN0IEFQSV9FRElUX1NURVBfTEFCRUxTID0ge1xuICBSRVFVRVNUX0RFVEFJTFM6ICdSZXF1ZXN0IERldGFpbHMnLFxuICBTVE9SRV9SRVNQT05TRTogJ1N0b3JlIFJlc3BvbnNlJyxcbiAgVkFMSURBVElPTjogJ1ZhbGlkYXRpb24nLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQXBpRWRpdFBheWxvYWRUYWIgPSAnaGVhZGVycycgfCAnYm9keScgfCAncGFyYW1zJyB8ICdhdXRob3JpemF0aW9uJztcblxuLyoqIFdoaWNoIGJvZHkgY29udGVudCBibG9jayBpcyB2aXNpYmxlOiBoZWFkZXJzICh0YWJzKSBvciBpbXBvcnQgY1VSTCB0ZXh0YXJlYS4gKi9cbmV4cG9ydCB0eXBlIEFwaUVkaXRCb2R5VmlldyA9ICdoZWFkZXJzJyB8ICdpbXBvcnQtY3VybCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdEhlYWRlclJvdyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKiogUGF5bG9hZCBlbWl0dGVkIHdoZW4gdXNlciBjbGlja3MgU2VuZCBSZXF1ZXN0IChlbnZpcm9ubWVudCwgbWV0aG9kLCB1cmwsIGhlYWRlcnMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0U2VuZFJlcXVlc3RQYXlsb2FkIHtcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICBoZWFkZXJzOiBBcGlFZGl0SGVhZGVyUm93W107XG59XG5cbi8qKiBPQXV0aCAyLjAgYXV0aCBmaWVsZHMgKHdoZW4gYXV0aCB0eXBlIGlzIE9BdXRoIDIuMCkuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRPQXV0aDJQYXlsb2FkIHtcbiAgZ3JhbnRUeXBlOiBzdHJpbmc7XG4gIGFjY2Vzc1Rva2VuVXJsOiBzdHJpbmc7XG4gIGNsaWVudElkOiBzdHJpbmc7XG4gIGNsaWVudFNlY3JldDogc3RyaW5nO1xuICBzY29wZTogc3RyaW5nO1xuICBjbGllbnRBdXRoZW50aWNhdGlvbjogc3RyaW5nO1xufVxuXG4vKiogU3RlcCAxIHJlcXVlc3QgKyBib2R5IHBheWxvYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRTdGVwMVBheWxvYWQge1xuICBlbnZpcm9ubWVudDogc3RyaW5nO1xuICBtZXRob2Q6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGhlYWRlcnM6IEFwaUVkaXRIZWFkZXJSb3dbXTtcbiAgLyoqIFNlbGVjdGVkIGF1dGggdHlwZTogZS5nLiAnbm8tYXV0aCcsICdiZWFyZXInLCAnb2F1dGgyJy4gKi9cbiAgYXV0aFR5cGU6IHN0cmluZztcbiAgLyoqIEJlYXJlciB0b2tlbiB2YWx1ZSB3aGVuIGF1dGhUeXBlIGlzICdiZWFyZXInLiAqL1xuICBiZWFyZXJUb2tlbj86IHN0cmluZztcbiAgLyoqIE9BdXRoIDIuMCBmaWVsZHMgd2hlbiBhdXRoVHlwZSBpcyAnb2F1dGgyJy4gKi9cbiAgb2F1dGgyPzogQXBpRWRpdE9BdXRoMlBheWxvYWQ7XG4gIGFjdGl2ZVBheWxvYWRUYWI6IEFwaUVkaXRQYXlsb2FkVGFiO1xuICBwYXlsb2FkVHlwZTogJ3JhdycgfCAneC13d3ctZm9ybS11cmxlbmNvZGVkJyB8ICdmb3JtLWRhdGEnO1xuICBwYXlsb2FkRm9ybWF0OiBzdHJpbmc7XG4gIHBheWxvYWRUZXh0OiBzdHJpbmc7XG4gIGtleVZhbHVlUm93czogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W107XG4gIGtleVR5cGVWYWx1ZVJvd3M6IHsga2V5OiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W107XG4gIHBhcmFtc1Jvd3M6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdO1xufVxuXG4vKiogU3RlcCAyIHN0b3JlLXJlc3BvbnNlIHBheWxvYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRTdGVwMlBheWxvYWQge1xuICB2YXJpYWJsZU5hbWU6IHN0cmluZztcbn1cblxuLyoqIFJlc3BvbnNlIGJvZHkgdmVyaWZpY2F0aW9uIHJvdy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdFJlc3BvbnNlQm9keVZlcmlmaWNhdGlvblJvdyB7XG4gIGpzb25QYXRoOiBzdHJpbmc7XG4gIHZlcmlmaWNhdGlvbjogc3RyaW5nO1xuICBkYXRhVHlwZTogc3RyaW5nO1xuICBleHBlY3RlZFZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKiBTdGF0dXMgdmVyaWZpY2F0aW9uIHJvdy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRWRpdFN0YXR1c1ZlcmlmaWNhdGlvblJvdyB7XG4gIHZlcmlmaWNhdGlvbjogc3RyaW5nO1xuICBleHBlY3RlZFZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKiBTdGVwIDMgdmFsaWRhdGlvbiBwYXlsb2FkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlFZGl0U3RlcDNQYXlsb2FkIHtcbiAgYWN0aXZlUmVzcG9uc2VWZXJpZmljYXRpb25UYWI6ICdyZXNwb25zZS1ib2R5JyB8ICdzdGF0dXMnO1xuICByZXNwb25zZUJvZHlWZXJpZmljYXRpb25zOiBBcGlFZGl0UmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9uUm93W107XG4gIHN0YXR1c1ZlcmlmaWNhdGlvbnM6IEFwaUVkaXRTdGF0dXNWZXJpZmljYXRpb25Sb3dbXTtcbn1cblxuLyoqIEZ1bGwgcGF5bG9hZCBlbWl0dGVkIHdoZW4gdXNlciBjbGlja3MgQ3JlYXRlIChhbGwgc3RlcHPigJkgZGF0YSkuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVkaXRDcmVhdGVQYXlsb2FkIHtcbiAgc3RlcDE6IEFwaUVkaXRTdGVwMVBheWxvYWQ7XG4gIHN0ZXAyOiBBcGlFZGl0U3RlcDJQYXlsb2FkO1xuICBzdGVwMzogQXBpRWRpdFN0ZXAzUGF5bG9hZDtcbiAgLyoqIEFkdmFuY2VkIHNldHRpbmdzIHZhcmlhYmxlcyBmb3IgdGhpcyBBUEkgc3RlcCAoZS5nLiBpc1N0ZXBPcHRpb25hbCwgc2hvdWxkU2tpcCkuICovXG4gIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM/OiBhbnlbXTtcbn1cblxuLyoqIEVudmlyb25tZW50IG9wdGlvbjogZWl0aGVyIGEgc3RyaW5nIChkaXNwbGF5ID0gdmFsdWUpIG9yIGFuIG9iamVjdCB3aXRoIGlkLCBuYW1lLCB2YWx1ZSwgbGFiZWwuICovXG5leHBvcnQgdHlwZSBFbnZpcm9ubWVudE9wdGlvbklucHV0ID0gc3RyaW5nIHwgU2VsZWN0T3B0aW9uO1xuXG5jb25zdCBNRVRIT0RTX1dJVEhPVVRfQk9EWSA9IFsnR0VUJywgJ0hFQUQnLCAnREVMRVRFJ107XG5cbi8qKiBBdXRvLWNsb3NlIHBhaXJzIGZvciBwYXlsb2FkIEpTT04gZWRpdG9yOiBvcGVuaW5nIGNoYXIgLT4gY2xvc2luZyBjaGFyLiAqL1xuY29uc3QgUEFZTE9BRF9BVVRPX0NMT1NFX1BBSVJTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyAneyc6ICd9JywgJ1snOiAnXScsICdcIic6ICdcIicsIFwiJ1wiOiBcIidcIiB9O1xuXG4vKiogUmVzdWx0IG9mIHBhcnNpbmcgYSBjVVJMIGNvbW1hbmQuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZEN1cmwge1xuICBtZXRob2Q6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGhlYWRlcnM6IEFwaUVkaXRIZWFkZXJSb3dbXTtcbiAgYm9keTogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBpc1NpbmdsZVF1b3RlKGNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoID09PSBcIidcIiB8fCBjaCA9PT0gJ1xcdTIwMTgnIHx8IGNoID09PSAnXFx1MjAxOSc7XG59XG5mdW5jdGlvbiBpc0RvdWJsZVF1b3RlKGNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoID09PSAnXCInIHx8IGNoID09PSAnXFx1MjAxQycgfHwgY2ggPT09ICdcXHUyMDFEJztcbn1cbmZ1bmN0aW9uIGlzQ2xvc2luZ1F1b3RlKGNoOiBzdHJpbmcsIG9wZW5RdW90ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChpc1NpbmdsZVF1b3RlKG9wZW5RdW90ZSkpIHJldHVybiBpc1NpbmdsZVF1b3RlKGNoKTtcbiAgaWYgKGlzRG91YmxlUXVvdGUob3BlblF1b3RlKSkgcmV0dXJuIGlzRG91YmxlUXVvdGUoY2gpO1xuICByZXR1cm4gY2ggPT09IG9wZW5RdW90ZTtcbn1cblxuLyoqXG4gKiBUb2tlbml6ZSBhIHN0cmluZyByZXNwZWN0aW5nIHNpbmdsZS0gYW5kIGRvdWJsZS1xdW90ZWQgc2VnbWVudHMgKGZvciBjVVJMIGFyZ3MpLlxuICogSGFuZGxlcyBzdHJhaWdodCBhbmQgc21hcnQvY3VybHkgcXVvdGVzIHNvIHBhc3RlZCBjVVJMcyBmcm9tIGJyb3dzZXJzL2RvY3Mgd29yay5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVDdXJsTGluZShsaW5lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRva2Vuczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGkgPSAwO1xuICBjb25zdCBuID0gbGluZS5sZW5ndGg7XG4gIHdoaWxlIChpIDwgbikge1xuICAgIHdoaWxlIChpIDwgbiAmJiAvXFxzLy50ZXN0KGxpbmVbaV0pKSBpKys7XG4gICAgaWYgKGkgPj0gbikgYnJlYWs7XG4gICAgY29uc3QgY2ggPSBsaW5lW2ldO1xuICAgIGlmIChpc1NpbmdsZVF1b3RlKGNoKSB8fCBpc0RvdWJsZVF1b3RlKGNoKSkge1xuICAgICAgY29uc3QgcXVvdGUgPSBjaDtcbiAgICAgIGkrKztcbiAgICAgIGxldCB2YWx1ZSA9ICcnO1xuICAgICAgd2hpbGUgKGkgPCBuICYmICFpc0Nsb3NpbmdRdW90ZShsaW5lW2ldLCBxdW90ZSkpIHtcbiAgICAgICAgaWYgKGxpbmVbaV0gPT09ICdcXFxcJykge1xuICAgICAgICAgIGkrKztcbiAgICAgICAgICBpZiAoaSA8IG4pIHZhbHVlICs9IGxpbmVbaSsrXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSArPSBsaW5lW2krK107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpIDwgbikgaSsrO1xuICAgICAgdG9rZW5zLnB1c2godmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGxldCB3b3JkID0gJyc7XG4gICAgd2hpbGUgKGkgPCBuICYmICEvXFxzLy50ZXN0KGxpbmVbaV0pICYmICFpc1NpbmdsZVF1b3RlKGxpbmVbaV0pICYmICFpc0RvdWJsZVF1b3RlKGxpbmVbaV0pKSB7XG4gICAgICB3b3JkICs9IGxpbmVbaSsrXTtcbiAgICB9XG4gICAgaWYgKHdvcmQpIHRva2Vucy5wdXNoKHdvcmQpO1xuICB9XG4gIHJldHVybiB0b2tlbnM7XG59XG5cbi8qKiBTdHJpcCBvbmUgbGF5ZXIgb2Ygc3Vycm91bmRpbmcgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMgZnJvbSBhIHN0cmluZyAoZS5nLiAne1wieFwiOjF9JyAtPiB7XCJ4XCI6MX0pLiAqL1xuZnVuY3Rpb24gc3RyaXBTdXJyb3VuZGluZ1F1b3RlcyhzOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocy5sZW5ndGggPj0gMiAmJiAocy5zdGFydHNXaXRoKFwiJ1wiKSAmJiBzLmVuZHNXaXRoKFwiJ1wiKSkgfHwgKHMuc3RhcnRzV2l0aCgnXCInKSAmJiBzLmVuZHNXaXRoKCdcIicpKSkge1xuICAgIHJldHVybiBzLnNsaWNlKDEsIC0xKTtcbiAgfVxuICByZXR1cm4gcztcbn1cblxuLyoqXG4gKiBQYXJzZSBhIGNVUkwgY29tbWFuZCBzdHJpbmcgYW5kIHJldHVybiBtZXRob2QsIHVybCwgaGVhZGVycywgYW5kIGJvZHkuXG4gKiBTdXBwb3J0cyAtWC8tLXJlcXVlc3QsIC1ILy0taGVhZGVyLCAtZC8tLWRhdGEvLS1kYXRhLXJhdy8tLWRhdGEtYmluYXJ5LCBhbmQgVVJMLlxuICogSGFuZGxlcyBsaW5lIGNvbnRpbnVhdGlvbnMgKGJhY2tzbGFzaC1uZXdsaW5lKSBhbmQgcXVvdGVkIGJvZHkgcGF5bG9hZHMuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ3VybChjdXJsU3RyaW5nOiBzdHJpbmcpOiBQYXJzZWRDdXJsIHwgbnVsbCB7XG4gIGNvbnN0IHJhdyA9IChjdXJsU3RyaW5nID8/ICcnKS50cmltKCk7XG4gIGlmICghcmF3KSByZXR1cm4gbnVsbDtcbiAgLy8gUmVtb3ZlIGxpbmUgY29udGludWF0aW9ucyAoYmFja3NsYXNoIGZvbGxvd2VkIGJ5IG5ld2xpbmUpIHNvIHRoZXkgZG9uJ3QgYnJlYWsgdG9rZW5pemF0aW9uXG4gIGNvbnN0IG5vQ29udGludWF0aW9ucyA9IHJhdy5yZXBsYWNlKC9cXFxcXFxzKlxccj9cXG5cXHMqL2csICcgJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub0NvbnRpbnVhdGlvbnMucmVwbGFjZSgvXFxyP1xcbi9nLCAnICcpLnJlcGxhY2UoL1xccysvZywgJyAnKTtcbiAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVDdXJsTGluZShub3JtYWxpemVkKTtcbiAgbGV0IG1ldGhvZCA9ICdHRVQnO1xuICBsZXQgdXJsID0gJyc7XG4gIGNvbnN0IGhlYWRlcnM6IEFwaUVkaXRIZWFkZXJSb3dbXSA9IFtdO1xuICBsZXQgYm9keSA9ICcnO1xuICBjb25zdCB1cmxQYXR0ZXJuID0gL15odHRwcz86XFwvXFwvL2k7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdCA9IHRva2Vuc1tpXTtcbiAgICBjb25zdCBjb25zdW1lTmV4dCA9ICgpID0+IHtcbiAgICAgIGkrKztcbiAgICAgIHJldHVybiB0b2tlbnNbaV07XG4gICAgfTtcbiAgICBpZiAodCA9PT0gJy1YJyB8fCB0ID09PSAnLS1yZXF1ZXN0Jykge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb25zdW1lTmV4dCgpO1xuICAgICAgaWYgKHZhbHVlKSBtZXRob2QgPSB2YWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0ID09PSAnLUgnIHx8IHQgPT09ICctLWhlYWRlcicpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29uc3VtZU5leHQoKTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjb2xvbiA9IHZhbHVlLmluZGV4T2YoJzonKTtcbiAgICAgICAgaWYgKGNvbG9uICE9PSAtMSkge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSB2YWx1ZS5zbGljZSgwLCBjb2xvbikudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gdmFsdWUuc2xpY2UoY29sb24gKyAxKS50cmltKCk7XG4gICAgICAgICAgaWYgKG5hbWUpIGhlYWRlcnMucHVzaCh7IG5hbWUsIHR5cGU6ICdzdHJpbmcnLCB2YWx1ZTogaGVhZGVyVmFsdWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodCA9PT0gJy1kJyB8fCB0ID09PSAnLS1kYXRhJyB8fCB0ID09PSAnLS1kYXRhLXJhdycgfHwgdCA9PT0gJy0tZGF0YS1iaW5hcnknIHx8IHQgPT09ICctLWRhdGEtYXNjaWknKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnN1bWVOZXh0KCk7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAhU3RyaW5nKHZhbHVlKS5zdGFydHNXaXRoKCdAJykpIGJvZHkgPSBzdHJpcFN1cnJvdW5kaW5nUXVvdGVzKHZhbHVlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodC5zdGFydHNXaXRoKCctLWRhdGE9JykpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdC5zbGljZSg3KTtcbiAgICAgIGlmICghdmFsdWUuc3RhcnRzV2l0aCgnQCcpKSBib2R5ID0gc3RyaXBTdXJyb3VuZGluZ1F1b3Rlcyh2YWx1ZS5yZXBsYWNlKC9eW1wiJ118W1wiJ10kL2csICcnKSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHQuc3RhcnRzV2l0aCgnLS1kYXRhLXJhdz0nKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0LnNsaWNlKDExKTtcbiAgICAgIGlmICghdmFsdWUuc3RhcnRzV2l0aCgnQCcpKSBib2R5ID0gc3RyaXBTdXJyb3VuZGluZ1F1b3Rlcyh2YWx1ZS5yZXBsYWNlKC9eW1wiJ118W1wiJ10kL2csICcnKSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHQuc3RhcnRzV2l0aCgnLWQnKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0Lmxlbmd0aCA+IDIgPyB0LnNsaWNlKDIpIDogY29uc3VtZU5leHQoKTtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICF2YWx1ZS5zdGFydHNXaXRoKCdAJykpIGJvZHkgPSBzdHJpcFN1cnJvdW5kaW5nUXVvdGVzKHZhbHVlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodXJsUGF0dGVybi50ZXN0KHQpKSB7XG4gICAgICBpZiAoIXVybCkgdXJsID0gdDtcbiAgICB9XG4gIH1cbiAgaWYgKCF1cmwpIHtcbiAgICBjb25zdCBmaXJzdFVybCA9IHRva2Vucy5maW5kKCh0b2spID0+IHVybFBhdHRlcm4udGVzdCh0b2spKTtcbiAgICBpZiAoZmlyc3RVcmwpIHVybCA9IGZpcnN0VXJsO1xuICB9XG4gIC8vIE1hbnkgY1VSTHMgKGUuZy4gZnJvbSBicm93c2VyIGRldnRvb2xzKSBvbWl0IC1YIFBPU1Qgd2hlbiBzZW5kaW5nIGEgYm9keTsgaW5mZXIgUE9TVFxuICBjb25zdCBmaW5hbE1ldGhvZCA9IChtZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XG4gIGlmIChib2R5ICYmIChmaW5hbE1ldGhvZCA9PT0gJ0dFVCcgfHwgZmluYWxNZXRob2QgPT09ICdIRUFEJykpIHtcbiAgICByZXR1cm4geyBtZXRob2Q6ICdQT1NUJywgdXJsLCBoZWFkZXJzLCBib2R5IH07XG4gIH1cbiAgcmV0dXJuIHsgbWV0aG9kOiBmaW5hbE1ldGhvZCwgdXJsLCBoZWFkZXJzLCBib2R5IH07XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1hcGktZWRpdC1zdGVwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FwaS1lZGl0LXN0ZXAuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdCxcbn0pXG5leHBvcnQgY2xhc3MgQXBpRWRpdFN0ZXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgaW5pdGlhbE1ldGhvZD86IHN0cmluZztcbiAgQElucHV0KCkgaW5pdGlhbEVudmlyb25tZW50Pzogc3RyaW5nO1xuICBASW5wdXQoKSBpbml0aWFsU3RlcD86IG51bWJlcjtcbiAgQElucHV0KCkgaW5pdGlhbFVybD86IHN0cmluZztcbiAgQElucHV0KCkgaW5pdGlhbFBheWxvYWRUYWI/OiBBcGlFZGl0UGF5bG9hZFRhYjtcbiAgQElucHV0KCkgaW5pdGlhbEhlYWRlcnM/OiBBcGlFZGl0SGVhZGVyUm93W107XG4gIEBJbnB1dCgpIGluaXRpYWxSZXNwb25zZVByZXZpZXc/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGluaXRpYWxWYXJpYWJsZU5hbWU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGVkaXRNb2RlPzogYm9vbGVhbjtcblxuICAvKiogRW1pdHMgdGhlIGNVUkwgc3RyaW5nIHdoZW4gdXNlciBjbGlja3MgSW1wb3J0ICh2YWx1ZSBmcm9tIHRoZSB0ZXh0YXJlYSBjb250cm9sKS4gKi9cbiAgQE91dHB1dCgpIGltcG9ydEN1cmwgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdXNlciBjYW5jZWxzIHRoZSBJbXBvcnQgY1VSTCBwYW5lbCAoY2xpY2tzIENhbmNlbCkuICovXG4gIEBPdXRwdXQoKSBpbXBvcnRDdXJsQ2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRW1pdHMgd2hlbiB1c2VyIGNsaWNrcyBTZW5kIFJlcXVlc3QsIHdpdGggZW52aXJvbm1lbnQsIG1ldGhvZCwgdXJsLCBhbmQgaGVhZGVycy4gKi9cbiAgQE91dHB1dCgpIHNlbmRSZXF1ZXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxBcGlFZGl0U2VuZFJlcXVlc3RQYXlsb2FkPigpO1xuICBAT3V0cHV0KCkgYmFjayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdXNlciBjbGlja3MgdGhlIENhbmNlbCBidXR0b24gKHN0ZXAgMSkuICovXG4gIEBPdXRwdXQoKSBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBuZXh0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRW1pdHMgd2hlbiB1c2VyIGNsaWNrcyBDcmVhdGUgd2l0aCBhbGwgZW50ZXJlZCBkZXRhaWxzOiBzdGVwMSAoZW52aXJvbm1lbnQsIEhUVFAgbWV0aG9kLCBVUkwsIGhlYWRlcnMsIGJvZHkpLCBzdGVwMiAodmFyaWFibGUgbmFtZSksIHN0ZXAzICh2ZXJpZmljYXRpb25zKS4gKi9cbiAgQE91dHB1dCgpIGNyZWF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8QXBpRWRpdENyZWF0ZVBheWxvYWQ+KCk7XG4gIC8qKiBFbWl0cyB3aGVuZXZlciBoZWFkZXJzIGNoYW5nZSAoYWRkLCByZW1vdmUsIG9yIGVkaXQpIHNvIHRoZSBwYXJlbnQgY2FuIHJlZmxlY3QgdGhlbSBpbiB0aGUgY2FudmFzL2NvbnRyb2xzLiAqL1xuICBAT3V0cHV0KCkgaGVhZGVyc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QXBpRWRpdEhlYWRlclJvd1tdPigpO1xuXG4gIC8qKiBGb3JtIGNvbnRyb2wgZm9yIEltcG9ydCBjVVJMIHRleHRhcmVhOyB2YWx1ZSBpcyBlbWl0dGVkIHdoZW4gdXNlciBjbGlja3MgSW1wb3J0LiAqL1xuICByZWFkb25seSBpbXBvcnRDdXJsQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG5cbiAgdmFyaWFibGVOYW1lID0gJyc7XG4gIHZhcmlhYmxlTmFtZUVycm9yID0gJyc7XG5cbiAgLyoqIENvbnRyb2xzIHdoaWNoIGJvZHkgY29udGVudCBpcyB2aXNpYmxlOiBoZWFkZXJzIChkZWZhdWx0KSBvciBpbXBvcnQtY3VybC4gKi9cbiAgYm9keVZpZXc6IEFwaUVkaXRCb2R5VmlldyA9ICdoZWFkZXJzJztcblxuICByZWFkb25seSBzdGVwTGFiZWxzID0gW1xuICAgIHsgaW5kZXg6IDEsIGxhYmVsOiBBUElfRURJVF9TVEVQX0xBQkVMUy5SRVFVRVNUX0RFVEFJTFMgfSxcbiAgICB7IGluZGV4OiAyLCBsYWJlbDogQVBJX0VESVRfU1RFUF9MQUJFTFMuU1RPUkVfUkVTUE9OU0UgfSxcbiAgICB7IGluZGV4OiAzLCBsYWJlbDogQVBJX0VESVRfU1RFUF9MQUJFTFMuVkFMSURBVElPTiB9LFxuICBdO1xuICBjdXJyZW50U3RlcCA9IDE7XG5cbiAgLyoqIFRoZSBsYWJlbCBmb3IgdGhlIGN1cnJlbnQgc3RlcCBvbmx5ICh1c2VkIHdoZW4gc2hvd2luZyBhIHNpbmdsZSBzdGVwIGluIHRoZSBpbmRpY2F0b3IpLiAqL1xuICBnZXQgYWN0aXZlU3RlcExhYmVsKCk6IHsgaW5kZXg6IG51bWJlcjsgbGFiZWw6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zdGVwTGFiZWxzW3RoaXMuY3VycmVudFN0ZXAgLSAxXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWluU3RlcCA9IDE7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4U3RlcCA9IDM7XG5cbiAgLyoqIFBlcmNlbnRhZ2UgdG8gdHJhbnNsYXRlIHRoZSBzdGVwIHN0cmlwICgwLCAtMzMuMzMzLCAtNjYuNjY2KSBmb3IgQ1NTIHRyYW5zaXRpb24uICovXG4gIGdldCBzdHJpcFRyYW5zbGF0ZVBlcmNlbnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuY3VycmVudFN0ZXAgLSAxKSAqIC0zMy4zMzM7XG4gIH1cblxuICBzZXRTdGVwKHN0ZXA6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChzdGVwID49IHRoaXMubWluU3RlcCAmJiBzdGVwIDw9IHRoaXMubWF4U3RlcCkge1xuICAgICAgdGhpcy5jdXJyZW50U3RlcCA9IHN0ZXA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUluaXRpYWxTdGVwKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1heCh0aGlzLm1pblN0ZXAsIE1hdGgubWluKHRoaXMubWF4U3RlcCwgTWF0aC5mbG9vcih2YWx1ZSkpKTtcbiAgICB0aGlzLmN1cnJlbnRTdGVwID0gY2xhbXBlZDtcbiAgfVxuXG4gIC8qKiBIVFRQIG1ldGhvZCBvcHRpb25zOiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgd2l0aCBpZCwgbmFtZSwgdmFsdWUsIGxhYmVsIChwYXNzZWQgZnJvbSBwYXJlbnQpLiAqL1xuICBASW5wdXQoKSBodHRwTWV0aG9kT3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgLyoqIEZvcm0gZm9yIEhUVFAgbWV0aG9kIHNlbGVjdCAoY3FhLWR5bmFtaWMtc2VsZWN0KSAqL1xuICBtZXRob2RGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBDb25maWcgZm9yIG1ldGhvZCBkcm9wZG93biAodXBkYXRlZCB3aGVuIGh0dHBNZXRob2RPcHRpb25zIGNoYW5nZXMgdG8gYXZvaWQgbmV3IHJlZmVyZW5jZSBldmVyeSBDRCkgKi9cbiAgbWV0aG9kU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnbWV0aG9kJyxcbiAgICBwbGFjZWhvbGRlcjogJ01ldGhvZCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVNZXRob2RTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9ICh0aGlzLmh0dHBNZXRob2RPcHRpb25zID8/IFtdKS5tYXAoKG0pID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LnRvU2VsZWN0T3B0aW9uKG0pKTtcbiAgICB0aGlzLm1ldGhvZFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMubWV0aG9kU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNZXRob2RWYWx1ZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiAodGhpcy5odHRwTWV0aG9kT3B0aW9ucyA/PyBbXSlcbiAgICAgIC5tYXAoKG0pID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKG0pKVxuICAgICAgLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+IHYgIT0gbnVsbCk7XG4gIH1cblxuICAvKiogRm9ybSBmb3IgZW52aXJvbm1lbnQgc2VsZWN0IChjcWEtZHluYW1pYy1zZWxlY3QpICovXG4gIGVudmlyb25tZW50Rm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogRW52aXJvbm1lbnQgb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHdpdGggaWQsIG5hbWUsIHZhbHVlLCBsYWJlbCAocGFzc2VkIGZyb20gcGFyZW50KS4gKi9cbiAgQElucHV0KCkgZW52aXJvbm1lbnRPcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcblxuICAvKiogQ29uZmlnIGZvciBlbnZpcm9ubWVudCBkcm9wZG93biAodXBkYXRlZCB3aGVuIGVudmlyb25tZW50T3B0aW9ucyBjaGFuZ2VzIHRvIGF2b2lkIG5ldyByZWZlcmVuY2UgZXZlcnkgQ0QpICovXG4gIGVudmlyb25tZW50U2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZW52aXJvbm1lbnQnLFxuICAgIHBsYWNlaG9sZGVyOiAnRW52aXJvbm1lbnQnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIHRvU2VsZWN0T3B0aW9uKGl0ZW06IEVudmlyb25tZW50T3B0aW9uSW5wdXQpOiBTZWxlY3RPcHRpb24ge1xuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB7IGlkOiBpdGVtLCB2YWx1ZTogaXRlbSwgbmFtZTogaXRlbSwgbGFiZWw6IGl0ZW0gfTtcbiAgICB9XG4gICAgY29uc3QgbyA9IGl0ZW0gYXMgU2VsZWN0T3B0aW9uO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogby5pZCA/PyBvLnZhbHVlLFxuICAgICAgdmFsdWU6IG8udmFsdWUgPz8gby5pZCxcbiAgICAgIG5hbWU6IG8ubmFtZSA/PyBvLmxhYmVsID8/IFN0cmluZyhvLnZhbHVlID8/IG8uaWQpLFxuICAgICAgbGFiZWw6IG8ubGFiZWwgPz8gby5uYW1lID8/IFN0cmluZyhvLnZhbHVlID8/IG8uaWQpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRPcHRpb25WYWx1ZShpdGVtOiBFbnZpcm9ubWVudE9wdGlvbklucHV0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSByZXR1cm4gaXRlbTtcbiAgICBjb25zdCBvID0gaXRlbSBhcyBTZWxlY3RPcHRpb247XG4gICAgY29uc3QgdiA9IG8udmFsdWUgPz8gby5pZDtcbiAgICByZXR1cm4gdiAhPSBudWxsID8gU3RyaW5nKHYpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVFbnZpcm9ubWVudFNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID0gKHRoaXMuZW52aXJvbm1lbnRPcHRpb25zID8/IFtdKS5tYXAoKGUpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LnRvU2VsZWN0T3B0aW9uKGUpKTtcbiAgICB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5lbnZpcm9ubWVudFNlbGVjdENvbmZpZyxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW52aXJvbm1lbnRWYWx1ZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiAodGhpcy5lbnZpcm9ubWVudE9wdGlvbnMgPz8gW10pXG4gICAgICAubWFwKChlKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShlKSlcbiAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB2ICE9IG51bGwpO1xuICB9XG5cbiAgLyoqIEZvcm0gZm9yIEF1dGggVHlwZSBzZWxlY3QgKEF1dGhvcml6YXRpb24gdGFiKSAqL1xuICBhdXRoVHlwZUZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIEF1dGggdHlwZSBvcHRpb25zOiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgd2l0aCBpZCwgbmFtZSwgdmFsdWUsIGxhYmVsIChwYXNzZWQgZnJvbSBwYXJlbnQpLiBGYWxscyBiYWNrIHRvIGJ1aWx0LWluIGxpc3Qgd2hlbiBlbXB0eS4gKi9cbiAgQElucHV0KCkgYXV0aFR5cGVPcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcblxuICAvKiogSW5pdGlhbCBhdXRoIHR5cGUgKHN0cmluZyBvciBvcHRpb24gb2JqZWN0KS4gV2hlbiBub3Qgc2V0LCBmaXJzdCBvZiBhdXRoVHlwZU9wdGlvbnMgb3IgZGVmYXVsdCBcIk5vIEF1dGhcIiBpcyB1c2VkLiAqL1xuICBASW5wdXQoKSBpbml0aWFsQXV0aFR5cGU/OiBzdHJpbmcgfCBFbnZpcm9ubWVudE9wdGlvbklucHV0O1xuXG4gIC8qKiBEZWZhdWx0IG9wdGlvbnMgd2hlbiBhdXRoVHlwZU9wdGlvbnMgaXMgZW1wdHkgKHNhbWUgc2hhcGUgYXMgZW52aXJvbm1lbnQpICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfQVVUSF9UWVBFX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICduby1hdXRoJywgdmFsdWU6ICduby1hdXRoJywgbmFtZTogJ05vIEF1dGgnLCBsYWJlbDogJ05vIEF1dGgnIH0sXG4gICAgeyBpZDogJ2JlYXJlcicsIHZhbHVlOiAnYmVhcmVyJywgbmFtZTogJ0JlYXJlciBUb2tlbicsIGxhYmVsOiAnQmVhcmVyIFRva2VuJyB9LFxuICAgIHsgaWQ6ICdvYXV0aDInLCB2YWx1ZTogJ29hdXRoMicsIG5hbWU6ICdPQXV0aCAyLjAnLCBsYWJlbDogJ09BdXRoIDIuMCcgfSxcbiAgXTtcblxuICAvKiogQ29uZmlnIGZvciBBdXRoIFR5cGUgZHJvcGRvd24gKHVwZGF0ZWQgd2hlbiBhdXRoVHlwZU9wdGlvbnMgY2hhbmdlcywgbGlrZSBlbnZpcm9ubWVudCkgKi9cbiAgYXV0aFR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdhdXRoVHlwZScsXG4gICAgcGxhY2Vob2xkZXI6ICdObyBBdXRoJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXSxcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZUF1dGhUeXBlU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPVxuICAgICAgdGhpcy5hdXRoVHlwZU9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLmF1dGhUeXBlT3B0aW9ucy5tYXAoKGEpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LnRvU2VsZWN0T3B0aW9uKGEpKVxuICAgICAgICA6IFsuLi5BcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0FVVEhfVFlQRV9PUFRJT05TXTtcbiAgICB0aGlzLmF1dGhUeXBlU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5hdXRoVHlwZVNlbGVjdENvbmZpZyxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QXV0aFR5cGVWYWx1ZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNvdXJjZSA9XG4gICAgICB0aGlzLmF1dGhUeXBlT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuYXV0aFR5cGVPcHRpb25zXG4gICAgICAgIDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfQVVUSF9UWVBFX09QVElPTlMgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdKTtcbiAgICByZXR1cm4gc291cmNlXG4gICAgICAubWFwKChhKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShhIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpKVxuICAgICAgLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+IHYgIT0gbnVsbCk7XG4gIH1cblxuICAvKiogQ3VycmVudCBhdXRoIHR5cGUgdmFsdWUgKGUuZy4gJ25vLWF1dGgnKSBmb3IgdGVtcGxhdGUgKi9cbiAgZ2V0IHNlbGVjdGVkQXV0aFR5cGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2ID0gdGhpcy5hdXRoVHlwZUZvcm0/LmdldCgnYXV0aFR5cGUnKT8udmFsdWU7XG4gICAgaWYgKHYgPT0gbnVsbCB8fCB2ID09PSAnJykgcmV0dXJuICduby1hdXRoJztcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdvYmplY3QnID8gKHY/LnZhbHVlID8/IHY/LmlkID8/ICduby1hdXRoJykgOiBTdHJpbmcodik7XG4gIH1cblxuICAvKiogQmVhcmVyIHRva2VuIHZhbHVlIChBdXRob3JpemF0aW9uIHRhYiwgd2hlbiBhdXRoIHR5cGUgaXMgQmVhcmVyIFRva2VuKS4gKi9cbiAgYmVhcmVyVG9rZW4gPSAnJztcblxuICAvKiogRm9ybSBmb3IgT0F1dGggMi4wIGZpZWxkcyAoQXV0aG9yaXphdGlvbiB0YWIgd2hlbiBhdXRoIHR5cGUgaXMgT0F1dGggMi4wKS4gKi9cbiAgb2F1dGgyRm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogR3JhbnQgdHlwZSBvcHRpb25zIGZvciBPQXV0aCAyLjAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgT0FVVEhfR1JBTlRfVFlQRV9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAnY2xpZW50X2NyZWRlbnRpYWxzJywgdmFsdWU6ICdjbGllbnRfY3JlZGVudGlhbHMnLCBuYW1lOiAnQ2xpZW50IENyZWRlbnRpYWxzJywgbGFiZWw6ICdDbGllbnQgQ3JlZGVudGlhbHMnIH0sXG4gICAgeyBpZDogJ2F1dGhvcml6YXRpb25fY29kZScsIHZhbHVlOiAnYXV0aG9yaXphdGlvbl9jb2RlJywgbmFtZTogJ0F1dGhvcml6YXRpb24gQ29kZScsIGxhYmVsOiAnQXV0aG9yaXphdGlvbiBDb2RlJyB9LFxuICAgIHsgaWQ6ICdwYXNzd29yZCcsIHZhbHVlOiAncGFzc3dvcmQnLCBuYW1lOiAnUGFzc3dvcmQnLCBsYWJlbDogJ1Bhc3N3b3JkJyB9LFxuICAgIHsgaWQ6ICdpbXBsaWNpdCcsIHZhbHVlOiAnaW1wbGljaXQnLCBuYW1lOiAnSW1wbGljaXQnLCBsYWJlbDogJ0ltcGxpY2l0JyB9LFxuICBdO1xuXG4gIC8qKiBDbGllbnQgYXV0aGVudGljYXRpb24gbWV0aG9kIG9wdGlvbnMgZm9yIE9BdXRoIDIuMCAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBPQVVUSF9DTElFTlRfQVVUSF9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAnYmFzaWMnLCB2YWx1ZTogJ2Jhc2ljJywgbmFtZTogJ1NlbmQgYXMgQmFzaWMgQXV0aCBoZWFkZXInLCBsYWJlbDogJ1NlbmQgYXMgQmFzaWMgQXV0aCBoZWFkZXInIH0sXG4gICAgeyBpZDogJ2JvZHknLCB2YWx1ZTogJ2JvZHknLCBuYW1lOiAnU2VuZCBpbiBib2R5JywgbGFiZWw6ICdTZW5kIGluIGJvZHknIH0sXG4gIF07XG5cbiAgcmVhZG9ubHkgb2F1dGgyR3JhbnRUeXBlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZ3JhbnRUeXBlJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBncmFudCB0eXBlJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuT0FVVEhfR1JBTlRfVFlQRV9PUFRJT05TXSxcbiAgfTtcblxuICByZWFkb25seSBvYXV0aDJDbGllbnRBdXRoU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnY2xpZW50QXV0aGVudGljYXRpb24nLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IG1ldGhvZCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogWy4uLkFwaUVkaXRTdGVwQ29tcG9uZW50Lk9BVVRIX0NMSUVOVF9BVVRIX09QVElPTlNdLFxuICB9O1xuXG4gIC8qKiBDdXJyZW50IEhUVFAgbWV0aG9kIChmcm9tIGZvcm0gb3IgZGVmYXVsdDogZmlyc3Qgb2YgaHR0cE1ldGhvZE9wdGlvbnMpLiBUcmVhdHMgZW1wdHkgc3RyaW5nIGFzIHVuc2V0LiAqL1xuICBnZXQgc2VsZWN0ZWRNZXRob2QoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubWV0aG9kRm9ybT8uZ2V0KCdtZXRob2QnKT8udmFsdWU7XG4gICAgY29uc3QgZmlyc3RWYWx1ZSA9IHRoaXMuaHR0cE1ldGhvZE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmh0dHBNZXRob2RPcHRpb25zWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSAnJyA/ICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodmFsdWUgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgOiBTdHJpbmcodmFsdWUpKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZWQgPz8gZmlyc3RWYWx1ZSA/PyAnR0VUJztcbiAgfVxuICBzZXQgc2VsZWN0ZWRNZXRob2Qodjogc3RyaW5nKSB7XG4gICAgdGhpcy5tZXRob2RGb3JtPy5wYXRjaFZhbHVlKHsgbWV0aG9kOiB2IH0pO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiB0aGUgc2VsZWN0ZWQgSFRUUCBtZXRob2QgaXMgR0VULCBIRUFELCBvciBERUxFVEUgKG5vIHJlcXVlc3QgYm9keSkuICovXG4gIGdldCBpc01ldGhvZFdpdGhvdXRCb2R5KCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuc2VsZWN0ZWRNZXRob2QgIT0gbnVsbCA/IFN0cmluZyh0aGlzLnNlbGVjdGVkTWV0aG9kKS50b1VwcGVyQ2FzZSgpIDogJyc7XG4gICAgcmV0dXJuIE1FVEhPRFNfV0lUSE9VVF9CT0RZLmluY2x1ZGVzKG1ldGhvZCk7XG4gIH1cblxuICAvKiogQ2FjaGVkIGVudmlyb25tZW50IHZhbHVlIGZyb20gbGFzdCBzZWxlY3Rpb24gKHNvIENyZWF0ZSBwYXlsb2FkIGhhcyB0aGUgc2VsZWN0ZWQgdmFsdWUpLiAqL1xuICBwcml2YXRlIGN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID0gJyc7XG5cbiAgLyoqIENhY2hlZCBIVFRQIG1ldGhvZCBmcm9tIGxhc3Qgc2VsZWN0aW9uIChzbyBDcmVhdGUgcGF5bG9hZCBoYXMgdGhlIHNlbGVjdGVkIHZhbHVlKS4gKi9cbiAgcHJpdmF0ZSBjdXJyZW50TWV0aG9kVmFsdWUgPSAnJztcblxuICAvKiogQ3VycmVudCBlbnZpcm9ubWVudCAoZnJvbSBmb3JtIG9yIGRlZmF1bHQ6IGZpcnN0IG9mIGVudmlyb25tZW50T3B0aW9ucykuIFRyZWF0cyBlbXB0eSBzdHJpbmcgYXMgdW5zZXQuICovXG4gIGdldCBzZWxlY3RlZEVudmlyb25tZW50KCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmVudmlyb25tZW50Rm9ybT8uZ2V0KCdlbnZpcm9ubWVudCcpPy52YWx1ZTtcbiAgICBjb25zdCBmaXJzdFZhbHVlID0gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmVudmlyb25tZW50T3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlc29sdmVkID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gJycgPyAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHZhbHVlIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpIDogU3RyaW5nKHZhbHVlKSkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc29sdmVkID8/IGZpcnN0VmFsdWUgPz8gJ0RldmVsb3BtZW50JztcbiAgfVxuICBzZXQgc2VsZWN0ZWRFbnZpcm9ubWVudCh2OiBzdHJpbmcpIHtcbiAgICB0aGlzLmVudmlyb25tZW50Rm9ybT8ucGF0Y2hWYWx1ZSh7IGVudmlyb25tZW50OiB2IH0pO1xuICB9XG5cbiAgLyoqIENhbGxlZCB3aGVuIHVzZXIgc2VsZWN0cyBhbiBlbnZpcm9ubWVudDsga2VlcHMgY3VycmVudEVudmlyb25tZW50VmFsdWUgaW4gc3luYyBmb3IgY3JlYXRlIHBheWxvYWQuICovXG4gIG9uRW52aXJvbm1lbnRTZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gZXZlbnQudmFsdWU7XG4gICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9XG4gICAgICB2ICE9IG51bGxcbiAgICAgICAgPyB0eXBlb2YgdiA9PT0gJ29iamVjdCdcbiAgICAgICAgICA/IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh2IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKVxuICAgICAgICAgIDogU3RyaW5nKHYpXG4gICAgICAgIDogJyc7XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdXNlciBzZWxlY3RzIGFuIEhUVFAgbWV0aG9kOyBrZWVwcyBjdXJyZW50TWV0aG9kVmFsdWUgaW4gc3luYyBmb3IgY3JlYXRlIHBheWxvYWQuICovXG4gIG9uTWV0aG9kU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9KTogdm9pZCB7XG4gICAgY29uc3QgdiA9IGV2ZW50LnZhbHVlO1xuICAgIHRoaXMuY3VycmVudE1ldGhvZFZhbHVlID1cbiAgICAgIHYgIT0gbnVsbFxuICAgICAgICA/IHR5cGVvZiB2ID09PSAnb2JqZWN0J1xuICAgICAgICAgID8gKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpXG4gICAgICAgICAgOiBTdHJpbmcodilcbiAgICAgICAgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgX3VybCA9ICcnO1xuXG4gIC8qKiBVUkwgZm9yIHRoZSByZXF1ZXN0LiBHZXR0ZXIvc2V0dGVyIHN5bmNzIHF1ZXJ5IHBhcmFtcyB3aXRoIHRoZSBQYXJhbXMgdGFiIChQb3N0bWFuLXN0eWxlKS4gKi9cbiAgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl91cmw7XG4gIH1cbiAgc2V0IHVybCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgbmV4dCA9IHZhbHVlID8/ICcnO1xuICAgIGlmICh0aGlzLl91cmwgPT09IG5leHQpIHJldHVybjtcbiAgICB0aGlzLl91cmwgPSBuZXh0O1xuICAgIGlmICh0aGlzLnBhcmFtc0Zvcm1BcnJheSkge1xuICAgICAgdGhpcy5wYXJhbXNTeW5jaW5nRnJvbVVybCA9IHRydWU7XG4gICAgICB0aGlzLnN5bmNQYXJhbXNGcm9tVXJsKCk7XG4gICAgICB0aGlzLnBhcmFtc1N5bmNpbmdGcm9tVXJsID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIFdoZW4gdHJ1ZSwgcGFyYW1zIGZvcm0gY2hhbmdlcyBzaG91bGQgbm90IHVwZGF0ZSB0aGUgVVJMICh3ZSdyZSBzeW5jaW5nIGZyb20gVVJMKS4gKi9cbiAgcHJpdmF0ZSBwYXJhbXNTeW5jaW5nRnJvbVVybCA9IGZhbHNlO1xuXG4gIHJlYWRvbmx5IHBheWxvYWRUYWJzOiB7IHZhbHVlOiBBcGlFZGl0UGF5bG9hZFRhYjsgbGFiZWw6IHN0cmluZyB9W10gPSBbXG4gICAgeyB2YWx1ZTogJ2F1dGhvcml6YXRpb24nLCBsYWJlbDogJ0F1dGhvcml6YXRpb24nIH0sXG4gICAgeyB2YWx1ZTogJ2hlYWRlcnMnLCBsYWJlbDogJ0hlYWRlcnMnIH0sXG4gICAgeyB2YWx1ZTogJ2JvZHknLCBsYWJlbDogJ0JvZHknIH0sXG4gICAgeyB2YWx1ZTogJ3BhcmFtcycsIGxhYmVsOiAnUGFyYW1zJyB9LFxuICBdO1xuICBhY3RpdmVQYXlsb2FkVGFiOiBBcGlFZGl0UGF5bG9hZFRhYiA9ICdoZWFkZXJzJztcblxuICAvKiogU3RlcCAzOiBSZXNwb25zZSB2ZXJpZmljYXRpb24gdGFicyAqL1xuICByZWFkb25seSByZXNwb25zZVZlcmlmaWNhdGlvblRhYnM6IHsgdmFsdWU6ICdyZXNwb25zZS1ib2R5JyB8ICdzdGF0dXMnOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtcbiAgICB7IHZhbHVlOiAncmVzcG9uc2UtYm9keScsIGxhYmVsOiAnUmVzcG9uc2UgQm9keScgfSxcbiAgICB7IHZhbHVlOiAnc3RhdHVzJywgbGFiZWw6ICdTdGF0dXMnIH0sXG4gIF07XG4gIGFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiOiAncmVzcG9uc2UtYm9keScgfCAnc3RhdHVzJyA9ICdyZXNwb25zZS1ib2R5JztcblxuICAvKiogUGF5bG9hZCB0eXBlIGZvciBCb2R5L1BhcmFtcy9BdXRob3JpemF0aW9uOiByYXcsIHgtd3d3LWZvcm0tdXJsZW5jb2RlZCwgZm9ybS1kYXRhICovXG4gIHBheWxvYWRUeXBlOiAncmF3JyB8ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnIHwgJ2Zvcm0tZGF0YScgPSAncmF3JztcblxuICAvKiogU2VnbWVudCBvcHRpb25zIGZvciBwYXlsb2FkIHR5cGUgKHVzZWQgYnkgY3FhLXNlZ21lbnQtY29udHJvbCkgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZFR5cGVTZWdtZW50cyA9IFtcbiAgICB7IGxhYmVsOiAnUmF3JywgdmFsdWU6ICdyYXcnIH0sXG4gICAgeyBsYWJlbDogJ3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsIHZhbHVlOiAneC13d3ctZm9ybS11cmxlbmNvZGVkJyB9LFxuICAgIHsgbGFiZWw6ICdGb3JtIERhdGEnLCB2YWx1ZTogJ2Zvcm0tZGF0YScgfSxcbiAgXTtcblxuICBvblBheWxvYWRUeXBlQ2hhbmdlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wYXlsb2FkVHlwZSA9IHZhbCBhcyAncmF3JyB8ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnIHwgJ2Zvcm0tZGF0YSc7XG4gIH1cblxuICAvKiogRm9ybSBmb3IgRm9ybWF0IHNlbGVjdCAoQm9keS9QYXJhbXMvQXV0aG9yaXphdGlvbikgKi9cbiAgcGF5bG9hZEZvcm1hdEZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIEZvcm1hdCBvcHRpb25zOiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgKHBhc3NlZCBmcm9tIHBhcmVudCkuIEZhbGxzIGJhY2sgdG8gSlNPTiwgWE1MLCBIVE1MLCBUZXh0IHdoZW4gZW1wdHkuICovXG4gIEBJbnB1dCgpIGZvcm1hdE9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIGluaXRpYWxGb3JtYXQ/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9GT1JNQVRfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ2pzb24nLCB2YWx1ZTogJ2pzb24nLCBuYW1lOiAnSlNPTicsIGxhYmVsOiAnSlNPTicgfSxcbiAgICB7IGlkOiAneG1sJywgdmFsdWU6ICd4bWwnLCBuYW1lOiAnWE1MJywgbGFiZWw6ICdYTUwnIH0sXG4gICAgeyBpZDogJ2h0bWwnLCB2YWx1ZTogJ2h0bWwnLCBuYW1lOiAnSFRNTCcsIGxhYmVsOiAnSFRNTCcgfSxcbiAgICB7IGlkOiAndGV4dCcsIHZhbHVlOiAndGV4dCcsIG5hbWU6ICdUZXh0JywgbGFiZWw6ICdUZXh0JyB9LFxuICBdO1xuXG4gIC8qKiBDb25maWcgZm9yIEZvcm1hdCBkcm9wZG93biAodXBkYXRlZCB3aGVuIGZvcm1hdE9wdGlvbnMgY2hhbmdlcywgbGlrZSBNZXRob2QgZHJvcGRvd24pICovXG4gIHBheWxvYWRGb3JtYXRTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdmb3JtYXQnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9GT1JNQVRfT1BUSU9OU10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYXlsb2FkRm9ybWF0U2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPVxuICAgICAgdGhpcy5mb3JtYXRPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5mb3JtYXRPcHRpb25zLm1hcCgoZikgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24oZikpXG4gICAgICAgIDogQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9GT1JNQVRfT1BUSU9OUztcbiAgICB0aGlzLnBheWxvYWRGb3JtYXRTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLnBheWxvYWRGb3JtYXRTZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEZvcm1hdFZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMuZm9ybWF0T3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuZm9ybWF0T3B0aW9uc1xuICAgICAgICA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0ZPUk1BVF9PUFRJT05TIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSk7XG4gICAgcmV0dXJuIHNvdXJjZVxuICAgICAgLm1hcCgoZikgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSlcbiAgICAgIC5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB2ICE9IG51bGwpO1xuICB9XG5cbiAgLyoqIFBheWxvYWQgdGV4dCBhcmVhIHZhbHVlIGZvciBCb2R5L1BhcmFtcy9BdXRob3JpemF0aW9uICovXG4gIHBheWxvYWRUZXh0ID0gJyc7XG5cbiAgLyoqIEpTT04gcGFyc2UgZXJyb3Igd2hlbiBmb3JtYXQgaXMgSlNPTiBhbmQgcGF5bG9hZCBpcyBpbnZhbGlkOyBudWxsIHdoZW4gdmFsaWQgb3Igbm90IEpTT04uICovXG4gIHBheWxvYWRKc29uRXJyb3I6IHtcbiAgICBsaW5lOiBudW1iZXI7XG4gICAgY29sdW1uOiBudW1iZXI7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGV4Y2VycHQ6IHN0cmluZztcbiAgICBjYXJldE9mZnNldDogbnVtYmVyO1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIExpbmUgbnVtYmVycyBmb3IgcGF5bG9hZCB0ZXh0YXJlYSAoMSwgMiwgMywgLi4uKSBiYXNlZCBvbiBjdXJyZW50IGxpbmUgY291bnQuICovXG4gIGdldCBwYXlsb2FkTGluZU51bWJlcnMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IG4gPSBNYXRoLm1heCgxLCAodGhpcy5wYXlsb2FkVGV4dCB8fCAnJykuc3BsaXQoL1xccj9cXG4vKS5sZW5ndGgpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuIH0sIChfLCBpKSA9PiBpICsgMSk7XG4gIH1cblxuICAvKiogV2hldGhlciBjdXJyZW50IHBheWxvYWQgZm9ybWF0IGlzIEpTT04gKHNvIHdlIHZhbGlkYXRlIGFuZCBzaG93IEpTT04gZWRpdG9yIGJlaGF2aW9yKS4gKi9cbiAgZ2V0IGlzUGF5bG9hZEZvcm1hdEpzb24oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZm9ybWF0ID0gdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybT8uZ2V0KCdmb3JtYXQnKT8udmFsdWU7XG4gICAgcmV0dXJuIGZvcm1hdCA9PT0gJ2pzb24nO1xuICB9XG5cbiAgLyoqIEVycm9yIG1lc3NhZ2VzIGZvciB0aGUgcGF5bG9hZCB0ZXh0YXJlYSAocmVkIGJvcmRlciArIGJvdHRvbSBsaW5lKS4gKi9cbiAgZ2V0IHBheWxvYWRKc29uRXJyb3JzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5wYXlsb2FkSnNvbkVycm9yID8gWydJbnZhbGlkIEpTT04gZm9ybWF0LiBQbGVhc2UgY2hlY2sgeW91ciBzeW50YXguJ10gOiBbXTtcbiAgfVxuXG4gIC8qKiBUb29sdGlwIGNvbnRlbnQgZm9yIHRoZSBsaW5lLWxldmVsIGVycm9yIGljb24gKHBhcnNlIGVycm9yIG9uIGxpbmUgWCwgZXhjZXJwdCwgY2FyZXQsIG1lc3NhZ2UpLiAqL1xuICBnZXQgcGF5bG9hZEpzb25FcnJvclRvb2x0aXAoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucGF5bG9hZEpzb25FcnJvcikgcmV0dXJuICcnO1xuICAgIGNvbnN0IGUgPSB0aGlzLnBheWxvYWRKc29uRXJyb3I7XG4gICAgY29uc3QgY2FyZXQgPSAnICcucmVwZWF0KGUuY2FyZXRPZmZzZXQpICsgJ14nO1xuICAgIHJldHVybiBgUGFyc2UgZXJyb3Igb24gbGluZSAke2UubGluZX06XFxuXFxuJHtlLmV4Y2VycHR9XFxuJHtjYXJldH1cXG5cXG4ke2UubWVzc2FnZX1gO1xuICB9XG5cbiAgb25QYXlsb2FkVGV4dENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wYXlsb2FkVGV4dCA9IHZhbHVlO1xuICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuICB9XG5cbiAgb25QYXlsb2FkSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsO1xuICAgIHRoaXMub25QYXlsb2FkVGV4dENoYW5nZSh0YXJnZXQ/LnZhbHVlID8/ICcnKTtcbiAgfVxuXG4gIG9uUGF5bG9hZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNQYXlsb2FkRm9ybWF0SnNvbikgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcbiAgICBjb25zdCBjbG9zZSA9IFBBWUxPQURfQVVUT19DTE9TRV9QQUlSU1trZXldO1xuICAgIGlmICghY2xvc2UpIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID8/IDA7XG4gICAgY29uc3QgZW5kID0gdGFyZ2V0LnNlbGVjdGlvbkVuZCA/PyBzdGFydDtcbiAgICBjb25zdCBiZWZvcmUgPSB0aGlzLnBheWxvYWRUZXh0LnNsaWNlKDAsIHN0YXJ0KTtcbiAgICBjb25zdCBhZnRlciA9IHRoaXMucGF5bG9hZFRleHQuc2xpY2UoZW5kKTtcbiAgICBjb25zdCBpbnNlcnRQb3MgPSBzdGFydCArIDE7XG4gICAgY29uc3QgbmV3VmFsdWUgPSBiZWZvcmUgKyBrZXkgKyBjbG9zZSArIGFmdGVyO1xuICAgIHRoaXMucGF5bG9hZFRleHQgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucGF5bG9hZFRleHRhcmVhUmVmPy5uYXRpdmVFbGVtZW50Py5zZXRTZWxlY3Rpb25SYW5nZShpbnNlcnRQb3MsIGluc2VydFBvcyk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKiogVmFsaWRhdGUgcGF5bG9hZCB3aGVuIGZvcm1hdCBpcyBKU09OOyBzZXRzIHBheWxvYWRKc29uRXJyb3Igb3IgY2xlYXJzIGl0LiAqL1xuICB2YWxpZGF0ZVBheWxvYWRKc29uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1BheWxvYWRGb3JtYXRKc29uKSB7XG4gICAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5wYXlsb2FkVGV4dCA/PyAnJztcbiAgICBpZiAodGV4dC50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmV4dHJhY3RQb3NpdGlvbkZyb21Kc29uRXJyb3IobWVzc2FnZSk7XG4gICAgICBjb25zdCB7IGxpbmUsIGNvbHVtbiB9ID0gdGhpcy5wb3NpdGlvblRvTGluZUNvbHVtbih0ZXh0LCBwb3NpdGlvbik7XG4gICAgICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgIGNvbnN0IGxpbmVJbmRleCA9IE1hdGgubWF4KDAsIGxpbmUgLSAxKTtcbiAgICAgIGNvbnN0IGxpbmVDb250ZW50ID0gbGluZXNbbGluZUluZGV4XSA/PyAnJztcbiAgICAgIGNvbnN0IGV4Y2VycHQgPSBsaW5lQ29udGVudCB8fCAnICc7XG4gICAgICBjb25zdCBjYXJldE9mZnNldCA9IGxpbmVJbmRleCA9PT0gbGluZSAtIDEgPyBNYXRoLm1pbihjb2x1bW4gLSAxLCBsaW5lQ29udGVudC5sZW5ndGgpIDogMDtcbiAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IHtcbiAgICAgICAgbGluZSxcbiAgICAgICAgY29sdW1uLFxuICAgICAgICBtZXNzYWdlOiB0aGlzLm5vcm1hbGl6ZUpzb25FcnJvck1lc3NhZ2UobWVzc2FnZSksXG4gICAgICAgIGV4Y2VycHQsXG4gICAgICAgIGNhcmV0T2Zmc2V0LFxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RQb3NpdGlvbkZyb21Kc29uRXJyb3IobWVzc2FnZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBtYXRjaCA9IG1lc3NhZ2UubWF0Y2goL3Bvc2l0aW9uXFxzKyhcXGQrKS9pKSB8fCBtZXNzYWdlLm1hdGNoKC9hdFxccytwb3NpdGlvblxccysoXFxkKykvaSk7XG4gICAgcmV0dXJuIG1hdGNoID8gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKSA6IDA7XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uVG9MaW5lQ29sdW1uKHRleHQ6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6IHsgbGluZTogbnVtYmVyOyBjb2x1bW46IG51bWJlciB9IHtcbiAgICBjb25zdCBiZWZvcmUgPSB0ZXh0LnNsaWNlKDAsIE1hdGgubWluKHBvc2l0aW9uLCB0ZXh0Lmxlbmd0aCkpO1xuICAgIGNvbnN0IGxpbmVzID0gYmVmb3JlLnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgY29uc3QgbGluZSA9IGxpbmVzLmxlbmd0aDtcbiAgICBjb25zdCBsYXN0TGluZSA9IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID8/ICcnO1xuICAgIHJldHVybiB7IGxpbmUsIGNvbHVtbjogbGFzdExpbmUubGVuZ3RoICsgMSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVKc29uRXJyb3JNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoJ0V4cGVjdGluZycpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoJ2V4cGVjdGluZycpKSByZXR1cm4gbWVzc2FnZTtcbiAgICBjb25zdCB0b2tlbk1hdGNoID0gbWVzc2FnZS5tYXRjaCgvVW5leHBlY3RlZCB0b2tlblxccytbJ1wiXT8oW14nXCJdKylbJ1wiXT8vaSlcbiAgICAgIHx8IG1lc3NhZ2UubWF0Y2goL3VuZXhwZWN0ZWQgY2hhcmFjdGVyLio/KFteXFxzXSspL2kpO1xuICAgIGNvbnN0IHRva2VuID0gdG9rZW5NYXRjaCA/IHRva2VuTWF0Y2hbMV0udHJpbSgpIDogJ3VuZGVmaW5lZCc7XG4gICAgcmV0dXJuIGBFeHBlY3RpbmcgJ1NUUklORycsICdOVU1CRVInLCAnTlVMTCcsICdUUlVFJywgJ0ZBTFNFJywgJ3snLCAnWycsIGdvdCAnJHt0b2tlbn0nYDtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ3BheWxvYWRFZGl0b3JXaXRoTGluZXNSZWYnKSBwYXlsb2FkRWRpdG9yV2l0aExpbmVzUmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BheWxvYWRUZXh0YXJlYVJlZicpIHBheWxvYWRUZXh0YXJlYVJlZj86IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9IRUFERVJfTkFNRV9PUFRJT05TOiBzdHJpbmdbXSA9IFtcbiAgICAnQWNjZXB0JyxcbiAgICAnQWNjZXB0LUNoYXJzZXQnLFxuICAgICdBY2NlcHQtRW5jb2RpbmcnLFxuICAgICdBY2NlcHQtTGFuZ3VhZ2UnLFxuICAgICdBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LUhlYWRlcnMnLFxuICAgICdBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LU1ldGhvZCcsXG4gICAgJ1NjcmlwdHMnLFxuICAgICdDYWNoZS1Db250cm9sJyxcbiAgICAnQ29udGVudC1NRDUnLFxuICAgICdDb250ZW50LUxlbmd0aCcsXG4gICAgJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLFxuICAgICdDb250ZW50LVR5cGUnLFxuICAgICdDb29raWUnLFxuICAgICdEYXRlJyxcbiAgICAnRXhwZWN0JyxcbiAgICAnRnJvbScsXG4gICAgJ0hvc3QnLFxuICAgICdJZi1NYXRjaCcsXG4gICAgJ0lmLU1vZGlmaWVkLVNpbmNlJyxcbiAgICAnSWYtTm9uZS1NYXRjaCcsXG4gICAgJ0lmLVVubW9kaWZpZWQtU2luY2UnLFxuICAgICdJZi1SYW5nZScsXG4gICAgJ0tlZXAtQWxpdmUnLFxuICAgICdNYXgtRm9yd2FyZHMnLFxuICAgICdPcmlnaW4nLFxuICAgICdQcmFnbWEnLFxuICAgICdQcm94eS1BdXRob3JpemF0aW9uJyxcbiAgICAnUmFuZ2UnLFxuICAgICdSZWZlcmVyJyxcbiAgICAnVEUnLFxuICAgICdUcmFpbGVyJyxcbiAgICAnVHJhbnNmZXItRW5jb2RpbmcnLFxuICAgICdVcGdyYWRlJyxcbiAgICAnVXNlci1BZ2VudCcsXG4gICAgJ1ZpYScsXG4gICAgJ1dhcm5pbmcnLFxuICAgICdYLVJlcXVlc3RlZC1XaXRoJyxcbiAgICAnWC1Eby1Ob3QtVHJhY2snLFxuICAgICdETlQnLFxuICAgICd4LWFwaS1rZXknLFxuICAgICdDb25uZWN0aW9uJyxcbiAgXTtcblxuICAvKiogSGVhZGVyIG5hbWUgb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHdpdGggaWQsIG5hbWUsIHZhbHVlLCBsYWJlbCAocGFzc2VkIGZyb20gcGFyZW50KS4gRmFsbHMgYmFjayB0byBidWlsdC1pbiBsaXN0IHdoZW4gZW1wdHkuICovXG4gIEBJbnB1dCgpIGhlYWRlck5hbWVPcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbklucHV0W10gPSBbXTtcblxuICAvKiogRm9ybSBhcnJheSBmb3IgaGVhZGVyIHJvd3M7IGVhY2ggaXRlbSBpcyBGb3JtR3JvdXAoeyBuYW1lLCB2YWx1ZSB9KSBmb3IgY3FhLWR5bmFtaWMtc2VsZWN0IGFuZCB2YWx1ZSBpbnB1dCAqL1xuICBoZWFkZXJzRm9ybUFycmF5ITogRm9ybUFycmF5O1xuXG4gIC8qKiBUeXBlZCBhY2Nlc3NvciBmb3IgdGVtcGxhdGUgKEZvcm1BcnJheS5jb250cm9scyBpcyBBYnN0cmFjdENvbnRyb2xbXSkgKi9cbiAgZ2V0IGhlYWRlclJvd3MoKTogRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy5oZWFkZXJzRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogQ29uZmlnIGZvciBoZWFkZXIgbmFtZSBkcm9wZG93biAodXBkYXRlZCB3aGVuIGhlYWRlck5hbWVPcHRpb25zIGNoYW5nZXMgdG8gYXZvaWQgbmV3IHJlZmVyZW5jZSBldmVyeSBDRCkgKi9cbiAgaGVhZGVyTmFtZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ25hbWUnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGhlYWRlcicsXG4gICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICBhbGxvd0N1c3RvbVZhbHVlOiB0cnVlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBzb3VyY2UgPVxuICAgICAgdGhpcy5oZWFkZXJOYW1lT3B0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuaGVhZGVyTmFtZU9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9IRUFERVJfTkFNRV9PUFRJT05TIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXRbXSk7XG4gICAgY29uc3QgYmFzZU9wdGlvbnMgPSBzb3VyY2UubWFwKChoKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihoKSk7XG4gICAgY29uc3QgYmFzZVZhbHVlcyA9IG5ldyBTZXQoYmFzZU9wdGlvbnMubWFwKChvKSA9PiBTdHJpbmcoby52YWx1ZSA/PyBvLmlkID8/ICcnKS50cmltKCkpLmZpbHRlcihCb29sZWFuKSk7XG4gICAgY29uc3QgY3VycmVudE5hbWVzRnJvbUZvcm0gPSB0aGlzLmdldEN1cnJlbnRIZWFkZXJOYW1lc0Zyb21Gb3JtKCk7XG4gICAgY29uc3QgZXh0cmFPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBjdXJyZW50TmFtZXNGcm9tRm9ybSkge1xuICAgICAgY29uc3Qga2V5ID0gbmFtZS50cmltKCk7XG4gICAgICBpZiAoa2V5ICYmICFiYXNlVmFsdWVzLmhhcyhrZXkpKSB7XG4gICAgICAgIGJhc2VWYWx1ZXMuYWRkKGtleSk7XG4gICAgICAgIGV4dHJhT3B0aW9ucy5wdXNoKHsgaWQ6IGtleSwgdmFsdWU6IGtleSwgbmFtZToga2V5LCBsYWJlbDoga2V5IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvcHRpb25zID0gWy4uLmJhc2VPcHRpb25zLCAuLi5leHRyYU9wdGlvbnNdO1xuICAgIHRoaXMuaGVhZGVyTmFtZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuaGVhZGVyTmFtZVNlbGVjdENvbmZpZyxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDb2xsZWN0cyBkaXN0aW5jdCBub24tZW1wdHkgaGVhZGVyIG5hbWVzIGN1cnJlbnRseSBpbiB0aGUgaGVhZGVycyBmb3JtIChmb3IgZHluYW1pYyBvcHRpb25zKS4gKi9cbiAgcHJpdmF0ZSBnZXRDdXJyZW50SGVhZGVyTmFtZXNGcm9tRm9ybSgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgbmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGlmICghdGhpcy5oZWFkZXJzRm9ybUFycmF5Py5jb250cm9scz8ubGVuZ3RoKSByZXR1cm4gbmFtZXM7XG4gICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuaGVhZGVyc0Zvcm1BcnJheS5jb250cm9scykge1xuICAgICAgY29uc3QgbmFtZSA9IChjb250cm9sIGFzIEZvcm1Hcm91cCkuZ2V0KCduYW1lJyk/LnZhbHVlO1xuICAgICAgY29uc3Qgc3RyID0gbmFtZSAhPSBudWxsID8gU3RyaW5nKG5hbWUpLnRyaW0oKSA6ICcnO1xuICAgICAgaWYgKHN0ciAmJiAhc2Vlbi5oYXMoc3RyKSkge1xuICAgICAgICBzZWVuLmFkZChzdHIpO1xuICAgICAgICBuYW1lcy5wdXNoKHN0cik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdEhlYWRlcnM6IEFwaUVkaXRIZWFkZXJSb3dbXSA9IFtcbiAgICB7IG5hbWU6ICdDb250ZW50LVR5cGUnLCB0eXBlOiAnc3RyaW5nJywgdmFsdWU6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICBdO1xuXG4gIC8qKiBGb3JtIGFycmF5IGZvciBrZXktdmFsdWUgcm93cyAoQm9keSBwYXlsb2FkKTsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IGtleSwgdmFsdWUgfSkgKi9cbiAga2V5VmFsdWVGb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgZ2V0IGtleVZhbHVlUm93cygpOiBGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuICh0aGlzLmtleVZhbHVlRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogRm9ybSBhcnJheSBmb3Iga2V5LXR5cGUtdmFsdWUgcm93czsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IGtleSwgdHlwZSwgdmFsdWUgfSkgKi9cbiAga2V5VHlwZVZhbHVlRm9ybUFycmF5ITogRm9ybUFycmF5O1xuXG4gIGdldCBrZXlUeXBlVmFsdWVSb3dzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMua2V5VHlwZVZhbHVlRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogRm9ybSBhcnJheSBmb3IgUGFyYW1zIHRhYiBrZXktdmFsdWUgcm93czsgZWFjaCBpdGVtIGlzIEZvcm1Hcm91cCh7IGtleSwgdmFsdWUgfSkgKi9cbiAgcGFyYW1zRm9ybUFycmF5ITogRm9ybUFycmF5O1xuXG4gIGdldCBwYXJhbXNSb3dzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMucGFyYW1zRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogQ29uZmlnIGZvciBUeXBlIGRyb3Bkb3duIGluIGtleS10eXBlLXZhbHVlIHJvd3MgKFRleHQsIEZpbGUpICovXG4gIHJlYWRvbmx5IGtleVR5cGVWYWx1ZVR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd0eXBlJyxcbiAgICBwbGFjZWhvbGRlcjogJ1RleHQnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgaWQ6ICd0ZXh0JywgdmFsdWU6ICd0ZXh0JywgbmFtZTogJ1RleHQnLCBsYWJlbDogJ1RleHQnIH0sXG4gICAgICB7IGlkOiAnZmlsZScsIHZhbHVlOiAnZmlsZScsIG5hbWU6ICdGaWxlJywgbGFiZWw6ICdGaWxlJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgLyoqIEZvcm0gYXJyYXkgZm9yIHJlc3BvbnNlIGJvZHkgdmVyaWZpY2F0aW9uIHJvd3M7IGVhY2ggaXRlbSBpcyBGb3JtR3JvdXAoeyBqc29uUGF0aCwgdmVyaWZpY2F0aW9uLCBkYXRhVHlwZSwgZXhwZWN0ZWRWYWx1ZSB9KSAqL1xuICB2ZXJpZmljYXRpb25Gb3JtQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgZ2V0IHZlcmlmaWNhdGlvblJvd3MoKTogRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKSBhcyBGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIC8qKiBWZXJpZmljYXRpb24gb3B0aW9uczogYXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIChwYXNzZWQgZnJvbSBwYXJlbnQpLiBGYWxscyBiYWNrIHRvIGJ1aWx0LWluIGxpc3Qgd2hlbiBlbXB0eS4gKi9cbiAgQElucHV0KCkgdmVyaWZpY2F0aW9uT3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9WRVJJRklDQVRJT05fT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ2VxdWFscycsIHZhbHVlOiAnZXF1YWxzJywgbmFtZTogJ0VxdWFscycsIGxhYmVsOiAnRXF1YWxzJyB9LFxuICAgIHsgaWQ6ICdub3QtZXF1YWwnLCB2YWx1ZTogJ25vdC1lcXVhbCcsIG5hbWU6ICdOb3QgZXF1YWwnLCBsYWJlbDogJ05vdCBlcXVhbCcgfSxcbiAgICB7IGlkOiAnbGVzcy10aGFuJywgdmFsdWU6ICdsZXNzLXRoYW4nLCBuYW1lOiAnTGVzcyB0aGFuJywgbGFiZWw6ICdMZXNzIHRoYW4nIH0sXG4gICAgeyBpZDogJ2dyZWF0ZXItdGhhbicsIHZhbHVlOiAnZ3JlYXRlci10aGFuJywgbmFtZTogJ0dyZWF0ZXIgdGhhbicsIGxhYmVsOiAnR3JlYXRlciB0aGFuJyB9LFxuICAgIHsgaWQ6ICdpcy1udWxsJywgdmFsdWU6ICdpcy1udWxsJywgbmFtZTogJ0lzIG51bGwnLCBsYWJlbDogJ0lzIG51bGwnIH0sXG4gICAgeyBpZDogJ2lzLW5vdC1udWxsJywgdmFsdWU6ICdpcy1ub3QtbnVsbCcsIG5hbWU6ICdJcyBub3QgbnVsbCcsIGxhYmVsOiAnSXMgbm90IG51bGwnIH0sXG4gIF07XG5cbiAgLyoqIENvbmZpZyBmb3IgVmVyaWZpY2F0aW9uIGRyb3Bkb3duICh1cGRhdGVkIHdoZW4gdmVyaWZpY2F0aW9uT3B0aW9ucyBjaGFuZ2VzLCBsaWtlIE1ldGhvZCBkcm9wZG93bikgKi9cbiAgdmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndmVyaWZpY2F0aW9uJyxcbiAgICBwbGFjZWhvbGRlcjogJ0VxdWFscycsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogWy4uLkFwaUVkaXRTdGVwQ29tcG9uZW50LkRFRkFVTFRfVkVSSUZJQ0FUSU9OX09QVElPTlNdLFxuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPVxuICAgICAgdGhpcy52ZXJpZmljYXRpb25PcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy52ZXJpZmljYXRpb25PcHRpb25zLm1hcCgodikgPT4gQXBpRWRpdFN0ZXBDb21wb25lbnQudG9TZWxlY3RPcHRpb24odikpXG4gICAgICAgIDogQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9WRVJJRklDQVRJT05fT1BUSU9OUztcbiAgICB0aGlzLnZlcmlmaWNhdGlvblNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMudmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRWZXJpZmljYXRpb25WYWx1ZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNvdXJjZSA9XG4gICAgICB0aGlzLnZlcmlmaWNhdGlvbk9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnZlcmlmaWNhdGlvbk9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9WRVJJRklDQVRJT05fT1BUSU9OUyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0W10pO1xuICAgIHJldHVybiBzb3VyY2VcbiAgICAgIC5tYXAoKHYpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFZlcmlmaWNhdGlvbigpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmVyaWZpY2F0aW9uVmFsdWVzKCk7XG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPiAwID8gdmFsdWVzWzBdIDogJ2VxdWFscyc7XG4gIH1cblxuICAvKiogRGF0YSBUeXBlIG9wdGlvbnM6IGFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyAocGFzc2VkIGZyb20gcGFyZW50KS4gRmFsbHMgYmFjayB0byBidWlsdC1pbiBsaXN0IHdoZW4gZW1wdHkuICovXG4gIEBJbnB1dCgpIHZlcmlmaWNhdGlvbkRhdGFUeXBlT3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9EQVRBX1RZUEVfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ3N0cmluZycsIHZhbHVlOiAnc3RyaW5nJywgbmFtZTogJ1N0cmluZycsIGxhYmVsOiAnU3RyaW5nJyB9LFxuICAgIHsgaWQ6ICdudW1iZXInLCB2YWx1ZTogJ251bWJlcicsIG5hbWU6ICdOdW1iZXInLCBsYWJlbDogJ051bWJlcicgfSxcbiAgICB7IGlkOiAnYm9vbGVhbicsIHZhbHVlOiAnYm9vbGVhbicsIG5hbWU6ICdCb29sZWFuJywgbGFiZWw6ICdCb29sZWFuJyB9LFxuICAgIHsgaWQ6ICdhcnJheScsIHZhbHVlOiAnYXJyYXknLCBuYW1lOiAnQXJyYXknLCBsYWJlbDogJ0FycmF5JyB9LFxuICAgIHsgaWQ6ICdvYmplY3QnLCB2YWx1ZTogJ29iamVjdCcsIG5hbWU6ICdPYmplY3QnLCBsYWJlbDogJ09iamVjdCcgfSxcbiAgXTtcblxuICAvKiogQ29uZmlnIGZvciBEYXRhIFR5cGUgZHJvcGRvd24gKHVwZGF0ZWQgd2hlbiB2ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnMgY2hhbmdlcywgbGlrZSBNZXRob2QgZHJvcGRvd24pICovXG4gIHZlcmlmaWNhdGlvbkRhdGFUeXBlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZGF0YVR5cGUnLFxuICAgIHBsYWNlaG9sZGVyOiAnU3RyaW5nJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbLi4uQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9EQVRBX1RZUEVfT1BUSU9OU10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVWZXJpZmljYXRpb25EYXRhVHlwZVNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID1cbiAgICAgIHRoaXMudmVyaWZpY2F0aW9uRGF0YVR5cGVPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy52ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnMubWFwKChkKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihkKSlcbiAgICAgICAgOiBBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX0RBVEFfVFlQRV9PUFRJT05TO1xuICAgIHRoaXMudmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLnZlcmlmaWNhdGlvbkRhdGFUeXBlU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRhVHlwZVZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID1cbiAgICAgIHRoaXMudmVyaWZpY2F0aW9uRGF0YVR5cGVPcHRpb25zPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy52ZXJpZmljYXRpb25EYXRhVHlwZU9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9EQVRBX1RZUEVfT1BUSU9OUyBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0W10pO1xuICAgIHJldHVybiBzb3VyY2VcbiAgICAgIC5tYXAoKGQpID0+IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKGQgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkpXG4gICAgICAuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPSBudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdERhdGFUeXBlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXREYXRhVHlwZVZhbHVlcygpO1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID4gMCA/IHZhbHVlc1swXSA6ICdzdHJpbmcnO1xuICB9XG5cbiAgLyoqIENvbmZpZyBmb3IgRXhwZWN0ZWQgVmFsdWUgd2hlbiBEYXRhIFR5cGUgaXMgQm9vbGVhbiAodHJ1ZS9mYWxzZSBkcm9wZG93bikgKi9cbiAgcmVhZG9ubHkgdmVyaWZpY2F0aW9uRXhwZWN0ZWRWYWx1ZUJvb2xlYW5TZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdleHBlY3RlZFZhbHVlJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyBpZDogJ3RydWUnLCB2YWx1ZTogJ3RydWUnLCBuYW1lOiAndHJ1ZScsIGxhYmVsOiAndHJ1ZScgfSxcbiAgICAgIHsgaWQ6ICdmYWxzZScsIHZhbHVlOiAnZmFsc2UnLCBuYW1lOiAnZmFsc2UnLCBsYWJlbDogJ2ZhbHNlJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgLyoqIEZvcm0gYXJyYXkgZm9yIFN0YXR1cyB0YWIgdmVyaWZpY2F0aW9uIHJvd3M7IGVhY2ggaXRlbSBpcyBGb3JtR3JvdXAoeyB2ZXJpZmljYXRpb24sIGV4cGVjdGVkVmFsdWUgfSkgKi9cbiAgc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5ITogRm9ybUFycmF5O1xuXG4gIGdldCBzdGF0dXNWZXJpZmljYXRpb25Sb3dzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkgYXMgRm9ybUdyb3VwW107XG4gIH1cblxuICAvKiogQ29uZmlnIGZvciBTdGF0dXMgdGFiIFZlcmlmaWNhdGlvbiBkcm9wZG93biAoRXF1YWxzLCBOb3QgZXF1YWwsIExlc3MgdGhhbiwgR3JlYXRlciB0aGFuKSAqL1xuICAvKiogU3RhdHVzIHRhYiBWZXJpZmljYXRpb24gb3B0aW9ucyAoRXF1YWxzLCBOb3QgZXF1YWwsIGV0Yy4pLiBGYWxscyBiYWNrIHRvIGJ1aWx0LWluIGxpc3Qgd2hlbiBlbXB0eS4gKi9cbiAgQElucHV0KCkgc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdID0gW107XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9TVEFUVVNfVkVSSUZJQ0FUSU9OX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdlcXVhbHMnLCB2YWx1ZTogJ2VxdWFscycsIG5hbWU6ICdFcXVhbHMnLCBsYWJlbDogJ0VxdWFscycgfSxcbiAgICB7IGlkOiAnbm90LWVxdWFsJywgdmFsdWU6ICdub3QtZXF1YWwnLCBuYW1lOiAnTm90IGVxdWFsJywgbGFiZWw6ICdOb3QgZXF1YWwnIH0sXG4gICAgeyBpZDogJ2xlc3MtdGhhbicsIHZhbHVlOiAnbGVzcy10aGFuJywgbmFtZTogJ0xlc3MgdGhhbicsIGxhYmVsOiAnTGVzcyB0aGFuJyB9LFxuICAgIHsgaWQ6ICdncmVhdGVyLXRoYW4nLCB2YWx1ZTogJ2dyZWF0ZXItdGhhbicsIG5hbWU6ICdHcmVhdGVyIHRoYW4nLCBsYWJlbDogJ0dyZWF0ZXIgdGhhbicgfSxcbiAgXTtcblxuICAvKiogQ29uZmlnIGZvciBTdGF0dXMgdGFiIFZlcmlmaWNhdGlvbiBkcm9wZG93biAodXBkYXRlZCB3aGVuIHN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnMgY2hhbmdlcykuICovXG4gIHN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3ZlcmlmaWNhdGlvbicsXG4gICAgcGxhY2Vob2xkZXI6ICdFcXVhbHMnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFsuLi5BcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX1NUQVRVU19WRVJJRklDQVRJT05fT1BUSU9OU10sXG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9XG4gICAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnMubWFwKChvKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC50b1NlbGVjdE9wdGlvbihvKSlcbiAgICAgICAgOiBBcGlFZGl0U3RlcENvbXBvbmVudC5ERUZBVUxUX1NUQVRVU19WRVJJRklDQVRJT05fT1BUSU9OUztcbiAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGF0dXNWZXJpZmljYXRpb25WYWx1ZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNvdXJjZSA9XG4gICAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbk9wdGlvbnNcbiAgICAgICAgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuREVGQVVMVF9TVEFUVVNfVkVSSUZJQ0FUSU9OX09QVElPTlMgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dFtdKTtcbiAgICByZXR1cm4gc291cmNlXG4gICAgICAubWFwKChvKSA9PiBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShvIGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpKVxuICAgICAgLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+IHYgIT0gbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRTdGF0dXNWZXJpZmljYXRpb24oKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFN0YXR1c1ZlcmlmaWNhdGlvblZhbHVlcygpO1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID4gMCA/IHZhbHVlc1swXSA6ICdlcXVhbHMnO1xuICB9XG5cbiAgcmVzcG9uc2VQcmV2aWV3ID0gYGA7XG5cbiAgcHJpdmF0ZSBtZXRob2RDaGFuZ2VzU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGZvcm1hdENoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgaGVhZGVyTmFtZU9wdGlvbnNDaGFuZ2VzU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGVudmlyb25tZW50Rm9ybUNoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgbWV0aG9kRm9ybUNoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgcGFyYW1zRm9ybUFycmF5Q2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcblxuICAvLyBBZHZhbmNlZCBzZXR0aW5nczogZ2VuZXJpYyBhZHZhbmNlZCB2YXJpYWJsZXMgZm9yIHRoaXMgQVBJIHN0ZXAgKGNhbiBiZSBwcm92aWRlZCBieSBwYXJlbnQpXG4gIGFkdmFuY2VkRXhwYW5kZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzOiBhbnlbXSA9IFtdO1xuICBhZHZhbmNlZFZhcmlhYmxlc0Zvcm06IEZvcm1BcnJheSA9IG5ldyBGb3JtQXJyYXkoW10pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYXBwbHlJbml0aWFsU3RlcCh0aGlzLmluaXRpYWxTdGVwKTtcbiAgICB0aGlzLnVwZGF0ZU1ldGhvZFNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIGNvbnN0IGZpcnN0TWV0aG9kVmFsdWUgPSB0aGlzLmh0dHBNZXRob2RPcHRpb25zPy5sZW5ndGhcbiAgICAgID8gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodGhpcy5odHRwTWV0aG9kT3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlZmF1bHRNZXRob2QgPSB0aGlzLmluaXRpYWxNZXRob2QgPz8gZmlyc3RNZXRob2RWYWx1ZSA/PyAnR0VUJztcbiAgICB0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSA9IHR5cGVvZiBkZWZhdWx0TWV0aG9kID09PSAnc3RyaW5nJyA/IGRlZmF1bHRNZXRob2QgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdE1ldGhvZCBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgdGhpcy5tZXRob2RGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBtZXRob2Q6IFtkZWZhdWx0TWV0aG9kXSxcbiAgICB9KTtcbiAgICBjb25zdCBmaXJzdFZhbHVlID0gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmVudmlyb25tZW50T3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlZmF1bHRFbnYgPSB0aGlzLmluaXRpYWxFbnZpcm9ubWVudCA/PyBmaXJzdFZhbHVlID8/ICdEZXZlbG9wbWVudCc7XG4gICAgdGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSA9IHR5cGVvZiBkZWZhdWx0RW52ID09PSAnc3RyaW5nJyA/IGRlZmF1bHRFbnYgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdEVudiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgdGhpcy5lbnZpcm9ubWVudEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGVudmlyb25tZW50OiBbZGVmYXVsdEVudl0sXG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVBdXRoVHlwZVNlbGVjdENvbmZpZygpO1xuICAgIGNvbnN0IGZpcnN0QXV0aFZhbHVlID0gdGhpcy5nZXRBdXRoVHlwZVZhbHVlcygpWzBdO1xuICAgIGNvbnN0IGRlZmF1bHRBdXRoVHlwZSA9IHRoaXMuaW5pdGlhbEF1dGhUeXBlID8/IGZpcnN0QXV0aFZhbHVlID8/ICduby1hdXRoJztcbiAgICB0aGlzLmF1dGhUeXBlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgYXV0aFR5cGU6IFtkZWZhdWx0QXV0aFR5cGVdLFxuICAgIH0pO1xuICAgIHRoaXMub2F1dGgyRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZ3JhbnRUeXBlOiBbJ2NsaWVudF9jcmVkZW50aWFscyddLFxuICAgICAgYWNjZXNzVG9rZW5Vcmw6IFsnJ10sXG4gICAgICBjbGllbnRJZDogWycnXSxcbiAgICAgIGNsaWVudFNlY3JldDogWycnXSxcbiAgICAgIHNjb3BlOiBbJyddLFxuICAgICAgY2xpZW50QXV0aGVudGljYXRpb246IFsnYmFzaWMnXSxcbiAgICB9KTtcbiAgICB0aGlzLmVudmlyb25tZW50Rm9ybUNoYW5nZXNTdWIgPSB0aGlzLmVudmlyb25tZW50Rm9ybS5nZXQoJ2Vudmlyb25tZW50Jyk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCh2OiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBzID0gdiAhPSBudWxsICYmIHYgIT09ICcnID8gKHR5cGVvZiB2ID09PSAnb2JqZWN0JyA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgOiBTdHJpbmcodikpIDogJyc7XG4gICAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID0gcyA/PyAnJztcbiAgICB9KTtcbiAgICB0aGlzLm1ldGhvZEZvcm1DaGFuZ2VzU3ViID0gdGhpcy5tZXRob2RGb3JtLmdldCgnbWV0aG9kJyk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCh2OiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBzID0gdiAhPSBudWxsICYmIHYgIT09ICcnID8gKHR5cGVvZiB2ID09PSAnb2JqZWN0JyA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgOiBTdHJpbmcodikpIDogJyc7XG4gICAgICB0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSA9IHMgPz8gJyc7XG4gICAgfSk7XG4gICAgdGhpcy5idWlsZEhlYWRlcnNGb3JtQXJyYXkoXG4gICAgICB0aGlzLmluaXRpYWxIZWFkZXJzID8/IFt7IG5hbWU6ICcnLCB0eXBlOiAnc3RyaW5nJywgdmFsdWU6ICcnIH1dXG4gICAgKTtcbiAgICB0aGlzLmhlYWRlck5hbWVPcHRpb25zQ2hhbmdlc1N1YiA9IHRoaXMuaGVhZGVyc0Zvcm1BcnJheT8udmFsdWVDaGFuZ2VzPy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgICB0aGlzLmhlYWRlcnNDaGFuZ2UuZW1pdCh0aGlzLmhlYWRlcnMpO1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMuaGVhZGVyc0NoYW5nZS5lbWl0KHRoaXMuaGVhZGVycyk7XG4gICAgdGhpcy51cGRhdGVFbnZpcm9ubWVudFNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMudXBkYXRlUGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZygpO1xuICAgIGNvbnN0IGZpcnN0Rm9ybWF0VmFsdWUgPSB0aGlzLmdldEZvcm1hdFZhbHVlcygpWzBdO1xuICAgIGNvbnN0IGRlZmF1bHRGb3JtYXQgPSB0aGlzLmluaXRpYWxGb3JtYXQgPz8gZmlyc3RGb3JtYXRWYWx1ZSA/PyAnanNvbic7XG4gICAgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoeyBmb3JtYXQ6IFtkZWZhdWx0Rm9ybWF0XSB9KTtcbiAgICB0aGlzLmJ1aWxkS2V5VmFsdWVGb3JtQXJyYXkoKTtcbiAgICB0aGlzLmJ1aWxkS2V5VHlwZVZhbHVlRm9ybUFycmF5KCk7XG4gICAgdGhpcy5idWlsZFBhcmFtc0Zvcm1BcnJheSgpO1xuICAgIHRoaXMucGFyYW1zRm9ybUFycmF5Q2hhbmdlc1N1YiA9IHRoaXMucGFyYW1zRm9ybUFycmF5LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCgpID0+IHRoaXMuc3luY1VybEZyb21QYXJhbXMoKSk7XG4gICAgaWYgKHRoaXMuaW5pdGlhbFVybCAhPSBudWxsICYmIHRoaXMuaW5pdGlhbFVybCAhPT0gJycpIHtcbiAgICAgIHRoaXMuX3VybCA9IHRoaXMuaW5pdGlhbFVybDtcbiAgICAgIHRoaXMuc3luY1BhcmFtc0Zyb21VcmwoKTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6ZSB2YXJpYWJsZU5hbWUgZnJvbSBpbml0aWFsVmFyaWFibGVOYW1lXG4gICAgaWYgKHRoaXMuaW5pdGlhbFZhcmlhYmxlTmFtZSAhPSBudWxsICYmIHRoaXMuaW5pdGlhbFZhcmlhYmxlTmFtZSAhPT0gJycpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lID0gdGhpcy5pbml0aWFsVmFyaWFibGVOYW1lO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVZlcmlmaWNhdGlvblNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMudXBkYXRlVmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLmJ1aWxkVmVyaWZpY2F0aW9uRm9ybUFycmF5KCk7XG4gICAgdGhpcy51cGRhdGVTdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLmJ1aWxkU3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5KCk7XG4gICAgdGhpcy5tZXRob2RDaGFuZ2VzU3ViID0gdGhpcy5tZXRob2RGb3JtLmdldCgnbWV0aG9kJyk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBtZXRob2QgPSB2YWx1ZSAhPSBudWxsID8gU3RyaW5nKHZhbHVlKS50b1VwcGVyQ2FzZSgpIDogJyc7XG4gICAgICBpZiAoTUVUSE9EU19XSVRIT1VUX0JPRFkuaW5jbHVkZXMobWV0aG9kKSAmJiB0aGlzLmFjdGl2ZVBheWxvYWRUYWIgIT09ICdoZWFkZXJzJykge1xuICAgICAgICB0aGlzLmFjdGl2ZVBheWxvYWRUYWIgPSAnaGVhZGVycyc7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmZvcm1hdENoYW5nZXNTdWIgPSB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLmdldCgnZm9ybWF0Jyk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuICAgIH0pO1xuICAgIHRoaXMudmFsaWRhdGVQYXlsb2FkSnNvbigpO1xuXG4gICAgLy8gQnVpbGQgYWR2YW5jZWQgc2V0dGluZ3MgZm9ybSBvbmx5IGZyb20gaW5wdXQgdmFyaWFibGVzIChubyBsb2NhbCBpbml0aWFsaXphdGlvbilcbiAgICBpZiAodGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzICYmIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0dXBQYXlsb2FkVGV4dGFyZWFTY3JvbGxTeW5jKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm1ldGhvZENoYW5nZXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5mb3JtYXRDaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaGVhZGVyTmFtZU9wdGlvbnNDaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZW52aXJvbm1lbnRGb3JtQ2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm1ldGhvZEZvcm1DaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMucGFyYW1zRm9ybUFycmF5Q2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKiBTeW5jIGxpbmUgbnVtYmVycyBjb2x1bW4gc2Nyb2xsIHdpdGggcGF5bG9hZCB0ZXh0YXJlYSBzY3JvbGwgKFBvc3RtYW4tc3R5bGUpLiAqL1xuICBwcml2YXRlIHNldHVwUGF5bG9hZFRleHRhcmVhU2Nyb2xsU3luYygpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLnBheWxvYWRFZGl0b3JXaXRoTGluZXNSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWhvc3QpIHJldHVybjtcbiAgICAgIGNvbnN0IGxpbmVOdW1iZXJzRWwgPSBob3N0LnF1ZXJ5U2VsZWN0b3IoJy5jcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWxpbmUtbnVtYmVycycpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGNvbnN0IHRleHRhcmVhID0gaG9zdC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpIGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYgKCFsaW5lTnVtYmVyc0VsIHx8ICF0ZXh0YXJlYSkgcmV0dXJuO1xuICAgICAgdGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgICBsaW5lTnVtYmVyc0VsLnNjcm9sbFRvcCA9IHRleHRhcmVhLnNjcm9sbFRvcDtcbiAgICAgIH0pO1xuICAgICAgbGluZU51bWJlcnNFbC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB7XG4gICAgICAgIHRleHRhcmVhLnNjcm9sbFRvcCA9IGxpbmVOdW1iZXJzRWwuc2Nyb2xsVG9wO1xuICAgICAgfSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkS2V5VmFsdWVGb3JtQXJyYXkocm93cz86IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdKTogdm9pZCB7XG4gICAgY29uc3QgaW5pdGlhbCA9IHJvd3MgPz8gW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dO1xuICAgIGNvbnN0IGdyb3VwcyA9IGluaXRpYWwubWFwKChyKSA9PiB0aGlzLmZiLmdyb3VwKHsga2V5OiBbci5rZXldLCB2YWx1ZTogW3IudmFsdWVdIH0pKTtcbiAgICB0aGlzLmtleVZhbHVlRm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShncm91cHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEtleVR5cGVWYWx1ZUZvcm1BcnJheShyb3dzPzogeyBrZXk6IHN0cmluZzsgdHlwZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSk6IHZvaWQge1xuICAgIGNvbnN0IGluaXRpYWwgPSByb3dzID8/IFt7IGtleTogJycsIHR5cGU6ICd0ZXh0JywgdmFsdWU6ICcnIH1dO1xuICAgIGNvbnN0IGdyb3VwcyA9IGluaXRpYWwubWFwKChyKSA9PiB0aGlzLmZiLmdyb3VwKHsga2V5OiBbci5rZXldLCB0eXBlOiBbci50eXBlXSwgdmFsdWU6IFtyLnZhbHVlXSB9KSk7XG4gICAgdGhpcy5rZXlUeXBlVmFsdWVGb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KGdyb3Vwcyk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUGFyYW1zRm9ybUFycmF5KHJvd3M/OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSk6IHZvaWQge1xuICAgIGNvbnN0IGluaXRpYWwgPSByb3dzID8/IFt7IGtleTogJycsIHZhbHVlOiAnJyB9XTtcbiAgICBjb25zdCBncm91cHMgPSBpbml0aWFsLm1hcCgocikgPT4gdGhpcy5mYi5ncm91cCh7IGtleTogW3Iua2V5XSwgdmFsdWU6IFtyLnZhbHVlXSB9KSk7XG4gICAgaWYgKHRoaXMucGFyYW1zRm9ybUFycmF5KSB7XG4gICAgICB0aGlzLnBhcmFtc0Zvcm1BcnJheS5jbGVhcigpO1xuICAgICAgZ3JvdXBzLmZvckVhY2goKGcpID0+IHRoaXMucGFyYW1zRm9ybUFycmF5LnB1c2goZykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcmFtc0Zvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoZ3JvdXBzKTtcbiAgICB9XG4gIH1cblxuICAvKiogUGFyc2UgVVJMIGludG8gYmFzZSAod2l0aG91dCBxdWVyeS9mcmFnbWVudCkgYW5kIHF1ZXJ5IGtleS12YWx1ZSBwYWlycy4gUHJlc2VydmVzIHJlbGF0aXZlIFVSTHMuICovXG4gIHByaXZhdGUgcGFyc2VRdWVyeVBhcmFtc0Zyb21VcmwodXJsU3RyOiBzdHJpbmcpOiB7IGJhc2VVcmw6IHN0cmluZzsgcm93czogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gfSB7XG4gICAgY29uc3QgZW1wdHkgPSB7IGJhc2VVcmw6IHVybFN0ciwgcm93czogW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dIH07XG4gICAgaWYgKCF1cmxTdHIgfHwgIXVybFN0ci50cmltKCkpIHJldHVybiBlbXB0eTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaXNBYnNvbHV0ZSA9IC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QodXJsU3RyLnRyaW0oKSk7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHVybFN0ciwgJ2h0dHA6Ly9sb2NhbGhvc3QnKTtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBpc0Fic29sdXRlID8gdXJsLm9yaWdpbiArIHVybC5wYXRobmFtZSA6IHVybC5wYXRobmFtZTtcbiAgICAgIGNvbnN0IHJvd3M6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdID0gW107XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgcm93cy5wdXNoKHsga2V5LCB2YWx1ZSB9KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByb3dzLnB1c2goeyBrZXk6ICcnLCB2YWx1ZTogJycgfSk7XG4gICAgICByZXR1cm4geyBiYXNlVXJsLCByb3dzIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZW1wdHk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdldCBiYXNlIFVSTCAod2l0aG91dCBxdWVyeS9mcmFnbWVudCkgZm9yIGJ1aWxkaW5nIFVSTCBmcm9tIHBhcmFtcy4gUHJlc2VydmVzIHJlbGF0aXZlIFVSTHMuICovXG4gIHByaXZhdGUgZ2V0QmFzZVVybCh1cmxTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF1cmxTdHIgfHwgIXVybFN0ci50cmltKCkpIHJldHVybiB1cmxTdHI7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlzQWJzb2x1dGUgPSAvXmh0dHBzPzpcXC9cXC8vaS50ZXN0KHVybFN0ci50cmltKCkpO1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh1cmxTdHIsICdodHRwOi8vbG9jYWxob3N0Jyk7XG4gICAgICByZXR1cm4gaXNBYnNvbHV0ZSA/IHVybC5vcmlnaW4gKyB1cmwucGF0aG5hbWUgOiB1cmwucGF0aG5hbWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdXJsU3RyO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBQYXJzZSBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgYm9keSAoa2V5PXZhbHVlJi4uLikgaW50byBrZXktdmFsdWUgcm93cy4gKi9cbiAgcHJpdmF0ZSBwYXJzZUZvcm1VcmxFbmNvZGVkQm9keShib2R5OiBzdHJpbmcpOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IChib2R5ID8/ICcnKS50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkKSByZXR1cm4gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModHJpbW1lZCk7XG4gICAgICBjb25zdCByb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtdO1xuICAgICAgcGFyYW1zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHJvd3MucHVzaCh7IGtleSwgdmFsdWUgfSkpO1xuICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElmIGZvcm0gYm9keSBoYXMgYSBzaW5nbGUga2V5IHdob3NlIHZhbHVlIGlzIFVSTC1kZWNvZGVkIEpTT04sIHJldHVybiBpdCBwcmV0dHktcHJpbnRlZCBmb3IgUmF3IGJvZHkuXG4gICAqIE90aGVyd2lzZSByZXR1cm4gbnVsbCAoY2FsbGVyIGtlZXBzIHgtd3d3LWZvcm0tdXJsZW5jb2RlZCB2aWV3KS5cbiAgICovXG4gIHByaXZhdGUgdHJ5Rm9ybUJvZHlWYWx1ZUFzUmF3SnNvbihyb3dzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmIChyb3dzLmxlbmd0aCAhPT0gMSB8fCAhcm93c1swXS52YWx1ZT8udHJpbSgpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB2YWx1ZSA9IHJvd3NbMF0udmFsdWUudHJpbSgpO1xuICAgIGlmICghKHZhbHVlLnN0YXJ0c1dpdGgoJ3snKSB8fCB2YWx1ZS5zdGFydHNXaXRoKCdbJykpKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCAyKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBVcGRhdGUgUGFyYW1zIHRhYmxlIGZyb20gY3VycmVudCBVUkwgcXVlcnkgc3RyaW5nIChQb3N0bWFuLXN0eWxlKS4gKi9cbiAgcHJpdmF0ZSBzeW5jUGFyYW1zRnJvbVVybCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IGJhc2VVcmw6IF9iLCByb3dzIH0gPSB0aGlzLnBhcnNlUXVlcnlQYXJhbXNGcm9tVXJsKHRoaXMuX3VybCk7XG4gICAgdGhpcy5idWlsZFBhcmFtc0Zvcm1BcnJheShyb3dzKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgVVJMIHF1ZXJ5IHN0cmluZyBmcm9tIFBhcmFtcyB0YWJsZSAoUG9zdG1hbi1zdHlsZSkuICovXG4gIHByaXZhdGUgc3luY1VybEZyb21QYXJhbXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFyYW1zU3luY2luZ0Zyb21VcmwgfHwgIXRoaXMucGFyYW1zRm9ybUFycmF5KSByZXR1cm47XG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMuZ2V0QmFzZVVybCh0aGlzLl91cmwpO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5wYXJhbXNGb3JtQXJyYXkuY29udHJvbHMpIHtcbiAgICAgIGNvbnN0IGtleSA9ICgoYyBhcyBGb3JtR3JvdXApLmdldCgna2V5Jyk/LnZhbHVlID8/ICcnKS50cmltKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJztcbiAgICAgIGlmIChrZXkgIT09ICcnKSBwYXJhbXMuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IHBhcmFtcy50b1N0cmluZygpO1xuICAgIGNvbnN0IG5ld1VybCA9IHF1ZXJ5U3RyaW5nID8gYCR7YmFzZVVybH0/JHtxdWVyeVN0cmluZ31gIDogYmFzZVVybDtcbiAgICBpZiAodGhpcy5fdXJsICE9PSBuZXdVcmwpIHtcbiAgICAgIHRoaXMuX3VybCA9IG5ld1VybDtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRWZXJpZmljYXRpb25Gb3JtQXJyYXkocm93cz86IHsganNvblBhdGg6IHN0cmluZzsgdmVyaWZpY2F0aW9uOiBzdHJpbmc7IGRhdGFUeXBlOiBzdHJpbmc7IGV4cGVjdGVkVmFsdWU6IHN0cmluZyB9W10pOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0VmVyaWZpY2F0aW9uID0gdGhpcy5nZXREZWZhdWx0VmVyaWZpY2F0aW9uKCk7XG4gICAgY29uc3QgZGVmYXVsdERhdGFUeXBlID0gdGhpcy5nZXREZWZhdWx0RGF0YVR5cGUoKTtcbiAgICBjb25zdCBpbml0aWFsID0gcm93cyA/PyBbeyBqc29uUGF0aDogJycsIHZlcmlmaWNhdGlvbjogZGVmYXVsdFZlcmlmaWNhdGlvbiwgZGF0YVR5cGU6IGRlZmF1bHREYXRhVHlwZSwgZXhwZWN0ZWRWYWx1ZTogJycgfV07XG4gICAgY29uc3QgZ3JvdXBzID0gaW5pdGlhbC5tYXAoKHIpID0+XG4gICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAganNvblBhdGg6IFtyLmpzb25QYXRoXSxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiBbci52ZXJpZmljYXRpb25dLFxuICAgICAgICBkYXRhVHlwZTogW3IuZGF0YVR5cGVdLFxuICAgICAgICBleHBlY3RlZFZhbHVlOiBbci5leHBlY3RlZFZhbHVlXSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoZ3JvdXBzKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkocm93cz86IHsgdmVyaWZpY2F0aW9uOiBzdHJpbmc7IGV4cGVjdGVkVmFsdWU6IHN0cmluZyB9W10pOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0VmVyaWZpY2F0aW9uID0gdGhpcy5nZXREZWZhdWx0U3RhdHVzVmVyaWZpY2F0aW9uKCk7XG4gICAgY29uc3QgaW5pdGlhbCA9IHJvd3MgPz8gW3sgdmVyaWZpY2F0aW9uOiBkZWZhdWx0VmVyaWZpY2F0aW9uLCBleHBlY3RlZFZhbHVlOiAnJyB9XTtcbiAgICBjb25zdCBncm91cHMgPSBpbml0aWFsLm1hcCgocikgPT5cbiAgICAgIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICB2ZXJpZmljYXRpb246IFtyLnZlcmlmaWNhdGlvbl0sXG4gICAgICAgIGV4cGVjdGVkVmFsdWU6IFtyLmV4cGVjdGVkVmFsdWVdLFxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShncm91cHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEhlYWRlcnNGb3JtQXJyYXkocm93czogQXBpRWRpdEhlYWRlclJvd1tdKTogdm9pZCB7XG4gICAgY29uc3QgZ3JvdXBzID0gcm93cy5tYXAoKGgpID0+XG4gICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmFtZTogW2gubmFtZV0sXG4gICAgICAgIHZhbHVlOiBbaC52YWx1ZV0sXG4gICAgICB9KVxuICAgICk7XG4gICAgaWYgKHRoaXMuaGVhZGVyc0Zvcm1BcnJheSkge1xuICAgICAgdGhpcy5oZWFkZXJzRm9ybUFycmF5LmNsZWFyKCk7XG4gICAgICBncm91cHMuZm9yRWFjaCgoZykgPT4gdGhpcy5oZWFkZXJzRm9ybUFycmF5LnB1c2goZykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlYWRlcnNGb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KGdyb3Vwcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc2V0IGFsbCB0aHJlZSBzdGVwcyBhbmQgYWxsIGVudGVyZWQgZGF0YSB0byBpbml0aWFsL2RlZmF1bHQgc3RhdGUuIFVzZWQgd2hlbiB1c2VyIGNhbmNlbHMgb24gc3RlcCAxLiAqL1xuICBwcml2YXRlIHJlc2V0QWxsU3RlcHNBbmREYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFN0ZXAgPSAxO1xuXG4gICAgY29uc3QgZmlyc3RNZXRob2RWYWx1ZSA9IHRoaXMuaHR0cE1ldGhvZE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmh0dHBNZXRob2RPcHRpb25zWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVmYXVsdE1ldGhvZCA9IHRoaXMuaW5pdGlhbE1ldGhvZCA/PyBmaXJzdE1ldGhvZFZhbHVlID8/ICdHRVQnO1xuICAgIGNvbnN0IG1ldGhvZFZhbCA9IHR5cGVvZiBkZWZhdWx0TWV0aG9kID09PSAnc3RyaW5nJyA/IGRlZmF1bHRNZXRob2QgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdE1ldGhvZCBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSBtZXRob2RWYWwgPz8gJyc7XG4gICAgaWYgKHRoaXMubWV0aG9kRm9ybSkgdGhpcy5tZXRob2RGb3JtLnBhdGNoVmFsdWUoeyBtZXRob2Q6IGRlZmF1bHRNZXRob2QgfSk7XG5cbiAgICBjb25zdCBmaXJzdEVudlZhbHVlID0gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnM/Lmxlbmd0aFxuICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmVudmlyb25tZW50T3B0aW9uc1swXSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlZmF1bHRFbnYgPSB0aGlzLmluaXRpYWxFbnZpcm9ubWVudCA/PyBmaXJzdEVudlZhbHVlID8/ICdEZXZlbG9wbWVudCc7XG4gICAgY29uc3QgZW52VmFsID0gdHlwZW9mIGRlZmF1bHRFbnYgPT09ICdzdHJpbmcnID8gZGVmYXVsdEVudiA6IChBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShkZWZhdWx0RW52IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpID8/ICcnKTtcbiAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID0gZW52VmFsID8/ICcnO1xuICAgIGlmICh0aGlzLmVudmlyb25tZW50Rm9ybSkgdGhpcy5lbnZpcm9ubWVudEZvcm0ucGF0Y2hWYWx1ZSh7IGVudmlyb25tZW50OiBkZWZhdWx0RW52IH0pO1xuXG4gICAgdGhpcy51cmwgPSB0aGlzLmluaXRpYWxVcmwgPz8gJyc7XG4gICAgdGhpcy5idWlsZEhlYWRlcnNGb3JtQXJyYXkodGhpcy5pbml0aWFsSGVhZGVycyA/PyBbeyBuYW1lOiAnJywgdHlwZTogJ3N0cmluZycsIHZhbHVlOiAnJyB9XSk7XG4gICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy5oZWFkZXJzQ2hhbmdlLmVtaXQodGhpcy5oZWFkZXJzKTtcblxuICAgIHRoaXMuYm9keVZpZXcgPSAnaGVhZGVycyc7XG4gICAgdGhpcy5hY3RpdmVQYXlsb2FkVGFiID0gJ2hlYWRlcnMnO1xuICAgIHRoaXMucGF5bG9hZFR5cGUgPSAncmF3JztcbiAgICB0aGlzLnBheWxvYWRUZXh0ID0gJyc7XG4gICAgdGhpcy5wYXlsb2FkSnNvbkVycm9yID0gbnVsbDtcbiAgICBjb25zdCBkZWZhdWx0Rm9ybWF0ID0gdGhpcy5pbml0aWFsRm9ybWF0ID8/IHRoaXMuZ2V0Rm9ybWF0VmFsdWVzKClbMF0gPz8gJ2pzb24nO1xuICAgIGlmICh0aGlzLnBheWxvYWRGb3JtYXRGb3JtKSB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLnBhdGNoVmFsdWUoeyBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQgfSk7XG4gICAgdGhpcy5idWlsZEtleVZhbHVlRm9ybUFycmF5KCk7XG4gICAgdGhpcy5idWlsZEtleVR5cGVWYWx1ZUZvcm1BcnJheSgpO1xuICAgIHRoaXMuYnVpbGRQYXJhbXNGb3JtQXJyYXkoKTtcbiAgICB0aGlzLmltcG9ydEN1cmxDb250cm9sLnNldFZhbHVlKCcnKTtcblxuICAgIHRoaXMudmFyaWFibGVOYW1lID0gJyc7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuXG4gICAgdGhpcy5idWlsZFZlcmlmaWNhdGlvbkZvcm1BcnJheSgpO1xuICAgIHRoaXMuYnVpbGRTdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkoKTtcbiAgICB0aGlzLmFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiID0gJ3Jlc3BvbnNlLWJvZHknO1xuXG4gICAgdGhpcy52YWxpZGF0ZVBheWxvYWRKc29uKCk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqIEhhbmRsZXI6IHNob3cgaW1wb3J0IGNVUkwgcGFuZWwgKGNhbGxlZCB3aGVuIHVzZXIgY2xpY2tzIFwiSW1wb3J0IEFQSSBjVVJMXCIpLiBSZXNldHMgdGV4dGFyZWEgc28gaXQgaXMgY2xlYXJlZCBlYWNoIHRpbWUuICovXG4gIG9wZW5JbXBvcnRDdXJsUGFuZWwoKTogdm9pZCB7XG4gICAgdGhpcy5pbXBvcnRDdXJsQ29udHJvbC5zZXRWYWx1ZSgnJyk7XG4gICAgdGhpcy5ib2R5VmlldyA9ICdpbXBvcnQtY3VybCc7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqIFJlc2V0IFVSTCwgbWV0aG9kLCBoZWFkZXJzLCBib2R5LCBhbmQgcGFyYW1zIHRvIGVtcHR5L2RlZmF1bHQgYmVmb3JlIGFwcGx5aW5nIGltcG9ydGVkIGNVUkwuICovXG4gIHByaXZhdGUgcmVzZXRSZXF1ZXN0RmllbGRzQmVmb3JlQ3VybEltcG9ydCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaXJzdE1ldGhvZFZhbHVlID0gdGhpcy5odHRwTWV0aG9kT3B0aW9ucz8ubGVuZ3RoXG4gICAgICA/IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuaHR0cE1ldGhvZE9wdGlvbnNbMF0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkZWZhdWx0TWV0aG9kID0gdGhpcy5pbml0aWFsTWV0aG9kID8/IGZpcnN0TWV0aG9kVmFsdWUgPz8gJ0dFVCc7XG4gICAgdGhpcy5zZWxlY3RlZE1ldGhvZCA9IHR5cGVvZiBkZWZhdWx0TWV0aG9kID09PSAnc3RyaW5nJyA/IGRlZmF1bHRNZXRob2QgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdE1ldGhvZCBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJykgPz8gJ0dFVCc7XG4gICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSB0aGlzLnNlbGVjdGVkTWV0aG9kO1xuICAgIGlmICh0aGlzLm1ldGhvZEZvcm0pIHRoaXMubWV0aG9kRm9ybS5wYXRjaFZhbHVlKHsgbWV0aG9kOiBkZWZhdWx0TWV0aG9kIH0pO1xuXG4gICAgdGhpcy51cmwgPSAnJztcblxuICAgIHRoaXMuYnVpbGRIZWFkZXJzRm9ybUFycmF5KFt7IG5hbWU6ICcnLCB0eXBlOiAnc3RyaW5nJywgdmFsdWU6ICcnIH1dKTtcbiAgICB0aGlzLnVwZGF0ZUhlYWRlck5hbWVTZWxlY3RDb25maWcoKTtcbiAgICB0aGlzLmhlYWRlcnNDaGFuZ2UuZW1pdCh0aGlzLmhlYWRlcnMpO1xuXG4gICAgdGhpcy5wYXlsb2FkVHlwZSA9ICdyYXcnO1xuICAgIHRoaXMucGF5bG9hZFRleHQgPSAnJztcbiAgICB0aGlzLnBheWxvYWRKc29uRXJyb3IgPSBudWxsO1xuICAgIGNvbnN0IGRlZmF1bHRGb3JtYXQgPSB0aGlzLmluaXRpYWxGb3JtYXQgPz8gdGhpcy5nZXRGb3JtYXRWYWx1ZXMoKVswXSA/PyAnanNvbic7XG4gICAgaWYgKHRoaXMucGF5bG9hZEZvcm1hdEZvcm0pIHRoaXMucGF5bG9hZEZvcm1hdEZvcm0ucGF0Y2hWYWx1ZSh7IGZvcm1hdDogZGVmYXVsdEZvcm1hdCB9KTtcbiAgICB0aGlzLmJ1aWxkS2V5VmFsdWVGb3JtQXJyYXkoW3sga2V5OiAnJywgdmFsdWU6ICcnIH1dKTtcbiAgICB0aGlzLmJ1aWxkS2V5VHlwZVZhbHVlRm9ybUFycmF5KFt7IGtleTogJycsIHR5cGU6ICd0ZXh0JywgdmFsdWU6ICcnIH1dKTtcbiAgICB0aGlzLmJ1aWxkUGFyYW1zRm9ybUFycmF5KFt7IGtleTogJycsIHZhbHVlOiAnJyB9XSk7XG5cbiAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogSGFuZGxlcjogcGFyc2UgY1VSTCBmcm9tIGNvbnRyb2wsIGJpbmQgdG8gZm9ybSBmaWVsZHMsIGVtaXQgYW5kIGNsb3NlIHBhbmVsLiBDYWxsZWQgd2hlbiB1c2VyIGNsaWNrcyBJbXBvcnQgYnV0dG9uLiAqL1xuICBvbkltcG9ydEN1cmxDb25maXJtKCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbXBvcnRDdXJsQ29udHJvbC52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBjdXJsU3RyID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogJyc7XG4gICAgdGhpcy5pbXBvcnRDdXJsLmVtaXQoY3VybFN0cik7XG5cbiAgICB0aGlzLnJlc2V0UmVxdWVzdEZpZWxkc0JlZm9yZUN1cmxJbXBvcnQoKTtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQ3VybChjdXJsU3RyKTtcbiAgICBpZiAocGFyc2VkKSB7XG4gICAgICBjb25zdCBtZXRob2RWYWx1ZSA9IHBhcnNlZC5tZXRob2QgJiYgdGhpcy5nZXRNZXRob2RWYWx1ZXMoKS5pbmNsdWRlcyhwYXJzZWQubWV0aG9kKVxuICAgICAgICA/IHBhcnNlZC5tZXRob2RcbiAgICAgICAgOiBwYXJzZWQubWV0aG9kIHx8ICdHRVQnO1xuICAgICAgdGhpcy5zZWxlY3RlZE1ldGhvZCA9IG1ldGhvZFZhbHVlO1xuICAgICAgdGhpcy5jdXJyZW50TWV0aG9kVmFsdWUgPSBtZXRob2RWYWx1ZTtcbiAgICAgIGlmIChwYXJzZWQudXJsKSB0aGlzLnVybCA9IHBhcnNlZC51cmw7XG5cbiAgICAgIC8vIEJpbmQgQXV0aG9yaXphdGlvbiBoZWFkZXIgdG8gQXV0aG9yaXphdGlvbiBzZWN0aW9uIHdoZW4gcHJlc2VudCAoQmVhcmVyIG9yIG90aGVyIHNjaGVtZSlcbiAgICAgIGxldCBoZWFkZXJSb3dzOiBBcGlFZGl0SGVhZGVyUm93W10gPSBwYXJzZWQuaGVhZGVycztcbiAgICAgIGNvbnN0IGF1dGhIZWFkZXIgPSBoZWFkZXJSb3dzLmZpbmQoKGgpID0+IGgubmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYXV0aG9yaXphdGlvbicpO1xuICAgICAgaWYgKGF1dGhIZWFkZXI/LnZhbHVlPy50cmltKCkpIHtcbiAgICAgICAgY29uc3QgYXV0aFZhbHVlID0gYXV0aEhlYWRlci52YWx1ZS50cmltKCk7XG4gICAgICAgIGNvbnN0IGJlYXJlck1hdGNoID0gL15CZWFyZXJcXHMrKC4rKSQvaS5leGVjKGF1dGhWYWx1ZSk7XG4gICAgICAgIGlmIChiZWFyZXJNYXRjaCkge1xuICAgICAgICAgIGNvbnN0IHRva2VuID0gYmVhcmVyTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgICAgIGlmICh0aGlzLmdldEF1dGhUeXBlVmFsdWVzKCkuaW5jbHVkZXMoJ2JlYXJlcicpICYmIHRoaXMuYXV0aFR5cGVGb3JtKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGhUeXBlRm9ybS5wYXRjaFZhbHVlKHsgYXV0aFR5cGU6ICdiZWFyZXInIH0pO1xuICAgICAgICAgICAgdGhpcy5iZWFyZXJUb2tlbiA9IHRva2VuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoZWFkZXJSb3dzID0gaGVhZGVyUm93cy5maWx0ZXIoKGgpID0+IGgubmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnYXV0aG9yaXphdGlvbicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGhlYWRlclJvd3MgPSBoZWFkZXJSb3dzLmxlbmd0aCA+IDAgPyBoZWFkZXJSb3dzIDogW3sgbmFtZTogJycsIHR5cGU6ICdzdHJpbmcnLCB2YWx1ZTogJycgfV07XG4gICAgICB0aGlzLmJ1aWxkSGVhZGVyc0Zvcm1BcnJheShoZWFkZXJSb3dzKTtcbiAgICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgICAgdGhpcy5oZWFkZXJzQ2hhbmdlLmVtaXQodGhpcy5oZWFkZXJzKTtcblxuICAgICAgaWYgKHBhcnNlZC5ib2R5KSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcGFyc2VkLmhlYWRlcnNcbiAgICAgICAgICAuZmluZCgoaCkgPT4gaC5uYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LXR5cGUnKVxuICAgICAgICAgID8udmFsdWU/LnRvTG93ZXJDYXNlKCkgPz8gJyc7XG4gICAgICAgIGNvbnN0IGlzRm9ybVVybEVuY29kZWQgPSBjb250ZW50VHlwZS5pbmNsdWRlcygnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG5cbiAgICAgICAgaWYgKGlzRm9ybVVybEVuY29kZWQpIHtcbiAgICAgICAgICBjb25zdCByb3dzID0gdGhpcy5wYXJzZUZvcm1VcmxFbmNvZGVkQm9keShwYXJzZWQuYm9keSk7XG4gICAgICAgICAgdGhpcy5idWlsZEtleVZhbHVlRm9ybUFycmF5KHJvd3MubGVuZ3RoID4gMCA/IHJvd3MgOiBbeyBrZXk6ICcnLCB2YWx1ZTogJycgfV0pO1xuICAgICAgICAgIGNvbnN0IGRlY29kZWRBc0pzb24gPSB0aGlzLnRyeUZvcm1Cb2R5VmFsdWVBc1Jhd0pzb24ocm93cyk7XG4gICAgICAgICAgaWYgKGRlY29kZWRBc0pzb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5wYXlsb2FkVHlwZSA9ICdyYXcnO1xuICAgICAgICAgICAgdGhpcy5wYXlsb2FkVGV4dCA9IGRlY29kZWRBc0pzb247XG4gICAgICAgICAgICBpZiAodGhpcy5wYXlsb2FkRm9ybWF0Rm9ybSkgdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiAnanNvbicgfSk7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZFR5cGUgPSAneC13d3ctZm9ybS11cmxlbmNvZGVkJztcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZFRleHQgPSAnJztcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZEpzb25FcnJvciA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucGF5bG9hZFRleHQgPSBwYXJzZWQuYm9keTtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlUGF5bG9hZEpzb24oKTtcbiAgICAgICAgICBjb25zdCB0cmltbWVkID0gcGFyc2VkLmJvZHkudHJpbSgpO1xuICAgICAgICAgIGlmICgodHJpbW1lZC5zdGFydHNXaXRoKCd7JykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnfScpKSB8fCAodHJpbW1lZC5zdGFydHNXaXRoKCdbJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnXScpKSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0VmFsdWVzID0gdGhpcy5nZXRGb3JtYXRWYWx1ZXMoKTtcbiAgICAgICAgICAgIGlmIChmb3JtYXRWYWx1ZXMuaW5jbHVkZXMoJ2pzb24nKSAmJiB0aGlzLnBheWxvYWRGb3JtYXRGb3JtKSB7XG4gICAgICAgICAgICAgIHRoaXMucGF5bG9hZEZvcm1hdEZvcm0ucGF0Y2hWYWx1ZSh7IGZvcm1hdDogJ2pzb24nIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHRoaXMuY2xvc2VJbXBvcnRDdXJsUGFuZWwoKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVyOiBlbWl0IGNhbmNlbCBhbmQgY2xvc2UgcGFuZWwuIENhbGxlZCB3aGVuIHVzZXIgY2xpY2tzIENhbmNlbCBpbiBpbXBvcnQgY1VSTCBwYW5lbC4gKi9cbiAgb25DYW5jZWxJbXBvcnRDdXJsKCk6IHZvaWQge1xuICAgIHRoaXMuaW1wb3J0Q3VybENhbmNlbC5lbWl0KCk7XG4gICAgdGhpcy5jbG9zZUltcG9ydEN1cmxQYW5lbCgpO1xuICB9XG5cbiAgLyoqIEhhbmRsZXI6IHNob3cgaGVhZGVycyBzZWN0aW9uIChjYWxsZWQgZnJvbSBDYW5jZWwgb3IgYWZ0ZXIgSW1wb3J0IGluIGltcG9ydCBwYW5lbCkuICovXG4gIGNsb3NlSW1wb3J0Q3VybFBhbmVsKCk6IHZvaWQge1xuICAgIHRoaXMuYm9keVZpZXcgPSAnaGVhZGVycyc7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgb25TZW5kUmVxdWVzdCgpOiB2b2lkIHtcbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudCAhPSBudWxsID8gU3RyaW5nKHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudCkgOiAnJztcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLnNlbGVjdGVkTWV0aG9kICE9IG51bGwgPyBTdHJpbmcodGhpcy5zZWxlY3RlZE1ldGhvZCkgOiAnJztcbiAgICB0aGlzLnNlbmRSZXF1ZXN0LmVtaXQoe1xuICAgICAgZW52aXJvbm1lbnQsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmw6IHRoaXMudXJsID8/ICcnLFxuICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgb25WYXJpYWJsZU5hbWVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVFcnJvciA9ICcnO1xuICB9XG5cbiAgb25CYWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID4gMSkge1xuICAgICAgdGhpcy5zZXRTdGVwKHRoaXMuY3VycmVudFN0ZXAgLSAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXNldEFsbFN0ZXBzQW5kRGF0YSgpO1xuICAgICAgdGhpcy5iYWNrLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdXNlciBjbGlja3MgdGhlIENhbmNlbCBidXR0b24gKHN0ZXAgMSkuIEVtaXRzIGNhbmNlbCB0aGVuIHJ1bnMgbm9ybWFsIGJhY2sgZmxvdy4gKi9cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMub25CYWNrKCk7XG4gIH1cblxuICBvbk5leHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY3VycmVudFN0ZXAgPT09IDIgJiYgIXRoaXMudmFyaWFibGVOYW1lPy50cmltKCkpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lRXJyb3IgPSAnVmFyaWFibGUgTmFtZSBpcyByZXF1aXJlZC4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZhcmlhYmxlTmFtZUVycm9yID0gJyc7XG4gICAgaWYgKHRoaXMuY3VycmVudFN0ZXAgPCB0aGlzLnN0ZXBMYWJlbHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNldFN0ZXAodGhpcy5jdXJyZW50U3RlcCArIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5leHQuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIHNldFBheWxvYWRUYWIodmFsdWU6IEFwaUVkaXRQYXlsb2FkVGFiKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVQYXlsb2FkVGFiID0gdmFsdWU7XG4gIH1cblxuICBzZXRSZXNwb25zZVZlcmlmaWNhdGlvblRhYih2YWx1ZTogJ3Jlc3BvbnNlLWJvZHknIHwgJ3N0YXR1cycpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVJlc3BvbnNlVmVyaWZpY2F0aW9uVGFiID0gdmFsdWU7XG4gIH1cblxuICBhZGRIZWFkZXIoKTogdm9pZCB7XG4gICAgdGhpcy5oZWFkZXJzRm9ybUFycmF5LnB1c2goXG4gICAgICB0aGlzLmZiLmdyb3VwKHsgbmFtZTogWycnXSwgdmFsdWU6IFsnJ10gfSlcbiAgICApO1xuICB9XG5cbiAgcmVtb3ZlSGVhZGVyKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmhlYWRlcnNGb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgLyoqIFdoZW4gdXNlciBhZGRzIGEgY3VzdG9tIGhlYWRlciBuYW1lIHZpYSB0aGUgZHJvcGRvd24gXCJBZGQgJ+KApidcIiBvcHRpb24sIHNldCB0aGUgY29udHJvbCB2YWx1ZS4gKi9cbiAgb25IZWFkZXJOYW1lQWRkQ3VzdG9tVmFsdWUoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSwgcm93OiBGb3JtR3JvdXApOiB2b2lkIHtcbiAgICBjb25zdCBjb250cm9sID0gcm93LmdldChldmVudC5rZXkpO1xuICAgIGlmIChjb250cm9sICYmIGV2ZW50LnZhbHVlICE9IG51bGwpIHtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUoZXZlbnQudmFsdWUudHJpbSgpKTtcbiAgICB9XG4gIH1cblxuICB0cmFja0J5SGVhZGVyKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGFkZEtleVZhbHVlUm93KCk6IHZvaWQge1xuICAgIHRoaXMua2V5VmFsdWVGb3JtQXJyYXkucHVzaCh0aGlzLmZiLmdyb3VwKHsga2V5OiBbJyddLCB2YWx1ZTogWycnXSB9KSk7XG4gIH1cblxuICByZW1vdmVLZXlWYWx1ZVJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5rZXlWYWx1ZUZvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG4gIH1cblxuICB0cmFja0J5S2V5VmFsdWUoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgYWRkS2V5VHlwZVZhbHVlUm93KCk6IHZvaWQge1xuICAgIHRoaXMua2V5VHlwZVZhbHVlRm9ybUFycmF5LnB1c2godGhpcy5mYi5ncm91cCh7IGtleTogWycnXSwgdHlwZTogWyd0ZXh0J10sIHZhbHVlOiBbJyddIH0pKTtcbiAgfVxuXG4gIHJlbW92ZUtleVR5cGVWYWx1ZVJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5rZXlUeXBlVmFsdWVGb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgdHJhY2tCeUtleVR5cGVWYWx1ZShpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBhZGRQYXJhbXNSb3coKTogdm9pZCB7XG4gICAgdGhpcy5wYXJhbXNGb3JtQXJyYXkucHVzaCh0aGlzLmZiLmdyb3VwKHsga2V5OiBbJyddLCB2YWx1ZTogWycnXSB9KSk7XG4gIH1cblxuICByZW1vdmVQYXJhbXNSb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGFyYW1zRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIHRyYWNrQnlQYXJhbXMoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgYWRkVmVyaWZpY2F0aW9uUm93KCk6IHZvaWQge1xuICAgIHRoaXMudmVyaWZpY2F0aW9uRm9ybUFycmF5LnB1c2goXG4gICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAganNvblBhdGg6IFsnJ10sXG4gICAgICAgIHZlcmlmaWNhdGlvbjogW3RoaXMuZ2V0RGVmYXVsdFZlcmlmaWNhdGlvbigpXSxcbiAgICAgICAgZGF0YVR5cGU6IFt0aGlzLmdldERlZmF1bHREYXRhVHlwZSgpXSxcbiAgICAgICAgZXhwZWN0ZWRWYWx1ZTogWycnXSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZVZlcmlmaWNhdGlvblJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgdHJhY2tCeVZlcmlmaWNhdGlvbihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKiogV2hlbiBEYXRhIFR5cGUgY2hhbmdlcyBpbiBSZXNwb25zZSBCb2R5IHZlcmlmaWNhdGlvbiwgcmVzZXQgRXhwZWN0ZWQgVmFsdWUgZm9yIHRoYXQgcm93LiAqL1xuICBvblZlcmlmaWNhdGlvbkRhdGFUeXBlQ2hhbmdlKHJvdzogRm9ybUdyb3VwLCBldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfSk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdkYXRhVHlwZScpIHtcbiAgICAgIHJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBhZGRTdGF0dXNWZXJpZmljYXRpb25Sb3coKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0dXNWZXJpZmljYXRpb25Gb3JtQXJyYXkucHVzaChcbiAgICAgIHRoaXMuZmIuZ3JvdXAoeyB2ZXJpZmljYXRpb246IFt0aGlzLmdldERlZmF1bHRTdGF0dXNWZXJpZmljYXRpb24oKV0sIGV4cGVjdGVkVmFsdWU6IFsnJ10gfSlcbiAgICApO1xuICB9XG5cbiAgcmVtb3ZlU3RhdHVzVmVyaWZpY2F0aW9uUm93KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG4gIH1cblxuICB0cmFja0J5U3RhdHVzVmVyaWZpY2F0aW9uKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCByZWFjdGl2ZSBmb3JtIGZvciBhZHZhbmNlZCBzZXR0aW5ncyB2YXJpYWJsZXMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIHdoaWxlICh0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICAgIH1cblxuICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9XG4gICAgICAgIHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgdmFyaWFibGUudmFsdWUgPT09ICdib29sZWFuJ1xuICAgICAgICAgID8gKHZhcmlhYmxlLnZhbHVlID09PSB0cnVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAndHJ1ZScgfHwgdmFyaWFibGUudmFsdWUgPT09IDEpXG4gICAgICAgICAgOiAodmFyaWFibGUudmFsdWUgfHwgJycpO1xuXG4gICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG5hbWU6IFt2YXJpYWJsZS5uYW1lXSxcbiAgICAgICAgdmFsdWU6IFtkZWZhdWx0VmFsdWVdLFxuICAgICAgICB0eXBlOiBbdmFyaWFibGUudHlwZSB8fCAnc3RyaW5nJ10sXG4gICAgICAgIGxhYmVsOiBbdmFyaWFibGUubGFiZWwgfHwgJyddXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0ucHVzaCh2YXJpYWJsZUdyb3VwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYWR2YW5jZWQgYm9vbGVhbiBjaGFuZ2VzIGFuZCBrZWVwIGJvdGggZGF0YSBhbmQgZm9ybSBpbiBzeW5jLlxuICAgKi9cbiAgb25BZHZhbmNlZFZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIG5vbi1ib29sZWFuIGFkdmFuY2VkIHZhbHVlcyAoa2VwdCBmb3IgQVBJIGNvbXBhdGliaWxpdHk7IGN1cnJlbnRseSB1bnVzZWQpLlxuICAgKi9cbiAgb25BZHZhbmNlZFZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogRW1pdCBhbGwgZW50ZXJlZCBkZXRhaWxzIChlbnZpcm9ubWVudCwgSFRUUCBtZXRob2QsIFVSTCwgaGVhZGVycywgYm9keSwgc3RlcDIgdmFyaWFibGUsIHN0ZXAzIHZlcmlmaWNhdGlvbnMpIHdoZW4gdXNlciBjbGlja3MgQ3JlYXRlLiAqL1xuICBvbkNyZWF0ZSgpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnOTk5OTk5OScpO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5nZXRDcmVhdGVQYXlsb2FkKCk7XG4gICAgICBjb25zb2xlLmxvZygnOTk5OTk5OSBwYXlsb2FkJywgcGF5bG9hZCk7XG4gICAgICB0aGlzLmNyZWF0ZS5lbWl0KHBheWxvYWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignQXBpRWRpdFN0ZXAgZ2V0Q3JlYXRlUGF5bG9hZCBlcnJvcjonLCBlcnIpO1xuICAgICAgdGhpcy5jcmVhdGUuZW1pdCh0aGlzLmdldENyZWF0ZVBheWxvYWRGYWxsYmFjaygpKTtcbiAgICB9XG4gIH1cblxuICAvKiogTWluaW1hbCBwYXlsb2FkIHdoZW4gZ2V0Q3JlYXRlUGF5bG9hZCB0aHJvd3MgKHNvIGNyZWF0ZSBhbHdheXMgZW1pdHMpLiAqL1xuICBwcml2YXRlIGdldENyZWF0ZVBheWxvYWRGYWxsYmFjaygpOiBBcGlFZGl0Q3JlYXRlUGF5bG9hZCB7XG4gICAgY29uc3QgYXV0aFR5cGUgPSB0aGlzLnNlbGVjdGVkQXV0aFR5cGU7XG4gICAgY29uc3QgYmVhcmVyVG9rZW4gPSBhdXRoVHlwZSA9PT0gJ2JlYXJlcicgPyAodGhpcy5iZWFyZXJUb2tlbiA/PyAnJykgOiB1bmRlZmluZWQ7XG4gICAgbGV0IG9hdXRoMjogQXBpRWRpdE9BdXRoMlBheWxvYWQgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGF1dGhUeXBlID09PSAnb2F1dGgyJyAmJiB0aGlzLm9hdXRoMkZvcm0pIHtcbiAgICAgIGNvbnN0IGdyYW50VHlwZSA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldENvbnRyb2xWYWx1ZSh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdncmFudFR5cGUnKSBhcyB7IHZhbHVlOiB1bmtub3duIH0gfCBudWxsKTtcbiAgICAgIGNvbnN0IGNsaWVudEF1dGggPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRDb250cm9sVmFsdWUodGhpcy5vYXV0aDJGb3JtLmdldCgnY2xpZW50QXV0aGVudGljYXRpb24nKSBhcyB7IHZhbHVlOiB1bmtub3duIH0gfCBudWxsKTtcbiAgICAgIG9hdXRoMiA9IHtcbiAgICAgICAgZ3JhbnRUeXBlOiBncmFudFR5cGUgIT09ICcnID8gZ3JhbnRUeXBlIDogJ2NsaWVudF9jcmVkZW50aWFscycsXG4gICAgICAgIGFjY2Vzc1Rva2VuVXJsOiAodGhpcy5vYXV0aDJGb3JtLmdldCgnYWNjZXNzVG9rZW5VcmwnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgY2xpZW50SWQ6ICh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdjbGllbnRJZCcpPy52YWx1ZSA/PyAnJykgYXMgc3RyaW5nLFxuICAgICAgICBjbGllbnRTZWNyZXQ6ICh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdjbGllbnRTZWNyZXQnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgc2NvcGU6ICh0aGlzLm9hdXRoMkZvcm0uZ2V0KCdzY29wZScpPy52YWx1ZSA/PyAnJykgYXMgc3RyaW5nLFxuICAgICAgICBjbGllbnRBdXRoZW50aWNhdGlvbjogY2xpZW50QXV0aCAhPT0gJycgPyBjbGllbnRBdXRoIDogJ2Jhc2ljJyxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzdGVwMToge1xuICAgICAgICBlbnZpcm9ubWVudDogJycsXG4gICAgICAgIG1ldGhvZDogJycsXG4gICAgICAgIHVybDogdGhpcy51cmwgPz8gJycsXG4gICAgICAgIGhlYWRlcnM6IFtdLFxuICAgICAgICBhdXRoVHlwZSxcbiAgICAgICAgLi4uKGJlYXJlclRva2VuICE9PSB1bmRlZmluZWQgJiYgeyBiZWFyZXJUb2tlbiB9KSxcbiAgICAgICAgLi4uKG9hdXRoMiAhPT0gdW5kZWZpbmVkICYmIHsgb2F1dGgyIH0pLFxuICAgICAgICBhY3RpdmVQYXlsb2FkVGFiOiB0aGlzLmFjdGl2ZVBheWxvYWRUYWIsXG4gICAgICAgIHBheWxvYWRUeXBlOiB0aGlzLnBheWxvYWRUeXBlLFxuICAgICAgICBwYXlsb2FkRm9ybWF0OiAnJyxcbiAgICAgICAgcGF5bG9hZFRleHQ6IHRoaXMucGF5bG9hZFRleHQgPz8gJycsXG4gICAgICAgIGtleVZhbHVlUm93czogW10sXG4gICAgICAgIGtleVR5cGVWYWx1ZVJvd3M6IFtdLFxuICAgICAgICBwYXJhbXNSb3dzOiBbXSxcbiAgICAgIH0sXG4gICAgICBzdGVwMjogeyB2YXJpYWJsZU5hbWU6IHRoaXMudmFyaWFibGVOYW1lID8/ICcnIH0sXG4gICAgICBzdGVwMzoge1xuICAgICAgICBhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYjogdGhpcy5hY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYixcbiAgICAgICAgcmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9uczogW10sXG4gICAgICAgIHN0YXR1c1ZlcmlmaWNhdGlvbnM6IFtdLFxuICAgICAgfSxcbiAgICAgIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIE5vcm1hbGl6ZSBmb3JtIGNvbnRyb2wgdmFsdWUgdG8gc3RyaW5nIChoYW5kbGVzIG9iamVjdCBvciBzdHJpbmcpLiAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRDb250cm9sVmFsdWUoY29udHJvbDogeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgY29uc3QgdiA9IGNvbnRyb2w/LnZhbHVlO1xuICAgIGlmICh2ID09IG51bGwgfHwgdiA9PT0gJycpIHJldHVybiAnJztcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdvYmplY3QnID8gKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpIDogU3RyaW5nKHYpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIGZ1bGwgY3JlYXRlIHBheWxvYWQ6IGVudmlyb25tZW50LCBIVFRQIG1ldGhvZCwgVVJMLCBoZWFkZXJzLCBib2R5IChzdGVwMSksIHZhcmlhYmxlIG5hbWUgKHN0ZXAyKSwgdmVyaWZpY2F0aW9ucyAoc3RlcDMpLiAqL1xuICBwcml2YXRlIGdldENyZWF0ZVBheWxvYWQoKTogQXBpRWRpdENyZWF0ZVBheWxvYWQge1xuICAgIGNvbnN0IGVudkZyb21Gb3JtID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0Q29udHJvbFZhbHVlKHRoaXMuZW52aXJvbm1lbnRGb3JtPy5nZXQoJ2Vudmlyb25tZW50JykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgY29uc3QgZW52aXJvbm1lbnQgPVxuICAgICAgZW52RnJvbUZvcm0gIT09ICcnID8gZW52RnJvbUZvcm0gOiAodGhpcy5jdXJyZW50RW52aXJvbm1lbnRWYWx1ZSAhPT0gJycgPyB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlIDogdGhpcy5zZWxlY3RlZEVudmlyb25tZW50KTtcbiAgICBjb25zdCBtZXRob2RGcm9tRm9ybSA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldENvbnRyb2xWYWx1ZSh0aGlzLm1ldGhvZEZvcm0/LmdldCgnbWV0aG9kJykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgY29uc3QgbWV0aG9kID1cbiAgICAgIG1ldGhvZEZyb21Gb3JtICE9PSAnJyA/IG1ldGhvZEZyb21Gb3JtIDogKHRoaXMuY3VycmVudE1ldGhvZFZhbHVlICE9PSAnJyA/IHRoaXMuY3VycmVudE1ldGhvZFZhbHVlIDogdGhpcy5zZWxlY3RlZE1ldGhvZCk7XG4gICAgY29uc3QgZm9ybWF0ID0gdGhpcy5wYXlsb2FkRm9ybWF0Rm9ybT8uZ2V0KCdmb3JtYXQnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3Qga2V5VmFsdWVGb3JtQXJyYXkgPSB0aGlzLmtleVZhbHVlRm9ybUFycmF5O1xuICAgIGNvbnN0IGtleVZhbHVlUm93cyA9IChrZXlWYWx1ZUZvcm1BcnJheT8uY29udHJvbHMgPz8gW10pLm1hcCgoYykgPT4gKHtcbiAgICAgIGtleTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2tleScpPy52YWx1ZSA/PyAnJyxcbiAgICAgIHZhbHVlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgndmFsdWUnKT8udmFsdWUgPz8gJycsXG4gICAgfSkpO1xuICAgIGNvbnN0IGtleVR5cGVWYWx1ZUZvcm1BcnJheSA9IHRoaXMua2V5VHlwZVZhbHVlRm9ybUFycmF5O1xuICAgIGNvbnN0IGtleVR5cGVWYWx1ZVJvd3MgPSAoa2V5VHlwZVZhbHVlRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkubWFwKChjKSA9PiAoe1xuICAgICAga2V5OiAoYyBhcyBGb3JtR3JvdXApLmdldCgna2V5Jyk/LnZhbHVlID8/ICcnLFxuICAgICAgdHlwZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3R5cGUnKT8udmFsdWUgPz8gJ3RleHQnLFxuICAgICAgdmFsdWU6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJyxcbiAgICB9KSk7XG4gICAgY29uc3QgcGFyYW1zRm9ybUFycmF5ID0gdGhpcy5wYXJhbXNGb3JtQXJyYXk7XG4gICAgY29uc3QgcGFyYW1zUm93cyA9IChwYXJhbXNGb3JtQXJyYXk/LmNvbnRyb2xzID8/IFtdKS5tYXAoKGMpID0+ICh7XG4gICAgICBrZXk6IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCdrZXknKT8udmFsdWUgPz8gJycsXG4gICAgICB2YWx1ZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnLFxuICAgIH0pKTtcbiAgICBjb25zdCB2ZXJpZmljYXRpb25Gb3JtQXJyYXkgPSB0aGlzLnZlcmlmaWNhdGlvbkZvcm1BcnJheTtcbiAgICBjb25zdCByZXNwb25zZUJvZHlWZXJpZmljYXRpb25zID0gKHZlcmlmaWNhdGlvbkZvcm1BcnJheT8uY29udHJvbHMgPz8gW10pLm1hcCgoYykgPT4gKHtcbiAgICAgIGpzb25QYXRoOiAoYyBhcyBGb3JtR3JvdXApLmdldCgnanNvblBhdGgnKT8udmFsdWUgPz8gJycsXG4gICAgICB2ZXJpZmljYXRpb246IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCd2ZXJpZmljYXRpb24nKT8udmFsdWUgPz8gJycsXG4gICAgICBkYXRhVHlwZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2RhdGFUeXBlJyk/LnZhbHVlID8/ICcnLFxuICAgICAgZXhwZWN0ZWRWYWx1ZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJycsXG4gICAgfSkpO1xuICAgIGNvbnN0IHN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheSA9IHRoaXMuc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5O1xuICAgIGNvbnN0IHN0YXR1c1ZlcmlmaWNhdGlvbnMgPSAoc3RhdHVzVmVyaWZpY2F0aW9uRm9ybUFycmF5Py5jb250cm9scyA/PyBbXSkubWFwKChjKSA9PiAoe1xuICAgICAgdmVyaWZpY2F0aW9uOiAoYyBhcyBGb3JtR3JvdXApLmdldCgndmVyaWZpY2F0aW9uJyk/LnZhbHVlID8/ICcnLFxuICAgICAgZXhwZWN0ZWRWYWx1ZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJycsXG4gICAgfSkpO1xuICAgIGNvbnN0IGF1dGhUeXBlID0gdGhpcy5zZWxlY3RlZEF1dGhUeXBlO1xuICAgIGNvbnN0IGJlYXJlclRva2VuID0gYXV0aFR5cGUgPT09ICdiZWFyZXInID8gKHRoaXMuYmVhcmVyVG9rZW4gPz8gJycpIDogdW5kZWZpbmVkO1xuICAgIGxldCBvYXV0aDI6IEFwaUVkaXRPQXV0aDJQYXlsb2FkIHwgdW5kZWZpbmVkO1xuICAgIGlmIChhdXRoVHlwZSA9PT0gJ29hdXRoMicgJiYgdGhpcy5vYXV0aDJGb3JtKSB7XG4gICAgICBjb25zdCBncmFudFR5cGUgPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRDb250cm9sVmFsdWUodGhpcy5vYXV0aDJGb3JtLmdldCgnZ3JhbnRUeXBlJykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgICBjb25zdCBjbGllbnRBdXRoID0gQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0Q29udHJvbFZhbHVlKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2NsaWVudEF1dGhlbnRpY2F0aW9uJykgYXMgeyB2YWx1ZTogdW5rbm93biB9IHwgbnVsbCk7XG4gICAgICBvYXV0aDIgPSB7XG4gICAgICAgIGdyYW50VHlwZTogZ3JhbnRUeXBlICE9PSAnJyA/IGdyYW50VHlwZSA6ICdjbGllbnRfY3JlZGVudGlhbHMnLFxuICAgICAgICBhY2Nlc3NUb2tlblVybDogKHRoaXMub2F1dGgyRm9ybS5nZXQoJ2FjY2Vzc1Rva2VuVXJsJyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIGNsaWVudElkOiAodGhpcy5vYXV0aDJGb3JtLmdldCgnY2xpZW50SWQnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgY2xpZW50U2VjcmV0OiAodGhpcy5vYXV0aDJGb3JtLmdldCgnY2xpZW50U2VjcmV0Jyk/LnZhbHVlID8/ICcnKSBhcyBzdHJpbmcsXG4gICAgICAgIHNjb3BlOiAodGhpcy5vYXV0aDJGb3JtLmdldCgnc2NvcGUnKT8udmFsdWUgPz8gJycpIGFzIHN0cmluZyxcbiAgICAgICAgY2xpZW50QXV0aGVudGljYXRpb246IGNsaWVudEF1dGggIT09ICcnID8gY2xpZW50QXV0aCA6ICdiYXNpYycsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3RlcDE6IHtcbiAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgdXJsOiB0aGlzLnVybCA/PyAnJyxcbiAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICBhdXRoVHlwZSxcbiAgICAgICAgLi4uKGJlYXJlclRva2VuICE9PSB1bmRlZmluZWQgJiYgeyBiZWFyZXJUb2tlbiB9KSxcbiAgICAgICAgLi4uKG9hdXRoMiAhPT0gdW5kZWZpbmVkICYmIHsgb2F1dGgyIH0pLFxuICAgICAgICBhY3RpdmVQYXlsb2FkVGFiOiB0aGlzLmFjdGl2ZVBheWxvYWRUYWIsXG4gICAgICAgIHBheWxvYWRUeXBlOiB0aGlzLnBheWxvYWRUeXBlLFxuICAgICAgICBwYXlsb2FkRm9ybWF0OiBmb3JtYXQsXG4gICAgICAgIHBheWxvYWRUZXh0OiB0aGlzLnBheWxvYWRUZXh0ID8/ICcnLFxuICAgICAgICBrZXlWYWx1ZVJvd3MsXG4gICAgICAgIGtleVR5cGVWYWx1ZVJvd3MsXG4gICAgICAgIHBhcmFtc1Jvd3MsXG4gICAgICB9LFxuICAgICAgc3RlcDI6IHtcbiAgICAgICAgdmFyaWFibGVOYW1lOiB0aGlzLnZhcmlhYmxlTmFtZSA/PyAnJyxcbiAgICAgIH0sXG4gICAgICBzdGVwMzoge1xuICAgICAgICBhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYjogdGhpcy5hY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYixcbiAgICAgICAgcmVzcG9uc2VCb2R5VmVyaWZpY2F0aW9ucyxcbiAgICAgICAgc3RhdHVzVmVyaWZpY2F0aW9ucyxcbiAgICAgIH0sXG4gICAgICBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzOiB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDdXJyZW50IGhlYWRlciByb3dzIGZyb20gZm9ybSAoZm9yIGNvbnN1bWVycyB0aGF0IHJlYWQgaGVhZGVycykgKi9cbiAgZ2V0IGhlYWRlcnMoKTogQXBpRWRpdEhlYWRlclJvd1tdIHtcbiAgICBpZiAoIXRoaXMuaGVhZGVyc0Zvcm1BcnJheSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiB0aGlzLmhlYWRlcnNGb3JtQXJyYXkuY29udHJvbHMubWFwKChjKSA9PiAoe1xuICAgICAgbmFtZTogKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ25hbWUnKT8udmFsdWUgPz8gJycsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIHZhbHVlOiAoYyBhcyBGb3JtR3JvdXApLmdldCgndmFsdWUnKT8udmFsdWUgPz8gJycsXG4gICAgfSkpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsTWV0aG9kJ10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsICYmIHRoaXMubWV0aG9kRm9ybSkge1xuICAgICAgY29uc3QgdiA9IGNoYW5nZXNbJ2luaXRpYWxNZXRob2QnXS5jdXJyZW50VmFsdWU7XG4gICAgICB0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSA9IHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IHYgOiAoQXBpRWRpdFN0ZXBDb21wb25lbnQuZ2V0T3B0aW9uVmFsdWUodiBhcyBFbnZpcm9ubWVudE9wdGlvbklucHV0KSA/PyAnJyk7XG4gICAgICB0aGlzLm1ldGhvZEZvcm0ucGF0Y2hWYWx1ZSh7IG1ldGhvZDogdiB9KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2h0dHBNZXRob2RPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlTWV0aG9kU2VsZWN0Q29uZmlnKCk7XG4gICAgICBpZiAodGhpcy5tZXRob2RGb3JtICYmIHRoaXMuaHR0cE1ldGhvZE9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5tZXRob2RGb3JtLmdldCgnbWV0aG9kJyk/LnZhbHVlO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldE1ldGhvZFZhbHVlcygpO1xuICAgICAgICBjb25zdCB2YWxpZCA9IHZhbHVlcy5pbmNsdWRlcyhjdXJyZW50KTtcbiAgICAgICAgaWYgKCF2YWxpZCkge1xuICAgICAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZSh0aGlzLmh0dHBNZXRob2RPcHRpb25zWzBdKTtcbiAgICAgICAgICBpZiAoZmlyc3RWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRNZXRob2RWYWx1ZSA9IGZpcnN0VmFsdWU7XG4gICAgICAgICAgICB0aGlzLm1ldGhvZEZvcm0ucGF0Y2hWYWx1ZSh7IG1ldGhvZDogZmlyc3RWYWx1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxFbnZpcm9ubWVudCddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCAmJiB0aGlzLmVudmlyb25tZW50Rm9ybSkge1xuICAgICAgY29uc3QgdiA9IGNoYW5nZXNbJ2luaXRpYWxFbnZpcm9ubWVudCddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMuY3VycmVudEVudmlyb25tZW50VmFsdWUgPSB0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyB2IDogKEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCkgPz8gJycpO1xuICAgICAgdGhpcy5lbnZpcm9ubWVudEZvcm0ucGF0Y2hWYWx1ZSh7IGVudmlyb25tZW50OiB2IH0pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snZW52aXJvbm1lbnRPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlRW52aXJvbm1lbnRTZWxlY3RDb25maWcoKTtcbiAgICAgIGlmICh0aGlzLmVudmlyb25tZW50Rm9ybSAmJiB0aGlzLmVudmlyb25tZW50T3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmVudmlyb25tZW50Rm9ybS5nZXQoJ2Vudmlyb25tZW50Jyk/LnZhbHVlO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldEVudmlyb25tZW50VmFsdWVzKCk7XG4gICAgICAgIGNvbnN0IHZhbGlkID0gdmFsdWVzLmluY2x1ZGVzKGN1cnJlbnQpO1xuICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHRoaXMuZW52aXJvbm1lbnRPcHRpb25zWzBdKTtcbiAgICAgICAgICBpZiAoZmlyc3RWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRFbnZpcm9ubWVudFZhbHVlID0gZmlyc3RWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZW52aXJvbm1lbnRGb3JtLnBhdGNoVmFsdWUoeyBlbnZpcm9ubWVudDogZmlyc3RWYWx1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxBdXRoVHlwZSddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCAmJiB0aGlzLmF1dGhUeXBlRm9ybSkge1xuICAgICAgY29uc3QgdiA9IGNoYW5nZXNbJ2luaXRpYWxBdXRoVHlwZSddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGNvbnN0IHJlc29sdmVkID1cbiAgICAgICAgdHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiA6IEFwaUVkaXRTdGVwQ29tcG9uZW50LmdldE9wdGlvblZhbHVlKHYgYXMgRW52aXJvbm1lbnRPcHRpb25JbnB1dCk7XG4gICAgICBpZiAocmVzb2x2ZWQgIT0gbnVsbCkgdGhpcy5hdXRoVHlwZUZvcm0ucGF0Y2hWYWx1ZSh7IGF1dGhUeXBlOiB2IH0pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snYXV0aFR5cGVPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlQXV0aFR5cGVTZWxlY3RDb25maWcoKTtcbiAgICAgIGlmICh0aGlzLmF1dGhUeXBlRm9ybSkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldEF1dGhUeXBlVmFsdWVzKCk7XG4gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmF1dGhUeXBlRm9ybS5nZXQoJ2F1dGhUeXBlJyk/LnZhbHVlO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWwgPVxuICAgICAgICAgICAgY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQgIT09ICcnXG4gICAgICAgICAgICAgID8gdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgPyBBcGlFZGl0U3RlcENvbXBvbmVudC5nZXRPcHRpb25WYWx1ZShjdXJyZW50IGFzIEVudmlyb25tZW50T3B0aW9uSW5wdXQpXG4gICAgICAgICAgICAgICAgOiBTdHJpbmcoY3VycmVudClcbiAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgIGNvbnN0IHZhbGlkID0gY3VycmVudFZhbCAhPSBudWxsICYmIHZhbHVlcy5pbmNsdWRlcyhjdXJyZW50VmFsKTtcbiAgICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gdmFsdWVzWzBdO1xuICAgICAgICAgICAgaWYgKGZpcnN0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aGlzLmF1dGhUeXBlRm9ybS5wYXRjaFZhbHVlKHsgYXV0aFR5cGU6IGZpcnN0VmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsU3RlcCddKSB7XG4gICAgICB0aGlzLmFwcGx5SW5pdGlhbFN0ZXAoY2hhbmdlc1snaW5pdGlhbFN0ZXAnXS5jdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFVybCddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy51cmwgPSBjaGFuZ2VzWydpbml0aWFsVXJsJ10uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFBheWxvYWRUYWInXT8uY3VycmVudFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYWN0aXZlUGF5bG9hZFRhYiA9IGNoYW5nZXNbJ2luaXRpYWxQYXlsb2FkVGFiJ10uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaGVhZGVyTmFtZU9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVIZWFkZXJOYW1lU2VsZWN0Q29uZmlnKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsSGVhZGVycyddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5idWlsZEhlYWRlcnNGb3JtQXJyYXkoY2hhbmdlc1snaW5pdGlhbEhlYWRlcnMnXS5jdXJyZW50VmFsdWUgYXMgQXBpRWRpdEhlYWRlclJvd1tdKTtcbiAgICAgIHRoaXMudXBkYXRlSGVhZGVyTmFtZVNlbGVjdENvbmZpZygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFJlc3BvbnNlUHJldmlldyddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5yZXNwb25zZVByZXZpZXcgPSBjaGFuZ2VzWydpbml0aWFsUmVzcG9uc2VQcmV2aWV3J10uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbEZvcm1hdCddPy5jdXJyZW50VmFsdWUgIT0gbnVsbCAmJiB0aGlzLnBheWxvYWRGb3JtYXRGb3JtKSB7XG4gICAgICB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLnBhdGNoVmFsdWUoeyBmb3JtYXQ6IGNoYW5nZXNbJ2luaXRpYWxGb3JtYXQnXS5jdXJyZW50VmFsdWUgfSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsVmFyaWFibGVOYW1lJ10/LmN1cnJlbnRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZSA9IGNoYW5nZXNbJ2luaXRpYWxWYXJpYWJsZU5hbWUnXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydmb3JtYXRPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlUGF5bG9hZEZvcm1hdFNlbGVjdENvbmZpZygpO1xuICAgICAgaWYgKHRoaXMucGF5bG9hZEZvcm1hdEZvcm0pIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMucGF5bG9hZEZvcm1hdEZvcm0uZ2V0KCdmb3JtYXQnKT8udmFsdWU7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0Rm9ybWF0VmFsdWVzKCk7XG4gICAgICAgIGNvbnN0IHZhbGlkID0gdmFsdWVzLmluY2x1ZGVzKGN1cnJlbnQpO1xuICAgICAgICBpZiAoIXZhbGlkICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IHZhbHVlc1swXTtcbiAgICAgICAgICB0aGlzLnBheWxvYWRGb3JtYXRGb3JtLnBhdGNoVmFsdWUoeyBmb3JtYXQ6IGZpcnN0VmFsdWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZlcmlmaWNhdGlvbk9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVWZXJpZmljYXRpb25TZWxlY3RDb25maWcoKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmVyaWZpY2F0aW9uVmFsdWVzKCk7XG4gICAgICBjb25zdCBkZWZhdWx0VmVyaWZpY2F0aW9uID0gdGhpcy5nZXREZWZhdWx0VmVyaWZpY2F0aW9uKCk7XG4gICAgICBpZiAodGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSAoY29udHJvbCBhcyBGb3JtR3JvdXApLmdldCgndmVyaWZpY2F0aW9uJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50ICYmICF2YWx1ZXMuaW5jbHVkZXMoY3VycmVudCkpIHtcbiAgICAgICAgICAgIChjb250cm9sIGFzIEZvcm1Hcm91cCkucGF0Y2hWYWx1ZSh7IHZlcmlmaWNhdGlvbjogZGVmYXVsdFZlcmlmaWNhdGlvbiB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndmVyaWZpY2F0aW9uRGF0YVR5cGVPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlVmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWcoKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0RGF0YVR5cGVWYWx1ZXMoKTtcbiAgICAgIGNvbnN0IGRlZmF1bHREYXRhVHlwZSA9IHRoaXMuZ2V0RGVmYXVsdERhdGFUeXBlKCk7XG4gICAgICBpZiAodGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy52ZXJpZmljYXRpb25Gb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSAoY29udHJvbCBhcyBGb3JtR3JvdXApLmdldCgnZGF0YVR5cGUnKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgJiYgIXZhbHVlcy5pbmNsdWRlcyhjdXJyZW50KSkge1xuICAgICAgICAgICAgKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5wYXRjaFZhbHVlKHsgZGF0YVR5cGU6IGRlZmF1bHREYXRhVHlwZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snc3RhdHVzVmVyaWZpY2F0aW9uT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1c1ZlcmlmaWNhdGlvblNlbGVjdENvbmZpZygpO1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRTdGF0dXNWZXJpZmljYXRpb25WYWx1ZXMoKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRWZXJpZmljYXRpb24gPSB0aGlzLmdldERlZmF1bHRTdGF0dXNWZXJpZmljYXRpb24oKTtcbiAgICAgIGlmICh0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheSAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnN0YXR1c1ZlcmlmaWNhdGlvbkZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IChjb250cm9sIGFzIEZvcm1Hcm91cCkuZ2V0KCd2ZXJpZmljYXRpb24nKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgJiYgIXZhbHVlcy5pbmNsdWRlcyhjdXJyZW50KSkge1xuICAgICAgICAgICAgKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5wYXRjaFZhbHVlKHsgdmVyaWZpY2F0aW9uOiBkZWZhdWx0VmVyaWZpY2F0aW9uIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtY29udGFpbmVyIGNxYS1iZy1bI2ZmZmZmZl0gY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtcC1bMTZweF0gY3FhLWdhcC1bMTJweF0gY3FhLW92ZXJmbG93LXktYXV0byBjcWEtb3ZlcmZsb3cteC1oaWRkZW4gY3FhLWJveC1ib3JkZXJcIj5cblxuICA8aDIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10aXRsZSBjcWEtZm9udC1pbnRlciBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzEwMCVdIGNxYS10cmFja2luZy1ub3JtYWwgY3FhLXRleHQtWyMwMDAwMDBdIGNxYS1tLTBcIj5cbiAgICB7eyBlZGl0TW9kZSA/ICdVcGRhdGUgQVBJIFRlc3QgU3RlcCcgOiAnQ3JlYXRlIEFQSSBUZXN0IFN0ZXAnIH19XG4gIDwvaDI+XG5cbiAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvciBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMCBjcWEtbWF4LVs3NjdweF06Y3FhLWZsZXgtd3JhcCBjcWEtbWF4LVs3NjdweF06Y3FhLWdhcC0yIGNxYS1tYXgtWzc2N3B4XTpjcWEtanVzdGlmeS1zdGFydFwiXG4gICAgW2NsYXNzLmNxYS1qdXN0aWZ5LXN0YXJ0XT1cInN0ZXBMYWJlbHMubGVuZ3RoID09PSAxXCJcbiAgICBbY2xhc3MuY3FhLWp1c3RpZnktYmV0d2Vlbl09XCJzdGVwTGFiZWxzLmxlbmd0aCAhPT0gMVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0ZXAgb2Ygc3RlcExhYmVsczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCJcbiAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbmRpY2F0b3ItaXRlbSBjcWEtYXBpLWVkaXQtc3RlcC1pbmRpY2F0b3ItaXRlbS0tY2xpY2thYmxlIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC1bMTBweF0gY3FhLWN1cnNvci1wb2ludGVyIGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1mb250LWluaGVyaXQgY3FhLXRleHQtaW5oZXJpdCBjcWEtdGV4dC1sZWZ0ICFjcWEtYmctdHJhbnNwYXJlbnRcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidTdGVwICcgKyBzdGVwLmluZGV4ICsgJzogJyArIHN0ZXAubGFiZWxcIiBbYXR0ci5hcmlhLXByZXNzZWRdPVwic3RlcC5pbmRleCA9PT0gY3VycmVudFN0ZXBcIlxuICAgICAgICAoY2xpY2tlZCk9XCJzZXRTdGVwKHN0ZXAuaW5kZXgpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW5kaWNhdG9yLWNpcmNsZSBjcWEtdy04IGNxYS1oLTggY3FhLXJvdW5kZWQtZnVsbCBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJvcmRlci1ub25lIGNxYS1zaHJpbmstMFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwic3RlcC5pbmRleCA9PT0gY3VycmVudFN0ZXAgPyAnY3FhLWJnLVsjNEY0NkU1XSBjcWEtdGV4dC13aGl0ZScgOiAnY3FhLWJnLVsjRTBFMEUwXSBjcWEtdGV4dC1bIzY2NjY2Nl0nXCI+XG4gICAgICAgICAge3sgc3RlcC5pbmRleCB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW5kaWNhdG9yLWxhYmVsIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLW1heC1bNzY3cHhdOmNxYS10ZXh0LXhzXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJzdGVwLmluZGV4ID09PSBjdXJyZW50U3RlcCA/ICdjcWEtdGV4dC1bIzRGNDZFNV0nIDogJ2NxYS10ZXh0LVsjNjY2NjY2XSdcIj5cbiAgICAgICAgICB7eyBzdGVwLmxhYmVsIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImkgPCBzdGVwTGFiZWxzLmxlbmd0aCAtIDFcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWluZGljYXRvci1saW5lIGNxYS13LVs5NnB4XSBjcWEtaC1bMnB4XSBjcWEtYmctWyNFMEUwRTBdIGNxYS1teS0wIGNxYS1teC1bNnB4XSBjcWEtc2hyaW5rLTAgY3FhLXNlbGYtY2VudGVyIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1bMjRweF0gY3FhLW1heC1bNzY3cHhdOmNxYS1teC0xXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9kaXY+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU3RlcCBjb250ZW50IHZpZXdwb3J0OiBvbmx5IHRoZSBhY3RpdmUgc3RlcCBib2R5IGlzIHNob3duICgqbmdJZikgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12aWV3cG9ydCBjcWEtdy1mdWxsXCI+XG4gICAgPCEtLSBTdGVwIDE6IEVudmlyb25tZW50LCByZXF1ZXN0LCBib2R5LCByZXNwb25zZSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudFN0ZXAgPT09IDFcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBhbmVsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTYgY3FhLWJveC1ib3JkZXIgY3FhLXctZnVsbFwiPlxuICAgICAgICA8IS0tIEVudmlyb25tZW50IHJvdzogbGFiZWwgb24gdG9wLCBzZWxlY3QgYmVsb3cgKGFsaWduZWQgcmlnaHQgb24gZGVza3RvcCkgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1lbnZpcm9ubWVudC1yb3cgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1pdGVtcy1lbmQgY3FhLW1heC1bNzY3cHhdOmNxYS1pdGVtcy1zdHJldGNoXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1heC1bNzY3cHhdOmNxYS1pdGVtcy1zdHJldGNoXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtZW52aXJvbm1lbnQtbGFiZWwgY3FhLW0tMCBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzEwMCVdIGNxYS10cmFja2luZy1ub3JtYWxcIj5FbnZpcm9ubWVudHM8L2xhYmVsPlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgKm5nSWY9XCJlbnZpcm9ubWVudEZvcm1cIiBbZm9ybV09XCJlbnZpcm9ubWVudEZvcm1cIiBbY29uZmlnXT1cImVudmlyb25tZW50U2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtZW52aXJvbm1lbnQtc2VsZWN0IGNxYS1zaHJpbmstMCBjcWEtdy1hdXRvIGNxYS1taW4tdy1bMzE1cHhdIGNxYS1tYXgtdy1bMzE1cHhdIGNxYS1tYXgtWzc2N3B4XTpjcWEtbWluLXctMCBjcWEtbWF4LVs3NjdweF06Y3FhLW1heC13LWZ1bGwgY3FhLW1heC1bNzY3cHhdOmNxYS13LWZ1bGwgWyZfLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJdOmNxYS1wYi0wXCIgYXJpYS1sYWJlbD1cIkVudmlyb25tZW50XCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25FbnZpcm9ubWVudFNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBSZXF1ZXN0IHJvdzogbWV0aG9kLCBVUkwsIGJ1dHRvbnMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1yZXF1ZXN0LXJvdyBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtZmxleC13cmFwIGNxYS1tYXgtWzc2N3B4XTpjcWEtZmxleC1jb2wgY3FhLW1heC1bNzY3cHhdOmNxYS1pdGVtcy1zdHJldGNoIGNxYS1tYXgtWzc2N3B4XTpjcWEtZ2FwLTIuNVwiPlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgKm5nSWY9XCJtZXRob2RGb3JtXCIgW2Zvcm1dPVwibWV0aG9kRm9ybVwiIFtjb25maWddPVwibWV0aG9kU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtbWV0aG9kLXNlbGVjdCBjcWEtc2hyaW5rLTAgY3FhLXctYXV0byBjcWEtbWluLXctWzE1MnB4XSBjcWEtbWF4LXctWzE1MnB4XSBjcWEtbWF4LVs3NjdweF06Y3FhLW1pbi13LTAgY3FhLW1heC1bNzY3cHhdOmNxYS1tYXgtdy1mdWxsIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1mdWxsXCIgYXJpYS1sYWJlbD1cIkhUVFAgbWV0aG9kXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25NZXRob2RTZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC11cmwtd3JhcCBjcWEtZmxleC0xIGNxYS1taW4tdy1bMjAwcHhdIGNxYS1tYXgtWzc2N3B4XTpjcWEtbWluLXctMCBjcWEtbWF4LVs3NjdweF06Y3FhLXctZnVsbCBbJl9jcWEtY3VzdG9tLWlucHV0Xy5jcWEtcmVsYXRpdmVfaW5wdXRdOmNxYS1oLVs0MHB4XSBbJl9jcWEtY3VzdG9tLWlucHV0Xy5jcWEtcmVsYXRpdmVfaW5wdXRdOmNxYS1iZy13aGl0ZSBbJl9jcWEtY3VzdG9tLWlucHV0Xy5jcWEtcmVsYXRpdmVfaW5wdXRdOmNxYS1ib3JkZXIgWyZfY3FhLWN1c3RvbS1pbnB1dF8uY3FhLXJlbGF0aXZlX2lucHV0XTpjcWEtYm9yZGVyLXNvbGlkIFsmX2NxYS1jdXN0b20taW5wdXRfLmNxYS1yZWxhdGl2ZV9pbnB1dF06Y3FhLWJvcmRlci1bI0QxRDVEQl0gWyZfY3FhLWN1c3RvbS1pbnB1dF8uY3FhLXJlbGF0aXZlX2lucHV0XTpjcWEtcm91bmRlZC1tZCBbJl9jcWEtY3VzdG9tLWlucHV0Xy5jcWEtcmVsYXRpdmVfaW5wdXRdOmNxYS10ZXh0LXNtIFsmX2NxYS1jdXN0b20taW5wdXRfLmNxYS1yZWxhdGl2ZV9pbnB1dF06Y3FhLXRleHQtWyMzNzQxNTFdXCI+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbKHZhbHVlKV09XCJ1cmxcIiBbbGFiZWxdPVwiJydcIiBwbGFjZWhvbGRlcj1cIkVudGVyIHJlcXVlc3QgVVJMXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgc2l6ZT1cIm1kXCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXRyaWdnZXIgY3FhLWNvbnRlbnRzIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1mdWxsIGNxYS1tYXgtWzc2N3B4XTohY3FhLWZsZXhcIiAoY2xpY2spPVwib3BlbkltcG9ydEN1cmxQYW5lbCgpXCI+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIkltcG9ydCBBUEkgY1VSTFwiXG4gICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYnRuLW91dGxpbmUgIWNxYS1iZy13aGl0ZSAhY3FhLWJvcmRlciAhY3FhLWJvcmRlci1zb2xpZCAhY3FhLWJvcmRlci1bIzZCNzI4MF0gY3FhLXRleHQtWyM0MTQxNDZdIGNxYS1mb250LWludGVyIGNxYS10ZXh0LVsxNHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTAwJV0gY3FhLXRyYWNraW5nLW5vcm1hbCBob3ZlcjohY3FhLWJnLVsjRjlGQUZCXSBob3ZlcjohY3FhLXRleHQtWyM0MTQxNDZdIGNxYS1tYXgtWzc2N3B4XTpjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJTZW5kIFJlcXVlc3RcIiAoY2xpY2tlZCk9XCJvblNlbmRSZXF1ZXN0KClcIlxuICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1idG4tcHJpbWFyeSBjcWEtZm9udC1pbnRlciBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzEwMCVdIGNxYS10cmFja2luZy1ub3JtYWwgIWNxYS1iZy1bIzNGNDNFRV0gY3FhLXRleHQtWyNGQkZDRkZdICFjcWEtYm9yZGVyLW5vbmUgY3FhLXB5LTIuNSBjcWEtcHgtNiBjcWEtZ2FwLTIgY3FhLXJvdW5kZWQtbGcgY3FhLW1pbi1oLVszN3B4XSBjcWEtYm94LWJvcmRlciBob3ZlcjohY3FhLWJnLVsjMUIxRkVCXSBjcWEtbWF4LVs3NjdweF06Y3FhLXctZnVsbFwiPlxuICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cblxuXG4gICAgICAgIDwhLS0gQm9keSBjb250ZW50OiBoZWFkZXIgc2VjdGlvbiAoZGVmYXVsdCkgT1IgaW1wb3J0IGNVUkwgc2VjdGlvbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJvZHlWaWV3ID09PSAnaW1wb3J0LWN1cmwnXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXBhbmVsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1zaGFkb3ctWzBfMXB4XzNweF9yZ2JhKDAsMCwwLDAuMDgpXSBjcWEtb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtaGVhZGVyIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcHktMyBjcWEtcHgtNSBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtYmctWyNGOUZBRkJdIGNxYS1yb3VuZGVkLXQtbGcgY3FhLW1heC1bNzY3cHhdOmNxYS1weC00XCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXRpdGxlIGNxYS1tLTAgY3FhLXRleHQteHMgY3FhLWZvbnQtYm9sZCBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRleHQtWyMzNzQxNTFdXCI+SW1wb3J0IEFQSSBjVVJMPC9oMz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWltcG9ydC1jdXJsLXNlcGFyYXRvciBjcWEtaC1weCBjcWEtYmctWyNFMkU4RjBdIGNxYS1teS0wIGNxYS1teC01XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtYm9keVwiPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYSBbdmFsdWVdPVwiaW1wb3J0Q3VybENvbnRyb2wudmFsdWVcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJpbXBvcnRDdXJsQ29udHJvbC5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBhc3RlIHlvdXIgY1VSTCBjb21tYW5kIGhlcmUgKGUuZy4sIGN1cmwgLVggUE9TVCBodHRwczovL2FwaS5leGFtcGxlLmNvbS91c2VycylcIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFtyb3dzXT1cIjhcIiByZXNpemU9XCJ2ZXJ0aWNhbFwiIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC10ZXh0YXJlYVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1pbXBvcnQtY3VybC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJDYW5jZWxcIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtYnRuLWNhbmNlbFwiIChjbGlja2VkKT1cIm9uQ2FuY2VsSW1wb3J0Q3VybCgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJJbXBvcnRcIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaW1wb3J0LWN1cmwtYnRuLWltcG9ydFwiIChjbGlja2VkKT1cIm9uSW1wb3J0Q3VybENvbmZpcm0oKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYm9keVZpZXcgPT09ICdoZWFkZXJzJ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10YWJzLXdyYXBwZXIgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXRhYnNcIj5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gKm5nRm9yPVwibGV0IHRhYiBvZiBwYXlsb2FkVGFic1wiIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFt0ZXh0XT1cInRhYi5sYWJlbFwiXG4gICAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC10YWInICsgKGFjdGl2ZVBheWxvYWRUYWIgPT09IHRhYi52YWx1ZSA/ICcgY3FhLWFwaS1lZGl0LXN0ZXAtdGFiLS1hY3RpdmUnIDogJycpICsgKGlzTWV0aG9kV2l0aG91dEJvZHkgJiYgKHRhYi52YWx1ZSA9PT0gJ2JvZHknIHx8IHRhYi52YWx1ZSA9PT0gJ3BhcmFtcycpID8gJyBjcWEtYXBpLWVkaXQtc3RlcC10YWItLWRpc2FibGVkJyA6ICcnKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTWV0aG9kV2l0aG91dEJvZHkgJiYgKHRhYi52YWx1ZSA9PT0gJ2JvZHknIHx8IHRhYi52YWx1ZSA9PT0gJ3BhcmFtcycpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJzZXRQYXlsb2FkVGFiKHRhYi52YWx1ZSlcIj5cbiAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gUGF5bG9hZCBjb250ZW50IChBdXRob3JpemF0aW9uKSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVQYXlsb2FkVGFiID09PSAnYXV0aG9yaXphdGlvbidcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWRcIlxuICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCIncGFkZGluZzogMjBweDsgbWluLWhlaWdodDogMjAwcHg7J1wiPlxuICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDIwcHg7J1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogOHB4OyB3aWR0aDogZml0LWNvbnRlbnQ7J1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC13ZWlnaHQ6IDYwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsgY29sb3I6ICM2QjcyODA7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5BVVRIIFRZUEU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0ICpuZ0lmPVwiYXV0aFR5cGVGb3JtXCIgW2Zvcm1dPVwiYXV0aFR5cGVGb3JtXCIgW2NvbmZpZ109XCJhdXRoVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYXV0aC10eXBlLXNlbGVjdFwiIGFyaWEtbGFiZWw9XCJBdXRoIHR5cGVcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInbWluLXdpZHRoOiAxNjBweDsnXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIE5vIEF1dGg6IGNlbnRlcmVkIG1lc3NhZ2UgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkQXV0aFR5cGUgPT09ICduby1hdXRoJ1wiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInZmxleDogMTsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGdhcDogMTJweDsgbWluLXdpZHRoOiAwOyB0ZXh0LWFsaWduOiBjZW50ZXI7J1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInd2lkdGg6IDQ4cHg7IGhlaWdodDogNDhweDsgYm9yZGVyLXJhZGl1czogMTBweDsgYmFja2dyb3VuZDogI0YzRjRGNjsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGZsZXgtc2hyaW5rOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jaztcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNVwiIHk9XCIxMVwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIyXCIgcng9XCIxXCIgZmlsbD1cIiM5Q0EzQUZcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxNnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPk5vIEF1dGg8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgZ2FwOiA2cHg7IGZsZXgtd3JhcDogd3JhcDsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA0MDA7IGNvbG9yOiAjOUNBM0FGOyBsaW5lLWhlaWdodDogMS40OydcIj5UaGlzIHJlcXVlc3QgZG9lcyBub3QgdXNlIGFueSBhdXRob3JpemF0aW9uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gcm9sZT1cImltZ1wiIGFyaWEtbGFiZWw9XCJNb3JlIGluZm9ybWF0aW9uXCIgdGl0bGU9XCJUaGlzIHJlcXVlc3QgZG9lcyBub3QgdXNlIGFueSBhdXRob3JpemF0aW9uLlwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgd2lkdGg6IDE4cHg7IGhlaWdodDogMThweDsgY29sb3I6ICM5Q0EzQUY7IGZsZXgtc2hyaW5rOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiN1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOCA3djRNOCA1di41XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gQmVhcmVyIFRva2VuOiBUb2tlbiBsYWJlbCArIHRleHRhcmVhIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEF1dGhUeXBlID09PSAnYmVhcmVyJ1wiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCInZmxleDogMTsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxMHB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5Ub2tlbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRleHRhcmVhIFsodmFsdWUpXT1cImJlYXJlclRva2VuXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBiZWFyZXIgdG9rZW5cIlxuICAgICAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIiBbcm93c109XCI2XCIgcmVzaXplPVwidmVydGljYWxcIiBzaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWF1dGgtdG9rZW4tdGV4dGFyZWFcIiBhcmlhTGFiZWw9XCJCZWFyZXIgdG9rZW5cIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS10ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIE9BdXRoIDIuMDogR3JhbnQgVHlwZSwgQWNjZXNzIFRva2VuIFVSTCwgQ2xpZW50IElELCBDbGllbnQgU2VjcmV0LCBTY29wZSwgQ2xpZW50IEF1dGhlbnRpY2F0aW9uIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEF1dGhUeXBlID09PSAnb2F1dGgyJyAmJiBvYXV0aDJGb3JtXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtb2F1dGgyLWdyaWRcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsgZ2FwOiAxNnB4IDI0cHg7IHdpZHRoOiAxMDAlOydcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPkdyYW50IFR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgKm5nSWY9XCJvYXV0aDJGb3JtXCIgW2Zvcm1dPVwib2F1dGgyRm9ybVwiIFtjb25maWddPVwib2F1dGgyR3JhbnRUeXBlU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWF1dGgtb2F1dGgtc2VsZWN0XCIgYXJpYS1sYWJlbD1cIk9BdXRoIGdyYW50IHR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0eWxlXT1cIidtaW4td2lkdGg6IDA7IHdpZHRoOiAxMDAlOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDExcHg7IGZvbnQtc3R5bGU6IGl0YWxpYzsgY29sb3I6ICM2QjcyODA7IGxpbmUtaGVpZ2h0OiAxLjM7J1wiPk9BdXRoIGdyYW50IHR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPkFjY2VzcyBUb2tlbiBVUkw8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJvYXV0aDJGb3JtLmdldCgnYWNjZXNzVG9rZW5VcmwnKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvYXV0aDJGb3JtLmdldCgnYWNjZXNzVG9rZW5VcmwnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicnXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBPQXV0aCB0b2tlbiBlbmRwb2ludFwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiQWNjZXNzIFRva2VuIFVSTFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDExcHg7IGZvbnQtc3R5bGU6IGl0YWxpYzsgY29sb3I6ICM2QjcyODA7IGxpbmUtaGVpZ2h0OiAxLjM7J1wiPk9BdXRoIHRva2VuIGVuZHBvaW50PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDsgbWluLXdpZHRoOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5DbGllbnQgSUQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJvYXV0aDJGb3JtLmdldCgnY2xpZW50SWQnKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvYXV0aDJGb3JtLmdldCgnY2xpZW50SWQnKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicnXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBPQXV0aCBjbGllbnQgaWRlbnRpZmllclwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiQ2xpZW50IElEXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC1zdHlsZTogaXRhbGljOyBjb2xvcjogIzZCNzI4MDsgbGluZS1oZWlnaHQ6IDEuMzsnXCI+T0F1dGggY2xpZW50IGlkZW50aWZpZXI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuc3R5bGVdPVwiJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyBtaW4td2lkdGg6IDA7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzM3NDE1MTsgbGluZS1oZWlnaHQ6IDEuMjU7J1wiPkNsaWVudCBTZWNyZXQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJvYXV0aDJGb3JtLmdldCgnY2xpZW50U2VjcmV0Jyk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib2F1dGgyRm9ybS5nZXQoJ2NsaWVudFNlY3JldCcpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicGFzc3dvcmRcIiBbbGFiZWxdPVwiJydcIiBwbGFjZWhvbGRlcj1cIkVudGVyIE9BdXRoIGNsaWVudCBzZWNyZXRcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIkNsaWVudCBTZWNyZXRcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbYXR0ci5zdHlsZV09XCInZm9udC1zaXplOiAxMXB4OyBmb250LXN0eWxlOiBpdGFsaWM7IGNvbG9yOiAjNkI3MjgwOyBsaW5lLWhlaWdodDogMS4zOydcIj5PQXV0aCBjbGllbnQgc2VjcmV0PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFthdHRyLnN0eWxlXT1cIidkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDsgbWluLXdpZHRoOiAwOydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMzNzQxNTE7IGxpbmUtaGVpZ2h0OiAxLjI1OydcIj5TY29wZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cIm9hdXRoMkZvcm0uZ2V0KCdzY29wZScpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9hdXRoMkZvcm0uZ2V0KCdzY29wZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJydcIiBwbGFjZWhvbGRlcj1cIkVudGVyIHNwYWNlLXNlcGFyYXRlZCBzY29wZXNcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIlNjb3BlXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC1zdHlsZTogaXRhbGljOyBjb2xvcjogIzZCNzI4MDsgbGluZS1oZWlnaHQ6IDEuMzsnXCI+U3BhY2Utc2VwYXJhdGVkIHNjb3Blczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBbYXR0ci5zdHlsZV09XCInZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA2cHg7IG1pbi13aWR0aDogMDsnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLnN0eWxlXT1cIidmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMzc0MTUxOyBsaW5lLWhlaWdodDogMS4yNTsnXCI+Q2xpZW50IEF1dGhlbnRpY2F0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0ICpuZ0lmPVwib2F1dGgyRm9ybVwiIFtmb3JtXT1cIm9hdXRoMkZvcm1cIiBbY29uZmlnXT1cIm9hdXRoMkNsaWVudEF1dGhTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYXV0aC1vYXV0aC1zZWxlY3RcIiBhcmlhLWxhYmVsPVwiQ2xpZW50IGF1dGhlbnRpY2F0aW9uIG1ldGhvZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiJ21pbi13aWR0aDogMDsgd2lkdGg6IDEwMCU7J1wiPlxuICAgICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2F0dHIuc3R5bGVdPVwiJ2ZvbnQtc2l6ZTogMTFweDsgZm9udC1zdHlsZTogaXRhbGljOyBjb2xvcjogIzZCNzI4MDsgbGluZS1oZWlnaHQ6IDEuMzsnXCI+Q2xpZW50IGF1dGhlbnRpY2F0aW9uIG1ldGhvZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFBheWxvYWQgY29udGVudCAoSGVhZGVycykgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlUGF5bG9hZFRhYiA9PT0gJ2hlYWRlcnMnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXJzLWdyaWRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWhlYWRlcnMtbGFiZWxcIj5IZWFkZXIgTmFtZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWhlYWRlcnMtbGFiZWxcIj5IZWFkZXIgVmFsdWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXJzLWxhYmVsIGNxYS1hcGktZWRpdC1zdGVwLWhlYWRlcnMtbGFiZWwtLWVtcHR5XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBoZWFkZXJSb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5SGVhZGVyXCIgW2Zvcm1Hcm91cF09XCJyb3dcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtaGVhZGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwicm93XCIgW2NvbmZpZ109XCJoZWFkZXJOYW1lU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgIChhZGRDdXN0b21WYWx1ZSk9XCJvbkhlYWRlck5hbWVBZGRDdXN0b21WYWx1ZSgkZXZlbnQsIHJvdylcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXItdHlwZS1zZWxlY3QgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXItdmFsdWUtaW5wdXRcIiBhcmlhTGFiZWw9XCJIZWFkZXIgdmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXItZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInUmVtb3ZlIGhlYWRlcidcIiAoY2xpY2tlZCk9XCJyZW1vdmVIZWFkZXIoaSlcIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1oZWFkZXItZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0Y5QkZCRlwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYWRkLWhlYWRlci13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgdGV4dD1cIisgQWRkIEhlYWRlclwiXG4gICAgICAgICAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLWFkZC1oZWFkZXItbGluaydcIiAoY2xpY2tlZCk9XCJhZGRIZWFkZXIoKVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBQYXlsb2FkIGNvbnRlbnQgKFBhcmFtcyk6IEtleeKAk1ZhbHVlIHRhYmxlIHdpdGggYWRkL2RlbGV0ZSByb3dzIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVBheWxvYWRUYWIgPT09ICdwYXJhbXMnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtZ3JpZCBjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWxcIj5LZXk8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWxcIj5WYWx1ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1sYWJlbCBjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWwtLWVtcHR5XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBwYXJhbXNSb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5UGFyYW1zXCIgW2Zvcm1Hcm91cF09XCJyb3dcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCdrZXknKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2tleScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJLZXlcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtaW5wdXRcIiBhcmlhTGFiZWw9XCJLZXlcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJyb3cuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJWYWx1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIlZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSByb3cnXCIgKGNsaWNrZWQpPVwicmVtb3ZlUGFyYW1zUm93KGkpXCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWRlbGV0ZS1pY29uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNjY2MyA2VjEyLjY2NjdINS4zMzMwMVY2SDEwLjY2NjNaTTkuNjY2MzQgMkg2LjMzMzAxTDUuNjY2MzQgMi42NjY2N0gzLjMzMzAxVjRIMTIuNjY2M1YyLjY2NjY3SDEwLjMzM0w5LjY2NjM0IDJaTTExLjk5OTcgNC42NjY2N0gzLjk5OTY3VjEyLjY2NjdDMy45OTk2NyAxMy40IDQuNTk5NjcgMTQgNS4zMzMwMSAxNEgxMC42NjYzQzExLjM5OTcgMTQgMTEuOTk5NyAxMy40IDExLjk5OTcgMTIuNjY2N1Y0LjY2NjY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1hZGQtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIisgQWRkIFJvd1wiXG4gICAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1hZGQtYnRuXCIgKGNsaWNrZWQpPVwiYWRkUGFyYW1zUm93KClcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gUGF5bG9hZCBjb250ZW50IChCb2R5IG9ubHkpOiB0eXBlLCBmb3JtYXQsIHRleHQgYXJlYSwgQmFjay9OZXh0IC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVBheWxvYWRUYWIgPT09ICdib2R5J1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZCBjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWVkaXRvclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10eXBlLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10eXBlLWxhYmVsXCI+VHlwZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10eXBlLXJhZGlvc1wiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2wgW3ZhbHVlXT1cInBheWxvYWRUeXBlXCIgW3NlZ21lbnRzXT1cInBheWxvYWRUeXBlU2VnbWVudHNcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25QYXlsb2FkVHlwZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXR5cGUtc2VnbWVudFwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwYXlsb2FkVHlwZSA9PT0gJ3JhdydcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtZm9ybWF0LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1mb3JtYXQtbGFiZWxcIj5Gb3JtYXQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdJZj1cInBheWxvYWRGb3JtYXRGb3JtXCIgW2Zvcm1dPVwicGF5bG9hZEZvcm1hdEZvcm1cIlxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cInBheWxvYWRGb3JtYXRTZWxlY3RDb25maWdcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtZm9ybWF0LXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGb3JtYXRcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPCEtLSBSYXc6IHRleHQgYXJlYSB3aXRoIGxpbmUgbnVtYmVycyAoUG9zdG1hbi1zdHlsZSBwYXlsb2FkIGJvZHkpIC0tPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGF5bG9hZFR5cGUgPT09ICdyYXcnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWJvZHlcIiAjcGF5bG9hZEVkaXRvcldpdGhMaW5lc1JlZj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1lZGl0b3Itd2l0aC1saW5lc1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtbGluZS1udW1iZXJzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBuIG9mIHBheWxvYWRMaW5lTnVtYmVyc1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1saW5lLW51bVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicGF5bG9hZEpzb25FcnJvciAmJiBwYXlsb2FkSnNvbkVycm9yLmxpbmUgPT09IG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLWxpbmUtZXJyb3ItaWNvblwiIFt0aXRsZV09XCJwYXlsb2FkSnNvbkVycm9yVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUGFyc2UgZXJyb3Igb24gdGhpcyBsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjdcIiBjeT1cIjdcIiByPVwiNlwiIGZpbGw9XCIjRUY0NDQ0XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNGw2IDZNMTAgNGwtNiA2XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC1saW5lLW51bS10ZXh0XCI+e3sgbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGF5bG9hZC10ZXh0YXJlYS1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXRleHRhcmVhIGNxYS13LWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1taW4taC0wXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdGV4dGFyZWEtLWVycm9yJzogcGF5bG9hZEpzb25FcnJvcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgI3BheWxvYWRUZXh0YXJlYVJlZlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1wYXlsb2FkLXRleHRhcmVhLWlucHV0IGNxYS13LWZ1bGwgY3FhLW91dGxpbmUtbm9uZSBjcWEtYm94LWJvcmRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtdGV4dGFyZWEtaW5wdXQtLWVycm9yJzogcGF5bG9hZEpzb25FcnJvcn1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInBheWxvYWRUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1BheWxvYWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCIhIXBheWxvYWRKc29uRXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uUGF5bG9hZElucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25QYXlsb2FkS2V5ZG93bigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cInBheWxvYWRKc29uRXJyb3JcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXBheWxvYWQtanNvbi1lcnJvci1tc2dcIj5cbiAgICAgICAgICAgICAgICAgIEludmFsaWQgSlNPTiBmb3JtYXQuIFBsZWFzZSBjaGVjayB5b3VyIHN5bnRheC5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0geC13d3ctZm9ybS11cmxlbmNvZGVkOiBLZXnigJNWYWx1ZSByb3dzLCBhZGQvcmVtb3ZlIGR5bmFtaWNhbGx5IC0tPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGF5bG9hZFR5cGUgPT09ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWdyaWQgY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWxcIj5LZXk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1sYWJlbFwiPlZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdmFsdWUtbGFiZWwgY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2Yga2V5VmFsdWVSb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5S2V5VmFsdWVcIiBbZm9ybUdyb3VwXT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCdrZXknKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgna2V5Jyk/LnNldFZhbHVlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIktleVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiS2V5XCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgndmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1pbnB1dFwiIGFyaWFMYWJlbD1cIlZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1kZWxldGUnXCJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSByb3cnXCIgKGNsaWNrZWQpPVwicmVtb3ZlS2V5VmFsdWVSb3coaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1kZWxldGUtaWNvblwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwLjY2NjMgNlYxMi42NjY3SDUuMzMzMDFWNkgxMC42NjYzWk05LjY2NjM0IDJINi4zMzMwMUw1LjY2NjM0IDIuNjY2NjdIMy4zMzMwMVY0SDEyLjY2NjNWMi42NjY2N0gxMC4zMzNMOS42NjYzNCAyWk0xMS45OTk3IDQuNjY2NjdIMy45OTk2N1YxMi42NjY3QzMuOTk5NjcgMTMuNCA0LjU5OTY3IDE0IDUuMzMzMDEgMTRIMTAuNjY2M0MxMS4zOTk3IDE0IDExLjk5OTcgMTMuNCAxMS45OTk3IDEyLjY2NjdWNC42NjY2N1pcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXZhbHVlLWFkZC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCIrIEFkZCBSb3dcIlxuICAgICAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS12YWx1ZS1hZGQtYnRuXCIgKGNsaWNrZWQpPVwiYWRkS2V5VmFsdWVSb3coKVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIEZvcm0gRGF0YTogS2V54oCTVHlwZeKAk1ZhbHVlIHJvd3M7IFR5cGUgaXMgYSBkcm9wZG93biAoVGV4dC9GaWxlKSwgYWRkL3JlbW92ZSBkeW5hbWljYWxseSAtLT5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBheWxvYWRUeXBlID09PSAnZm9ybS1kYXRhJ1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsXCI+S2V5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1rZXktdHlwZS12YWx1ZS1sYWJlbFwiPlR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsXCI+VmFsdWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsIGNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWxhYmVsLS1lbXB0eVwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2Yga2V5VHlwZVZhbHVlUm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUtleVR5cGVWYWx1ZVwiIFtmb3JtR3JvdXBdPVwicm93XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtcm93XCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgna2V5Jyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2tleScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJLZXlcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiS2V5XCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cInJvd1wiIFtjb25maWddPVwia2V5VHlwZVZhbHVlVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtdHlwZS1zZWxlY3QgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdmFsdWVdPVwicm93LmdldCgndmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWlucHV0XCIgYXJpYUxhYmVsPVwiVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidSZW1vdmUgcm93J1wiIChjbGlja2VkKT1cInJlbW92ZUtleVR5cGVWYWx1ZVJvdyhpKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAta2V5LXR5cGUtdmFsdWUtZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjlCRkJGXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWFkZC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCIrIEFkZCBSb3dcIlxuICAgICAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLWtleS10eXBlLXZhbHVlLWFkZC1idG5cIiAoY2xpY2tlZCk9XCJhZGRLZXlUeXBlVmFsdWVSb3coKVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEFkdmFuY2VkIHNldHRpbmdzIChzdGVwLWxldmVsKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1tdC00XCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtdy1mdWxsIGNxYS10ZXh0LWxlZnQgY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtcHktMiBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1ncmF5LTIwMFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWR2YW5jZWRFeHBhbmRlZCA9ICFhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XVwiPkFkdmFuY2VkPC9zcGFuPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtbGcgY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cImFkdmFuY2VkRXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgZXhwYW5kX21vcmVcbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImFkdmFuY2VkRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1tdC0yXCI+XG4gICAgICAgICAgICA8Y3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtXG4gICAgICAgICAgICAgIFthZHZhbmNlZFZhcmlhYmxlc109XCJhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzXCJcbiAgICAgICAgICAgICAgW2FkdmFuY2VkVmFyaWFibGVGb3JtXT1cImFkdmFuY2VkVmFyaWFibGVzRm9ybVwiXG4gICAgICAgICAgICAgICh2YXJpYWJsZUJvb2xlYW5DaGFuZ2UpPVwib25BZHZhbmNlZFZhcmlhYmxlQm9vbGVhbkNoYW5nZSgkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICh2YXJpYWJsZVZhbHVlQ2hhbmdlKT1cIm9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKCRldmVudC5uYW1lLCAkZXZlbnQudmFsdWUpXCI+XG4gICAgICAgICAgICA8L2NxYS1hZHZhbmNlZC12YXJpYWJsZXMtZm9ybT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIFN0ZXAgMjogVmFyaWFibGUgTmFtZTogaW5wdXQsIHZhbGlkYXRpb24sIEJhY2sgLyBOZXh0IC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50U3RlcCA9PT0gMlwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGFuZWwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNiBjcWEtYm94LWJvcmRlciBjcWEtdy1mdWxsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12YXJpYWJsZS1zZWN0aW9uXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZhcmlhYmxlLWlucHV0LXdyYXBcIj5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFsodmFsdWUpXT1cInZhcmlhYmxlTmFtZVwiIFtsYWJlbF09XCInJ1wiIHBsYWNlaG9sZGVyPVwiVmFyaWFibGUgTmFtZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIHNpemU9XCJtZFwiICh2YWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlTmFtZUNoYW5nZSgpXCIgYXJpYS1sYWJlbD1cIlZhcmlhYmxlIE5hbWVcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cCAqbmdJZj1cInZhcmlhYmxlTmFtZUVycm9yXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12YXJpYWJsZS1lcnJvclwiIHJvbGU9XCJhbGVydFwiPnt7IHZhcmlhYmxlTmFtZUVycm9yIH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIFN0ZXAgMzogUmVzcG9uc2UgQm9keSAvIFN0YXR1cyB0YWJzIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50U3RlcCA9PT0gM1wiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcGFuZWwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNiBjcWEtYm94LWJvcmRlciBjcWEtdy1mdWxsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10YWJzLXdyYXBwZXIgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtM1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC10YWJzXCI+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvbiAqbmdGb3I9XCJsZXQgdGFiIG9mIHJlc3BvbnNlVmVyaWZpY2F0aW9uVGFic1wiIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFt0ZXh0XT1cInRhYi5sYWJlbFwiXG4gICAgICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAtdGFiJyArIChhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9PT0gdGFiLnZhbHVlID8gJyBjcWEtYXBpLWVkaXQtc3RlcC10YWItLWFjdGl2ZScgOiAnJylcIlxuICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJzZXRSZXNwb25zZVZlcmlmaWNhdGlvblRhYih0YWIudmFsdWUpXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFJlc3BvbnNlIEJvZHkgdGFiIGNvbnRlbnQ6IHZlcmlmaWNhdGlvbiBncmlkIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9PT0gJ3Jlc3BvbnNlLWJvZHknXCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGVwMy1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWhlYWRlci1yb3cgY3FhLWZsZXggY3FhLWZsZXgtcm93IGNxYS1qdXN0aWZ5LWVuZCBjcWEtaXRlbXMtY2VudGVyIGNxYS1wdC0wIGNxYS1wci0wIGNxYS1wYi0yIGNxYS1wbC0wXCI+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgdGV4dD1cIkFkZCBWZXJpZmljYXRpb25cIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWFkZC1saW5rXCIgKGNsaWNrZWQpPVwiYWRkVmVyaWZpY2F0aW9uUm93KClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZ3JpZCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZ3JpZC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPlMubm88L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5KU09OIFBhdGg8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5WZXJpZmljYXRpb248L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5EYXRhIFR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWxcIj5FeHBlY3RlZCBWYWx1ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tbGFiZWwtLWVtcHR5XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiB2ZXJpZmljYXRpb25Sb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5VmVyaWZpY2F0aW9uXCIgW2Zvcm1Hcm91cF09XCJyb3dcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNub1wiPnt7IGkgKyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt2YWx1ZV09XCJyb3cuZ2V0KCdqc29uUGF0aCcpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgnanNvblBhdGgnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiSnNvbiBQYXRoXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWlucHV0XCIgYXJpYUxhYmVsPVwiSlNPTiBQYXRoXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwicm93XCIgW2NvbmZpZ109XCJ2ZXJpZmljYXRpb25TZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tc2VsZWN0IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cInJvd1wiIFtjb25maWddPVwidmVyaWZpY2F0aW9uRGF0YVR5cGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tc2VsZWN0IGNxYS13LWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblZlcmlmaWNhdGlvbkRhdGFUeXBlQ2hhbmdlKHJvdywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwhLS0gRXhwZWN0ZWQgVmFsdWU6IHRleHQgZm9yIFN0cmluZy9BcnJheS9PYmplY3QsIG51bWJlciBmb3IgTnVtYmVyLCBkcm9wZG93biBmb3IgQm9vbGVhbiAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJyb3cuZ2V0KCdkYXRhVHlwZScpPy52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCAqbmdTd2l0Y2hDYXNlPVwiJ2Jvb2xlYW4nXCIgW2Zvcm1dPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJ2ZXJpZmljYXRpb25FeHBlY3RlZFZhbHVlQm9vbGVhblNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNlbGVjdCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZXhwZWN0ZWQtc2VsZWN0IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCIgW3ZhbHVlXT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgnZXhwZWN0ZWRWYWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJFeHBlY3RlZCBWYWx1ZSAobnVtYmVyKVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1pbnB1dCBjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZXhwZWN0ZWQtbnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiRXhwZWN0ZWQgVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0ICpuZ1N3aXRjaERlZmF1bHQgW3ZhbHVlXT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicm93LmdldCgnZXhwZWN0ZWRWYWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFeHBlY3RlZCBWYWx1ZSBpbiBTdHJpbmdcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1pbnB1dFwiIGFyaWFMYWJlbD1cIkV4cGVjdGVkIFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInUmVtb3ZlIHJvdydcIiAoY2xpY2tlZCk9XCJyZW1vdmVWZXJpZmljYXRpb25Sb3coaSlcIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tZGVsZXRlLWljb25cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC42NjYzIDZWMTIuNjY2N0g1LjMzMzAxVjZIMTAuNjY2M1pNOS42NjYzNCAySDYuMzMzMDFMNS42NjYzNCAyLjY2NjY3SDMuMzMzMDFWNEgxMi42NjYzVjIuNjY2NjdIMTAuMzMzTDkuNjY2MzQgMlpNMTEuOTk5NyA0LjY2NjY3SDMuOTk5NjdWMTIuNjY2N0MzLjk5OTY3IDEzLjQgNC41OTk2NyAxNCA1LjMzMzAxIDE0SDEwLjY2NjNDMTEuMzk5NyAxNCAxMS45OTk3IDEzLjQgMTEuOTk5NyAxMi42NjY3VjQuNjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0Y5QkZCRlwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFN0YXR1cyB0YWIgY29udGVudDogUy5ubywgVmVyaWZpY2F0aW9uIGRyb3Bkb3duLCBFeHBlY3RlZCBWYWx1ZSwgYWRkL3JlbW92ZSByb3dzIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVSZXNwb25zZVZlcmlmaWNhdGlvblRhYiA9PT0gJ3N0YXR1cydcIiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXN0ZXAzLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24taGVhZGVyLXJvdyBjcWEtZmxleCBjcWEtZmxleC1yb3cgY3FhLWp1c3RpZnktZW5kIGNxYS1pdGVtcy1jZW50ZXIgY3FhLXB0LTAgY3FhLXByLTAgY3FhLXBiLTIgY3FhLXBsLTBcIj5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInRleHRcIiB0ZXh0PVwiQWRkIFZlcmlmaWNhdGlvblwiXG4gICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC12ZXJpZmljYXRpb24tYWRkLWxpbmtcIiAoY2xpY2tlZCk9XCJhZGRTdGF0dXNWZXJpZmljYXRpb25Sb3coKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsXCI+Uy5ubzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPlZlcmlmaWNhdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbFwiPkV4cGVjdGVkIFZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWxhYmVsIGNxYS1hcGktZWRpdC1zdGVwLXZlcmlmaWNhdGlvbi1sYWJlbC0tZW1wdHlcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIHN0YXR1c1ZlcmlmaWNhdGlvblJvd3M7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlTdGF0dXNWZXJpZmljYXRpb25cIlxuICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwicm93XCIgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLXNub1wiPnt7IGkgKyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwicm93XCIgW2NvbmZpZ109XCJzdGF0dXNWZXJpZmljYXRpb25TZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1zdGF0dXMtdmVyaWZpY2F0aW9uLXNlbGVjdCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJvdy5nZXQoJ2V4cGVjdGVkVmFsdWUnKT8uc2V0VmFsdWUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiRXhwZWN0ZWQgVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIHNpemU9XCJzbVwiIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIkV4cGVjdGVkIFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIFtjdXN0b21DbGFzc109XCInY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSByb3cnXCIgKGNsaWNrZWQpPVwicmVtb3ZlU3RhdHVzVmVyaWZpY2F0aW9uUm93KGkpXCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtdmVyaWZpY2F0aW9uLWRlbGV0ZS1pY29uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNjY2MyA2VjEyLjY2NjdINS4zMzMwMVY2SDEwLjY2NjNaTTkuNjY2MzQgMkg2LjMzMzAxTDUuNjY2MzQgMi42NjY2N0gzLjMzMzAxVjRIMTIuNjY2M1YyLjY2NjY3SDEwLjMzM0w5LjY2NjM0IDJaTTExLjk5OTcgNC42NjY2N0gzLjk5OTY3VjEyLjY2NjdDMy45OTk2NyAxMy40IDQuNTk5NjcgMTQgNS4zMzMwMSAxNEgxMC42NjYzQzExLjM5OTcgMTQgMTEuOTk5NyAxMy40IDExLjk5OTcgMTIuNjY2N1Y0LjY2NjY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGOUJGQkZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBSZXNwb25zZSBQcmV2aWV3IC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcmVzcG9uc2VcIj5cbiAgICA8aDMgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1yZXNwb25zZS10aXRsZSBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtYm9sZCBjcWEtbGVhZGluZy1bMjBweF0gY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTAgY3FhLW1iLVsxMnB4XSBjcWEtc2hyaW5rLTBcIj5SZXNwb25zZSBQcmV2aWV3PC9oMz5cbiAgICA8cHJlIGNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtcmVzcG9uc2UtY29udGVudFwiPnt7IHJlc3BvbnNlUHJldmlldyB9fTwvcHJlPlxuICA8L2Rpdj5cblxuICA8IS0tIFN0ZXAgYWN0aW9uczogb25lIHJvdywgZnVsbCB3aWR0aC4gU3RlcCAxOiBDYW5jZWwgKyBOZXh0OyBTdGVwIDI6IEJhY2sgKyBOZXh0OyBTdGVwIDM6IEJhY2sgKyBDcmVhdGUgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zXCI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY3VycmVudFN0ZXBcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIjFcIj5cbiAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIHRleHQ9XCJDYW5jZWxcIlxuICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYWN0aW9ucy1idG4tY2FuY2VsXCIgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIk5leHRcIlxuICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYWN0aW9ucy1idG4tbmV4dFwiIChjbGlja2VkKT1cIm9uTmV4dCgpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiMlwiPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgdGV4dD1cIkJhY2tcIlxuICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLWFwaS1lZGl0LXN0ZXAtYWN0aW9ucy1idG4tYmFja1wiIChjbGlja2VkKT1cIm9uQmFjaygpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiTmV4dFwiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1uZXh0XCIgKGNsaWNrZWQpPVwib25OZXh0KClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIzXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiB0ZXh0PVwiQmFja1wiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1iYWNrXCIgKGNsaWNrZWQpPVwib25CYWNrKClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFt0ZXh0XT1cImVkaXRNb2RlID8gJ1VwZGF0ZScgOiAnQ3JlYXRlJ1wiXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtYXBpLWVkaXQtc3RlcC1hY3Rpb25zLWJ0bi1jcmVhdGVcIiAoY2xpY2tlZCk9XCJvbkNyZWF0ZSgpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==