@cqa-lib/cqa-ui 1.1.401 → 1.1.405

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.
@@ -46,6 +46,7 @@ export class StepBuilderConditionComponent {
46
46
  this.environmentOptions = [];
47
47
  this.hasMoreEnvironments = false;
48
48
  this.isLoadingEnvironments = false;
49
+ this.isInsideForLoopStep = false;
49
50
  /** True while parent is creating the step (API in progress); show loader on Create Step button */
50
51
  this.isCreatingStep = false;
51
52
  /** Emit when step is created */
@@ -768,10 +769,10 @@ export class StepBuilderConditionComponent {
768
769
  }
769
770
  }
770
771
  StepBuilderConditionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderConditionComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
771
- StepBuilderConditionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderConditionComponent, selector: "cqa-step-builder-condition", inputs: { operatorOptions: "operatorOptions", conditionTemplates: "conditionTemplates", setConditionTemplateVariables: "setConditionTemplateVariables", setAdvancedSettingsVariables: "setAdvancedSettingsVariables", computeHtmlGrammarFn: "computeHtmlGrammarFn", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames", parameterOptions: "parameterOptions", hasMoreParameters: "hasMoreParameters", isLoadingParameters: "isLoadingParameters", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex", isCreatingStep: "isCreatingStep" }, outputs: { createStep: "createStep", cancelled: "cancelled", loadMoreElements: "loadMoreElements", searchElements: "searchElements", searchElementsByScreenName: "searchElementsByScreenName", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", redirectToParameter: "redirectToParameter", redirectToEnvironment: "redirectToEnvironment" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Create Condition Step\n </h2>\n\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Condition Builder Section -->\n <div class=\"cqa-mb-6\">\n <div class=\"cqa-mb-3\">\n <h3 class=\"cqa-text-sm cqa-text-[12px] cqa-font-semibold cqa-text-gray-900\">\n Condition Builder\n </h3>\n </div>\n\n <!-- Condition Rows -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-mb-3\">\n <ng-container *ngFor=\"let condition of conditionsFormArray.controls; let i = index; trackBy: trackByConditionIndex\">\n <div\n *ngIf=\"isConditionIf(i) || isConditionElseIf(i)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <!-- Condition Row -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Condition Label -->\n <div class=\"cqa-text-[12px] cqa-font-semibold\">\n {{ getConditionLabel(i) }}\n </div>\n\n <!-- Operator Dropdown -->\n <!-- <div class=\"cqa-flex-1 cqa-max-w-[100px] cqa-text-[10px]\">\n <cqa-dynamic-select [form]=\"getConditionFormGroup(i)\" [config]=\"getOperatorConfig(i)\">\n </cqa-dynamic-select>\n </div> -->\n\n <!-- Value Template Dropdown -->\n <div class=\"cqa-flex-1 cqa-min-w-[150px] cqa-text-[10px]\">\n <cqa-dynamic-select [form]=\"getConditionFormGroup(i)\" [config]=\"getValueConfig(i)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Remove Button -->\n <cqa-button\n *ngIf=\"i >= 1\"\n variant=\"text\"\n icon=\"close\"\n iconPosition=\"start\"\n [customClass]=\"'cqa-w-full cqa-flex cqa-items-center cqa-justify-center'\"\n (click)=\"removeCondition(i)\"\n [attr.aria-label]=\"'Remove condition'\">\n </cqa-button>\n <!-- <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-gray-500 hover:cqa-text-gray-700 hover:cqa-bg-gray-100 cqa-transition-colors\"\n (click)=\"removeCondition(i)\" *ngIf=\"i >= 1\"\n [attr.aria-label]=\"'Remove condition'\">\n <mat-icon class=\"cqa-text-lg cqa-text-[24px]\">close</mat-icon>\n </button> -->\n </div>\n\n <!-- Template Variables Section (shown when template is selected) -->\n <div *ngIf=\"getSelectedTemplate(i)\" class=\"cqa-mt-2\">\n <!-- Template Grammar Display -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"getSelectedTemplate(i)?.htmlGrammar || getSelectedTemplate(i)?.naturalText || ''\">\n </div>\n \n </div>\n \n <!-- Template Variables Form Component (includes Description and Metadata) -->\n <cqa-template-variables-form\n style=\"width: 100%;\"\n [templateVariables]=\"getConditionTemplateVariables(i)\"\n [variablesForm]=\"getConditionVariablesForm(i)\"\n [metadata]=\"getConditionFormGroup(i).get('metadata')?.value || ''\"\n [description]=\"getConditionFormGroup(i).get('description')?.value || ''\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n (variableValueChange)=\"onConditionVariableValueChange(i, $event.name, $event.value)\"\n (variableBooleanChange)=\"onConditionVariableBooleanChange(i, $event.name, $event.value)\"\n (metadataChange)=\"getConditionFormGroup(i).get('metadata')?.setValue($event)\"\n (descriptionChange)=\"getConditionFormGroup(i).get('description')?.setValue($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\">\n </cqa-template-variables-form>\n \n <!-- Advanced Settings Variables Form -->\n <div *ngIf=\"getConditionAdvancedSettingsVariables(i).length > 0\" class=\"cqa-mt-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleConditionAdvanced(i)\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"getConditionAdvancedExpanded(i)\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"getConditionAdvancedExpanded(i)\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"getConditionAdvancedSettingsVariables(i)\"\n [advancedVariableForm]=\"getConditionAdvancedVariablesForm(i)\"\n (variableBooleanChange)=\"onConditionAdvancedVariableBooleanChange(i, $event.name, $event.value)\"\n (variableValueChange)=\"onConditionAdvancedVariableValueChange(i, $event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Add Condition Button -->\n <div class=\"cqa-border-2 cqa-border-dashed cqa-border-gray-300 cqa-rounded-lg cqa-p-1 cqa-mt-3\">\n <cqa-button\n variant=\"text\"\n icon=\"add\"\n iconPosition=\"start\"\n [customClass]=\"'cqa-w-full cqa-flex cqa-items-center cqa-justify-center'\"\n [text]=\"'Add Condition'\"\n (clicked)=\"addCondition('CONDITION_ELSE_IF')\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Include ELSE Branch Section -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-6 cqa-p-3 cqa-bg-gray-50 cqa-rounded-lg\">\n <div class=\"cqa-flex cqa-flex-col\">\n <h3 class=\"cqa-text-[14px] cqa-font-semibold cqa-text-gray-900 cqa-mb-1\">\n Include ELSE branch\n </h3>\n <p class=\"cqa-text-[12px] cqa-text-gray-600\">\n Execute alternative steps when condition is not met.\n </p>\n </div>\n <mat-slide-toggle [checked]=\"includeElse\" (change)=\"onIncludeElseChange($event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </div>\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </div>\n</div>", components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i4.TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: ["templateVariables", "variablesForm", "metadata", "description", "elementOptions", "hasMoreElements", "isLoadingElements", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames", "parameterOptions", "hasMoreParameters", "isLoadingParameters", "uploadOptions", "hasMoreUploads", "isLoadingUploads", "environmentOptions", "hasMoreEnvironments", "isLoadingEnvironments", "defaultTestDataProfileId", "defaultTestDataStartIndex", "isEditInDepth", "isDebug", "createElementVisible"], outputs: ["variableValueChange", "variableBooleanChange", "metadataChange", "descriptionChange", "loadMoreElements", "searchElements", "searchElementsByScreenName", "createElement", "searchScreenName", "loadMoreScreenNames", "createScreenNameRequest", "searchParameters", "loadMoreParameters", "searchUploads", "loadMoreUploads", "searchEnvironments", "loadMoreEnvironments", "cancelElementForm", "elementFormVisibilityChange"] }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: ["advancedVariables", "advancedVariableForm"], outputs: ["variableBooleanChange", "variableValueChange"] }, { type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i8.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }], directives: [{ type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
772
+ StepBuilderConditionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderConditionComponent, selector: "cqa-step-builder-condition", inputs: { operatorOptions: "operatorOptions", conditionTemplates: "conditionTemplates", setConditionTemplateVariables: "setConditionTemplateVariables", setAdvancedSettingsVariables: "setAdvancedSettingsVariables", computeHtmlGrammarFn: "computeHtmlGrammarFn", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames", parameterOptions: "parameterOptions", hasMoreParameters: "hasMoreParameters", isLoadingParameters: "isLoadingParameters", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex", defaultTestDataEndIndex: "defaultTestDataEndIndex", isInsideForLoopStep: "isInsideForLoopStep", isCreatingStep: "isCreatingStep" }, outputs: { createStep: "createStep", cancelled: "cancelled", loadMoreElements: "loadMoreElements", searchElements: "searchElements", searchElementsByScreenName: "searchElementsByScreenName", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", redirectToParameter: "redirectToParameter", redirectToEnvironment: "redirectToEnvironment" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Create Condition Step\n </h2>\n\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Condition Builder Section -->\n <div class=\"cqa-mb-6\">\n <div class=\"cqa-mb-3\">\n <h3 class=\"cqa-text-sm cqa-text-[12px] cqa-font-semibold cqa-text-gray-900\">\n Condition Builder\n </h3>\n </div>\n\n <!-- Condition Rows -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-mb-3\">\n <ng-container *ngFor=\"let condition of conditionsFormArray.controls; let i = index; trackBy: trackByConditionIndex\">\n <div\n *ngIf=\"isConditionIf(i) || isConditionElseIf(i)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <!-- Condition Row -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Condition Label -->\n <div class=\"cqa-text-[12px] cqa-font-semibold\">\n {{ getConditionLabel(i) }}\n </div>\n\n <!-- Operator Dropdown -->\n <!-- <div class=\"cqa-flex-1 cqa-max-w-[100px] cqa-text-[10px]\">\n <cqa-dynamic-select [form]=\"getConditionFormGroup(i)\" [config]=\"getOperatorConfig(i)\">\n </cqa-dynamic-select>\n </div> -->\n\n <!-- Value Template Dropdown -->\n <div class=\"cqa-flex-1 cqa-min-w-[150px] cqa-text-[10px]\">\n <cqa-dynamic-select [form]=\"getConditionFormGroup(i)\" [config]=\"getValueConfig(i)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Remove Button -->\n <cqa-button\n *ngIf=\"i >= 1\"\n variant=\"text\"\n icon=\"close\"\n iconPosition=\"start\"\n [customClass]=\"'cqa-w-full cqa-flex cqa-items-center cqa-justify-center'\"\n (click)=\"removeCondition(i)\"\n [attr.aria-label]=\"'Remove condition'\">\n </cqa-button>\n <!-- <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-gray-500 hover:cqa-text-gray-700 hover:cqa-bg-gray-100 cqa-transition-colors\"\n (click)=\"removeCondition(i)\" *ngIf=\"i >= 1\"\n [attr.aria-label]=\"'Remove condition'\">\n <mat-icon class=\"cqa-text-lg cqa-text-[24px]\">close</mat-icon>\n </button> -->\n </div>\n\n <!-- Template Variables Section (shown when template is selected) -->\n <div *ngIf=\"getSelectedTemplate(i)\" class=\"cqa-mt-2\">\n <!-- Template Grammar Display -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"getSelectedTemplate(i)?.htmlGrammar || getSelectedTemplate(i)?.naturalText || ''\">\n </div>\n \n </div>\n \n <!-- Template Variables Form Component (includes Description and Metadata) -->\n <cqa-template-variables-form\n style=\"width: 100%;\"\n [templateVariables]=\"getConditionTemplateVariables(i)\"\n [variablesForm]=\"getConditionVariablesForm(i)\"\n [metadata]=\"getConditionFormGroup(i).get('metadata')?.value || ''\"\n [description]=\"getConditionFormGroup(i).get('description')?.value || ''\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n [defaultTestDataEndIndex]=\"defaultTestDataEndIndex\"\n [isInsideForLoopStep]=\"isInsideForLoopStep\"\n (variableValueChange)=\"onConditionVariableValueChange(i, $event.name, $event.value)\"\n (variableBooleanChange)=\"onConditionVariableBooleanChange(i, $event.name, $event.value)\"\n (metadataChange)=\"getConditionFormGroup(i).get('metadata')?.setValue($event)\"\n (descriptionChange)=\"getConditionFormGroup(i).get('description')?.setValue($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\">\n </cqa-template-variables-form>\n \n <!-- Advanced Settings Variables Form -->\n <div *ngIf=\"getConditionAdvancedSettingsVariables(i).length > 0\" class=\"cqa-mt-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleConditionAdvanced(i)\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"getConditionAdvancedExpanded(i)\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"getConditionAdvancedExpanded(i)\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"getConditionAdvancedSettingsVariables(i)\"\n [advancedVariableForm]=\"getConditionAdvancedVariablesForm(i)\"\n (variableBooleanChange)=\"onConditionAdvancedVariableBooleanChange(i, $event.name, $event.value)\"\n (variableValueChange)=\"onConditionAdvancedVariableValueChange(i, $event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Add Condition Button -->\n <div class=\"cqa-border-2 cqa-border-dashed cqa-border-gray-300 cqa-rounded-lg cqa-p-1 cqa-mt-3\">\n <cqa-button\n variant=\"text\"\n icon=\"add\"\n iconPosition=\"start\"\n [customClass]=\"'cqa-w-full cqa-flex cqa-items-center cqa-justify-center'\"\n [text]=\"'Add Condition'\"\n (clicked)=\"addCondition('CONDITION_ELSE_IF')\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Include ELSE Branch Section -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-6 cqa-p-3 cqa-bg-gray-50 cqa-rounded-lg\">\n <div class=\"cqa-flex cqa-flex-col\">\n <h3 class=\"cqa-text-[14px] cqa-font-semibold cqa-text-gray-900 cqa-mb-1\">\n Include ELSE branch\n </h3>\n <p class=\"cqa-text-[12px] cqa-text-gray-600\">\n Execute alternative steps when condition is not met.\n </p>\n </div>\n <mat-slide-toggle [checked]=\"includeElse\" (change)=\"onIncludeElseChange($event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </div>\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </div>\n</div>", components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i4.TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: ["templateVariables", "variablesForm", "metadata", "description", "elementOptions", "hasMoreElements", "isLoadingElements", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames", "parameterOptions", "hasMoreParameters", "isLoadingParameters", "uploadOptions", "hasMoreUploads", "isLoadingUploads", "environmentOptions", "hasMoreEnvironments", "isLoadingEnvironments", "defaultTestDataProfileId", "defaultTestDataStartIndex", "defaultTestDataEndIndex", "isInsideForLoopStep", "isEditInDepth", "isDebug", "createElementVisible"], outputs: ["variableValueChange", "variableBooleanChange", "metadataChange", "descriptionChange", "loadMoreElements", "searchElements", "searchElementsByScreenName", "createElement", "searchScreenName", "loadMoreScreenNames", "createScreenNameRequest", "searchParameters", "loadMoreParameters", "searchUploads", "loadMoreUploads", "searchEnvironments", "loadMoreEnvironments", "cancelElementForm", "elementFormVisibilityChange"] }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: ["advancedVariables", "advancedVariableForm"], outputs: ["variableBooleanChange", "variableValueChange"] }, { type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i8.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }], directives: [{ type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
772
773
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderConditionComponent, decorators: [{
773
774
  type: Component,
774
- args: [{ selector: 'cqa-step-builder-condition', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Create Condition Step\n </h2>\n\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Condition Builder Section -->\n <div class=\"cqa-mb-6\">\n <div class=\"cqa-mb-3\">\n <h3 class=\"cqa-text-sm cqa-text-[12px] cqa-font-semibold cqa-text-gray-900\">\n Condition Builder\n </h3>\n </div>\n\n <!-- Condition Rows -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-mb-3\">\n <ng-container *ngFor=\"let condition of conditionsFormArray.controls; let i = index; trackBy: trackByConditionIndex\">\n <div\n *ngIf=\"isConditionIf(i) || isConditionElseIf(i)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <!-- Condition Row -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Condition Label -->\n <div class=\"cqa-text-[12px] cqa-font-semibold\">\n {{ getConditionLabel(i) }}\n </div>\n\n <!-- Operator Dropdown -->\n <!-- <div class=\"cqa-flex-1 cqa-max-w-[100px] cqa-text-[10px]\">\n <cqa-dynamic-select [form]=\"getConditionFormGroup(i)\" [config]=\"getOperatorConfig(i)\">\n </cqa-dynamic-select>\n </div> -->\n\n <!-- Value Template Dropdown -->\n <div class=\"cqa-flex-1 cqa-min-w-[150px] cqa-text-[10px]\">\n <cqa-dynamic-select [form]=\"getConditionFormGroup(i)\" [config]=\"getValueConfig(i)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Remove Button -->\n <cqa-button\n *ngIf=\"i >= 1\"\n variant=\"text\"\n icon=\"close\"\n iconPosition=\"start\"\n [customClass]=\"'cqa-w-full cqa-flex cqa-items-center cqa-justify-center'\"\n (click)=\"removeCondition(i)\"\n [attr.aria-label]=\"'Remove condition'\">\n </cqa-button>\n <!-- <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-gray-500 hover:cqa-text-gray-700 hover:cqa-bg-gray-100 cqa-transition-colors\"\n (click)=\"removeCondition(i)\" *ngIf=\"i >= 1\"\n [attr.aria-label]=\"'Remove condition'\">\n <mat-icon class=\"cqa-text-lg cqa-text-[24px]\">close</mat-icon>\n </button> -->\n </div>\n\n <!-- Template Variables Section (shown when template is selected) -->\n <div *ngIf=\"getSelectedTemplate(i)\" class=\"cqa-mt-2\">\n <!-- Template Grammar Display -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"getSelectedTemplate(i)?.htmlGrammar || getSelectedTemplate(i)?.naturalText || ''\">\n </div>\n \n </div>\n \n <!-- Template Variables Form Component (includes Description and Metadata) -->\n <cqa-template-variables-form\n style=\"width: 100%;\"\n [templateVariables]=\"getConditionTemplateVariables(i)\"\n [variablesForm]=\"getConditionVariablesForm(i)\"\n [metadata]=\"getConditionFormGroup(i).get('metadata')?.value || ''\"\n [description]=\"getConditionFormGroup(i).get('description')?.value || ''\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n (variableValueChange)=\"onConditionVariableValueChange(i, $event.name, $event.value)\"\n (variableBooleanChange)=\"onConditionVariableBooleanChange(i, $event.name, $event.value)\"\n (metadataChange)=\"getConditionFormGroup(i).get('metadata')?.setValue($event)\"\n (descriptionChange)=\"getConditionFormGroup(i).get('description')?.setValue($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\">\n </cqa-template-variables-form>\n \n <!-- Advanced Settings Variables Form -->\n <div *ngIf=\"getConditionAdvancedSettingsVariables(i).length > 0\" class=\"cqa-mt-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleConditionAdvanced(i)\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"getConditionAdvancedExpanded(i)\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"getConditionAdvancedExpanded(i)\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"getConditionAdvancedSettingsVariables(i)\"\n [advancedVariableForm]=\"getConditionAdvancedVariablesForm(i)\"\n (variableBooleanChange)=\"onConditionAdvancedVariableBooleanChange(i, $event.name, $event.value)\"\n (variableValueChange)=\"onConditionAdvancedVariableValueChange(i, $event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Add Condition Button -->\n <div class=\"cqa-border-2 cqa-border-dashed cqa-border-gray-300 cqa-rounded-lg cqa-p-1 cqa-mt-3\">\n <cqa-button\n variant=\"text\"\n icon=\"add\"\n iconPosition=\"start\"\n [customClass]=\"'cqa-w-full cqa-flex cqa-items-center cqa-justify-center'\"\n [text]=\"'Add Condition'\"\n (clicked)=\"addCondition('CONDITION_ELSE_IF')\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Include ELSE Branch Section -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-6 cqa-p-3 cqa-bg-gray-50 cqa-rounded-lg\">\n <div class=\"cqa-flex cqa-flex-col\">\n <h3 class=\"cqa-text-[14px] cqa-font-semibold cqa-text-gray-900 cqa-mb-1\">\n Include ELSE branch\n </h3>\n <p class=\"cqa-text-[12px] cqa-text-gray-600\">\n Execute alternative steps when condition is not met.\n </p>\n </div>\n <mat-slide-toggle [checked]=\"includeElse\" (change)=\"onIncludeElseChange($event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </div>\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </div>\n</div>", styles: [] }]
775
+ args: [{ selector: 'cqa-step-builder-condition', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Create Condition Step\n </h2>\n\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Condition Builder Section -->\n <div class=\"cqa-mb-6\">\n <div class=\"cqa-mb-3\">\n <h3 class=\"cqa-text-sm cqa-text-[12px] cqa-font-semibold cqa-text-gray-900\">\n Condition Builder\n </h3>\n </div>\n\n <!-- Condition Rows -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-mb-3\">\n <ng-container *ngFor=\"let condition of conditionsFormArray.controls; let i = index; trackBy: trackByConditionIndex\">\n <div\n *ngIf=\"isConditionIf(i) || isConditionElseIf(i)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <!-- Condition Row -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Condition Label -->\n <div class=\"cqa-text-[12px] cqa-font-semibold\">\n {{ getConditionLabel(i) }}\n </div>\n\n <!-- Operator Dropdown -->\n <!-- <div class=\"cqa-flex-1 cqa-max-w-[100px] cqa-text-[10px]\">\n <cqa-dynamic-select [form]=\"getConditionFormGroup(i)\" [config]=\"getOperatorConfig(i)\">\n </cqa-dynamic-select>\n </div> -->\n\n <!-- Value Template Dropdown -->\n <div class=\"cqa-flex-1 cqa-min-w-[150px] cqa-text-[10px]\">\n <cqa-dynamic-select [form]=\"getConditionFormGroup(i)\" [config]=\"getValueConfig(i)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Remove Button -->\n <cqa-button\n *ngIf=\"i >= 1\"\n variant=\"text\"\n icon=\"close\"\n iconPosition=\"start\"\n [customClass]=\"'cqa-w-full cqa-flex cqa-items-center cqa-justify-center'\"\n (click)=\"removeCondition(i)\"\n [attr.aria-label]=\"'Remove condition'\">\n </cqa-button>\n <!-- <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-gray-500 hover:cqa-text-gray-700 hover:cqa-bg-gray-100 cqa-transition-colors\"\n (click)=\"removeCondition(i)\" *ngIf=\"i >= 1\"\n [attr.aria-label]=\"'Remove condition'\">\n <mat-icon class=\"cqa-text-lg cqa-text-[24px]\">close</mat-icon>\n </button> -->\n </div>\n\n <!-- Template Variables Section (shown when template is selected) -->\n <div *ngIf=\"getSelectedTemplate(i)\" class=\"cqa-mt-2\">\n <!-- Template Grammar Display -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"getSelectedTemplate(i)?.htmlGrammar || getSelectedTemplate(i)?.naturalText || ''\">\n </div>\n \n </div>\n \n <!-- Template Variables Form Component (includes Description and Metadata) -->\n <cqa-template-variables-form\n style=\"width: 100%;\"\n [templateVariables]=\"getConditionTemplateVariables(i)\"\n [variablesForm]=\"getConditionVariablesForm(i)\"\n [metadata]=\"getConditionFormGroup(i).get('metadata')?.value || ''\"\n [description]=\"getConditionFormGroup(i).get('description')?.value || ''\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n [defaultTestDataEndIndex]=\"defaultTestDataEndIndex\"\n [isInsideForLoopStep]=\"isInsideForLoopStep\"\n (variableValueChange)=\"onConditionVariableValueChange(i, $event.name, $event.value)\"\n (variableBooleanChange)=\"onConditionVariableBooleanChange(i, $event.name, $event.value)\"\n (metadataChange)=\"getConditionFormGroup(i).get('metadata')?.setValue($event)\"\n (descriptionChange)=\"getConditionFormGroup(i).get('description')?.setValue($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\">\n </cqa-template-variables-form>\n \n <!-- Advanced Settings Variables Form -->\n <div *ngIf=\"getConditionAdvancedSettingsVariables(i).length > 0\" class=\"cqa-mt-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleConditionAdvanced(i)\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"getConditionAdvancedExpanded(i)\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"getConditionAdvancedExpanded(i)\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"getConditionAdvancedSettingsVariables(i)\"\n [advancedVariableForm]=\"getConditionAdvancedVariablesForm(i)\"\n (variableBooleanChange)=\"onConditionAdvancedVariableBooleanChange(i, $event.name, $event.value)\"\n (variableValueChange)=\"onConditionAdvancedVariableValueChange(i, $event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Add Condition Button -->\n <div class=\"cqa-border-2 cqa-border-dashed cqa-border-gray-300 cqa-rounded-lg cqa-p-1 cqa-mt-3\">\n <cqa-button\n variant=\"text\"\n icon=\"add\"\n iconPosition=\"start\"\n [customClass]=\"'cqa-w-full cqa-flex cqa-items-center cqa-justify-center'\"\n [text]=\"'Add Condition'\"\n (clicked)=\"addCondition('CONDITION_ELSE_IF')\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Include ELSE Branch Section -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-6 cqa-p-3 cqa-bg-gray-50 cqa-rounded-lg\">\n <div class=\"cqa-flex cqa-flex-col\">\n <h3 class=\"cqa-text-[14px] cqa-font-semibold cqa-text-gray-900 cqa-mb-1\">\n Include ELSE branch\n </h3>\n <p class=\"cqa-text-[12px] cqa-text-gray-600\">\n Execute alternative steps when condition is not met.\n </p>\n </div>\n <mat-slide-toggle [checked]=\"includeElse\" (change)=\"onIncludeElseChange($event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </div>\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </div>\n</div>", styles: [] }]
775
776
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { operatorOptions: [{
776
777
  type: Input
777
778
  }], conditionTemplates: [{
@@ -810,6 +811,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
810
811
  type: Input
811
812
  }], defaultTestDataStartIndex: [{
812
813
  type: Input
814
+ }], defaultTestDataEndIndex: [{
815
+ type: Input
816
+ }], isInsideForLoopStep: [{
817
+ type: Input
813
818
  }], isCreatingStep: [{
814
819
  type: Input
815
820
  }], createStep: [{
@@ -843,4 +848,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
843
848
  }], redirectToEnvironment: [{
844
849
  type: Output
845
850
  }] } });
846
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWNvbmRpdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3N0ZXAtYnVpbGRlci9zdGVwLWJ1aWxkZXItY29uZGl0aW9uL3N0ZXAtYnVpbGRlci1jb25kaXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWNvbmRpdGlvbi9zdGVwLWJ1aWxkZXItY29uZGl0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQW9DLHVCQUF1QixFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNySixPQUFPLEVBQUUsU0FBUyxFQUEwQixXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7O0FBbUM1RixNQUFNLE9BQU8sNkJBQTZCO0lBNEZ4QyxZQUFvQixFQUFlLEVBQVUsR0FBc0I7UUFBL0MsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBM0ZuRSxvQ0FBb0M7UUFDM0Isb0JBQWUsR0FBbUI7WUFDekMsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO1lBQ2xFLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTtZQUNsRixFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7WUFDMUUsRUFBRSxFQUFFLEVBQUUs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O2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUdHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUdHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUdHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHSSxVQUFVO3NCQUFuQixNQUFNO2dCQUdHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csMEJBQTBCO3NCQUFuQyxNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEFjdGlvblRlbXBsYXRlIH0gZnJvbSAnLi4vc3RlcC1idWlsZGVyLWFjdGlvbi9zdGVwLWJ1aWxkZXItYWN0aW9uLmNvbXBvbmVudCc7XG5cbi8vIEltcG9ydCBFbGVtZW50IHR5cGUgLSB1c2luZyBhbnkgZm9yIG5vdyBzaW5jZSBFbGVtZW50IGlzIGZyb20gdHMtcG9ydGFsLXVpXG5pbnRlcmZhY2UgRWxlbWVudCB7XG4gIGlkPzogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxvY2F0b3JWYWx1ZT86IHN0cmluZztcbiAgb3RoZXJMb2NhdG9yPzogc3RyaW5nW107XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb25Sb3cge1xuICBmaWVsZDogc3RyaW5nO1xuICBvcGVyYXRvcjogc3RyaW5nO1xuICB2YWx1ZTogQWN0aW9uVGVtcGxhdGU7XG4gIHRlbXBsYXRlVmFyaWFibGVzPzogYW55W107XG4gIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM/OiBhbnlbXTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIG1ldGFkYXRhPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbkZvcm1EYXRhIHtcbiAgY29uZGl0aW9uczogQ29uZGl0aW9uUm93W107XG4gIGluY2x1ZGVFbHNlOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc3RlcC1idWlsZGVyLWNvbmRpdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGVwLWJ1aWxkZXItY29uZGl0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBTdGVwQnVpbGRlckNvbmRpdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgLyoqIE9wdGlvbnMgZm9yIG9wZXJhdG9yIGRyb3Bkb3duICovXG4gIEBJbnB1dCgpIG9wZXJhdG9yT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ2VxdWFscycsIHZhbHVlOiAnZXF1YWxzJywgbmFtZTogJ2VxdWFscycsIGxhYmVsOiAnZXF1YWxzJyB9LFxuICAgIHsgaWQ6ICdub3RfZXF1YWxzJywgdmFsdWU6ICdub3RfZXF1YWxzJywgbmFtZTogJ25vdCBlcXVhbHMnLCBsYWJlbDogJ25vdCBlcXVhbHMnIH0sXG4gICAgeyBpZDogJ2NvbnRhaW5zJywgdmFsdWU6ICdjb250YWlucycsIG5hbWU6ICdjb250YWlucycsIGxhYmVsOiAnY29udGFpbnMnIH0sXG4gICAgeyBpZDogJ25vdF9jb250YWlucycsIHZhbHVlOiAnbm90X2NvbnRhaW5zJywgbmFtZTogJ25vdCBjb250YWlucycsIGxhYmVsOiAnbm90IGNvbnRhaW5zJyB9LFxuICAgIHsgaWQ6ICdncmVhdGVyX3RoYW4nLCB2YWx1ZTogJ2dyZWF0ZXJfdGhhbicsIG5hbWU6ICdncmVhdGVyIHRoYW4nLCBsYWJlbDogJ2dyZWF0ZXIgdGhhbicgfSxcbiAgICB7IGlkOiAnbGVzc190aGFuJywgdmFsdWU6ICdsZXNzX3RoYW4nLCBuYW1lOiAnbGVzcyB0aGFuJywgbGFiZWw6ICdsZXNzIHRoYW4nIH1cbiAgXTtcblxuICAvKiogTGlzdCBvZiBhY3Rpb24gdGVtcGxhdGVzIHRvIGRpc3BsYXkgaW4gdmFsdWUgZHJvcGRvd24gKi9cbiAgQElucHV0KCkgY29uZGl0aW9uVGVtcGxhdGVzOiBBY3Rpb25UZW1wbGF0ZVtdID0gW107XG4gIC8qKiBGdW5jdGlvbiB0byBoYW5kbGUgdmFyaWFibGUgcHJvY2Vzc2luZyBvciBjdXN0b20gbG9naWMuIENhbiBiZSBwYXNzZWQgZnJvbSBwYXJlbnQgY29tcG9uZW50LiAqL1xuICBASW5wdXQoKSBzZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlczogKHZhcmlhYmxlczogQWN0aW9uVGVtcGxhdGUpID0+IGFueSA9ICgpID0+IHsgcmV0dXJuIFtdfTtcbiAgLyoqIEZ1bmN0aW9uIHRvIGhhbmRsZSBhZHZhbmNlZCBzZXR0aW5ncyB2YXJpYWJsZXMuIENhbiBiZSBwYXNzZWQgZnJvbSBwYXJlbnQgY29tcG9uZW50LiAqL1xuICBASW5wdXQoKSBzZXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzOiAodGVtcGxhdGU6IEFjdGlvblRlbXBsYXRlLCB0ZXN0U3RlcD86IGFueSkgPT4gYW55W10gPSAoKSA9PiB7IHJldHVybiBbXX07XG5cbiAgLyoqIENlbnRyYWxpc2VkIEhUTUwgZ3JhbW1hciBjb21wdXRhdGlvbiBmdW5jdGlvbi4gUGFzcyBTdGVwQnVpbGRlclNlcnZpY2UuY29tcHV0ZUh0bWxHcmFtbWFyIGZyb20gdGhlIGhvc3QgYXBwLiAqL1xuICBASW5wdXQoKSBjb21wdXRlSHRtbEdyYW1tYXJGbj86ICh0ZW1wbGF0ZTogYW55LCB2YXJpYWJsZXM6IGFueVtdKSA9PiBzdHJpbmc7XG4gIEBJbnB1dCgpIGVsZW1lbnRPcHRpb25zOiBFbGVtZW50W10gPSBbXTsgLy8gRWxlbWVudCBvYmplY3RzIGZvciBlbGVtZW50IGRyb3Bkb3duXG4gIEBJbnB1dCgpIGhhc01vcmVFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBXaGV0aGVyIG1vcmUgZWxlbWVudHMgYXJlIGF2YWlsYWJsZVxuICBASW5wdXQoKSBpc0xvYWRpbmdFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBMb2FkaW5nIHN0YXRlIGZvciBlbGVtZW50c1xuICAvKiogU2NyZWVuIG5hbWUgb3B0aW9ucyBmb3IgZWxlbWVudCBmb3JtIGF1dG9jb21wbGV0ZSAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIHNjcmVlbk5hbWVPcHRpb25zOiB7IGlkPzogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfVtdID0gW107XG4gIC8qKiBXaGV0aGVyIG1vcmUgc2NyZWVuIG5hbWVzIGFyZSBhdmFpbGFibGUgZm9yIGluZmluaXRlIHNjcm9sbCAqL1xuICBASW5wdXQoKSBoYXNNb3JlU2NyZWVuTmFtZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgc2NyZWVuIG5hbWVzIChzZWFyY2ggb3IgbG9hZCBtb3JlKSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdTY3JlZW5OYW1lczogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLyoqIFBhcmFtZXRlciBmZXRjaGluZyBwcm9wZXJ0aWVzICovXG4gIEBJbnB1dCgpIHBhcmFtZXRlck9wdGlvbnM6IGFueVtdID0gW107IC8vIFRlc3REYXRhW10gLSByYXcgdGVzdCBkYXRhIHByb2ZpbGVzXG4gIEBJbnB1dCgpIGhhc01vcmVQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzTG9hZGluZ1BhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIC8qKiBFbnZpcm9ubWVudCBmZXRjaGluZyBwcm9wZXJ0aWVzICovXG4gIEBJbnB1dCgpIGVudmlyb25tZW50T3B0aW9uczogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGVudmlyb25tZW50OiBzdHJpbmcgfVtdID0gW107XG4gIEBJbnB1dCgpIGhhc01vcmVFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNMb2FkaW5nRW52aXJvbm1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvKiogRGVmYXVsdCB0ZXN0IGRhdGEgcHJvZmlsZSBwcm9wZXJ0aWVzICovXG4gIEBJbnB1dCgpIGRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlcjtcbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleD86IG51bWJlcjtcblxuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgY3JlYXRpbmcgdGhlIHN0ZXAgKEFQSSBpbiBwcm9ncmVzcyk7IHNob3cgbG9hZGVyIG9uIENyZWF0ZSBTdGVwIGJ1dHRvbiAqL1xuICBASW5wdXQoKSBpc0NyZWF0aW5nU3RlcDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBFbWl0IHdoZW4gc3RlcCBpcyBjcmVhdGVkICovXG4gIEBPdXRwdXQoKSBjcmVhdGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxDb25kaXRpb25Gb3JtRGF0YT4oKTtcblxuICAvKiogRW1pdCB3aGVuIGNhbmNlbGxlZCAqL1xuICBAT3V0cHV0KCkgY2FuY2VsbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbG9hZE1vcmVFbGVtZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIGxvYWQgbW9yZSBpcyByZXF1ZXN0ZWRcbiAgQE91dHB1dCgpIHNlYXJjaEVsZW1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciBlbGVtZW50c1xuICBAT3V0cHV0KCkgc2VhcmNoRWxlbWVudHNCeVNjcmVlbk5hbWUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc2NyZWVuTmFtZUlkOiBudW1iZXI7IHNlYXJjaFRlcm0/OiBzdHJpbmcgfT4oKTsgLy8gRW1pdCB3aGVuIHNjcmVlbiBuYW1lIGlzIHNlbGVjdGVkIHRvIGZldGNoIGVsZW1lbnRzIGZpbHRlcmVkIGJ5IHNjcmVlbiBuYW1lXG4gIEBPdXRwdXQoKSBjcmVhdGVFbGVtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7IC8vIEVtaXQgd2hlbiBlbGVtZW50IGlzIGNyZWF0ZWRcbiAgQE91dHB1dCgpIHNlYXJjaFNjcmVlbk5hbWUgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgc2NyZWVuIG5hbWVzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZVNjcmVlbk5hbWVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIHNjcmVlbiBuYW1lc1xuICBAT3V0cHV0KCkgY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgcmVxdWVzdHMgdG8gY3JlYXRlIGEgbmV3IHNjcmVlbiBuYW1lXG4gIEBPdXRwdXQoKSBzZWFyY2hQYXJhbWV0ZXJzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciBwYXJhbWV0ZXJzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZVBhcmFtZXRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIHBhcmFtZXRlcnNcbiAgQE91dHB1dCgpIHNlYXJjaEVudmlyb25tZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgZW52aXJvbm1lbnRzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZUVudmlyb25tZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgZW52aXJvbm1lbnRzXG4gIEBPdXRwdXQoKSByZWRpcmVjdFRvUGFyYW1ldGVyID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVkaXJlY3RUb0Vudmlyb25tZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGNvbmRpdGlvbkZvcm06IEZvcm1Hcm91cDtcbiAgaW5jbHVkZUVsc2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIC8vIENhY2hlIGZvciB2YWx1ZSBjb25maWdzIHRvIGF2b2lkIHJlY3JlYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICBwcml2YXRlIHZhbHVlQ29uZmlnQ2FjaGU6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBcbiAgLy8gQ2FjaGUgZm9yIG9wZXJhdG9yIGNvbmZpZ3MgKHN0YXRpYywgbm8gbmVlZCB0byByZWNyZWF0ZSlcbiAgcHJpdmF0ZSBvcGVyYXRvckNvbmZpZ0NhY2hlOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgfCBudWxsID0gbnVsbDtcbiAgXG4gIC8vIENhY2hlIGZvciB2YWx1ZSBjb25maWdzIHdpdGggb25DaGFuZ2UgaGFuZGxlcnMgcGVyIGluZGV4XG4gIHByaXZhdGUgdmFsdWVDb25maWdzV2l0aEhhbmRsZXJzOiBNYXA8bnVtYmVyLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gVHJhY2sgc2VsZWN0ZWQgdGVtcGxhdGVzIGFuZCB0aGVpciB2YXJpYWJsZXMgZm9yIGVhY2ggY29uZGl0aW9uIHJvd1xuICBwcml2YXRlIHNlbGVjdGVkVGVtcGxhdGVzOiBNYXA8bnVtYmVyLCBBY3Rpb25UZW1wbGF0ZT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXM6IE1hcDxudW1iZXIsIGFueVtdPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBjb25kaXRpb25WYXJpYWJsZXNGb3JtczogTWFwPG51bWJlciwgRm9ybUFycmF5PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBjb25kaXRpb25VcGRhdGVkSHRtbEdyYW1tYXI6IE1hcDxudW1iZXIsIHN0cmluZz4gPSBuZXcgTWFwKCk7IC8vIFVwZGF0ZWQgSFRNTCBncmFtbWFyIHBlciBjb25kaXRpb25cbiAgXG4gIC8vIEFkdmFuY2VkIHNldHRpbmdzIHZhcmlhYmxlcyBwZXIgY29uZGl0aW9uXG4gIHByaXZhdGUgY29uZGl0aW9uQWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogTWFwPG51bWJlciwgYW55W10+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGNvbmRpdGlvbkFkdmFuY2VkVmFyaWFibGVzRm9ybXM6IE1hcDxudW1iZXIsIEZvcm1BcnJheT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgY29uZGl0aW9uQWR2YW5jZWRFeHBhbmRlZDogTWFwPG51bWJlciwgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgY29uZGl0aW9uIGZvcm0gZ3JvdXBzIHRvIGF2b2lkIHJlcGVhdGVkIGxvb2t1cHNcbiAgcHJpdmF0ZSBjb25kaXRpb25Gb3JtR3JvdXBDYWNoZTogTWFwPG51bWJlciwgRm9ybUdyb3VwPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgdGhpcy5jb25kaXRpb25Gb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBjb25kaXRpb25zOiB0aGlzLmZiLmFycmF5KFtdKSxcbiAgICAgIGluY2x1ZGVFbHNlOiBbZmFsc2VdXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBBZGQgaW5pdGlhbCBjb25kaXRpb24gcm93XG4gICAgdGhpcy5hZGRDb25kaXRpb24oXCJDT05ESVRJT05fSUZcIik7XG4gICAgLy8gSW5pdGlhbGl6ZSBjb25maWcgY2FjaGVzXG4gICAgdGhpcy51cGRhdGVWYWx1ZUNvbmZpZ0NhY2hlKCk7XG4gICAgdGhpcy51cGRhdGVPcGVyYXRvckNvbmZpZ0NhY2hlKCk7XG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gUmVnZW5lcmF0ZSB2YWx1ZSBjb25maWcgY2FjaGUgd2hlbiBjb25kaXRpb25UZW1wbGF0ZXMgY2hhbmdlc1xuICAgIGlmIChjaGFuZ2VzWydjb25kaXRpb25UZW1wbGF0ZXMnXSAmJiAhY2hhbmdlc1snY29uZGl0aW9uVGVtcGxhdGVzJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMudXBkYXRlVmFsdWVDb25maWdDYWNoZSgpO1xuICAgICAgLy8gQ2xlYXIgdmFsdWUgY29uZmlncyB3aXRoIGhhbmRsZXJzIHNpbmNlIGJhc2UgY29uZmlnIGNoYW5nZWRcbiAgICAgIHRoaXMudmFsdWVDb25maWdzV2l0aEhhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxuICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIFxuICBwcml2YXRlIHVwZGF0ZU9wZXJhdG9yQ29uZmlnQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVyYXRvckNvbmZpZ0NhY2hlID0ge1xuICAgICAga2V5OiAnb3BlcmF0b3InLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3Qgb3BlcmF0b3InLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiB0aGlzLm9wZXJhdG9yT3B0aW9uc1xuICAgIH07XG4gIH1cblxuICBnZXQgY29uZGl0aW9uc0Zvcm1BcnJheSgpOiBGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbkZvcm0uZ2V0KCdjb25kaXRpb25zJykgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgYWRkQ29uZGl0aW9uKGNvbmRpdGlvblR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvbmRpdGlvbkdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBmaWVsZDogW2NvbmRpdGlvblR5cGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgb3BlcmF0b3I6IFsnZXF1YWxzJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICB2YWx1ZTogW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLCAvLyBXaWxsIHN0b3JlIHRlbXBsYXRlIElELCB0aGVuIG1hcCB0byBBY3Rpb25UZW1wbGF0ZVxuICAgICAgZGVzY3JpcHRpb246IFsnJ10sXG4gICAgICBtZXRhZGF0YTogWycnXSxcbiAgICB9KTtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuY29uZGl0aW9uc0Zvcm1BcnJheS5sZW5ndGg7XG4gICAgdGhpcy5jb25kaXRpb25zRm9ybUFycmF5LnB1c2goY29uZGl0aW9uR3JvdXApO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgdmFyaWFibGVzIGZvcm0gZm9yIHRoaXMgY29uZGl0aW9uIChGb3JtQXJyYXkpXG4gICAgdGhpcy5jb25kaXRpb25WYXJpYWJsZXNGb3Jtcy5zZXQoaW5kZXgsIHRoaXMuZmIuYXJyYXkoW10pKTtcbiAgICBcbiAgICAvLyBDYWNoZSB0aGUgZm9ybSBncm91cFxuICAgIHRoaXMuY29uZGl0aW9uRm9ybUdyb3VwQ2FjaGUuc2V0KGluZGV4LCBjb25kaXRpb25Hcm91cCk7XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZW1vdmVDb25kaXRpb24oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmRpdGlvbnNGb3JtQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5jb25kaXRpb25zRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgICAgIC8vIENsZWFuIHVwIGFzc29jaWF0ZWQgZGF0YVxuICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlcy5kZWxldGUoaW5kZXgpO1xuICAgICAgdGhpcy5jb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcy5kZWxldGUoaW5kZXgpO1xuICAgICAgdGhpcy5jb25kaXRpb25WYXJpYWJsZXNGb3Jtcy5kZWxldGUoaW5kZXgpO1xuICAgICAgdGhpcy5jb25kaXRpb25Gb3JtR3JvdXBDYWNoZS5kZWxldGUoaW5kZXgpO1xuICAgICAgdGhpcy52YWx1ZUNvbmZpZ3NXaXRoSGFuZGxlcnMuZGVsZXRlKGluZGV4KTtcbiAgICAgIFxuICAgICAgLy8gUmVpbmRleCByZW1haW5pbmcgY29uZGl0aW9uc1xuICAgICAgdGhpcy5yZWluZGV4Q29uZGl0aW9uRGF0YShpbmRleCk7XG4gICAgICBcbiAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIHJlaW5kZXhDb25kaXRpb25EYXRhKHJlbW92ZWRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIG5ldyBtYXBzIHdpdGggcmVpbmRleGVkIGRhdGFcbiAgICBjb25zdCBuZXdTZWxlY3RlZFRlbXBsYXRlcyA9IG5ldyBNYXA8bnVtYmVyLCBBY3Rpb25UZW1wbGF0ZT4oKTtcbiAgICBjb25zdCBuZXdUZW1wbGF0ZVZhcmlhYmxlcyA9IG5ldyBNYXA8bnVtYmVyLCBhbnlbXT4oKTtcbiAgICBjb25zdCBuZXdWYXJpYWJsZXNGb3JtcyA9IG5ldyBNYXA8bnVtYmVyLCBGb3JtQXJyYXk+KCk7XG4gICAgY29uc3QgbmV3Rm9ybUdyb3VwQ2FjaGUgPSBuZXcgTWFwPG51bWJlciwgRm9ybUdyb3VwPigpO1xuICAgIGNvbnN0IG5ld1ZhbHVlQ29uZmlncyA9IG5ldyBNYXA8bnVtYmVyLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+KCk7XG4gICAgY29uc3QgbmV3VXBkYXRlZEh0bWxHcmFtbWFyID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcbiAgICBjb25zdCBuZXdBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gbmV3IE1hcDxudW1iZXIsIGFueVtdPigpO1xuICAgIGNvbnN0IG5ld0FkdmFuY2VkVmFyaWFibGVzRm9ybXMgPSBuZXcgTWFwPG51bWJlciwgRm9ybUFycmF5PigpO1xuICAgIGNvbnN0IG5ld0FkdmFuY2VkRXhwYW5kZWQgPSBuZXcgTWFwPG51bWJlciwgYm9vbGVhbj4oKTtcbiAgICBcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGVzLmZvckVhY2goKHRlbXBsYXRlLCBvbGRJbmRleCkgPT4ge1xuICAgICAgaWYgKG9sZEluZGV4IDwgcmVtb3ZlZEluZGV4KSB7XG4gICAgICAgIG5ld1NlbGVjdGVkVGVtcGxhdGVzLnNldChvbGRJbmRleCwgdGVtcGxhdGUpO1xuICAgICAgfSBlbHNlIGlmIChvbGRJbmRleCA+IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdTZWxlY3RlZFRlbXBsYXRlcy5zZXQob2xkSW5kZXggLSAxLCB0ZW1wbGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy5jb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZXMsIG9sZEluZGV4KSA9PiB7XG4gICAgICBpZiAob2xkSW5kZXggPCByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3VGVtcGxhdGVWYXJpYWJsZXMuc2V0KG9sZEluZGV4LCB2YXJpYWJsZXMpO1xuICAgICAgfSBlbHNlIGlmIChvbGRJbmRleCA+IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdUZW1wbGF0ZVZhcmlhYmxlcy5zZXQob2xkSW5kZXggLSAxLCB2YXJpYWJsZXMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuY29uZGl0aW9uVmFyaWFibGVzRm9ybXMuZm9yRWFjaCgoZm9ybSwgb2xkSW5kZXgpID0+IHtcbiAgICAgIGlmIChvbGRJbmRleCA8IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdWYXJpYWJsZXNGb3Jtcy5zZXQob2xkSW5kZXgsIGZvcm0pO1xuICAgICAgfSBlbHNlIGlmIChvbGRJbmRleCA+IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdWYXJpYWJsZXNGb3Jtcy5zZXQob2xkSW5kZXggLSAxLCBmb3JtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLmNvbmRpdGlvbkZvcm1Hcm91cENhY2hlLmZvckVhY2goKGZvcm1Hcm91cCwgb2xkSW5kZXgpID0+IHtcbiAgICAgIGlmIChvbGRJbmRleCA8IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdGb3JtR3JvdXBDYWNoZS5zZXQob2xkSW5kZXgsIGZvcm1Hcm91cCk7XG4gICAgICB9IGVsc2UgaWYgKG9sZEluZGV4ID4gcmVtb3ZlZEluZGV4KSB7XG4gICAgICAgIG5ld0Zvcm1Hcm91cENhY2hlLnNldChvbGRJbmRleCAtIDEsIGZvcm1Hcm91cCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy52YWx1ZUNvbmZpZ3NXaXRoSGFuZGxlcnMuZm9yRWFjaCgoY29uZmlnLCBvbGRJbmRleCkgPT4ge1xuICAgICAgaWYgKG9sZEluZGV4IDwgcmVtb3ZlZEluZGV4KSB7XG4gICAgICAgIG5ld1ZhbHVlQ29uZmlncy5zZXQob2xkSW5kZXgsIGNvbmZpZyk7XG4gICAgICB9IGVsc2UgaWYgKG9sZEluZGV4ID4gcmVtb3ZlZEluZGV4KSB7XG4gICAgICAgIC8vIFJlY3JlYXRlIGNvbmZpZyB3aXRoIG5ldyBpbmRleCBmb3Igb25DaGFuZ2UgaGFuZGxlclxuICAgICAgICBjb25zdCBuZXdDb25maWcgPSB7XG4gICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblRlbXBsYXRlVmFsdWVDaGFuZ2Uob2xkSW5kZXggLSAxLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBuZXdWYWx1ZUNvbmZpZ3Muc2V0KG9sZEluZGV4IC0gMSwgbmV3Q29uZmlnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLmNvbmRpdGlvblVwZGF0ZWRIdG1sR3JhbW1hci5mb3JFYWNoKChncmFtbWFyLCBvbGRJbmRleCkgPT4ge1xuICAgICAgaWYgKG9sZEluZGV4IDwgcmVtb3ZlZEluZGV4KSB7XG4gICAgICAgIG5ld1VwZGF0ZWRIdG1sR3JhbW1hci5zZXQob2xkSW5kZXgsIGdyYW1tYXIpO1xuICAgICAgfSBlbHNlIGlmIChvbGRJbmRleCA+IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdVcGRhdGVkSHRtbEdyYW1tYXIuc2V0KG9sZEluZGV4IC0gMSwgZ3JhbW1hcik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy5jb25kaXRpb25BZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlcywgb2xkSW5kZXgpID0+IHtcbiAgICAgIGlmIChvbGRJbmRleCA8IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLnNldChvbGRJbmRleCwgdmFyaWFibGVzKTtcbiAgICAgIH0gZWxzZSBpZiAob2xkSW5kZXggPiByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5zZXQob2xkSW5kZXggLSAxLCB2YXJpYWJsZXMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuY29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZXNGb3Jtcy5mb3JFYWNoKChmb3JtLCBvbGRJbmRleCkgPT4ge1xuICAgICAgaWYgKG9sZEluZGV4IDwgcmVtb3ZlZEluZGV4KSB7XG4gICAgICAgIG5ld0FkdmFuY2VkVmFyaWFibGVzRm9ybXMuc2V0KG9sZEluZGV4LCBmb3JtKTtcbiAgICAgIH0gZWxzZSBpZiAob2xkSW5kZXggPiByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3QWR2YW5jZWRWYXJpYWJsZXNGb3Jtcy5zZXQob2xkSW5kZXggLSAxLCBmb3JtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLmNvbmRpdGlvbkFkdmFuY2VkRXhwYW5kZWQuZm9yRWFjaCgoZXhwYW5kZWQsIG9sZEluZGV4KSA9PiB7XG4gICAgICBpZiAob2xkSW5kZXggPCByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3QWR2YW5jZWRFeHBhbmRlZC5zZXQob2xkSW5kZXgsIGV4cGFuZGVkKTtcbiAgICAgIH0gZWxzZSBpZiAob2xkSW5kZXggPiByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3QWR2YW5jZWRFeHBhbmRlZC5zZXQob2xkSW5kZXggLSAxLCBleHBhbmRlZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlcyA9IG5ld1NlbGVjdGVkVGVtcGxhdGVzO1xuICAgIHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMgPSBuZXdUZW1wbGF0ZVZhcmlhYmxlcztcbiAgICB0aGlzLmNvbmRpdGlvblZhcmlhYmxlc0Zvcm1zID0gbmV3VmFyaWFibGVzRm9ybXM7XG4gICAgdGhpcy5jb25kaXRpb25Gb3JtR3JvdXBDYWNoZSA9IG5ld0Zvcm1Hcm91cENhY2hlO1xuICAgIHRoaXMudmFsdWVDb25maWdzV2l0aEhhbmRsZXJzID0gbmV3VmFsdWVDb25maWdzO1xuICAgIHRoaXMuY29uZGl0aW9uVXBkYXRlZEh0bWxHcmFtbWFyID0gbmV3VXBkYXRlZEh0bWxHcmFtbWFyO1xuICAgIHRoaXMuY29uZGl0aW9uQWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyA9IG5ld0FkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM7XG4gICAgdGhpcy5jb25kaXRpb25BZHZhbmNlZFZhcmlhYmxlc0Zvcm1zID0gbmV3QWR2YW5jZWRWYXJpYWJsZXNGb3JtcztcbiAgICB0aGlzLmNvbmRpdGlvbkFkdmFuY2VkRXhwYW5kZWQgPSBuZXdBZHZhbmNlZEV4cGFuZGVkO1xuICB9XG5cbiAgZ2V0T3BlcmF0b3JDb25maWcoaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCBjb25maWcgKHN0YXRpYywgc2FtZSBmb3IgYWxsIGNvbmRpdGlvbnMpXG4gICAgaWYgKCF0aGlzLm9wZXJhdG9yQ29uZmlnQ2FjaGUpIHtcbiAgICAgIHRoaXMudXBkYXRlT3BlcmF0b3JDb25maWdDYWNoZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvckNvbmZpZ0NhY2hlITtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVmFsdWVDb25maWdDYWNoZSgpOiB2b2lkIHtcbiAgICAvLyBDb252ZXJ0IEFjdGlvblRlbXBsYXRlW10gdG8gU2VsZWN0T3B0aW9uW11cbiAgICBjb25zdCB0ZW1wbGF0ZU9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gKHRoaXMuY29uZGl0aW9uVGVtcGxhdGVzIHx8IFtdKS5tYXAodGVtcGxhdGUgPT4gKHtcbiAgICAgIGlkOiB0ZW1wbGF0ZS5pZD8udG9TdHJpbmcoKSB8fCB0ZW1wbGF0ZS5kaXNwbGF5TmFtZSB8fCAnJyxcbiAgICAgIHZhbHVlOiB0ZW1wbGF0ZS5pZD8udG9TdHJpbmcoKSB8fCB0ZW1wbGF0ZS5kaXNwbGF5TmFtZSB8fCAnJyxcbiAgICAgIG5hbWU6IHRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8IHRlbXBsYXRlLm5hdHVyYWxUZXh0IHx8ICcnLFxuICAgICAgbGFiZWw6IHRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8IHRlbXBsYXRlLm5hdHVyYWxUZXh0IHx8ICcnXG4gICAgfSkpO1xuXG4gICAgdGhpcy52YWx1ZUNvbmZpZ0NhY2hlID0ge1xuICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgVGVtcGxhdGUqJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBkaXNwbGF5TGFiZWxBc0lubmVySHRtbDogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IHRlbXBsYXRlT3B0aW9uc1xuICAgIH07XG4gIH1cblxuICBnZXRWYWx1ZUNvbmZpZyhpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIGNvbmZpZyB3aXRoIGhhbmRsZXIgdG8gYXZvaWQgcmVjcmVhdGluZyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgaWYgKHRoaXMudmFsdWVDb25maWdzV2l0aEhhbmRsZXJzLmhhcyhpbmRleCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlQ29uZmlnc1dpdGhIYW5kbGVycy5nZXQoaW5kZXgpITtcbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIGJhc2UgY29uZmlnIGNhY2hlIGV4aXN0c1xuICAgIGlmICghdGhpcy52YWx1ZUNvbmZpZ0NhY2hlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlQ29uZmlnQ2FjaGUoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIGFuZCBjYWNoZSBjb25maWcgd2l0aCBvbkNoYW5nZSBoYW5kbGVyIGZvciB0aGlzIHNwZWNpZmljIGluZGV4XG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICAuLi50aGlzLnZhbHVlQ29uZmlnQ2FjaGUhLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25UZW1wbGF0ZVZhbHVlQ2hhbmdlKGluZGV4LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnZhbHVlQ29uZmlnc1dpdGhIYW5kbGVycy5zZXQoaW5kZXgsIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBcbiAgb25UZW1wbGF0ZVZhbHVlQ2hhbmdlKGluZGV4OiBudW1iZXIsIHRlbXBsYXRlSWQ6IGFueSk6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIHNlbGVjdGVkIHRlbXBsYXRlXG4gICAgY29uc3Qgc2VsZWN0ZWRUZW1wbGF0ZSA9IHRoaXMuY29uZGl0aW9uVGVtcGxhdGVzLmZpbmQoXG4gICAgICB0ID0+ICh0LmlkPy50b1N0cmluZygpID09PSB0ZW1wbGF0ZUlkKSB8fCAodC5kaXNwbGF5TmFtZSA9PT0gdGVtcGxhdGVJZClcbiAgICApO1xuICAgIFxuICAgIGlmIChzZWxlY3RlZFRlbXBsYXRlICYmIHRoaXMuc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMpIHtcbiAgICAgIC8vIFN0b3JlIHNlbGVjdGVkIHRlbXBsYXRlXG4gICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGVzLnNldChpbmRleCwgc2VsZWN0ZWRUZW1wbGF0ZSk7XG4gICAgICBcbiAgICAgIC8vIEdldCB0ZW1wbGF0ZSB2YXJpYWJsZXMgdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gICAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKHNlbGVjdGVkVGVtcGxhdGUpO1xuICAgICAgdGhpcy5jb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcy5zZXQoaW5kZXgsIHZhcmlhYmxlcyk7XG4gICAgICAvLyBCdWlsZCBmb3JtIGZvciB0ZW1wbGF0ZSB2YXJpYWJsZXNcbiAgICAgIHRoaXMuYnVpbGRDb25kaXRpb25WYXJpYWJsZXNGb3JtKGluZGV4LCB2YXJpYWJsZXMpO1xuICAgICAgLy8gSW5pdGlhbGl6ZSB1cGRhdGVkIEhUTUwgZ3JhbW1hclxuICAgICAgdGhpcy51cGRhdGVDb25kaXRpb25IdG1sR3JhbW1hcihpbmRleCk7XG4gICAgICBcbiAgICAgIC8vIEluaXRpYWxpemUgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzXG4gICAgICBpZiAodGhpcy5zZXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzKSB7XG4gICAgICAgIGNvbnN0IGFkdmFuY2VkVmFyaWFibGVzID0gdGhpcy5zZXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzKHNlbGVjdGVkVGVtcGxhdGUpO1xuICAgICAgICB0aGlzLmNvbmRpdGlvbkFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuc2V0KGluZGV4LCBhZHZhbmNlZFZhcmlhYmxlcyk7XG4gICAgICAgIHRoaXMuYnVpbGRDb25kaXRpb25BZHZhbmNlZFZhcmlhYmxlc0Zvcm0oaW5kZXgsIGFkdmFuY2VkVmFyaWFibGVzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2xlYXIgdGVtcGxhdGUgYW5kIHZhcmlhYmxlcyBpZiBubyB0ZW1wbGF0ZSBzZWxlY3RlZFxuICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlcy5kZWxldGUoaW5kZXgpO1xuICAgICAgdGhpcy5jb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcy5kZWxldGUoaW5kZXgpO1xuICAgICAgdGhpcy5jb25kaXRpb25VcGRhdGVkSHRtbEdyYW1tYXIuZGVsZXRlKGluZGV4KTtcbiAgICAgIHRoaXMuY29uZGl0aW9uQWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5kZWxldGUoaW5kZXgpO1xuICAgICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5jb25kaXRpb25WYXJpYWJsZXNGb3Jtcy5nZXQoaW5kZXgpO1xuICAgICAgaWYgKGZvcm1BcnJheSkge1xuICAgICAgICB3aGlsZSAoZm9ybUFycmF5Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgIGZvcm1BcnJheS5yZW1vdmVBdCgwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgYWR2YW5jZWRGb3JtQXJyYXkgPSB0aGlzLmNvbmRpdGlvbkFkdmFuY2VkVmFyaWFibGVzRm9ybXMuZ2V0KGluZGV4KTtcbiAgICAgIGlmIChhZHZhbmNlZEZvcm1BcnJheSkge1xuICAgICAgICB3aGlsZSAoYWR2YW5jZWRGb3JtQXJyYXkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgYWR2YW5jZWRGb3JtQXJyYXkucmVtb3ZlQXQoMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgXG4gIHByaXZhdGUgYnVpbGRDb25kaXRpb25WYXJpYWJsZXNGb3JtKGluZGV4OiBudW1iZXIsIHZhcmlhYmxlczogYW55W10pOiB2b2lkIHtcbiAgICBsZXQgZm9ybUFycmF5ID0gdGhpcy5jb25kaXRpb25WYXJpYWJsZXNGb3Jtcy5nZXQoaW5kZXgpO1xuICAgIGlmICghZm9ybUFycmF5KSB7XG4gICAgICBmb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KFtdKTtcbiAgICAgIHRoaXMuY29uZGl0aW9uVmFyaWFibGVzRm9ybXMuc2V0KGluZGV4LCBmb3JtQXJyYXkpO1xuICAgIH1cbiAgICBcbiAgICAvLyBFbnN1cmUgZm9ybUFycmF5IGlzIG5vdCB1bmRlZmluZWQgKFR5cGVTY3JpcHQgZ3VhcmQpXG4gICAgaWYgKCFmb3JtQXJyYXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gU3RvcmUgcmVmZXJlbmNlIHRvIGF2b2lkIFR5cGVTY3JpcHQgaXNzdWVzIGluIGZvckVhY2ggY2FsbGJhY2tcbiAgICAvLyBUeXBlU2NyaXB0IGtub3dzIGZvcm1BcnJheSBpcyBkZWZpbmVkIGhlcmUgZHVlIHRvIHRoZSBlYXJseSByZXR1cm4gYWJvdmVcbiAgICBjb25zdCBmb3JtQXJyYXlSZWY6IEZvcm1BcnJheSA9IGZvcm1BcnJheTtcbiAgICBcbiAgICAvLyBDbGVhciBleGlzdGluZyBmb3JtIGFycmF5XG4gICAgd2hpbGUgKGZvcm1BcnJheVJlZi5sZW5ndGggIT09IDApIHtcbiAgICAgIGZvcm1BcnJheVJlZi5yZW1vdmVBdCgwKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQWRkIGZvcm0gZ3JvdXBzIGZvciBlYWNoIHZhcmlhYmxlXG4gICAgdmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gdmFyaWFibGVzIC0gdXNlIGJvb2xlYW4gdmFsdWUsIG90aGVycyB1c2Ugc3RyaW5nXG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbicgXG4gICAgICAgID8gKHZhcmlhYmxlLnZhbHVlID09PSB0cnVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAndHJ1ZScgfHwgdmFyaWFibGUudmFsdWUgPT09IDEpXG4gICAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIGEgRm9ybUdyb3VwIGZvciBlYWNoIHZhcmlhYmxlIHdpdGggbmFtZSBhbmQgdmFsdWVcbiAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmFtZTogW3ZhcmlhYmxlLm5hbWVdLFxuICAgICAgICB2YWx1ZTogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICAgIHR5cGU6IFt2YXJpYWJsZS50eXBlIHx8ICdzdHJpbmcnXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZS5sYWJlbCB8fCAnJ10sXG4gICAgICAgIG9wdGlvbnM6IFt2YXJpYWJsZS5vcHRpb25zIHx8IFtdXVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIEFkZCBkYXRhVHlwZSBjb250cm9sIGZvciB0ZXN0LWRhdGEgdmFyaWFibGVzIGlmIG5lZWRlZFxuICAgICAgY29uc3QgbGFiZWwgPSB2YXJpYWJsZS5sYWJlbD8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIGlmIChsYWJlbCA9PT0gJ3Rlc3QtZGF0YScgfHwgbGFiZWwgPT09ICdzb3VyY2UtdmFsdWUnIHx8IGxhYmVsID09PSAndGFyZ2V0LXZhbHVlJyB8fCBcbiAgICAgICAgICBsYWJlbCA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgbGFiZWwgPT09ICd0YXJnZXRfdmFsdWUnKSB7XG4gICAgICAgIC8vIFBhcnNlIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgZGF0YSB0eXBlXG4gICAgICAgIGNvbnN0IHZhbHVlU3RyID0gU3RyaW5nKGRlZmF1bHRWYWx1ZSB8fCAnJyk7XG4gICAgICAgIGxldCBkYXRhVHlwZSA9ICdwbGFpbi10ZXh0JztcbiAgICAgICAgaWYgKHZhbHVlU3RyLnN0YXJ0c1dpdGgoJ0B8JykgJiYgdmFsdWVTdHIuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgICAgIGRhdGFUeXBlID0gJ3BhcmFtZXRlcic7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVTdHIuc3RhcnRzV2l0aCgnJHwnKSAmJiB2YWx1ZVN0ci5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICAgICAgZGF0YVR5cGUgPSAncnVudGltZSc7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVTdHIuc3RhcnRzV2l0aCgnKnwnKSAmJiB2YWx1ZVN0ci5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICAgICAgZGF0YVR5cGUgPSAnZW52aXJvbm1lbnQnO1xuICAgICAgICB9XG4gICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnZGF0YVR5cGUnLCBuZXcgRm9ybUNvbnRyb2woZGF0YVR5cGUpKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgZm9ybUFycmF5UmVmLnB1c2godmFyaWFibGVHcm91cCk7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSB1cGRhdGVkIEhUTUwgZ3JhbW1hciBmb3IgdGhpcyBjb25kaXRpb25cbiAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvbkh0bWxHcmFtbWFyKGluZGV4KTtcbiAgfVxuICBcbiAgZ2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMoaW5kZXg6IG51bWJlcik6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcy5nZXQoaW5kZXgpIHx8IFtdO1xuICB9XG4gIFxuICBnZXRDb25kaXRpb25WYXJpYWJsZXNGb3JtKGluZGV4OiBudW1iZXIpOiBGb3JtQXJyYXkge1xuICAgIGxldCBmb3JtQXJyYXkgPSB0aGlzLmNvbmRpdGlvblZhcmlhYmxlc0Zvcm1zLmdldChpbmRleCk7XG4gICAgaWYgKCFmb3JtQXJyYXkpIHtcbiAgICAgIGZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoW10pO1xuICAgICAgdGhpcy5jb25kaXRpb25WYXJpYWJsZXNGb3Jtcy5zZXQoaW5kZXgsIGZvcm1BcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtQXJyYXk7XG4gIH1cbiAgXG4gIGdldENvbmRpdGlvbkZvcm1Hcm91cEF0KGluZGV4OiBudW1iZXIsIHZhcmlhYmxlSW5kZXg6IG51bWJlcik6IEZvcm1Hcm91cCB7XG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5nZXRDb25kaXRpb25WYXJpYWJsZXNGb3JtKGluZGV4KTtcbiAgICByZXR1cm4gZm9ybUFycmF5LmF0KHZhcmlhYmxlSW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgfVxuICBcbiAgZ2V0Q29uZGl0aW9uVXBkYXRlZEh0bWxHcmFtbWFyKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlcy5nZXQoaW5kZXgpO1xuICAgIGlmICghdGVtcGxhdGUpIHJldHVybiAnJztcbiAgICByZXR1cm4gdGhpcy5jb25kaXRpb25VcGRhdGVkSHRtbEdyYW1tYXIuZ2V0KGluZGV4KSB8fCB0ZW1wbGF0ZS5odG1sR3JhbW1hciB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJztcbiAgfVxuICBcbiAgZ2V0U2VsZWN0ZWRUZW1wbGF0ZShpbmRleDogbnVtYmVyKTogQWN0aW9uVGVtcGxhdGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRlbXBsYXRlcy5nZXQoaW5kZXgpIHx8IG51bGw7XG4gIH1cbiAgXG4gIGdldFNlbGVjdENvbmZpZ0ZvclZhcmlhYmxlKGluZGV4OiBudW1iZXIsIHZhcmlhYmxlOiBhbnkpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gKHZhcmlhYmxlLm9wdGlvbnMgfHwgW10pLm1hcCgob3B0OiBzdHJpbmcpID0+ICh7XG4gICAgICBpZDogb3B0LFxuICAgICAgdmFsdWU6IG9wdCxcbiAgICAgIG5hbWU6IG9wdCxcbiAgICAgIGxhYmVsOiBvcHRcbiAgICB9KSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAga2V5OiB2YXJpYWJsZS5uYW1lLFxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25Db25kaXRpb25WYXJpYWJsZVZhbHVlQ2hhbmdlKGluZGV4LCB2YXJpYWJsZS5uYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBcbiAgb25Db25kaXRpb25WYXJpYWJsZVZhbHVlQ2hhbmdlKGNvbmRpdGlvbkluZGV4OiBudW1iZXIsIHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMuZ2V0KGNvbmRpdGlvbkluZGV4KSB8fCBbXTtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBhcnJheVxuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuY29uZGl0aW9uVmFyaWFibGVzRm9ybXMuZ2V0KGNvbmRpdGlvbkluZGV4KTtcbiAgICBpZiAoZm9ybUFycmF5KSB7XG4gICAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gZm9ybUFycmF5LmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgICApO1xuICAgICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGZvcm1BcnJheS5hdCh2YXJpYWJsZUluZGV4KS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFVwZGF0ZSBIVE1MIGdyYW1tYXIgZm9yIHRoaXMgY29uZGl0aW9uXG4gICAgdGhpcy51cGRhdGVDb25kaXRpb25IdG1sR3JhbW1hcihjb25kaXRpb25JbmRleCk7XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgXG4gIG9uQ29uZGl0aW9uVmFyaWFibGVJbnB1dENoYW5nZShjb25kaXRpb25JbmRleDogbnVtYmVyLCB2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgdmFyaWFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmNvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzLmdldChjb25kaXRpb25JbmRleCkgfHwgW107XG4gICAgY29uc3QgdmFyaWFibGUgPSB2YXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gY29udHJvbFxuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmNvbmRpdGlvblZhcmlhYmxlc0Zvcm1zLmdldChjb25kaXRpb25JbmRleCk7XG4gICAgaWYgKGZvcm0gJiYgZm9ybS5nZXQodmFyaWFibGVOYW1lKSkge1xuICAgICAgZm9ybS5nZXQodmFyaWFibGVOYW1lKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ29uZGl0aW9uVmFyaWFibGVCb29sZWFuQ2hhbmdlKGNvbmRpdGlvbkluZGV4OiBudW1iZXIsIHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgdmFyaWFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmNvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzLmdldChjb25kaXRpb25JbmRleCkgfHwgW107XG4gICAgY29uc3QgdmFyaWFibGUgPSB2YXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gYXJyYXlcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmNvbmRpdGlvblZhcmlhYmxlc0Zvcm1zLmdldChjb25kaXRpb25JbmRleCk7XG4gICAgaWYgKCFmb3JtQXJyYXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IGZvcm1BcnJheS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgZm9ybUFycmF5LmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIG5ldyBmb3JtIGdyb3VwIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmFtZTogW3ZhcmlhYmxlTmFtZV0sXG4gICAgICAgIHZhbHVlOiBbdmFsdWVdLFxuICAgICAgICB0eXBlOiBbJ2Jvb2xlYW4nXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZT8ubGFiZWwgfHwgJyddLFxuICAgICAgICBvcHRpb25zOiBbdmFyaWFibGU/Lm9wdGlvbnMgfHwgW11dXG4gICAgICB9KTtcbiAgICAgIC8vIGZvcm1BcnJheSBpcyBndWFyYW50ZWVkIHRvIGJlIGRlZmluZWQgaGVyZSBkdWUgdG8gdGhlIGVhcmx5IHJldHVybiBhYm92ZVxuICAgICAgZm9ybUFycmF5LnB1c2godmFyaWFibGVHcm91cCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFVwZGF0ZSBIVE1MIGdyYW1tYXIgZm9yIHRoaXMgY29uZGl0aW9uXG4gICAgdGhpcy51cGRhdGVDb25kaXRpb25IdG1sR3JhbW1hcihjb25kaXRpb25JbmRleCk7XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTdHJpcCBIVE1MIHRhZ3MgZnJvbSBhIHN0cmluZyBmb3Igc2VhcmNoIGZ1bmN0aW9uYWxpdHlcbiAgICovXG4gIHByaXZhdGUgc3RyaXBIdG1sVGFncyhodG1sU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghaHRtbFN0cmluZykgcmV0dXJuICcnO1xuICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBkaXYgZWxlbWVudCB0byBwYXJzZSBIVE1MXG4gICAgY29uc3QgdG1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgdG1wLmlubmVySFRNTCA9IGh0bWxTdHJpbmc7XG4gICAgcmV0dXJuIHRtcC50ZXh0Q29udGVudCB8fCB0bXAuaW5uZXJUZXh0IHx8ICcnO1xuICB9XG4gIFxuICAvKipcbiAgICogVXBkYXRlIEhUTUwgZ3JhbW1hciBmb3IgYSBzcGVjaWZpYyBjb25kaXRpb24gd2l0aCBhY3R1YWwgdmFyaWFibGUgdmFsdWVzLlxuICAgKiBEZWxlZ2F0ZXMgdG8gY29tcHV0ZUh0bWxHcmFtbWFyRm4gd2hlbiBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHAgKGNlbnRyYWxpc2VkIGxvZ2ljIGluIFN0ZXBCdWlsZGVyU2VydmljZSkuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUNvbmRpdGlvbkh0bWxHcmFtbWFyKGNvbmRpdGlvbkluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZXMuZ2V0KGNvbmRpdGlvbkluZGV4KTtcbiAgICBpZiAoIXRlbXBsYXRlIHx8ICF0ZW1wbGF0ZS5odG1sR3JhbW1hcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMuZ2V0KGNvbmRpdGlvbkluZGV4KSB8fCBbXTtcblxuICAgIGlmICh0aGlzLmNvbXB1dGVIdG1sR3JhbW1hckZuKSB7XG4gICAgICB0aGlzLmNvbmRpdGlvblVwZGF0ZWRIdG1sR3JhbW1hci5zZXQoY29uZGl0aW9uSW5kZXgsIHRoaXMuY29tcHV0ZUh0bWxHcmFtbWFyRm4odGVtcGxhdGUsIHZhcmlhYmxlcykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCB1cGRhdGVkR3JhbW1hciA9IHRlbXBsYXRlLmh0bWxHcmFtbWFyO1xuICAgIHZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gbmV3IFJlZ0V4cChgPHNwYW5bXj5dKmRhdGEtZXZlbnQta2V5PVwiJHt2YXJpYWJsZS5uYW1lfVwiW14+XSo+Lio/PC9zcGFuPmAsICdnaScpO1xuICAgICAgY29uc3QgdmFsdWUgPSB2YXJpYWJsZS52YWx1ZSB8fCAnJztcbiAgICAgIC8vIEVzY2FwZSBIVE1MIGluIHZhbHVlIHRvIHByZXZlbnQgWFNTXG4gICAgICBjb25zdCBlc2NhcGVkVmFsdWUgPSBTdHJpbmcodmFsdWUpLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcbiAgICAgIHVwZGF0ZWRHcmFtbWFyID0gdXBkYXRlZEdyYW1tYXIucmVwbGFjZShwbGFjZWhvbGRlciwgZXNjYXBlZFZhbHVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY29uZGl0aW9uVXBkYXRlZEh0bWxHcmFtbWFyLnNldChjb25kaXRpb25JbmRleCwgdXBkYXRlZEdyYW1tYXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENvbmRpdGlvbkFkdmFuY2VkVmFyaWFibGVzRm9ybShpbmRleDogbnVtYmVyLCB2YXJpYWJsZXM6IGFueVtdKTogdm9pZCB7XG4gICAgbGV0IGZvcm1BcnJheSA9IHRoaXMuY29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZXNGb3Jtcy5nZXQoaW5kZXgpO1xuICAgIGlmICghZm9ybUFycmF5KSB7XG4gICAgICBmb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KFtdKTtcbiAgICAgIHRoaXMuY29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZXNGb3Jtcy5zZXQoaW5kZXgsIGZvcm1BcnJheSk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGZvcm1BcnJheSBpcyBub3QgdW5kZWZpbmVkIChUeXBlU2NyaXB0IGd1YXJkKVxuICAgIGlmICghZm9ybUFycmF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RvcmUgcmVmZXJlbmNlIHRvIGF2b2lkIFR5cGVTY3JpcHQgaXNzdWVzIGluIGZvckVhY2ggY2FsbGJhY2tcbiAgICBjb25zdCBmb3JtQXJyYXlSZWY6IEZvcm1BcnJheSA9IGZvcm1BcnJheTtcblxuICAgIC8vIENsZWFyIGV4aXN0aW5nIGZvcm0gYXJyYXlcbiAgICB3aGlsZSAoZm9ybUFycmF5UmVmLmxlbmd0aCAhPT0gMCkge1xuICAgICAgZm9ybUFycmF5UmVmLnJlbW92ZUF0KDApO1xuICAgIH1cblxuICAgIC8vIEFkZCBmb3JtIGdyb3VwcyBmb3IgZWFjaCBhZHZhbmNlZCB2YXJpYWJsZVxuICAgIHZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgdHlwZXNcbiAgICAgIGxldCBkZWZhdWx0VmFsdWU6IGFueTtcbiAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnKSB7XG4gICAgICAgIC8vIEZvciBzdHJfbGlzdCwgY3JlYXRlIGEgRm9ybUFycmF5XG4gICAgICAgIGNvbnN0IHZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlLnZhbHVlKSA/IHZhcmlhYmxlLnZhbHVlIDogW107XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheVZhbHVlID0gdGhpcy5mYi5hcnJheShcbiAgICAgICAgICB2YWx1ZUFycmF5Lmxlbmd0aCA+IDAgXG4gICAgICAgICAgICA/IHZhbHVlQXJyYXkubWFwKChpdGVtOiBzdHJpbmcpID0+IHRoaXMuZmIuY29udHJvbChpdGVtKSlcbiAgICAgICAgICAgIDogW3RoaXMuZmIuY29udHJvbCgnJyldIC8vIFN0YXJ0IHdpdGggb25lIGVtcHR5IGNvbnRyb2xcbiAgICAgICAgKTtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gZm9ybUFycmF5VmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgdmFyaWFibGUudmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudmFsdWUgfHwgJyc7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBhIEZvcm1Hcm91cCBmb3IgZWFjaCB2YXJpYWJsZVxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiB2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnID8gZGVmYXVsdFZhbHVlIDogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICAgIHR5cGU6IFt2YXJpYWJsZS50eXBlIHx8ICdzdHJpbmcnXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZS5sYWJlbCB8fCAnJ11cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBmb3JtQXJyYXlSZWYucHVzaCh2YXJpYWJsZUdyb3VwKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldENvbmRpdGlvbkFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMoaW5kZXg6IG51bWJlcik6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb25kaXRpb25BZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmdldChpbmRleCkgfHwgW107XG4gIH1cblxuICBnZXRDb25kaXRpb25BZHZhbmNlZFZhcmlhYmxlc0Zvcm0oaW5kZXg6IG51bWJlcik6IEZvcm1BcnJheSB7XG4gICAgbGV0IGZvcm1BcnJheSA9IHRoaXMuY29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZXNGb3Jtcy5nZXQoaW5kZXgpO1xuICAgIGlmICghZm9ybUFycmF5KSB7XG4gICAgICBmb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KFtdKTtcbiAgICAgIHRoaXMuY29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZXNGb3Jtcy5zZXQoaW5kZXgsIGZvcm1BcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtQXJyYXk7XG4gIH1cblxuICBnZXRDb25kaXRpb25BZHZhbmNlZEV4cGFuZGVkKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25kaXRpb25BZHZhbmNlZEV4cGFuZGVkLmdldChpbmRleCkgfHwgZmFsc2U7XG4gIH1cblxuICB0b2dnbGVDb25kaXRpb25BZHZhbmNlZChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY29uZGl0aW9uQWR2YW5jZWRFeHBhbmRlZC5nZXQoaW5kZXgpIHx8IGZhbHNlO1xuICAgIHRoaXMuY29uZGl0aW9uQWR2YW5jZWRFeHBhbmRlZC5zZXQoaW5kZXgsICFjdXJyZW50KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uQ29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZUJvb2xlYW5DaGFuZ2UoY29uZGl0aW9uSW5kZXg6IG51bWJlciwgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5jb25kaXRpb25BZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmdldChjb25kaXRpb25JbmRleCkgfHwgW107XG4gICAgY29uc3QgdmFyaWFibGUgPSB2YXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy5jb25kaXRpb25BZHZhbmNlZFZhcmlhYmxlc0Zvcm1zLmdldChjb25kaXRpb25JbmRleCk/LmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IHVuZGVmaW5lZCAmJiB2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5jb25kaXRpb25BZHZhbmNlZFZhcmlhYmxlc0Zvcm1zLmdldChjb25kaXRpb25JbmRleCk/LmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBvbkNvbmRpdGlvbkFkdmFuY2VkVmFyaWFibGVWYWx1ZUNoYW5nZShjb25kaXRpb25JbmRleDogbnVtYmVyLCB2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgdmFyaWFibGUgaW4gYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuY29uZGl0aW9uQWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5nZXQoY29uZGl0aW9uSW5kZXgpIHx8IFtdO1xuICAgIGNvbnN0IHZhcmlhYmxlID0gdmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvLyBBbHNvIHVwZGF0ZSBmb3JtIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMuY29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZXNGb3Jtcy5nZXQoY29uZGl0aW9uSW5kZXgpPy5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSB1bmRlZmluZWQgJiYgdmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuY29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZXNGb3Jtcy5nZXQoY29uZGl0aW9uSW5kZXgpPy5hdCh2YXJpYWJsZUluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgICAvLyBGb3Igc3RyX2xpc3QsIHRoZSBGb3JtQXJyYXkgaXMgYWxyZWFkeSBtYW5hZ2VkIGluc2lkZSBBZHZhbmNlZFZhcmlhYmxlc0Zvcm1Db21wb25lbnQsXG4gICAgICAvLyBzbyB3ZSBkb24ndCBuZWVkIHRvIHJlYnVpbGQgb3IgdXBkYXRlIGl0IGhlcmUgdG8gYXZvaWQgZm9jdXMgbG9zcy5cbiAgICAgIGlmICh2YXJpYWJsZT8udHlwZSAhPT0gJ3N0cl9saXN0Jykge1xuICAgICAgICBmb3JtR3JvdXA/LmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRDb25kaXRpb25Gb3JtR3JvdXAoaW5kZXg6IG51bWJlcik6IEZvcm1Hcm91cCB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlcGVhdGVkIGxvb2t1cHNcbiAgICBpZiAodGhpcy5jb25kaXRpb25Gb3JtR3JvdXBDYWNoZS5oYXMoaW5kZXgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25Gb3JtR3JvdXBDYWNoZS5nZXQoaW5kZXgpITtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5jb25kaXRpb25zRm9ybUFycmF5LmF0KGluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgaWYgKGZvcm1Hcm91cCkge1xuICAgICAgdGhpcy5jb25kaXRpb25Gb3JtR3JvdXBDYWNoZS5zZXQoaW5kZXgsIGZvcm1Hcm91cCk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtR3JvdXA7XG4gIH1cbiAgXG4gIGdldENvbmRpdGlvbkZpZWxkVmFsdWUoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5nZXRDb25kaXRpb25Gb3JtR3JvdXAoaW5kZXgpO1xuICAgIHJldHVybiBmb3JtR3JvdXA/LmdldCgnZmllbGQnKT8udmFsdWUgfHwgJyc7XG4gIH1cbiAgXG4gIGlzQ29uZGl0aW9uSWYoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldENvbmRpdGlvbkZpZWxkVmFsdWUoaW5kZXgpID09PSAnQ09ORElUSU9OX0lGJztcbiAgfVxuICBcbiAgaXNDb25kaXRpb25FbHNlSWYoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldENvbmRpdGlvbkZpZWxkVmFsdWUoaW5kZXgpID09PSAnQ09ORElUSU9OX0VMU0VfSUYnO1xuICB9XG4gIFxuICBnZXRDb25kaXRpb25MYWJlbChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBmaWVsZFZhbHVlID0gdGhpcy5nZXRDb25kaXRpb25GaWVsZFZhbHVlKGluZGV4KTtcbiAgICBpZiAoZmllbGRWYWx1ZSA9PT0gJ0NPTkRJVElPTl9JRicpIHJldHVybiAnSUYnO1xuICAgIGlmIChmaWVsZFZhbHVlID09PSAnQ09ORElUSU9OX0VMU0VfSUYnKSByZXR1cm4gJ0VMU0UgSUYnO1xuICAgIHJldHVybiAnRUxTRSc7XG4gIH1cbiAgXG4gIHRyYWNrQnlDb25kaXRpb25JbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBvbkluY2x1ZGVFbHNlQ2hhbmdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmluY2x1ZGVFbHNlID0gY2hlY2tlZDtcbiAgICB0aGlzLmNvbmRpdGlvbkZvcm0ucGF0Y2hWYWx1ZSh7IGluY2x1ZGVFbHNlOiBjaGVja2VkIH0pO1xuICAgIFxuICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxsZWQuZW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJhbGwgZm9ybSB2YWxpZGl0eSBmb3IgY29uZGl0aW9uIHN0ZXAuXG4gICAqIEluIGFkZGl0aW9uIHRvIEFuZ3VsYXIgZm9ybSB2YWxpZGl0eSwgd2UgbXVzdCBlbnN1cmUgdGhhdCBmb3IgYW55IHRlbXBsYXRlIHZhcmlhYmxlXG4gICAqIHdpdGggZGF0YUtleSAndGVzdF9kYXRhJyB8ICdzb3VyY2VfdmFsdWUnIHwgJ3RhcmdldF92YWx1ZScgYW5kIGRhdGFUeXBlICdwbGFpbi10ZXh0J1xuICAgKiBvciAncnVudGltZScsIHRoZSB2YWx1ZSBpcyBub24tZW1wdHkuXG4gICAqL1xuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICAvLyBGaXJzdCwgcmVseSBvbiB0aGUgcmVhY3RpdmUgZm9ybSB2YWxpZGl0eSBmb3IgYmFzZSBjb25kaXRpb24gZmllbGRzXG4gICAgaWYgKCF0aGlzLmNvbmRpdGlvbkZvcm0udmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUaGVuIGVuZm9yY2UgdGhlIHNhbWUgdGVzdC1kYXRhIHZhbGlkYXRpb24gcnVsZSB1c2VkIGluIGFjdGlvbiBidWlsZGVyXG4gICAgbGV0IGN1c3RvbVZhcmlhYmxlc1ZhbGlkID0gdHJ1ZTtcblxuICAgIHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGVzKSA9PiB7XG4gICAgICBpZiAoIXZhcmlhYmxlcyB8fCAhdmFyaWFibGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFsbFZhbGlkRm9yQ29uZGl0aW9uID0gdmFyaWFibGVzLmV2ZXJ5KCh2YXJpYWJsZTogYW55KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB2YXJpYWJsZSAmJlxuICAgICAgICAgICh2YXJpYWJsZS5kYXRhS2V5ID09PSAndGVzdF9kYXRhJyB8fFxuICAgICAgICAgICAgdmFyaWFibGUuZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHxcbiAgICAgICAgICAgIHZhcmlhYmxlLmRhdGFLZXkgPT09ICd0YXJnZXRfdmFsdWUnKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAodmFyaWFibGUuZGF0YVR5cGUgPT09ICdwbGFpbi10ZXh0JyB8fCB2YXJpYWJsZS5kYXRhVHlwZSA9PT0gJ3J1bnRpbWUnKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhcmlhYmxlLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZih2YXJpYWJsZS5kYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicpe1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YXJpYWJsZS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYodmFyaWFibGUuZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCcpe1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YXJpYWJsZS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYodmFyaWFibGUuZGF0YUtleSA9PT0gJ2VsZW1lbnQnKXtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhcmlhYmxlLnZhbHVlO1xuICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWFsbFZhbGlkRm9yQ29uZGl0aW9uKSB7XG4gICAgICAgIGN1c3RvbVZhcmlhYmxlc1ZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY3VzdG9tVmFyaWFibGVzVmFsaWQ7XG4gIH1cblxuICBvbkNyZWF0ZVN0ZXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25kaXRpb25Gb3JtLnZhbGlkKSB7XG4gICAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmNvbmRpdGlvbkZvcm0udmFsdWU7XG4gICAgICBcbiAgICAgIC8vIFN5bmMgYWR2YW5jZWQgdmFyaWFibGVzIGZyb20gZm9ybSB0byBhcnJheSBmb3IgYWxsIGNvbmRpdGlvbnNcbiAgICAgIHRoaXMuY29uZGl0aW9uQWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZXMsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuY29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZXNGb3Jtcy5nZXQoaW5kZXgpO1xuICAgICAgICBpZiAoZm9ybUFycmF5KSB7XG4gICAgICAgICAgdmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlLCB2YXJJbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gZm9ybUFycmF5LmF0KHZhckluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgICAgICAgICBpZiAoZm9ybUdyb3VwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGZvcm1Hcm91cC5nZXQoJ3ZhbHVlJyk/LnZhbHVlO1xuICAgICAgICAgICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ3N0cl9saXN0JyAmJiBmb3JtVmFsdWUgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IHZhbHVlcyBmcm9tIEZvcm1BcnJheVxuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZm9ybVZhbHVlLmNvbnRyb2xzLm1hcChjb250cm9sID0+IGNvbnRyb2wudmFsdWUpLmZpbHRlcigodmFsOiBzdHJpbmcpID0+IHZhbCAmJiB2YWwudHJpbSgpICE9PSAnJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUudmFsdWUgPSBmb3JtVmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGNvbnN0IHN0ZXBEYXRhOiBDb25kaXRpb25Gb3JtRGF0YSA9IHtcbiAgICAgICAgY29uZGl0aW9uczogZm9ybVZhbHVlLmNvbmRpdGlvbnMubWFwKChjb25kOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAvLyBGaW5kIHRoZSBBY3Rpb25UZW1wbGF0ZSBvYmplY3QgZnJvbSB0aGUgc3RvcmVkIElEL3ZhbHVlXG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVJZCA9IGNvbmQudmFsdWU7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZW1wbGF0ZSA9IHRoaXMuY29uZGl0aW9uVGVtcGxhdGVzLmZpbmQoXG4gICAgICAgICAgICB0ID0+ICh0LmlkPy50b1N0cmluZygpID09PSB0ZW1wbGF0ZUlkKSB8fCAodC5kaXNwbGF5TmFtZSA9PT0gdGVtcGxhdGVJZClcbiAgICAgICAgICApIHx8IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZXMuZ2V0KGluZGV4KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBHZXQgdGVtcGxhdGUgdmFyaWFibGVzIGZvciB0aGlzIGNvbmRpdGlvblxuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5jb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcy5nZXQoaW5kZXgpIHx8IFtdO1xuICAgICAgICAgIC8vIEdldCBhZHZhbmNlZCBzZXR0aW5ncyB2YXJpYWJsZXMgZm9yIHRoaXMgY29uZGl0aW9uXG4gICAgICAgICAgY29uc3QgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyA9IHRoaXMuY29uZGl0aW9uQWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5nZXQoaW5kZXgpIHx8IFtdO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmaWVsZDogY29uZC5maWVsZCxcbiAgICAgICAgICAgIG9wZXJhdG9yOiBjb25kLm9wZXJhdG9yLFxuICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkVGVtcGxhdGUgfHwgbnVsbCxcbiAgICAgICAgICAgIHRlbXBsYXRlVmFyaWFibGVzOiB0ZW1wbGF0ZVZhcmlhYmxlcyxcbiAgICAgICAgICAgIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6IGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogY29uZC5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBjb25kLm1ldGFkYXRhIHx8ICcnXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICAgIGluY2x1ZGVFbHNlOiBmb3JtVmFsdWUuaW5jbHVkZUVsc2UgfHwgZmFsc2VcbiAgICAgIH07XG4gICAgICBjb25zb2xlLmxvZygnc3RlcERhdGEnLCBzdGVwRGF0YSk7XG4gICAgICB0aGlzLmNyZWF0ZVN0ZXAuZW1pdChzdGVwRGF0YSk7XG4gICAgfVxuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWgtZnVsbCBjcWEtYmctd2hpdGUgY3FhLXB4LTQgY3FhLXB5LTJcIj5cbiAgPCEtLSBIZWFkZXIgLS0+XG4gIDxoMiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1ibGFjay0xMDAgY3FhLW1iLTRcIj5cbiAgICBDcmVhdGUgQ29uZGl0aW9uIFN0ZXBcbiAgPC9oMj5cblxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1mbGV4LTEgY3FhLW92ZXJmbG93LXktYXV0b1wiPlxuICAgIDwhLS0gQ29uZGl0aW9uIEJ1aWxkZXIgU2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTZcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWItM1wiPlxuICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWdyYXktOTAwXCI+XG4gICAgICAgIENvbmRpdGlvbiBCdWlsZGVyXG4gICAgICA8L2gzPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ29uZGl0aW9uIFJvd3MgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtbWItM1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb25kaXRpb24gb2YgY29uZGl0aW9uc0Zvcm1BcnJheS5jb250cm9sczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUNvbmRpdGlvbkluZGV4XCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJpc0NvbmRpdGlvbklmKGkpIHx8IGlzQ29uZGl0aW9uRWxzZUlmKGkpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgPCEtLSBDb25kaXRpb24gUm93IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgIDwhLS0gQ29uZGl0aW9uIExhYmVsIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkXCI+XG4gICAgICAgICAgICAgICAge3sgZ2V0Q29uZGl0aW9uTGFiZWwoaSkgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPCEtLSBPcGVyYXRvciBEcm9wZG93biAtLT5cbiAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWF4LXctWzEwMHB4XSBjcWEtdGV4dC1bMTBweF1cIj5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldENvbmRpdGlvbkZvcm1Hcm91cChpKVwiIFtjb25maWddPVwiZ2V0T3BlcmF0b3JDb25maWcoaSlcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICAgIDwhLS0gVmFsdWUgVGVtcGxhdGUgRHJvcGRvd24gLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy1bMTUwcHhdIGNxYS10ZXh0LVsxMHB4XVwiPlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Q29uZGl0aW9uRm9ybUdyb3VwKGkpXCIgW2NvbmZpZ109XCJnZXRWYWx1ZUNvbmZpZyhpKVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIFJlbW92ZSBCdXR0b24gLS0+XG4gICAgICAgICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpID49IDFcIlxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBpY29uPVwiY2xvc2VcIlxuICAgICAgICAgICAgICAgIGljb25Qb3NpdGlvbj1cInN0YXJ0XCJcbiAgICAgICAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS13LWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXInXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQ29uZGl0aW9uKGkpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidSZW1vdmUgY29uZGl0aW9uJ1wiPlxuICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTggY3FhLWgtOCBjcWEtcm91bmRlZCBjcWEtdGV4dC1ncmF5LTUwMCBob3ZlcjpjcWEtdGV4dC1ncmF5LTcwMCBob3ZlcjpjcWEtYmctZ3JheS0xMDAgY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQ29uZGl0aW9uKGkpXCIgKm5nSWY9XCJpID49IDFcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1JlbW92ZSBjb25kaXRpb24nXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtbGcgY3FhLXRleHQtWzI0cHhdXCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj4gLS0+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBUZW1wbGF0ZSBWYXJpYWJsZXMgU2VjdGlvbiAoc2hvd24gd2hlbiB0ZW1wbGF0ZSBpcyBzZWxlY3RlZCkgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2V0U2VsZWN0ZWRUZW1wbGF0ZShpKVwiIGNsYXNzPVwiY3FhLW10LTJcIj5cbiAgICAgICAgICAgICAgPCEtLSBUZW1wbGF0ZSBHcmFtbWFyIERpc3BsYXkgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWItNCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0xIGNxYS10ZXh0LXNtIGNxYS10ZXh0LWdyYXktNzAwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hY3Rpb24tZm9ybWF0IGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjNweF0gY3FhLXRleHQtYmxhY2stMTAwXCJcbiAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiZ2V0U2VsZWN0ZWRUZW1wbGF0ZShpKT8uaHRtbEdyYW1tYXIgfHwgZ2V0U2VsZWN0ZWRUZW1wbGF0ZShpKT8ubmF0dXJhbFRleHQgfHwgJydcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8IS0tIFRlbXBsYXRlIFZhcmlhYmxlcyBGb3JtIENvbXBvbmVudCAoaW5jbHVkZXMgRGVzY3JpcHRpb24gYW5kIE1ldGFkYXRhKSAtLT5cbiAgICAgICAgICAgICAgPGNxYS10ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybVxuICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7XCJcbiAgICAgICAgICAgICAgICBbdGVtcGxhdGVWYXJpYWJsZXNdPVwiZ2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMoaSlcIlxuICAgICAgICAgICAgICAgIFt2YXJpYWJsZXNGb3JtXT1cImdldENvbmRpdGlvblZhcmlhYmxlc0Zvcm0oaSlcIlxuICAgICAgICAgICAgICAgIFttZXRhZGF0YV09XCJnZXRDb25kaXRpb25Gb3JtR3JvdXAoaSkuZ2V0KCdtZXRhZGF0YScpPy52YWx1ZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImdldENvbmRpdGlvbkZvcm1Hcm91cChpKS5nZXQoJ2Rlc2NyaXB0aW9uJyk/LnZhbHVlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbZWxlbWVudE9wdGlvbnNdPVwiZWxlbWVudE9wdGlvbnNcIlxuICAgICAgICAgICAgICAgIFtoYXNNb3JlRWxlbWVudHNdPVwiaGFzTW9yZUVsZW1lbnRzXCJcbiAgICAgICAgICAgICAgICBbaXNMb2FkaW5nRWxlbWVudHNdPVwiaXNMb2FkaW5nRWxlbWVudHNcIlxuICAgICAgICAgICAgICAgIFtzY3JlZW5OYW1lT3B0aW9uc109XCJzY3JlZW5OYW1lT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgW2hhc01vcmVTY3JlZW5OYW1lc109XCJoYXNNb3JlU2NyZWVuTmFtZXNcIlxuICAgICAgICAgICAgICAgIFtpc0xvYWRpbmdTY3JlZW5OYW1lc109XCJpc0xvYWRpbmdTY3JlZW5OYW1lc1wiXG4gICAgICAgICAgICAgICAgW3BhcmFtZXRlck9wdGlvbnNdPVwicGFyYW1ldGVyT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgW2hhc01vcmVQYXJhbWV0ZXJzXT1cImhhc01vcmVQYXJhbWV0ZXJzXCJcbiAgICAgICAgICAgICAgICBbaXNMb2FkaW5nUGFyYW1ldGVyc109XCJpc0xvYWRpbmdQYXJhbWV0ZXJzXCJcbiAgICAgICAgICAgICAgICBbZW52aXJvbm1lbnRPcHRpb25zXT1cImVudmlyb25tZW50T3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgW2hhc01vcmVFbnZpcm9ubWVudHNdPVwiaGFzTW9yZUVudmlyb25tZW50c1wiXG4gICAgICAgICAgICAgICAgW2lzTG9hZGluZ0Vudmlyb25tZW50c109XCJpc0xvYWRpbmdFbnZpcm9ubWVudHNcIlxuICAgICAgICAgICAgICAgIFtkZWZhdWx0VGVzdERhdGFQcm9maWxlSWRdPVwiZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkXCJcbiAgICAgICAgICAgICAgICBbZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleF09XCJkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4XCJcbiAgICAgICAgICAgICAgICAodmFyaWFibGVWYWx1ZUNoYW5nZSk9XCJvbkNvbmRpdGlvblZhcmlhYmxlVmFsdWVDaGFuZ2UoaSwgJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICh2YXJpYWJsZUJvb2xlYW5DaGFuZ2UpPVwib25Db25kaXRpb25WYXJpYWJsZUJvb2xlYW5DaGFuZ2UoaSwgJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgIChtZXRhZGF0YUNoYW5nZSk9XCJnZXRDb25kaXRpb25Gb3JtR3JvdXAoaSkuZ2V0KCdtZXRhZGF0YScpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoZGVzY3JpcHRpb25DaGFuZ2UpPVwiZ2V0Q29uZGl0aW9uRm9ybUdyb3VwKGkpLmdldCgnZGVzY3JpcHRpb24nKT8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGxvYWRNb3JlRWxlbWVudHMpPVwibG9hZE1vcmVFbGVtZW50cy5lbWl0KClcIlxuICAgICAgICAgICAgICAgIChzZWFyY2hFbGVtZW50cyk9XCJzZWFyY2hFbGVtZW50cy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChzZWFyY2hFbGVtZW50c0J5U2NyZWVuTmFtZSk9XCJzZWFyY2hFbGVtZW50c0J5U2NyZWVuTmFtZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjcmVhdGVFbGVtZW50KT1cImNyZWF0ZUVsZW1lbnQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoc2VhcmNoU2NyZWVuTmFtZSk9XCJzZWFyY2hTY3JlZW5OYW1lLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGxvYWRNb3JlU2NyZWVuTmFtZXMpPVwibG9hZE1vcmVTY3JlZW5OYW1lcy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdCk9XCJjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChzZWFyY2hQYXJhbWV0ZXJzKT1cInNlYXJjaFBhcmFtZXRlcnMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAobG9hZE1vcmVQYXJhbWV0ZXJzKT1cImxvYWRNb3JlUGFyYW1ldGVycy5lbWl0KClcIlxuICAgICAgICAgICAgICAgIChzZWFyY2hFbnZpcm9ubWVudHMpPVwic2VhcmNoRW52aXJvbm1lbnRzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGxvYWRNb3JlRW52aXJvbm1lbnRzKT1cImxvYWRNb3JlRW52aXJvbm1lbnRzLmVtaXQoKVwiPlxuICAgICAgICAgICAgICA8L2NxYS10ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybT5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDwhLS0gQWR2YW5jZWQgU2V0dGluZ3MgVmFyaWFibGVzIEZvcm0gLS0+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJnZXRDb25kaXRpb25BZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzKGkpLmxlbmd0aCA+IDBcIiBjbGFzcz1cImNxYS1tdC00XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMiBjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXAtMCBjcWEtbWItMS41XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNvbmRpdGlvbkFkdmFuY2VkKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdXCI+QWR2YW5jZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LWJhc2VcIiBbY2xhc3MuY3FhLXJvdGF0ZS0xODBdPVwiZ2V0Q29uZGl0aW9uQWR2YW5jZWRFeHBhbmRlZChpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZF9tb3JlXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJnZXRDb25kaXRpb25BZHZhbmNlZEV4cGFuZGVkKGkpXCIgY2xhc3M9XCJjcWEtbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtIFxuICAgICAgICAgICAgICAgICAgICAgIFthZHZhbmNlZFZhcmlhYmxlc109XCJnZXRDb25kaXRpb25BZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYWR2YW5jZWRWYXJpYWJsZUZvcm1dPVwiZ2V0Q29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZXNGb3JtKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAodmFyaWFibGVCb29sZWFuQ2hhbmdlKT1cIm9uQ29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZUJvb2xlYW5DaGFuZ2UoaSwgJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICh2YXJpYWJsZVZhbHVlQ2hhbmdlKT1cIm9uQ29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKGksICRldmVudC5uYW1lLCAkZXZlbnQudmFsdWUpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQWRkIENvbmRpdGlvbiBCdXR0b24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWJvcmRlci0yIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItZ3JheS0zMDAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtMSBjcWEtbXQtM1wiPlxuICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgIHZhcmlhbnQ9XCJ0ZXh0XCJcbiAgICAgICAgICBpY29uPVwiYWRkXCJcbiAgICAgICAgICBpY29uUG9zaXRpb249XCJzdGFydFwiXG4gICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW3RleHRdPVwiJ0FkZCBDb25kaXRpb24nXCJcbiAgICAgICAgICAoY2xpY2tlZCk9XCJhZGRDb25kaXRpb24oJ0NPTkRJVElPTl9FTFNFX0lGJylcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEluY2x1ZGUgRUxTRSBCcmFuY2ggU2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1tYi02IGNxYS1wLTMgY3FhLWJnLWdyYXktNTAgY3FhLXJvdW5kZWQtbGdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtWzE0cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWdyYXktOTAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgSW5jbHVkZSBFTFNFIGJyYW5jaFxuICAgICAgICA8L2gzPlxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1ncmF5LTYwMFwiPlxuICAgICAgICAgIEV4ZWN1dGUgYWx0ZXJuYXRpdmUgc3RlcHMgd2hlbiBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8bWF0LXNsaWRlLXRvZ2dsZSBbY2hlY2tlZF09XCJpbmNsdWRlRWxzZVwiIChjaGFuZ2UpPVwib25JbmNsdWRlRWxzZUNoYW5nZSgkZXZlbnQuY2hlY2tlZClcIiBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1nYXAtMiBjcWEtbXQtYXV0byBjcWEtcHQtNCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgIDxjcWEtYnV0dG9uIGNsYXNzPVwiY3FhLXctMS8yXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgdGV4dD1cIkNhbmNlbFwiIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICAgIDxjcWEtYnV0dG9uICpuZ0lmPVwiIWlzQ3JlYXRpbmdTdGVwXCIgY2xhc3M9XCJjcWEtdy0xLzJcIiB2YXJpYW50PVwiZmlsbGVkXCIgdGV4dD1cIkNyZWF0ZSBTdGVwXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhaXNGb3JtVmFsaWQoKVwiXG4gICAgICAoY2xpY2tlZCk9XCJvbkNyZWF0ZVN0ZXAoKVwiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNDcmVhdGluZ1N0ZXBcIiBjbGFzcz1cImNxYS13LTEvMiBjcWEtZmxleC0xIGNxYS1taW4taC1bMzhweF0gY3FhLXJvdW5kZWQtWzhweF1cIj5cbiAgICAgIDxjcWEtYmFkZ2UgbGFiZWw9XCJDcmVhdGluZ+KAplwiIGljb249XCJhdXRvcmVuZXdcIiBbaXNMb2FkaW5nXT1cInRydWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBbY2VudGVyQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgW2lubGluZVN0eWxlc109XCInbWluLWhlaWdodDogMzhweDsgaGVpZ2h0OiAzOHB4OyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsnXCJcbiAgICAgICAgdmFyaWFudD1cImluZm9cIiBzaXplPVwibWVkaXVtXCI+PC9jcWEtYmFkZ2U+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19
851
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWNvbmRpdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3N0ZXAtYnVpbGRlci9zdGVwLWJ1aWxkZXItY29uZGl0aW9uL3N0ZXAtYnVpbGRlci1jb25kaXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWNvbmRpdGlvbi9zdGVwLWJ1aWxkZXItY29uZGl0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQW9DLHVCQUF1QixFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNySixPQUFPLEVBQUUsU0FBUyxFQUEwQixXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7O0FBbUM1RixNQUFNLE9BQU8sNkJBQTZCO0lBOEZ4QyxZQUFvQixFQUFlLEVBQVUsR0FBc0I7UUFBL0MsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBN0ZuRSxvQ0FBb0M7UUFDM0Isb0JBQWUsR0FBbUI7WUFDekMsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO1lBQ2xFLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTtZQUNsRixFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7WUFDMUUsRUFBRSxFQUFFLEVBQUUs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LEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUVHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFHRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFHRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHSSxVQUFVO3NCQUFuQixNQUFNO2dCQUdHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csMEJBQTBCO3NCQUFuQyxNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEFjdGlvblRlbXBsYXRlIH0gZnJvbSAnLi4vc3RlcC1idWlsZGVyLWFjdGlvbi9zdGVwLWJ1aWxkZXItYWN0aW9uLmNvbXBvbmVudCc7XG5cbi8vIEltcG9ydCBFbGVtZW50IHR5cGUgLSB1c2luZyBhbnkgZm9yIG5vdyBzaW5jZSBFbGVtZW50IGlzIGZyb20gdHMtcG9ydGFsLXVpXG5pbnRlcmZhY2UgRWxlbWVudCB7XG4gIGlkPzogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxvY2F0b3JWYWx1ZT86IHN0cmluZztcbiAgb3RoZXJMb2NhdG9yPzogc3RyaW5nW107XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb25Sb3cge1xuICBmaWVsZDogc3RyaW5nO1xuICBvcGVyYXRvcjogc3RyaW5nO1xuICB2YWx1ZTogQWN0aW9uVGVtcGxhdGU7XG4gIHRlbXBsYXRlVmFyaWFibGVzPzogYW55W107XG4gIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM/OiBhbnlbXTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIG1ldGFkYXRhPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbkZvcm1EYXRhIHtcbiAgY29uZGl0aW9uczogQ29uZGl0aW9uUm93W107XG4gIGluY2x1ZGVFbHNlOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc3RlcC1idWlsZGVyLWNvbmRpdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGVwLWJ1aWxkZXItY29uZGl0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBTdGVwQnVpbGRlckNvbmRpdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgLyoqIE9wdGlvbnMgZm9yIG9wZXJhdG9yIGRyb3Bkb3duICovXG4gIEBJbnB1dCgpIG9wZXJhdG9yT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ2VxdWFscycsIHZhbHVlOiAnZXF1YWxzJywgbmFtZTogJ2VxdWFscycsIGxhYmVsOiAnZXF1YWxzJyB9LFxuICAgIHsgaWQ6ICdub3RfZXF1YWxzJywgdmFsdWU6ICdub3RfZXF1YWxzJywgbmFtZTogJ25vdCBlcXVhbHMnLCBsYWJlbDogJ25vdCBlcXVhbHMnIH0sXG4gICAgeyBpZDogJ2NvbnRhaW5zJywgdmFsdWU6ICdjb250YWlucycsIG5hbWU6ICdjb250YWlucycsIGxhYmVsOiAnY29udGFpbnMnIH0sXG4gICAgeyBpZDogJ25vdF9jb250YWlucycsIHZhbHVlOiAnbm90X2NvbnRhaW5zJywgbmFtZTogJ25vdCBjb250YWlucycsIGxhYmVsOiAnbm90IGNvbnRhaW5zJyB9LFxuICAgIHsgaWQ6ICdncmVhdGVyX3RoYW4nLCB2YWx1ZTogJ2dyZWF0ZXJfdGhhbicsIG5hbWU6ICdncmVhdGVyIHRoYW4nLCBsYWJlbDogJ2dyZWF0ZXIgdGhhbicgfSxcbiAgICB7IGlkOiAnbGVzc190aGFuJywgdmFsdWU6ICdsZXNzX3RoYW4nLCBuYW1lOiAnbGVzcyB0aGFuJywgbGFiZWw6ICdsZXNzIHRoYW4nIH1cbiAgXTtcblxuICAvKiogTGlzdCBvZiBhY3Rpb24gdGVtcGxhdGVzIHRvIGRpc3BsYXkgaW4gdmFsdWUgZHJvcGRvd24gKi9cbiAgQElucHV0KCkgY29uZGl0aW9uVGVtcGxhdGVzOiBBY3Rpb25UZW1wbGF0ZVtdID0gW107XG4gIC8qKiBGdW5jdGlvbiB0byBoYW5kbGUgdmFyaWFibGUgcHJvY2Vzc2luZyBvciBjdXN0b20gbG9naWMuIENhbiBiZSBwYXNzZWQgZnJvbSBwYXJlbnQgY29tcG9uZW50LiAqL1xuICBASW5wdXQoKSBzZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlczogKHZhcmlhYmxlczogQWN0aW9uVGVtcGxhdGUpID0+IGFueSA9ICgpID0+IHsgcmV0dXJuIFtdfTtcbiAgLyoqIEZ1bmN0aW9uIHRvIGhhbmRsZSBhZHZhbmNlZCBzZXR0aW5ncyB2YXJpYWJsZXMuIENhbiBiZSBwYXNzZWQgZnJvbSBwYXJlbnQgY29tcG9uZW50LiAqL1xuICBASW5wdXQoKSBzZXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzOiAodGVtcGxhdGU6IEFjdGlvblRlbXBsYXRlLCB0ZXN0U3RlcD86IGFueSkgPT4gYW55W10gPSAoKSA9PiB7IHJldHVybiBbXX07XG5cbiAgLyoqIENlbnRyYWxpc2VkIEhUTUwgZ3JhbW1hciBjb21wdXRhdGlvbiBmdW5jdGlvbi4gUGFzcyBTdGVwQnVpbGRlclNlcnZpY2UuY29tcHV0ZUh0bWxHcmFtbWFyIGZyb20gdGhlIGhvc3QgYXBwLiAqL1xuICBASW5wdXQoKSBjb21wdXRlSHRtbEdyYW1tYXJGbj86ICh0ZW1wbGF0ZTogYW55LCB2YXJpYWJsZXM6IGFueVtdKSA9PiBzdHJpbmc7XG4gIEBJbnB1dCgpIGVsZW1lbnRPcHRpb25zOiBFbGVtZW50W10gPSBbXTsgLy8gRWxlbWVudCBvYmplY3RzIGZvciBlbGVtZW50IGRyb3Bkb3duXG4gIEBJbnB1dCgpIGhhc01vcmVFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBXaGV0aGVyIG1vcmUgZWxlbWVudHMgYXJlIGF2YWlsYWJsZVxuICBASW5wdXQoKSBpc0xvYWRpbmdFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBMb2FkaW5nIHN0YXRlIGZvciBlbGVtZW50c1xuICAvKiogU2NyZWVuIG5hbWUgb3B0aW9ucyBmb3IgZWxlbWVudCBmb3JtIGF1dG9jb21wbGV0ZSAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIHNjcmVlbk5hbWVPcHRpb25zOiB7IGlkPzogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfVtdID0gW107XG4gIC8qKiBXaGV0aGVyIG1vcmUgc2NyZWVuIG5hbWVzIGFyZSBhdmFpbGFibGUgZm9yIGluZmluaXRlIHNjcm9sbCAqL1xuICBASW5wdXQoKSBoYXNNb3JlU2NyZWVuTmFtZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgc2NyZWVuIG5hbWVzIChzZWFyY2ggb3IgbG9hZCBtb3JlKSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdTY3JlZW5OYW1lczogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLyoqIFBhcmFtZXRlciBmZXRjaGluZyBwcm9wZXJ0aWVzICovXG4gIEBJbnB1dCgpIHBhcmFtZXRlck9wdGlvbnM6IGFueVtdID0gW107IC8vIFRlc3REYXRhW10gLSByYXcgdGVzdCBkYXRhIHByb2ZpbGVzXG4gIEBJbnB1dCgpIGhhc01vcmVQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzTG9hZGluZ1BhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIC8qKiBFbnZpcm9ubWVudCBmZXRjaGluZyBwcm9wZXJ0aWVzICovXG4gIEBJbnB1dCgpIGVudmlyb25tZW50T3B0aW9uczogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGVudmlyb25tZW50OiBzdHJpbmcgfVtdID0gW107XG4gIEBJbnB1dCgpIGhhc01vcmVFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNMb2FkaW5nRW52aXJvbm1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvKiogRGVmYXVsdCB0ZXN0IGRhdGEgcHJvZmlsZSBwcm9wZXJ0aWVzICovXG4gIEBJbnB1dCgpIGRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlcjtcbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleD86IG51bWJlcjtcbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhRW5kSW5kZXg/OiBudW1iZXI7XG4gIEBJbnB1dCgpIGlzSW5zaWRlRm9yTG9vcFN0ZXA6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgY3JlYXRpbmcgdGhlIHN0ZXAgKEFQSSBpbiBwcm9ncmVzcyk7IHNob3cgbG9hZGVyIG9uIENyZWF0ZSBTdGVwIGJ1dHRvbiAqL1xuICBASW5wdXQoKSBpc0NyZWF0aW5nU3RlcDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBFbWl0IHdoZW4gc3RlcCBpcyBjcmVhdGVkICovXG4gIEBPdXRwdXQoKSBjcmVhdGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxDb25kaXRpb25Gb3JtRGF0YT4oKTtcblxuICAvKiogRW1pdCB3aGVuIGNhbmNlbGxlZCAqL1xuICBAT3V0cHV0KCkgY2FuY2VsbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbG9hZE1vcmVFbGVtZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIGxvYWQgbW9yZSBpcyByZXF1ZXN0ZWRcbiAgQE91dHB1dCgpIHNlYXJjaEVsZW1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciBlbGVtZW50c1xuICBAT3V0cHV0KCkgc2VhcmNoRWxlbWVudHNCeVNjcmVlbk5hbWUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc2NyZWVuTmFtZUlkOiBudW1iZXI7IHNlYXJjaFRlcm0/OiBzdHJpbmcgfT4oKTsgLy8gRW1pdCB3aGVuIHNjcmVlbiBuYW1lIGlzIHNlbGVjdGVkIHRvIGZldGNoIGVsZW1lbnRzIGZpbHRlcmVkIGJ5IHNjcmVlbiBuYW1lXG4gIEBPdXRwdXQoKSBjcmVhdGVFbGVtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7IC8vIEVtaXQgd2hlbiBlbGVtZW50IGlzIGNyZWF0ZWRcbiAgQE91dHB1dCgpIHNlYXJjaFNjcmVlbk5hbWUgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgc2NyZWVuIG5hbWVzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZVNjcmVlbk5hbWVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIHNjcmVlbiBuYW1lc1xuICBAT3V0cHV0KCkgY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgcmVxdWVzdHMgdG8gY3JlYXRlIGEgbmV3IHNjcmVlbiBuYW1lXG4gIEBPdXRwdXQoKSBzZWFyY2hQYXJhbWV0ZXJzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciBwYXJhbWV0ZXJzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZVBhcmFtZXRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIHBhcmFtZXRlcnNcbiAgQE91dHB1dCgpIHNlYXJjaEVudmlyb25tZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgZW52aXJvbm1lbnRzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZUVudmlyb25tZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgZW52aXJvbm1lbnRzXG4gIEBPdXRwdXQoKSByZWRpcmVjdFRvUGFyYW1ldGVyID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVkaXJlY3RUb0Vudmlyb25tZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGNvbmRpdGlvbkZvcm06IEZvcm1Hcm91cDtcbiAgaW5jbHVkZUVsc2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIC8vIENhY2hlIGZvciB2YWx1ZSBjb25maWdzIHRvIGF2b2lkIHJlY3JlYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICBwcml2YXRlIHZhbHVlQ29uZmlnQ2FjaGU6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBcbiAgLy8gQ2FjaGUgZm9yIG9wZXJhdG9yIGNvbmZpZ3MgKHN0YXRpYywgbm8gbmVlZCB0byByZWNyZWF0ZSlcbiAgcHJpdmF0ZSBvcGVyYXRvckNvbmZpZ0NhY2hlOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgfCBudWxsID0gbnVsbDtcbiAgXG4gIC8vIENhY2hlIGZvciB2YWx1ZSBjb25maWdzIHdpdGggb25DaGFuZ2UgaGFuZGxlcnMgcGVyIGluZGV4XG4gIHByaXZhdGUgdmFsdWVDb25maWdzV2l0aEhhbmRsZXJzOiBNYXA8bnVtYmVyLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gVHJhY2sgc2VsZWN0ZWQgdGVtcGxhdGVzIGFuZCB0aGVpciB2YXJpYWJsZXMgZm9yIGVhY2ggY29uZGl0aW9uIHJvd1xuICBwcml2YXRlIHNlbGVjdGVkVGVtcGxhdGVzOiBNYXA8bnVtYmVyLCBBY3Rpb25UZW1wbGF0ZT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXM6IE1hcDxudW1iZXIsIGFueVtdPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBjb25kaXRpb25WYXJpYWJsZXNGb3JtczogTWFwPG51bWJlciwgRm9ybUFycmF5PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBjb25kaXRpb25VcGRhdGVkSHRtbEdyYW1tYXI6IE1hcDxudW1iZXIsIHN0cmluZz4gPSBuZXcgTWFwKCk7IC8vIFVwZGF0ZWQgSFRNTCBncmFtbWFyIHBlciBjb25kaXRpb25cbiAgXG4gIC8vIEFkdmFuY2VkIHNldHRpbmdzIHZhcmlhYmxlcyBwZXIgY29uZGl0aW9uXG4gIHByaXZhdGUgY29uZGl0aW9uQWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogTWFwPG51bWJlciwgYW55W10+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGNvbmRpdGlvbkFkdmFuY2VkVmFyaWFibGVzRm9ybXM6IE1hcDxudW1iZXIsIEZvcm1BcnJheT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgY29uZGl0aW9uQWR2YW5jZWRFeHBhbmRlZDogTWFwPG51bWJlciwgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgY29uZGl0aW9uIGZvcm0gZ3JvdXBzIHRvIGF2b2lkIHJlcGVhdGVkIGxvb2t1cHNcbiAgcHJpdmF0ZSBjb25kaXRpb25Gb3JtR3JvdXBDYWNoZTogTWFwPG51bWJlciwgRm9ybUdyb3VwPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgdGhpcy5jb25kaXRpb25Gb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBjb25kaXRpb25zOiB0aGlzLmZiLmFycmF5KFtdKSxcbiAgICAgIGluY2x1ZGVFbHNlOiBbZmFsc2VdXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBBZGQgaW5pdGlhbCBjb25kaXRpb24gcm93XG4gICAgdGhpcy5hZGRDb25kaXRpb24oXCJDT05ESVRJT05fSUZcIik7XG4gICAgLy8gSW5pdGlhbGl6ZSBjb25maWcgY2FjaGVzXG4gICAgdGhpcy51cGRhdGVWYWx1ZUNvbmZpZ0NhY2hlKCk7XG4gICAgdGhpcy51cGRhdGVPcGVyYXRvckNvbmZpZ0NhY2hlKCk7XG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gUmVnZW5lcmF0ZSB2YWx1ZSBjb25maWcgY2FjaGUgd2hlbiBjb25kaXRpb25UZW1wbGF0ZXMgY2hhbmdlc1xuICAgIGlmIChjaGFuZ2VzWydjb25kaXRpb25UZW1wbGF0ZXMnXSAmJiAhY2hhbmdlc1snY29uZGl0aW9uVGVtcGxhdGVzJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMudXBkYXRlVmFsdWVDb25maWdDYWNoZSgpO1xuICAgICAgLy8gQ2xlYXIgdmFsdWUgY29uZmlncyB3aXRoIGhhbmRsZXJzIHNpbmNlIGJhc2UgY29uZmlnIGNoYW5nZWRcbiAgICAgIHRoaXMudmFsdWVDb25maWdzV2l0aEhhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxuICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIFxuICBwcml2YXRlIHVwZGF0ZU9wZXJhdG9yQ29uZmlnQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVyYXRvckNvbmZpZ0NhY2hlID0ge1xuICAgICAga2V5OiAnb3BlcmF0b3InLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3Qgb3BlcmF0b3InLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiB0aGlzLm9wZXJhdG9yT3B0aW9uc1xuICAgIH07XG4gIH1cblxuICBnZXQgY29uZGl0aW9uc0Zvcm1BcnJheSgpOiBGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbkZvcm0uZ2V0KCdjb25kaXRpb25zJykgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgYWRkQ29uZGl0aW9uKGNvbmRpdGlvblR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvbmRpdGlvbkdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBmaWVsZDogW2NvbmRpdGlvblR5cGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgb3BlcmF0b3I6IFsnZXF1YWxzJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICB2YWx1ZTogW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLCAvLyBXaWxsIHN0b3JlIHRlbXBsYXRlIElELCB0aGVuIG1hcCB0byBBY3Rpb25UZW1wbGF0ZVxuICAgICAgZGVzY3JpcHRpb246IFsnJ10sXG4gICAgICBtZXRhZGF0YTogWycnXSxcbiAgICB9KTtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuY29uZGl0aW9uc0Zvcm1BcnJheS5sZW5ndGg7XG4gICAgdGhpcy5jb25kaXRpb25zRm9ybUFycmF5LnB1c2goY29uZGl0aW9uR3JvdXApO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgdmFyaWFibGVzIGZvcm0gZm9yIHRoaXMgY29uZGl0aW9uIChGb3JtQXJyYXkpXG4gICAgdGhpcy5jb25kaXRpb25WYXJpYWJsZXNGb3Jtcy5zZXQoaW5kZXgsIHRoaXMuZmIuYXJyYXkoW10pKTtcbiAgICBcbiAgICAvLyBDYWNoZSB0aGUgZm9ybSBncm91cFxuICAgIHRoaXMuY29uZGl0aW9uRm9ybUdyb3VwQ2FjaGUuc2V0KGluZGV4LCBjb25kaXRpb25Hcm91cCk7XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZW1vdmVDb25kaXRpb24oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmRpdGlvbnNGb3JtQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5jb25kaXRpb25zRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgICAgIC8vIENsZWFuIHVwIGFzc29jaWF0ZWQgZGF0YVxuICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlcy5kZWxldGUoaW5kZXgpO1xuICAgICAgdGhpcy5jb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcy5kZWxldGUoaW5kZXgpO1xuICAgICAgdGhpcy5jb25kaXRpb25WYXJpYWJsZXNGb3Jtcy5kZWxldGUoaW5kZXgpO1xuICAgICAgdGhpcy5jb25kaXRpb25Gb3JtR3JvdXBDYWNoZS5kZWxldGUoaW5kZXgpO1xuICAgICAgdGhpcy52YWx1ZUNvbmZpZ3NXaXRoSGFuZGxlcnMuZGVsZXRlKGluZGV4KTtcbiAgICAgIFxuICAgICAgLy8gUmVpbmRleCByZW1haW5pbmcgY29uZGl0aW9uc1xuICAgICAgdGhpcy5yZWluZGV4Q29uZGl0aW9uRGF0YShpbmRleCk7XG4gICAgICBcbiAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIHJlaW5kZXhDb25kaXRpb25EYXRhKHJlbW92ZWRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIG5ldyBtYXBzIHdpdGggcmVpbmRleGVkIGRhdGFcbiAgICBjb25zdCBuZXdTZWxlY3RlZFRlbXBsYXRlcyA9IG5ldyBNYXA8bnVtYmVyLCBBY3Rpb25UZW1wbGF0ZT4oKTtcbiAgICBjb25zdCBuZXdUZW1wbGF0ZVZhcmlhYmxlcyA9IG5ldyBNYXA8bnVtYmVyLCBhbnlbXT4oKTtcbiAgICBjb25zdCBuZXdWYXJpYWJsZXNGb3JtcyA9IG5ldyBNYXA8bnVtYmVyLCBGb3JtQXJyYXk+KCk7XG4gICAgY29uc3QgbmV3Rm9ybUdyb3VwQ2FjaGUgPSBuZXcgTWFwPG51bWJlciwgRm9ybUdyb3VwPigpO1xuICAgIGNvbnN0IG5ld1ZhbHVlQ29uZmlncyA9IG5ldyBNYXA8bnVtYmVyLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+KCk7XG4gICAgY29uc3QgbmV3VXBkYXRlZEh0bWxHcmFtbWFyID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcbiAgICBjb25zdCBuZXdBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gbmV3IE1hcDxudW1iZXIsIGFueVtdPigpO1xuICAgIGNvbnN0IG5ld0FkdmFuY2VkVmFyaWFibGVzRm9ybXMgPSBuZXcgTWFwPG51bWJlciwgRm9ybUFycmF5PigpO1xuICAgIGNvbnN0IG5ld0FkdmFuY2VkRXhwYW5kZWQgPSBuZXcgTWFwPG51bWJlciwgYm9vbGVhbj4oKTtcbiAgICBcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGVzLmZvckVhY2goKHRlbXBsYXRlLCBvbGRJbmRleCkgPT4ge1xuICAgICAgaWYgKG9sZEluZGV4IDwgcmVtb3ZlZEluZGV4KSB7XG4gICAgICAgIG5ld1NlbGVjdGVkVGVtcGxhdGVzLnNldChvbGRJbmRleCwgdGVtcGxhdGUpO1xuICAgICAgfSBlbHNlIGlmIChvbGRJbmRleCA+IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdTZWxlY3RlZFRlbXBsYXRlcy5zZXQob2xkSW5kZXggLSAxLCB0ZW1wbGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy5jb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZXMsIG9sZEluZGV4KSA9PiB7XG4gICAgICBpZiAob2xkSW5kZXggPCByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3VGVtcGxhdGVWYXJpYWJsZXMuc2V0KG9sZEluZGV4LCB2YXJpYWJsZXMpO1xuICAgICAgfSBlbHNlIGlmIChvbGRJbmRleCA+IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdUZW1wbGF0ZVZhcmlhYmxlcy5zZXQob2xkSW5kZXggLSAxLCB2YXJpYWJsZXMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuY29uZGl0aW9uVmFyaWFibGVzRm9ybXMuZm9yRWFjaCgoZm9ybSwgb2xkSW5kZXgpID0+IHtcbiAgICAgIGlmIChvbGRJbmRleCA8IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdWYXJpYWJsZXNGb3Jtcy5zZXQob2xkSW5kZXgsIGZvcm0pO1xuICAgICAgfSBlbHNlIGlmIChvbGRJbmRleCA+IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdWYXJpYWJsZXNGb3Jtcy5zZXQob2xkSW5kZXggLSAxLCBmb3JtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLmNvbmRpdGlvbkZvcm1Hcm91cENhY2hlLmZvckVhY2goKGZvcm1Hcm91cCwgb2xkSW5kZXgpID0+IHtcbiAgICAgIGlmIChvbGRJbmRleCA8IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdGb3JtR3JvdXBDYWNoZS5zZXQob2xkSW5kZXgsIGZvcm1Hcm91cCk7XG4gICAgICB9IGVsc2UgaWYgKG9sZEluZGV4ID4gcmVtb3ZlZEluZGV4KSB7XG4gICAgICAgIG5ld0Zvcm1Hcm91cENhY2hlLnNldChvbGRJbmRleCAtIDEsIGZvcm1Hcm91cCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy52YWx1ZUNvbmZpZ3NXaXRoSGFuZGxlcnMuZm9yRWFjaCgoY29uZmlnLCBvbGRJbmRleCkgPT4ge1xuICAgICAgaWYgKG9sZEluZGV4IDwgcmVtb3ZlZEluZGV4KSB7XG4gICAgICAgIG5ld1ZhbHVlQ29uZmlncy5zZXQob2xkSW5kZXgsIGNvbmZpZyk7XG4gICAgICB9IGVsc2UgaWYgKG9sZEluZGV4ID4gcmVtb3ZlZEluZGV4KSB7XG4gICAgICAgIC8vIFJlY3JlYXRlIGNvbmZpZyB3aXRoIG5ldyBpbmRleCBmb3Igb25DaGFuZ2UgaGFuZGxlclxuICAgICAgICBjb25zdCBuZXdDb25maWcgPSB7XG4gICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblRlbXBsYXRlVmFsdWVDaGFuZ2Uob2xkSW5kZXggLSAxLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBuZXdWYWx1ZUNvbmZpZ3Muc2V0KG9sZEluZGV4IC0gMSwgbmV3Q29uZmlnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLmNvbmRpdGlvblVwZGF0ZWRIdG1sR3JhbW1hci5mb3JFYWNoKChncmFtbWFyLCBvbGRJbmRleCkgPT4ge1xuICAgICAgaWYgKG9sZEluZGV4IDwgcmVtb3ZlZEluZGV4KSB7XG4gICAgICAgIG5ld1VwZGF0ZWRIdG1sR3JhbW1hci5zZXQob2xkSW5kZXgsIGdyYW1tYXIpO1xuICAgICAgfSBlbHNlIGlmIChvbGRJbmRleCA+IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdVcGRhdGVkSHRtbEdyYW1tYXIuc2V0KG9sZEluZGV4IC0gMSwgZ3JhbW1hcik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy5jb25kaXRpb25BZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlcywgb2xkSW5kZXgpID0+IHtcbiAgICAgIGlmIChvbGRJbmRleCA8IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLnNldChvbGRJbmRleCwgdmFyaWFibGVzKTtcbiAgICAgIH0gZWxzZSBpZiAob2xkSW5kZXggPiByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5zZXQob2xkSW5kZXggLSAxLCB2YXJpYWJsZXMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuY29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZXNGb3Jtcy5mb3JFYWNoKChmb3JtLCBvbGRJbmRleCkgPT4ge1xuICAgICAgaWYgKG9sZEluZGV4IDwgcmVtb3ZlZEluZGV4KSB7XG4gICAgICAgIG5ld0FkdmFuY2VkVmFyaWFibGVzRm9ybXMuc2V0KG9sZEluZGV4LCBmb3JtKTtcbiAgICAgIH0gZWxzZSBpZiAob2xkSW5kZXggPiByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3QWR2YW5jZWRWYXJpYWJsZXNGb3Jtcy5zZXQob2xkSW5kZXggLSAxLCBmb3JtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLmNvbmRpdGlvbkFkdmFuY2VkRXhwYW5kZWQuZm9yRWFjaCgoZXhwYW5kZWQsIG9sZEluZGV4KSA9PiB7XG4gICAgICBpZiAob2xkSW5kZXggPCByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3QWR2YW5jZWRFeHBhbmRlZC5zZXQob2xkSW5kZXgsIGV4cGFuZGVkKTtcbiAgICAgIH0gZWxzZSBpZiAob2xkSW5kZXggPiByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3QWR2YW5jZWRFeHBhbmRlZC5zZXQob2xkSW5kZXggLSAxLCBleHBhbmRlZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlcyA9IG5ld1NlbGVjdGVkVGVtcGxhdGVzO1xuICAgIHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMgPSBuZXdUZW1wbGF0ZVZhcmlhYmxlcztcbiAgICB0aGlzLmNvbmRpdGlvblZhcmlhYmxlc0Zvcm1zID0gbmV3VmFyaWFibGVzRm9ybXM7XG4gICAgdGhpcy5jb25kaXRpb25Gb3JtR3JvdXBDYWNoZSA9IG5ld0Zvcm1Hcm91cENhY2hlO1xuICAgIHRoaXMudmFsdWVDb25maWdzV2l0aEhhbmRsZXJzID0gbmV3VmFsdWVDb25maWdzO1xuICAgIHRoaXMuY29uZGl0aW9uVXBkYXRlZEh0bWxHcmFtbWFyID0gbmV3VXBkYXRlZEh0bWxHcmFtbWFyO1xuICAgIHRoaXMuY29uZGl0aW9uQWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyA9IG5ld0FkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM7XG4gICAgdGhpcy5jb25kaXRpb25BZHZhbmNlZFZhcmlhYmxlc0Zvcm1zID0gbmV3QWR2YW5jZWRWYXJpYWJsZXNGb3JtcztcbiAgICB0aGlzLmNvbmRpdGlvbkFkdmFuY2VkRXhwYW5kZWQgPSBuZXdBZHZhbmNlZEV4cGFuZGVkO1xuICB9XG5cbiAgZ2V0T3BlcmF0b3JDb25maWcoaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCBjb25maWcgKHN0YXRpYywgc2FtZSBmb3IgYWxsIGNvbmRpdGlvbnMpXG4gICAgaWYgKCF0aGlzLm9wZXJhdG9yQ29uZmlnQ2FjaGUpIHtcbiAgICAgIHRoaXMudXBkYXRlT3BlcmF0b3JDb25maWdDYWNoZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvckNvbmZpZ0NhY2hlITtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVmFsdWVDb25maWdDYWNoZSgpOiB2b2lkIHtcbiAgICAvLyBDb252ZXJ0IEFjdGlvblRlbXBsYXRlW10gdG8gU2VsZWN0T3B0aW9uW11cbiAgICBjb25zdCB0ZW1wbGF0ZU9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gKHRoaXMuY29uZGl0aW9uVGVtcGxhdGVzIHx8IFtdKS5tYXAodGVtcGxhdGUgPT4gKHtcbiAgICAgIGlkOiB0ZW1wbGF0ZS5pZD8udG9TdHJpbmcoKSB8fCB0ZW1wbGF0ZS5kaXNwbGF5TmFtZSB8fCAnJyxcbiAgICAgIHZhbHVlOiB0ZW1wbGF0ZS5pZD8udG9TdHJpbmcoKSB8fCB0ZW1wbGF0ZS5kaXNwbGF5TmFtZSB8fCAnJyxcbiAgICAgIG5hbWU6IHRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8IHRlbXBsYXRlLm5hdHVyYWxUZXh0IHx8ICcnLFxuICAgICAgbGFiZWw6IHRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8IHRlbXBsYXRlLm5hdHVyYWxUZXh0IHx8ICcnXG4gICAgfSkpO1xuXG4gICAgdGhpcy52YWx1ZUNvbmZpZ0NhY2hlID0ge1xuICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgVGVtcGxhdGUqJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBkaXNwbGF5TGFiZWxBc0lubmVySHRtbDogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IHRlbXBsYXRlT3B0aW9uc1xuICAgIH07XG4gIH1cblxuICBnZXRWYWx1ZUNvbmZpZyhpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIGNvbmZpZyB3aXRoIGhhbmRsZXIgdG8gYXZvaWQgcmVjcmVhdGluZyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgaWYgKHRoaXMudmFsdWVDb25maWdzV2l0aEhhbmRsZXJzLmhhcyhpbmRleCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlQ29uZmlnc1dpdGhIYW5kbGVycy5nZXQoaW5kZXgpITtcbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIGJhc2UgY29uZmlnIGNhY2hlIGV4aXN0c1xuICAgIGlmICghdGhpcy52YWx1ZUNvbmZpZ0NhY2hlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlQ29uZmlnQ2FjaGUoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIGFuZCBjYWNoZSBjb25maWcgd2l0aCBvbkNoYW5nZSBoYW5kbGVyIGZvciB0aGlzIHNwZWNpZmljIGluZGV4XG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICAuLi50aGlzLnZhbHVlQ29uZmlnQ2FjaGUhLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25UZW1wbGF0ZVZhbHVlQ2hhbmdlKGluZGV4LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnZhbHVlQ29uZmlnc1dpdGhIYW5kbGVycy5zZXQoaW5kZXgsIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBcbiAgb25UZW1wbGF0ZVZhbHVlQ2hhbmdlKGluZGV4OiBudW1iZXIsIHRlbXBsYXRlSWQ6IGFueSk6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIHNlbGVjdGVkIHRlbXBsYXRlXG4gICAgY29uc3Qgc2VsZWN0ZWRUZW1wbGF0ZSA9IHRoaXMuY29uZGl0aW9uVGVtcGxhdGVzLmZpbmQoXG4gICAgICB0ID0+ICh0LmlkPy50b1N0cmluZygpID09PSB0ZW1wbGF0ZUlkKSB8fCAodC5kaXNwbGF5TmFtZSA9PT0gdGVtcGxhdGVJZClcbiAgICApO1xuICAgIFxuICAgIGlmIChzZWxlY3RlZFRlbXBsYXRlICYmIHRoaXMuc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMpIHtcbiAgICAgIC8vIFN0b3JlIHNlbGVjdGVkIHRlbXBsYXRlXG4gICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGVzLnNldChpbmRleCwgc2VsZWN0ZWRUZW1wbGF0ZSk7XG4gICAgICBcbiAgICAgIC8vIEdldCB0ZW1wbGF0ZSB2YXJpYWJsZXMgdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gICAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKHNlbGVjdGVkVGVtcGxhdGUpO1xuICAgICAgdGhpcy5jb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcy5zZXQoaW5kZXgsIHZhcmlhYmxlcyk7XG4gICAgICAvLyBCdWlsZCBmb3JtIGZvciB0ZW1wbGF0ZSB2YXJpYWJsZXNcbiAgICAgIHRoaXMuYnVpbGRDb25kaXRpb25WYXJpYWJsZXNGb3JtKGluZGV4LCB2YXJpYWJsZXMpO1xuICAgICAgLy8gSW5pdGlhbGl6ZSB1cGRhdGVkIEhUTUwgZ3JhbW1hclxuICAgICAgdGhpcy51cGRhdGVDb25kaXRpb25IdG1sR3JhbW1hcihpbmRleCk7XG4gICAgICBcbiAgICAgIC8vIEluaXRpYWxpemUgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzXG4gICAgICBpZiAodGhpcy5zZXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzKSB7XG4gICAgICAgIGNvbnN0IGFkdmFuY2VkVmFyaWFibGVzID0gdGhpcy5zZXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzKHNlbGVjdGVkVGVtcGxhdGUpO1xuICAgICAgICB0aGlzLmNvbmRpdGlvbkFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuc2V0KGluZGV4LCBhZHZhbmNlZFZhcmlhYmxlcyk7XG4gICAgICAgIHRoaXMuYnVpbGRDb25kaXRpb25BZHZhbmNlZFZhcmlhYmxlc0Zvcm0oaW5kZXgsIGFkdmFuY2VkVmFyaWFibGVzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2xlYXIgdGVtcGxhdGUgYW5kIHZhcmlhYmxlcyBpZiBubyB0ZW1wbGF0ZSBzZWxlY3RlZFxuICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlcy5kZWxldGUoaW5kZXgpO1xuICAgICAgdGhpcy5jb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcy5kZWxldGUoaW5kZXgpO1xuICAgICAgdGhpcy5jb25kaXRpb25VcGRhdGVkSHRtbEdyYW1tYXIuZGVsZXRlKGluZGV4KTtcbiAgICAgIHRoaXMuY29uZGl0aW9uQWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5kZWxldGUoaW5kZXgpO1xuICAgICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5jb25kaXRpb25WYXJpYWJsZXNGb3Jtcy5nZXQoaW5kZXgpO1xuICAgICAgaWYgKGZvcm1BcnJheSkge1xuICAgICAgICB3aGlsZSAoZm9ybUFycmF5Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgIGZvcm1BcnJheS5yZW1vdmVBdCgwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgYWR2YW5jZWRGb3JtQXJyYXkgPSB0aGlzLmNvbmRpdGlvbkFkdmFuY2VkVmFyaWFibGVzRm9ybXMuZ2V0KGluZGV4KTtcbiAgICAgIGlmIChhZHZhbmNlZEZvcm1BcnJheSkge1xuICAgICAgICB3aGlsZSAoYWR2YW5jZWRGb3JtQXJyYXkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgYWR2YW5jZWRGb3JtQXJyYXkucmVtb3ZlQXQoMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgXG4gIHByaXZhdGUgYnVpbGRDb25kaXRpb25WYXJpYWJsZXNGb3JtKGluZGV4OiBudW1iZXIsIHZhcmlhYmxlczogYW55W10pOiB2b2lkIHtcbiAgICBsZXQgZm9ybUFycmF5ID0gdGhpcy5jb25kaXRpb25WYXJpYWJsZXNGb3Jtcy5nZXQoaW5kZXgpO1xuICAgIGlmICghZm9ybUFycmF5KSB7XG4gICAgICBmb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KFtdKTtcbiAgICAgIHRoaXMuY29uZGl0aW9uVmFyaWFibGVzRm9ybXMuc2V0KGluZGV4LCBmb3JtQXJyYXkpO1xuICAgIH1cbiAgICBcbiAgICAvLyBFbnN1cmUgZm9ybUFycmF5IGlzIG5vdCB1bmRlZmluZWQgKFR5cGVTY3JpcHQgZ3VhcmQpXG4gICAgaWYgKCFmb3JtQXJyYXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gU3RvcmUgcmVmZXJlbmNlIHRvIGF2b2lkIFR5cGVTY3JpcHQgaXNzdWVzIGluIGZvckVhY2ggY2FsbGJhY2tcbiAgICAvLyBUeXBlU2NyaXB0IGtub3dzIGZvcm1BcnJheSBpcyBkZWZpbmVkIGhlcmUgZHVlIHRvIHRoZSBlYXJseSByZXR1cm4gYWJvdmVcbiAgICBjb25zdCBmb3JtQXJyYXlSZWY6IEZvcm1BcnJheSA9IGZvcm1BcnJheTtcbiAgICBcbiAgICAvLyBDbGVhciBleGlzdGluZyBmb3JtIGFycmF5XG4gICAgd2hpbGUgKGZvcm1BcnJheVJlZi5sZW5ndGggIT09IDApIHtcbiAgICAgIGZvcm1BcnJheVJlZi5yZW1vdmVBdCgwKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQWRkIGZvcm0gZ3JvdXBzIGZvciBlYWNoIHZhcmlhYmxlXG4gICAgdmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gdmFyaWFibGVzIC0gdXNlIGJvb2xlYW4gdmFsdWUsIG90aGVycyB1c2Ugc3RyaW5nXG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbicgXG4gICAgICAgID8gKHZhcmlhYmxlLnZhbHVlID09PSB0cnVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAndHJ1ZScgfHwgdmFyaWFibGUudmFsdWUgPT09IDEpXG4gICAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIGEgRm9ybUdyb3VwIGZvciBlYWNoIHZhcmlhYmxlIHdpdGggbmFtZSBhbmQgdmFsdWVcbiAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmFtZTogW3ZhcmlhYmxlLm5hbWVdLFxuICAgICAgICB2YWx1ZTogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICAgIHR5cGU6IFt2YXJpYWJsZS50eXBlIHx8ICdzdHJpbmcnXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZS5sYWJlbCB8fCAnJ10sXG4gICAgICAgIG9wdGlvbnM6IFt2YXJpYWJsZS5vcHRpb25zIHx8IFtdXVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIEFkZCBkYXRhVHlwZSBjb250cm9sIGZvciB0ZXN0LWRhdGEgdmFyaWFibGVzIGlmIG5lZWRlZFxuICAgICAgY29uc3QgbGFiZWwgPSB2YXJpYWJsZS5sYWJlbD8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIGlmIChsYWJlbCA9PT0gJ3Rlc3QtZGF0YScgfHwgbGFiZWwgPT09ICdzb3VyY2UtdmFsdWUnIHx8IGxhYmVsID09PSAndGFyZ2V0LXZhbHVlJyB8fCBcbiAgICAgICAgICBsYWJlbCA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgbGFiZWwgPT09ICd0YXJnZXRfdmFsdWUnKSB7XG4gICAgICAgIC8vIFBhcnNlIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgZGF0YSB0eXBlXG4gICAgICAgIGNvbnN0IHZhbHVlU3RyID0gU3RyaW5nKGRlZmF1bHRWYWx1ZSB8fCAnJyk7XG4gICAgICAgIGxldCBkYXRhVHlwZSA9ICdwbGFpbi10ZXh0JztcbiAgICAgICAgaWYgKHZhbHVlU3RyLnN0YXJ0c1dpdGgoJ0B8JykgJiYgdmFsdWVTdHIuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgICAgIGRhdGFUeXBlID0gJ3BhcmFtZXRlcic7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVTdHIuc3RhcnRzV2l0aCgnJHwnKSAmJiB2YWx1ZVN0ci5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICAgICAgZGF0YVR5cGUgPSAncnVudGltZSc7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVTdHIuc3RhcnRzV2l0aCgnKnwnKSAmJiB2YWx1ZVN0ci5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICAgICAgZGF0YVR5cGUgPSAnZW52aXJvbm1lbnQnO1xuICAgICAgICB9XG4gICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnZGF0YVR5cGUnLCBuZXcgRm9ybUNvbnRyb2woZGF0YVR5cGUpKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgZm9ybUFycmF5UmVmLnB1c2godmFyaWFibGVHcm91cCk7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSB1cGRhdGVkIEhUTUwgZ3JhbW1hciBmb3IgdGhpcyBjb25kaXRpb25cbiAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvbkh0bWxHcmFtbWFyKGluZGV4KTtcbiAgfVxuICBcbiAgZ2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMoaW5kZXg6IG51bWJlcik6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcy5nZXQoaW5kZXgpIHx8IFtdO1xuICB9XG4gIFxuICBnZXRDb25kaXRpb25WYXJpYWJsZXNGb3JtKGluZGV4OiBudW1iZXIpOiBGb3JtQXJyYXkge1xuICAgIGxldCBmb3JtQXJyYXkgPSB0aGlzLmNvbmRpdGlvblZhcmlhYmxlc0Zvcm1zLmdldChpbmRleCk7XG4gICAgaWYgKCFmb3JtQXJyYXkpIHtcbiAgICAgIGZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoW10pO1xuICAgICAgdGhpcy5jb25kaXRpb25WYXJpYWJsZXNGb3Jtcy5zZXQoaW5kZXgsIGZvcm1BcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtQXJyYXk7XG4gIH1cbiAgXG4gIGdldENvbmRpdGlvbkZvcm1Hcm91cEF0KGluZGV4OiBudW1iZXIsIHZhcmlhYmxlSW5kZXg6IG51bWJlcik6IEZvcm1Hcm91cCB7XG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5nZXRDb25kaXRpb25WYXJpYWJsZXNGb3JtKGluZGV4KTtcbiAgICByZXR1cm4gZm9ybUFycmF5LmF0KHZhcmlhYmxlSW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgfVxuICBcbiAgZ2V0Q29uZGl0aW9uVXBkYXRlZEh0bWxHcmFtbWFyKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlcy5nZXQoaW5kZXgpO1xuICAgIGlmICghdGVtcGxhdGUpIHJldHVybiAnJztcbiAgICByZXR1cm4gdGhpcy5jb25kaXRpb25VcGRhdGVkSHRtbEdyYW1tYXIuZ2V0KGluZGV4KSB8fCB0ZW1wbGF0ZS5odG1sR3JhbW1hciB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJztcbiAgfVxuICBcbiAgZ2V0U2VsZWN0ZWRUZW1wbGF0ZShpbmRleDogbnVtYmVyKTogQWN0aW9uVGVtcGxhdGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRlbXBsYXRlcy5nZXQoaW5kZXgpIHx8IG51bGw7XG4gIH1cbiAgXG4gIGdldFNlbGVjdENvbmZpZ0ZvclZhcmlhYmxlKGluZGV4OiBudW1iZXIsIHZhcmlhYmxlOiBhbnkpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gKHZhcmlhYmxlLm9wdGlvbnMgfHwgW10pLm1hcCgob3B0OiBzdHJpbmcpID0+ICh7XG4gICAgICBpZDogb3B0LFxuICAgICAgdmFsdWU6IG9wdCxcbiAgICAgIG5hbWU6IG9wdCxcbiAgICAgIGxhYmVsOiBvcHRcbiAgICB9KSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAga2V5OiB2YXJpYWJsZS5uYW1lLFxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25Db25kaXRpb25WYXJpYWJsZVZhbHVlQ2hhbmdlKGluZGV4LCB2YXJpYWJsZS5uYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBcbiAgb25Db25kaXRpb25WYXJpYWJsZVZhbHVlQ2hhbmdlKGNvbmRpdGlvbkluZGV4OiBudW1iZXIsIHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMuZ2V0KGNvbmRpdGlvbkluZGV4KSB8fCBbXTtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBhcnJheVxuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuY29uZGl0aW9uVmFyaWFibGVzRm9ybXMuZ2V0KGNvbmRpdGlvbkluZGV4KTtcbiAgICBpZiAoZm9ybUFycmF5KSB7XG4gICAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gZm9ybUFycmF5LmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgICApO1xuICAgICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGZvcm1BcnJheS5hdCh2YXJpYWJsZUluZGV4KS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFVwZGF0ZSBIVE1MIGdyYW1tYXIgZm9yIHRoaXMgY29uZGl0aW9uXG4gICAgdGhpcy51cGRhdGVDb25kaXRpb25IdG1sR3JhbW1hcihjb25kaXRpb25JbmRleCk7XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgXG4gIG9uQ29uZGl0aW9uVmFyaWFibGVJbnB1dENoYW5nZShjb25kaXRpb25JbmRleDogbnVtYmVyLCB2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgdmFyaWFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmNvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzLmdldChjb25kaXRpb25JbmRleCkgfHwgW107XG4gICAgY29uc3QgdmFyaWFibGUgPSB2YXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gY29udHJvbFxuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmNvbmRpdGlvblZhcmlhYmxlc0Zvcm1zLmdldChjb25kaXRpb25JbmRleCk7XG4gICAgaWYgKGZvcm0gJiYgZm9ybS5nZXQodmFyaWFibGVOYW1lKSkge1xuICAgICAgZm9ybS5nZXQodmFyaWFibGVOYW1lKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ29uZGl0aW9uVmFyaWFibGVCb29sZWFuQ2hhbmdlKGNvbmRpdGlvbkluZGV4OiBudW1iZXIsIHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgdmFyaWFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmNvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzLmdldChjb25kaXRpb25JbmRleCkgfHwgW107XG4gICAgY29uc3QgdmFyaWFibGUgPSB2YXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gYXJyYXlcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmNvbmRpdGlvblZhcmlhYmxlc0Zvcm1zLmdldChjb25kaXRpb25JbmRleCk7XG4gICAgaWYgKCFmb3JtQXJyYXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IGZvcm1BcnJheS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgZm9ybUFycmF5LmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIG5ldyBmb3JtIGdyb3VwIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmFtZTogW3ZhcmlhYmxlTmFtZV0sXG4gICAgICAgIHZhbHVlOiBbdmFsdWVdLFxuICAgICAgICB0eXBlOiBbJ2Jvb2xlYW4nXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZT8ubGFiZWwgfHwgJyddLFxuICAgICAgICBvcHRpb25zOiBbdmFyaWFibGU/Lm9wdGlvbnMgfHwgW11dXG4gICAgICB9KTtcbiAgICAgIC8vIGZvcm1BcnJheSBpcyBndWFyYW50ZWVkIHRvIGJlIGRlZmluZWQgaGVyZSBkdWUgdG8gdGhlIGVhcmx5IHJldHVybiBhYm92ZVxuICAgICAgZm9ybUFycmF5LnB1c2godmFyaWFibGVHcm91cCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFVwZGF0ZSBIVE1MIGdyYW1tYXIgZm9yIHRoaXMgY29uZGl0aW9uXG4gICAgdGhpcy51cGRhdGVDb25kaXRpb25IdG1sR3JhbW1hcihjb25kaXRpb25JbmRleCk7XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTdHJpcCBIVE1MIHRhZ3MgZnJvbSBhIHN0cmluZyBmb3Igc2VhcmNoIGZ1bmN0aW9uYWxpdHlcbiAgICovXG4gIHByaXZhdGUgc3RyaXBIdG1sVGFncyhodG1sU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghaHRtbFN0cmluZykgcmV0dXJuICcnO1xuICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBkaXYgZWxlbWVudCB0byBwYXJzZSBIVE1MXG4gICAgY29uc3QgdG1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgdG1wLmlubmVySFRNTCA9IGh0bWxTdHJpbmc7XG4gICAgcmV0dXJuIHRtcC50ZXh0Q29udGVudCB8fCB0bXAuaW5uZXJUZXh0IHx8ICcnO1xuICB9XG4gIFxuICAvKipcbiAgICogVXBkYXRlIEhUTUwgZ3JhbW1hciBmb3IgYSBzcGVjaWZpYyBjb25kaXRpb24gd2l0aCBhY3R1YWwgdmFyaWFibGUgdmFsdWVzLlxuICAgKiBEZWxlZ2F0ZXMgdG8gY29tcHV0ZUh0bWxHcmFtbWFyRm4gd2hlbiBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHAgKGNlbnRyYWxpc2VkIGxvZ2ljIGluIFN0ZXBCdWlsZGVyU2VydmljZSkuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUNvbmRpdGlvbkh0bWxHcmFtbWFyKGNvbmRpdGlvbkluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZXMuZ2V0KGNvbmRpdGlvbkluZGV4KTtcbiAgICBpZiAoIXRlbXBsYXRlIHx8ICF0ZW1wbGF0ZS5odG1sR3JhbW1hcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMuZ2V0KGNvbmRpdGlvbkluZGV4KSB8fCBbXTtcblxuICAgIGlmICh0aGlzLmNvbXB1dGVIdG1sR3JhbW1hckZuKSB7XG4gICAgICB0aGlzLmNvbmRpdGlvblVwZGF0ZWRIdG1sR3JhbW1hci5zZXQoY29uZGl0aW9uSW5kZXgsIHRoaXMuY29tcHV0ZUh0bWxHcmFtbWFyRm4odGVtcGxhdGUsIHZhcmlhYmxlcykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCB1cGRhdGVkR3JhbW1hciA9IHRlbXBsYXRlLmh0bWxHcmFtbWFyO1xuICAgIHZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gbmV3IFJlZ0V4cChgPHNwYW5bXj5dKmRhdGEtZXZlbnQta2V5PVwiJHt2YXJpYWJsZS5uYW1lfVwiW14+XSo+Lio/PC9zcGFuPmAsICdnaScpO1xuICAgICAgY29uc3QgdmFsdWUgPSB2YXJpYWJsZS52YWx1ZSB8fCAnJztcbiAgICAgIC8vIEVzY2FwZSBIVE1MIGluIHZhbHVlIHRvIHByZXZlbnQgWFNTXG4gICAgICBjb25zdCBlc2NhcGVkVmFsdWUgPSBTdHJpbmcodmFsdWUpLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcbiAgICAgIHVwZGF0ZWRHcmFtbWFyID0gdXBkYXRlZEdyYW1tYXIucmVwbGFjZShwbGFjZWhvbGRlciwgZXNjYXBlZFZhbHVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY29uZGl0aW9uVXBkYXRlZEh0bWxHcmFtbWFyLnNldChjb25kaXRpb25JbmRleCwgdXBkYXRlZEdyYW1tYXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENvbmRpdGlvbkFkdmFuY2VkVmFyaWFibGVzRm9ybShpbmRleDogbnVtYmVyLCB2YXJpYWJsZXM6IGFueVtdKTogdm9pZCB7XG4gICAgbGV0IGZvcm1BcnJheSA9IHRoaXMuY29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZXNGb3Jtcy5nZXQoaW5kZXgpO1xuICAgIGlmICghZm9ybUFycmF5KSB7XG4gICAgICBmb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KFtdKTtcbiAgICAgIHRoaXMuY29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZXNGb3Jtcy5zZXQoaW5kZXgsIGZvcm1BcnJheSk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGZvcm1BcnJheSBpcyBub3QgdW5kZWZpbmVkIChUeXBlU2NyaXB0IGd1YXJkKVxuICAgIGlmICghZm9ybUFycmF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RvcmUgcmVmZXJlbmNlIHRvIGF2b2lkIFR5cGVTY3JpcHQgaXNzdWVzIGluIGZvckVhY2ggY2FsbGJhY2tcbiAgICBjb25zdCBmb3JtQXJyYXlSZWY6IEZvcm1BcnJheSA9IGZvcm1BcnJheTtcblxuICAgIC8vIENsZWFyIGV4aXN0aW5nIGZvcm0gYXJyYXlcbiAgICB3aGlsZSAoZm9ybUFycmF5UmVmLmxlbmd0aCAhPT0gMCkge1xuICAgICAgZm9ybUFycmF5UmVmLnJlbW92ZUF0KDApO1xuICAgIH1cblxuICAgIC8vIEFkZCBmb3JtIGdyb3VwcyBmb3IgZWFjaCBhZHZhbmNlZCB2YXJpYWJsZVxuICAgIHZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgdHlwZXNcbiAgICAgIGxldCBkZWZhdWx0VmFsdWU6IGFueTtcbiAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnKSB7XG4gICAgICAgIC8vIEZvciBzdHJfbGlzdCwgY3JlYXRlIGEgRm9ybUFycmF5XG4gICAgICAgIGNvbnN0IHZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlLnZhbHVlKSA/IHZhcmlhYmxlLnZhbHVlIDogW107XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheVZhbHVlID0gdGhpcy5mYi5hcnJheShcbiAgICAgICAgICB2YWx1ZUFycmF5Lmxlbmd0aCA+IDAgXG4gICAgICAgICAgICA/IHZhbHVlQXJyYXkubWFwKChpdGVtOiBzdHJpbmcpID0+IHRoaXMuZmIuY29udHJvbChpdGVtKSlcbiAgICAgICAgICAgIDogW3RoaXMuZmIuY29udHJvbCgnJyldIC8vIFN0YXJ0IHdpdGggb25lIGVtcHR5IGNvbnRyb2xcbiAgICAgICAgKTtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gZm9ybUFycmF5VmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgdmFyaWFibGUudmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudmFsdWUgfHwgJyc7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBhIEZvcm1Hcm91cCBmb3IgZWFjaCB2YXJpYWJsZVxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiB2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnID8gZGVmYXVsdFZhbHVlIDogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICAgIHR5cGU6IFt2YXJpYWJsZS50eXBlIHx8ICdzdHJpbmcnXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZS5sYWJlbCB8fCAnJ11cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBmb3JtQXJyYXlSZWYucHVzaCh2YXJpYWJsZUdyb3VwKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldENvbmRpdGlvbkFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMoaW5kZXg6IG51bWJlcik6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb25kaXRpb25BZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmdldChpbmRleCkgfHwgW107XG4gIH1cblxuICBnZXRDb25kaXRpb25BZHZhbmNlZFZhcmlhYmxlc0Zvcm0oaW5kZXg6IG51bWJlcik6IEZvcm1BcnJheSB7XG4gICAgbGV0IGZvcm1BcnJheSA9IHRoaXMuY29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZXNGb3Jtcy5nZXQoaW5kZXgpO1xuICAgIGlmICghZm9ybUFycmF5KSB7XG4gICAgICBmb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KFtdKTtcbiAgICAgIHRoaXMuY29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZXNGb3Jtcy5zZXQoaW5kZXgsIGZvcm1BcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtQXJyYXk7XG4gIH1cblxuICBnZXRDb25kaXRpb25BZHZhbmNlZEV4cGFuZGVkKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25kaXRpb25BZHZhbmNlZEV4cGFuZGVkLmdldChpbmRleCkgfHwgZmFsc2U7XG4gIH1cblxuICB0b2dnbGVDb25kaXRpb25BZHZhbmNlZChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY29uZGl0aW9uQWR2YW5jZWRFeHBhbmRlZC5nZXQoaW5kZXgpIHx8IGZhbHNlO1xuICAgIHRoaXMuY29uZGl0aW9uQWR2YW5jZWRFeHBhbmRlZC5zZXQoaW5kZXgsICFjdXJyZW50KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uQ29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZUJvb2xlYW5DaGFuZ2UoY29uZGl0aW9uSW5kZXg6IG51bWJlciwgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5jb25kaXRpb25BZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmdldChjb25kaXRpb25JbmRleCkgfHwgW107XG4gICAgY29uc3QgdmFyaWFibGUgPSB2YXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy5jb25kaXRpb25BZHZhbmNlZFZhcmlhYmxlc0Zvcm1zLmdldChjb25kaXRpb25JbmRleCk/LmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IHVuZGVmaW5lZCAmJiB2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5jb25kaXRpb25BZHZhbmNlZFZhcmlhYmxlc0Zvcm1zLmdldChjb25kaXRpb25JbmRleCk/LmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBvbkNvbmRpdGlvbkFkdmFuY2VkVmFyaWFibGVWYWx1ZUNoYW5nZShjb25kaXRpb25JbmRleDogbnVtYmVyLCB2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgdmFyaWFibGUgaW4gYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuY29uZGl0aW9uQWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5nZXQoY29uZGl0aW9uSW5kZXgpIHx8IFtdO1xuICAgIGNvbnN0IHZhcmlhYmxlID0gdmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvLyBBbHNvIHVwZGF0ZSBmb3JtIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMuY29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZXNGb3Jtcy5nZXQoY29uZGl0aW9uSW5kZXgpPy5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSB1bmRlZmluZWQgJiYgdmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuY29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZXNGb3Jtcy5nZXQoY29uZGl0aW9uSW5kZXgpPy5hdCh2YXJpYWJsZUluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgICAvLyBGb3Igc3RyX2xpc3QsIHRoZSBGb3JtQXJyYXkgaXMgYWxyZWFkeSBtYW5hZ2VkIGluc2lkZSBBZHZhbmNlZFZhcmlhYmxlc0Zvcm1Db21wb25lbnQsXG4gICAgICAvLyBzbyB3ZSBkb24ndCBuZWVkIHRvIHJlYnVpbGQgb3IgdXBkYXRlIGl0IGhlcmUgdG8gYXZvaWQgZm9jdXMgbG9zcy5cbiAgICAgIGlmICh2YXJpYWJsZT8udHlwZSAhPT0gJ3N0cl9saXN0Jykge1xuICAgICAgICBmb3JtR3JvdXA/LmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRDb25kaXRpb25Gb3JtR3JvdXAoaW5kZXg6IG51bWJlcik6IEZvcm1Hcm91cCB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlcGVhdGVkIGxvb2t1cHNcbiAgICBpZiAodGhpcy5jb25kaXRpb25Gb3JtR3JvdXBDYWNoZS5oYXMoaW5kZXgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25Gb3JtR3JvdXBDYWNoZS5nZXQoaW5kZXgpITtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5jb25kaXRpb25zRm9ybUFycmF5LmF0KGluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgaWYgKGZvcm1Hcm91cCkge1xuICAgICAgdGhpcy5jb25kaXRpb25Gb3JtR3JvdXBDYWNoZS5zZXQoaW5kZXgsIGZvcm1Hcm91cCk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtR3JvdXA7XG4gIH1cbiAgXG4gIGdldENvbmRpdGlvbkZpZWxkVmFsdWUoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5nZXRDb25kaXRpb25Gb3JtR3JvdXAoaW5kZXgpO1xuICAgIHJldHVybiBmb3JtR3JvdXA/LmdldCgnZmllbGQnKT8udmFsdWUgfHwgJyc7XG4gIH1cbiAgXG4gIGlzQ29uZGl0aW9uSWYoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldENvbmRpdGlvbkZpZWxkVmFsdWUoaW5kZXgpID09PSAnQ09ORElUSU9OX0lGJztcbiAgfVxuICBcbiAgaXNDb25kaXRpb25FbHNlSWYoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldENvbmRpdGlvbkZpZWxkVmFsdWUoaW5kZXgpID09PSAnQ09ORElUSU9OX0VMU0VfSUYnO1xuICB9XG4gIFxuICBnZXRDb25kaXRpb25MYWJlbChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBmaWVsZFZhbHVlID0gdGhpcy5nZXRDb25kaXRpb25GaWVsZFZhbHVlKGluZGV4KTtcbiAgICBpZiAoZmllbGRWYWx1ZSA9PT0gJ0NPTkRJVElPTl9JRicpIHJldHVybiAnSUYnO1xuICAgIGlmIChmaWVsZFZhbHVlID09PSAnQ09ORElUSU9OX0VMU0VfSUYnKSByZXR1cm4gJ0VMU0UgSUYnO1xuICAgIHJldHVybiAnRUxTRSc7XG4gIH1cbiAgXG4gIHRyYWNrQnlDb25kaXRpb25JbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBvbkluY2x1ZGVFbHNlQ2hhbmdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmluY2x1ZGVFbHNlID0gY2hlY2tlZDtcbiAgICB0aGlzLmNvbmRpdGlvbkZvcm0ucGF0Y2hWYWx1ZSh7IGluY2x1ZGVFbHNlOiBjaGVja2VkIH0pO1xuICAgIFxuICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxsZWQuZW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJhbGwgZm9ybSB2YWxpZGl0eSBmb3IgY29uZGl0aW9uIHN0ZXAuXG4gICAqIEluIGFkZGl0aW9uIHRvIEFuZ3VsYXIgZm9ybSB2YWxpZGl0eSwgd2UgbXVzdCBlbnN1cmUgdGhhdCBmb3IgYW55IHRlbXBsYXRlIHZhcmlhYmxlXG4gICAqIHdpdGggZGF0YUtleSAndGVzdF9kYXRhJyB8ICdzb3VyY2VfdmFsdWUnIHwgJ3RhcmdldF92YWx1ZScgYW5kIGRhdGFUeXBlICdwbGFpbi10ZXh0J1xuICAgKiBvciAncnVudGltZScsIHRoZSB2YWx1ZSBpcyBub24tZW1wdHkuXG4gICAqL1xuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICAvLyBGaXJzdCwgcmVseSBvbiB0aGUgcmVhY3RpdmUgZm9ybSB2YWxpZGl0eSBmb3IgYmFzZSBjb25kaXRpb24gZmllbGRzXG4gICAgaWYgKCF0aGlzLmNvbmRpdGlvbkZvcm0udmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUaGVuIGVuZm9yY2UgdGhlIHNhbWUgdGVzdC1kYXRhIHZhbGlkYXRpb24gcnVsZSB1c2VkIGluIGFjdGlvbiBidWlsZGVyXG4gICAgbGV0IGN1c3RvbVZhcmlhYmxlc1ZhbGlkID0gdHJ1ZTtcblxuICAgIHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGVzKSA9PiB7XG4gICAgICBpZiAoIXZhcmlhYmxlcyB8fCAhdmFyaWFibGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFsbFZhbGlkRm9yQ29uZGl0aW9uID0gdmFyaWFibGVzLmV2ZXJ5KCh2YXJpYWJsZTogYW55KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB2YXJpYWJsZSAmJlxuICAgICAgICAgICh2YXJpYWJsZS5kYXRhS2V5ID09PSAndGVzdF9kYXRhJyB8fFxuICAgICAgICAgICAgdmFyaWFibGUuZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHxcbiAgICAgICAgICAgIHZhcmlhYmxlLmRhdGFLZXkgPT09ICd0YXJnZXRfdmFsdWUnKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAodmFyaWFibGUuZGF0YVR5cGUgPT09ICdwbGFpbi10ZXh0JyB8fCB2YXJpYWJsZS5kYXRhVHlwZSA9PT0gJ3J1bnRpbWUnKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhcmlhYmxlLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZih2YXJpYWJsZS5kYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicpe1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YXJpYWJsZS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYodmFyaWFibGUuZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCcpe1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YXJpYWJsZS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYodmFyaWFibGUuZGF0YUtleSA9PT0gJ2VsZW1lbnQnKXtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhcmlhYmxlLnZhbHVlO1xuICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWFsbFZhbGlkRm9yQ29uZGl0aW9uKSB7XG4gICAgICAgIGN1c3RvbVZhcmlhYmxlc1ZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY3VzdG9tVmFyaWFibGVzVmFsaWQ7XG4gIH1cblxuICBvbkNyZWF0ZVN0ZXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25kaXRpb25Gb3JtLnZhbGlkKSB7XG4gICAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmNvbmRpdGlvbkZvcm0udmFsdWU7XG4gICAgICBcbiAgICAgIC8vIFN5bmMgYWR2YW5jZWQgdmFyaWFibGVzIGZyb20gZm9ybSB0byBhcnJheSBmb3IgYWxsIGNvbmRpdGlvbnNcbiAgICAgIHRoaXMuY29uZGl0aW9uQWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZXMsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuY29uZGl0aW9uQWR2YW5jZWRWYXJpYWJsZXNGb3Jtcy5nZXQoaW5kZXgpO1xuICAgICAgICBpZiAoZm9ybUFycmF5KSB7XG4gICAgICAgICAgdmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlLCB2YXJJbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gZm9ybUFycmF5LmF0KHZhckluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgICAgICAgICBpZiAoZm9ybUdyb3VwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGZvcm1Hcm91cC5nZXQoJ3ZhbHVlJyk/LnZhbHVlO1xuICAgICAgICAgICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ3N0cl9saXN0JyAmJiBmb3JtVmFsdWUgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IHZhbHVlcyBmcm9tIEZvcm1BcnJheVxuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZm9ybVZhbHVlLmNvbnRyb2xzLm1hcChjb250cm9sID0+IGNvbnRyb2wudmFsdWUpLmZpbHRlcigodmFsOiBzdHJpbmcpID0+IHZhbCAmJiB2YWwudHJpbSgpICE9PSAnJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUudmFsdWUgPSBmb3JtVmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGNvbnN0IHN0ZXBEYXRhOiBDb25kaXRpb25Gb3JtRGF0YSA9IHtcbiAgICAgICAgY29uZGl0aW9uczogZm9ybVZhbHVlLmNvbmRpdGlvbnMubWFwKChjb25kOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAvLyBGaW5kIHRoZSBBY3Rpb25UZW1wbGF0ZSBvYmplY3QgZnJvbSB0aGUgc3RvcmVkIElEL3ZhbHVlXG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVJZCA9IGNvbmQudmFsdWU7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZW1wbGF0ZSA9IHRoaXMuY29uZGl0aW9uVGVtcGxhdGVzLmZpbmQoXG4gICAgICAgICAgICB0ID0+ICh0LmlkPy50b1N0cmluZygpID09PSB0ZW1wbGF0ZUlkKSB8fCAodC5kaXNwbGF5TmFtZSA9PT0gdGVtcGxhdGVJZClcbiAgICAgICAgICApIHx8IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZXMuZ2V0KGluZGV4KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBHZXQgdGVtcGxhdGUgdmFyaWFibGVzIGZvciB0aGlzIGNvbmRpdGlvblxuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5jb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcy5nZXQoaW5kZXgpIHx8IFtdO1xuICAgICAgICAgIC8vIEdldCBhZHZhbmNlZCBzZXR0aW5ncyB2YXJpYWJsZXMgZm9yIHRoaXMgY29uZGl0aW9uXG4gICAgICAgICAgY29uc3QgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyA9IHRoaXMuY29uZGl0aW9uQWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5nZXQoaW5kZXgpIHx8IFtdO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmaWVsZDogY29uZC5maWVsZCxcbiAgICAgICAgICAgIG9wZXJhdG9yOiBjb25kLm9wZXJhdG9yLFxuICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkVGVtcGxhdGUgfHwgbnVsbCxcbiAgICAgICAgICAgIHRlbXBsYXRlVmFyaWFibGVzOiB0ZW1wbGF0ZVZhcmlhYmxlcyxcbiAgICAgICAgICAgIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6IGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogY29uZC5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBjb25kLm1ldGFkYXRhIHx8ICcnXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICAgIGluY2x1ZGVFbHNlOiBmb3JtVmFsdWUuaW5jbHVkZUVsc2UgfHwgZmFsc2VcbiAgICAgIH07XG4gICAgICBjb25zb2xlLmxvZygnc3RlcERhdGEnLCBzdGVwRGF0YSk7XG4gICAgICB0aGlzLmNyZWF0ZVN0ZXAuZW1pdChzdGVwRGF0YSk7XG4gICAgfVxuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWgtZnVsbCBjcWEtYmctd2hpdGUgY3FhLXB4LTQgY3FhLXB5LTJcIj5cbiAgPCEtLSBIZWFkZXIgLS0+XG4gIDxoMiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1ibGFjay0xMDAgY3FhLW1iLTRcIj5cbiAgICBDcmVhdGUgQ29uZGl0aW9uIFN0ZXBcbiAgPC9oMj5cblxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1mbGV4LTEgY3FhLW92ZXJmbG93LXktYXV0b1wiPlxuICAgIDwhLS0gQ29uZGl0aW9uIEJ1aWxkZXIgU2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTZcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWItM1wiPlxuICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWdyYXktOTAwXCI+XG4gICAgICAgIENvbmRpdGlvbiBCdWlsZGVyXG4gICAgICA8L2gzPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ29uZGl0aW9uIFJvd3MgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtbWItM1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb25kaXRpb24gb2YgY29uZGl0aW9uc0Zvcm1BcnJheS5jb250cm9sczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUNvbmRpdGlvbkluZGV4XCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJpc0NvbmRpdGlvbklmKGkpIHx8IGlzQ29uZGl0aW9uRWxzZUlmKGkpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgPCEtLSBDb25kaXRpb24gUm93IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgIDwhLS0gQ29uZGl0aW9uIExhYmVsIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkXCI+XG4gICAgICAgICAgICAgICAge3sgZ2V0Q29uZGl0aW9uTGFiZWwoaSkgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPCEtLSBPcGVyYXRvciBEcm9wZG93biAtLT5cbiAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWF4LXctWzEwMHB4XSBjcWEtdGV4dC1bMTBweF1cIj5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldENvbmRpdGlvbkZvcm1Hcm91cChpKVwiIFtjb25maWddPVwiZ2V0T3BlcmF0b3JDb25maWcoaSlcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICAgIDwhLS0gVmFsdWUgVGVtcGxhdGUgRHJvcGRvd24gLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy1bMTUwcHhdIGNxYS10ZXh0LVsxMHB4XVwiPlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Q29uZGl0aW9uRm9ybUdyb3VwKGkpXCIgW2NvbmZpZ109XCJnZXRWYWx1ZUNvbmZpZyhpKVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIFJlbW92ZSBCdXR0b24gLS0+XG4gICAgICAgICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpID49IDFcIlxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBpY29uPVwiY2xvc2VcIlxuICAgICAgICAgICAgICAgIGljb25Qb3NpdGlvbj1cInN0YXJ0XCJcbiAgICAgICAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS13LWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXInXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQ29uZGl0aW9uKGkpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidSZW1vdmUgY29uZGl0aW9uJ1wiPlxuICAgICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTggY3FhLWgtOCBjcWEtcm91bmRlZCBjcWEtdGV4dC1ncmF5LTUwMCBob3ZlcjpjcWEtdGV4dC1ncmF5LTcwMCBob3ZlcjpjcWEtYmctZ3JheS0xMDAgY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQ29uZGl0aW9uKGkpXCIgKm5nSWY9XCJpID49IDFcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1JlbW92ZSBjb25kaXRpb24nXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtbGcgY3FhLXRleHQtWzI0cHhdXCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj4gLS0+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBUZW1wbGF0ZSBWYXJpYWJsZXMgU2VjdGlvbiAoc2hvd24gd2hlbiB0ZW1wbGF0ZSBpcyBzZWxlY3RlZCkgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2V0U2VsZWN0ZWRUZW1wbGF0ZShpKVwiIGNsYXNzPVwiY3FhLW10LTJcIj5cbiAgICAgICAgICAgICAgPCEtLSBUZW1wbGF0ZSBHcmFtbWFyIERpc3BsYXkgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWItNCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0xIGNxYS10ZXh0LXNtIGNxYS10ZXh0LWdyYXktNzAwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hY3Rpb24tZm9ybWF0IGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjNweF0gY3FhLXRleHQtYmxhY2stMTAwXCJcbiAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiZ2V0U2VsZWN0ZWRUZW1wbGF0ZShpKT8uaHRtbEdyYW1tYXIgfHwgZ2V0U2VsZWN0ZWRUZW1wbGF0ZShpKT8ubmF0dXJhbFRleHQgfHwgJydcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8IS0tIFRlbXBsYXRlIFZhcmlhYmxlcyBGb3JtIENvbXBvbmVudCAoaW5jbHVkZXMgRGVzY3JpcHRpb24gYW5kIE1ldGFkYXRhKSAtLT5cbiAgICAgICAgICAgICAgPGNxYS10ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybVxuICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7XCJcbiAgICAgICAgICAgICAgICBbdGVtcGxhdGVWYXJpYWJsZXNdPVwiZ2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMoaSlcIlxuICAgICAgICAgICAgICAgIFt2YXJpYWJsZXNGb3JtXT1cImdldENvbmRpdGlvblZhcmlhYmxlc0Zvcm0oaSlcIlxuICAgICAgICAgICAgICAgIFttZXRhZGF0YV09XCJnZXRDb25kaXRpb25Gb3JtR3JvdXAoaSkuZ2V0KCdtZXRhZGF0YScpPy52YWx1ZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImdldENvbmRpdGlvbkZvcm1Hcm91cChpKS5nZXQoJ2Rlc2NyaXB0aW9uJyk/LnZhbHVlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbZWxlbWVudE9wdGlvbnNdPVwiZWxlbWVudE9wdGlvbnNcIlxuICAgICAgICAgICAgICAgIFtoYXNNb3JlRWxlbWVudHNdPVwiaGFzTW9yZUVsZW1lbnRzXCJcbiAgICAgICAgICAgICAgICBbaXNMb2FkaW5nRWxlbWVudHNdPVwiaXNMb2FkaW5nRWxlbWVudHNcIlxuICAgICAgICAgICAgICAgIFtzY3JlZW5OYW1lT3B0aW9uc109XCJzY3JlZW5OYW1lT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgW2hhc01vcmVTY3JlZW5OYW1lc109XCJoYXNNb3JlU2NyZWVuTmFtZXNcIlxuICAgICAgICAgICAgICAgIFtpc0xvYWRpbmdTY3JlZW5OYW1lc109XCJpc0xvYWRpbmdTY3JlZW5OYW1lc1wiXG4gICAgICAgICAgICAgICAgW3BhcmFtZXRlck9wdGlvbnNdPVwicGFyYW1ldGVyT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgW2hhc01vcmVQYXJhbWV0ZXJzXT1cImhhc01vcmVQYXJhbWV0ZXJzXCJcbiAgICAgICAgICAgICAgICBbaXNMb2FkaW5nUGFyYW1ldGVyc109XCJpc0xvYWRpbmdQYXJhbWV0ZXJzXCJcbiAgICAgICAgICAgICAgICBbZW52aXJvbm1lbnRPcHRpb25zXT1cImVudmlyb25tZW50T3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgW2hhc01vcmVFbnZpcm9ubWVudHNdPVwiaGFzTW9yZUVudmlyb25tZW50c1wiXG4gICAgICAgICAgICAgICAgW2lzTG9hZGluZ0Vudmlyb25tZW50c109XCJpc0xvYWRpbmdFbnZpcm9ubWVudHNcIlxuICAgICAgICAgICAgICAgIFtkZWZhdWx0VGVzdERhdGFQcm9maWxlSWRdPVwiZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkXCJcbiAgICAgICAgICAgICAgICBbZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleF09XCJkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4XCJcbiAgICAgICAgICAgICAgICBbZGVmYXVsdFRlc3REYXRhRW5kSW5kZXhdPVwiZGVmYXVsdFRlc3REYXRhRW5kSW5kZXhcIlxuICAgICAgICAgICAgICAgIFtpc0luc2lkZUZvckxvb3BTdGVwXT1cImlzSW5zaWRlRm9yTG9vcFN0ZXBcIlxuICAgICAgICAgICAgICAgICh2YXJpYWJsZVZhbHVlQ2hhbmdlKT1cIm9uQ29uZGl0aW9uVmFyaWFibGVWYWx1ZUNoYW5nZShpLCAkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgKHZhcmlhYmxlQm9vbGVhbkNoYW5nZSk9XCJvbkNvbmRpdGlvblZhcmlhYmxlQm9vbGVhbkNoYW5nZShpLCAkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgKG1ldGFkYXRhQ2hhbmdlKT1cImdldENvbmRpdGlvbkZvcm1Hcm91cChpKS5nZXQoJ21ldGFkYXRhJyk/LnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCJnZXRDb25kaXRpb25Gb3JtR3JvdXAoaSkuZ2V0KCdkZXNjcmlwdGlvbicpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAobG9hZE1vcmVFbGVtZW50cyk9XCJsb2FkTW9yZUVsZW1lbnRzLmVtaXQoKVwiXG4gICAgICAgICAgICAgICAgKHNlYXJjaEVsZW1lbnRzKT1cInNlYXJjaEVsZW1lbnRzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHNlYXJjaEVsZW1lbnRzQnlTY3JlZW5OYW1lKT1cInNlYXJjaEVsZW1lbnRzQnlTY3JlZW5OYW1lLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNyZWF0ZUVsZW1lbnQpPVwiY3JlYXRlRWxlbWVudC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChzZWFyY2hTY3JlZW5OYW1lKT1cInNlYXJjaFNjcmVlbk5hbWUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAobG9hZE1vcmVTY3JlZW5OYW1lcyk9XCJsb2FkTW9yZVNjcmVlbk5hbWVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0KT1cImNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHNlYXJjaFBhcmFtZXRlcnMpPVwic2VhcmNoUGFyYW1ldGVycy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChsb2FkTW9yZVBhcmFtZXRlcnMpPVwibG9hZE1vcmVQYXJhbWV0ZXJzLmVtaXQoKVwiXG4gICAgICAgICAgICAgICAgKHNlYXJjaEVudmlyb25tZW50cyk9XCJzZWFyY2hFbnZpcm9ubWVudHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAobG9hZE1vcmVFbnZpcm9ubWVudHMpPVwibG9hZE1vcmVFbnZpcm9ubWVudHMuZW1pdCgpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLXRlbXBsYXRlLXZhcmlhYmxlcy1mb3JtPlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPCEtLSBBZHZhbmNlZCBTZXR0aW5ncyBWYXJpYWJsZXMgRm9ybSAtLT5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdldENvbmRpdGlvbkFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMoaSkubGVuZ3RoID4gMFwiIGNsYXNzPVwiY3FhLW10LTRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLXctZnVsbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0yIGNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtcC0wIGNxYS1tYi0xLjVcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ29uZGl0aW9uQWR2YW5jZWQoaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTBweF1cIj5BZHZhbmNlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtYmFzZVwiIFtjbGFzcy5jcWEtcm90YXRlLTE4MF09XCJnZXRDb25kaXRpb25BZHZhbmNlZEV4cGFuZGVkKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgZXhwYW5kX21vcmVcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdldENvbmRpdGlvbkFkdmFuY2VkRXhwYW5kZWQoaSlcIiBjbGFzcz1cImNxYS1tdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0gXG4gICAgICAgICAgICAgICAgICAgICAgW2FkdmFuY2VkVmFyaWFibGVzXT1cImdldENvbmRpdGlvbkFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgIFthZHZhbmNlZFZhcmlhYmxlRm9ybV09XCJnZXRDb25kaXRpb25BZHZhbmNlZFZhcmlhYmxlc0Zvcm0oaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICh2YXJpYWJsZUJvb2xlYW5DaGFuZ2UpPVwib25Db25kaXRpb25BZHZhbmNlZFZhcmlhYmxlQm9vbGVhbkNoYW5nZShpLCAkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKHZhcmlhYmxlVmFsdWVDaGFuZ2UpPVwib25Db25kaXRpb25BZHZhbmNlZFZhcmlhYmxlVmFsdWVDaGFuZ2UoaSwgJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBBZGQgQ29uZGl0aW9uIEJ1dHRvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYm9yZGVyLTIgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1ncmF5LTMwMCBjcWEtcm91bmRlZC1sZyBjcWEtcC0xIGNxYS1tdC0zXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgdmFyaWFudD1cInRleHRcIlxuICAgICAgICAgIGljb249XCJhZGRcIlxuICAgICAgICAgIGljb25Qb3NpdGlvbj1cInN0YXJ0XCJcbiAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS13LWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXInXCJcbiAgICAgICAgICBbdGV4dF09XCInQWRkIENvbmRpdGlvbidcIlxuICAgICAgICAgIChjbGlja2VkKT1cImFkZENvbmRpdGlvbignQ09ORElUSU9OX0VMU0VfSUYnKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gSW5jbHVkZSBFTFNFIEJyYW5jaCBTZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLW1iLTYgY3FhLXAtMyBjcWEtYmctZ3JheS01MCBjcWEtcm91bmRlZC1sZ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgICAgICA8aDMgY2xhc3M9XCJjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtZ3JheS05MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICBJbmNsdWRlIEVMU0UgYnJhbmNoXG4gICAgICAgIDwvaDM+XG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgICAgRXhlY3V0ZSBhbHRlcm5hdGl2ZSBzdGVwcyB3aGVuIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlIFtjaGVja2VkXT1cImluY2x1ZGVFbHNlXCIgKGNoYW5nZSk9XCJvbkluY2x1ZGVFbHNlQ2hhbmdlKCRldmVudC5jaGVja2VkKVwiIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWdhcC0yIGNxYS1tdC1hdXRvIGNxYS1wdC00IGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgPGNxYS1idXR0b24gY2xhc3M9XCJjcWEtdy0xLzJcIiB2YXJpYW50PVwib3V0bGluZWRcIiB0ZXh0PVwiQ2FuY2VsXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgIChjbGlja2VkKT1cIm9uQ2FuY2VsKClcIj5cbiAgICA8L2NxYS1idXR0b24+XG4gICAgPGNxYS1idXR0b24gKm5nSWY9XCIhaXNDcmVhdGluZ1N0ZXBcIiBjbGFzcz1cImNxYS13LTEvMlwiIHZhcmlhbnQ9XCJmaWxsZWRcIiB0ZXh0PVwiQ3JlYXRlIFN0ZXBcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1mbGV4LTEgY3FhLXctZnVsbCdcIlxuICAgICAgW2Rpc2FibGVkXT1cIiFpc0Zvcm1WYWxpZCgpXCJcbiAgICAgIChjbGlja2VkKT1cIm9uQ3JlYXRlU3RlcCgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICAgIDxkaXYgKm5nSWY9XCJpc0NyZWF0aW5nU3RlcFwiIGNsYXNzPVwiY3FhLXctMS8yIGNxYS1mbGV4LTEgY3FhLW1pbi1oLVszOHB4XSBjcWEtcm91bmRlZC1bOHB4XVwiPlxuICAgICAgPGNxYS1iYWRnZSBsYWJlbD1cIkNyZWF0aW5n4oCmXCIgaWNvbj1cImF1dG9yZW5ld1wiIFtpc0xvYWRpbmddPVwidHJ1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFtjZW50ZXJDb250ZW50XT1cInRydWVcIlxuICAgICAgICBbaW5saW5lU3R5bGVzXT1cIidtaW4taGVpZ2h0OiAzOHB4OyBoZWlnaHQ6IDM4cHg7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOydcIlxuICAgICAgICB2YXJpYW50PVwiaW5mb1wiIHNpemU9XCJtZWRpdW1cIj48L2NxYS1iYWRnZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=