@cqa-lib/cqa-ui 1.1.548 → 1.1.549
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.
|
@@ -463,10 +463,10 @@ export class StepBuilderDocumentComponent {
|
|
|
463
463
|
}
|
|
464
464
|
}
|
|
465
465
|
StepBuilderDocumentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderDocumentComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
466
|
-
StepBuilderDocumentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderDocumentComponent, selector: "cqa-step-builder-document", inputs: { documentTypeOptions: "documentTypeOptions", templateOptions: "templateOptions", valueTypeOptions: "valueTypeOptions", delimeterTypeOptions: "delimeterTypeOptions", setAdvancedSettingsVariables: "setAdvancedSettingsVariables", template: "template", testStep: "testStep", mapperHelpUrl: "mapperHelpUrl", mapperHelpTooltipText: "mapperHelpTooltipText", initialDocumentType: "initialDocumentType", initialOutputVariable: "initialOutputVariable", initialTemplateSource: "initialTemplateSource", initialTemplateId: "initialTemplateId", initialTemplateName: "initialTemplateName", initialTemplateDescription: "initialTemplateDescription", initialMappings: "initialMappings", initialFileName: "initialFileName", initialSeprator: "initialSeprator", initialDelimeter: "initialDelimeter", initialFileFormatHeader: "initialFileFormatHeader", initialDescription: "initialDescription", editMode: "editMode", isCreatingStep: "isCreatingStep" }, outputs: { createStep: "createStep", cancelled: "cancelled", createTemplate: "createTemplate" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root cqa-block cqa-w-full cqa-min-w-0 cqa-step-builder-document\" style=\"height: 100%;width: 100%;\">\n <div\n class=\"cqa-flex cqa-flex-col cqa-w-full cqa-min-w-0 cqa-h-full cqa-bg-white cqa-border cqa-box-border cqa-max-w-full cqa-opacity-100 cqa-h-full cqa-w-full\">\n <!-- Content area: padding 16px, gap 12px between sections (no flex-1 to avoid gap above footer) -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-overflow-y-auto cqa-p-4 cqa-gap-3\">\n <!-- Header: Document Generation Template Step (left-aligned, Inter 600 12px line-height 100%) -->\n <h2\n class=\"cqa-text-[12px] cqa-leading-[100%] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-text-left cqa-flex-shrink-0 cqa-align-middle\">\n Document Generation Template Step\n </h2>\n\n <!-- File Name and Document Type Row -->\n <div class=\"cqa-flex cqa-flex-wrap cqa-flex-shrink-0 cqa-gap-14\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n File Name <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"File Name\"\n [value]=\"documentForm.get('fileName')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('fileName')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n The name of the file to be generated\n </p>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)] \">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Document Type <span class=\"cqa-text-red-500\">*</span>\n </label>\n <div class=\"document-type-select\">\n <cqa-dynamic-select\n [form]=\"documentForm\"\n [config]=\"getDocumentTypeConfig()\">\n </cqa-dynamic-select>\n </div>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Choose the file format you want to generate.\n </p>\n </div>\n </div>\n\n <!-- Output Variable and Conditional Fields Row -->\n <div class=\"cqa-flex cqa-flex-wrap cqa-flex-shrink-0 cqa-gap-14\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Output Variable <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"Input\"\n [value]=\"documentForm.get('outputVariable')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('outputVariable')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Stores the generated file so it can be used in later steps.\n </p>\n </div>\n <!-- Seprator (shown when documentType is 'txt') -->\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\" *ngIf=\"isTxtSelected\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Seprator\n </label>\n <cqa-custom-input\n placeholder=\"Seprator\"\n [value]=\"documentForm.get('seprator')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('seprator')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n The seprator to be used to separate the values in the generated file\n </p>\n </div>\n <!-- Delimeter Type (shown when documentType is 'csv') -->\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\" *ngIf=\"isCsvSelected\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Delimeter Type\n </label>\n <div class=\"document-type-select\">\n <cqa-dynamic-select\n [form]=\"documentForm\"\n [config]=\"getDelimeterConfig()\">\n </cqa-dynamic-select>\n </div>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Choose the delimeter type for the CSV file\n </p>\n </div>\n </div>\n\n <!-- File Format Header (shown when documentType is 'txt') -->\n <div class=\"cqa-flex cqa-flex-wrap cqa-flex-shrink-0 cqa-gap-14\" *ngIf=\"isTxtSelected\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n File Format Header\n </label>\n <cqa-custom-input\n placeholder=\"File Format Header\"\n [value]=\"documentForm.get('fileFormatHeader')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('fileFormatHeader')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Header text for the generated txt file\n </p>\n </div>\n </div>\n\n <!-- Template Source Section: label left, tabs right on same row -->\n <!-- <div class=\"cqa-flex cqa-flex-col cqa-flex-shrink-0 cqa-gap-3\">\n \n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-4\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0 cqa-flex-shrink-0\">\n Template Source\n </label>\n <cqa-segment-control\n class=\"cqa-flex-shrink-0\"\n [segments]=\"[\n { label: 'Use Existing Template', value: 'existing' },\n { label: 'Upload Template', value: 'upload' },\n { label: 'Create New', value: 'createNew' }\n ]\"\n [value]=\"selectedTemplateSource\"\n (valueChange)=\"onTemplateSourceChange($event)\">\n </cqa-segment-control>\n </div>\n <div class=\"document-type-select\" *ngIf=\"selectedTemplateSource === 'existing'\">\n <cqa-dynamic-select\n [form]=\"documentForm\"\n [config]=\"getTemplateSelectConfig()\">\n </cqa-dynamic-select>\n </div>\n\n <div *ngIf=\"selectedTemplateSource === 'upload'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0\">\n Attachment <span class=\"cqa-text-red-500\">*</span>\n </label>\n <input\n #fileInput\n type=\"file\"\n accept=\".pdf,.doc,.docx,.txt\"\n class=\"cqa-hidden\"\n (change)=\"onFileSelected($event)\">\n <div\n class=\"cqa-w-full cqa-min-h-[140px] cqa-rounded cqa-border-2 cqa-border-dashed cqa-border-gray-300 cqa-bg-white cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-3 cqa-p-6 cqa-cursor-pointer cqa-transition-colors\"\n [class.cqa-ring-2]=\"isDragOver\"\n [class.cqa-ring-[#3F43EE]]=\"isDragOver\"\n [class.cqa-ring-inset]=\"isDragOver\"\n (click)=\"fileInput.click()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n role=\"button\"\n tabindex=\"0\"\n (keydown.enter)=\"fileInput.click()\"\n (keydown.space)=\"fileInput.click()\"\n aria-label=\"Upload template file\">\n <svg class=\"cqa-w-8 cqa-h-8 cqa-font-bold\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/>\n <polyline points=\"17 8 12 3 7 8\"/>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"/>\n </svg>\n <p class=\"cqa-text-base cqa-text-[#374151] cqa-m-0 cqa-text-center cqa-font-bold\">\n Drag and drop files here or <span class=\"cqa-text-[#3F43EE] cqa-font-medium hover:cqa-underline\">browse</span>\n </p>\n <p class=\"cqa-text-sm cqa-text-[#6B7280] cqa-m-0\">\n PDF, DOC, or TXT files\n </p>\n </div>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-m-0\">\n Choose the file format you want to generate.\n </p>\n </div>\n <div *ngIf=\"selectedTemplateSource === 'createNew'\" class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-3\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(50%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Template Name <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"PDF Document (.pdf)\"\n [value]=\"documentForm.get('templateName')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('templateName')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(50%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Template Description <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"PDF Document (.pdf)\"\n [value]=\"documentForm.get('templateDescription')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('templateDescription')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </div>\n <div class=\"cqa-flex cqa-justify-end\">\n <cqa-button\n variant=\"filled\"\n btnSize=\"lg\"\n text=\"Create Template\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#3F43EE] cqa-bg-[#3F43EE]'\"\n (clicked)=\"onCreateTemplate()\">\n </cqa-button>\n </div>\n </div>\n </div> -->\n\n <!-- Document Mapper Section: title + subtitle left, Need help? right (CQA table below) -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-shrink-0 cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <h3 class=\"cqa-text-base cqa-font-semibold cqa-text-[#111827] cqa-text-[14px] cqa-m-0 cqa-leading-tight\">\n Document Mapper\n </h3>\n <p class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5\">\n Map placeholders to dynamic values.\n </p>\n </div>\n <div class=\"cqa-relative cqa-inline-flex cqa-flex-shrink-0\"\n (mouseenter)=\"showHelpTooltip = true\"\n (mouseleave)=\"showHelpTooltip = false\">\n <a *ngIf=\"mapperHelpUrl\"\n href=\"#\"\n (click)=\"onMapperHelpClick($event)\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[21px] cqa-no-underline cqa-cursor-pointer\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#help-icon-clip-doc)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"help-icon-clip-doc\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </a>\n <span *ngIf=\"!mapperHelpUrl\" class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-font-[500] cqa-text-[10px] cqa-cursor-default cqa-text-[#374151]\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#help-icon-clip-doc-nolink)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"help-icon-clip-doc-nolink\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </span>\n <div *ngIf=\"showHelpTooltip\" class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-top-[-24px] cqa-left-[-203px]\" role=\"tooltip\">\n <div class=\"cqa-text-white cqa-text-center cqa-whitespace-nowrap cqa-w-[306px] cqa-min-h-5 cqa-rounded-[6px] cqa-opacity-100 cqa-px-2 cqa-py-1 cqa-bg-[#0A0A0A] cqa-leading-5 cqa-text-[8px]\">\n {{ mapperHelpTooltipText }}\n </div>\n </div>\n </div>\n </div>\n <!-- Table or empty state: same container, header always visible -->\n <div class=\"cqa-rounded-lg cqa-overflow-hidden cqa-bg-white cqa-shadow-sm cqa-border cqa-border-solid cqa-border-gray-200\">\n <table class=\"cqa-w-full\">\n <thead>\n <tr class=\"cqa-items-center cqa-bg-[#D8D9FC4D]\">\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-w-[40px] cqa-border-b cqa-border-gray-200\">\n <mat-checkbox [checked]=\"allMappingsSelected\"\n [indeterminate]=\"someMappingsSelected && !allMappingsSelected\"\n (change)=\"onSelectAllMappings($event.checked)\"\n color=\"primary\"\n aria-label=\"Select all mappings\">\n </mat-checkbox>\n </th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200\">Key</th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200 cqa-w-[120px]\">Value Type</th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200\">Value</th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200 cqa-w-[48px]\">\n <span class=\"cqa-sr-only\">Delete row</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"cqa-w-full\">\n <!-- Empty state when no mappings -->\n <tr *ngIf=\"mappingsFormArray.length === 0\">\n <td colspan=\"5\" class=\"cqa-p-0 cqa-align-middle cqa-border-b cqa-border-gray-200\">\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-12 cqa-px-4 cqa-bg-white\">\n <p class=\"cqa-text-sm cqa-text-[#6B7280] cqa-m-0 cqa-mb-4\">Start mapping placeholders to values.</p>\n <button\n type=\"button\"\n class=\"cqa-rounded-lg cqa-px-4 cqa-py-2.5 cqa-text-sm cqa-font-semibold cqa-text-white cqa-bg-[#4F46E5] cqa-border-none cqa-cursor-pointer hover:cqa-opacity-90 cqa-transition-opacity\"\n (click)=\"addMapping()\">\n Add first mapping\n </button>\n </div>\n </td>\n </tr>\n <!-- Data rows when there are mappings -->\n <tr *ngFor=\"let mapping of mappingsFormArray.controls; let i = index\"\n class=\"cqa-bg-white hover:cqa-bg-[#F9FAFB]\">\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-top cqa-border-b cqa-border-gray-200\">\n <mat-checkbox [checked]=\"getMappingFormGroup(i).get('enabled')?.value\"\n (change)=\"getMappingFormGroup(i).get('enabled')?.setValue($event.checked)\"\n color=\"primary\"\n aria-label=\"Enable mapping\">\n </mat-checkbox>\n </td>\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-top cqa-border-b cqa-border-gray-200 \">\n <cqa-custom-input\n [placeholder]=\"'Key'\"\n [value]=\"getMappingFormGroup(i).get('key')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"getMappingFormGroup(i).get('key')?.setValue($event)\">\n </cqa-custom-input>\n </td>\n <td colspan=\"2\" class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-top cqa-border-b cqa-border-gray-200\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div *ngFor=\"let entry of getValuesFormArray(i).controls; let j = index\"\n class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"document-type-select cqa-w-[120px] cqa-flex-shrink-0\">\n <cqa-dynamic-select\n [form]=\"getValueFormGroup(i, j)\"\n [config]=\"getValueTypeConfig(i, j)\">\n </cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-custom-input\n [placeholder]=\"'Value'\"\n [value]=\"getValueFormGroup(i, j).get('value')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"getValueFormGroup(i, j).get('value')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-7 cqa-h-7 cqa-rounded cqa-text-[#9CA3AF] cqa-transition-colors cqa-border-none cqa-bg-transparent cqa-cursor-pointer hover:cqa-text-[#374151] disabled:cqa-opacity-30 disabled:cqa-cursor-not-allowed\"\n [disabled]=\"getValuesFormArray(i).length <= 1\"\n (click)=\"removeValueEntry(i, j)\"\n [attr.aria-label]=\"'Remove value'\"\n [attr.title]=\"getValuesFormArray(i).length <= 1 ? 'A key needs at least one value' : 'Remove this value'\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px] cqa-leading-[18px]\">close</mat-icon>\n </button>\n </div>\n <button\n type=\"button\"\n class=\"cqa-self-start cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mt-1\"\n (click)=\"addValueEntry(i)\"\n [attr.aria-label]=\"'Add value'\">\n <mat-icon class=\"cqa-text-[16px] cqa-w-4 cqa-h-4 cqa-leading-4\">add</mat-icon>\n Add value\n </button>\n </div>\n </td>\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-top cqa-border-b cqa-border-gray-200\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded cqa-text-[#E57373] cqa-transition-colors cqa-border-none cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80\"\n (click)=\"removeMapping(i)\"\n [attr.aria-label]=\"'Delete key row'\"\n title=\"Delete this key and all its values\">\n <svg class=\"cqa-w-5 cqa-h-5 cqa-flex-shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 6h18M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2m3 0v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6h14z\"/>\n <path d=\"M10 11v6M14 11v6\"/>\n </svg>\n </button>\n </td>\n </tr>\n </tbody>\n \n </table>\n <div class=\"cqa-flex cqa-justify-end\" *ngIf=\"mappingsFormArray.length > 0\">\n <button\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-3\"\n (click)=\"addMapping()\">\n + Add Mapping\n </button>\n </div>\n </div>\n <!-- <div class=\"cqa-flex cqa-justify-end\" *ngIf=\"mappingsFormArray.length > 0\">\n <button\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0\"\n (click)=\"addMapping()\">\n + Add Mapping\n </button>\n </div> -->\n </div>\n\n <!-- Description (after Document Mapper) -->\n <div class=\"cqa-flex cqa-flex-wrap cqa-flex-shrink-0 cqa-gap-14\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Description\n </label>\n <cqa-custom-input\n placeholder=\"Description\"\n [value]=\"documentForm.get('description')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('description')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Optional description for this document generation step\n </p>\n </div>\n </div>\n </div>\n\n <!-- Advanced Settings Variables Form -->\n <div *ngIf=\"advancedSettingsVariables.length > 0\" class=\"cqa-flex-shrink-0 cqa-px-4 cqa-pb-3\">\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n </div>\n \n\n <!-- Divider above footer -->\n <div class=\"cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full\" role=\"presentation\"></div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-items-stretch cqa-w-full cqa-p-4 cqa-gap-3\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n btnSize=\"lg\"\n text=\"Cancel\"\n [fullWidth]=\"true\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button *ngIf=\"!isCreatingStep\"\n variant=\"filled\"\n btnSize=\"lg\"\n [text]=\"editMode ? 'Update Step' : 'Create Step'\"\n [fullWidth]=\"true\"\n [disabled]=\"!isFormValid()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#3F43EE]'\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"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>\n</div>\n", components: [{ type: i2.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { 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.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { 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.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
466
|
+
StepBuilderDocumentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderDocumentComponent, selector: "cqa-step-builder-document", inputs: { documentTypeOptions: "documentTypeOptions", templateOptions: "templateOptions", valueTypeOptions: "valueTypeOptions", delimeterTypeOptions: "delimeterTypeOptions", setAdvancedSettingsVariables: "setAdvancedSettingsVariables", template: "template", testStep: "testStep", mapperHelpUrl: "mapperHelpUrl", mapperHelpTooltipText: "mapperHelpTooltipText", initialDocumentType: "initialDocumentType", initialOutputVariable: "initialOutputVariable", initialTemplateSource: "initialTemplateSource", initialTemplateId: "initialTemplateId", initialTemplateName: "initialTemplateName", initialTemplateDescription: "initialTemplateDescription", initialMappings: "initialMappings", initialFileName: "initialFileName", initialSeprator: "initialSeprator", initialDelimeter: "initialDelimeter", initialFileFormatHeader: "initialFileFormatHeader", initialDescription: "initialDescription", editMode: "editMode", isCreatingStep: "isCreatingStep" }, outputs: { createStep: "createStep", cancelled: "cancelled", createTemplate: "createTemplate" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root cqa-block cqa-w-full cqa-min-w-0 cqa-step-builder-document\" style=\"height: 100%;width: 100%;\">\n <div\n class=\"cqa-flex cqa-flex-col cqa-w-full cqa-min-w-0 cqa-h-full cqa-bg-white cqa-border cqa-box-border cqa-max-w-full cqa-opacity-100 cqa-h-full cqa-w-full\">\n <!-- Content area: padding 16px, gap 12px between sections (no flex-1 to avoid gap above footer) -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-overflow-y-auto cqa-p-4 cqa-gap-3\">\n <!-- Header: Document Generation Template Step (left-aligned, Inter 600 12px line-height 100%) -->\n <h2\n class=\"cqa-text-[12px] cqa-leading-[100%] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-text-left cqa-flex-shrink-0 cqa-align-middle\">\n Document Generation Template Step\n </h2>\n\n <!-- File Name and Document Type Row -->\n <div class=\"cqa-flex cqa-flex-wrap cqa-flex-shrink-0 cqa-gap-14\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n File Name <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"File Name\"\n [value]=\"documentForm.get('fileName')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('fileName')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n The name of the file to be generated\n </p>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)] \">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Document Type <span class=\"cqa-text-red-500\">*</span>\n </label>\n <div class=\"document-type-select\">\n <cqa-dynamic-select\n [form]=\"documentForm\"\n [config]=\"getDocumentTypeConfig()\">\n </cqa-dynamic-select>\n </div>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Choose the file format you want to generate.\n </p>\n </div>\n </div>\n\n <!-- Output Variable and Conditional Fields Row -->\n <div class=\"cqa-flex cqa-flex-wrap cqa-flex-shrink-0 cqa-gap-14\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Output Variable <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"Input\"\n [value]=\"documentForm.get('outputVariable')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('outputVariable')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Stores the generated file so it can be used in later steps.\n </p>\n </div>\n <!-- Seprator (shown when documentType is 'txt') -->\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\" *ngIf=\"isTxtSelected\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Seprator\n </label>\n <cqa-custom-input\n placeholder=\"Seprator\"\n [value]=\"documentForm.get('seprator')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('seprator')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n The seprator to be used to separate the values in the generated file\n </p>\n </div>\n <!-- Delimeter Type (shown when documentType is 'csv') -->\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\" *ngIf=\"isCsvSelected\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Delimeter Type\n </label>\n <div class=\"document-type-select\">\n <cqa-dynamic-select\n [form]=\"documentForm\"\n [config]=\"getDelimeterConfig()\">\n </cqa-dynamic-select>\n </div>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Choose the delimeter type for the CSV file\n </p>\n </div>\n </div>\n\n <!-- File Format Header (shown when documentType is 'txt') -->\n <div class=\"cqa-flex cqa-flex-wrap cqa-flex-shrink-0 cqa-gap-14\" *ngIf=\"isTxtSelected\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n File Format Header\n </label>\n <cqa-custom-input\n placeholder=\"File Format Header\"\n [value]=\"documentForm.get('fileFormatHeader')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('fileFormatHeader')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Header text for the generated txt file\n </p>\n </div>\n </div>\n\n <!-- Template Source Section: label left, tabs right on same row -->\n <!-- <div class=\"cqa-flex cqa-flex-col cqa-flex-shrink-0 cqa-gap-3\">\n \n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-4\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0 cqa-flex-shrink-0\">\n Template Source\n </label>\n <cqa-segment-control\n class=\"cqa-flex-shrink-0\"\n [segments]=\"[\n { label: 'Use Existing Template', value: 'existing' },\n { label: 'Upload Template', value: 'upload' },\n { label: 'Create New', value: 'createNew' }\n ]\"\n [value]=\"selectedTemplateSource\"\n (valueChange)=\"onTemplateSourceChange($event)\">\n </cqa-segment-control>\n </div>\n <div class=\"document-type-select\" *ngIf=\"selectedTemplateSource === 'existing'\">\n <cqa-dynamic-select\n [form]=\"documentForm\"\n [config]=\"getTemplateSelectConfig()\">\n </cqa-dynamic-select>\n </div>\n\n <div *ngIf=\"selectedTemplateSource === 'upload'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0\">\n Attachment <span class=\"cqa-text-red-500\">*</span>\n </label>\n <input\n #fileInput\n type=\"file\"\n accept=\".pdf,.doc,.docx,.txt\"\n class=\"cqa-hidden\"\n (change)=\"onFileSelected($event)\">\n <div\n class=\"cqa-w-full cqa-min-h-[140px] cqa-rounded cqa-border-2 cqa-border-dashed cqa-border-gray-300 cqa-bg-white cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-3 cqa-p-6 cqa-cursor-pointer cqa-transition-colors\"\n [class.cqa-ring-2]=\"isDragOver\"\n [class.cqa-ring-[#3F43EE]]=\"isDragOver\"\n [class.cqa-ring-inset]=\"isDragOver\"\n (click)=\"fileInput.click()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n role=\"button\"\n tabindex=\"0\"\n (keydown.enter)=\"fileInput.click()\"\n (keydown.space)=\"fileInput.click()\"\n aria-label=\"Upload template file\">\n <svg class=\"cqa-w-8 cqa-h-8 cqa-font-bold\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/>\n <polyline points=\"17 8 12 3 7 8\"/>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"/>\n </svg>\n <p class=\"cqa-text-base cqa-text-[#374151] cqa-m-0 cqa-text-center cqa-font-bold\">\n Drag and drop files here or <span class=\"cqa-text-[#3F43EE] cqa-font-medium hover:cqa-underline\">browse</span>\n </p>\n <p class=\"cqa-text-sm cqa-text-[#6B7280] cqa-m-0\">\n PDF, DOC, or TXT files\n </p>\n </div>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-m-0\">\n Choose the file format you want to generate.\n </p>\n </div>\n <div *ngIf=\"selectedTemplateSource === 'createNew'\" class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-3\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(50%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Template Name <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"PDF Document (.pdf)\"\n [value]=\"documentForm.get('templateName')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('templateName')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(50%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Template Description <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"PDF Document (.pdf)\"\n [value]=\"documentForm.get('templateDescription')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('templateDescription')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </div>\n <div class=\"cqa-flex cqa-justify-end\">\n <cqa-button\n variant=\"filled\"\n btnSize=\"lg\"\n text=\"Create Template\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#3F43EE] cqa-bg-[#3F43EE]'\"\n (clicked)=\"onCreateTemplate()\">\n </cqa-button>\n </div>\n </div>\n </div> -->\n\n <!-- Document Mapper Section: title + subtitle left, Need help? right (CQA table below) -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-shrink-0 cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <h3 class=\"cqa-text-base cqa-font-semibold cqa-text-[#111827] cqa-text-[14px] cqa-m-0 cqa-leading-tight\">\n Document Mapper\n </h3>\n <p class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5\">\n Map placeholders to dynamic values.\n </p>\n </div>\n <div class=\"cqa-relative cqa-inline-flex cqa-flex-shrink-0\"\n (mouseenter)=\"showHelpTooltip = true\"\n (mouseleave)=\"showHelpTooltip = false\">\n <a *ngIf=\"mapperHelpUrl\"\n href=\"#\"\n (click)=\"onMapperHelpClick($event)\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[21px] cqa-no-underline cqa-cursor-pointer\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#help-icon-clip-doc)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"help-icon-clip-doc\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </a>\n <span *ngIf=\"!mapperHelpUrl\" class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-font-[500] cqa-text-[10px] cqa-cursor-default cqa-text-[#374151]\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#help-icon-clip-doc-nolink)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"help-icon-clip-doc-nolink\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </span>\n <div *ngIf=\"showHelpTooltip\" class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-top-[-24px] cqa-left-[-203px]\" role=\"tooltip\">\n <div class=\"cqa-text-white cqa-text-center cqa-whitespace-nowrap cqa-w-[306px] cqa-min-h-5 cqa-rounded-[6px] cqa-opacity-100 cqa-px-2 cqa-py-1 cqa-bg-[#0A0A0A] cqa-leading-5 cqa-text-[8px]\">\n {{ mapperHelpTooltipText }}\n </div>\n </div>\n </div>\n </div>\n <!-- Table or empty state: same container, header always visible -->\n <div class=\"cqa-rounded-lg cqa-overflow-hidden cqa-bg-white cqa-shadow-sm cqa-border cqa-border-solid cqa-border-gray-200\">\n <table class=\"cqa-w-full\">\n <thead>\n <tr class=\"cqa-items-center cqa-bg-[#D8D9FC4D]\">\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-w-[40px] cqa-border-b cqa-border-gray-200\">\n <mat-checkbox [checked]=\"allMappingsSelected\"\n [indeterminate]=\"someMappingsSelected && !allMappingsSelected\"\n (change)=\"onSelectAllMappings($event.checked)\"\n color=\"primary\"\n aria-label=\"Select all mappings\">\n </mat-checkbox>\n </th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200\">Key (column name)</th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200 cqa-w-[120px]\">Value Type</th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200\">Value</th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200 cqa-w-[48px]\">\n <span class=\"cqa-sr-only\">Delete row</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"cqa-w-full\">\n <!-- Empty state when no mappings -->\n <tr *ngIf=\"mappingsFormArray.length === 0\">\n <td colspan=\"5\" class=\"cqa-p-0 cqa-align-middle cqa-border-b cqa-border-gray-200\">\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-12 cqa-px-4 cqa-bg-white\">\n <p class=\"cqa-text-sm cqa-text-[#6B7280] cqa-m-0 cqa-mb-4\">Start mapping placeholders to values.</p>\n <button\n type=\"button\"\n class=\"cqa-rounded-lg cqa-px-4 cqa-py-2.5 cqa-text-sm cqa-font-semibold cqa-text-white cqa-bg-[#4F46E5] cqa-border-none cqa-cursor-pointer hover:cqa-opacity-90 cqa-transition-opacity\"\n (click)=\"addMapping()\">\n Add first mapping\n </button>\n </div>\n </td>\n </tr>\n <!-- Data rows when there are mappings -->\n <tr *ngFor=\"let mapping of mappingsFormArray.controls; let i = index\"\n class=\"cqa-bg-white hover:cqa-bg-[#F9FAFB]\">\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-top cqa-border-b cqa-border-gray-200\">\n <mat-checkbox [checked]=\"getMappingFormGroup(i).get('enabled')?.value\"\n (change)=\"getMappingFormGroup(i).get('enabled')?.setValue($event.checked)\"\n color=\"primary\"\n aria-label=\"Enable mapping\">\n </mat-checkbox>\n </td>\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-top cqa-border-b cqa-border-gray-200 \">\n <cqa-custom-input\n [placeholder]=\"'Key'\"\n [value]=\"getMappingFormGroup(i).get('key')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"getMappingFormGroup(i).get('key')?.setValue($event)\">\n </cqa-custom-input>\n </td>\n <td colspan=\"2\" class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-top cqa-border-b cqa-border-gray-200\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div *ngFor=\"let entry of getValuesFormArray(i).controls; let j = index\"\n class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"document-type-select cqa-w-[120px] cqa-flex-shrink-0\">\n <cqa-dynamic-select\n [form]=\"getValueFormGroup(i, j)\"\n [config]=\"getValueTypeConfig(i, j)\">\n </cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-custom-input\n [placeholder]=\"'Value'\"\n [value]=\"getValueFormGroup(i, j).get('value')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"getValueFormGroup(i, j).get('value')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-7 cqa-h-7 cqa-rounded cqa-text-[#9CA3AF] cqa-transition-colors cqa-border-none cqa-bg-transparent cqa-cursor-pointer hover:cqa-text-[#374151] disabled:cqa-opacity-30 disabled:cqa-cursor-not-allowed\"\n [disabled]=\"getValuesFormArray(i).length <= 1\"\n (click)=\"removeValueEntry(i, j)\"\n [attr.aria-label]=\"'Remove value'\"\n [attr.title]=\"getValuesFormArray(i).length <= 1 ? 'A key needs at least one value' : 'Remove this value'\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px] cqa-leading-[18px]\">close</mat-icon>\n </button>\n </div>\n <button\n type=\"button\"\n class=\"cqa-self-start cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mt-1\"\n (click)=\"addValueEntry(i)\"\n [attr.aria-label]=\"'Add value'\">\n <mat-icon class=\"cqa-text-[16px] cqa-w-4 cqa-h-4 cqa-leading-4\">add</mat-icon>\n Add value\n </button>\n </div>\n </td>\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-top cqa-border-b cqa-border-gray-200\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded cqa-text-[#E57373] cqa-transition-colors cqa-border-none cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80\"\n (click)=\"removeMapping(i)\"\n [attr.aria-label]=\"'Delete key row'\"\n title=\"Delete this key and all its values\">\n <svg class=\"cqa-w-5 cqa-h-5 cqa-flex-shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 6h18M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2m3 0v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6h14z\"/>\n <path d=\"M10 11v6M14 11v6\"/>\n </svg>\n </button>\n </td>\n </tr>\n </tbody>\n \n </table>\n <div class=\"cqa-flex cqa-justify-end\" *ngIf=\"mappingsFormArray.length > 0\">\n <button\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-3\"\n (click)=\"addMapping()\">\n + Add Mapping\n </button>\n </div>\n </div>\n <!-- <div class=\"cqa-flex cqa-justify-end\" *ngIf=\"mappingsFormArray.length > 0\">\n <button\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0\"\n (click)=\"addMapping()\">\n + Add Mapping\n </button>\n </div> -->\n </div>\n\n <!-- Description (after Document Mapper) -->\n <div class=\"cqa-flex cqa-flex-wrap cqa-flex-shrink-0 cqa-gap-14\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Description\n </label>\n <cqa-custom-input\n placeholder=\"Description\"\n [value]=\"documentForm.get('description')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('description')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Optional description for this document generation step\n </p>\n </div>\n </div>\n </div>\n\n <!-- Advanced Settings Variables Form -->\n <div *ngIf=\"advancedSettingsVariables.length > 0\" class=\"cqa-flex-shrink-0 cqa-px-4 cqa-pb-3\">\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n </div>\n \n\n <!-- Divider above footer -->\n <div class=\"cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full\" role=\"presentation\"></div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-items-stretch cqa-w-full cqa-p-4 cqa-gap-3\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n btnSize=\"lg\"\n text=\"Cancel\"\n [fullWidth]=\"true\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button *ngIf=\"!isCreatingStep\"\n variant=\"filled\"\n btnSize=\"lg\"\n [text]=\"editMode ? 'Update Step' : 'Create Step'\"\n [fullWidth]=\"true\"\n [disabled]=\"!isFormValid()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#3F43EE]'\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"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>\n</div>\n", components: [{ type: i2.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { 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.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { 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.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
467
467
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderDocumentComponent, decorators: [{
|
|
468
468
|
type: Component,
|
|
469
|
-
args: [{ selector: 'cqa-step-builder-document', template: "<div class=\"cqa-ui-root cqa-block cqa-w-full cqa-min-w-0 cqa-step-builder-document\" style=\"height: 100%;width: 100%;\">\n <div\n class=\"cqa-flex cqa-flex-col cqa-w-full cqa-min-w-0 cqa-h-full cqa-bg-white cqa-border cqa-box-border cqa-max-w-full cqa-opacity-100 cqa-h-full cqa-w-full\">\n <!-- Content area: padding 16px, gap 12px between sections (no flex-1 to avoid gap above footer) -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-overflow-y-auto cqa-p-4 cqa-gap-3\">\n <!-- Header: Document Generation Template Step (left-aligned, Inter 600 12px line-height 100%) -->\n <h2\n class=\"cqa-text-[12px] cqa-leading-[100%] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-text-left cqa-flex-shrink-0 cqa-align-middle\">\n Document Generation Template Step\n </h2>\n\n <!-- File Name and Document Type Row -->\n <div class=\"cqa-flex cqa-flex-wrap cqa-flex-shrink-0 cqa-gap-14\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n File Name <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"File Name\"\n [value]=\"documentForm.get('fileName')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('fileName')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n The name of the file to be generated\n </p>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)] \">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Document Type <span class=\"cqa-text-red-500\">*</span>\n </label>\n <div class=\"document-type-select\">\n <cqa-dynamic-select\n [form]=\"documentForm\"\n [config]=\"getDocumentTypeConfig()\">\n </cqa-dynamic-select>\n </div>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Choose the file format you want to generate.\n </p>\n </div>\n </div>\n\n <!-- Output Variable and Conditional Fields Row -->\n <div class=\"cqa-flex cqa-flex-wrap cqa-flex-shrink-0 cqa-gap-14\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Output Variable <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"Input\"\n [value]=\"documentForm.get('outputVariable')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('outputVariable')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Stores the generated file so it can be used in later steps.\n </p>\n </div>\n <!-- Seprator (shown when documentType is 'txt') -->\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\" *ngIf=\"isTxtSelected\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Seprator\n </label>\n <cqa-custom-input\n placeholder=\"Seprator\"\n [value]=\"documentForm.get('seprator')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('seprator')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n The seprator to be used to separate the values in the generated file\n </p>\n </div>\n <!-- Delimeter Type (shown when documentType is 'csv') -->\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\" *ngIf=\"isCsvSelected\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Delimeter Type\n </label>\n <div class=\"document-type-select\">\n <cqa-dynamic-select\n [form]=\"documentForm\"\n [config]=\"getDelimeterConfig()\">\n </cqa-dynamic-select>\n </div>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Choose the delimeter type for the CSV file\n </p>\n </div>\n </div>\n\n <!-- File Format Header (shown when documentType is 'txt') -->\n <div class=\"cqa-flex cqa-flex-wrap cqa-flex-shrink-0 cqa-gap-14\" *ngIf=\"isTxtSelected\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n File Format Header\n </label>\n <cqa-custom-input\n placeholder=\"File Format Header\"\n [value]=\"documentForm.get('fileFormatHeader')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('fileFormatHeader')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Header text for the generated txt file\n </p>\n </div>\n </div>\n\n <!-- Template Source Section: label left, tabs right on same row -->\n <!-- <div class=\"cqa-flex cqa-flex-col cqa-flex-shrink-0 cqa-gap-3\">\n \n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-4\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0 cqa-flex-shrink-0\">\n Template Source\n </label>\n <cqa-segment-control\n class=\"cqa-flex-shrink-0\"\n [segments]=\"[\n { label: 'Use Existing Template', value: 'existing' },\n { label: 'Upload Template', value: 'upload' },\n { label: 'Create New', value: 'createNew' }\n ]\"\n [value]=\"selectedTemplateSource\"\n (valueChange)=\"onTemplateSourceChange($event)\">\n </cqa-segment-control>\n </div>\n <div class=\"document-type-select\" *ngIf=\"selectedTemplateSource === 'existing'\">\n <cqa-dynamic-select\n [form]=\"documentForm\"\n [config]=\"getTemplateSelectConfig()\">\n </cqa-dynamic-select>\n </div>\n\n <div *ngIf=\"selectedTemplateSource === 'upload'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0\">\n Attachment <span class=\"cqa-text-red-500\">*</span>\n </label>\n <input\n #fileInput\n type=\"file\"\n accept=\".pdf,.doc,.docx,.txt\"\n class=\"cqa-hidden\"\n (change)=\"onFileSelected($event)\">\n <div\n class=\"cqa-w-full cqa-min-h-[140px] cqa-rounded cqa-border-2 cqa-border-dashed cqa-border-gray-300 cqa-bg-white cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-3 cqa-p-6 cqa-cursor-pointer cqa-transition-colors\"\n [class.cqa-ring-2]=\"isDragOver\"\n [class.cqa-ring-[#3F43EE]]=\"isDragOver\"\n [class.cqa-ring-inset]=\"isDragOver\"\n (click)=\"fileInput.click()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n role=\"button\"\n tabindex=\"0\"\n (keydown.enter)=\"fileInput.click()\"\n (keydown.space)=\"fileInput.click()\"\n aria-label=\"Upload template file\">\n <svg class=\"cqa-w-8 cqa-h-8 cqa-font-bold\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/>\n <polyline points=\"17 8 12 3 7 8\"/>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"/>\n </svg>\n <p class=\"cqa-text-base cqa-text-[#374151] cqa-m-0 cqa-text-center cqa-font-bold\">\n Drag and drop files here or <span class=\"cqa-text-[#3F43EE] cqa-font-medium hover:cqa-underline\">browse</span>\n </p>\n <p class=\"cqa-text-sm cqa-text-[#6B7280] cqa-m-0\">\n PDF, DOC, or TXT files\n </p>\n </div>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-m-0\">\n Choose the file format you want to generate.\n </p>\n </div>\n <div *ngIf=\"selectedTemplateSource === 'createNew'\" class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-3\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(50%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Template Name <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"PDF Document (.pdf)\"\n [value]=\"documentForm.get('templateName')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('templateName')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(50%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Template Description <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"PDF Document (.pdf)\"\n [value]=\"documentForm.get('templateDescription')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('templateDescription')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </div>\n <div class=\"cqa-flex cqa-justify-end\">\n <cqa-button\n variant=\"filled\"\n btnSize=\"lg\"\n text=\"Create Template\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#3F43EE] cqa-bg-[#3F43EE]'\"\n (clicked)=\"onCreateTemplate()\">\n </cqa-button>\n </div>\n </div>\n </div> -->\n\n <!-- Document Mapper Section: title + subtitle left, Need help? right (CQA table below) -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-shrink-0 cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <h3 class=\"cqa-text-base cqa-font-semibold cqa-text-[#111827] cqa-text-[14px] cqa-m-0 cqa-leading-tight\">\n Document Mapper\n </h3>\n <p class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5\">\n Map placeholders to dynamic values.\n </p>\n </div>\n <div class=\"cqa-relative cqa-inline-flex cqa-flex-shrink-0\"\n (mouseenter)=\"showHelpTooltip = true\"\n (mouseleave)=\"showHelpTooltip = false\">\n <a *ngIf=\"mapperHelpUrl\"\n href=\"#\"\n (click)=\"onMapperHelpClick($event)\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[21px] cqa-no-underline cqa-cursor-pointer\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#help-icon-clip-doc)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"help-icon-clip-doc\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </a>\n <span *ngIf=\"!mapperHelpUrl\" class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-font-[500] cqa-text-[10px] cqa-cursor-default cqa-text-[#374151]\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#help-icon-clip-doc-nolink)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"help-icon-clip-doc-nolink\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </span>\n <div *ngIf=\"showHelpTooltip\" class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-top-[-24px] cqa-left-[-203px]\" role=\"tooltip\">\n <div class=\"cqa-text-white cqa-text-center cqa-whitespace-nowrap cqa-w-[306px] cqa-min-h-5 cqa-rounded-[6px] cqa-opacity-100 cqa-px-2 cqa-py-1 cqa-bg-[#0A0A0A] cqa-leading-5 cqa-text-[8px]\">\n {{ mapperHelpTooltipText }}\n </div>\n </div>\n </div>\n </div>\n <!-- Table or empty state: same container, header always visible -->\n <div class=\"cqa-rounded-lg cqa-overflow-hidden cqa-bg-white cqa-shadow-sm cqa-border cqa-border-solid cqa-border-gray-200\">\n <table class=\"cqa-w-full\">\n <thead>\n <tr class=\"cqa-items-center cqa-bg-[#D8D9FC4D]\">\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-w-[40px] cqa-border-b cqa-border-gray-200\">\n <mat-checkbox [checked]=\"allMappingsSelected\"\n [indeterminate]=\"someMappingsSelected && !allMappingsSelected\"\n (change)=\"onSelectAllMappings($event.checked)\"\n color=\"primary\"\n aria-label=\"Select all mappings\">\n </mat-checkbox>\n </th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200\">Key</th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200 cqa-w-[120px]\">Value Type</th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200\">Value</th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200 cqa-w-[48px]\">\n <span class=\"cqa-sr-only\">Delete row</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"cqa-w-full\">\n <!-- Empty state when no mappings -->\n <tr *ngIf=\"mappingsFormArray.length === 0\">\n <td colspan=\"5\" class=\"cqa-p-0 cqa-align-middle cqa-border-b cqa-border-gray-200\">\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-12 cqa-px-4 cqa-bg-white\">\n <p class=\"cqa-text-sm cqa-text-[#6B7280] cqa-m-0 cqa-mb-4\">Start mapping placeholders to values.</p>\n <button\n type=\"button\"\n class=\"cqa-rounded-lg cqa-px-4 cqa-py-2.5 cqa-text-sm cqa-font-semibold cqa-text-white cqa-bg-[#4F46E5] cqa-border-none cqa-cursor-pointer hover:cqa-opacity-90 cqa-transition-opacity\"\n (click)=\"addMapping()\">\n Add first mapping\n </button>\n </div>\n </td>\n </tr>\n <!-- Data rows when there are mappings -->\n <tr *ngFor=\"let mapping of mappingsFormArray.controls; let i = index\"\n class=\"cqa-bg-white hover:cqa-bg-[#F9FAFB]\">\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-top cqa-border-b cqa-border-gray-200\">\n <mat-checkbox [checked]=\"getMappingFormGroup(i).get('enabled')?.value\"\n (change)=\"getMappingFormGroup(i).get('enabled')?.setValue($event.checked)\"\n color=\"primary\"\n aria-label=\"Enable mapping\">\n </mat-checkbox>\n </td>\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-top cqa-border-b cqa-border-gray-200 \">\n <cqa-custom-input\n [placeholder]=\"'Key'\"\n [value]=\"getMappingFormGroup(i).get('key')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"getMappingFormGroup(i).get('key')?.setValue($event)\">\n </cqa-custom-input>\n </td>\n <td colspan=\"2\" class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-top cqa-border-b cqa-border-gray-200\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div *ngFor=\"let entry of getValuesFormArray(i).controls; let j = index\"\n class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"document-type-select cqa-w-[120px] cqa-flex-shrink-0\">\n <cqa-dynamic-select\n [form]=\"getValueFormGroup(i, j)\"\n [config]=\"getValueTypeConfig(i, j)\">\n </cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-custom-input\n [placeholder]=\"'Value'\"\n [value]=\"getValueFormGroup(i, j).get('value')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"getValueFormGroup(i, j).get('value')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-7 cqa-h-7 cqa-rounded cqa-text-[#9CA3AF] cqa-transition-colors cqa-border-none cqa-bg-transparent cqa-cursor-pointer hover:cqa-text-[#374151] disabled:cqa-opacity-30 disabled:cqa-cursor-not-allowed\"\n [disabled]=\"getValuesFormArray(i).length <= 1\"\n (click)=\"removeValueEntry(i, j)\"\n [attr.aria-label]=\"'Remove value'\"\n [attr.title]=\"getValuesFormArray(i).length <= 1 ? 'A key needs at least one value' : 'Remove this value'\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px] cqa-leading-[18px]\">close</mat-icon>\n </button>\n </div>\n <button\n type=\"button\"\n class=\"cqa-self-start cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mt-1\"\n (click)=\"addValueEntry(i)\"\n [attr.aria-label]=\"'Add value'\">\n <mat-icon class=\"cqa-text-[16px] cqa-w-4 cqa-h-4 cqa-leading-4\">add</mat-icon>\n Add value\n </button>\n </div>\n </td>\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-top cqa-border-b cqa-border-gray-200\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded cqa-text-[#E57373] cqa-transition-colors cqa-border-none cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80\"\n (click)=\"removeMapping(i)\"\n [attr.aria-label]=\"'Delete key row'\"\n title=\"Delete this key and all its values\">\n <svg class=\"cqa-w-5 cqa-h-5 cqa-flex-shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 6h18M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2m3 0v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6h14z\"/>\n <path d=\"M10 11v6M14 11v6\"/>\n </svg>\n </button>\n </td>\n </tr>\n </tbody>\n \n </table>\n <div class=\"cqa-flex cqa-justify-end\" *ngIf=\"mappingsFormArray.length > 0\">\n <button\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-3\"\n (click)=\"addMapping()\">\n + Add Mapping\n </button>\n </div>\n </div>\n <!-- <div class=\"cqa-flex cqa-justify-end\" *ngIf=\"mappingsFormArray.length > 0\">\n <button\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0\"\n (click)=\"addMapping()\">\n + Add Mapping\n </button>\n </div> -->\n </div>\n\n <!-- Description (after Document Mapper) -->\n <div class=\"cqa-flex cqa-flex-wrap cqa-flex-shrink-0 cqa-gap-14\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Description\n </label>\n <cqa-custom-input\n placeholder=\"Description\"\n [value]=\"documentForm.get('description')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('description')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Optional description for this document generation step\n </p>\n </div>\n </div>\n </div>\n\n <!-- Advanced Settings Variables Form -->\n <div *ngIf=\"advancedSettingsVariables.length > 0\" class=\"cqa-flex-shrink-0 cqa-px-4 cqa-pb-3\">\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n </div>\n \n\n <!-- Divider above footer -->\n <div class=\"cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full\" role=\"presentation\"></div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-items-stretch cqa-w-full cqa-p-4 cqa-gap-3\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n btnSize=\"lg\"\n text=\"Cancel\"\n [fullWidth]=\"true\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button *ngIf=\"!isCreatingStep\"\n variant=\"filled\"\n btnSize=\"lg\"\n [text]=\"editMode ? 'Update Step' : 'Create Step'\"\n [fullWidth]=\"true\"\n [disabled]=\"!isFormValid()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#3F43EE]'\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"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>\n</div>\n" }]
|
|
469
|
+
args: [{ selector: 'cqa-step-builder-document', template: "<div class=\"cqa-ui-root cqa-block cqa-w-full cqa-min-w-0 cqa-step-builder-document\" style=\"height: 100%;width: 100%;\">\n <div\n class=\"cqa-flex cqa-flex-col cqa-w-full cqa-min-w-0 cqa-h-full cqa-bg-white cqa-border cqa-box-border cqa-max-w-full cqa-opacity-100 cqa-h-full cqa-w-full\">\n <!-- Content area: padding 16px, gap 12px between sections (no flex-1 to avoid gap above footer) -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-overflow-y-auto cqa-p-4 cqa-gap-3\">\n <!-- Header: Document Generation Template Step (left-aligned, Inter 600 12px line-height 100%) -->\n <h2\n class=\"cqa-text-[12px] cqa-leading-[100%] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-text-left cqa-flex-shrink-0 cqa-align-middle\">\n Document Generation Template Step\n </h2>\n\n <!-- File Name and Document Type Row -->\n <div class=\"cqa-flex cqa-flex-wrap cqa-flex-shrink-0 cqa-gap-14\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n File Name <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"File Name\"\n [value]=\"documentForm.get('fileName')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('fileName')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n The name of the file to be generated\n </p>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)] \">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Document Type <span class=\"cqa-text-red-500\">*</span>\n </label>\n <div class=\"document-type-select\">\n <cqa-dynamic-select\n [form]=\"documentForm\"\n [config]=\"getDocumentTypeConfig()\">\n </cqa-dynamic-select>\n </div>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Choose the file format you want to generate.\n </p>\n </div>\n </div>\n\n <!-- Output Variable and Conditional Fields Row -->\n <div class=\"cqa-flex cqa-flex-wrap cqa-flex-shrink-0 cqa-gap-14\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Output Variable <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"Input\"\n [value]=\"documentForm.get('outputVariable')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('outputVariable')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Stores the generated file so it can be used in later steps.\n </p>\n </div>\n <!-- Seprator (shown when documentType is 'txt') -->\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\" *ngIf=\"isTxtSelected\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Seprator\n </label>\n <cqa-custom-input\n placeholder=\"Seprator\"\n [value]=\"documentForm.get('seprator')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('seprator')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n The seprator to be used to separate the values in the generated file\n </p>\n </div>\n <!-- Delimeter Type (shown when documentType is 'csv') -->\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\" *ngIf=\"isCsvSelected\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Delimeter Type\n </label>\n <div class=\"document-type-select\">\n <cqa-dynamic-select\n [form]=\"documentForm\"\n [config]=\"getDelimeterConfig()\">\n </cqa-dynamic-select>\n </div>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Choose the delimeter type for the CSV file\n </p>\n </div>\n </div>\n\n <!-- File Format Header (shown when documentType is 'txt') -->\n <div class=\"cqa-flex cqa-flex-wrap cqa-flex-shrink-0 cqa-gap-14\" *ngIf=\"isTxtSelected\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n File Format Header\n </label>\n <cqa-custom-input\n placeholder=\"File Format Header\"\n [value]=\"documentForm.get('fileFormatHeader')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('fileFormatHeader')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Header text for the generated txt file\n </p>\n </div>\n </div>\n\n <!-- Template Source Section: label left, tabs right on same row -->\n <!-- <div class=\"cqa-flex cqa-flex-col cqa-flex-shrink-0 cqa-gap-3\">\n \n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-4\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0 cqa-flex-shrink-0\">\n Template Source\n </label>\n <cqa-segment-control\n class=\"cqa-flex-shrink-0\"\n [segments]=\"[\n { label: 'Use Existing Template', value: 'existing' },\n { label: 'Upload Template', value: 'upload' },\n { label: 'Create New', value: 'createNew' }\n ]\"\n [value]=\"selectedTemplateSource\"\n (valueChange)=\"onTemplateSourceChange($event)\">\n </cqa-segment-control>\n </div>\n <div class=\"document-type-select\" *ngIf=\"selectedTemplateSource === 'existing'\">\n <cqa-dynamic-select\n [form]=\"documentForm\"\n [config]=\"getTemplateSelectConfig()\">\n </cqa-dynamic-select>\n </div>\n\n <div *ngIf=\"selectedTemplateSource === 'upload'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0\">\n Attachment <span class=\"cqa-text-red-500\">*</span>\n </label>\n <input\n #fileInput\n type=\"file\"\n accept=\".pdf,.doc,.docx,.txt\"\n class=\"cqa-hidden\"\n (change)=\"onFileSelected($event)\">\n <div\n class=\"cqa-w-full cqa-min-h-[140px] cqa-rounded cqa-border-2 cqa-border-dashed cqa-border-gray-300 cqa-bg-white cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-3 cqa-p-6 cqa-cursor-pointer cqa-transition-colors\"\n [class.cqa-ring-2]=\"isDragOver\"\n [class.cqa-ring-[#3F43EE]]=\"isDragOver\"\n [class.cqa-ring-inset]=\"isDragOver\"\n (click)=\"fileInput.click()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n role=\"button\"\n tabindex=\"0\"\n (keydown.enter)=\"fileInput.click()\"\n (keydown.space)=\"fileInput.click()\"\n aria-label=\"Upload template file\">\n <svg class=\"cqa-w-8 cqa-h-8 cqa-font-bold\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/>\n <polyline points=\"17 8 12 3 7 8\"/>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"/>\n </svg>\n <p class=\"cqa-text-base cqa-text-[#374151] cqa-m-0 cqa-text-center cqa-font-bold\">\n Drag and drop files here or <span class=\"cqa-text-[#3F43EE] cqa-font-medium hover:cqa-underline\">browse</span>\n </p>\n <p class=\"cqa-text-sm cqa-text-[#6B7280] cqa-m-0\">\n PDF, DOC, or TXT files\n </p>\n </div>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-m-0\">\n Choose the file format you want to generate.\n </p>\n </div>\n <div *ngIf=\"selectedTemplateSource === 'createNew'\" class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-3\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(50%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Template Name <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"PDF Document (.pdf)\"\n [value]=\"documentForm.get('templateName')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('templateName')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(50%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Template Description <span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input\n placeholder=\"PDF Document (.pdf)\"\n [value]=\"documentForm.get('templateDescription')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('templateDescription')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </div>\n <div class=\"cqa-flex cqa-justify-end\">\n <cqa-button\n variant=\"filled\"\n btnSize=\"lg\"\n text=\"Create Template\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#3F43EE] cqa-bg-[#3F43EE]'\"\n (clicked)=\"onCreateTemplate()\">\n </cqa-button>\n </div>\n </div>\n </div> -->\n\n <!-- Document Mapper Section: title + subtitle left, Need help? right (CQA table below) -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-shrink-0 cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <h3 class=\"cqa-text-base cqa-font-semibold cqa-text-[#111827] cqa-text-[14px] cqa-m-0 cqa-leading-tight\">\n Document Mapper\n </h3>\n <p class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5\">\n Map placeholders to dynamic values.\n </p>\n </div>\n <div class=\"cqa-relative cqa-inline-flex cqa-flex-shrink-0\"\n (mouseenter)=\"showHelpTooltip = true\"\n (mouseleave)=\"showHelpTooltip = false\">\n <a *ngIf=\"mapperHelpUrl\"\n href=\"#\"\n (click)=\"onMapperHelpClick($event)\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[21px] cqa-no-underline cqa-cursor-pointer\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#help-icon-clip-doc)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"help-icon-clip-doc\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </a>\n <span *ngIf=\"!mapperHelpUrl\" class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-font-[500] cqa-text-[10px] cqa-cursor-default cqa-text-[#374151]\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#help-icon-clip-doc-nolink)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"help-icon-clip-doc-nolink\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </span>\n <div *ngIf=\"showHelpTooltip\" class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-top-[-24px] cqa-left-[-203px]\" role=\"tooltip\">\n <div class=\"cqa-text-white cqa-text-center cqa-whitespace-nowrap cqa-w-[306px] cqa-min-h-5 cqa-rounded-[6px] cqa-opacity-100 cqa-px-2 cqa-py-1 cqa-bg-[#0A0A0A] cqa-leading-5 cqa-text-[8px]\">\n {{ mapperHelpTooltipText }}\n </div>\n </div>\n </div>\n </div>\n <!-- Table or empty state: same container, header always visible -->\n <div class=\"cqa-rounded-lg cqa-overflow-hidden cqa-bg-white cqa-shadow-sm cqa-border cqa-border-solid cqa-border-gray-200\">\n <table class=\"cqa-w-full\">\n <thead>\n <tr class=\"cqa-items-center cqa-bg-[#D8D9FC4D]\">\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-w-[40px] cqa-border-b cqa-border-gray-200\">\n <mat-checkbox [checked]=\"allMappingsSelected\"\n [indeterminate]=\"someMappingsSelected && !allMappingsSelected\"\n (change)=\"onSelectAllMappings($event.checked)\"\n color=\"primary\"\n aria-label=\"Select all mappings\">\n </mat-checkbox>\n </th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200\">Key (column name)</th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200 cqa-w-[120px]\">Value Type</th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200\">Value</th>\n <th class=\"cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-text-left cqa-border-b cqa-border-gray-200 cqa-w-[48px]\">\n <span class=\"cqa-sr-only\">Delete row</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"cqa-w-full\">\n <!-- Empty state when no mappings -->\n <tr *ngIf=\"mappingsFormArray.length === 0\">\n <td colspan=\"5\" class=\"cqa-p-0 cqa-align-middle cqa-border-b cqa-border-gray-200\">\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-12 cqa-px-4 cqa-bg-white\">\n <p class=\"cqa-text-sm cqa-text-[#6B7280] cqa-m-0 cqa-mb-4\">Start mapping placeholders to values.</p>\n <button\n type=\"button\"\n class=\"cqa-rounded-lg cqa-px-4 cqa-py-2.5 cqa-text-sm cqa-font-semibold cqa-text-white cqa-bg-[#4F46E5] cqa-border-none cqa-cursor-pointer hover:cqa-opacity-90 cqa-transition-opacity\"\n (click)=\"addMapping()\">\n Add first mapping\n </button>\n </div>\n </td>\n </tr>\n <!-- Data rows when there are mappings -->\n <tr *ngFor=\"let mapping of mappingsFormArray.controls; let i = index\"\n class=\"cqa-bg-white hover:cqa-bg-[#F9FAFB]\">\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-top cqa-border-b cqa-border-gray-200\">\n <mat-checkbox [checked]=\"getMappingFormGroup(i).get('enabled')?.value\"\n (change)=\"getMappingFormGroup(i).get('enabled')?.setValue($event.checked)\"\n color=\"primary\"\n aria-label=\"Enable mapping\">\n </mat-checkbox>\n </td>\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-top cqa-border-b cqa-border-gray-200 \">\n <cqa-custom-input\n [placeholder]=\"'Key'\"\n [value]=\"getMappingFormGroup(i).get('key')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"getMappingFormGroup(i).get('key')?.setValue($event)\">\n </cqa-custom-input>\n </td>\n <td colspan=\"2\" class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-top cqa-border-b cqa-border-gray-200\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div *ngFor=\"let entry of getValuesFormArray(i).controls; let j = index\"\n class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"document-type-select cqa-w-[120px] cqa-flex-shrink-0\">\n <cqa-dynamic-select\n [form]=\"getValueFormGroup(i, j)\"\n [config]=\"getValueTypeConfig(i, j)\">\n </cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-custom-input\n [placeholder]=\"'Value'\"\n [value]=\"getValueFormGroup(i, j).get('value')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"getValueFormGroup(i, j).get('value')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-7 cqa-h-7 cqa-rounded cqa-text-[#9CA3AF] cqa-transition-colors cqa-border-none cqa-bg-transparent cqa-cursor-pointer hover:cqa-text-[#374151] disabled:cqa-opacity-30 disabled:cqa-cursor-not-allowed\"\n [disabled]=\"getValuesFormArray(i).length <= 1\"\n (click)=\"removeValueEntry(i, j)\"\n [attr.aria-label]=\"'Remove value'\"\n [attr.title]=\"getValuesFormArray(i).length <= 1 ? 'A key needs at least one value' : 'Remove this value'\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px] cqa-leading-[18px]\">close</mat-icon>\n </button>\n </div>\n <button\n type=\"button\"\n class=\"cqa-self-start cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mt-1\"\n (click)=\"addValueEntry(i)\"\n [attr.aria-label]=\"'Add value'\">\n <mat-icon class=\"cqa-text-[16px] cqa-w-4 cqa-h-4 cqa-leading-4\">add</mat-icon>\n Add value\n </button>\n </div>\n </td>\n <td class=\"cqa-px-[10.5px] cqa-py-[11px] cqa-align-top cqa-border-b cqa-border-gray-200\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded cqa-text-[#E57373] cqa-transition-colors cqa-border-none cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80\"\n (click)=\"removeMapping(i)\"\n [attr.aria-label]=\"'Delete key row'\"\n title=\"Delete this key and all its values\">\n <svg class=\"cqa-w-5 cqa-h-5 cqa-flex-shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 6h18M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2m3 0v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6h14z\"/>\n <path d=\"M10 11v6M14 11v6\"/>\n </svg>\n </button>\n </td>\n </tr>\n </tbody>\n \n </table>\n <div class=\"cqa-flex cqa-justify-end\" *ngIf=\"mappingsFormArray.length > 0\">\n <button\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-3\"\n (click)=\"addMapping()\">\n + Add Mapping\n </button>\n </div>\n </div>\n <!-- <div class=\"cqa-flex cqa-justify-end\" *ngIf=\"mappingsFormArray.length > 0\">\n <button\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0\"\n (click)=\"addMapping()\">\n + Add Mapping\n </button>\n </div> -->\n </div>\n\n <!-- Description (after Document Mapper) -->\n <div class=\"cqa-flex cqa-flex-wrap cqa-flex-shrink-0 cqa-gap-14\">\n <div class=\"cqa-flex-1 cqa-min-w-0 cqa-min-w-[calc(45%-6px)]\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-mb-1.5 cqa-block\">\n Description\n </label>\n <cqa-custom-input\n placeholder=\"Description\"\n [value]=\"documentForm.get('description')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"documentForm.get('description')?.setValue($event)\">\n </cqa-custom-input>\n <p class=\"cqa-text-xs cqa-text-[#0A0A0A] cqa-mt-1 cqa-m-0\">\n Optional description for this document generation step\n </p>\n </div>\n </div>\n </div>\n\n <!-- Advanced Settings Variables Form -->\n <div *ngIf=\"advancedSettingsVariables.length > 0\" class=\"cqa-flex-shrink-0 cqa-px-4 cqa-pb-3\">\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div>\n </div>\n \n\n <!-- Divider above footer -->\n <div class=\"cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full\" role=\"presentation\"></div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-items-stretch cqa-w-full cqa-p-4 cqa-gap-3\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n btnSize=\"lg\"\n text=\"Cancel\"\n [fullWidth]=\"true\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button *ngIf=\"!isCreatingStep\"\n variant=\"filled\"\n btnSize=\"lg\"\n [text]=\"editMode ? 'Update Step' : 'Create Step'\"\n [fullWidth]=\"true\"\n [disabled]=\"!isFormValid()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#3F43EE]'\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"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>\n</div>\n" }]
|
|
470
470
|
}], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { documentTypeOptions: [{
|
|
471
471
|
type: Input
|
|
472
472
|
}], templateOptions: [{
|
|
@@ -520,4 +520,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
520
520
|
}], createTemplate: [{
|
|
521
521
|
type: Output
|
|
522
522
|
}] } });
|
|
523
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWRvY3VtZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3RlcC1idWlsZGVyL3N0ZXAtYnVpbGRlci1kb2N1bWVudC9zdGVwLWJ1aWxkZXItZG9jdW1lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWRvY3VtZW50L3N0ZXAtYnVpbGRlci1kb2N1bWVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQTBCLFNBQVMsRUFBZSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7QUF5QzVGLE1BQU0sT0FBTyw0QkFBNEI7SUFzR3ZDLFlBQW9CLEVBQWU7UUFBZixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBckduQyx5Q0FBeUM7UUFDaEMsd0JBQW1CLEdBQW1CLEVBQUUsQ0FBQztRQUVsRCwrRUFBK0U7UUFDdEUsb0JBQWUsR0FBbUIsRUFBRSxDQUFDO1FBRTlDLHlEQUF5RDtRQUNoRCxxQkFBZ0IsR0FBbUI7WUFDMUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO1lBQzFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtZQUNsRSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUU7WUFD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QkFBa0I7c0JBQTFCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQU1JLFVBQVU7c0JBQW5CLE1BQU07Z0JBR0csU0FBUztzQkFBbEIsTUFBTTtnQkFHRyxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuXG5leHBvcnQgdHlwZSBUZW1wbGF0ZVNvdXJjZVR5cGUgPSAnZXhpc3RpbmcnIHwgJ3VwbG9hZCcgfCAnY3JlYXRlTmV3JztcblxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudE1hcHBpbmdWYWx1ZUVudHJ5IHtcbiAgdmFsdWVUeXBlOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRNYXBwaW5nUm93IHtcbiAga2V5OiBzdHJpbmc7XG4gIHZhbHVlczogRG9jdW1lbnRNYXBwaW5nVmFsdWVFbnRyeVtdO1xuICBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudEZvcm1EYXRhIHtcbiAgZG9jdW1lbnRUeXBlOiBzdHJpbmc7XG4gIG91dHB1dFZhcmlhYmxlOiBzdHJpbmc7XG4gIGZpbGVOYW1lPzogc3RyaW5nO1xuICBzZXByYXRvcj86IHN0cmluZztcbiAgZGVsaW1ldGVyPzogc3RyaW5nO1xuICBmaWxlRm9ybWF0SGVhZGVyPzogc3RyaW5nO1xuICAvKiogRGVzY3JpcHRpb24gZm9yIHRoZSBkb2N1bWVudCBnZW5lcmF0aW9uIHN0ZXAgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHRlbXBsYXRlU291cmNlOiBUZW1wbGF0ZVNvdXJjZVR5cGU7XG4gIHRlbXBsYXRlSWQ/OiBzdHJpbmc7XG4gIC8qKiBVcGxvYWRlZCB0ZW1wbGF0ZSBmaWxlIHdoZW4gdGVtcGxhdGVTb3VyY2UgaXMgJ3VwbG9hZCcgKi9cbiAgdXBsb2FkZWRGaWxlPzogRmlsZTtcbiAgLyoqIFRlbXBsYXRlIG5hbWUgd2hlbiB0ZW1wbGF0ZVNvdXJjZSBpcyAnY3JlYXRlTmV3JyAqL1xuICB0ZW1wbGF0ZU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBUZW1wbGF0ZSBkZXNjcmlwdGlvbiB3aGVuIHRlbXBsYXRlU291cmNlIGlzICdjcmVhdGVOZXcnICovXG4gIHRlbXBsYXRlRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIG1hcHBpbmdzOiBEb2N1bWVudE1hcHBpbmdSb3dbXTtcbiAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcz86IGFueVtdO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc3RlcC1idWlsZGVyLWRvY3VtZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXAtYnVpbGRlci1kb2N1bWVudC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgU3RlcEJ1aWxkZXJEb2N1bWVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgLyoqIE9wdGlvbnMgZm9yIGRvY3VtZW50IHR5cGUgZHJvcGRvd24gKi9cbiAgQElucHV0KCkgZG9jdW1lbnRUeXBlT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXTtcblxuICAvKiogT3B0aW9ucyBmb3IgdGVtcGxhdGUgZHJvcGRvd24gKHdoZW4gXCJVc2UgRXhpc3RpbmcgVGVtcGxhdGVcIiBpcyBzZWxlY3RlZCkgKi9cbiAgQElucHV0KCkgdGVtcGxhdGVPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuXG4gIC8qKiBPcHRpb25zIGZvciB2YWx1ZSB0eXBlIGRyb3Bkb3duIGluIGRvY3VtZW50IG1hcHBlciAqL1xuICBASW5wdXQoKSB2YWx1ZVR5cGVPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAndmFyaWFibGUnLCB2YWx1ZTogJ3ZhcmlhYmxlJywgbmFtZTogJ1ZhcmlhYmxlJywgbGFiZWw6ICdWYXJpYWJsZScgfSxcbiAgICB7IGlkOiAnc3RhdGljJywgdmFsdWU6ICdzdGF0aWMnLCBuYW1lOiAnU3RhdGljJywgbGFiZWw6ICdTdGF0aWMnIH0sXG4gICAgeyBpZDogJ2V4cHJlc3Npb24nLCB2YWx1ZTogJ2V4cHJlc3Npb24nLCBuYW1lOiAnRXhwcmVzc2lvbicsIGxhYmVsOiAnRXhwcmVzc2lvbicgfSxcbiAgICB7IGlkOiAncmVmZXJlbmNlJywgdmFsdWU6ICdyZWZlcmVuY2UnLCBuYW1lOiAnUmVmZXJlbmNlJywgbGFiZWw6ICdSZWZlcmVuY2UnIH1cbiAgXTtcblxuICAvKiogT3B0aW9ucyBmb3IgZGVsaW1ldGVyIHR5cGUgZHJvcGRvd24gKHNob3duIHdoZW4gZG9jdW1lbnRUeXBlIGlzICdjc3YnKSAqL1xuICBASW5wdXQoKSBkZWxpbWV0ZXJUeXBlT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJywnLCB2YWx1ZTogJywnLCBuYW1lOiAnQ29tbWEgKCwpJywgbGFiZWw6ICdDb21tYSAoLCknIH0sXG4gICAgeyBpZDogJzsnLCB2YWx1ZTogJzsnLCBuYW1lOiAnU2VtaWNvbG9uICg7KScsIGxhYmVsOiAnU2VtaWNvbG9uICg7KScgfSxcbiAgICB7IGlkOiAnXFxcXHQnLCB2YWx1ZTogJ1xcXFx0JywgbmFtZTogJ1RhYiAoXFxcXHQpJywgbGFiZWw6ICdUYWIgKFxcXFx0KScgfSxcbiAgICB7IGlkOiAnfCcsIHZhbHVlOiAnfCcsIG5hbWU6ICdQaXBlICh8KScsIGxhYmVsOiAnUGlwZSAofCknIH1cbiAgXTtcblxuICAvKiogRnVuY3Rpb24gdG8gaGFuZGxlIGFkdmFuY2VkIHNldHRpbmdzIHZhcmlhYmxlcy4gQ2FuIGJlIHBhc3NlZCBmcm9tIHBhcmVudCBjb21wb25lbnQuICovXG4gIEBJbnB1dCgpIHNldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6ICh0ZW1wbGF0ZT86IGFueSwgdGVzdFN0ZXA/OiBhbnkpID0+IGFueVtdID0gKCkgPT4geyByZXR1cm4gW119O1xuICBcbiAgLyoqIFRlbXBsYXRlIGZvciBhZHZhbmNlZCBzZXR0aW5ncyAob3B0aW9uYWwpICovXG4gIEBJbnB1dCgpIHRlbXBsYXRlPzogYW55O1xuICBcbiAgLyoqIFRlc3Qgc3RlcCBmb3IgYWR2YW5jZWQgc2V0dGluZ3MgKG9wdGlvbmFsKSAqL1xuICBASW5wdXQoKSB0ZXN0U3RlcD86IGFueTtcblxuICAvKiogT3B0aW9uYWwgVVJMIGZvciBcIk5lZWQgaGVscD9cIiBsaW5rIGluIERvY3VtZW50IE1hcHBlciBzZWN0aW9uICovXG4gIEBJbnB1dCgpIG1hcHBlckhlbHBVcmw6IHN0cmluZyA9ICcnO1xuXG4gIC8qKiBUb29sdGlwIHRleHQgd2hlbiBob3ZlcmluZyBvdmVyIFwiTmVlZCBoZWxwP1wiIChzYW1lIGFzIGN1c3RvbS1lZGl0LXN0ZXApICovXG4gIEBJbnB1dCgpIG1hcHBlckhlbHBUb29sdGlwVGV4dDogc3RyaW5nID0gJ05vdCBzdXJlIHdoYXQgdG8gZG8/IENsaWNrIHRvIGdvIHRvIG91ciBkZXRhaWxlZCBzdGVwIGNyZWF0aW9uIGRvY3VtZW50YXRpb24nO1xuXG4gIC8qKiBJbml0aWFsIGRvY3VtZW50IHR5cGUgZm9yIGVkaXQgbW9kZSAqL1xuICBASW5wdXQoKSBpbml0aWFsRG9jdW1lbnRUeXBlPzogc3RyaW5nO1xuXG4gIC8qKiBJbml0aWFsIG91dHB1dCB2YXJpYWJsZSBmb3IgZWRpdCBtb2RlICovXG4gIEBJbnB1dCgpIGluaXRpYWxPdXRwdXRWYXJpYWJsZT86IHN0cmluZztcblxuICAvKiogSW5pdGlhbCB0ZW1wbGF0ZSBzb3VyY2UgZm9yIGVkaXQgbW9kZSAqL1xuICBASW5wdXQoKSBpbml0aWFsVGVtcGxhdGVTb3VyY2U/OiBUZW1wbGF0ZVNvdXJjZVR5cGU7XG5cbiAgLyoqIEluaXRpYWwgdGVtcGxhdGUgSUQgZm9yIGVkaXQgbW9kZSAqL1xuICBASW5wdXQoKSBpbml0aWFsVGVtcGxhdGVJZD86IHN0cmluZztcblxuICAvKiogSW5pdGlhbCB0ZW1wbGF0ZSBuYW1lIGZvciBlZGl0IG1vZGUgKHdoZW4gdGVtcGxhdGVTb3VyY2UgaXMgJ2NyZWF0ZU5ldycpICovXG4gIEBJbnB1dCgpIGluaXRpYWxUZW1wbGF0ZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqIEluaXRpYWwgdGVtcGxhdGUgZGVzY3JpcHRpb24gZm9yIGVkaXQgbW9kZSAod2hlbiB0ZW1wbGF0ZVNvdXJjZSBpcyAnY3JlYXRlTmV3JykgKi9cbiAgQElucHV0KCkgaW5pdGlhbFRlbXBsYXRlRGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqIEluaXRpYWwgbWFwcGluZ3MgZm9yIGVkaXQgbW9kZSAqL1xuICBASW5wdXQoKSBpbml0aWFsTWFwcGluZ3M/OiBEb2N1bWVudE1hcHBpbmdSb3dbXTtcblxuICAvKiogSW5pdGlhbCBmaWxlIG5hbWUgZm9yIGVkaXQgbW9kZSAqL1xuICBASW5wdXQoKSBpbml0aWFsRmlsZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqIEluaXRpYWwgc2VwcmF0b3IgZm9yIGVkaXQgbW9kZSAqL1xuICBASW5wdXQoKSBpbml0aWFsU2VwcmF0b3I/OiBzdHJpbmc7XG5cbiAgLyoqIEluaXRpYWwgZGVsaW1ldGVyIGZvciBlZGl0IG1vZGUgKi9cbiAgQElucHV0KCkgaW5pdGlhbERlbGltZXRlcj86IHN0cmluZztcblxuICAvKiogSW5pdGlhbCBmaWxlIGZvcm1hdCBoZWFkZXIgZm9yIGVkaXQgbW9kZSAqL1xuICBASW5wdXQoKSBpbml0aWFsRmlsZUZvcm1hdEhlYWRlcj86IHN0cmluZztcblxuICAvKiogSW5pdGlhbCBkZXNjcmlwdGlvbiBmb3IgZWRpdCBtb2RlICovXG4gIEBJbnB1dCgpIGluaXRpYWxEZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKiogV2hldGhlciBpbiBlZGl0IG1vZGUgKi9cbiAgQElucHV0KCkgZWRpdE1vZGU/OiBib29sZWFuO1xuXG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBjcmVhdGluZyB0aGUgc3RlcCAoQVBJIGluIHByb2dyZXNzKTsgc2hvdyBsb2FkZXIgb24gQ3JlYXRlL1VwZGF0ZSBTdGVwIGJ1dHRvbiAqL1xuICBASW5wdXQoKSBpc0NyZWF0aW5nU3RlcDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBoZWxwIHRvb2x0aXAgaXMgdmlzaWJsZSAqL1xuICBzaG93SGVscFRvb2x0aXAgPSBmYWxzZTtcblxuICAvKiogRW1pdCB3aGVuIHN0ZXAgaXMgY3JlYXRlZCAqL1xuICBAT3V0cHV0KCkgY3JlYXRlU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8RG9jdW1lbnRGb3JtRGF0YT4oKTtcblxuICAvKiogRW1pdCB3aGVuIGNhbmNlbGxlZCAqL1xuICBAT3V0cHV0KCkgY2FuY2VsbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gXCJDcmVhdGUgVGVtcGxhdGVcIiBpcyBjbGlja2VkIChDcmVhdGUgTmV3IGZsb3cpLiBIb3N0IGNhbiBjcmVhdGUgdGVtcGxhdGUgdmlhIEFQSS4gKi9cbiAgQE91dHB1dCgpIGNyZWF0ZVRlbXBsYXRlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHRlbXBsYXRlTmFtZTogc3RyaW5nOyB0ZW1wbGF0ZURlc2NyaXB0aW9uOiBzdHJpbmcgfT4oKTtcblxuICBkb2N1bWVudEZvcm06IEZvcm1Hcm91cDtcbiAgc2VsZWN0ZWRUZW1wbGF0ZVNvdXJjZTogVGVtcGxhdGVTb3VyY2VUeXBlID0gJ2V4aXN0aW5nJztcbiAgLyoqIFVwbG9hZGVkIGZpbGUgd2hlbiBUZW1wbGF0ZSBTb3VyY2UgaXMgXCJVcGxvYWQgVGVtcGxhdGVcIiAqL1xuICB1cGxvYWRlZEZpbGU6IEZpbGUgfCBudWxsID0gbnVsbDtcbiAgLyoqIFZpc3VhbCBzdGF0ZSBmb3IgZHJhZy1hbmQtZHJvcCB6b25lICovXG4gIGlzRHJhZ092ZXIgPSBmYWxzZTtcbiAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogYW55W10gPSBbXTtcbiAgYWR2YW5jZWRWYXJpYWJsZXNGb3JtOiBGb3JtQXJyYXk7XG4gIGFkdmFuY2VkRXhwYW5kZWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7XG4gICAgdGhpcy5kb2N1bWVudEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGRvY3VtZW50VHlwZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIG91dHB1dFZhcmlhYmxlOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgZmlsZU5hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBzZXByYXRvcjogWycnXSxcbiAgICAgIGRlbGltZXRlcjogWycnXSxcbiAgICAgIGZpbGVGb3JtYXRIZWFkZXI6IFsnJ10sXG4gICAgICBkZXNjcmlwdGlvbjogWycnXSxcbiAgICAgIHRlbXBsYXRlU291cmNlOiBbJ2V4aXN0aW5nJ10sXG4gICAgICB0ZW1wbGF0ZUlkOiBbbnVsbF0sXG4gICAgICB0ZW1wbGF0ZU5hbWU6IFsnJ10sXG4gICAgICB0ZW1wbGF0ZURlc2NyaXB0aW9uOiBbJyddLFxuICAgICAgbWFwcGluZ3M6IHRoaXMuZmIuYXJyYXkoW10pXG4gICAgfSk7XG4gICAgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0gPSB0aGlzLmZiLmFycmF5KFtdKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZVNvdXJjZSA9IHRoaXMuaW5pdGlhbFRlbXBsYXRlU291cmNlIHx8IHRoaXMuZG9jdW1lbnRGb3JtLmdldCgndGVtcGxhdGVTb3VyY2UnKT8udmFsdWUgfHwgJ2V4aXN0aW5nJztcbiAgICB0aGlzLmluaXRpYWxpemVGb3JtV2l0aEluaXRpYWxWYWx1ZXMoKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGFkdmFuY2VkIHNldHRpbmdzIHZhcmlhYmxlc1xuICAgIGlmICh0aGlzLnNldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMpIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyA9IHRoaXMuc2V0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyh0aGlzLnRlbXBsYXRlLCB0aGlzLnRlc3RTdGVwKTtcbiAgICAgIHRoaXMuYnVpbGRBZHZhbmNlZFZhcmlhYmxlc0Zvcm0oKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2RvY3VtZW50VHlwZU9wdGlvbnMnXSB8fCBjaGFuZ2VzWyd0ZW1wbGF0ZU9wdGlvbnMnXSB8fCBjaGFuZ2VzWyd2YWx1ZVR5cGVPcHRpb25zJ10gfHwgY2hhbmdlc1snZGVsaW1ldGVyVHlwZU9wdGlvbnMnXSkge1xuICAgICAgLy8gQ29uZmlncyBhcmUgYnVpbHQgZnJvbSBpbnB1dHMgaW4gZ2V0dGVyczsgbm8gbmVlZCB0byByZWJ1aWxkIGZvcm1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxEb2N1bWVudFR5cGUnXSB8fCBjaGFuZ2VzWydpbml0aWFsT3V0cHV0VmFyaWFibGUnXSB8fCBjaGFuZ2VzWydpbml0aWFsVGVtcGxhdGVTb3VyY2UnXSB8fCBcbiAgICAgICAgY2hhbmdlc1snaW5pdGlhbFRlbXBsYXRlSWQnXSB8fCBjaGFuZ2VzWydpbml0aWFsTWFwcGluZ3MnXSB8fCBjaGFuZ2VzWydpbml0aWFsVGVtcGxhdGVOYW1lJ10gfHwgXG4gICAgICAgIGNoYW5nZXNbJ2luaXRpYWxUZW1wbGF0ZURlc2NyaXB0aW9uJ10gfHwgY2hhbmdlc1snaW5pdGlhbEZpbGVOYW1lJ10gfHwgY2hhbmdlc1snaW5pdGlhbFNlcHJhdG9yJ10gfHwgXG4gICAgICAgIGNoYW5nZXNbJ2luaXRpYWxEZWxpbWV0ZXInXSB8fCBjaGFuZ2VzWydpbml0aWFsRmlsZUZvcm1hdEhlYWRlciddIHx8IGNoYW5nZXNbJ2luaXRpYWxEZXNjcmlwdGlvbiddKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVGb3JtV2l0aEluaXRpYWxWYWx1ZXMoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3RlbXBsYXRlJ10gfHwgY2hhbmdlc1sndGVzdFN0ZXAnXSB8fCBjaGFuZ2VzWydzZXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzJ10pIHtcbiAgICAgIC8vIFJlLWluaXRpYWxpemUgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzIGlmIHRlbXBsYXRlIG9yIHRlc3RTdGVwIGNoYW5nZXNcbiAgICAgIGlmICh0aGlzLnNldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMpIHtcbiAgICAgICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gdGhpcy5zZXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzKHRoaXMudGVtcGxhdGUsIHRoaXMudGVzdFN0ZXApO1xuICAgICAgICB0aGlzLmJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRm9ybVdpdGhJbml0aWFsVmFsdWVzKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGV4aXN0aW5nIG1hcHBpbmdzXG4gICAgd2hpbGUgKHRoaXMubWFwcGluZ3NGb3JtQXJyYXkubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLm1hcHBpbmdzRm9ybUFycmF5LnJlbW92ZUF0KDApO1xuICAgIH1cblxuICAgIC8vIFNldCBpbml0aWFsIHZhbHVlcyBpZiBwcm92aWRlZFxuICAgIGlmICh0aGlzLmluaXRpYWxEb2N1bWVudFR5cGUpIHtcbiAgICAgIHRoaXMuZG9jdW1lbnRGb3JtLnBhdGNoVmFsdWUoeyBkb2N1bWVudFR5cGU6IHRoaXMuaW5pdGlhbERvY3VtZW50VHlwZSB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW5pdGlhbE91dHB1dFZhcmlhYmxlKSB7XG4gICAgICB0aGlzLmRvY3VtZW50Rm9ybS5wYXRjaFZhbHVlKHsgb3V0cHV0VmFyaWFibGU6IHRoaXMuaW5pdGlhbE91dHB1dFZhcmlhYmxlIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbml0aWFsRmlsZU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5kb2N1bWVudEZvcm0ucGF0Y2hWYWx1ZSh7IGZpbGVOYW1lOiB0aGlzLmluaXRpYWxGaWxlTmFtZSB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW5pdGlhbFNlcHJhdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZG9jdW1lbnRGb3JtLnBhdGNoVmFsdWUoeyBzZXByYXRvcjogdGhpcy5pbml0aWFsU2VwcmF0b3IgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmluaXRpYWxEZWxpbWV0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5kb2N1bWVudEZvcm0ucGF0Y2hWYWx1ZSh7IGRlbGltZXRlcjogdGhpcy5pbml0aWFsRGVsaW1ldGVyIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbml0aWFsRmlsZUZvcm1hdEhlYWRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRvY3VtZW50Rm9ybS5wYXRjaFZhbHVlKHsgZmlsZUZvcm1hdEhlYWRlcjogdGhpcy5pbml0aWFsRmlsZUZvcm1hdEhlYWRlciB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW5pdGlhbERlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZG9jdW1lbnRGb3JtLnBhdGNoVmFsdWUoeyBkZXNjcmlwdGlvbjogdGhpcy5pbml0aWFsRGVzY3JpcHRpb24gfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmluaXRpYWxUZW1wbGF0ZVNvdXJjZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlU291cmNlID0gdGhpcy5pbml0aWFsVGVtcGxhdGVTb3VyY2U7XG4gICAgICB0aGlzLmRvY3VtZW50Rm9ybS5wYXRjaFZhbHVlKHsgdGVtcGxhdGVTb3VyY2U6IHRoaXMuaW5pdGlhbFRlbXBsYXRlU291cmNlIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbml0aWFsVGVtcGxhdGVJZCkge1xuICAgICAgdGhpcy5kb2N1bWVudEZvcm0ucGF0Y2hWYWx1ZSh7IHRlbXBsYXRlSWQ6IHRoaXMuaW5pdGlhbFRlbXBsYXRlSWQgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmluaXRpYWxUZW1wbGF0ZU5hbWUpIHtcbiAgICAgIHRoaXMuZG9jdW1lbnRGb3JtLnBhdGNoVmFsdWUoeyB0ZW1wbGF0ZU5hbWU6IHRoaXMuaW5pdGlhbFRlbXBsYXRlTmFtZSB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW5pdGlhbFRlbXBsYXRlRGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZG9jdW1lbnRGb3JtLnBhdGNoVmFsdWUoeyB0ZW1wbGF0ZURlc2NyaXB0aW9uOiB0aGlzLmluaXRpYWxUZW1wbGF0ZURlc2NyaXB0aW9uIH0pO1xuICAgIH1cblxuICAgIC8vIExvYWQgaW5pdGlhbCBtYXBwaW5nc1xuICAgIGlmICh0aGlzLmluaXRpYWxNYXBwaW5ncyAmJiB0aGlzLmluaXRpYWxNYXBwaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmluaXRpYWxNYXBwaW5ncy5mb3JFYWNoKG1hcHBpbmcgPT4ge1xuICAgICAgICBjb25zdCBsZWdhY3kgPSBtYXBwaW5nIGFzIGFueTtcbiAgICAgICAgY29uc3Qgc2VlZEVudHJpZXM6IERvY3VtZW50TWFwcGluZ1ZhbHVlRW50cnlbXSA9XG4gICAgICAgICAgQXJyYXkuaXNBcnJheShtYXBwaW5nLnZhbHVlcykgJiYgbWFwcGluZy52YWx1ZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyBtYXBwaW5nLnZhbHVlc1xuICAgICAgICAgICAgOiAobGVnYWN5LnZhbHVlVHlwZSAhPT0gdW5kZWZpbmVkIHx8IGxlZ2FjeS52YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICA/IFt7IHZhbHVlVHlwZTogbGVnYWN5LnZhbHVlVHlwZSB8fCAndmFyaWFibGUnLCB2YWx1ZTogbGVnYWN5LnZhbHVlIHx8ICcnIH1dXG4gICAgICAgICAgICAgIDogW3sgdmFsdWVUeXBlOiAndmFyaWFibGUnLCB2YWx1ZTogJycgfV07XG5cbiAgICAgICAgY29uc3QgdmFsdWVzQXJyYXkgPSB0aGlzLmZiLmFycmF5KFxuICAgICAgICAgIHNlZWRFbnRyaWVzLm1hcChlbnRyeSA9PiB0aGlzLmJ1aWxkVmFsdWVFbnRyeShlbnRyeSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgbWFwcGluZ0dyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAga2V5OiBbbWFwcGluZy5rZXkgfHwgJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgIGVuYWJsZWQ6IFttYXBwaW5nLmVuYWJsZWQgPz8gZmFsc2VdLFxuICAgICAgICAgIHZhbHVlczogdmFsdWVzQXJyYXlcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWFwcGluZ3NGb3JtQXJyYXkucHVzaChtYXBwaW5nR3JvdXApO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFkZCBvbmUgZW1wdHkgbWFwcGluZyBpZiBubyBpbml0aWFsIG1hcHBpbmdzXG4gICAgICBpZiAodGhpcy5tYXBwaW5nc0Zvcm1BcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5hZGRNYXBwaW5nKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IG1hcHBpbmdzRm9ybUFycmF5KCk6IEZvcm1BcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRGb3JtLmdldCgnbWFwcGluZ3MnKSBhcyBGb3JtQXJyYXk7XG4gIH1cblxuICBnZXREb2N1bWVudFR5cGVDb25maWcoKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiAnZG9jdW1lbnRUeXBlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGRvY3VtZW50IHR5cGUnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiB0aGlzLmRvY3VtZW50VHlwZU9wdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgZ2V0VGVtcGxhdGVTZWxlY3RDb25maWcoKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiAndGVtcGxhdGVJZCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBUZW1wbGF0ZSBkcm9wZG93bicsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMudGVtcGxhdGVPcHRpb25zXG4gICAgfTtcbiAgfVxuXG4gIGdldFZhbHVlVHlwZUNvbmZpZyhyb3dJbmRleDogbnVtYmVyLCB2YWx1ZUluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6ICd2YWx1ZVR5cGUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdWYWx1ZSBUeXBlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogdGhpcy52YWx1ZVR5cGVPcHRpb25zLFxuICAgICAgb25DaGFuZ2U6ICgpID0+IHt9XG4gICAgfTtcbiAgfVxuXG4gIGdldERlbGltZXRlckNvbmZpZygpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6ICdkZWxpbWV0ZXInLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgRGVsaW1ldGVyJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogdGhpcy5kZWxpbWV0ZXJUeXBlT3B0aW9uc1xuICAgIH07XG4gIH1cblxuICBnZXQgaXNUeHRTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kb2N1bWVudEZvcm0uZ2V0KCdkb2N1bWVudFR5cGUnKT8udmFsdWUgPT09ICd0eHQnO1xuICB9XG5cbiAgZ2V0IGlzQ3N2U2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRGb3JtLmdldCgnZG9jdW1lbnRUeXBlJyk/LnZhbHVlID09PSAnY3N2JztcbiAgfVxuXG4gIG9uVGVtcGxhdGVTb3VyY2VDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZVNvdXJjZSA9IHZhbHVlIGFzIFRlbXBsYXRlU291cmNlVHlwZTtcbiAgICB0aGlzLmRvY3VtZW50Rm9ybS5wYXRjaFZhbHVlKHsgdGVtcGxhdGVTb3VyY2U6IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZVNvdXJjZSB9KTtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFRlbXBsYXRlU291cmNlICE9PSAndXBsb2FkJykge1xuICAgICAgdGhpcy51cGxvYWRlZEZpbGUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIG9uQ3JlYXRlVGVtcGxhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZG9jdW1lbnRGb3JtLmdldCgndGVtcGxhdGVOYW1lJyk/LnZhbHVlPy50cmltKCkgPz8gJyc7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSB0aGlzLmRvY3VtZW50Rm9ybS5nZXQoJ3RlbXBsYXRlRGVzY3JpcHRpb24nKT8udmFsdWU/LnRyaW0oKSA/PyAnJztcbiAgICB0aGlzLmNyZWF0ZVRlbXBsYXRlLmVtaXQoeyB0ZW1wbGF0ZU5hbWU6IG5hbWUsIHRlbXBsYXRlRGVzY3JpcHRpb246IGRlc2NyaXB0aW9uIH0pO1xuICB9XG5cbiAgb25GaWxlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXM/LlswXTtcbiAgICBpZiAoZmlsZSkge1xuICAgICAgdGhpcy51cGxvYWRlZEZpbGUgPSBmaWxlO1xuICAgIH1cbiAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICB9XG5cbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmlzRHJhZ092ZXIgPSB0cnVlO1xuICB9XG5cbiAgb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pc0RyYWdPdmVyID0gZmFsc2U7XG4gIH1cblxuICBvbkRyb3AoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pc0RyYWdPdmVyID0gZmFsc2U7XG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXM/LlswXTtcbiAgICBpZiAoZmlsZSAmJiB0aGlzLmlzQWNjZXB0ZWRUZW1wbGF0ZUZpbGUoZmlsZSkpIHtcbiAgICAgIHRoaXMudXBsb2FkZWRGaWxlID0gZmlsZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzQWNjZXB0ZWRUZW1wbGF0ZUZpbGUoZmlsZTogRmlsZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFjY2VwdGVkID0gWycucGRmJywgJy5kb2MnLCAnLmRvY3gnLCAnLnR4dCddO1xuICAgIGNvbnN0IG5hbWUgPSBmaWxlLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gYWNjZXB0ZWQuc29tZShleHQgPT4gbmFtZS5lbmRzV2l0aChleHQpKTtcbiAgfVxuXG4gIGFkZE1hcHBpbmcoKTogdm9pZCB7XG4gICAgY29uc3QgbWFwcGluZ0dyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBrZXk6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBlbmFibGVkOiBbZmFsc2VdLFxuICAgICAgdmFsdWVzOiB0aGlzLmZiLmFycmF5KFt0aGlzLmJ1aWxkVmFsdWVFbnRyeSgpXSlcbiAgICB9KTtcbiAgICB0aGlzLm1hcHBpbmdzRm9ybUFycmF5LnB1c2gobWFwcGluZ0dyb3VwKTtcbiAgfVxuXG4gIHJlbW92ZU1hcHBpbmcoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubWFwcGluZ3NGb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgZ2V0TWFwcGluZ0Zvcm1Hcm91cChpbmRleDogbnVtYmVyKTogRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5tYXBwaW5nc0Zvcm1BcnJheS5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFZhbHVlRW50cnkoc2VlZD86IFBhcnRpYWw8RG9jdW1lbnRNYXBwaW5nVmFsdWVFbnRyeT4pOiBGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHZhbHVlVHlwZTogW3NlZWQ/LnZhbHVlVHlwZSA/PyAndmFyaWFibGUnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHZhbHVlOiBbc2VlZD8udmFsdWUgPz8gJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgfSk7XG4gIH1cblxuICBnZXRWYWx1ZXNGb3JtQXJyYXkocm93SW5kZXg6IG51bWJlcik6IEZvcm1BcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TWFwcGluZ0Zvcm1Hcm91cChyb3dJbmRleCkuZ2V0KCd2YWx1ZXMnKSBhcyBGb3JtQXJyYXk7XG4gIH1cblxuICBnZXRWYWx1ZUZvcm1Hcm91cChyb3dJbmRleDogbnVtYmVyLCB2YWx1ZUluZGV4OiBudW1iZXIpOiBGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlc0Zvcm1BcnJheShyb3dJbmRleCkuYXQodmFsdWVJbmRleCkgYXMgRm9ybUdyb3VwO1xuICB9XG5cbiAgYWRkVmFsdWVFbnRyeShyb3dJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5nZXRWYWx1ZXNGb3JtQXJyYXkocm93SW5kZXgpLnB1c2godGhpcy5idWlsZFZhbHVlRW50cnkoKSk7XG4gIH1cblxuICByZW1vdmVWYWx1ZUVudHJ5KHJvd0luZGV4OiBudW1iZXIsIHZhbHVlSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGFyciA9IHRoaXMuZ2V0VmFsdWVzRm9ybUFycmF5KHJvd0luZGV4KTtcbiAgICBpZiAoYXJyLmxlbmd0aCA+IDEpIHtcbiAgICAgIGFyci5yZW1vdmVBdCh2YWx1ZUluZGV4KTtcbiAgICB9XG4gICAgLy8gVGhlIGxhc3QgZW50cnkgY2FuJ3QgYmUgcmVtb3ZlZCB2aWEgdGhlIHBlci12YWx1ZSDDlyBidXR0b24g4oCUXG4gICAgLy8gdXNlcnMgZGVsZXRlIHRoZSB3aG9sZSBrZXkgdmlhIHRoZSByb3cgdHJhc2ggaWNvbiBpbnN0ZWFkLlxuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBldmVyeSBtYXBwaW5nIHJvdyBoYXMgZW5hYmxlZCA9PT0gdHJ1ZSAqL1xuICBnZXQgYWxsTWFwcGluZ3NTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBsZW4gPSB0aGlzLm1hcHBpbmdzRm9ybUFycmF5Lmxlbmd0aDtcbiAgICBpZiAobGVuID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKCF0aGlzLmdldE1hcHBpbmdGb3JtR3JvdXAoaSkuZ2V0KCdlbmFibGVkJyk/LnZhbHVlKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBhdCBsZWFzdCBvbmUgbWFwcGluZyByb3cgaGFzIGVuYWJsZWQgPT09IHRydWUgKGZvciBoZWFkZXIgaW5kZXRlcm1pbmF0ZSkgKi9cbiAgZ2V0IHNvbWVNYXBwaW5nc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tYXBwaW5nc0Zvcm1BcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZ2V0TWFwcGluZ0Zvcm1Hcm91cChpKS5nZXQoJ2VuYWJsZWQnKT8udmFsdWUpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBvblNlbGVjdEFsbE1hcHBpbmdzKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm1hcHBpbmdzRm9ybUFycmF5LmNvbnRyb2xzLmZvckVhY2goKF8sIGkpID0+IHtcbiAgICAgIHRoaXMuZ2V0TWFwcGluZ0Zvcm1Hcm91cChpKS5nZXQoJ2VuYWJsZWQnKT8uc2V0VmFsdWUoY2hlY2tlZCk7XG4gICAgfSk7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiBtYWluIGZvcm0gaXMgdmFsaWQgKGRvY3VtZW50VHlwZSwgb3V0cHV0VmFyaWFibGUsIGFuZCBmaWxlTmFtZSBhcmUgcmVxdWlyZWQpXG4gICAgY29uc3QgZG9jdW1lbnRUeXBlID0gdGhpcy5kb2N1bWVudEZvcm0uZ2V0KCdkb2N1bWVudFR5cGUnKT8udmFsdWU7XG4gICAgY29uc3Qgb3V0cHV0VmFyaWFibGUgPSB0aGlzLmRvY3VtZW50Rm9ybS5nZXQoJ291dHB1dFZhcmlhYmxlJyk/LnZhbHVlO1xuICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5kb2N1bWVudEZvcm0uZ2V0KCdmaWxlTmFtZScpPy52YWx1ZTtcblxuICAgIGlmICghZG9jdW1lbnRUeXBlIHx8ICFvdXRwdXRWYXJpYWJsZSB8fCAhZmlsZU5hbWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayB0ZW1wbGF0ZSBzb3VyY2Ugc3BlY2lmaWMgcmVxdWlyZW1lbnRzXG4gICAgLy8gaWYgKHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZVNvdXJjZSA9PT0gJ2V4aXN0aW5nJykge1xuICAgIC8vICAgY29uc3QgdGVtcGxhdGVJZCA9IHRoaXMuZG9jdW1lbnRGb3JtLmdldCgndGVtcGxhdGVJZCcpPy52YWx1ZTtcbiAgICAvLyAgIGlmICghdGVtcGxhdGVJZCkge1xuICAgIC8vICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gICB9XG4gICAgLy8gfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGVtcGxhdGVTb3VyY2UgPT09ICd1cGxvYWQnKSB7XG4gICAgLy8gICBpZiAoIXRoaXMudXBsb2FkZWRGaWxlKSB7XG4gICAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyAgIH1cbiAgICAvLyB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZVNvdXJjZSA9PT0gJ2NyZWF0ZU5ldycpIHtcbiAgICAvLyAgIGNvbnN0IG5hbWUgPSB0aGlzLmRvY3VtZW50Rm9ybS5nZXQoJ3RlbXBsYXRlTmFtZScpPy52YWx1ZT8udHJpbSgpO1xuICAgIC8vICAgY29uc3QgZGVzYyA9IHRoaXMuZG9jdW1lbnRGb3JtLmdldCgndGVtcGxhdGVEZXNjcmlwdGlvbicpPy52YWx1ZT8udHJpbSgpO1xuICAgIC8vICAgaWYgKCFuYW1lIHx8ICFkZXNjKSB7XG4gICAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyAgIH1cbiAgICAvLyB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRBZHZhbmNlZFZhcmlhYmxlc0Zvcm0oKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgZm9ybSBhcnJheVxuICAgIHdoaWxlICh0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICAgIH1cblxuICAgIC8vIEFkZCBmb3JtIGdyb3VwcyBmb3IgZWFjaCBhZHZhbmNlZCB2YXJpYWJsZVxuICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgdHlwZXNcbiAgICAgIGxldCBkZWZhdWx0VmFsdWU6IGFueTtcbiAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnKSB7XG4gICAgICAgIC8vIEZvciBzdHJfbGlzdCwgY3JlYXRlIGEgRm9ybUFycmF5XG4gICAgICAgIGNvbnN0IHZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlLnZhbHVlKSA/IHZhcmlhYmxlLnZhbHVlIDogW107XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheVZhbHVlID0gdGhpcy5mYi5hcnJheShcbiAgICAgICAgICB2YWx1ZUFycmF5Lmxlbmd0aCA+IDAgXG4gICAgICAgICAgICA/IHZhbHVlQXJyYXkubWFwKChpdGVtOiBzdHJpbmcpID0+IHRoaXMuZmIuY29udHJvbChpdGVtKSlcbiAgICAgICAgICAgIDogW3RoaXMuZmIuY29udHJvbCgnJyldIC8vIFN0YXJ0IHdpdGggb25lIGVtcHR5IGNvbnRyb2xcbiAgICAgICAgKTtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gZm9ybUFycmF5VmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgdmFyaWFibGUudmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudmFsdWUgfHwgJyc7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBhIEZvcm1Hcm91cCBmb3IgZWFjaCB2YXJpYWJsZVxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiB2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnID8gZGVmYXVsdFZhbHVlIDogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICAgIHR5cGU6IFt2YXJpYWJsZS50eXBlIHx8ICdzdHJpbmcnXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZS5sYWJlbCB8fCAnJ11cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIH0pO1xuICB9XG5cbiAgb25BZHZhbmNlZFZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uYXQodmFyaWFibGVJbmRleCkuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICAgIC8vIEZvciBzdHJfbGlzdCwgdGhlIEZvcm1BcnJheSBpcyBhbHJlYWR5IG1hbmFnZWQgaW5zaWRlIEFkdmFuY2VkVmFyaWFibGVzRm9ybUNvbXBvbmVudCxcbiAgICAgIC8vIHNvIHdlIGRvbid0IG5lZWQgdG8gcmVidWlsZCBvciB1cGRhdGUgaXQgaGVyZSB0byBhdm9pZCBmb2N1cyBsb3NzLlxuICAgICAgaWYgKHZhcmlhYmxlPy50eXBlICE9PSAnc3RyX2xpc3QnKSB7XG4gICAgICAgIGZvcm1Hcm91cD8uZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUFkdmFuY2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYWR2YW5jZWRFeHBhbmRlZCA9ICF0aGlzLmFkdmFuY2VkRXhwYW5kZWQ7XG4gIH1cblxuICBvbkNyZWF0ZVN0ZXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gU3luYyBhZHZhbmNlZCB2YXJpYWJsZXMgZnJvbSBmb3JtIHRvIGFycmF5XG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uYXQoaW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICAgIGlmIChmb3JtR3JvdXApIHtcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gZm9ybUdyb3VwLmdldCgndmFsdWUnKT8udmFsdWU7XG4gICAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnICYmIGZvcm1WYWx1ZSBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgICAgIC8vIEV4dHJhY3QgdmFsdWVzIGZyb20gRm9ybUFycmF5XG4gICAgICAgICAgdmFyaWFibGUudmFsdWUgPSBmb3JtVmFsdWUuY29udHJvbHMubWFwKGNvbnRyb2wgPT4gY29udHJvbC52YWx1ZSkuZmlsdGVyKCh2YWw6IHN0cmluZykgPT4gdmFsICYmIHZhbC50cmltKCkgIT09ICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZG9jdW1lbnRGb3JtLnZhbHVlO1xuICAgIGNvbnN0IHN0ZXBEYXRhOiBEb2N1bWVudEZvcm1EYXRhID0ge1xuICAgICAgZG9jdW1lbnRUeXBlOiBmb3JtVmFsdWUuZG9jdW1lbnRUeXBlLFxuICAgICAgb3V0cHV0VmFyaWFibGU6IGZvcm1WYWx1ZS5vdXRwdXRWYXJpYWJsZSxcbiAgICAgIGZpbGVOYW1lOiBmb3JtVmFsdWUuZmlsZU5hbWUgfHwgdW5kZWZpbmVkLFxuICAgICAgc2VwcmF0b3I6IGZvcm1WYWx1ZS5zZXByYXRvciB8fCB1bmRlZmluZWQsXG4gICAgICBkZWxpbWV0ZXI6IGZvcm1WYWx1ZS5kZWxpbWV0ZXIgfHwgdW5kZWZpbmVkLFxuICAgICAgZmlsZUZvcm1hdEhlYWRlcjogZm9ybVZhbHVlLmZpbGVGb3JtYXRIZWFkZXIgfHwgdW5kZWZpbmVkLFxuICAgICAgZGVzY3JpcHRpb246IGZvcm1WYWx1ZS5kZXNjcmlwdGlvbj8udHJpbSgpIHx8IHVuZGVmaW5lZCxcbiAgICAgIHRlbXBsYXRlU291cmNlOiB0aGlzLnNlbGVjdGVkVGVtcGxhdGVTb3VyY2UsXG4gICAgICB0ZW1wbGF0ZUlkOiBmb3JtVmFsdWUudGVtcGxhdGVJZCB8fCB1bmRlZmluZWQsXG4gICAgICAuLi4odGhpcy5zZWxlY3RlZFRlbXBsYXRlU291cmNlID09PSAndXBsb2FkJyAmJiB0aGlzLnVwbG9hZGVkRmlsZSAmJiB7IHVwbG9hZGVkRmlsZTogdGhpcy51cGxvYWRlZEZpbGUgfSksXG4gICAgICAuLi4odGhpcy5zZWxlY3RlZFRlbXBsYXRlU291cmNlID09PSAnY3JlYXRlTmV3JyAmJiB7XG4gICAgICAgIHRlbXBsYXRlTmFtZTogKGZvcm1WYWx1ZS50ZW1wbGF0ZU5hbWUgPz8gJycpLnRyaW0oKSxcbiAgICAgICAgdGVtcGxhdGVEZXNjcmlwdGlvbjogKGZvcm1WYWx1ZS50ZW1wbGF0ZURlc2NyaXB0aW9uID8/ICcnKS50cmltKClcbiAgICAgIH0pLFxuICAgICAgbWFwcGluZ3M6IChmb3JtVmFsdWUubWFwcGluZ3MgfHwgW10pLm1hcCgobTogYW55KSA9PiAoe1xuICAgICAgICBrZXk6IG0ua2V5IHx8ICcnLFxuICAgICAgICBlbmFibGVkOiBtLmVuYWJsZWQgPz8gZmFsc2UsXG4gICAgICAgIHZhbHVlczogKG0udmFsdWVzIHx8IFtdKS5tYXAoKHY6IGFueSkgPT4gKHtcbiAgICAgICAgICB2YWx1ZVR5cGU6IHYudmFsdWVUeXBlIHx8ICd2YXJpYWJsZScsXG4gICAgICAgICAgdmFsdWU6IHYudmFsdWUgfHwgJydcbiAgICAgICAgfSkpXG4gICAgICB9KSksXG4gICAgICBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzOiB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMubGVuZ3RoID4gMCA/IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyA6IHVuZGVmaW5lZFxuICAgIH07XG4gICAgdGhpcy5jcmVhdGVTdGVwLmVtaXQoc3RlcERhdGEpO1xuICB9XG5cbiAgb25NYXBwZXJIZWxwQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWFwcGVySGVscFVybCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHdpbmRvdy5vcGVuKHRoaXMubWFwcGVySGVscFVybCwgJ19ibGFuaycpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290IGNxYS1ibG9jayBjcWEtdy1mdWxsIGNxYS1taW4tdy0wIGNxYS1zdGVwLWJ1aWxkZXItZG9jdW1lbnRcIiBzdHlsZT1cImhlaWdodDogMTAwJTt3aWR0aDogMTAwJTtcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS13LWZ1bGwgY3FhLW1pbi13LTAgY3FhLWgtZnVsbCBjcWEtYmctd2hpdGUgY3FhLWJvcmRlciBjcWEtYm94LWJvcmRlciBjcWEtbWF4LXctZnVsbCBjcWEtb3BhY2l0eS0xMDAgY3FhLWgtZnVsbCBjcWEtdy1mdWxsXCI+XG4gICAgPCEtLSBDb250ZW50IGFyZWE6IHBhZGRpbmcgMTZweCwgZ2FwIDEycHggYmV0d2VlbiBzZWN0aW9ucyAobm8gZmxleC0xIHRvIGF2b2lkIGdhcCBhYm92ZSBmb290ZXIpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1wLTQgY3FhLWdhcC0zXCI+XG4gIDwhLS0gSGVhZGVyOiBEb2N1bWVudCBHZW5lcmF0aW9uIFRlbXBsYXRlIFN0ZXAgKGxlZnQtYWxpZ25lZCwgSW50ZXIgNjAwIDEycHggbGluZS1oZWlnaHQgMTAwJSkgLS0+XG4gIDxoMlxuICAgIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxMDAlXSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMCBjcWEtdGV4dC1sZWZ0IGNxYS1mbGV4LXNocmluay0wIGNxYS1hbGlnbi1taWRkbGVcIj5cbiAgICBEb2N1bWVudCBHZW5lcmF0aW9uIFRlbXBsYXRlIFN0ZXBcbiAgPC9oMj5cblxuICAgIDwhLS0gRmlsZSBOYW1lIGFuZCBEb2N1bWVudCBUeXBlIFJvdyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtd3JhcCBjcWEtZmxleC1zaHJpbmstMCBjcWEtZ2FwLTE0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMCBjcWEtbWluLXctW2NhbGMoNDUlLTZweCldXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW1iLTEuNSBjcWEtYmxvY2tcIj5cbiAgICAgICAgICBGaWxlIE5hbWUgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZpbGUgTmFtZVwiXG4gICAgICAgICAgW3ZhbHVlXT1cImRvY3VtZW50Rm9ybS5nZXQoJ2ZpbGVOYW1lJyk/LnZhbHVlXCJcbiAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJkb2N1bWVudEZvcm0uZ2V0KCdmaWxlTmFtZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLW10LTEgY3FhLW0tMFwiPlxuICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGdlbmVyYXRlZFxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wIGNxYS1taW4tdy1bY2FsYyg0NSUtNnB4KV0gXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW1iLTEuNSBjcWEtYmxvY2tcIj5cbiAgICAgICAgICBEb2N1bWVudCBUeXBlIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkb2N1bWVudC10eXBlLXNlbGVjdFwiPlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgIFtmb3JtXT1cImRvY3VtZW50Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldERvY3VtZW50VHlwZUNvbmZpZygpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtbXQtMSBjcWEtbS0wXCI+XG4gICAgICAgICAgQ2hvb3NlIHRoZSBmaWxlIGZvcm1hdCB5b3Ugd2FudCB0byBnZW5lcmF0ZS5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIE91dHB1dCBWYXJpYWJsZSBhbmQgQ29uZGl0aW9uYWwgRmllbGRzIFJvdyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtd3JhcCBjcWEtZmxleC1zaHJpbmstMCBjcWEtZ2FwLTE0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMCBjcWEtbWluLXctW2NhbGMoNDUlLTZweCldXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW1iLTEuNSBjcWEtYmxvY2tcIj5cbiAgICAgICAgICBPdXRwdXQgVmFyaWFibGUgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIklucHV0XCJcbiAgICAgICAgICBbdmFsdWVdPVwiZG9jdW1lbnRGb3JtLmdldCgnb3V0cHV0VmFyaWFibGUnKT8udmFsdWVcIlxuICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImRvY3VtZW50Rm9ybS5nZXQoJ291dHB1dFZhcmlhYmxlJyk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtbXQtMSBjcWEtbS0wXCI+XG4gICAgICAgICAgU3RvcmVzIHRoZSBnZW5lcmF0ZWQgZmlsZSBzbyBpdCBjYW4gYmUgdXNlZCBpbiBsYXRlciBzdGVwcy5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIFNlcHJhdG9yIChzaG93biB3aGVuIGRvY3VtZW50VHlwZSBpcyAndHh0JykgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMCBjcWEtbWluLXctW2NhbGMoNDUlLTZweCldXCIgKm5nSWY9XCJpc1R4dFNlbGVjdGVkXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW1iLTEuNSBjcWEtYmxvY2tcIj5cbiAgICAgICAgICBTZXByYXRvclxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VwcmF0b3JcIlxuICAgICAgICAgIFt2YWx1ZV09XCJkb2N1bWVudEZvcm0uZ2V0KCdzZXByYXRvcicpPy52YWx1ZVwiXG4gICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZG9jdW1lbnRGb3JtLmdldCgnc2VwcmF0b3InKT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyMwQTBBMEFdIGNxYS1tdC0xIGNxYS1tLTBcIj5cbiAgICAgICAgICBUaGUgc2VwcmF0b3IgdG8gYmUgdXNlZCB0byBzZXBhcmF0ZSB0aGUgdmFsdWVzIGluIHRoZSBnZW5lcmF0ZWQgZmlsZVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gRGVsaW1ldGVyIFR5cGUgKHNob3duIHdoZW4gZG9jdW1lbnRUeXBlIGlzICdjc3YnKSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wIGNxYS1taW4tdy1bY2FsYyg0NSUtNnB4KV1cIiAqbmdJZj1cImlzQ3N2U2VsZWN0ZWRcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtbWItMS41IGNxYS1ibG9ja1wiPlxuICAgICAgICAgIERlbGltZXRlciBUeXBlXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkb2N1bWVudC10eXBlLXNlbGVjdFwiPlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgIFtmb3JtXT1cImRvY3VtZW50Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldERlbGltZXRlckNvbmZpZygpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtbXQtMSBjcWEtbS0wXCI+XG4gICAgICAgICAgQ2hvb3NlIHRoZSBkZWxpbWV0ZXIgdHlwZSBmb3IgdGhlIENTViBmaWxlXG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGaWxlIEZvcm1hdCBIZWFkZXIgKHNob3duIHdoZW4gZG9jdW1lbnRUeXBlIGlzICd0eHQnKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtd3JhcCBjcWEtZmxleC1zaHJpbmstMCBjcWEtZ2FwLTE0XCIgKm5nSWY9XCJpc1R4dFNlbGVjdGVkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMCBjcWEtbWluLXctW2NhbGMoNDUlLTZweCldXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW1iLTEuNSBjcWEtYmxvY2tcIj5cbiAgICAgICAgICBGaWxlIEZvcm1hdCBIZWFkZXJcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZpbGUgRm9ybWF0IEhlYWRlclwiXG4gICAgICAgICAgW3ZhbHVlXT1cImRvY3VtZW50Rm9ybS5nZXQoJ2ZpbGVGb3JtYXRIZWFkZXInKT8udmFsdWVcIlxuICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImRvY3VtZW50Rm9ybS5nZXQoJ2ZpbGVGb3JtYXRIZWFkZXInKT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyMwQTBBMEFdIGNxYS1tdC0xIGNxYS1tLTBcIj5cbiAgICAgICAgICBIZWFkZXIgdGV4dCBmb3IgdGhlIGdlbmVyYXRlZCB0eHQgZmlsZVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVGVtcGxhdGUgU291cmNlIFNlY3Rpb246IGxhYmVsIGxlZnQsIHRhYnMgcmlnaHQgb24gc2FtZSByb3cgLS0+XG4gICAgPCEtLSA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1mbGV4LXNocmluay0wIGNxYS1nYXAtM1wiPlxuICAgICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtNFwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1tLTAgY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICBUZW1wbGF0ZSBTb3VyY2VcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wXCJcbiAgICAgICAgICBbc2VnbWVudHNdPVwiW1xuICAgICAgICAgICAgeyBsYWJlbDogJ1VzZSBFeGlzdGluZyBUZW1wbGF0ZScsIHZhbHVlOiAnZXhpc3RpbmcnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnVXBsb2FkIFRlbXBsYXRlJywgdmFsdWU6ICd1cGxvYWQnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnQ3JlYXRlIE5ldycsIHZhbHVlOiAnY3JlYXRlTmV3JyB9XG4gICAgICAgICAgXVwiXG4gICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkVGVtcGxhdGVTb3VyY2VcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblRlbXBsYXRlU291cmNlQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZG9jdW1lbnQtdHlwZS1zZWxlY3RcIiAqbmdJZj1cInNlbGVjdGVkVGVtcGxhdGVTb3VyY2UgPT09ICdleGlzdGluZydcIj5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImRvY3VtZW50Rm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJnZXRUZW1wbGF0ZVNlbGVjdENvbmZpZygpXCI+XG4gICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZFRlbXBsYXRlU291cmNlID09PSAndXBsb2FkJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW0tMFwiPlxuICAgICAgICAgIEF0dGFjaG1lbnQgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgI2ZpbGVJbnB1dFxuICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICBhY2NlcHQ9XCIucGRmLC5kb2MsLmRvY3gsLnR4dFwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtaGlkZGVuXCJcbiAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdGVkKCRldmVudClcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWluLWgtWzE0MHB4XSBjcWEtcm91bmRlZCBjcWEtYm9yZGVyLTIgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1ncmF5LTMwMCBjcWEtYmctd2hpdGUgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1nYXAtMyBjcWEtcC02IGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgIFtjbGFzcy5jcWEtcmluZy0yXT1cImlzRHJhZ092ZXJcIlxuICAgICAgICAgIFtjbGFzcy5jcWEtcmluZy1bIzNGNDNFRV1dPVwiaXNEcmFnT3ZlclwiXG4gICAgICAgICAgW2NsYXNzLmNxYS1yaW5nLWluc2V0XT1cImlzRHJhZ092ZXJcIlxuICAgICAgICAgIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiXG4gICAgICAgICAgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50KVwiXG4gICAgICAgICAgKGRyYWdsZWF2ZSk9XCJvbkRyYWdMZWF2ZSgkZXZlbnQpXCJcbiAgICAgICAgICAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50KVwiXG4gICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJmaWxlSW5wdXQuY2xpY2soKVwiXG4gICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiZmlsZUlucHV0LmNsaWNrKClcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJVcGxvYWQgdGVtcGxhdGUgZmlsZVwiPlxuICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtdy04IGNxYS1oLTggIGNxYS1mb250LWJvbGRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNFwiLz5cbiAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCIxNyA4IDEyIDMgNyA4XCIvPlxuICAgICAgICAgICAgPGxpbmUgeDE9XCIxMlwiIHkxPVwiM1wiIHgyPVwiMTJcIiB5Mj1cIjE1XCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtYmFzZSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW0tMCBjcWEtdGV4dC1jZW50ZXIgY3FhLWZvbnQtYm9sZFwiPlxuICAgICAgICAgICAgRHJhZyBhbmQgZHJvcCBmaWxlcyBoZXJlIG9yIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS1mb250LW1lZGl1bSBob3ZlcjpjcWEtdW5kZXJsaW5lXCI+YnJvd3NlPC9zcGFuPlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbS0wXCI+XG4gICAgICAgICAgICBQREYsIERPQywgb3IgVFhUIGZpbGVzXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLW0tMFwiPlxuICAgICAgICAgIENob29zZSB0aGUgZmlsZSBmb3JtYXQgeW91IHdhbnQgdG8gZ2VuZXJhdGUuXG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkVGVtcGxhdGVTb3VyY2UgPT09ICdjcmVhdGVOZXcnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC13cmFwIGNxYS1nYXAtM1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wIGNxYS1taW4tdy1bY2FsYyg1MCUtNnB4KV1cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW1iLTEuNSBjcWEtYmxvY2tcIj5cbiAgICAgICAgICAgICAgVGVtcGxhdGUgTmFtZSA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUERGIERvY3VtZW50ICgucGRmKVwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJkb2N1bWVudEZvcm0uZ2V0KCd0ZW1wbGF0ZU5hbWUnKT8udmFsdWVcIlxuICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZG9jdW1lbnRGb3JtLmdldCgndGVtcGxhdGVOYW1lJyk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMCBjcWEtbWluLXctW2NhbGMoNTAlLTZweCldXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1tYi0xLjUgY3FhLWJsb2NrXCI+XG4gICAgICAgICAgICAgIFRlbXBsYXRlIERlc2NyaXB0aW9uIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJQREYgRG9jdW1lbnQgKC5wZGYpXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImRvY3VtZW50Rm9ybS5nZXQoJ3RlbXBsYXRlRGVzY3JpcHRpb24nKT8udmFsdWVcIlxuICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZG9jdW1lbnRGb3JtLmdldCgndGVtcGxhdGVEZXNjcmlwdGlvbicpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWp1c3RpZnktZW5kXCI+XG4gICAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgICAgICAgYnRuU2l6ZT1cImxnXCJcbiAgICAgICAgICAgIHRleHQ9XCJDcmVhdGUgVGVtcGxhdGVcIlxuICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdIGNxYS1ib3JkZXItWyMzRjQzRUVdIGNxYS1iZy1bIzNGNDNFRV0nXCJcbiAgICAgICAgICAgIChjbGlja2VkKT1cIm9uQ3JlYXRlVGVtcGxhdGUoKVwiPlxuICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4gLS0+XG5cbiAgICA8IS0tIERvY3VtZW50IE1hcHBlciBTZWN0aW9uOiB0aXRsZSArIHN1YnRpdGxlIGxlZnQsIE5lZWQgaGVscD8gcmlnaHQgKENRQSB0YWJsZSBiZWxvdykgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC1zaHJpbmstMCBjcWEtZ2FwLTNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtc3RhcnQgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtbWluLXctMFwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LWJhc2UgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS10ZXh0LVsxNHB4XSBjcWEtbS0wIGNxYS1sZWFkaW5nLXRpZ2h0XCI+XG4gICAgICAgICAgICBEb2N1bWVudCBNYXBwZXJcbiAgICAgICAgICA8L2gzPlxuICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbS0wIGNxYS1tdC0wLjVcIj5cbiAgICAgICAgICAgIE1hcCBwbGFjZWhvbGRlcnMgdG8gZHluYW1pYyB2YWx1ZXMuXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtaW5saW5lLWZsZXggY3FhLWZsZXgtc2hyaW5rLTBcIlxuICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cInNob3dIZWxwVG9vbHRpcCA9IHRydWVcIlxuICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cInNob3dIZWxwVG9vbHRpcCA9IGZhbHNlXCI+XG4gICAgICAgICAgPGEgKm5nSWY9XCJtYXBwZXJIZWxwVXJsXCJcbiAgICAgICAgICAgICBocmVmPVwiI1wiXG4gICAgICAgICAgICAgKGNsaWNrKT1cIm9uTWFwcGVySGVscENsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjFweF0gY3FhLW5vLXVuZGVybGluZSBjcWEtY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNyAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXRleHQtWyMzRjQzRUVdXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjaGVscC1pY29uLWNsaXAtZG9jKVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC41MDAzMyAxNC42NjYzQzEyLjQxMjMgMTQuNjY2MyAxNS41ODM3IDExLjY4MTYgMTUuNTgzNyA3Ljk5OTY3QzE1LjU4MzcgNC4zMTc3OCAxMi40MTIzIDEuMzMzMDEgOC41MDAzMyAxLjMzMzAxQzQuNTg4MzEgMS4zMzMwMSAxLjQxNjk5IDQuMzE3NzggMS40MTY5OSA3Ljk5OTY3QzEuNDE2OTkgMTEuNjgxNiA0LjU4ODMxIDE0LjY2NjMgOC41MDAzMyAxNC42NjYzWlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuNDM4NDggNi4wMDAzOEM2LjYwNTAxIDUuNTU0ODMgNi45MzM3MSA1LjE3OTEyIDcuMzY2MzYgNC45Mzk4QzcuNzk5MDEgNC43MDA0OSA4LjMwNzY5IDQuNjEzMDEgOC44MDIzMSA0LjY5Mjg1QzkuMjk2OTMgNC43NzI3IDkuNzQ1NTYgNS4wMTQ3MyAxMC4wNjg3IDUuMzc2MDdDMTAuMzkxOSA1LjczNzQgMTAuNTY4OCA2LjE5NDczIDEwLjU2ODEgNi42NjcwNUMxMC41NjgxIDguMDAwMzggOC40NDMwNiA4LjY2NzA1IDguNDQzMDYgOC42NjcwNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNSAxMS4zMzNIOC41MDk2NlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJoZWxwLWljb24tY2xpcC1kb2NcIj5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiLz5cbiAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIE5lZWQgaGVscCA/XG4gICAgICAgICAgPC9hPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIW1hcHBlckhlbHBVcmxcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLWZvbnQtWzUwMF0gY3FhLXRleHQtWzEwcHhdIGNxYS1jdXJzb3ItZGVmYXVsdCBjcWEtdGV4dC1bIzM3NDE1MV1cIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNyAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXRleHQtWyMzRjQzRUVdXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjaGVscC1pY29uLWNsaXAtZG9jLW5vbGluaylcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNTAwMzMgMTQuNjY2M0MxMi40MTIzIDE0LjY2NjMgMTUuNTgzNyAxMS42ODE2IDE1LjU4MzcgNy45OTk2N0MxNS41ODM3IDQuMzE3NzggMTIuNDEyMyAxLjMzMzAxIDguNTAwMzMgMS4zMzMwMUM0LjU4ODMxIDEuMzMzMDEgMS40MTY5OSA0LjMxNzc4IDEuNDE2OTkgNy45OTk2N0MxLjQxNjk5IDExLjY4MTYgNC41ODgzMSAxNC42NjYzIDguNTAwMzMgMTQuNjY2M1pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjQzODQ4IDYuMDAwMzhDNi42MDUwMSA1LjU1NDgzIDYuOTMzNzEgNS4xNzkxMiA3LjM2NjM2IDQuOTM5OEM3Ljc5OTAxIDQuNzAwNDkgOC4zMDc2OSA0LjYxMzAxIDguODAyMzEgNC42OTI4NUM5LjI5NjkzIDQuNzcyNyA5Ljc0NTU2IDUuMDE0NzMgMTAuMDY4NyA1LjM3NjA3QzEwLjM5MTkgNS43Mzc0IDEwLjU2ODggNi4xOTQ3MyAxMC41NjgxIDYuNjY3MDVDMTAuNTY4MSA4LjAwMDM4IDguNDQzMDYgOC42NjcwNSA4LjQ0MzA2IDguNjY3MDVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjUgMTEuMzMzSDguNTA5NjZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiaGVscC1pY29uLWNsaXAtZG9jLW5vbGlua1wiPlxuICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIvPlxuICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XG4gICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgTmVlZCBoZWxwID9cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dIZWxwVG9vbHRpcFwiIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS16LVsxMDBdIGNxYS10b3AtWy0yNHB4XSBjcWEtbGVmdC1bLTIwM3B4XVwiIHJvbGU9XCJ0b29sdGlwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtd2hpdGUgY3FhLXRleHQtY2VudGVyIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtdy1bMzA2cHhdIGNxYS1taW4taC01IGNxYS1yb3VuZGVkLVs2cHhdIGNxYS1vcGFjaXR5LTEwMCBjcWEtcHgtMiBjcWEtcHktMSBjcWEtYmctWyMwQTBBMEFdIGNxYS1sZWFkaW5nLTUgY3FhLXRleHQtWzhweF1cIj5cbiAgICAgICAgICAgICAge3sgbWFwcGVySGVscFRvb2x0aXBUZXh0IH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gVGFibGUgb3IgZW1wdHkgc3RhdGU6IHNhbWUgY29udGFpbmVyLCBoZWFkZXIgYWx3YXlzIHZpc2libGUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJvdW5kZWQtbGcgY3FhLW92ZXJmbG93LWhpZGRlbiBjcWEtYmctd2hpdGUgY3FhLXNoYWRvdy1zbSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgICAgICA8dGFibGUgY2xhc3M9XCJjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgPHRyIGNsYXNzPVwiY3FhLWl0ZW1zLWNlbnRlciBjcWEtYmctWyNEOEQ5RkM0RF1cIj5cbiAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3FhLXB5LVsxMy4yNXB4XSBjcWEtcHgtWzEwLjVweF0gY3FhLXRleHQteHMgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LWxlZnQgY3FhLXctWzQwcHhdIGNxYS1ib3JkZXItYiBjcWEtYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBbY2hlY2tlZF09XCJhbGxNYXBwaW5nc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic29tZU1hcHBpbmdzU2VsZWN0ZWQgJiYgIWFsbE1hcHBpbmdzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU2VsZWN0QWxsTWFwcGluZ3MoJGV2ZW50LmNoZWNrZWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlNlbGVjdCBhbGwgbWFwcGluZ3NcIj5cbiAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3FhLXB5LVsxMy4yNXB4XSBjcWEtcHgtWzEwLjVweF0gY3FhLXRleHQteHMgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LWxlZnQgY3FhLWJvcmRlci1iIGNxYS1ib3JkZXItZ3JheS0yMDBcIj5LZXk8L3RoPlxuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjcWEtcHktWzEzLjI1cHhdIGNxYS1weC1bMTAuNXB4XSBjcWEtdGV4dC14cyBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtbGVmdCBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1ncmF5LTIwMCBjcWEtdy1bMTIwcHhdXCI+VmFsdWUgVHlwZTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNxYS1weS1bMTMuMjVweF0gY3FhLXB4LVsxMC41cHhdIGNxYS10ZXh0LXhzIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1sZWZ0IGNxYS1ib3JkZXItYiBjcWEtYm9yZGVyLWdyYXktMjAwXCI+VmFsdWU8L3RoPlxuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjcWEtcHktWzEzLjI1cHhdIGNxYS1weC1bMTAuNXB4XSBjcWEtdGV4dC14cyBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtbGVmdCBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1ncmF5LTIwMCBjcWEtdy1bNDhweF1cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1zci1vbmx5XCI+RGVsZXRlIHJvdzwvc3Bhbj5cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8IS0tIEVtcHR5IHN0YXRlIHdoZW4gbm8gbWFwcGluZ3MgLS0+XG4gICAgICAgICAgICA8dHIgKm5nSWY9XCJtYXBwaW5nc0Zvcm1BcnJheS5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCI1XCIgY2xhc3M9XCJjcWEtcC0wIGNxYS1hbGlnbi1taWRkbGUgY3FhLWJvcmRlci1iIGNxYS1ib3JkZXItZ3JheS0yMDBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1weS0xMiBjcWEtcHgtNCBjcWEtYmctd2hpdGVcIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tLTAgY3FhLW1iLTRcIj5TdGFydCBtYXBwaW5nIHBsYWNlaG9sZGVycyB0byB2YWx1ZXMuPC9wPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcm91bmRlZC1sZyBjcWEtcHgtNCBjcWEtcHktMi41IGNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LXdoaXRlIGNxYS1iZy1bIzRGNDZFNV0gY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtb3BhY2l0eS05MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE1hcHBpbmcoKVwiPlxuICAgICAgICAgICAgICAgICAgICBBZGQgZmlyc3QgbWFwcGluZ1xuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPCEtLSBEYXRhIHJvd3Mgd2hlbiB0aGVyZSBhcmUgbWFwcGluZ3MgLS0+XG4gICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IG1hcHBpbmcgb2YgbWFwcGluZ3NGb3JtQXJyYXkuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWJnLXdoaXRlIGhvdmVyOmNxYS1iZy1bI0Y5RkFGQl1cIj5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY3FhLXB4LVsxMC41cHhdIGNxYS1weS1bMTFweF0gY3FhLWFsaWduLXRvcCBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggW2NoZWNrZWRdPVwiZ2V0TWFwcGluZ0Zvcm1Hcm91cChpKS5nZXQoJ2VuYWJsZWQnKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImdldE1hcHBpbmdGb3JtR3JvdXAoaSkuZ2V0KCdlbmFibGVkJyk/LnNldFZhbHVlKCRldmVudC5jaGVja2VkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJFbmFibGUgbWFwcGluZ1wiPlxuICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjcWEtcHgtWzEwLjVweF0gY3FhLXB5LVsxMXB4XSBjcWEtYWxpZ24tdG9wIGNxYS1ib3JkZXItYiBjcWEtYm9yZGVyLWdyYXktMjAwIFwiPlxuICAgICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0tleSdcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldE1hcHBpbmdGb3JtR3JvdXAoaSkuZ2V0KCdrZXknKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJnZXRNYXBwaW5nRm9ybUdyb3VwKGkpLmdldCgna2V5Jyk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiIGNsYXNzPVwiY3FhLXB4LVsxMC41cHhdIGNxYS1weS1bMTFweF0gY3FhLWFsaWduLXRvcCBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBlbnRyeSBvZiBnZXRWYWx1ZXNGb3JtQXJyYXkoaSkuY29udHJvbHM7IGxldCBqID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb2N1bWVudC10eXBlLXNlbGVjdCBjcWEtdy1bMTIwcHhdIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZ2V0VmFsdWVGb3JtR3JvdXAoaSwgailcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRWYWx1ZVR5cGVDb25maWcoaSwgailcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInVmFsdWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRWYWx1ZUZvcm1Hcm91cChpLCBqKS5nZXQoJ3ZhbHVlJyk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZ2V0VmFsdWVGb3JtR3JvdXAoaSwgaikuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctNyBjcWEtaC03IGNxYS1yb3VuZGVkIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLWJvcmRlci1ub25lIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLXRleHQtWyMzNzQxNTFdIGRpc2FibGVkOmNxYS1vcGFjaXR5LTMwIGRpc2FibGVkOmNxYS1jdXJzb3Itbm90LWFsbG93ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnZXRWYWx1ZXNGb3JtQXJyYXkoaSkubGVuZ3RoIDw9IDFcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVWYWx1ZUVudHJ5KGksIGopXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidSZW1vdmUgdmFsdWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJnZXRWYWx1ZXNGb3JtQXJyYXkoaSkubGVuZ3RoIDw9IDEgPyAnQSBrZXkgbmVlZHMgYXQgbGVhc3Qgb25lIHZhbHVlJyA6ICdSZW1vdmUgdGhpcyB2YWx1ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bMThweF0gY3FhLXctWzE4cHhdIGNxYS1oLVsxOHB4XSBjcWEtbGVhZGluZy1bMThweF1cIj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1zZWxmLXN0YXJ0IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtcC0wIGNxYS1tdC0xXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFZhbHVlRW50cnkoaSlcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidBZGQgdmFsdWUnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsxNnB4XSBjcWEtdy00IGNxYS1oLTQgY3FhLWxlYWRpbmctNFwiPmFkZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIEFkZCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNxYS1weC1bMTAuNXB4XSBjcWEtcHktWzExcHhdIGNxYS1hbGlnbi10b3AgY3FhLWJvcmRlci1iIGNxYS1ib3JkZXItZ3JheS0yMDBcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctOSBjcWEtaC05IGNxYS1yb3VuZGVkIGNxYS10ZXh0LVsjRTU3MzczXSBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLWJvcmRlci1ub25lIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktODBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZU1hcHBpbmcoaSlcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRGVsZXRlIGtleSByb3cnXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiRGVsZXRlIHRoaXMga2V5IGFuZCBhbGwgaXRzIHZhbHVlc1wiPlxuICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtZmxleC1zaHJpbmstMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNmgxOE04IDZWNGEyIDIgMCAwMTItMmg0YTIgMiAwIDAxMiAydjJtMyAwdjE0YTIgMiAwIDAxLTIgMkg3YTIgMiAwIDAxLTItMlY2aDE0elwiLz5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMCAxMXY2TTE0IDExdjZcIi8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICBcbiAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1qdXN0aWZ5LWVuZFwiICpuZ0lmPVwibWFwcGluZ3NGb3JtQXJyYXkubGVuZ3RoID4gMFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXAtM1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWRkTWFwcGluZygpXCI+XG4gICAgICAgICAgICArIEFkZCBNYXBwaW5nXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtanVzdGlmeS1lbmRcIiAqbmdJZj1cIm1hcHBpbmdzRm9ybUFycmF5Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1wLTBcIlxuICAgICAgICAgIChjbGljayk9XCJhZGRNYXBwaW5nKClcIj5cbiAgICAgICAgICArIEFkZCBNYXBwaW5nXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+IC0tPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBEZXNjcmlwdGlvbiAoYWZ0ZXIgRG9jdW1lbnQgTWFwcGVyKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtd3JhcCBjcWEtZmxleC1zaHJpbmstMCBjcWEtZ2FwLTE0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMCBjcWEtbWluLXctW2NhbGMoNDUlLTZweCldXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW1iLTEuNSBjcWEtYmxvY2tcIj5cbiAgICAgICAgICBEZXNjcmlwdGlvblxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRGVzY3JpcHRpb25cIlxuICAgICAgICAgIFt2YWx1ZV09XCJkb2N1bWVudEZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpPy52YWx1ZVwiXG4gICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZG9jdW1lbnRGb3JtLmdldCgnZGVzY3JpcHRpb24nKT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyMwQTBBMEFdIGNxYS1tdC0xIGNxYS1tLTBcIj5cbiAgICAgICAgICBPcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgdGhpcyBkb2N1bWVudCBnZW5lcmF0aW9uIHN0ZXBcbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQWR2YW5jZWQgU2V0dGluZ3MgVmFyaWFibGVzIEZvcm0gLS0+XG4gIDxkaXYgKm5nSWY9XCJhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmxlbmd0aCA+IDBcIiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wIGNxYS1weC00IGNxYS1wYi0zXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtdy1mdWxsXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMiBjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXAtMCBjcWEtbWItMS41XCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUFkdmFuY2VkKClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTBweF1cIj5BZHZhbmNlZDwvc3Bhbj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtYmFzZVwiIFtjbGFzcy5jcWEtcm90YXRlLTE4MF09XCJhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgZXhwYW5kX21vcmVcbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGRpdiAqbmdJZj1cImFkdmFuY2VkRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1tdC0yXCI+XG4gICAgICAgIDxjcWEtYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0gXG4gICAgICAgICAgW2FkdmFuY2VkVmFyaWFibGVzXT1cImFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXNcIlxuICAgICAgICAgIFthZHZhbmNlZFZhcmlhYmxlRm9ybV09XCJhZHZhbmNlZFZhcmlhYmxlc0Zvcm1cIlxuICAgICAgICAgICh2YXJpYWJsZUJvb2xlYW5DaGFuZ2UpPVwib25BZHZhbmNlZFZhcmlhYmxlQm9vbGVhbkNoYW5nZSgkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiPlxuICAgICAgICA8L2NxYS1hZHZhbmNlZC12YXJpYWJsZXMtZm9ybT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgXG5cbiAgPCEtLSBEaXZpZGVyIGFib3ZlIGZvb3RlciAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1oLXB4IGNxYS13LWZ1bGxcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+PC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtc3RyZXRjaCBjcWEtdy1mdWxsIGNxYS1wLTQgY3FhLWdhcC0zXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgIGJ0blNpemU9XCJsZ1wiXG4gICAgICAgIHRleHQ9XCJDYW5jZWxcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0gY3FhLWJvcmRlci1bIzQxNDE0Nl0nXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICA8Y3FhLWJ1dHRvbiAqbmdJZj1cIiFpc0NyZWF0aW5nU3RlcFwiXG4gICAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgICBidG5TaXplPVwibGdcIlxuICAgICAgICBbdGV4dF09XCJlZGl0TW9kZSA/ICdVcGRhdGUgU3RlcCcgOiAnQ3JlYXRlIFN0ZXAnXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0Zvcm1WYWxpZCgpXCJcbiAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdIGNxYS1ib3JkZXItWyMzRjQzRUVdJ1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uQ3JlYXRlU3RlcCgpXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNDcmVhdGluZ1N0ZXBcIiBjbGFzcz1cImNxYS1taW4taC1bMzhweF0gY3FhLXJvdW5kZWQtWzhweF1cIj5cbiAgICAgICAgPGNxYS1iYWRnZSBsYWJlbD1cIkNyZWF0aW5n4oCmXCIgaWNvbj1cImF1dG9yZW5ld1wiIFtpc0xvYWRpbmddPVwidHJ1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFtjZW50ZXJDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgIFtpbmxpbmVTdHlsZXNdPVwiJ21pbi1oZWlnaHQ6IDM4cHg7IGhlaWdodDogMzhweDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7J1wiXG4gICAgICAgICAgdmFyaWFudD1cImluZm9cIiBzaXplPVwibWVkaXVtXCI+PC9jcWEtYmFkZ2U+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
523
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWRvY3VtZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3RlcC1idWlsZGVyL3N0ZXAtYnVpbGRlci1kb2N1bWVudC9zdGVwLWJ1aWxkZXItZG9jdW1lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWRvY3VtZW50L3N0ZXAtYnVpbGRlci1kb2N1bWVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQTBCLFNBQVMsRUFBZSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7QUF5QzVGLE1BQU0sT0FBTyw0QkFBNEI7SUFzR3ZDLFlBQW9CLEVBQWU7UUFBZixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBckduQyx5Q0FBeUM7UUFDaEMsd0JBQW1CLEdBQW1CLEVBQUUsQ0FBQztRQUVsRCwrRUFBK0U7UUFDdEUsb0JBQWUsR0FBbUIsRUFBRSxDQUFDO1FBRTlDLHlEQUF5RDtRQUNoRCxxQkFBZ0IsR0FBbUI7WUFDMUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO1lBQzFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtZQUNsRSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUU7WUFD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QkFBa0I7c0JBQTFCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQU1JLFVBQVU7c0JBQW5CLE1BQU07Z0JBR0csU0FBUztzQkFBbEIsTUFBTTtnQkFHRyxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuXG5leHBvcnQgdHlwZSBUZW1wbGF0ZVNvdXJjZVR5cGUgPSAnZXhpc3RpbmcnIHwgJ3VwbG9hZCcgfCAnY3JlYXRlTmV3JztcblxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudE1hcHBpbmdWYWx1ZUVudHJ5IHtcbiAgdmFsdWVUeXBlOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRNYXBwaW5nUm93IHtcbiAga2V5OiBzdHJpbmc7XG4gIHZhbHVlczogRG9jdW1lbnRNYXBwaW5nVmFsdWVFbnRyeVtdO1xuICBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudEZvcm1EYXRhIHtcbiAgZG9jdW1lbnRUeXBlOiBzdHJpbmc7XG4gIG91dHB1dFZhcmlhYmxlOiBzdHJpbmc7XG4gIGZpbGVOYW1lPzogc3RyaW5nO1xuICBzZXByYXRvcj86IHN0cmluZztcbiAgZGVsaW1ldGVyPzogc3RyaW5nO1xuICBmaWxlRm9ybWF0SGVhZGVyPzogc3RyaW5nO1xuICAvKiogRGVzY3JpcHRpb24gZm9yIHRoZSBkb2N1bWVudCBnZW5lcmF0aW9uIHN0ZXAgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHRlbXBsYXRlU291cmNlOiBUZW1wbGF0ZVNvdXJjZVR5cGU7XG4gIHRlbXBsYXRlSWQ/OiBzdHJpbmc7XG4gIC8qKiBVcGxvYWRlZCB0ZW1wbGF0ZSBmaWxlIHdoZW4gdGVtcGxhdGVTb3VyY2UgaXMgJ3VwbG9hZCcgKi9cbiAgdXBsb2FkZWRGaWxlPzogRmlsZTtcbiAgLyoqIFRlbXBsYXRlIG5hbWUgd2hlbiB0ZW1wbGF0ZVNvdXJjZSBpcyAnY3JlYXRlTmV3JyAqL1xuICB0ZW1wbGF0ZU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBUZW1wbGF0ZSBkZXNjcmlwdGlvbiB3aGVuIHRlbXBsYXRlU291cmNlIGlzICdjcmVhdGVOZXcnICovXG4gIHRlbXBsYXRlRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIG1hcHBpbmdzOiBEb2N1bWVudE1hcHBpbmdSb3dbXTtcbiAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcz86IGFueVtdO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc3RlcC1idWlsZGVyLWRvY3VtZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXAtYnVpbGRlci1kb2N1bWVudC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgU3RlcEJ1aWxkZXJEb2N1bWVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgLyoqIE9wdGlvbnMgZm9yIGRvY3VtZW50IHR5cGUgZHJvcGRvd24gKi9cbiAgQElucHV0KCkgZG9jdW1lbnRUeXBlT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXTtcblxuICAvKiogT3B0aW9ucyBmb3IgdGVtcGxhdGUgZHJvcGRvd24gKHdoZW4gXCJVc2UgRXhpc3RpbmcgVGVtcGxhdGVcIiBpcyBzZWxlY3RlZCkgKi9cbiAgQElucHV0KCkgdGVtcGxhdGVPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuXG4gIC8qKiBPcHRpb25zIGZvciB2YWx1ZSB0eXBlIGRyb3Bkb3duIGluIGRvY3VtZW50IG1hcHBlciAqL1xuICBASW5wdXQoKSB2YWx1ZVR5cGVPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAndmFyaWFibGUnLCB2YWx1ZTogJ3ZhcmlhYmxlJywgbmFtZTogJ1ZhcmlhYmxlJywgbGFiZWw6ICdWYXJpYWJsZScgfSxcbiAgICB7IGlkOiAnc3RhdGljJywgdmFsdWU6ICdzdGF0aWMnLCBuYW1lOiAnU3RhdGljJywgbGFiZWw6ICdTdGF0aWMnIH0sXG4gICAgeyBpZDogJ2V4cHJlc3Npb24nLCB2YWx1ZTogJ2V4cHJlc3Npb24nLCBuYW1lOiAnRXhwcmVzc2lvbicsIGxhYmVsOiAnRXhwcmVzc2lvbicgfSxcbiAgICB7IGlkOiAncmVmZXJlbmNlJywgdmFsdWU6ICdyZWZlcmVuY2UnLCBuYW1lOiAnUmVmZXJlbmNlJywgbGFiZWw6ICdSZWZlcmVuY2UnIH1cbiAgXTtcblxuICAvKiogT3B0aW9ucyBmb3IgZGVsaW1ldGVyIHR5cGUgZHJvcGRvd24gKHNob3duIHdoZW4gZG9jdW1lbnRUeXBlIGlzICdjc3YnKSAqL1xuICBASW5wdXQoKSBkZWxpbWV0ZXJUeXBlT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJywnLCB2YWx1ZTogJywnLCBuYW1lOiAnQ29tbWEgKCwpJywgbGFiZWw6ICdDb21tYSAoLCknIH0sXG4gICAgeyBpZDogJzsnLCB2YWx1ZTogJzsnLCBuYW1lOiAnU2VtaWNvbG9uICg7KScsIGxhYmVsOiAnU2VtaWNvbG9uICg7KScgfSxcbiAgICB7IGlkOiAnXFxcXHQnLCB2YWx1ZTogJ1xcXFx0JywgbmFtZTogJ1RhYiAoXFxcXHQpJywgbGFiZWw6ICdUYWIgKFxcXFx0KScgfSxcbiAgICB7IGlkOiAnfCcsIHZhbHVlOiAnfCcsIG5hbWU6ICdQaXBlICh8KScsIGxhYmVsOiAnUGlwZSAofCknIH1cbiAgXTtcblxuICAvKiogRnVuY3Rpb24gdG8gaGFuZGxlIGFkdmFuY2VkIHNldHRpbmdzIHZhcmlhYmxlcy4gQ2FuIGJlIHBhc3NlZCBmcm9tIHBhcmVudCBjb21wb25lbnQuICovXG4gIEBJbnB1dCgpIHNldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6ICh0ZW1wbGF0ZT86IGFueSwgdGVzdFN0ZXA/OiBhbnkpID0+IGFueVtdID0gKCkgPT4geyByZXR1cm4gW119O1xuICBcbiAgLyoqIFRlbXBsYXRlIGZvciBhZHZhbmNlZCBzZXR0aW5ncyAob3B0aW9uYWwpICovXG4gIEBJbnB1dCgpIHRlbXBsYXRlPzogYW55O1xuICBcbiAgLyoqIFRlc3Qgc3RlcCBmb3IgYWR2YW5jZWQgc2V0dGluZ3MgKG9wdGlvbmFsKSAqL1xuICBASW5wdXQoKSB0ZXN0U3RlcD86IGFueTtcblxuICAvKiogT3B0aW9uYWwgVVJMIGZvciBcIk5lZWQgaGVscD9cIiBsaW5rIGluIERvY3VtZW50IE1hcHBlciBzZWN0aW9uICovXG4gIEBJbnB1dCgpIG1hcHBlckhlbHBVcmw6IHN0cmluZyA9ICcnO1xuXG4gIC8qKiBUb29sdGlwIHRleHQgd2hlbiBob3ZlcmluZyBvdmVyIFwiTmVlZCBoZWxwP1wiIChzYW1lIGFzIGN1c3RvbS1lZGl0LXN0ZXApICovXG4gIEBJbnB1dCgpIG1hcHBlckhlbHBUb29sdGlwVGV4dDogc3RyaW5nID0gJ05vdCBzdXJlIHdoYXQgdG8gZG8/IENsaWNrIHRvIGdvIHRvIG91ciBkZXRhaWxlZCBzdGVwIGNyZWF0aW9uIGRvY3VtZW50YXRpb24nO1xuXG4gIC8qKiBJbml0aWFsIGRvY3VtZW50IHR5cGUgZm9yIGVkaXQgbW9kZSAqL1xuICBASW5wdXQoKSBpbml0aWFsRG9jdW1lbnRUeXBlPzogc3RyaW5nO1xuXG4gIC8qKiBJbml0aWFsIG91dHB1dCB2YXJpYWJsZSBmb3IgZWRpdCBtb2RlICovXG4gIEBJbnB1dCgpIGluaXRpYWxPdXRwdXRWYXJpYWJsZT86IHN0cmluZztcblxuICAvKiogSW5pdGlhbCB0ZW1wbGF0ZSBzb3VyY2UgZm9yIGVkaXQgbW9kZSAqL1xuICBASW5wdXQoKSBpbml0aWFsVGVtcGxhdGVTb3VyY2U/OiBUZW1wbGF0ZVNvdXJjZVR5cGU7XG5cbiAgLyoqIEluaXRpYWwgdGVtcGxhdGUgSUQgZm9yIGVkaXQgbW9kZSAqL1xuICBASW5wdXQoKSBpbml0aWFsVGVtcGxhdGVJZD86IHN0cmluZztcblxuICAvKiogSW5pdGlhbCB0ZW1wbGF0ZSBuYW1lIGZvciBlZGl0IG1vZGUgKHdoZW4gdGVtcGxhdGVTb3VyY2UgaXMgJ2NyZWF0ZU5ldycpICovXG4gIEBJbnB1dCgpIGluaXRpYWxUZW1wbGF0ZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqIEluaXRpYWwgdGVtcGxhdGUgZGVzY3JpcHRpb24gZm9yIGVkaXQgbW9kZSAod2hlbiB0ZW1wbGF0ZVNvdXJjZSBpcyAnY3JlYXRlTmV3JykgKi9cbiAgQElucHV0KCkgaW5pdGlhbFRlbXBsYXRlRGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqIEluaXRpYWwgbWFwcGluZ3MgZm9yIGVkaXQgbW9kZSAqL1xuICBASW5wdXQoKSBpbml0aWFsTWFwcGluZ3M/OiBEb2N1bWVudE1hcHBpbmdSb3dbXTtcblxuICAvKiogSW5pdGlhbCBmaWxlIG5hbWUgZm9yIGVkaXQgbW9kZSAqL1xuICBASW5wdXQoKSBpbml0aWFsRmlsZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqIEluaXRpYWwgc2VwcmF0b3IgZm9yIGVkaXQgbW9kZSAqL1xuICBASW5wdXQoKSBpbml0aWFsU2VwcmF0b3I/OiBzdHJpbmc7XG5cbiAgLyoqIEluaXRpYWwgZGVsaW1ldGVyIGZvciBlZGl0IG1vZGUgKi9cbiAgQElucHV0KCkgaW5pdGlhbERlbGltZXRlcj86IHN0cmluZztcblxuICAvKiogSW5pdGlhbCBmaWxlIGZvcm1hdCBoZWFkZXIgZm9yIGVkaXQgbW9kZSAqL1xuICBASW5wdXQoKSBpbml0aWFsRmlsZUZvcm1hdEhlYWRlcj86IHN0cmluZztcblxuICAvKiogSW5pdGlhbCBkZXNjcmlwdGlvbiBmb3IgZWRpdCBtb2RlICovXG4gIEBJbnB1dCgpIGluaXRpYWxEZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKiogV2hldGhlciBpbiBlZGl0IG1vZGUgKi9cbiAgQElucHV0KCkgZWRpdE1vZGU/OiBib29sZWFuO1xuXG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBjcmVhdGluZyB0aGUgc3RlcCAoQVBJIGluIHByb2dyZXNzKTsgc2hvdyBsb2FkZXIgb24gQ3JlYXRlL1VwZGF0ZSBTdGVwIGJ1dHRvbiAqL1xuICBASW5wdXQoKSBpc0NyZWF0aW5nU3RlcDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBoZWxwIHRvb2x0aXAgaXMgdmlzaWJsZSAqL1xuICBzaG93SGVscFRvb2x0aXAgPSBmYWxzZTtcblxuICAvKiogRW1pdCB3aGVuIHN0ZXAgaXMgY3JlYXRlZCAqL1xuICBAT3V0cHV0KCkgY3JlYXRlU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8RG9jdW1lbnRGb3JtRGF0YT4oKTtcblxuICAvKiogRW1pdCB3aGVuIGNhbmNlbGxlZCAqL1xuICBAT3V0cHV0KCkgY2FuY2VsbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gXCJDcmVhdGUgVGVtcGxhdGVcIiBpcyBjbGlja2VkIChDcmVhdGUgTmV3IGZsb3cpLiBIb3N0IGNhbiBjcmVhdGUgdGVtcGxhdGUgdmlhIEFQSS4gKi9cbiAgQE91dHB1dCgpIGNyZWF0ZVRlbXBsYXRlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHRlbXBsYXRlTmFtZTogc3RyaW5nOyB0ZW1wbGF0ZURlc2NyaXB0aW9uOiBzdHJpbmcgfT4oKTtcblxuICBkb2N1bWVudEZvcm06IEZvcm1Hcm91cDtcbiAgc2VsZWN0ZWRUZW1wbGF0ZVNvdXJjZTogVGVtcGxhdGVTb3VyY2VUeXBlID0gJ2V4aXN0aW5nJztcbiAgLyoqIFVwbG9hZGVkIGZpbGUgd2hlbiBUZW1wbGF0ZSBTb3VyY2UgaXMgXCJVcGxvYWQgVGVtcGxhdGVcIiAqL1xuICB1cGxvYWRlZEZpbGU6IEZpbGUgfCBudWxsID0gbnVsbDtcbiAgLyoqIFZpc3VhbCBzdGF0ZSBmb3IgZHJhZy1hbmQtZHJvcCB6b25lICovXG4gIGlzRHJhZ092ZXIgPSBmYWxzZTtcbiAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogYW55W10gPSBbXTtcbiAgYWR2YW5jZWRWYXJpYWJsZXNGb3JtOiBGb3JtQXJyYXk7XG4gIGFkdmFuY2VkRXhwYW5kZWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7XG4gICAgdGhpcy5kb2N1bWVudEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGRvY3VtZW50VHlwZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIG91dHB1dFZhcmlhYmxlOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgZmlsZU5hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBzZXByYXRvcjogWycnXSxcbiAgICAgIGRlbGltZXRlcjogWycnXSxcbiAgICAgIGZpbGVGb3JtYXRIZWFkZXI6IFsnJ10sXG4gICAgICBkZXNjcmlwdGlvbjogWycnXSxcbiAgICAgIHRlbXBsYXRlU291cmNlOiBbJ2V4aXN0aW5nJ10sXG4gICAgICB0ZW1wbGF0ZUlkOiBbbnVsbF0sXG4gICAgICB0ZW1wbGF0ZU5hbWU6IFsnJ10sXG4gICAgICB0ZW1wbGF0ZURlc2NyaXB0aW9uOiBbJyddLFxuICAgICAgbWFwcGluZ3M6IHRoaXMuZmIuYXJyYXkoW10pXG4gICAgfSk7XG4gICAgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0gPSB0aGlzLmZiLmFycmF5KFtdKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZVNvdXJjZSA9IHRoaXMuaW5pdGlhbFRlbXBsYXRlU291cmNlIHx8IHRoaXMuZG9jdW1lbnRGb3JtLmdldCgndGVtcGxhdGVTb3VyY2UnKT8udmFsdWUgfHwgJ2V4aXN0aW5nJztcbiAgICB0aGlzLmluaXRpYWxpemVGb3JtV2l0aEluaXRpYWxWYWx1ZXMoKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGFkdmFuY2VkIHNldHRpbmdzIHZhcmlhYmxlc1xuICAgIGlmICh0aGlzLnNldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMpIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyA9IHRoaXMuc2V0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyh0aGlzLnRlbXBsYXRlLCB0aGlzLnRlc3RTdGVwKTtcbiAgICAgIHRoaXMuYnVpbGRBZHZhbmNlZFZhcmlhYmxlc0Zvcm0oKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2RvY3VtZW50VHlwZU9wdGlvbnMnXSB8fCBjaGFuZ2VzWyd0ZW1wbGF0ZU9wdGlvbnMnXSB8fCBjaGFuZ2VzWyd2YWx1ZVR5cGVPcHRpb25zJ10gfHwgY2hhbmdlc1snZGVsaW1ldGVyVHlwZU9wdGlvbnMnXSkge1xuICAgICAgLy8gQ29uZmlncyBhcmUgYnVpbHQgZnJvbSBpbnB1dHMgaW4gZ2V0dGVyczsgbm8gbmVlZCB0byByZWJ1aWxkIGZvcm1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxEb2N1bWVudFR5cGUnXSB8fCBjaGFuZ2VzWydpbml0aWFsT3V0cHV0VmFyaWFibGUnXSB8fCBjaGFuZ2VzWydpbml0aWFsVGVtcGxhdGVTb3VyY2UnXSB8fCBcbiAgICAgICAgY2hhbmdlc1snaW5pdGlhbFRlbXBsYXRlSWQnXSB8fCBjaGFuZ2VzWydpbml0aWFsTWFwcGluZ3MnXSB8fCBjaGFuZ2VzWydpbml0aWFsVGVtcGxhdGVOYW1lJ10gfHwgXG4gICAgICAgIGNoYW5nZXNbJ2luaXRpYWxUZW1wbGF0ZURlc2NyaXB0aW9uJ10gfHwgY2hhbmdlc1snaW5pdGlhbEZpbGVOYW1lJ10gfHwgY2hhbmdlc1snaW5pdGlhbFNlcHJhdG9yJ10gfHwgXG4gICAgICAgIGNoYW5nZXNbJ2luaXRpYWxEZWxpbWV0ZXInXSB8fCBjaGFuZ2VzWydpbml0aWFsRmlsZUZvcm1hdEhlYWRlciddIHx8IGNoYW5nZXNbJ2luaXRpYWxEZXNjcmlwdGlvbiddKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVGb3JtV2l0aEluaXRpYWxWYWx1ZXMoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3RlbXBsYXRlJ10gfHwgY2hhbmdlc1sndGVzdFN0ZXAnXSB8fCBjaGFuZ2VzWydzZXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzJ10pIHtcbiAgICAgIC8vIFJlLWluaXRpYWxpemUgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzIGlmIHRlbXBsYXRlIG9yIHRlc3RTdGVwIGNoYW5nZXNcbiAgICAgIGlmICh0aGlzLnNldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMpIHtcbiAgICAgICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gdGhpcy5zZXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzKHRoaXMudGVtcGxhdGUsIHRoaXMudGVzdFN0ZXApO1xuICAgICAgICB0aGlzLmJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRm9ybVdpdGhJbml0aWFsVmFsdWVzKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGV4aXN0aW5nIG1hcHBpbmdzXG4gICAgd2hpbGUgKHRoaXMubWFwcGluZ3NGb3JtQXJyYXkubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLm1hcHBpbmdzRm9ybUFycmF5LnJlbW92ZUF0KDApO1xuICAgIH1cblxuICAgIC8vIFNldCBpbml0aWFsIHZhbHVlcyBpZiBwcm92aWRlZFxuICAgIGlmICh0aGlzLmluaXRpYWxEb2N1bWVudFR5cGUpIHtcbiAgICAgIHRoaXMuZG9jdW1lbnRGb3JtLnBhdGNoVmFsdWUoeyBkb2N1bWVudFR5cGU6IHRoaXMuaW5pdGlhbERvY3VtZW50VHlwZSB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW5pdGlhbE91dHB1dFZhcmlhYmxlKSB7XG4gICAgICB0aGlzLmRvY3VtZW50Rm9ybS5wYXRjaFZhbHVlKHsgb3V0cHV0VmFyaWFibGU6IHRoaXMuaW5pdGlhbE91dHB1dFZhcmlhYmxlIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbml0aWFsRmlsZU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5kb2N1bWVudEZvcm0ucGF0Y2hWYWx1ZSh7IGZpbGVOYW1lOiB0aGlzLmluaXRpYWxGaWxlTmFtZSB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW5pdGlhbFNlcHJhdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZG9jdW1lbnRGb3JtLnBhdGNoVmFsdWUoeyBzZXByYXRvcjogdGhpcy5pbml0aWFsU2VwcmF0b3IgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmluaXRpYWxEZWxpbWV0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5kb2N1bWVudEZvcm0ucGF0Y2hWYWx1ZSh7IGRlbGltZXRlcjogdGhpcy5pbml0aWFsRGVsaW1ldGVyIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbml0aWFsRmlsZUZvcm1hdEhlYWRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRvY3VtZW50Rm9ybS5wYXRjaFZhbHVlKHsgZmlsZUZvcm1hdEhlYWRlcjogdGhpcy5pbml0aWFsRmlsZUZvcm1hdEhlYWRlciB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW5pdGlhbERlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZG9jdW1lbnRGb3JtLnBhdGNoVmFsdWUoeyBkZXNjcmlwdGlvbjogdGhpcy5pbml0aWFsRGVzY3JpcHRpb24gfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmluaXRpYWxUZW1wbGF0ZVNvdXJjZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlU291cmNlID0gdGhpcy5pbml0aWFsVGVtcGxhdGVTb3VyY2U7XG4gICAgICB0aGlzLmRvY3VtZW50Rm9ybS5wYXRjaFZhbHVlKHsgdGVtcGxhdGVTb3VyY2U6IHRoaXMuaW5pdGlhbFRlbXBsYXRlU291cmNlIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbml0aWFsVGVtcGxhdGVJZCkge1xuICAgICAgdGhpcy5kb2N1bWVudEZvcm0ucGF0Y2hWYWx1ZSh7IHRlbXBsYXRlSWQ6IHRoaXMuaW5pdGlhbFRlbXBsYXRlSWQgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmluaXRpYWxUZW1wbGF0ZU5hbWUpIHtcbiAgICAgIHRoaXMuZG9jdW1lbnRGb3JtLnBhdGNoVmFsdWUoeyB0ZW1wbGF0ZU5hbWU6IHRoaXMuaW5pdGlhbFRlbXBsYXRlTmFtZSB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW5pdGlhbFRlbXBsYXRlRGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZG9jdW1lbnRGb3JtLnBhdGNoVmFsdWUoeyB0ZW1wbGF0ZURlc2NyaXB0aW9uOiB0aGlzLmluaXRpYWxUZW1wbGF0ZURlc2NyaXB0aW9uIH0pO1xuICAgIH1cblxuICAgIC8vIExvYWQgaW5pdGlhbCBtYXBwaW5nc1xuICAgIGlmICh0aGlzLmluaXRpYWxNYXBwaW5ncyAmJiB0aGlzLmluaXRpYWxNYXBwaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmluaXRpYWxNYXBwaW5ncy5mb3JFYWNoKG1hcHBpbmcgPT4ge1xuICAgICAgICBjb25zdCBsZWdhY3kgPSBtYXBwaW5nIGFzIGFueTtcbiAgICAgICAgY29uc3Qgc2VlZEVudHJpZXM6IERvY3VtZW50TWFwcGluZ1ZhbHVlRW50cnlbXSA9XG4gICAgICAgICAgQXJyYXkuaXNBcnJheShtYXBwaW5nLnZhbHVlcykgJiYgbWFwcGluZy52YWx1ZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyBtYXBwaW5nLnZhbHVlc1xuICAgICAgICAgICAgOiAobGVnYWN5LnZhbHVlVHlwZSAhPT0gdW5kZWZpbmVkIHx8IGxlZ2FjeS52YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICA/IFt7IHZhbHVlVHlwZTogbGVnYWN5LnZhbHVlVHlwZSB8fCAndmFyaWFibGUnLCB2YWx1ZTogbGVnYWN5LnZhbHVlIHx8ICcnIH1dXG4gICAgICAgICAgICAgIDogW3sgdmFsdWVUeXBlOiAndmFyaWFibGUnLCB2YWx1ZTogJycgfV07XG5cbiAgICAgICAgY29uc3QgdmFsdWVzQXJyYXkgPSB0aGlzLmZiLmFycmF5KFxuICAgICAgICAgIHNlZWRFbnRyaWVzLm1hcChlbnRyeSA9PiB0aGlzLmJ1aWxkVmFsdWVFbnRyeShlbnRyeSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgbWFwcGluZ0dyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAga2V5OiBbbWFwcGluZy5rZXkgfHwgJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgIGVuYWJsZWQ6IFttYXBwaW5nLmVuYWJsZWQgPz8gZmFsc2VdLFxuICAgICAgICAgIHZhbHVlczogdmFsdWVzQXJyYXlcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWFwcGluZ3NGb3JtQXJyYXkucHVzaChtYXBwaW5nR3JvdXApO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFkZCBvbmUgZW1wdHkgbWFwcGluZyBpZiBubyBpbml0aWFsIG1hcHBpbmdzXG4gICAgICBpZiAodGhpcy5tYXBwaW5nc0Zvcm1BcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5hZGRNYXBwaW5nKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IG1hcHBpbmdzRm9ybUFycmF5KCk6IEZvcm1BcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRGb3JtLmdldCgnbWFwcGluZ3MnKSBhcyBGb3JtQXJyYXk7XG4gIH1cblxuICBnZXREb2N1bWVudFR5cGVDb25maWcoKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiAnZG9jdW1lbnRUeXBlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGRvY3VtZW50IHR5cGUnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiB0aGlzLmRvY3VtZW50VHlwZU9wdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgZ2V0VGVtcGxhdGVTZWxlY3RDb25maWcoKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiAndGVtcGxhdGVJZCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBUZW1wbGF0ZSBkcm9wZG93bicsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMudGVtcGxhdGVPcHRpb25zXG4gICAgfTtcbiAgfVxuXG4gIGdldFZhbHVlVHlwZUNvbmZpZyhyb3dJbmRleDogbnVtYmVyLCB2YWx1ZUluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6ICd2YWx1ZVR5cGUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdWYWx1ZSBUeXBlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogdGhpcy52YWx1ZVR5cGVPcHRpb25zLFxuICAgICAgb25DaGFuZ2U6ICgpID0+IHt9XG4gICAgfTtcbiAgfVxuXG4gIGdldERlbGltZXRlckNvbmZpZygpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6ICdkZWxpbWV0ZXInLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgRGVsaW1ldGVyJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogdGhpcy5kZWxpbWV0ZXJUeXBlT3B0aW9uc1xuICAgIH07XG4gIH1cblxuICBnZXQgaXNUeHRTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kb2N1bWVudEZvcm0uZ2V0KCdkb2N1bWVudFR5cGUnKT8udmFsdWUgPT09ICd0eHQnO1xuICB9XG5cbiAgZ2V0IGlzQ3N2U2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRGb3JtLmdldCgnZG9jdW1lbnRUeXBlJyk/LnZhbHVlID09PSAnY3N2JztcbiAgfVxuXG4gIG9uVGVtcGxhdGVTb3VyY2VDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZVNvdXJjZSA9IHZhbHVlIGFzIFRlbXBsYXRlU291cmNlVHlwZTtcbiAgICB0aGlzLmRvY3VtZW50Rm9ybS5wYXRjaFZhbHVlKHsgdGVtcGxhdGVTb3VyY2U6IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZVNvdXJjZSB9KTtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFRlbXBsYXRlU291cmNlICE9PSAndXBsb2FkJykge1xuICAgICAgdGhpcy51cGxvYWRlZEZpbGUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIG9uQ3JlYXRlVGVtcGxhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZG9jdW1lbnRGb3JtLmdldCgndGVtcGxhdGVOYW1lJyk/LnZhbHVlPy50cmltKCkgPz8gJyc7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSB0aGlzLmRvY3VtZW50Rm9ybS5nZXQoJ3RlbXBsYXRlRGVzY3JpcHRpb24nKT8udmFsdWU/LnRyaW0oKSA/PyAnJztcbiAgICB0aGlzLmNyZWF0ZVRlbXBsYXRlLmVtaXQoeyB0ZW1wbGF0ZU5hbWU6IG5hbWUsIHRlbXBsYXRlRGVzY3JpcHRpb246IGRlc2NyaXB0aW9uIH0pO1xuICB9XG5cbiAgb25GaWxlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXM/LlswXTtcbiAgICBpZiAoZmlsZSkge1xuICAgICAgdGhpcy51cGxvYWRlZEZpbGUgPSBmaWxlO1xuICAgIH1cbiAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICB9XG5cbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmlzRHJhZ092ZXIgPSB0cnVlO1xuICB9XG5cbiAgb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pc0RyYWdPdmVyID0gZmFsc2U7XG4gIH1cblxuICBvbkRyb3AoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pc0RyYWdPdmVyID0gZmFsc2U7XG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXM/LlswXTtcbiAgICBpZiAoZmlsZSAmJiB0aGlzLmlzQWNjZXB0ZWRUZW1wbGF0ZUZpbGUoZmlsZSkpIHtcbiAgICAgIHRoaXMudXBsb2FkZWRGaWxlID0gZmlsZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzQWNjZXB0ZWRUZW1wbGF0ZUZpbGUoZmlsZTogRmlsZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFjY2VwdGVkID0gWycucGRmJywgJy5kb2MnLCAnLmRvY3gnLCAnLnR4dCddO1xuICAgIGNvbnN0IG5hbWUgPSBmaWxlLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gYWNjZXB0ZWQuc29tZShleHQgPT4gbmFtZS5lbmRzV2l0aChleHQpKTtcbiAgfVxuXG4gIGFkZE1hcHBpbmcoKTogdm9pZCB7XG4gICAgY29uc3QgbWFwcGluZ0dyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBrZXk6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBlbmFibGVkOiBbZmFsc2VdLFxuICAgICAgdmFsdWVzOiB0aGlzLmZiLmFycmF5KFt0aGlzLmJ1aWxkVmFsdWVFbnRyeSgpXSlcbiAgICB9KTtcbiAgICB0aGlzLm1hcHBpbmdzRm9ybUFycmF5LnB1c2gobWFwcGluZ0dyb3VwKTtcbiAgfVxuXG4gIHJlbW92ZU1hcHBpbmcoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubWFwcGluZ3NGb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgZ2V0TWFwcGluZ0Zvcm1Hcm91cChpbmRleDogbnVtYmVyKTogRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5tYXBwaW5nc0Zvcm1BcnJheS5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFZhbHVlRW50cnkoc2VlZD86IFBhcnRpYWw8RG9jdW1lbnRNYXBwaW5nVmFsdWVFbnRyeT4pOiBGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHZhbHVlVHlwZTogW3NlZWQ/LnZhbHVlVHlwZSA/PyAndmFyaWFibGUnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHZhbHVlOiBbc2VlZD8udmFsdWUgPz8gJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgfSk7XG4gIH1cblxuICBnZXRWYWx1ZXNGb3JtQXJyYXkocm93SW5kZXg6IG51bWJlcik6IEZvcm1BcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TWFwcGluZ0Zvcm1Hcm91cChyb3dJbmRleCkuZ2V0KCd2YWx1ZXMnKSBhcyBGb3JtQXJyYXk7XG4gIH1cblxuICBnZXRWYWx1ZUZvcm1Hcm91cChyb3dJbmRleDogbnVtYmVyLCB2YWx1ZUluZGV4OiBudW1iZXIpOiBGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlc0Zvcm1BcnJheShyb3dJbmRleCkuYXQodmFsdWVJbmRleCkgYXMgRm9ybUdyb3VwO1xuICB9XG5cbiAgYWRkVmFsdWVFbnRyeShyb3dJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5nZXRWYWx1ZXNGb3JtQXJyYXkocm93SW5kZXgpLnB1c2godGhpcy5idWlsZFZhbHVlRW50cnkoKSk7XG4gIH1cblxuICByZW1vdmVWYWx1ZUVudHJ5KHJvd0luZGV4OiBudW1iZXIsIHZhbHVlSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGFyciA9IHRoaXMuZ2V0VmFsdWVzRm9ybUFycmF5KHJvd0luZGV4KTtcbiAgICBpZiAoYXJyLmxlbmd0aCA+IDEpIHtcbiAgICAgIGFyci5yZW1vdmVBdCh2YWx1ZUluZGV4KTtcbiAgICB9XG4gICAgLy8gVGhlIGxhc3QgZW50cnkgY2FuJ3QgYmUgcmVtb3ZlZCB2aWEgdGhlIHBlci12YWx1ZSDDlyBidXR0b24g4oCUXG4gICAgLy8gdXNlcnMgZGVsZXRlIHRoZSB3aG9sZSBrZXkgdmlhIHRoZSByb3cgdHJhc2ggaWNvbiBpbnN0ZWFkLlxuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBldmVyeSBtYXBwaW5nIHJvdyBoYXMgZW5hYmxlZCA9PT0gdHJ1ZSAqL1xuICBnZXQgYWxsTWFwcGluZ3NTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBsZW4gPSB0aGlzLm1hcHBpbmdzRm9ybUFycmF5Lmxlbmd0aDtcbiAgICBpZiAobGVuID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKCF0aGlzLmdldE1hcHBpbmdGb3JtR3JvdXAoaSkuZ2V0KCdlbmFibGVkJyk/LnZhbHVlKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBhdCBsZWFzdCBvbmUgbWFwcGluZyByb3cgaGFzIGVuYWJsZWQgPT09IHRydWUgKGZvciBoZWFkZXIgaW5kZXRlcm1pbmF0ZSkgKi9cbiAgZ2V0IHNvbWVNYXBwaW5nc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tYXBwaW5nc0Zvcm1BcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZ2V0TWFwcGluZ0Zvcm1Hcm91cChpKS5nZXQoJ2VuYWJsZWQnKT8udmFsdWUpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBvblNlbGVjdEFsbE1hcHBpbmdzKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm1hcHBpbmdzRm9ybUFycmF5LmNvbnRyb2xzLmZvckVhY2goKF8sIGkpID0+IHtcbiAgICAgIHRoaXMuZ2V0TWFwcGluZ0Zvcm1Hcm91cChpKS5nZXQoJ2VuYWJsZWQnKT8uc2V0VmFsdWUoY2hlY2tlZCk7XG4gICAgfSk7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiBtYWluIGZvcm0gaXMgdmFsaWQgKGRvY3VtZW50VHlwZSwgb3V0cHV0VmFyaWFibGUsIGFuZCBmaWxlTmFtZSBhcmUgcmVxdWlyZWQpXG4gICAgY29uc3QgZG9jdW1lbnRUeXBlID0gdGhpcy5kb2N1bWVudEZvcm0uZ2V0KCdkb2N1bWVudFR5cGUnKT8udmFsdWU7XG4gICAgY29uc3Qgb3V0cHV0VmFyaWFibGUgPSB0aGlzLmRvY3VtZW50Rm9ybS5nZXQoJ291dHB1dFZhcmlhYmxlJyk/LnZhbHVlO1xuICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5kb2N1bWVudEZvcm0uZ2V0KCdmaWxlTmFtZScpPy52YWx1ZTtcblxuICAgIGlmICghZG9jdW1lbnRUeXBlIHx8ICFvdXRwdXRWYXJpYWJsZSB8fCAhZmlsZU5hbWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayB0ZW1wbGF0ZSBzb3VyY2Ugc3BlY2lmaWMgcmVxdWlyZW1lbnRzXG4gICAgLy8gaWYgKHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZVNvdXJjZSA9PT0gJ2V4aXN0aW5nJykge1xuICAgIC8vICAgY29uc3QgdGVtcGxhdGVJZCA9IHRoaXMuZG9jdW1lbnRGb3JtLmdldCgndGVtcGxhdGVJZCcpPy52YWx1ZTtcbiAgICAvLyAgIGlmICghdGVtcGxhdGVJZCkge1xuICAgIC8vICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gICB9XG4gICAgLy8gfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGVtcGxhdGVTb3VyY2UgPT09ICd1cGxvYWQnKSB7XG4gICAgLy8gICBpZiAoIXRoaXMudXBsb2FkZWRGaWxlKSB7XG4gICAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyAgIH1cbiAgICAvLyB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZVNvdXJjZSA9PT0gJ2NyZWF0ZU5ldycpIHtcbiAgICAvLyAgIGNvbnN0IG5hbWUgPSB0aGlzLmRvY3VtZW50Rm9ybS5nZXQoJ3RlbXBsYXRlTmFtZScpPy52YWx1ZT8udHJpbSgpO1xuICAgIC8vICAgY29uc3QgZGVzYyA9IHRoaXMuZG9jdW1lbnRGb3JtLmdldCgndGVtcGxhdGVEZXNjcmlwdGlvbicpPy52YWx1ZT8udHJpbSgpO1xuICAgIC8vICAgaWYgKCFuYW1lIHx8ICFkZXNjKSB7XG4gICAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyAgIH1cbiAgICAvLyB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRBZHZhbmNlZFZhcmlhYmxlc0Zvcm0oKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgZm9ybSBhcnJheVxuICAgIHdoaWxlICh0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICAgIH1cblxuICAgIC8vIEFkZCBmb3JtIGdyb3VwcyBmb3IgZWFjaCBhZHZhbmNlZCB2YXJpYWJsZVxuICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgdHlwZXNcbiAgICAgIGxldCBkZWZhdWx0VmFsdWU6IGFueTtcbiAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnKSB7XG4gICAgICAgIC8vIEZvciBzdHJfbGlzdCwgY3JlYXRlIGEgRm9ybUFycmF5XG4gICAgICAgIGNvbnN0IHZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlLnZhbHVlKSA/IHZhcmlhYmxlLnZhbHVlIDogW107XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheVZhbHVlID0gdGhpcy5mYi5hcnJheShcbiAgICAgICAgICB2YWx1ZUFycmF5Lmxlbmd0aCA+IDAgXG4gICAgICAgICAgICA/IHZhbHVlQXJyYXkubWFwKChpdGVtOiBzdHJpbmcpID0+IHRoaXMuZmIuY29udHJvbChpdGVtKSlcbiAgICAgICAgICAgIDogW3RoaXMuZmIuY29udHJvbCgnJyldIC8vIFN0YXJ0IHdpdGggb25lIGVtcHR5IGNvbnRyb2xcbiAgICAgICAgKTtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gZm9ybUFycmF5VmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgdmFyaWFibGUudmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudmFsdWUgfHwgJyc7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBhIEZvcm1Hcm91cCBmb3IgZWFjaCB2YXJpYWJsZVxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiB2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnID8gZGVmYXVsdFZhbHVlIDogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICAgIHR5cGU6IFt2YXJpYWJsZS50eXBlIHx8ICdzdHJpbmcnXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZS5sYWJlbCB8fCAnJ11cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIH0pO1xuICB9XG5cbiAgb25BZHZhbmNlZFZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uYXQodmFyaWFibGVJbmRleCkuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICAgIC8vIEZvciBzdHJfbGlzdCwgdGhlIEZvcm1BcnJheSBpcyBhbHJlYWR5IG1hbmFnZWQgaW5zaWRlIEFkdmFuY2VkVmFyaWFibGVzRm9ybUNvbXBvbmVudCxcbiAgICAgIC8vIHNvIHdlIGRvbid0IG5lZWQgdG8gcmVidWlsZCBvciB1cGRhdGUgaXQgaGVyZSB0byBhdm9pZCBmb2N1cyBsb3NzLlxuICAgICAgaWYgKHZhcmlhYmxlPy50eXBlICE9PSAnc3RyX2xpc3QnKSB7XG4gICAgICAgIGZvcm1Hcm91cD8uZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUFkdmFuY2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYWR2YW5jZWRFeHBhbmRlZCA9ICF0aGlzLmFkdmFuY2VkRXhwYW5kZWQ7XG4gIH1cblxuICBvbkNyZWF0ZVN0ZXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gU3luYyBhZHZhbmNlZCB2YXJpYWJsZXMgZnJvbSBmb3JtIHRvIGFycmF5XG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uYXQoaW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICAgIGlmIChmb3JtR3JvdXApIHtcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gZm9ybUdyb3VwLmdldCgndmFsdWUnKT8udmFsdWU7XG4gICAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnICYmIGZvcm1WYWx1ZSBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgICAgIC8vIEV4dHJhY3QgdmFsdWVzIGZyb20gRm9ybUFycmF5XG4gICAgICAgICAgdmFyaWFibGUudmFsdWUgPSBmb3JtVmFsdWUuY29udHJvbHMubWFwKGNvbnRyb2wgPT4gY29udHJvbC52YWx1ZSkuZmlsdGVyKCh2YWw6IHN0cmluZykgPT4gdmFsICYmIHZhbC50cmltKCkgIT09ICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZG9jdW1lbnRGb3JtLnZhbHVlO1xuICAgIGNvbnN0IHN0ZXBEYXRhOiBEb2N1bWVudEZvcm1EYXRhID0ge1xuICAgICAgZG9jdW1lbnRUeXBlOiBmb3JtVmFsdWUuZG9jdW1lbnRUeXBlLFxuICAgICAgb3V0cHV0VmFyaWFibGU6IGZvcm1WYWx1ZS5vdXRwdXRWYXJpYWJsZSxcbiAgICAgIGZpbGVOYW1lOiBmb3JtVmFsdWUuZmlsZU5hbWUgfHwgdW5kZWZpbmVkLFxuICAgICAgc2VwcmF0b3I6IGZvcm1WYWx1ZS5zZXByYXRvciB8fCB1bmRlZmluZWQsXG4gICAgICBkZWxpbWV0ZXI6IGZvcm1WYWx1ZS5kZWxpbWV0ZXIgfHwgdW5kZWZpbmVkLFxuICAgICAgZmlsZUZvcm1hdEhlYWRlcjogZm9ybVZhbHVlLmZpbGVGb3JtYXRIZWFkZXIgfHwgdW5kZWZpbmVkLFxuICAgICAgZGVzY3JpcHRpb246IGZvcm1WYWx1ZS5kZXNjcmlwdGlvbj8udHJpbSgpIHx8IHVuZGVmaW5lZCxcbiAgICAgIHRlbXBsYXRlU291cmNlOiB0aGlzLnNlbGVjdGVkVGVtcGxhdGVTb3VyY2UsXG4gICAgICB0ZW1wbGF0ZUlkOiBmb3JtVmFsdWUudGVtcGxhdGVJZCB8fCB1bmRlZmluZWQsXG4gICAgICAuLi4odGhpcy5zZWxlY3RlZFRlbXBsYXRlU291cmNlID09PSAndXBsb2FkJyAmJiB0aGlzLnVwbG9hZGVkRmlsZSAmJiB7IHVwbG9hZGVkRmlsZTogdGhpcy51cGxvYWRlZEZpbGUgfSksXG4gICAgICAuLi4odGhpcy5zZWxlY3RlZFRlbXBsYXRlU291cmNlID09PSAnY3JlYXRlTmV3JyAmJiB7XG4gICAgICAgIHRlbXBsYXRlTmFtZTogKGZvcm1WYWx1ZS50ZW1wbGF0ZU5hbWUgPz8gJycpLnRyaW0oKSxcbiAgICAgICAgdGVtcGxhdGVEZXNjcmlwdGlvbjogKGZvcm1WYWx1ZS50ZW1wbGF0ZURlc2NyaXB0aW9uID8/ICcnKS50cmltKClcbiAgICAgIH0pLFxuICAgICAgbWFwcGluZ3M6IChmb3JtVmFsdWUubWFwcGluZ3MgfHwgW10pLm1hcCgobTogYW55KSA9PiAoe1xuICAgICAgICBrZXk6IG0ua2V5IHx8ICcnLFxuICAgICAgICBlbmFibGVkOiBtLmVuYWJsZWQgPz8gZmFsc2UsXG4gICAgICAgIHZhbHVlczogKG0udmFsdWVzIHx8IFtdKS5tYXAoKHY6IGFueSkgPT4gKHtcbiAgICAgICAgICB2YWx1ZVR5cGU6IHYudmFsdWVUeXBlIHx8ICd2YXJpYWJsZScsXG4gICAgICAgICAgdmFsdWU6IHYudmFsdWUgfHwgJydcbiAgICAgICAgfSkpXG4gICAgICB9KSksXG4gICAgICBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzOiB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMubGVuZ3RoID4gMCA/IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyA6IHVuZGVmaW5lZFxuICAgIH07XG4gICAgdGhpcy5jcmVhdGVTdGVwLmVtaXQoc3RlcERhdGEpO1xuICB9XG5cbiAgb25NYXBwZXJIZWxwQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWFwcGVySGVscFVybCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHdpbmRvdy5vcGVuKHRoaXMubWFwcGVySGVscFVybCwgJ19ibGFuaycpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290IGNxYS1ibG9jayBjcWEtdy1mdWxsIGNxYS1taW4tdy0wIGNxYS1zdGVwLWJ1aWxkZXItZG9jdW1lbnRcIiBzdHlsZT1cImhlaWdodDogMTAwJTt3aWR0aDogMTAwJTtcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS13LWZ1bGwgY3FhLW1pbi13LTAgY3FhLWgtZnVsbCBjcWEtYmctd2hpdGUgY3FhLWJvcmRlciBjcWEtYm94LWJvcmRlciBjcWEtbWF4LXctZnVsbCBjcWEtb3BhY2l0eS0xMDAgY3FhLWgtZnVsbCBjcWEtdy1mdWxsXCI+XG4gICAgPCEtLSBDb250ZW50IGFyZWE6IHBhZGRpbmcgMTZweCwgZ2FwIDEycHggYmV0d2VlbiBzZWN0aW9ucyAobm8gZmxleC0xIHRvIGF2b2lkIGdhcCBhYm92ZSBmb290ZXIpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1wLTQgY3FhLWdhcC0zXCI+XG4gIDwhLS0gSGVhZGVyOiBEb2N1bWVudCBHZW5lcmF0aW9uIFRlbXBsYXRlIFN0ZXAgKGxlZnQtYWxpZ25lZCwgSW50ZXIgNjAwIDEycHggbGluZS1oZWlnaHQgMTAwJSkgLS0+XG4gIDxoMlxuICAgIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxMDAlXSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMCBjcWEtdGV4dC1sZWZ0IGNxYS1mbGV4LXNocmluay0wIGNxYS1hbGlnbi1taWRkbGVcIj5cbiAgICBEb2N1bWVudCBHZW5lcmF0aW9uIFRlbXBsYXRlIFN0ZXBcbiAgPC9oMj5cblxuICAgIDwhLS0gRmlsZSBOYW1lIGFuZCBEb2N1bWVudCBUeXBlIFJvdyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtd3JhcCBjcWEtZmxleC1zaHJpbmstMCBjcWEtZ2FwLTE0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMCBjcWEtbWluLXctW2NhbGMoNDUlLTZweCldXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW1iLTEuNSBjcWEtYmxvY2tcIj5cbiAgICAgICAgICBGaWxlIE5hbWUgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZpbGUgTmFtZVwiXG4gICAgICAgICAgW3ZhbHVlXT1cImRvY3VtZW50Rm9ybS5nZXQoJ2ZpbGVOYW1lJyk/LnZhbHVlXCJcbiAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJkb2N1bWVudEZvcm0uZ2V0KCdmaWxlTmFtZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLW10LTEgY3FhLW0tMFwiPlxuICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGdlbmVyYXRlZFxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wIGNxYS1taW4tdy1bY2FsYyg0NSUtNnB4KV0gXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW1iLTEuNSBjcWEtYmxvY2tcIj5cbiAgICAgICAgICBEb2N1bWVudCBUeXBlIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkb2N1bWVudC10eXBlLXNlbGVjdFwiPlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgIFtmb3JtXT1cImRvY3VtZW50Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldERvY3VtZW50VHlwZUNvbmZpZygpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtbXQtMSBjcWEtbS0wXCI+XG4gICAgICAgICAgQ2hvb3NlIHRoZSBmaWxlIGZvcm1hdCB5b3Ugd2FudCB0byBnZW5lcmF0ZS5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIE91dHB1dCBWYXJpYWJsZSBhbmQgQ29uZGl0aW9uYWwgRmllbGRzIFJvdyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtd3JhcCBjcWEtZmxleC1zaHJpbmstMCBjcWEtZ2FwLTE0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMCBjcWEtbWluLXctW2NhbGMoNDUlLTZweCldXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW1iLTEuNSBjcWEtYmxvY2tcIj5cbiAgICAgICAgICBPdXRwdXQgVmFyaWFibGUgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIklucHV0XCJcbiAgICAgICAgICBbdmFsdWVdPVwiZG9jdW1lbnRGb3JtLmdldCgnb3V0cHV0VmFyaWFibGUnKT8udmFsdWVcIlxuICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImRvY3VtZW50Rm9ybS5nZXQoJ291dHB1dFZhcmlhYmxlJyk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtbXQtMSBjcWEtbS0wXCI+XG4gICAgICAgICAgU3RvcmVzIHRoZSBnZW5lcmF0ZWQgZmlsZSBzbyBpdCBjYW4gYmUgdXNlZCBpbiBsYXRlciBzdGVwcy5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIFNlcHJhdG9yIChzaG93biB3aGVuIGRvY3VtZW50VHlwZSBpcyAndHh0JykgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMCBjcWEtbWluLXctW2NhbGMoNDUlLTZweCldXCIgKm5nSWY9XCJpc1R4dFNlbGVjdGVkXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW1iLTEuNSBjcWEtYmxvY2tcIj5cbiAgICAgICAgICBTZXByYXRvclxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VwcmF0b3JcIlxuICAgICAgICAgIFt2YWx1ZV09XCJkb2N1bWVudEZvcm0uZ2V0KCdzZXByYXRvcicpPy52YWx1ZVwiXG4gICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZG9jdW1lbnRGb3JtLmdldCgnc2VwcmF0b3InKT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyMwQTBBMEFdIGNxYS1tdC0xIGNxYS1tLTBcIj5cbiAgICAgICAgICBUaGUgc2VwcmF0b3IgdG8gYmUgdXNlZCB0byBzZXBhcmF0ZSB0aGUgdmFsdWVzIGluIHRoZSBnZW5lcmF0ZWQgZmlsZVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gRGVsaW1ldGVyIFR5cGUgKHNob3duIHdoZW4gZG9jdW1lbnRUeXBlIGlzICdjc3YnKSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wIGNxYS1taW4tdy1bY2FsYyg0NSUtNnB4KV1cIiAqbmdJZj1cImlzQ3N2U2VsZWN0ZWRcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtbWItMS41IGNxYS1ibG9ja1wiPlxuICAgICAgICAgIERlbGltZXRlciBUeXBlXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkb2N1bWVudC10eXBlLXNlbGVjdFwiPlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgIFtmb3JtXT1cImRvY3VtZW50Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldERlbGltZXRlckNvbmZpZygpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtbXQtMSBjcWEtbS0wXCI+XG4gICAgICAgICAgQ2hvb3NlIHRoZSBkZWxpbWV0ZXIgdHlwZSBmb3IgdGhlIENTViBmaWxlXG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGaWxlIEZvcm1hdCBIZWFkZXIgKHNob3duIHdoZW4gZG9jdW1lbnRUeXBlIGlzICd0eHQnKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtd3JhcCBjcWEtZmxleC1zaHJpbmstMCBjcWEtZ2FwLTE0XCIgKm5nSWY9XCJpc1R4dFNlbGVjdGVkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMCBjcWEtbWluLXctW2NhbGMoNDUlLTZweCldXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW1iLTEuNSBjcWEtYmxvY2tcIj5cbiAgICAgICAgICBGaWxlIEZvcm1hdCBIZWFkZXJcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZpbGUgRm9ybWF0IEhlYWRlclwiXG4gICAgICAgICAgW3ZhbHVlXT1cImRvY3VtZW50Rm9ybS5nZXQoJ2ZpbGVGb3JtYXRIZWFkZXInKT8udmFsdWVcIlxuICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImRvY3VtZW50Rm9ybS5nZXQoJ2ZpbGVGb3JtYXRIZWFkZXInKT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyMwQTBBMEFdIGNxYS1tdC0xIGNxYS1tLTBcIj5cbiAgICAgICAgICBIZWFkZXIgdGV4dCBmb3IgdGhlIGdlbmVyYXRlZCB0eHQgZmlsZVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVGVtcGxhdGUgU291cmNlIFNlY3Rpb246IGxhYmVsIGxlZnQsIHRhYnMgcmlnaHQgb24gc2FtZSByb3cgLS0+XG4gICAgPCEtLSA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1mbGV4LXNocmluay0wIGNxYS1nYXAtM1wiPlxuICAgICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtNFwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1tLTAgY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICBUZW1wbGF0ZSBTb3VyY2VcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wXCJcbiAgICAgICAgICBbc2VnbWVudHNdPVwiW1xuICAgICAgICAgICAgeyBsYWJlbDogJ1VzZSBFeGlzdGluZyBUZW1wbGF0ZScsIHZhbHVlOiAnZXhpc3RpbmcnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnVXBsb2FkIFRlbXBsYXRlJywgdmFsdWU6ICd1cGxvYWQnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnQ3JlYXRlIE5ldycsIHZhbHVlOiAnY3JlYXRlTmV3JyB9XG4gICAgICAgICAgXVwiXG4gICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkVGVtcGxhdGVTb3VyY2VcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblRlbXBsYXRlU291cmNlQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZG9jdW1lbnQtdHlwZS1zZWxlY3RcIiAqbmdJZj1cInNlbGVjdGVkVGVtcGxhdGVTb3VyY2UgPT09ICdleGlzdGluZydcIj5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImRvY3VtZW50Rm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJnZXRUZW1wbGF0ZVNlbGVjdENvbmZpZygpXCI+XG4gICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZFRlbXBsYXRlU291cmNlID09PSAndXBsb2FkJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW0tMFwiPlxuICAgICAgICAgIEF0dGFjaG1lbnQgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgI2ZpbGVJbnB1dFxuICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICBhY2NlcHQ9XCIucGRmLC5kb2MsLmRvY3gsLnR4dFwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtaGlkZGVuXCJcbiAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdGVkKCRldmVudClcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWluLWgtWzE0MHB4XSBjcWEtcm91bmRlZCBjcWEtYm9yZGVyLTIgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1ncmF5LTMwMCBjcWEtYmctd2hpdGUgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1nYXAtMyBjcWEtcC02IGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgIFtjbGFzcy5jcWEtcmluZy0yXT1cImlzRHJhZ092ZXJcIlxuICAgICAgICAgIFtjbGFzcy5jcWEtcmluZy1bIzNGNDNFRV1dPVwiaXNEcmFnT3ZlclwiXG4gICAgICAgICAgW2NsYXNzLmNxYS1yaW5nLWluc2V0XT1cImlzRHJhZ092ZXJcIlxuICAgICAgICAgIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiXG4gICAgICAgICAgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50KVwiXG4gICAgICAgICAgKGRyYWdsZWF2ZSk9XCJvbkRyYWdMZWF2ZSgkZXZlbnQpXCJcbiAgICAgICAgICAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50KVwiXG4gICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJmaWxlSW5wdXQuY2xpY2soKVwiXG4gICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiZmlsZUlucHV0LmNsaWNrKClcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJVcGxvYWQgdGVtcGxhdGUgZmlsZVwiPlxuICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtdy04IGNxYS1oLTggIGNxYS1mb250LWJvbGRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNFwiLz5cbiAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCIxNyA4IDEyIDMgNyA4XCIvPlxuICAgICAgICAgICAgPGxpbmUgeDE9XCIxMlwiIHkxPVwiM1wiIHgyPVwiMTJcIiB5Mj1cIjE1XCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtYmFzZSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW0tMCBjcWEtdGV4dC1jZW50ZXIgY3FhLWZvbnQtYm9sZFwiPlxuICAgICAgICAgICAgRHJhZyBhbmQgZHJvcCBmaWxlcyBoZXJlIG9yIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS1mb250LW1lZGl1bSBob3ZlcjpjcWEtdW5kZXJsaW5lXCI+YnJvd3NlPC9zcGFuPlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbS0wXCI+XG4gICAgICAgICAgICBQREYsIERPQywgb3IgVFhUIGZpbGVzXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLW0tMFwiPlxuICAgICAgICAgIENob29zZSB0aGUgZmlsZSBmb3JtYXQgeW91IHdhbnQgdG8gZ2VuZXJhdGUuXG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkVGVtcGxhdGVTb3VyY2UgPT09ICdjcmVhdGVOZXcnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC13cmFwIGNxYS1nYXAtM1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wIGNxYS1taW4tdy1bY2FsYyg1MCUtNnB4KV1cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW1iLTEuNSBjcWEtYmxvY2tcIj5cbiAgICAgICAgICAgICAgVGVtcGxhdGUgTmFtZSA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUERGIERvY3VtZW50ICgucGRmKVwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJkb2N1bWVudEZvcm0uZ2V0KCd0ZW1wbGF0ZU5hbWUnKT8udmFsdWVcIlxuICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZG9jdW1lbnRGb3JtLmdldCgndGVtcGxhdGVOYW1lJyk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMCBjcWEtbWluLXctW2NhbGMoNTAlLTZweCldXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1tYi0xLjUgY3FhLWJsb2NrXCI+XG4gICAgICAgICAgICAgIFRlbXBsYXRlIERlc2NyaXB0aW9uIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJQREYgRG9jdW1lbnQgKC5wZGYpXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImRvY3VtZW50Rm9ybS5nZXQoJ3RlbXBsYXRlRGVzY3JpcHRpb24nKT8udmFsdWVcIlxuICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZG9jdW1lbnRGb3JtLmdldCgndGVtcGxhdGVEZXNjcmlwdGlvbicpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWp1c3RpZnktZW5kXCI+XG4gICAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgICAgICAgYnRuU2l6ZT1cImxnXCJcbiAgICAgICAgICAgIHRleHQ9XCJDcmVhdGUgVGVtcGxhdGVcIlxuICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdIGNxYS1ib3JkZXItWyMzRjQzRUVdIGNxYS1iZy1bIzNGNDNFRV0nXCJcbiAgICAgICAgICAgIChjbGlja2VkKT1cIm9uQ3JlYXRlVGVtcGxhdGUoKVwiPlxuICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4gLS0+XG5cbiAgICA8IS0tIERvY3VtZW50IE1hcHBlciBTZWN0aW9uOiB0aXRsZSArIHN1YnRpdGxlIGxlZnQsIE5lZWQgaGVscD8gcmlnaHQgKENRQSB0YWJsZSBiZWxvdykgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC1zaHJpbmstMCBjcWEtZ2FwLTNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtc3RhcnQgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtbWluLXctMFwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LWJhc2UgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS10ZXh0LVsxNHB4XSBjcWEtbS0wIGNxYS1sZWFkaW5nLXRpZ2h0XCI+XG4gICAgICAgICAgICBEb2N1bWVudCBNYXBwZXJcbiAgICAgICAgICA8L2gzPlxuICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbS0wIGNxYS1tdC0wLjVcIj5cbiAgICAgICAgICAgIE1hcCBwbGFjZWhvbGRlcnMgdG8gZHluYW1pYyB2YWx1ZXMuXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtaW5saW5lLWZsZXggY3FhLWZsZXgtc2hyaW5rLTBcIlxuICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cInNob3dIZWxwVG9vbHRpcCA9IHRydWVcIlxuICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cInNob3dIZWxwVG9vbHRpcCA9IGZhbHNlXCI+XG4gICAgICAgICAgPGEgKm5nSWY9XCJtYXBwZXJIZWxwVXJsXCJcbiAgICAgICAgICAgICBocmVmPVwiI1wiXG4gICAgICAgICAgICAgKGNsaWNrKT1cIm9uTWFwcGVySGVscENsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjFweF0gY3FhLW5vLXVuZGVybGluZSBjcWEtY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNyAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXRleHQtWyMzRjQzRUVdXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjaGVscC1pY29uLWNsaXAtZG9jKVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC41MDAzMyAxNC42NjYzQzEyLjQxMjMgMTQuNjY2MyAxNS41ODM3IDExLjY4MTYgMTUuNTgzNyA3Ljk5OTY3QzE1LjU4MzcgNC4zMTc3OCAxMi40MTIzIDEuMzMzMDEgOC41MDAzMyAxLjMzMzAxQzQuNTg4MzEgMS4zMzMwMSAxLjQxNjk5IDQuMzE3NzggMS40MTY5OSA3Ljk5OTY3QzEuNDE2OTkgMTEuNjgxNiA0LjU4ODMxIDE0LjY2NjMgOC41MDAzMyAxNC42NjYzWlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuNDM4NDggNi4wMDAzOEM2LjYwNTAxIDUuNTU0ODMgNi45MzM3MSA1LjE3OTEyIDcuMzY2MzYgNC45Mzk4QzcuNzk5MDEgNC43MDA0OSA4LjMwNzY5IDQuNjEzMDEgOC44MDIzMSA0LjY5Mjg1QzkuMjk2OTMgNC43NzI3IDkuNzQ1NTYgNS4wMTQ3MyAxMC4wNjg3IDUuMzc2MDdDMTAuMzkxOSA1LjczNzQgMTAuNTY4OCA2LjE5NDczIDEwLjU2ODEgNi42NjcwNUMxMC41NjgxIDguMDAwMzggOC40NDMwNiA4LjY2NzA1IDguNDQzMDYgOC42NjcwNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNSAxMS4zMzNIOC41MDk2NlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJoZWxwLWljb24tY2xpcC1kb2NcIj5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiLz5cbiAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIE5lZWQgaGVscCA/XG4gICAgICAgICAgPC9hPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIW1hcHBlckhlbHBVcmxcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLWZvbnQtWzUwMF0gY3FhLXRleHQtWzEwcHhdIGNxYS1jdXJzb3ItZGVmYXVsdCBjcWEtdGV4dC1bIzM3NDE1MV1cIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNyAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXRleHQtWyMzRjQzRUVdXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjaGVscC1pY29uLWNsaXAtZG9jLW5vbGluaylcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNTAwMzMgMTQuNjY2M0MxMi40MTIzIDE0LjY2NjMgMTUuNTgzNyAxMS42ODE2IDE1LjU4MzcgNy45OTk2N0MxNS41ODM3IDQuMzE3NzggMTIuNDEyMyAxLjMzMzAxIDguNTAwMzMgMS4zMzMwMUM0LjU4ODMxIDEuMzMzMDEgMS40MTY5OSA0LjMxNzc4IDEuNDE2OTkgNy45OTk2N0MxLjQxNjk5IDExLjY4MTYgNC41ODgzMSAxNC42NjYzIDguNTAwMzMgMTQuNjY2M1pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjQzODQ4IDYuMDAwMzhDNi42MDUwMSA1LjU1NDgzIDYuOTMzNzEgNS4xNzkxMiA3LjM2NjM2IDQuOTM5OEM3Ljc5OTAxIDQuNzAwNDkgOC4zMDc2OSA0LjYxMzAxIDguODAyMzEgNC42OTI4NUM5LjI5NjkzIDQuNzcyNyA5Ljc0NTU2IDUuMDE0NzMgMTAuMDY4NyA1LjM3NjA3QzEwLjM5MTkgNS43Mzc0IDEwLjU2ODggNi4xOTQ3MyAxMC41NjgxIDYuNjY3MDVDMTAuNTY4MSA4LjAwMDM4IDguNDQzMDYgOC42NjcwNSA4LjQ0MzA2IDguNjY3MDVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjUgMTEuMzMzSDguNTA5NjZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiaGVscC1pY29uLWNsaXAtZG9jLW5vbGlua1wiPlxuICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIvPlxuICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XG4gICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgTmVlZCBoZWxwID9cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dIZWxwVG9vbHRpcFwiIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS16LVsxMDBdIGNxYS10b3AtWy0yNHB4XSBjcWEtbGVmdC1bLTIwM3B4XVwiIHJvbGU9XCJ0b29sdGlwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtd2hpdGUgY3FhLXRleHQtY2VudGVyIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtdy1bMzA2cHhdIGNxYS1taW4taC01IGNxYS1yb3VuZGVkLVs2cHhdIGNxYS1vcGFjaXR5LTEwMCBjcWEtcHgtMiBjcWEtcHktMSBjcWEtYmctWyMwQTBBMEFdIGNxYS1sZWFkaW5nLTUgY3FhLXRleHQtWzhweF1cIj5cbiAgICAgICAgICAgICAge3sgbWFwcGVySGVscFRvb2x0aXBUZXh0IH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gVGFibGUgb3IgZW1wdHkgc3RhdGU6IHNhbWUgY29udGFpbmVyLCBoZWFkZXIgYWx3YXlzIHZpc2libGUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJvdW5kZWQtbGcgY3FhLW92ZXJmbG93LWhpZGRlbiBjcWEtYmctd2hpdGUgY3FhLXNoYWRvdy1zbSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgICAgICA8dGFibGUgY2xhc3M9XCJjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgPHRyIGNsYXNzPVwiY3FhLWl0ZW1zLWNlbnRlciBjcWEtYmctWyNEOEQ5RkM0RF1cIj5cbiAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3FhLXB5LVsxMy4yNXB4XSBjcWEtcHgtWzEwLjVweF0gY3FhLXRleHQteHMgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LWxlZnQgY3FhLXctWzQwcHhdIGNxYS1ib3JkZXItYiBjcWEtYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBbY2hlY2tlZF09XCJhbGxNYXBwaW5nc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic29tZU1hcHBpbmdzU2VsZWN0ZWQgJiYgIWFsbE1hcHBpbmdzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU2VsZWN0QWxsTWFwcGluZ3MoJGV2ZW50LmNoZWNrZWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlNlbGVjdCBhbGwgbWFwcGluZ3NcIj5cbiAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3FhLXB5LVsxMy4yNXB4XSBjcWEtcHgtWzEwLjVweF0gY3FhLXRleHQteHMgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LWxlZnQgY3FhLWJvcmRlci1iIGNxYS1ib3JkZXItZ3JheS0yMDBcIj5LZXkgKGNvbHVtbiBuYW1lKTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNxYS1weS1bMTMuMjVweF0gY3FhLXB4LVsxMC41cHhdIGNxYS10ZXh0LXhzIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1sZWZ0IGNxYS1ib3JkZXItYiBjcWEtYm9yZGVyLWdyYXktMjAwIGNxYS13LVsxMjBweF1cIj5WYWx1ZSBUeXBlPC90aD5cbiAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3FhLXB5LVsxMy4yNXB4XSBjcWEtcHgtWzEwLjVweF0gY3FhLXRleHQteHMgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LWxlZnQgY3FhLWJvcmRlci1iIGNxYS1ib3JkZXItZ3JheS0yMDBcIj5WYWx1ZTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNxYS1weS1bMTMuMjVweF0gY3FhLXB4LVsxMC41cHhdIGNxYS10ZXh0LXhzIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1sZWZ0IGNxYS1ib3JkZXItYiBjcWEtYm9yZGVyLWdyYXktMjAwIGNxYS13LVs0OHB4XVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXNyLW9ubHlcIj5EZWxldGUgcm93PC9zcGFuPlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDwhLS0gRW1wdHkgc3RhdGUgd2hlbiBubyBtYXBwaW5ncyAtLT5cbiAgICAgICAgICAgIDx0ciAqbmdJZj1cIm1hcHBpbmdzRm9ybUFycmF5Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjVcIiBjbGFzcz1cImNxYS1wLTAgY3FhLWFsaWduLW1pZGRsZSBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXB5LTEyIGNxYS1weC00IGNxYS1iZy13aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW0tMCBjcWEtbWItNFwiPlN0YXJ0IG1hcHBpbmcgcGxhY2Vob2xkZXJzIHRvIHZhbHVlcy48L3A+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1yb3VuZGVkLWxnIGNxYS1weC00IGNxYS1weS0yLjUgY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtd2hpdGUgY3FhLWJnLVsjNEY0NkU1XSBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1vcGFjaXR5LTkwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHlcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTWFwcGluZygpXCI+XG4gICAgICAgICAgICAgICAgICAgIEFkZCBmaXJzdCBtYXBwaW5nXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8IS0tIERhdGEgcm93cyB3aGVuIHRoZXJlIGFyZSBtYXBwaW5ncyAtLT5cbiAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgbWFwcGluZyBvZiBtYXBwaW5nc0Zvcm1BcnJheS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctd2hpdGUgaG92ZXI6Y3FhLWJnLVsjRjlGQUZCXVwiPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjcWEtcHgtWzEwLjVweF0gY3FhLXB5LVsxMXB4XSBjcWEtYWxpZ24tdG9wIGNxYS1ib3JkZXItYiBjcWEtYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBbY2hlY2tlZF09XCJnZXRNYXBwaW5nRm9ybUdyb3VwKGkpLmdldCgnZW5hYmxlZCcpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiZ2V0TWFwcGluZ0Zvcm1Hcm91cChpKS5nZXQoJ2VuYWJsZWQnKT8uc2V0VmFsdWUoJGV2ZW50LmNoZWNrZWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkVuYWJsZSBtYXBwaW5nXCI+XG4gICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNxYS1weC1bMTAuNXB4XSBjcWEtcHktWzExcHhdIGNxYS1hbGlnbi10b3AgY3FhLWJvcmRlci1iIGNxYS1ib3JkZXItZ3JheS0yMDAgXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInS2V5J1wiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0TWFwcGluZ0Zvcm1Hcm91cChpKS5nZXQoJ2tleScpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImdldE1hcHBpbmdGb3JtR3JvdXAoaSkuZ2V0KCdrZXknKT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIyXCIgY2xhc3M9XCJjcWEtcHgtWzEwLjVweF0gY3FhLXB5LVsxMXB4XSBjcWEtYWxpZ24tdG9wIGNxYS1ib3JkZXItYiBjcWEtYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGVudHJ5IG9mIGdldFZhbHVlc0Zvcm1BcnJheShpKS5jb250cm9sczsgbGV0IGogPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvY3VtZW50LXR5cGUtc2VsZWN0IGNxYS13LVsxMjBweF0gY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJnZXRWYWx1ZUZvcm1Hcm91cChpLCBqKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImdldFZhbHVlVHlwZUNvbmZpZyhpLCBqKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidWYWx1ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldFZhbHVlRm9ybUdyb3VwKGksIGopLmdldCgndmFsdWUnKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJnZXRWYWx1ZUZvcm1Hcm91cChpLCBqKS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy03IGNxYS1oLTcgY3FhLXJvdW5kZWQgY3FhLXRleHQtWyM5Q0EzQUZdIGNxYS10cmFuc2l0aW9uLWNvbG9ycyBjcWEtYm9yZGVyLW5vbmUgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtdGV4dC1bIzM3NDE1MV0gZGlzYWJsZWQ6Y3FhLW9wYWNpdHktMzAgZGlzYWJsZWQ6Y3FhLWN1cnNvci1ub3QtYWxsb3dlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdldFZhbHVlc0Zvcm1BcnJheShpKS5sZW5ndGggPD0gMVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVZhbHVlRW50cnkoaSwgailcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1JlbW92ZSB2YWx1ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cImdldFZhbHVlc0Zvcm1BcnJheShpKS5sZW5ndGggPD0gMSA/ICdBIGtleSBuZWVkcyBhdCBsZWFzdCBvbmUgdmFsdWUnIDogJ1JlbW92ZSB0aGlzIHZhbHVlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsxOHB4XSBjcWEtdy1bMThweF0gY3FhLWgtWzE4cHhdIGNxYS1sZWFkaW5nLVsxOHB4XVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXNlbGYtc3RhcnQgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1wLTAgY3FhLW10LTFcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkVmFsdWVFbnRyeShpKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0FkZCB2YWx1ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWzE2cHhdIGNxYS13LTQgY3FhLWgtNCBjcWEtbGVhZGluZy00XCI+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgQWRkIHZhbHVlXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY3FhLXB4LVsxMC41cHhdIGNxYS1weS1bMTFweF0gY3FhLWFsaWduLXRvcCBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy05IGNxYS1oLTkgY3FhLXJvdW5kZWQgY3FhLXRleHQtWyNFNTczNzNdIGNxYS10cmFuc2l0aW9uLWNvbG9ycyBjcWEtYm9yZGVyLW5vbmUgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtb3BhY2l0eS04MFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlTWFwcGluZyhpKVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEZWxldGUga2V5IHJvdydcIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJEZWxldGUgdGhpcyBrZXkgYW5kIGFsbCBpdHMgdmFsdWVzXCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1mbGV4LXNocmluay0wXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyA2aDE4TTggNlY0YTIgMiAwIDAxMi0yaDRhMiAyIDAgMDEyIDJ2Mm0zIDB2MTRhMiAyIDAgMDEtMiAySDdhMiAyIDAgMDEtMi0yVjZoMTR6XCIvPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwIDExdjZNMTQgMTF2NlwiLz5cbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgIFxuICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWp1c3RpZnktZW5kXCIgKm5nSWY9XCJtYXBwaW5nc0Zvcm1BcnJheS5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtcC0zXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRNYXBwaW5nKClcIj5cbiAgICAgICAgICAgICsgQWRkIE1hcHBpbmdcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1qdXN0aWZ5LWVuZFwiICpuZ0lmPVwibWFwcGluZ3NGb3JtQXJyYXkubGVuZ3RoID4gMFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXAtMFwiXG4gICAgICAgICAgKGNsaWNrKT1cImFkZE1hcHBpbmcoKVwiPlxuICAgICAgICAgICsgQWRkIE1hcHBpbmdcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj4gLS0+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIERlc2NyaXB0aW9uIChhZnRlciBEb2N1bWVudCBNYXBwZXIpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC13cmFwIGNxYS1mbGV4LXNocmluay0wIGNxYS1nYXAtMTRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wIGNxYS1taW4tdy1bY2FsYyg0NSUtNnB4KV1cIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtbWItMS41IGNxYS1ibG9ja1wiPlxuICAgICAgICAgIERlc2NyaXB0aW9uXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJEZXNjcmlwdGlvblwiXG4gICAgICAgICAgW3ZhbHVlXT1cImRvY3VtZW50Rm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJyk/LnZhbHVlXCJcbiAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJkb2N1bWVudEZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLW10LTEgY3FhLW0tMFwiPlxuICAgICAgICAgIE9wdGlvbmFsIGRlc2NyaXB0aW9uIGZvciB0aGlzIGRvY3VtZW50IGdlbmVyYXRpb24gc3RlcFxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBBZHZhbmNlZCBTZXR0aW5ncyBWYXJpYWJsZXMgRm9ybSAtLT5cbiAgPGRpdiAqbmdJZj1cImFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMubGVuZ3RoID4gMFwiIGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXB4LTQgY3FhLXBiLTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS13LWZ1bGxcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLXctZnVsbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0yIGNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtcC0wIGNxYS1tYi0xLjVcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlQWR2YW5jZWQoKVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XVwiPkFkdmFuY2VkPC9zcGFuPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1iYXNlXCIgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cImFkdmFuY2VkRXhwYW5kZWRcIj5cbiAgICAgICAgICBleHBhbmRfbW9yZVxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZGl2ICpuZ0lmPVwiYWR2YW5jZWRFeHBhbmRlZFwiIGNsYXNzPVwiY3FhLW10LTJcIj5cbiAgICAgICAgPGNxYS1hZHZhbmNlZC12YXJpYWJsZXMtZm9ybSBcbiAgICAgICAgICBbYWR2YW5jZWRWYXJpYWJsZXNdPVwiYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlc1wiXG4gICAgICAgICAgW2FkdmFuY2VkVmFyaWFibGVGb3JtXT1cImFkdmFuY2VkVmFyaWFibGVzRm9ybVwiXG4gICAgICAgICAgKHZhcmlhYmxlQm9vbGVhbkNoYW5nZSk9XCJvbkFkdmFuY2VkVmFyaWFibGVCb29sZWFuQ2hhbmdlKCRldmVudC5uYW1lLCAkZXZlbnQudmFsdWUpXCI+XG4gICAgICAgIDwvY3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICBcblxuICA8IS0tIERpdmlkZXIgYWJvdmUgZm9vdGVyIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWgtcHggY3FhLXctZnVsbFwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj48L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1zdHJldGNoIGNxYS13LWZ1bGwgY3FhLXAtNCBjcWEtZ2FwLTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMFwiPlxuICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgICAgYnRuU2l6ZT1cImxnXCJcbiAgICAgICAgdGV4dD1cIkNhbmNlbFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSBjcWEtYm9yZGVyLVsjNDE0MTQ2XSdcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgIDxjcWEtYnV0dG9uICpuZ0lmPVwiIWlzQ3JlYXRpbmdTdGVwXCJcbiAgICAgICAgdmFyaWFudD1cImZpbGxlZFwiXG4gICAgICAgIGJ0blNpemU9XCJsZ1wiXG4gICAgICAgIFt0ZXh0XT1cImVkaXRNb2RlID8gJ1VwZGF0ZSBTdGVwJyA6ICdDcmVhdGUgU3RlcCdcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRm9ybVZhbGlkKClcIlxuICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0gY3FhLWJvcmRlci1bIzNGNDNFRV0nXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DcmVhdGVTdGVwKClcIj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgIDxkaXYgKm5nSWY9XCJpc0NyZWF0aW5nU3RlcFwiIGNsYXNzPVwiY3FhLW1pbi1oLVszOHB4XSBjcWEtcm91bmRlZC1bOHB4XVwiPlxuICAgICAgICA8Y3FhLWJhZGdlIGxhYmVsPVwiQ3JlYXRpbmfigKZcIiBpY29uPVwiYXV0b3JlbmV3XCIgW2lzTG9hZGluZ109XCJ0cnVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgW2NlbnRlckNvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgW2lubGluZVN0eWxlc109XCInbWluLWhlaWdodDogMzhweDsgaGVpZ2h0OiAzOHB4OyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsnXCJcbiAgICAgICAgICB2YXJpYW50PVwiaW5mb1wiIHNpemU9XCJtZWRpdW1cIj48L2NxYS1iYWRnZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|