@cqa-lib/cqa-ui 1.1.310 → 1.1.312

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +3 -3
  2. package/esm2020/lib/test-case-details/ai-agent-step/ai-agent-step.component.mjs +3 -3
  3. package/esm2020/lib/test-case-details/ai-verify-step/ai-verify-step.component.mjs +3 -3
  4. package/esm2020/lib/test-case-details/api-step/api-step.component.mjs +3 -3
  5. package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +3 -3
  6. package/esm2020/lib/test-case-details/custom-code-step/custom-code-step.component.mjs +3 -3
  7. package/esm2020/lib/test-case-details/database-step/database-step.component.mjs +3 -3
  8. package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +3 -3
  9. package/esm2020/lib/test-case-details/normal-step/normal-step.component.mjs +3 -3
  10. package/esm2020/lib/test-case-details/restore-session-step/restore-session-step.component.mjs +3 -3
  11. package/esm2020/lib/test-case-details/screenshot-step/screenshot-step.component.mjs +3 -3
  12. package/esm2020/lib/test-case-details/scroll-step/scroll-step.component.mjs +3 -3
  13. package/esm2020/lib/test-case-details/step-group/step-group.component.mjs +3 -3
  14. package/esm2020/lib/test-case-details/upload-step/upload-step.component.mjs +3 -3
  15. package/esm2020/lib/test-case-details/verify-url-step/verify-url-step.component.mjs +3 -3
  16. package/fesm2015/cqa-lib-cqa-ui.mjs +30 -30
  17. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  18. package/fesm2020/cqa-lib-cqa-ui.mjs +30 -30
  19. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  20. package/package.json +1 -1
@@ -1155,13 +1155,13 @@ TestCaseLoopStepComponent.DEFAULT_LOOP_OPTIONS_MAX = 10;
1155
1155
  TestCaseLoopStepComponent.LOOP_INDEX_START = -1;
1156
1156
  TestCaseLoopStepComponent.LOOP_INDEX_END = -1;
1157
1157
  TestCaseLoopStepComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseLoopStepComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1158
- TestCaseLoopStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseLoopStepComponent, selector: "cqa-test-case-loop-step", inputs: { config: "config", id: "id", loopType: "loopType", stepNumber: "stepNumber", index: "index", condition: "condition", maxIterations: "maxIterations", testDataProfile: "testDataProfile", startStep: "startStep", endStep: "endStep", nestedSteps: "nestedSteps", expanded: "expanded", isNested: "isNested", isInsideLoop: "isInsideLoop", isInsideStepGroup: "isInsideStepGroup", isReorder: "isReorder", selected: "selected", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", naturalTextActionsOptions: "naturalTextActionsOptions", setConditionTemplateVariables: "setConditionTemplateVariables", addStepBetweenAbove: "addStepBetweenAbove", addStepBetweenBelow: "addStepBetweenBelow", addStepBetween: "addStepBetween" }, outputs: { toggleExpanded: "toggleExpanded", testDataProfileChange: "testDataProfileChange", startStepChange: "startStepChange", endStepChange: "endStepChange", conditionChange: "conditionChange", maxIterationsChange: "maxIterationsChange", nestedStepChange: "nestedStepChange", addStep: "addStep", deleteStep: "deleteStep", duplicate: "duplicate", delete: "delete", moreOptions: "moreOptions", viewDetails: "viewDetails", editInDepth: "editInDepth", edit: "edit", dndDropInZone: "dndDropInZone", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles", stepUpdate: "stepUpdate", clickAction: "clickAction", addStepBetweenClick: "addStepBetweenClick", selectionChange: "selectionChange", deleteBranch: "deleteBranch" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "viewDetailsTrigger", first: true, predicate: ["viewDetailsTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"loop-step-row cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: stop propagation so dropdown/select interactions don't bubble and collapse the step or start drag -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3\" (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow\">\n <!-- Loop Type Label -->\n <div class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getLoopTypeLabel() }}\n </div>\n\n <!-- FOR LOOP inline edit: cqa-dynamic-select (same usage as default stories) -->\n <ng-container *ngIf=\"loopType === 'for'\">\n <!-- First select: width 216.25px, height 36px, gap 4px, opacity 1 -->\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"forOptionTypeSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"testDataProfileSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"startStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"endStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- WHILE LOOP inline edit: cqa-autocomplete + template variables (same as condition-step) -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"whileConditionAutocompleteOptions\"\n [value]=\"whileConditionDisplayValue\"\n (valueChange)=\"onEditFormFieldChange('condition', $event)\"\n (optionSelect)=\"onConditionSelect($event)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\">\n </cqa-autocomplete>\n <!-- Template variables hidden in while loop - use Edit In depth to configure -->\n </ng-container>\n\n <!-- Edit In depth link -->\n <a href=\"#\" *ngIf=\"isWhileLoop()\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\"\n fill=\"#3F43EE\" />\n </svg>\n </a>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <!-- Cancel / Apply -->\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\"\n (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\"\n (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Loop Header (normal view when not editing) -->\n <div *ngIf=\"!isEditing\"\n [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\">\n <div class=\"cqa-inline-flex cqa-items-center\">\n <!-- Drag Handle Icon (when isReorder is true and not inside step group - steps inside step groups cannot be reordered) -->\n <div *ngIf=\"isReorder && !isInsideStepGroup\" class=\"cqa-mr-2 cqa-cursor-move cqa-text-[#6B7280] hover:cqa-text-[#111827]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n <!-- Checkbox (when isReorder is false or inside step group - steps inside step groups cannot be reordered) -->\n <label *ngIf=\"!isReorder || isInsideStepGroup\" class=\"cqa-flex cqa-items-center cqa-cursor-pointer cqa-relative cqa-mr-2\">\n <input type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"onSelectionChange($event)\"\n class=\"cqa-h-4 cqa-w-4 cqa-cursor-pointer cqa-transition-all cqa-appearance-none cqa-rounded shadow hover:cqa-shadow-md cqa-border cqa-border-solid cqa-border-slate-300 cqa-flex-shrink-0\"\n [class.cqa-bg-[#3F43EE]]=\"selected\"\n [class.cqa-border-[#3F43EE]]=\"selected\"\n id=\"check-loop-step\" />\n <span class=\"cqa-absolute cqa-text-white cqa-top-1/2 cqa-left-1/2 cqa--translate-x-1/2 cqa--translate-y-1/2 cqa-pointer-events-none cqa-flex cqa-items-center cqa-justify-center\"\n [class.cqa-opacity-0]=\"!selected\"\n [class.cqa-opacity-100]=\"selected\">\n <svg width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 3.125L4.5 8.625L2 6.125\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </span>\n </label>\n </div>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px]\">{{ stepNumber }}</span>\n <!-- Expand/Collapse Icon -->\n <button type=\"button\" (click)=\"onToggleExpanded()\" class=\"cqa-p-0\">\n <svg [class.cqa-rotate-180]=\"!expanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 10L8 6L4 10\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Loop Icon -->\n <div *ngIf=\"loopType === 'for'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div *ngIf=\"loopType === 'while'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Loop Type Label -->\n <span class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-none\">\n {{ getLoopTypeLabel() }}\n </span>\n\n <!-- For Loop Display (same styling as condition step, HTML badges via innerHTML) -->\n <div *ngIf=\"loopType === 'for' && (hasTestDataProfile() || hasStartValue() || hasEndValue())\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1 cqa-flex-wrap\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getForLoopDisplay()\" (click)=\"onLoopActionClick($event)\"></span>\n <ng-container *ngIf=\"getLoopEventDetailsForDisplay().length > 0\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827]\">{{ item.value }}</span>\n </span>\n </ng-container>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) - same styling as condition step -->\n <div *ngIf=\"isWhileLoop() && condition\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1 cqa-flex-wrap\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getConditionDisplay()\" (click)=\"onLoopActionClick($event)\"></span>\n <span *ngIf=\"maxIterations != null && maxIterations > 0\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\" data-key=\"maxIterations\" data-event-key=\"maxIterations\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">max iterations:</span>\n <span class=\"cqa-text-[#111827]\">{{ maxIterations }}</span>\n </span>\n <ng-container *ngIf=\"getLoopEventDetailsForDisplay().length > 0\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827]\">{{ item.value }}</span>\n </span>\n </ng-container>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto\">\n <!-- Steps Summary -->\n <div\n class=\"cqa-ml-auto cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-lg cqa-py-0.5 cqa-px-2 cqa-text-[#0A0A0A] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getStepsSummary() }}\n </div>\n\n <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-2 cqa-no-underline cqa-ml-auto\">View Details<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg></a>\n\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover; hidden when inside step-group) -->\n <div *ngIf=\"!isInsideStepGroup && !isReorder\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px]\">\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M9.55208 2.1128C9.7843 1.88058 10.0993 1.75012 10.4277 1.75012C10.7561 1.75012 11.071 1.88058 11.3033 2.1128C11.5355 2.34502 11.6659 2.65998 11.6659 2.98838C11.6659 3.31679 11.5355 3.63175 11.3033 3.86397L4.29742 10.8704C4.15864 11.0092 3.9871 11.1107 3.79867 11.1656L2.12333 11.6544C2.07314 11.669 2.01993 11.6699 1.96928 11.6569C1.91863 11.6439 1.8724 11.6176 1.83543 11.5806C1.79846 11.5437 1.7721 11.4974 1.75913 11.4468C1.74615 11.3961 1.74703 11.3429 1.76167 11.2927L2.2505 9.61738C2.30546 9.42916 2.40698 9.25783 2.54567 9.11922L9.55208 2.1128Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <!-- <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button> -->\n <button type=\"button\" (click)=\"onDuplicate(); $event.stopPropagation()\" title=\"Duplicate\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\"\n class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M11.0827 3.5V11.6667C11.0827 12.25 10.4993 12.8333 9.91602 12.8333H4.08268C3.49935 12.8333 2.91602 12.25 2.91602 11.6667V3.5\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M4.66602 3.49996V2.33329C4.66602 1.74996 5.24935 1.16663 5.83268 1.16663H8.16602C8.74935 1.16663 9.33268 1.74996 9.33268 2.33329V3.49996\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n <!-- Created Date (from API) - last so aligned across all steps, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"step-date cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px] cqa-ml-auto cqa-flex-shrink-0\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n </div>\n </div>\n\n <!-- Expanded Content with Nested Steps (renderer dispatches by step type, n-level nesting) -->\n <div *ngIf=\"expanded\" class=\"cqa-flex cqa-flex-col\">\n <!-- START Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getStartLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n <div *ngIf=\"!isReorder\" class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer *ngFor=\"let step of nestedSteps; let i = index\" [step]=\"step\" [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedDuplicate($event, step)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n <div *ngIf=\"isReorder\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [style.min-height.px]=\"nestedSteps.length === 0 ? 52 : null\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"step-drag-placeholder-nested cqa-my-1 cqa-min-h-[50px] cqa-border-2 cqa-border-dashed cqa-border-[#3F43EE] cqa-rounded cqa-bg-[rgba(63,67,238,0.08)] cqa-flex cqa-items-center cqa-justify-center cqa-text-[#3F43EE] cqa-text-xs\">Drop here</div>\n <div *ngFor=\"let step of nestedSteps; let i = index\" class=\"nested-step-drag-item\"\n [dndDraggable]=\"step\"\n dndEffectAllowed=\"move\"\n dndType=\"step\">\n <cqa-test-case-details-renderer [step]=\"step\" [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- Empty loop: show plus icon on hover when expanded and no steps.\n When rendered inside a step group or when reordering, hide this Add button entirely. -->\n <div *ngIf=\"nestedSteps.length === 0 && !isInsideStepGroup && !isReorder\" class=\"loop-step-empty cqa-min-h-[52px] cqa-flex cqa-items-center cqa-justify-center cqa-pl-4 cqa-pr-4\">\n <button type=\"button\" (click)=\"onAddStepEmpty(); $event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\" title=\"Add step\"\n class=\"loop-step-empty-add\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" fill=\"white\" />\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" stroke=\"#3F43EE\" stroke-width=\"2\" />\n <path d=\"M8.5 12H15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 8.5V15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <!-- END Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getEndLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n</div>", styles: [".step-actions{opacity:0;transition:opacity .15s ease}.step-row:hover .step-actions{opacity:1}\n", ".loop-step-empty{opacity:1}.loop-step-empty-add{padding:0;background:transparent;border:0;cursor:pointer;color:#3f43ee;transition:opacity .15s ease}.loop-step-empty-add:hover{opacity:.9}\n"], components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.AutocompleteComponent, selector: "cqa-autocomplete", inputs: ["placeholder", "options", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth", "compact"], outputs: ["valueChange", "optionSelect", "cleared"] }, { type: i4.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i5.TestCaseDetailsRendererComponent, selector: "cqa-test-case-details-renderer", inputs: ["step", "index", "isNested", "isInsideLoop", "isInsideStepGroup", "branch", "isReorder", "selected", "addStepBetweenAbove", "addStepBetweenBelow", "addStepBetween", "dataProfileOptions", "hasMoreDataProfiles", "isLoadingDataProfiles", "naturalTextActionsOptions", "setConditionTemplateVariables"], outputs: ["nestedStepChange", "addStep", "deleteStep", "toggleExpanded", "groupNameChange", "descriptionChange", "reusableChange", "openExternal", "edit", "link", "duplicate", "delete", "viewDetails", "selectionChange", "conditionChange", "branchStepChange", "addStepForBranch", "addStepForLoop", "deleteStepWithBranch", "addBranch", "addElse", "deleteBranch", "testDataProfileChange", "startStepChange", "endStepChange", "maxIterationsChange", "eventTypeChange", "parameterChange", "clickAction", "dndDropInZone", "loadMoreDataProfiles", "searchDataProfiles", "stepUpdate", "addStepBetweenClick", "editInDepth"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i7.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i7.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }], pipes: { "date": i6.DatePipe } });
1158
+ TestCaseLoopStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseLoopStepComponent, selector: "cqa-test-case-loop-step", inputs: { config: "config", id: "id", loopType: "loopType", stepNumber: "stepNumber", index: "index", condition: "condition", maxIterations: "maxIterations", testDataProfile: "testDataProfile", startStep: "startStep", endStep: "endStep", nestedSteps: "nestedSteps", expanded: "expanded", isNested: "isNested", isInsideLoop: "isInsideLoop", isInsideStepGroup: "isInsideStepGroup", isReorder: "isReorder", selected: "selected", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", naturalTextActionsOptions: "naturalTextActionsOptions", setConditionTemplateVariables: "setConditionTemplateVariables", addStepBetweenAbove: "addStepBetweenAbove", addStepBetweenBelow: "addStepBetweenBelow", addStepBetween: "addStepBetween" }, outputs: { toggleExpanded: "toggleExpanded", testDataProfileChange: "testDataProfileChange", startStepChange: "startStepChange", endStepChange: "endStepChange", conditionChange: "conditionChange", maxIterationsChange: "maxIterationsChange", nestedStepChange: "nestedStepChange", addStep: "addStep", deleteStep: "deleteStep", duplicate: "duplicate", delete: "delete", moreOptions: "moreOptions", viewDetails: "viewDetails", editInDepth: "editInDepth", edit: "edit", dndDropInZone: "dndDropInZone", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles", stepUpdate: "stepUpdate", clickAction: "clickAction", addStepBetweenClick: "addStepBetweenClick", selectionChange: "selectionChange", deleteBranch: "deleteBranch" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "viewDetailsTrigger", first: true, predicate: ["viewDetailsTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"loop-step-row cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: stop propagation so dropdown/select interactions don't bubble and collapse the step or start drag -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3\" (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow\">\n <!-- Loop Type Label -->\n <div class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getLoopTypeLabel() }}\n </div>\n\n <!-- FOR LOOP inline edit: cqa-dynamic-select (same usage as default stories) -->\n <ng-container *ngIf=\"loopType === 'for'\">\n <!-- First select: width 216.25px, height 36px, gap 4px, opacity 1 -->\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"forOptionTypeSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"testDataProfileSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"startStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"endStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- WHILE LOOP inline edit: cqa-autocomplete + template variables (same as condition-step) -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"whileConditionAutocompleteOptions\"\n [value]=\"whileConditionDisplayValue\"\n (valueChange)=\"onEditFormFieldChange('condition', $event)\"\n (optionSelect)=\"onConditionSelect($event)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\">\n </cqa-autocomplete>\n <!-- Template variables hidden in while loop - use Edit In depth to configure -->\n </ng-container>\n\n <!-- Edit In depth link -->\n <a href=\"#\" *ngIf=\"isWhileLoop()\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\"\n fill=\"#3F43EE\" />\n </svg>\n </a>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <!-- Cancel / Apply -->\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\"\n (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\"\n (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Loop Header (normal view when not editing) -->\n <div *ngIf=\"!isEditing\"\n [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\">\n <div class=\"cqa-inline-flex cqa-items-center\">\n <!-- Drag Handle Icon (when isReorder is true and not inside step group - steps inside step groups cannot be reordered) -->\n <div *ngIf=\"isReorder && !isInsideStepGroup\" class=\"cqa-mr-2 cqa-cursor-move cqa-text-[#6B7280] hover:cqa-text-[#111827]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n <!-- Checkbox (when isReorder is false and not inside step group - hide for steps inside step groups) -->\n <label *ngIf=\"!isReorder && !isInsideStepGroup\" class=\"cqa-flex cqa-items-center cqa-cursor-pointer cqa-relative cqa-mr-2\">\n <input type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"onSelectionChange($event)\"\n class=\"cqa-h-4 cqa-w-4 cqa-cursor-pointer cqa-transition-all cqa-appearance-none cqa-rounded shadow hover:cqa-shadow-md cqa-border cqa-border-solid cqa-border-slate-300 cqa-flex-shrink-0\"\n [class.cqa-bg-[#3F43EE]]=\"selected\"\n [class.cqa-border-[#3F43EE]]=\"selected\"\n id=\"check-loop-step\" />\n <span class=\"cqa-absolute cqa-text-white cqa-top-1/2 cqa-left-1/2 cqa--translate-x-1/2 cqa--translate-y-1/2 cqa-pointer-events-none cqa-flex cqa-items-center cqa-justify-center\"\n [class.cqa-opacity-0]=\"!selected\"\n [class.cqa-opacity-100]=\"selected\">\n <svg width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 3.125L4.5 8.625L2 6.125\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </span>\n </label>\n </div>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px]\">{{ stepNumber }}</span>\n <!-- Expand/Collapse Icon -->\n <button type=\"button\" (click)=\"onToggleExpanded()\" class=\"cqa-p-0\">\n <svg [class.cqa-rotate-180]=\"!expanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 10L8 6L4 10\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Loop Icon -->\n <div *ngIf=\"loopType === 'for'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div *ngIf=\"loopType === 'while'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Loop Type Label -->\n <span class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-none\">\n {{ getLoopTypeLabel() }}\n </span>\n\n <!-- For Loop Display (same styling as condition step, HTML badges via innerHTML) -->\n <div *ngIf=\"loopType === 'for' && (hasTestDataProfile() || hasStartValue() || hasEndValue())\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1 cqa-flex-wrap\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getForLoopDisplay()\" (click)=\"onLoopActionClick($event)\"></span>\n <ng-container *ngIf=\"getLoopEventDetailsForDisplay().length > 0\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827]\">{{ item.value }}</span>\n </span>\n </ng-container>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) - same styling as condition step -->\n <div *ngIf=\"isWhileLoop() && condition\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1 cqa-flex-wrap\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getConditionDisplay()\" (click)=\"onLoopActionClick($event)\"></span>\n <span *ngIf=\"maxIterations != null && maxIterations > 0\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\" data-key=\"maxIterations\" data-event-key=\"maxIterations\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">max iterations:</span>\n <span class=\"cqa-text-[#111827]\">{{ maxIterations }}</span>\n </span>\n <ng-container *ngIf=\"getLoopEventDetailsForDisplay().length > 0\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827]\">{{ item.value }}</span>\n </span>\n </ng-container>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto\">\n <!-- Steps Summary -->\n <div\n class=\"cqa-ml-auto cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-lg cqa-py-0.5 cqa-px-2 cqa-text-[#0A0A0A] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getStepsSummary() }}\n </div>\n\n <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-2 cqa-no-underline cqa-ml-auto\">View Details<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg></a>\n\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover; hidden when inside step-group) -->\n <div *ngIf=\"!isInsideStepGroup && !isReorder\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px]\">\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M9.55208 2.1128C9.7843 1.88058 10.0993 1.75012 10.4277 1.75012C10.7561 1.75012 11.071 1.88058 11.3033 2.1128C11.5355 2.34502 11.6659 2.65998 11.6659 2.98838C11.6659 3.31679 11.5355 3.63175 11.3033 3.86397L4.29742 10.8704C4.15864 11.0092 3.9871 11.1107 3.79867 11.1656L2.12333 11.6544C2.07314 11.669 2.01993 11.6699 1.96928 11.6569C1.91863 11.6439 1.8724 11.6176 1.83543 11.5806C1.79846 11.5437 1.7721 11.4974 1.75913 11.4468C1.74615 11.3961 1.74703 11.3429 1.76167 11.2927L2.2505 9.61738C2.30546 9.42916 2.40698 9.25783 2.54567 9.11922L9.55208 2.1128Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <!-- <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button> -->\n <button type=\"button\" (click)=\"onDuplicate(); $event.stopPropagation()\" title=\"Duplicate\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\"\n class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M11.0827 3.5V11.6667C11.0827 12.25 10.4993 12.8333 9.91602 12.8333H4.08268C3.49935 12.8333 2.91602 12.25 2.91602 11.6667V3.5\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M4.66602 3.49996V2.33329C4.66602 1.74996 5.24935 1.16663 5.83268 1.16663H8.16602C8.74935 1.16663 9.33268 1.74996 9.33268 2.33329V3.49996\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n <!-- Created Date (from API) - last so aligned across all steps, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"step-date cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px] cqa-ml-auto cqa-flex-shrink-0\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n </div>\n </div>\n\n <!-- Expanded Content with Nested Steps (renderer dispatches by step type, n-level nesting) -->\n <div *ngIf=\"expanded\" class=\"cqa-flex cqa-flex-col\">\n <!-- START Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getStartLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n <div *ngIf=\"!isReorder\" class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer *ngFor=\"let step of nestedSteps; let i = index\" [step]=\"step\" [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedDuplicate($event, step)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n <div *ngIf=\"isReorder\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [style.min-height.px]=\"nestedSteps.length === 0 ? 52 : null\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"step-drag-placeholder-nested cqa-my-1 cqa-min-h-[50px] cqa-border-2 cqa-border-dashed cqa-border-[#3F43EE] cqa-rounded cqa-bg-[rgba(63,67,238,0.08)] cqa-flex cqa-items-center cqa-justify-center cqa-text-[#3F43EE] cqa-text-xs\">Drop here</div>\n <div *ngFor=\"let step of nestedSteps; let i = index\" class=\"nested-step-drag-item\"\n [dndDraggable]=\"step\"\n dndEffectAllowed=\"move\"\n dndType=\"step\">\n <cqa-test-case-details-renderer [step]=\"step\" [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- Empty loop: show plus icon on hover when expanded and no steps.\n When rendered inside a step group or when reordering, hide this Add button entirely. -->\n <div *ngIf=\"nestedSteps.length === 0 && !isInsideStepGroup && !isReorder\" class=\"loop-step-empty cqa-min-h-[52px] cqa-flex cqa-items-center cqa-justify-center cqa-pl-4 cqa-pr-4\">\n <button type=\"button\" (click)=\"onAddStepEmpty(); $event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\" title=\"Add step\"\n class=\"loop-step-empty-add\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" fill=\"white\" />\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" stroke=\"#3F43EE\" stroke-width=\"2\" />\n <path d=\"M8.5 12H15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 8.5V15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <!-- END Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getEndLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n</div>", styles: [".step-actions{opacity:0;transition:opacity .15s ease}.step-row:hover .step-actions{opacity:1}\n", ".loop-step-empty{opacity:1}.loop-step-empty-add{padding:0;background:transparent;border:0;cursor:pointer;color:#3f43ee;transition:opacity .15s ease}.loop-step-empty-add:hover{opacity:.9}\n"], components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.AutocompleteComponent, selector: "cqa-autocomplete", inputs: ["placeholder", "options", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth", "compact"], outputs: ["valueChange", "optionSelect", "cleared"] }, { type: i4.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i5.TestCaseDetailsRendererComponent, selector: "cqa-test-case-details-renderer", inputs: ["step", "index", "isNested", "isInsideLoop", "isInsideStepGroup", "branch", "isReorder", "selected", "addStepBetweenAbove", "addStepBetweenBelow", "addStepBetween", "dataProfileOptions", "hasMoreDataProfiles", "isLoadingDataProfiles", "naturalTextActionsOptions", "setConditionTemplateVariables"], outputs: ["nestedStepChange", "addStep", "deleteStep", "toggleExpanded", "groupNameChange", "descriptionChange", "reusableChange", "openExternal", "edit", "link", "duplicate", "delete", "viewDetails", "selectionChange", "conditionChange", "branchStepChange", "addStepForBranch", "addStepForLoop", "deleteStepWithBranch", "addBranch", "addElse", "deleteBranch", "testDataProfileChange", "startStepChange", "endStepChange", "maxIterationsChange", "eventTypeChange", "parameterChange", "clickAction", "dndDropInZone", "loadMoreDataProfiles", "searchDataProfiles", "stepUpdate", "addStepBetweenClick", "editInDepth"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i7.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i7.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }], pipes: { "date": i6.DatePipe } });
1159
1159
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseLoopStepComponent, decorators: [{
1160
1160
  type: Component,
1161
1161
  args: [{ selector: 'cqa-test-case-loop-step', host: { class: 'cqa-ui-root' }, styles: [
1162
1162
  STEP_ROW_ACTIONS_STYLES,
1163
1163
  LOOP_STEP_EMPTY_STYLES,
1164
- ], template: "<div class=\"loop-step-row cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: stop propagation so dropdown/select interactions don't bubble and collapse the step or start drag -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3\" (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow\">\n <!-- Loop Type Label -->\n <div class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getLoopTypeLabel() }}\n </div>\n\n <!-- FOR LOOP inline edit: cqa-dynamic-select (same usage as default stories) -->\n <ng-container *ngIf=\"loopType === 'for'\">\n <!-- First select: width 216.25px, height 36px, gap 4px, opacity 1 -->\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"forOptionTypeSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"testDataProfileSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"startStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"endStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- WHILE LOOP inline edit: cqa-autocomplete + template variables (same as condition-step) -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"whileConditionAutocompleteOptions\"\n [value]=\"whileConditionDisplayValue\"\n (valueChange)=\"onEditFormFieldChange('condition', $event)\"\n (optionSelect)=\"onConditionSelect($event)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\">\n </cqa-autocomplete>\n <!-- Template variables hidden in while loop - use Edit In depth to configure -->\n </ng-container>\n\n <!-- Edit In depth link -->\n <a href=\"#\" *ngIf=\"isWhileLoop()\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\"\n fill=\"#3F43EE\" />\n </svg>\n </a>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <!-- Cancel / Apply -->\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\"\n (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\"\n (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Loop Header (normal view when not editing) -->\n <div *ngIf=\"!isEditing\"\n [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\">\n <div class=\"cqa-inline-flex cqa-items-center\">\n <!-- Drag Handle Icon (when isReorder is true and not inside step group - steps inside step groups cannot be reordered) -->\n <div *ngIf=\"isReorder && !isInsideStepGroup\" class=\"cqa-mr-2 cqa-cursor-move cqa-text-[#6B7280] hover:cqa-text-[#111827]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n <!-- Checkbox (when isReorder is false or inside step group - steps inside step groups cannot be reordered) -->\n <label *ngIf=\"!isReorder || isInsideStepGroup\" class=\"cqa-flex cqa-items-center cqa-cursor-pointer cqa-relative cqa-mr-2\">\n <input type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"onSelectionChange($event)\"\n class=\"cqa-h-4 cqa-w-4 cqa-cursor-pointer cqa-transition-all cqa-appearance-none cqa-rounded shadow hover:cqa-shadow-md cqa-border cqa-border-solid cqa-border-slate-300 cqa-flex-shrink-0\"\n [class.cqa-bg-[#3F43EE]]=\"selected\"\n [class.cqa-border-[#3F43EE]]=\"selected\"\n id=\"check-loop-step\" />\n <span class=\"cqa-absolute cqa-text-white cqa-top-1/2 cqa-left-1/2 cqa--translate-x-1/2 cqa--translate-y-1/2 cqa-pointer-events-none cqa-flex cqa-items-center cqa-justify-center\"\n [class.cqa-opacity-0]=\"!selected\"\n [class.cqa-opacity-100]=\"selected\">\n <svg width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 3.125L4.5 8.625L2 6.125\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </span>\n </label>\n </div>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px]\">{{ stepNumber }}</span>\n <!-- Expand/Collapse Icon -->\n <button type=\"button\" (click)=\"onToggleExpanded()\" class=\"cqa-p-0\">\n <svg [class.cqa-rotate-180]=\"!expanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 10L8 6L4 10\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Loop Icon -->\n <div *ngIf=\"loopType === 'for'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div *ngIf=\"loopType === 'while'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Loop Type Label -->\n <span class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-none\">\n {{ getLoopTypeLabel() }}\n </span>\n\n <!-- For Loop Display (same styling as condition step, HTML badges via innerHTML) -->\n <div *ngIf=\"loopType === 'for' && (hasTestDataProfile() || hasStartValue() || hasEndValue())\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1 cqa-flex-wrap\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getForLoopDisplay()\" (click)=\"onLoopActionClick($event)\"></span>\n <ng-container *ngIf=\"getLoopEventDetailsForDisplay().length > 0\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827]\">{{ item.value }}</span>\n </span>\n </ng-container>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) - same styling as condition step -->\n <div *ngIf=\"isWhileLoop() && condition\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1 cqa-flex-wrap\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getConditionDisplay()\" (click)=\"onLoopActionClick($event)\"></span>\n <span *ngIf=\"maxIterations != null && maxIterations > 0\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\" data-key=\"maxIterations\" data-event-key=\"maxIterations\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">max iterations:</span>\n <span class=\"cqa-text-[#111827]\">{{ maxIterations }}</span>\n </span>\n <ng-container *ngIf=\"getLoopEventDetailsForDisplay().length > 0\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827]\">{{ item.value }}</span>\n </span>\n </ng-container>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto\">\n <!-- Steps Summary -->\n <div\n class=\"cqa-ml-auto cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-lg cqa-py-0.5 cqa-px-2 cqa-text-[#0A0A0A] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getStepsSummary() }}\n </div>\n\n <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-2 cqa-no-underline cqa-ml-auto\">View Details<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg></a>\n\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover; hidden when inside step-group) -->\n <div *ngIf=\"!isInsideStepGroup && !isReorder\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px]\">\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M9.55208 2.1128C9.7843 1.88058 10.0993 1.75012 10.4277 1.75012C10.7561 1.75012 11.071 1.88058 11.3033 2.1128C11.5355 2.34502 11.6659 2.65998 11.6659 2.98838C11.6659 3.31679 11.5355 3.63175 11.3033 3.86397L4.29742 10.8704C4.15864 11.0092 3.9871 11.1107 3.79867 11.1656L2.12333 11.6544C2.07314 11.669 2.01993 11.6699 1.96928 11.6569C1.91863 11.6439 1.8724 11.6176 1.83543 11.5806C1.79846 11.5437 1.7721 11.4974 1.75913 11.4468C1.74615 11.3961 1.74703 11.3429 1.76167 11.2927L2.2505 9.61738C2.30546 9.42916 2.40698 9.25783 2.54567 9.11922L9.55208 2.1128Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <!-- <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button> -->\n <button type=\"button\" (click)=\"onDuplicate(); $event.stopPropagation()\" title=\"Duplicate\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\"\n class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M11.0827 3.5V11.6667C11.0827 12.25 10.4993 12.8333 9.91602 12.8333H4.08268C3.49935 12.8333 2.91602 12.25 2.91602 11.6667V3.5\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M4.66602 3.49996V2.33329C4.66602 1.74996 5.24935 1.16663 5.83268 1.16663H8.16602C8.74935 1.16663 9.33268 1.74996 9.33268 2.33329V3.49996\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n <!-- Created Date (from API) - last so aligned across all steps, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"step-date cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px] cqa-ml-auto cqa-flex-shrink-0\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n </div>\n </div>\n\n <!-- Expanded Content with Nested Steps (renderer dispatches by step type, n-level nesting) -->\n <div *ngIf=\"expanded\" class=\"cqa-flex cqa-flex-col\">\n <!-- START Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getStartLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n <div *ngIf=\"!isReorder\" class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer *ngFor=\"let step of nestedSteps; let i = index\" [step]=\"step\" [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedDuplicate($event, step)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n <div *ngIf=\"isReorder\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [style.min-height.px]=\"nestedSteps.length === 0 ? 52 : null\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"step-drag-placeholder-nested cqa-my-1 cqa-min-h-[50px] cqa-border-2 cqa-border-dashed cqa-border-[#3F43EE] cqa-rounded cqa-bg-[rgba(63,67,238,0.08)] cqa-flex cqa-items-center cqa-justify-center cqa-text-[#3F43EE] cqa-text-xs\">Drop here</div>\n <div *ngFor=\"let step of nestedSteps; let i = index\" class=\"nested-step-drag-item\"\n [dndDraggable]=\"step\"\n dndEffectAllowed=\"move\"\n dndType=\"step\">\n <cqa-test-case-details-renderer [step]=\"step\" [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- Empty loop: show plus icon on hover when expanded and no steps.\n When rendered inside a step group or when reordering, hide this Add button entirely. -->\n <div *ngIf=\"nestedSteps.length === 0 && !isInsideStepGroup && !isReorder\" class=\"loop-step-empty cqa-min-h-[52px] cqa-flex cqa-items-center cqa-justify-center cqa-pl-4 cqa-pr-4\">\n <button type=\"button\" (click)=\"onAddStepEmpty(); $event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\" title=\"Add step\"\n class=\"loop-step-empty-add\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" fill=\"white\" />\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" stroke=\"#3F43EE\" stroke-width=\"2\" />\n <path d=\"M8.5 12H15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 8.5V15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <!-- END Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getEndLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n</div>" }]
1164
+ ], template: "<div class=\"loop-step-row cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: stop propagation so dropdown/select interactions don't bubble and collapse the step or start drag -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3\" (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow\">\n <!-- Loop Type Label -->\n <div class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getLoopTypeLabel() }}\n </div>\n\n <!-- FOR LOOP inline edit: cqa-dynamic-select (same usage as default stories) -->\n <ng-container *ngIf=\"loopType === 'for'\">\n <!-- First select: width 216.25px, height 36px, gap 4px, opacity 1 -->\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"forOptionTypeSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"testDataProfileSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"startStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"endStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- WHILE LOOP inline edit: cqa-autocomplete + template variables (same as condition-step) -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"whileConditionAutocompleteOptions\"\n [value]=\"whileConditionDisplayValue\"\n (valueChange)=\"onEditFormFieldChange('condition', $event)\"\n (optionSelect)=\"onConditionSelect($event)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\">\n </cqa-autocomplete>\n <!-- Template variables hidden in while loop - use Edit In depth to configure -->\n </ng-container>\n\n <!-- Edit In depth link -->\n <a href=\"#\" *ngIf=\"isWhileLoop()\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\"\n fill=\"#3F43EE\" />\n </svg>\n </a>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <!-- Cancel / Apply -->\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\"\n (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\"\n (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n </div>\n\n <!-- Loop Header (normal view when not editing) -->\n <div *ngIf=\"!isEditing\"\n [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 ' + (isInsideLoop && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\">\n <div class=\"cqa-inline-flex cqa-items-center\">\n <!-- Drag Handle Icon (when isReorder is true and not inside step group - steps inside step groups cannot be reordered) -->\n <div *ngIf=\"isReorder && !isInsideStepGroup\" class=\"cqa-mr-2 cqa-cursor-move cqa-text-[#6B7280] hover:cqa-text-[#111827]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n <!-- Checkbox (when isReorder is false and not inside step group - hide for steps inside step groups) -->\n <label *ngIf=\"!isReorder && !isInsideStepGroup\" class=\"cqa-flex cqa-items-center cqa-cursor-pointer cqa-relative cqa-mr-2\">\n <input type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"onSelectionChange($event)\"\n class=\"cqa-h-4 cqa-w-4 cqa-cursor-pointer cqa-transition-all cqa-appearance-none cqa-rounded shadow hover:cqa-shadow-md cqa-border cqa-border-solid cqa-border-slate-300 cqa-flex-shrink-0\"\n [class.cqa-bg-[#3F43EE]]=\"selected\"\n [class.cqa-border-[#3F43EE]]=\"selected\"\n id=\"check-loop-step\" />\n <span class=\"cqa-absolute cqa-text-white cqa-top-1/2 cqa-left-1/2 cqa--translate-x-1/2 cqa--translate-y-1/2 cqa-pointer-events-none cqa-flex cqa-items-center cqa-justify-center\"\n [class.cqa-opacity-0]=\"!selected\"\n [class.cqa-opacity-100]=\"selected\">\n <svg width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 3.125L4.5 8.625L2 6.125\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </span>\n </label>\n </div>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px]\">{{ stepNumber }}</span>\n <!-- Expand/Collapse Icon -->\n <button type=\"button\" (click)=\"onToggleExpanded()\" class=\"cqa-p-0\">\n <svg [class.cqa-rotate-180]=\"!expanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 10L8 6L4 10\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Loop Icon -->\n <div *ngIf=\"loopType === 'for'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div *ngIf=\"loopType === 'while'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Loop Type Label -->\n <span class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-none\">\n {{ getLoopTypeLabel() }}\n </span>\n\n <!-- For Loop Display (same styling as condition step, HTML badges via innerHTML) -->\n <div *ngIf=\"loopType === 'for' && (hasTestDataProfile() || hasStartValue() || hasEndValue())\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1 cqa-flex-wrap\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getForLoopDisplay()\" (click)=\"onLoopActionClick($event)\"></span>\n <ng-container *ngIf=\"getLoopEventDetailsForDisplay().length > 0\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827]\">{{ item.value }}</span>\n </span>\n </ng-container>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) - same styling as condition step -->\n <div *ngIf=\"isWhileLoop() && condition\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1 cqa-flex-wrap\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getConditionDisplay()\" (click)=\"onLoopActionClick($event)\"></span>\n <span *ngIf=\"maxIterations != null && maxIterations > 0\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\" data-key=\"maxIterations\" data-event-key=\"maxIterations\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">max iterations:</span>\n <span class=\"cqa-text-[#111827]\">{{ maxIterations }}</span>\n </span>\n <ng-container *ngIf=\"getLoopEventDetailsForDisplay().length > 0\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827]\">{{ item.value }}</span>\n </span>\n </ng-container>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto\">\n <!-- Steps Summary -->\n <div\n class=\"cqa-ml-auto cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-lg cqa-py-0.5 cqa-px-2 cqa-text-[#0A0A0A] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getStepsSummary() }}\n </div>\n\n <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-2 cqa-no-underline cqa-ml-auto\">View Details<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg></a>\n\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover; hidden when inside step-group) -->\n <div *ngIf=\"!isInsideStepGroup && !isReorder\" class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px]\">\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M9.55208 2.1128C9.7843 1.88058 10.0993 1.75012 10.4277 1.75012C10.7561 1.75012 11.071 1.88058 11.3033 2.1128C11.5355 2.34502 11.6659 2.65998 11.6659 2.98838C11.6659 3.31679 11.5355 3.63175 11.3033 3.86397L4.29742 10.8704C4.15864 11.0092 3.9871 11.1107 3.79867 11.1656L2.12333 11.6544C2.07314 11.669 2.01993 11.6699 1.96928 11.6569C1.91863 11.6439 1.8724 11.6176 1.83543 11.5806C1.79846 11.5437 1.7721 11.4974 1.75913 11.4468C1.74615 11.3961 1.74703 11.3429 1.76167 11.2927L2.2505 9.61738C2.30546 9.42916 2.40698 9.25783 2.54567 9.11922L9.55208 2.1128Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <!-- <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button> -->\n <button type=\"button\" (click)=\"onDuplicate(); $event.stopPropagation()\" title=\"Duplicate\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\"\n class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M11.0827 3.5V11.6667C11.0827 12.25 10.4993 12.8333 9.91602 12.8333H4.08268C3.49935 12.8333 2.91602 12.25 2.91602 11.6667V3.5\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M4.66602 3.49996V2.33329C4.66602 1.74996 5.24935 1.16663 5.83268 1.16663H8.16602C8.74935 1.16663 9.33268 1.74996 9.33268 2.33329V3.49996\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n <!-- Created Date (from API) - last so aligned across all steps, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"step-date cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px] cqa-ml-auto cqa-flex-shrink-0\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n </div>\n </div>\n\n <!-- Expanded Content with Nested Steps (renderer dispatches by step type, n-level nesting) -->\n <div *ngIf=\"expanded\" class=\"cqa-flex cqa-flex-col\">\n <!-- START Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getStartLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n <div *ngIf=\"!isReorder\" class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer *ngFor=\"let step of nestedSteps; let i = index\" [step]=\"step\" [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedDuplicate($event, step)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n <div *ngIf=\"isReorder\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [style.min-height.px]=\"nestedSteps.length === 0 ? 52 : null\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"step-drag-placeholder-nested cqa-my-1 cqa-min-h-[50px] cqa-border-2 cqa-border-dashed cqa-border-[#3F43EE] cqa-rounded cqa-bg-[rgba(63,67,238,0.08)] cqa-flex cqa-items-center cqa-justify-center cqa-text-[#3F43EE] cqa-text-xs\">Drop here</div>\n <div *ngFor=\"let step of nestedSteps; let i = index\" class=\"nested-step-drag-item\"\n [dndDraggable]=\"step\"\n dndEffectAllowed=\"move\"\n dndType=\"step\">\n <cqa-test-case-details-renderer [step]=\"step\" [index]=\"i\"\n [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- Empty loop: show plus icon on hover when expanded and no steps.\n When rendered inside a step group or when reordering, hide this Add button entirely. -->\n <div *ngIf=\"nestedSteps.length === 0 && !isInsideStepGroup && !isReorder\" class=\"loop-step-empty cqa-min-h-[52px] cqa-flex cqa-items-center cqa-justify-center cqa-pl-4 cqa-pr-4\">\n <button type=\"button\" (click)=\"onAddStepEmpty(); $event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\" title=\"Add step\"\n class=\"loop-step-empty-add\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" fill=\"white\" />\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" stroke=\"#3F43EE\" stroke-width=\"2\" />\n <path d=\"M8.5 12H15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 8.5V15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <!-- END Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getEndLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n</div>" }]
1165
1165
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { config: [{
1166
1166
  type: Input
1167
1167
  }], id: [{
@@ -1262,4 +1262,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
1262
1262
  type: ViewChild,
1263
1263
  args: ['viewDetailsTrigger', { static: false }]
1264
1264
  }] } });
1265
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC1zdGVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvbG9vcC1zdGVwL2xvb3Atc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2xvb3Atc3RlcC9sb29wLXN0ZXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsU0FBUyxFQUFpQyxNQUFNLGVBQWUsQ0FBQztBQUNuSixPQUFPLEVBQTBCLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JFLE9BQU8sRUFBK0csU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEssT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7OztBQUtyRSxNQUFNLHNCQUFzQixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7O0NBZ0I5QixDQUFDO0FBVUYsTUFBTSxPQUFPLHlCQUF5QjtJQXNIcEMsWUFDVSxFQUFlLEVBQ2YsR0FBc0I7UUFEdEIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBckh2QixhQUFRLEdBQW9CLEtBQUssQ0FBQztRQVNsQyxnQkFBVyxHQUF5QixFQUFFLENBQUM7UUFDdkMsYUFBUSxHQUFZLElBQUksQ0FBQztRQUN6QixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUNuQyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDbkMsZ0ZBQWdGO1FBQ3ZFLHVCQUFrQixHQUF3QixFQUFFLENBQUM7UUFDdEQsZ0VBQWdF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O3NCQUExQixLQUFLO2dCQUVHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFFRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUcseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUVHLDZCQUE2QjtzQkFBckMsS0FBSztnQkFFRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcsb0JBQW9CO3NCQUE3QixNQUFNO2dCQUVHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFFRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkF3QzZDLGtCQUFrQjtzQkFBckUsU0FBUzt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRG5kRHJvcEV2ZW50IH0gZnJvbSAnbmd4LWRyYWctZHJvcCc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb29wU3RlcENvbmZpZywgVGVzdENhc2VTdGVwQ29uZmlnLCBOb3JtYWxTdGVwQ29uZmlnLCBDb25kaXRpb25TdGVwQ29uZmlnLCBTdGVwR3JvdXBDb25maWcsIENvbmRpdGlvbkJyYW5jaCwgU3RlcFR5cGVzIH0gZnJvbSAnLi4vdGVzdC1jYXNlLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IFNURVBfUk9XX0FDVElPTlNfU1RZTEVTIH0gZnJvbSAnLi4vc3RlcC1yb3ctYWN0aW9ucy5zdHlsZXMnO1xuaW1wb3J0IHsgRGF0YVByb2ZpbGVPcHRpb24gfSBmcm9tICcuLi8uLi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50JztcbmltcG9ydCB7IFZpZXdEZXRhaWxzUGF5bG9hZCB9IGZyb20gJy4uL3N0ZXAtZGV0YWlscy1tb2RhbC9zdGVwLWRldGFpbHMtbW9kYWwtZGF0YSc7XG5pbXBvcnQgeyBDcWFBdXRvY29tcGxldGVPcHRpb24gfSBmcm9tICcuLi8uLi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLm1vZGVsJztcblxuY29uc3QgTE9PUF9TVEVQX0VNUFRZX1NUWUxFUyA9IGBcbiAgLyogRW1wdHkgbG9vcDogcGx1cyBpY29uIGFsd2F5cyB2aXNpYmxlIHdoZW4gZXhwYW5kZWQgYW5kIG5vIHN0ZXBzICovXG4gIC5sb29wLXN0ZXAtZW1wdHkge1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbiAgLmxvb3Atc3RlcC1lbXB0eS1hZGQge1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyOiAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjb2xvcjogIzNGNDNFRTtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2U7XG4gIH1cbiAgLmxvb3Atc3RlcC1lbXB0eS1hZGQ6aG92ZXIge1xuICAgIG9wYWNpdHk6IDAuOTtcbiAgfVxuYDtcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZXN0LWNhc2UtbG9vcC1zdGVwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xvb3Atc3RlcC5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgc3R5bGVzOiBbXG4gICAgU1RFUF9ST1dfQUNUSU9OU19TVFlMRVMsXG4gICAgTE9PUF9TVEVQX0VNUFRZX1NUWUxFUyxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdENhc2VMb29wU3RlcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgY29uZmlnITogTG9vcFN0ZXBDb25maWc7XG4gIEBJbnB1dCgpIGlkITogc3RyaW5nO1xuICBASW5wdXQoKSBsb29wVHlwZTogJ2ZvcicgfCAnd2hpbGUnID0gJ2Zvcic7XG4gIEBJbnB1dCgpIHN0ZXBOdW1iZXIhOiBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBBcnJheSBpbmRleCBmcm9tIHBhcmVudCByZW5kZXJlciAtIHVzZSB0aGlzIGZvciBlZGl0SW5EZXB0aCBpbnN0ZWFkIG9mIHN0ZXBOdW1iZXIgKHN0ZXBOdW1iZXIgXCIxMC4zXCIgcGFyc2VzIHRvIDEwKSAqL1xuICBASW5wdXQoKSBpbmRleD86IG51bWJlcjtcbiAgQElucHV0KCkgY29uZGl0aW9uPzogc3RyaW5nO1xuICBASW5wdXQoKSBtYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuICBASW5wdXQoKSB0ZXN0RGF0YVByb2ZpbGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN0YXJ0U3RlcD86IG51bWJlcjtcbiAgQElucHV0KCkgZW5kU3RlcD86IG51bWJlcjtcbiAgQElucHV0KCkgbmVzdGVkU3RlcHM6IFRlc3RDYXNlU3RlcENvbmZpZ1tdID0gW107XG4gIEBJbnB1dCgpIGV4cGFuZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgaXNOZXN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNJbnNpZGVMb29wOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzSW5zaWRlU3RlcEdyb3VwOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzUmVvcmRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogT3B0aW9ucyBmb3IgdGhlIGRhdGEgcHJvZmlsZSBkcm9wZG93biAtIGFjY2VwdHMgRGF0YVByb2ZpbGVPcHRpb24gb2JqZWN0cyAqL1xuICBASW5wdXQoKSBkYXRhUHJvZmlsZU9wdGlvbnM6IERhdGFQcm9maWxlT3B0aW9uW10gPSBbXTtcbiAgLyoqIEluZGljYXRlcyBpZiBtb3JlIGRhdGEgcHJvZmlsZXMgYXJlIGF2YWlsYWJsZSBmb3IgbG9hZGluZyAqL1xuICBASW5wdXQoKSBoYXNNb3JlRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBMb2FkaW5nIHN0YXRlIGZvciBkYXRhIHByb2ZpbGVzICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ0RhdGFQcm9maWxlczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogT3B0aW9ucyBmb3IgbmF0dXJhbCB0ZXh0IGFjdGlvbnMgKGZvciB3aGlsZSBsb29wIGNvbmRpdGlvbikgKi9cbiAgQElucHV0KCkgbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXTtcbiAgLyoqIEZ1bmN0aW9uIHRvIHByb2Nlc3MgdGVtcGxhdGUgdmFyaWFibGVzIGZvciB3aGlsZSBjb25kaXRpb24gKHNhbWUgYXMgY29uZGl0aW9uLXN0ZXApICovXG4gIEBJbnB1dCgpIHNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzOiAodGVtcGxhdGU6IGFueSkgPT4gYW55W10gPSAoKSA9PiBbXTtcbiAgLyoqIFNob3cgXCJBZGQgU3RlcCBCZXR3ZWVuXCIgYnV0dG9uIGFib3ZlIG5lc3RlZCBzdGVwcyAqL1xuICBASW5wdXQoKSBhZGRTdGVwQmV0d2VlbkFib3ZlOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBTaG93IFwiQWRkIFN0ZXAgQmV0d2VlblwiIGJ1dHRvbiBiZWxvdyBuZXN0ZWQgc3RlcHMgKi9cbiAgQElucHV0KCkgYWRkU3RlcEJldHdlZW5CZWxvdzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGFkZFN0ZXBCZXR3ZWVuQWJvdmUgYW5kIGFkZFN0ZXBCZXR3ZWVuQmVsb3cgaW5zdGVhZC4gSWYgc2V0LCBhcHBsaWVzIHRvIGJvdGggYnV0dG9ucy4gKi9cbiAgQElucHV0KCkgYWRkU3RlcEJldHdlZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgdG9nZ2xlRXhwYW5kZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHtjb25maWc6IExvb3BTdGVwQ29uZmlnLCBleHBhbmRlZDogYm9vbGVhbn0+KCk7XG4gIEBPdXRwdXQoKSB0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHN0YXJ0U3RlcENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgZW5kU3RlcENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgY29uZGl0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBtYXhJdGVyYXRpb25zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBuZXN0ZWRTdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgaW5kZXg6IG51bWJlciB9PigpO1xuICAvKiogRW1pdHMgdm9pZCB3aGVuIGFkZCBpcyBmcm9tIG5lc3RlZCBjb250ZW50OyBlbWl0cyB7IGxvb3BTdGVwQ29uZmlnIH0gd2hlbiBlbXB0eS1zdGF0ZSBhZGQgaXMgY2xpY2tlZCAoc2FtZSBiZWhhdmlvdXIgYXMgYWRkLXN0ZXAtYmV0d2VlbikuICovXG4gIEBPdXRwdXQoKSBhZGRTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkIHwgeyBsb29wU3RlcENvbmZpZzogTG9vcFN0ZXBDb25maWcgfT4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZVN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGR1cGxpY2F0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG1vcmVPcHRpb25zID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgdmlld0RldGFpbHMgPSBuZXcgRXZlbnRFbWl0dGVyPFZpZXdEZXRhaWxzUGF5bG9hZD4oKTtcbiAgQE91dHB1dCgpIGVkaXRJbkRlcHRoID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgaW5kZXg6IG51bWJlcjsgdGVtcGxhdGVPdmVycmlkZT86IGFueSB9PigpO1xuICBAT3V0cHV0KCkgZWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGRuZERyb3BJblpvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IERuZERyb3BFdmVudDsgdGFyZ2V0TGlzdDogVGVzdENhc2VTdGVwQ29uZmlnW10gfT4oKTtcbiAgLyoqIEVtaXQgd2hlbiBtb3JlIGRhdGEgcHJvZmlsZXMgbmVlZCB0byBiZSBsb2FkZWQgKi9cbiAgQE91dHB1dCgpIGxvYWRNb3JlRGF0YVByb2ZpbGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0IHdoZW4gZGF0YSBwcm9maWxlIHNlYXJjaCBxdWVyeSBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBzZWFyY2hEYXRhUHJvZmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXQgd2hlbiBzdGVwIGlzIHVwZGF0ZWQgKEFwcGx5IGJ1dHRvbiBjbGlja2VkIGluIGVkaXQgbW9kZSkgKi9cbiAgQE91dHB1dCgpIHN0ZXBVcGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPExvb3BTdGVwQ29uZmlnPigpO1xuICAvKiogUmUtZW1pdCB3aGVuIGEgbmVzdGVkIHN0ZXAgKGUuZy4gbm9ybWFsLXN0ZXApIGVtaXRzIGNsaWNrQWN0aW9uIChlLmcuIGVsZW1lbnQvbGFiZWwgY2xpY2sgZm9yIHBvcHVwKSAqL1xuICBAT3V0cHV0KCkgY2xpY2tBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IE1vdXNlRXZlbnQ7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyB9PigpO1xuICAvKiogUmUtZW1pdCBhZGRTdGVwQmV0d2VlbkNsaWNrIGZyb20gbmVzdGVkIHJlbmRlcmVycyAqL1xuICBAT3V0cHV0KCkgYWRkU3RlcEJldHdlZW5DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8e3N0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZywgaW5kZXg6IG51bWJlciwgcG9zaXRpb246ICdBQk9WRScgfCAnQkVMT1cnfT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZUJyYW5jaCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29uZGl0aW9uQnJhbmNoPigpO1xuXG4gIG9uRG5kRHJvcChldmVudDogRG5kRHJvcEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5kbmREcm9wSW5ab25lLmVtaXQoeyBldmVudCwgdGFyZ2V0TGlzdDogdGhpcy5uZXN0ZWRTdGVwcyB9KTtcbiAgfVxuXG4gIC8qKiBFbWl0IGNsaWNrQWN0aW9uIHdoZW4gdXNlciBjbGlja3Mgb24gbG9vcCBkaXNwbGF5IGJhZGdlcyAoZWxlbWVudCwgdGVzdF9kYXRhLCBldGMuKSBzbyBwYXJlbnQgY2FuIG9wZW4gZWRpdCBtb2RhbHMgKi9cbiAgb25Mb29wQWN0aW9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNsaWNrQWN0aW9uLmVtaXQoeyBldmVudCwgc3RlcDogdGhpcy5jb25maWcgfSk7XG4gIH1cblxuICAvKiogRXhwb3NlIGdsb2JhbCBjb25zdHJ1Y3RvcnMgZm9yIHRlbXBsYXRlIChBbmd1bGFyIHRlbXBsYXRlcyBkb24ndCBoYXZlIFN0cmluZy9OdW1iZXIpICovXG4gIHJlYWRvbmx5IHN0cmluZ0ZuID0gU3RyaW5nO1xuICByZWFkb25seSBudW1iZXJGbiA9IE51bWJlcjtcblxuICAvKiogV2hlbiB0cnVlLCBoZWFkZXIgc2hvd3MgaW5saW5lIGVkaXQgZm9ybSAoZHJvcGRvd25zLCBpbnB1dHMsIENhbmNlbC9BcHBseSkgKi9cbiAgaXNFZGl0aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEZvcm0gZm9yIGVkaXQgbW9kZTsgYm91bmQgdG8gY3FhLWR5bmFtaWMtc2VsZWN0IChzYW1lIHBhdHRlcm4gYXMgZGVmYXVsdCBzdG9yaWVzKSAqL1xuICBlZGl0Rm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogQ2FjaGVkIHNlbGVjdCBjb25maWdzIChzdGFibGUgcmVmcyB0byBhdm9pZCBjaGFuZ2UtZGV0ZWN0aW9uIGxvb3BzKSAqL1xuICBmb3JPcHRpb25UeXBlU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICB0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIHN0YXJ0U3RlcFNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgZW5kU3RlcFNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgY29uZGl0aW9uU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICAvKiogV2hpbGUgbG9vcDogY29uZmlnIGZvciBhdXRvY29tcGxldGUgb3B0aW9ucyAoV0hJTEVfQ09ORElUSU9OIG9ubHkpICovXG4gIHdoaWxlQ29uZGl0aW9uU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuXG4gIC8qKiBTZWxlY3RlZCB0ZW1wbGF0ZSBmb3Igd2hpbGUgY29uZGl0aW9uIChzYW1lIHBhdHRlcm4gYXMgY29uZGl0aW9uLXN0ZXApICovXG4gIHNlbGVjdGVkVGVtcGxhdGU6IGFueSA9IG51bGw7XG4gIC8qKiBUZW1wbGF0ZSB2YXJpYWJsZXMgZm9yIHdoaWxlIGNvbmRpdGlvbiAqL1xuICB0ZW1wbGF0ZVZhcmlhYmxlczogYW55W10gPSBbXTtcbiAgLyoqIEZvcm0gZ3JvdXAgZm9yIHRlbXBsYXRlIHZhcmlhYmxlcyAqL1xuICB0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIERlZmF1bHQgbWF4IGZvciBMb29wIFN0YXJ0IC8gRW5kIHdoZW4gbm8gcHJvZmlsZSBzZWxlY3RlZCAob3B0aW9ucyAxLi4xMCkgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9MT09QX09QVElPTlNfTUFYID0gMTA7XG5cbiAgQFZpZXdDaGlsZCgndmlld0RldGFpbHNUcmlnZ2VyJywgeyBzdGF0aWM6IGZhbHNlIH0pIHZpZXdEZXRhaWxzVHJpZ2dlcj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIC8qKiBMb2NhbCBjb3B5IG9mIHZhbHVlcyB3aGlsZSBlZGl0aW5nIChmb3IgQ2FuY2VsIHJldmVydCkgKi9cbiAgcHJpdmF0ZSBlZGl0U25hcHNob3Q6IHtcbiAgICB0ZXN0RGF0YVByb2ZpbGU/OiBzdHJpbmc7XG4gICAgc3RhcnRTdGVwPzogbnVtYmVyO1xuICAgIGVuZFN0ZXA/OiBudW1iZXI7XG4gICAgY29uZGl0aW9uPzogc3RyaW5nO1xuICAgIG1heEl0ZXJhdGlvbnM/OiBudW1iZXI7XG4gICAgc2VsZWN0ZWRUZW1wbGF0ZT86IGFueTtcbiAgICB0ZW1wbGF0ZVZhcmlhYmxlcz86IGFueVtdO1xuICAgIGNvbmRpdGlvblRlbXBsYXRlRm9ybVZhbHVlPzogYW55O1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuaWQgPSB0aGlzLmNvbmZpZy5pZDtcbiAgICAgIHRoaXMubG9vcFR5cGUgPSB0aGlzLmNvbmZpZy5sb29wVHlwZTtcbiAgICAgIHRoaXMuc3RlcE51bWJlciA9IHRoaXMuY29uZmlnLnN0ZXBOdW1iZXI7XG4gICAgICB0aGlzLmNvbmRpdGlvbiA9IHRoaXMuY29uZmlnLmNvbmRpdGlvbjtcbiAgICAgIHRoaXMubWF4SXRlcmF0aW9ucyA9IHRoaXMuY29uZmlnLm1heEl0ZXJhdGlvbnM7XG4gICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRoaXMuY29uZmlnLnRlc3REYXRhUHJvZmlsZTtcbiAgICAgIHRoaXMuc3RhcnRTdGVwID0gdGhpcy5jb25maWcuc3RhcnRTdGVwO1xuICAgICAgdGhpcy5lbmRTdGVwID0gdGhpcy5jb25maWcuZW5kU3RlcDtcbiAgICAgIHRoaXMubmVzdGVkU3RlcHMgPSB0aGlzLmNvbmZpZy5uZXN0ZWRTdGVwcyB8fCBbXTtcbiAgICAgIHRoaXMuZXhwYW5kZWQgPSB0aGlzLmNvbmZpZy5leHBhbmRlZCAhPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWcuZXhwYW5kZWQgOiB0cnVlO1xuICAgICAgdGhpcy5zZWxlY3RlZCA9ICh0aGlzLmNvbmZpZyBhcyBhbnkpLnNlbGVjdGVkIHx8IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmJ1aWxkRWRpdEZvcm0oKTtcbiAgICB0aGlzLmJ1aWxkU2VsZWN0Q29uZmlncygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydjb25maWcnXSAmJiB0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9ICh0aGlzLmNvbmZpZyBhcyBhbnkpLnNlbGVjdGVkIHx8IGZhbHNlO1xuICAgICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb24oKTtcbiAgICAgIH1cbiAgICAgIC8vIEZPUiBsb29wOiB3aGVuIHN0ZXAgY29uZmlnIGhhcyBmb3JMb29wVGVzdERhdGFJZC9mb3JMb29wU3RhcnRJbmRleC9mb3JMb29wRW5kSW5kZXgsIHN5bmMgZm9ybSBhbmQgcmVmcmVzaCBzZWxlY3QgY29uZmlncyBzbyBkcm9wZG93bnMgc2hvdyBzZWxlY3RlZFxuICAgICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRm9yTG9vcFNlbGVjdENvbmZpZ3NTZWxlY3RlZFZhbHVlcygpO1xuICAgICAgICBpZiAodGhpcy5lZGl0Rm9ybSkgdGhpcy5zeW5jRm9yTG9vcEVkaXRGb3JtRnJvbUNvbmZpZygpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydkYXRhUHJvZmlsZU9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlRGF0YVByb2ZpbGVzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRGF0YVByb2ZpbGVzJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk7XG4gICAgICAvLyBXaGVuIGRhdGEgcHJvZmlsZXMgbG9hZCBpbiBlZGl0IG1vZGUsIHN5bmMgZm9ybSB2YWx1ZSBzbyBkcm9wZG93biBzaG93cyBzZWxlY3RlZCAoZm9yTG9vcFRlc3REYXRhSWQgb3IgdGVzdERhdGFQcm9maWxlKVxuICAgICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InICYmIHRoaXMuZWRpdEZvcm0gJiYgdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgICAgIGlmIChjZmc/LmZvckxvb3BUZXN0RGF0YUlkICE9IG51bGwgfHwgdGhpcy50ZXN0RGF0YVByb2ZpbGUpIHRoaXMuc3luY0Zvckxvb3BFZGl0Rm9ybUZyb21Db25maWcoKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvblNlbGVjdENvbmZpZygpO1xuICAgICAgLy8gV2hlbiBvcHRpb25zIGxvYWQsIHBvcHVsYXRlIGNvbmRpdGlvbiArIHRlbXBsYXRlIGZyb20gbmF0dXJhbFRleHRBY3Rpb25JZCAoc2FtZSBhcyBjb25kaXRpb24tc3RlcClcbiAgICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnICYmIHRoaXMuZWRpdEZvcm0gJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogRGVyaXZlIGZvck9wdGlvblR5cGUgZm9yIEZPUiBsb29wIGZyb20gY29uZmlnIHNvIGRyb3Bkb3duIHNob3dzIGV4aXN0aW5nIHNlbGVjdGlvbiAqL1xuICBwcml2YXRlIGdldEZvck9wdGlvblR5cGVGcm9tQ29uZmlnKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGhhc1Rlc3REYXRhSWQgPSBjZmc/LmZvckxvb3BUZXN0RGF0YUlkICE9IG51bGwgfHwgY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFRlc3REYXRhSWQgIT0gbnVsbCB8fCBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8udGVzdERhdGFJZCAhPSBudWxsO1xuICAgIGlmIChoYXNUZXN0RGF0YUlkIHx8IHRoaXMudGVzdERhdGFQcm9maWxlKSByZXR1cm4gJ3Rlc3QtZGF0YSc7XG4gICAgY29uc3QgaGFzRml4ZWQgPSBjZmc/LmZvckxvb3BTdGFydEluZGV4ICE9IG51bGwgfHwgY2ZnPy5mb3JMb29wRW5kSW5kZXggIT0gbnVsbFxuICAgICAgfHwgY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFN0YXJ0SW5kZXggIT0gbnVsbCB8fCBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wRW5kSW5kZXggIT0gbnVsbFxuICAgICAgfHwgY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnN0YXJ0SW5kZXggIT0gbnVsbCB8fCBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uZW5kSW5kZXggIT0gbnVsbDtcbiAgICBpZiAodGhpcy5zdGFydFN0ZXAgIT0gbnVsbCB8fCB0aGlzLmVuZFN0ZXAgIT0gbnVsbCB8fCBoYXNGaXhlZCkgcmV0dXJuICdmaXhlZCc7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogVGVzdCBEYXRhIFByb2ZpbGUgZHJvcGRvd24gdmFsdWU6IHByZWZlciBmb3JMb29wVGVzdERhdGFJZCBmcm9tIGNvbmZpZyAob3IgZGF0YU1hcEpzb24vZGF0YU1hcEJlYW4pLiBVc2Ugb3B0aW9uLmlkIHdoZW4gb3B0aW9ucyBsb2FkZWQgc28gdHlwZSBtYXRjaGVzIHNlbGVjdC4gKi9cbiAgcHJpdmF0ZSBnZXRUZXN0RGF0YVByb2ZpbGVGb3JtVmFsdWUoKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgaWRGcm9tQ29uZmlnID0gY2ZnPy5mb3JMb29wVGVzdERhdGFJZCA/PyBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wVGVzdERhdGFJZCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8udGVzdERhdGFJZDtcbiAgICAvLyBXaGVuIHdlIGhhdmUgb3B0aW9ucywgcmVzb2x2ZSBieSBpZCBzbyBmb3JtIHZhbHVlIG1hdGNoZXMgb3B0aW9uLmlkIChzdHJpY3QgZXF1YWxpdHkgaW4gZHluYW1pYy1zZWxlY3QpXG4gICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InICYmIHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgIGlmIChpZEZyb21Db25maWcgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAgICAgbyA9PiBvLmlkID09PSBpZEZyb21Db25maWcgfHwgU3RyaW5nKG8uaWQpID09PSBTdHJpbmcoaWRGcm9tQ29uZmlnKVxuICAgICAgICApO1xuICAgICAgICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaC5pZDtcbiAgICAgICAgcmV0dXJuIGlkRnJvbUNvbmZpZyBhcyBzdHJpbmcgfCBudW1iZXI7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudGVzdERhdGFQcm9maWxlID8/ICcnO1xuICAgICAgaWYgKHZhbHVlICE9PSAnJykge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAgICAgbyA9PiBvLm5hbWUgPT09IHZhbHVlIHx8IFN0cmluZyhvLmlkKSA9PT0gU3RyaW5nKHZhbHVlKVxuICAgICAgICApO1xuICAgICAgICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaC5pZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZSBhcyBzdHJpbmcgfCBudW1iZXI7XG4gICAgfVxuICAgIGlmIChpZEZyb21Db25maWcgIT0gbnVsbCkgcmV0dXJuIGlkRnJvbUNvbmZpZyBhcyBzdHJpbmcgfCBudW1iZXI7XG4gICAgcmV0dXJuICh0aGlzLnRlc3REYXRhUHJvZmlsZSA/PyAnJykgYXMgc3RyaW5nIHwgbnVtYmVyO1xuICB9XG5cbiAgLyoqIExvb3AgU3RhcnQgZHJvcGRvd24gdmFsdWU6IHByZWZlciBmb3JMb29wU3RhcnRJbmRleCBmcm9tIGNvbmZpZyAob3IgZGF0YU1hcEpzb24vZGF0YU1hcEJlYW4pLCBlbHNlIHN0YXJ0U3RlcCAqL1xuICBwcml2YXRlIGdldExvb3BTdGFydEZvcm1WYWx1ZSgpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgdiA9IGNmZz8uZm9yTG9vcFN0YXJ0SW5kZXggPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFN0YXJ0SW5kZXggPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnN0YXJ0SW5kZXg7XG4gICAgaWYgKHYgIT0gbnVsbCkgcmV0dXJuIE51bWJlcih2KTtcbiAgICByZXR1cm4gdGhpcy5zdGFydFN0ZXAgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBMb29wIEVuZCBkcm9wZG93biB2YWx1ZTogcHJlZmVyIGZvckxvb3BFbmRJbmRleCBmcm9tIGNvbmZpZyAob3IgZGF0YU1hcEpzb24vZGF0YU1hcEJlYW4pLCBlbHNlIGVuZFN0ZXAgKi9cbiAgcHJpdmF0ZSBnZXRMb29wRW5kRm9ybVZhbHVlKCk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB2ID0gY2ZnPy5mb3JMb29wRW5kSW5kZXggPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcEVuZEluZGV4ID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5lbmRJbmRleDtcbiAgICBpZiAodiAhPSBudWxsKSByZXR1cm4gTnVtYmVyKHYpO1xuICAgIHJldHVybiB0aGlzLmVuZFN0ZXAgPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRFZGl0Rm9ybSgpOiB2b2lkIHtcbiAgICAvLyBGb3Igd2hpbGUgbG9vcDogaWYgY29uZmlnIGhhcyBuYXR1cmFsVGV4dEFjdGlvbklkIGFuZCBvcHRpb25zIGFyZSBhbHJlYWR5IGxvYWRlZCwgdXNlIHRoZW0gZm9yIGluaXRpYWwgY29uZGl0aW9uICsgdGVtcGxhdGVcbiAgICBsZXQgY29uZGl0aW9uVmFsdWUgPSB0aGlzLmNvbmRpdGlvbiA/PyAnJztcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgY29uc3QgcG9wdWxhdGVkID0gdGhpcy5wb3B1bGF0ZVdoaWxlQ29uZGl0aW9uRnJvbU5hdHVyYWxUZXh0QWN0aW9uSWQoKTtcbiAgICAgIGlmIChwb3B1bGF0ZWQ/LmNvbmRpdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIGNvbmRpdGlvblZhbHVlID0gcG9wdWxhdGVkLmNvbmRpdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRm9yIEZPUiBsb29wOiBpbml0aWFsIGZvcm0gdmFsdWVzIHNvIGRyb3Bkb3ducyBzaG93IGV4aXN0aW5nIHNlbGVjdGlvbiAoZm9yT3B0aW9uVHlwZSwgZm9yTG9vcFRlc3REYXRhSWQvdGVzdERhdGFQcm9maWxlLCBmb3JMb29wU3RhcnRJbmRleC9mb3JMb29wRW5kSW5kZXgpXG4gICAgY29uc3QgZm9yT3B0aW9uVHlwZSA9IHRoaXMuZ2V0Rm9yT3B0aW9uVHlwZUZyb21Db25maWcoKTtcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWx1ZSA9IHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gdGhpcy5nZXRUZXN0RGF0YVByb2ZpbGVGb3JtVmFsdWUoKSA6ICh0aGlzLnRlc3REYXRhUHJvZmlsZSA/PyAnJyk7XG4gICAgY29uc3QgbG9vcFN0YXJ0VmFsdWUgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/IHRoaXMuZ2V0TG9vcFN0YXJ0Rm9ybVZhbHVlKCkgOiAodGhpcy5zdGFydFN0ZXAgPz8gbnVsbCk7XG4gICAgY29uc3QgbG9vcEVuZFZhbHVlID0gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyB0aGlzLmdldExvb3BFbmRGb3JtVmFsdWUoKSA6ICh0aGlzLmVuZFN0ZXAgPz8gbnVsbCk7XG4gICAgdGhpcy5lZGl0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZm9yT3B0aW9uVHlwZTogW2Zvck9wdGlvblR5cGUgYXMgc3RyaW5nIHwgbnVsbF0sXG4gICAgICB0ZXN0RGF0YVByb2ZpbGU6IFt0ZXN0RGF0YVByb2ZpbGVWYWx1ZV0sXG4gICAgICBzdGFydFN0ZXA6IFtsb29wU3RhcnRWYWx1ZSBhcyBudW1iZXIgfCBudWxsXSxcbiAgICAgIGVuZFN0ZXA6IFtsb29wRW5kVmFsdWUgYXMgbnVtYmVyIHwgbnVsbF0sXG4gICAgICBjb25kaXRpb246IFtjb25kaXRpb25WYWx1ZV0sXG4gICAgICBtYXhJdGVyYXRpb25zOiBbdGhpcy5tYXhJdGVyYXRpb25zID8/IDVdLFxuICAgIH0pO1xuICAgIGlmICghdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0pIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBvcHVsYXRlIGNvbmRpdGlvbiwgc2VsZWN0ZWRUZW1wbGF0ZSBhbmQgdGVtcGxhdGUgdmFyaWFibGVzIGZyb20gY29uZmlnLm5hdHVyYWxUZXh0QWN0aW9uSWQgd2hlbiBvcHRpb25zIGFyZSBhdmFpbGFibGUuXG4gICAqIFJldHVybnMgeyBjb25kaXRpb24gfSBpZiBhIG1hdGNoIHdhcyBmb3VuZCBzbyBidWlsZEVkaXRGb3JtIGNhbiBzZXQgaW5pdGlhbCBmb3JtIHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSBwb3B1bGF0ZVdoaWxlQ29uZGl0aW9uRnJvbU5hdHVyYWxUZXh0QWN0aW9uSWQoKTogeyBjb25kaXRpb246IHN0cmluZyB9IHwgbnVsbCB7XG4gICAgY29uc3QgY29uZmlnV2l0aElkID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGlmICghY29uZmlnV2l0aElkPy5uYXR1cmFsVGV4dEFjdGlvbklkIHx8ICF0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID0gKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyBhcyBhbnlbXSkuZmluZChcbiAgICAgIChvcHRpb246IGFueSkgPT4gU3RyaW5nKG9wdGlvbi5pZCkgPT09IFN0cmluZyhjb25maWdXaXRoSWQubmF0dXJhbFRleHRBY3Rpb25JZClcbiAgICApO1xuICAgIGlmICghbWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBuYXR1cmFsVGV4dCA9IG1hdGNoaW5nT3B0aW9uLm5hdHVyYWxUZXh0ID8/IG1hdGNoaW5nT3B0aW9uLm5hbWUgPz8gbWF0Y2hpbmdPcHRpb24udmFsdWUgPz8gJyc7XG4gICAgaWYgKCFuYXR1cmFsVGV4dCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRoaXMuY29uZGl0aW9uID0gbmF0dXJhbFRleHQ7XG4gICAgY29uc3QgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdPcHRpb24udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gZnVsbFRlbXBsYXRlO1xuICAgIGlmIChmdWxsVGVtcGxhdGU/LnZhcmlhYmxlcykge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMoZnVsbFRlbXBsYXRlKSB8fCBbXTtcbiAgICAgIHRoaXMuYnVpbGRUZW1wbGF0ZVZhcmlhYmxlc0Zvcm0oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IFtdO1xuICAgIH1cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgcmV0dXJuIHsgY29uZGl0aW9uOiBuYXR1cmFsVGV4dCB9O1xuICB9XG5cbiAgLyoqIFJlYnVpbGQgY29uZGl0aW9uICsgdGVtcGxhdGUgc3RhdGUgd2hlbiBuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIGxvYWQgb3IgY29uZmlnIGNoYW5nZXMgKHNhbWUgYXMgY29uZGl0aW9uLXN0ZXApLiAqL1xuICBwcml2YXRlIHJlYnVpbGRXaGlsZUNvbmRpdGlvbkZyb21OYXR1cmFsVGV4dEFjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdEZvcm0gfHwgdGhpcy5sb29wVHlwZSAhPT0gJ3doaWxlJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb25maWdXaXRoSWQgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgaWYgKCFjb25maWdXaXRoSWQ/Lm5hdHVyYWxUZXh0QWN0aW9uSWQgfHwgIXRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID0gKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyBhcyBhbnlbXSkuZmluZChcbiAgICAgIChvcHRpb246IGFueSkgPT4gU3RyaW5nKG9wdGlvbi5pZCkgPT09IFN0cmluZyhjb25maWdXaXRoSWQubmF0dXJhbFRleHRBY3Rpb25JZClcbiAgICApO1xuICAgIGlmICghbWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmF0dXJhbFRleHQgPSBtYXRjaGluZ09wdGlvbi5uYXR1cmFsVGV4dCA/PyBtYXRjaGluZ09wdGlvbi5uYW1lID8/IG1hdGNoaW5nT3B0aW9uLnZhbHVlID8/ICcnO1xuICAgIGlmIChuYXR1cmFsVGV4dCkge1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2NvbmRpdGlvbicpPy52YWx1ZSA/PyAnJztcbiAgICAgIGlmICghY3VycmVudFZhbHVlIHx8IGN1cnJlbnRWYWx1ZSAhPT0gbmF0dXJhbFRleHQpIHtcbiAgICAgICAgdGhpcy5lZGl0Rm9ybS5nZXQoJ2NvbmRpdGlvbicpPy5zZXRWYWx1ZShuYXR1cmFsVGV4dCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbmRpdGlvbiA9IG5hdHVyYWxUZXh0O1xuICAgIH1cbiAgICBjb25zdCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbi50ZW1wbGF0ZSB8fCBtYXRjaGluZ09wdGlvbjtcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBmdWxsVGVtcGxhdGU7XG4gICAgaWYgKGZ1bGxUZW1wbGF0ZT8udmFyaWFibGVzKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpIHx8IFtdO1xuICAgICAgdGhpcy5idWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBzZWxlY3QgY29uZmlncyBvbmNlIChzYW1lIG9wdGlvbiBzaGFwZSBhcyBkZWZhdWx0IHN0b3JpZXM6IGlkICsgbmFtZSk7IEZPUiBsb29wIGFkZHMgc2VsZWN0ZWRWYWx1ZSBmcm9tIHN0ZXAgKi9cbiAgcHJpdmF0ZSBidWlsZFNlbGVjdENvbmZpZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JPcHRpb25UeXBlU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnZm9yT3B0aW9uVHlwZScsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBvcHRpb24nLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgaWQ6ICd0ZXN0LWRhdGEnLCB2YWx1ZTogJ3Rlc3QtZGF0YScsIG5hbWU6ICdUZXN0IERhdGEgUHJvZmlsZScsIGxhYmVsOiAnVGVzdCBEYXRhIFByb2ZpbGUnIH0sXG4gICAgICAgIHsgaWQ6ICdmaXhlZCcsIHZhbHVlOiAnZml4ZWQnLCBuYW1lOiAnRml4ZWQgY291bnQnLCBsYWJlbDogJ0ZpeGVkIGNvdW50JyB9LFxuICAgICAgXSxcbiAgICB9O1xuICAgIHRoaXMudXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk7XG4gICAgY29uc3Qgc3RhcnRWYWwgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/IHRoaXMuZ2V0TG9vcFN0YXJ0Rm9ybVZhbHVlKCkgOiBudWxsO1xuICAgIGNvbnN0IGVuZFZhbCA9IHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gdGhpcy5nZXRMb29wRW5kRm9ybVZhbHVlKCkgOiBudWxsO1xuICAgIHRoaXMuc3RhcnRTdGVwU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnc3RhcnRTdGVwJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnTG9vcCBTdGFydCcsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuZ2V0TG9vcFN0YXJ0U2VsZWN0T3B0aW9ucygpLFxuICAgICAgLi4uKHN0YXJ0VmFsICE9IG51bGwgJiYgeyBzZWxlY3RlZFZhbHVlOiBzdGFydFZhbCB9KSxcbiAgICB9O1xuICAgIHRoaXMuZW5kU3RlcFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2VuZFN0ZXAnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdMb29wIEVuZCcsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuZ2V0TG9vcEVuZFNlbGVjdE9wdGlvbnMoKSxcbiAgICAgIC4uLihlbmRWYWwgIT0gbnVsbCAmJiB7IHNlbGVjdGVkVmFsdWU6IGVuZFZhbCB9KSxcbiAgICB9O1xuICAgIHRoaXMudXBkYXRlQ29uZGl0aW9uU2VsZWN0Q29uZmlnKCk7XG4gIH1cblxuICAvKiogVXBkYXRlIGNvbmRpdGlvbiBzZWxlY3QgY29uZmlnIHdpdGggbmF0dXJhbCB0ZXh0IGFjdGlvbnMgb3B0aW9ucyAobGVnYWN5IG1hdC1zZWxlY3QpICovXG4gIHByaXZhdGUgdXBkYXRlQ29uZGl0aW9uU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZGl0aW9uU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnY29uZGl0aW9uJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGNvbmRpdGlvbicsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgb3B0aW9uczogdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIHx8IFtdLFxuICAgIH07XG4gICAgdGhpcy51cGRhdGVXaGlsZUNvbmRpdGlvblNlbGVjdENvbmZpZygpO1xuICB9XG5cbiAgLyoqIFdoaWxlIGxvb3A6IG9ubHkgc2hvdyBvcHRpb25zIHdpdGggc3RlcEFjdGlvblR5cGUgPT09IFwiV0hJTEVfTE9PUFwiICovXG4gIHByaXZhdGUgdXBkYXRlV2hpbGVDb25kaXRpb25TZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyB8fCBbXSkuZmlsdGVyKChvcHRpb246IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIG9wdGlvbi5zdGVwQWN0aW9uVHlwZSA9PT0gJ1dISUxFX0xPT1AnO1xuICAgIH0pO1xuICAgIHRoaXMud2hpbGVDb25kaXRpb25TZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdjb25kaXRpb24nLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgY29uZGl0aW9uJyxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBvcHRpb25zOiBmaWx0ZXJlZE9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBPcHRpb25zIGZvciB0aGUgd2hpbGUgY29uZGl0aW9uIGF1dG9jb21wbGV0ZSAoV0hJTEVfTE9PUCBuYXR1cmFsIHRleHQgYWN0aW9ucyBvbmx5KSAqL1xuICBnZXQgd2hpbGVDb25kaXRpb25BdXRvY29tcGxldGVPcHRpb25zKCk6IChDcWFBdXRvY29tcGxldGVPcHRpb24gJiB7IHRlbXBsYXRlPzogYW55IH0pW10ge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLndoaWxlQ29uZGl0aW9uU2VsZWN0Q29uZmlnPy5vcHRpb25zID8/IFtdO1xuICAgIHJldHVybiBvcHRzLm1hcCgob3B0aW9uOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gb3B0aW9uLm5hdHVyYWxUZXh0ID8/IG9wdGlvbi5uYW1lID8/IG9wdGlvbi52YWx1ZSA/PyBTdHJpbmcob3B0aW9uLmlkID8/ICcnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBuYXR1cmFsVGV4dCxcbiAgICAgICAgbGFiZWw6IG5hdHVyYWxUZXh0LFxuICAgICAgICB0ZW1wbGF0ZTogb3B0aW9uLnRlbXBsYXRlIHx8IG9wdGlvbixcbiAgICAgIH0gYXMgQ3FhQXV0b2NvbXBsZXRlT3B0aW9uICYgeyB0ZW1wbGF0ZT86IGFueSB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIERpc3BsYXkgdmFsdWUgZm9yIHdoaWxlIGNvbmRpdGlvbiBhdXRvY29tcGxldGU6IHNob3cgbmF0dXJhbCB0ZXh0IGZyb20gb3B0aW9uIG1hdGNoaW5nIG5hdHVyYWxUZXh0QWN0aW9uSWQgd2hlbiBhdmFpbGFibGUgKGluY2x1ZGluZyB3aGVuIGZvcm0gaXMgZW1wdHkgb24gb3BlbiksIGVsc2UgZm9ybSB2YWx1ZS4gV2hlbiB1c2VyIGhhcyBzZWxlY3RlZCBhIGRpZmZlcmVudCBvcHRpb24sIHNob3cgZm9ybSB2YWx1ZS4gKi9cbiAgZ2V0IHdoaWxlQ29uZGl0aW9uRGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29uZmlnV2l0aElkID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGlzRm9ybUh0bWwgPSBmb3JtVmFsdWUgJiYgKFN0cmluZyhmb3JtVmFsdWUpLmluY2x1ZGVzKCc8JykgfHwgU3RyaW5nKGZvcm1WYWx1ZSkuaW5jbHVkZXMoJz4nKSk7XG4gICAgaWYgKGNvbmZpZ1dpdGhJZD8ubmF0dXJhbFRleHRBY3Rpb25JZCAhPSBudWxsICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYXMgYW55W10pLmZpbmQoXG4gICAgICAgIChvcHRpb246IGFueSkgPT4gU3RyaW5nKG9wdGlvbi5pZCkgPT09IFN0cmluZyhjb25maWdXaXRoSWQubmF0dXJhbFRleHRBY3Rpb25JZClcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgICAgY29uc3QgbmF0dXJhbFRleHQgPSBtYXRjaGluZ09wdGlvbi5uYXR1cmFsVGV4dCA/PyBtYXRjaGluZ09wdGlvbi5uYW1lID8/IG1hdGNoaW5nT3B0aW9uLnZhbHVlID8/ICcnO1xuICAgICAgICBpZiAobmF0dXJhbFRleHQpIHtcbiAgICAgICAgICBjb25zdCBuYXR1cmFsVGV4dFN0ciA9IFN0cmluZyhuYXR1cmFsVGV4dCk7XG4gICAgICAgICAgLy8gU2hvdyBzZWxlY3RlZDogd2hlbiBmb3JtIGlzIGVtcHR5IChpbml0aWFsIG9wZW4pLCBvciBmb3JtIG1hdGNoZXMgdGhpcyBvcHRpb24sIG9yIGZvcm0gaGFzIEhUTUwuIE9ubHkgdXNlIGZvcm0gdmFsdWUgd2hlbiB1c2VyIHBpY2tlZCBhIGRpZmZlcmVudCBvcHRpb24uXG4gICAgICAgICAgaWYgKCFmb3JtVmFsdWUgfHwgZm9ybVZhbHVlID09PSBuYXR1cmFsVGV4dFN0ciB8fCBpc0Zvcm1IdG1sKSByZXR1cm4gbmF0dXJhbFRleHRTdHI7XG4gICAgICAgICAgcmV0dXJuIGZvcm1WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNGb3JtSHRtbCkgcmV0dXJuICcnO1xuICAgIHJldHVybiBmb3JtVmFsdWU7XG4gIH1cblxuICBvbkNvbmRpdGlvblNlbGVjdChvcHRpb246IENxYUF1dG9jb21wbGV0ZU9wdGlvbiAmIHsgdGVtcGxhdGU/OiBhbnkgfSk6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uJyk/LnNldFZhbHVlKG9wdGlvbi52YWx1ZSk7XG4gICAgY29uc3QgbWF0Y2hpbmdUZW1wbGF0ZSA9IG9wdGlvbi50ZW1wbGF0ZTtcbiAgICBsZXQgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdUZW1wbGF0ZTtcbiAgICBpZiAoIWZ1bGxUZW1wbGF0ZSB8fCAhZnVsbFRlbXBsYXRlLnZhcmlhYmxlcykge1xuICAgICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSAodGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIHx8IFtdKS5maW5kKFxuICAgICAgICAob3B0OiBhbnkpID0+IG9wdC5uYXR1cmFsVGV4dCA9PT0gb3B0aW9uLnZhbHVlIHx8IG9wdC5uYW1lID09PSBvcHRpb24udmFsdWUgfHwgb3B0LnZhbHVlID09PSBvcHRpb24udmFsdWVcbiAgICAgICkgYXMgYW55O1xuICAgICAgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdPcHRpb24/LnRlbXBsYXRlIHx8IG1hdGNoaW5nT3B0aW9uO1xuICAgIH1cbiAgICBpZiAoZnVsbFRlbXBsYXRlICYmIGZ1bGxUZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IGZ1bGxUZW1wbGF0ZTtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKGZ1bGxUZW1wbGF0ZSkgfHwgW107XG4gICAgICB0aGlzLmJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIC8vIEF1dG8tb3BlbiBFZGl0IEluIGRlcHRoIHdoZW4gdXNlciBzZWxlY3RzIGEgY29uZGl0aW9uIGZyb20gdGhlIGF1dG9jb21wbGV0ZS5cbiAgICAvLyBQYXNzIGZ1bGxUZW1wbGF0ZSBzbyB0aGUgbW9kYWwgc2hvd3MgdGhlIG5ld2x5IHNlbGVjdGVkIHRlbXBsYXRlLCBub3QgdGhlIG9sZCBzdGVwIHRlbXBsYXRlLlxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vbkVkaXRJbkRlcHRoKGZ1bGxUZW1wbGF0ZSksIDEwMCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0pIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgfVxuICAgIE9iamVjdC5rZXlzKHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5yZW1vdmVDb250cm9sKGtleSk7XG4gICAgfSk7XG4gICAgY29uc3QgY29uZmlnV2l0aERhdGEgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgZXhpc3RpbmdEYXRhID0gY29uZmlnV2l0aERhdGEudGVtcGxhdGVWYXJpYWJsZXNEYXRhIHx8IHt9O1xuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnk7XG4gICAgICBpZiAoZXhpc3RpbmdEYXRhLmhhc093blByb3BlcnR5KHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGV4aXN0aW5nRGF0YVt2YXJpYWJsZS5uYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJ1xuICAgICAgICAgID8gKHZhcmlhYmxlLnZhbHVlID09PSB0cnVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAndHJ1ZScgfHwgdmFyaWFibGUudmFsdWUgPT09IDEpXG4gICAgICAgICAgOiAodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgICAgfVxuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyAmJiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWUgPT09ICd0cnVlJyB8fCBkZWZhdWx0VmFsdWUgPT09ICcxJztcbiAgICAgIH1cbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtLmFkZENvbnRyb2wodmFyaWFibGUubmFtZSwgbmV3IEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0U2VsZWN0Q29uZmlnRm9yVmFyaWFibGUodmFyaWFibGU6IGFueSk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3Qgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSAodmFyaWFibGUub3B0aW9ucyB8fCBbXSkubWFwKChvcHQ6IHN0cmluZykgPT4gKHtcbiAgICAgIGlkOiBvcHQsXG4gICAgICB2YWx1ZTogb3B0LFxuICAgICAgbmFtZTogb3B0LFxuICAgICAgbGFiZWw6IG9wdFxuICAgIH0pKTtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiB2YXJpYWJsZS5uYW1lLFxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSkpIHtcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKiogVXBkYXRlIHRlc3QgZGF0YSBwcm9maWxlIHNlbGVjdCBjb25maWcgd2l0aCBjdXJyZW50IG9wdGlvbnMgYW5kIHNlbGVjdGVkVmFsdWUgKGZvckxvb3BUZXN0RGF0YUlkKS4gRW5zdXJlIHNlbGVjdGVkIGlkIGlzIGluIG9wdGlvbnMgc28gbWF0LXNlbGVjdCBjYW4gZGlzcGxheSBpdC4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgbGV0IG9wdGlvbnMgPSB0aGlzLmNvbnZlcnREYXRhUHJvZmlsZU9wdGlvbnNUb1NlbGVjdE9wdGlvbnModGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMpO1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBmb3JMb29wVGVzdERhdGFJZCA9IGNmZz8uZm9yTG9vcFRlc3REYXRhSWQgPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFRlc3REYXRhSWQgPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnRlc3REYXRhSWQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRWYWwgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/IHRoaXMuZ2V0VGVzdERhdGFQcm9maWxlRm9ybVZhbHVlKCkgOiB1bmRlZmluZWQ7XG4gICAgLy8gSWYgd2UgaGF2ZSBhIHByZXNlbGVjdGVkIGlkIGJ1dCBpdCdzIG5vdCBpbiB0aGUgY3VycmVudCBvcHRpb25zIGxpc3QgKGUuZy4gb3B0aW9ucyBub3QgbG9hZGVkIHlldCksIGFkZCBhIHBsYWNlaG9sZGVyIG9wdGlvbiBzbyB0aGUgZHJvcGRvd24gY2FuIHNob3cgdGhlIHNlbGVjdGlvblxuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnZm9yJyAmJiBmb3JMb29wVGVzdERhdGFJZCAhPSBudWxsKSB7XG4gICAgICBjb25zdCBpZFN0ciA9IFN0cmluZyhmb3JMb29wVGVzdERhdGFJZCk7XG4gICAgICBjb25zdCBhbHJlYWR5SW5MaXN0ID0gb3B0aW9ucy5zb21lKChvOiBTZWxlY3RPcHRpb24pID0+IFN0cmluZyhvLmlkID8/IG8udmFsdWUpID09PSBpZFN0cik7XG4gICAgICBpZiAoIWFscmVhZHlJbkxpc3QpIHtcbiAgICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSB0aGlzLnRlc3REYXRhUHJvZmlsZSB8fCAnU2VsZWN0ZWQgcHJvZmlsZSc7XG4gICAgICAgIG9wdGlvbnMgPSBbeyBpZDogZm9yTG9vcFRlc3REYXRhSWQsIHZhbHVlOiBmb3JMb29wVGVzdERhdGFJZCwgbmFtZTogZGlzcGxheU5hbWUsIGxhYmVsOiBkaXNwbGF5TmFtZSB9LCAuLi5vcHRpb25zXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICd0ZXN0RGF0YVByb2ZpbGUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdUZXN0ZGF0YXByb2ZpbGUnLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgIGluaXRpYWxGZXRjaE9uT3BlbjogdHJ1ZSxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZURhdGFQcm9maWxlcyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdEYXRhUHJvZmlsZXMsXG4gICAgICBvcHRpb25zLFxuICAgICAgLi4uKHNlbGVjdGVkVmFsICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0ZWRWYWwgIT09ICcnICYmIHsgc2VsZWN0ZWRWYWx1ZTogc2VsZWN0ZWRWYWwgfSksXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkRhdGFQcm9maWxlQ2hhbmdlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5vblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeSk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMub25Mb2FkTW9yZURhdGFQcm9maWxlcyhxdWVyeSB8fCAnJyk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKiogVXBkYXRlIExvb3AgU3RhcnQgLyBMb29wIEVuZCBzZWxlY3QgY29uZmlncyB3aXRoIHNlbGVjdGVkVmFsdWUgKGZvckxvb3BTdGFydEluZGV4LCBmb3JMb29wRW5kSW5kZXgpIHNvIGRyb3Bkb3ducyBzaG93IHNlbGVjdGVkICovXG4gIHByaXZhdGUgdXBkYXRlU3RhcnRFbmRTdGVwU2VsZWN0Q29uZmlnc1NlbGVjdGVkVmFsdWVzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXJ0VmFsID0gdGhpcy5nZXRMb29wU3RhcnRGb3JtVmFsdWUoKTtcbiAgICBjb25zdCBlbmRWYWwgPSB0aGlzLmdldExvb3BFbmRGb3JtVmFsdWUoKTtcbiAgICB0aGlzLnN0YXJ0U3RlcFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuc3RhcnRTdGVwU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9uczogdGhpcy5nZXRMb29wU3RhcnRTZWxlY3RPcHRpb25zKCksXG4gICAgICAuLi4oc3RhcnRWYWwgIT0gbnVsbCAmJiB7IHNlbGVjdGVkVmFsdWU6IHN0YXJ0VmFsIH0pLFxuICAgIH07XG4gICAgdGhpcy5lbmRTdGVwU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5lbmRTdGVwU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9uczogdGhpcy5nZXRMb29wRW5kU2VsZWN0T3B0aW9ucygpLFxuICAgICAgLi4uKGVuZFZhbCAhPSBudWxsICYmIHsgc2VsZWN0ZWRWYWx1ZTogZW5kVmFsIH0pLFxuICAgIH07XG4gIH1cblxuICAvKiogVXBkYXRlIGFsbCBGT1IgbG9vcCBzZWxlY3QgY29uZmlncyAodGVzdERhdGFQcm9maWxlLCBzdGFydFN0ZXAsIGVuZFN0ZXApIHdpdGggc2VsZWN0ZWRWYWx1ZSBmcm9tIHN0ZXAgc28gZHJvcGRvd25zIHNob3cgc2VsZWN0ZWQgKi9cbiAgcHJpdmF0ZSB1cGRhdGVGb3JMb29wU2VsZWN0Q29uZmlnc1NlbGVjdGVkVmFsdWVzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy51cGRhdGVTdGFydEVuZFN0ZXBTZWxlY3RDb25maWdzU2VsZWN0ZWRWYWx1ZXMoKTtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0IERhdGFQcm9maWxlT3B0aW9uW10gdG8gU2VsZWN0T3B0aW9uW10gKi9cbiAgcHJpdmF0ZSBjb252ZXJ0RGF0YVByb2ZpbGVPcHRpb25zVG9TZWxlY3RPcHRpb25zKG9wdGlvbnM6IERhdGFQcm9maWxlT3B0aW9uW10pOiBTZWxlY3RPcHRpb25bXSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubWFwKG9wdGlvbiA9PiAoe1xuICAgICAgaWQ6IG9wdGlvbi5pZCxcbiAgICAgIHZhbHVlOiBvcHRpb24uaWQsXG4gICAgICBuYW1lOiBvcHRpb24ubmFtZSxcbiAgICAgIGxhYmVsOiBvcHRpb24ubmFtZVxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKiBEYXRhIGxlbmd0aCAoTikgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZXN0IGRhdGEgcHJvZmlsZTsgMCBpZiBub25lIHNlbGVjdGVkIG9yIG5vdCBmb3VuZC4gKi9cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZFByb2ZpbGVEYXRhTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgY29uc3QgcHJvZmlsZUlkID0gdGhpcy5lZGl0Rm9ybT8uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKT8udmFsdWUgPz8gKHRoaXMuY29uZmlnIGFzIGFueSk/LmZvckxvb3BUZXN0RGF0YUlkID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFRlc3REYXRhSWQgPz8gKHRoaXMuY29uZmlnIGFzIGFueSk/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8udGVzdERhdGFJZDtcbiAgICBpZiAocHJvZmlsZUlkID09IG51bGwgfHwgIXRoaXMuZGF0YVByb2ZpbGVPcHRpb25zPy5sZW5ndGgpIHJldHVybiAwO1xuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChcbiAgICAgIChvOiBEYXRhUHJvZmlsZU9wdGlvbikgPT4gU3RyaW5nKG8uaWQpID09PSBTdHJpbmcocHJvZmlsZUlkKSB8fCBvLmlkID09PSBwcm9maWxlSWRcbiAgICApO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiAwO1xuICAgIGNvbnN0IGxlbiA9IChtYXRjaC5kYXRhICYmIEFycmF5LmlzQXJyYXkobWF0Y2guZGF0YSkgPyBtYXRjaC5kYXRhLmxlbmd0aCA6IDApIHx8IChtYXRjaC5kYXRhTGVuZ3RoID8/IDApO1xuICAgIHJldHVybiB0eXBlb2YgbGVuID09PSAnbnVtYmVyJyA/IGxlbiA6IDA7XG4gIH1cblxuICAvKiogTG9vcCBTdGFydC9FbmQgb3B0aW9uczogMSB0byBOIGJhc2VkIG9uIHNlbGVjdGVkIGRhdGEgcHJvZmlsZSdzIGRhdGEgYXJyYXkgbGVuZ3RoOyBmYWxscyBiYWNrIHRvIDEuLjEwIGlmIG5vIHByb2ZpbGUuICovXG4gIGdldExvb3BTdGVwT3B0aW9ucygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgTiA9IHRoaXMuZ2V0U2VsZWN0ZWRQcm9maWxlRGF0YUxlbmd0aCgpO1xuICAgIGNvbnN0IG1heCA9IE4gPiAwID8gTiA6IFRlc3RDYXNlTG9vcFN0ZXBDb21wb25lbnQuREVGQVVMVF9MT09QX09QVElPTlNfTUFYO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBtYXggfSwgKF8sIGkpID0+IGkgKyAxKTtcbiAgfVxuXG4gIC8qKiBTZW50aW5lbCB2YWx1ZSBmb3IgXCJTdGFydFwiIC8gXCJFbmRcIiBvcHRpb25zIChzYW1lIGFzIG9sZCBVSSkuICovXG4gIHN0YXRpYyByZWFkb25seSBMT09QX0lOREVYX1NUQVJUID0gLTE7XG4gIHN0YXRpYyByZWFkb25seSBMT09QX0lOREVYX0VORCA9IC0xO1xuXG4gIC8qKiBMb29wIFN0YXJ0L0VuZCBzZWxlY3Qgb3B0aW9uczogc2FtZSBpbmRpY2VzIGFzIGdldExvb3BTdGVwT3B0aW9ucygpLCB3aXRoIGxhYmVsIFwibmFtZSAoaW5kZXgpXCIgd2hlbiBwcm9maWxlIGRhdGEgaGFzIHJvdyBuYW1lcywgZWxzZSBcIlN0ZXAgKGluZGV4KVwiLiAqL1xuICBwcml2YXRlIGdldExvb3BTdGVwU2VsZWN0T3B0aW9ucygpOiBTZWxlY3RPcHRpb25bXSB7XG4gICAgY29uc3QgaW5kaWNlcyA9IHRoaXMuZ2V0TG9vcFN0ZXBPcHRpb25zKCk7XG4gICAgcmV0dXJuIGluZGljZXMubWFwKChuKSA9PiB7XG4gICAgICBjb25zdCByb3dOYW1lID0gdGhpcy5nZXREYXRhUm93TmFtZUZvck9uZUJhc2VkSW5kZXgobik7XG4gICAgICBjb25zdCBsYWJlbCA9IHJvd05hbWUgPyBgJHtyb3dOYW1lfSAoJHtufSlgIDogYFN0ZXAgKCR7bn0pYDtcbiAgICAgIHJldHVybiB7IGlkOiBuLCB2YWx1ZTogbiwgbmFtZTogbGFiZWwsIGxhYmVsIH07XG4gICAgfSk7XG4gIH1cblxuICAvKiogTG9vcCBTdGFydCBkcm9wZG93biBvcHRpb25zOiBcIlN0YXJ0XCIgKHZhbHVlIC0xKSBmaXJzdCwgdGhlbiBkYXRhIHJvd3MuIFNhbWUgdmFsdWVzIGFzIG9sZCBVSS4gKi9cbiAgcHJpdmF0ZSBnZXRMb29wU3RhcnRTZWxlY3RPcHRpb25zKCk6IFNlbGVjdE9wdGlvbltdIHtcbiAgICBjb25zdCBzdGFydE9wdGlvbjogU2VsZWN0T3B0aW9uID0ge1xuICAgICAgaWQ6IFRlc3RDYXNlTG9vcFN0ZXBDb21wb25lbnQuTE9PUF9JTkRFWF9TVEFSVCxcbiAgICAgIHZhbHVlOiBUZXN0Q2FzZUxvb3BTdGVwQ29tcG9uZW50LkxPT1BfSU5ERVhfU1RBUlQsXG4gICAgICBuYW1lOiAnU3RhcnQnLFxuICAgICAgbGFiZWw6ICdTdGFydCcsXG4gICAgfTtcbiAgICByZXR1cm4gW3N0YXJ0T3B0aW9uLCAuLi50aGlzLmdldExvb3BTdGVwU2VsZWN0T3B0aW9ucygpXTtcbiAgfVxuXG4gIC8qKiBMb29wIEVuZCBkcm9wZG93biBvcHRpb25zOiBkYXRhIHJvd3MgZmlyc3QsIHRoZW4gXCJFbmRcIiAodmFsdWUgLTEpIGxhc3QuIFNhbWUgdmFsdWVzIGFzIG9sZCBVSS4gKi9cbiAgcHJpdmF0ZSBnZXRMb29wRW5kU2VsZWN0T3B0aW9ucygpOiBTZWxlY3RPcHRpb25bXSB7XG4gICAgY29uc3QgZW5kT3B0aW9uOiBTZWxlY3RPcHRpb24gPSB7XG4gICAgICBpZDogVGVzdENhc2VMb29wU3RlcENvbXBvbmVudC5MT09QX0lOREVYX0VORCxcbiAgICAgIHZhbHVlOiBUZXN0Q2FzZUxvb3BTdGVwQ29tcG9uZW50LkxPT1BfSU5ERVhfRU5ELFxuICAgICAgbmFtZTogJ0VuZCcsXG4gICAgICBsYWJlbDogJ0VuZCcsXG4gICAgfTtcbiAgICByZXR1cm4gWy4uLnRoaXMuZ2V0TG9vcFN0ZXBTZWxlY3RPcHRpb25zKCksIGVuZE9wdGlvbl07XG4gIH1cblxuICAvKiogSGFuZGxlIGRhdGEgcHJvZmlsZSBzZWxlY3Rpb246IHVwZGF0ZSBkaXNwbGF5LCBjbGFtcCBzdGFydC9lbmQgdG8gbmV3IHByb2ZpbGUgcmFuZ2UsIHJlZnJlc2ggc3RhcnQvZW5kIGRyb3Bkb3ducy4gKi9cbiAgcHJpdmF0ZSBvbkRhdGFQcm9maWxlQ2hhbmdlKHByb2ZpbGVJZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRlc3REYXRhUHJvZmlsZUNoYW5nZShwcm9maWxlSWQpO1xuICAgIGlmICh0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuO1xuICAgIGNvbnN0IE4gPSB0aGlzLmdldFNlbGVjdGVkUHJvZmlsZURhdGFMZW5ndGgoKTtcbiAgICBpZiAoTiA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldExvb3BTdGVwT3B0aW9ucygpO1xuICAgIGNvbnN0IG1heFZhbCA9IG9wdGlvbnMubGVuZ3RoID4gMCA/IG9wdGlvbnNbb3B0aW9ucy5sZW5ndGggLSAxXSA6IDE7XG4gICAgbGV0IHN0YXJ0VmFsID0gdGhpcy5lZGl0Rm9ybT8uZ2V0KCdzdGFydFN0ZXAnKT8udmFsdWUgPz8gdGhpcy5zdGFydFN0ZXA7XG4gICAgbGV0IGVuZFZhbCA9IHRoaXMuZWRpdEZvcm0/LmdldCgnZW5kU3RlcCcpPy52YWx1ZSA/PyB0aGlzLmVuZFN0ZXA7XG4gICAgaWYgKHN0YXJ0VmFsICE9IG51bGwgJiYgc3RhcnRWYWwgPiBtYXhWYWwpIHN0YXJ0VmFsID0gbWF4VmFsO1xuICAgIGlmIChlbmRWYWwgIT0gbnVsbCAmJiBlbmRWYWwgPiBtYXhWYWwpIGVuZFZhbCA9IG1heFZhbDtcbiAgICBpZiAoc3RhcnRWYWwgIT0gbnVsbCAmJiBlbmRWYWwgIT0gbnVsbCAmJiBzdGFydFZhbCA+IGVuZFZhbCkgZW5kVmFsID0gc3RhcnRWYWw7XG4gICAgaWYgKHRoaXMuZWRpdEZvcm0pIHtcbiAgICAgIGlmIChzdGFydFZhbCAhPSBudWxsKSB0aGlzLmVkaXRGb3JtLmdldCgnc3RhcnRTdGVwJyk/LnNldFZhbHVlKHN0YXJ0VmFsKTtcbiAgICAgIGlmIChlbmRWYWwgIT0gbnVsbCkgdGhpcy5lZGl0Rm9ybS5nZXQoJ2VuZFN0ZXAnKT8uc2V0VmFsdWUoZW5kVmFsKTtcbiAgICB9XG4gICAgdGhpcy5zdGFydFN0ZXAgPSBzdGFydFZhbCA/PyB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbmRTdGVwID0gZW5kVmFsID8/IHVuZGVmaW5lZDtcbiAgICB0aGlzLnVwZGF0ZVN0YXJ0RW5kU3RlcFNlbGVjdENvbmZpZ3NTZWxlY3RlZFZhbHVlcygpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgc2VhcmNoIGZvciBkYXRhIHByb2ZpbGVzICovXG4gIHByaXZhdGUgb25TZWFyY2hEYXRhUHJvZmlsZXMocXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQocXVlcnkpO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBsb2FkIG1vcmUgZGF0YSBwcm9maWxlcyAqL1xuICBwcml2YXRlIG9uTG9hZE1vcmVEYXRhUHJvZmlsZXMocXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSk7XG4gIH1cblxuICBvbkVkaXRGb3JtRmllbGRDaGFuZ2UoY29udHJvbE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0uZ2V0KGNvbnRyb2xOYW1lKT8uc2V0VmFsdWUodmFsdWUpO1xuICB9XG5cbiAgZ2V0TG9vcFR5cGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdGT1IgTE9PUCcgOiAnV0hJTEUgTE9PUCc7XG4gIH1cblxuICBpc1doaWxlTG9vcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJztcbiAgfVxuXG4gIGlzRm9yTG9vcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ2Zvcic7XG4gIH1cblxuICBnZXRTdGFydExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gJ1NUQVJUIEZPUicgOiAnU1RBUlQgV0hJTEUnO1xuICB9XG5cbiAgZ2V0RW5kTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyAnRU5EIEZPUicgOiAnRU5EIFdISUxFJztcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGRpc3BsYXkgc3RhcnQgaW5kZXg6IHByZWZlciBmb3JMb29wU3RhcnRJbmRleCBmcm9tIHN0ZXAgKG9yIGRhdGFNYXBKc29uL2RhdGFNYXBCZWFuKSwgZWxzZSBzdGFydFN0ZXAsIGVsc2UgZnJvbSBuZXN0ZWQgc3RlcHMgKi9cbiAgcHJpdmF0ZSBnZXREaXNwbGF5U3RhcnRJbmRleCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB2ID0gY2ZnPy5mb3JMb29wU3RhcnRJbmRleCA/PyBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wU3RhcnRJbmRleCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uc3RhcnRJbmRleDtcbiAgICBpZiAodiAhPSBudWxsKSByZXR1cm4gTnVtYmVyKHYpO1xuICAgIGlmICh0aGlzLnN0YXJ0U3RlcCAhPSBudWxsKSByZXR1cm4gdGhpcy5zdGFydFN0ZXA7XG4gICAgcmV0dXJuIHRoaXMubmVzdGVkU3RlcHNbMF0/LnN0ZXBOdW1iZXIgYXMgbnVtYmVyIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFJlc29sdmUgZGlzcGxheSBlbmQgaW5kZXg6IHByZWZlciBmb3JMb29wRW5kSW5kZXggZnJvbSBzdGVwIChvciBkYXRhTWFwSnNvbi9kYXRhTWFwQmVhbiksIGVsc2UgZW5kU3RlcCwgZWxzZSBmcm9tIG5lc3RlZCBzdGVwcyAqL1xuICBwcml2YXRlIGdldERpc3BsYXlFbmRJbmRleCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB2ID0gY2ZnPy5mb3JMb29wRW5kSW5kZXggPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcEVuZEluZGV4ID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5lbmRJbmRleDtcbiAgICBpZiAodiAhPSBudWxsKSByZXR1cm4gTnVtYmVyKHYpO1xuICAgIGlmICh0aGlzLmVuZFN0ZXAgIT0gbnVsbCkgcmV0dXJuIHRoaXMuZW5kU3RlcDtcbiAgICBjb25zdCBsYXN0ID0gdGhpcy5uZXN0ZWRTdGVwc1t0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiBsYXN0Py5zdGVwTnVtYmVyIGFzIG51bWJlciB8IHVuZGVmaW5lZCA/PyB0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGRpc3BsYXkgcHJvZmlsZSBuYW1lOiBtYXAgZm9yTG9vcFRlc3REYXRhSWQgdG8gcHJvZmlsZSBuYW1lIGZyb20gZGF0YVByb2ZpbGVPcHRpb25zLCBlbHNlIHVzZSB0ZXN0RGF0YVByb2ZpbGUgKi9cbiAgcHJpdmF0ZSBnZXREaXNwbGF5VGVzdERhdGFQcm9maWxlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBpZCA9IGNmZz8uZm9yTG9vcFRlc3REYXRhSWQgPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFRlc3REYXRhSWQgPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnRlc3REYXRhSWQ7XG4gICAgaWYgKGlkICE9IG51bGwgJiYgdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5maW5kKFxuICAgICAgICBvID0+IG8uaWQgPT09IGlkIHx8IFN0cmluZyhvLmlkKSA9PT0gU3RyaW5nKGlkKVxuICAgICAgKTtcbiAgICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoLm5hbWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRlc3REYXRhUHJvZmlsZSA/PyAnJztcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHNlbGVjdGVkIGRhdGEgcHJvZmlsZSAoYnkgZm9yTG9vcFRlc3REYXRhSWQgb3IgZm9ybSB2YWx1ZSksIG9yIG51bGwuICovXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWREYXRhUHJvZmlsZSgpOiBEYXRhUHJvZmlsZU9wdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IHByb2ZpbGVJZCA9IHRoaXMuZWRpdEZvcm0/LmdldCgndGVzdERhdGFQcm9maWxlJyk/LnZhbHVlID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5mb3JMb29wVGVzdERhdGFJZCA/PyAodGhpcy5jb25maWcgYXMgYW55KT8uZGF0YU1hcEpzb24/LmZvckxvb3BUZXN0RGF0YUlkID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnRlc3REYXRhSWQ7XG4gICAgaWYgKHByb2ZpbGVJZCA9PSBudWxsIHx8ICF0aGlzLmRhdGFQcm9maWxlT3B0aW9ucz8ubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAobzogRGF0YVByb2ZpbGVPcHRpb24pID0+IFN0cmluZyhvLmlkKSA9PT0gU3RyaW5nKHByb2ZpbGVJZCkgfHwgby5pZCA9PT0gcHJvZmlsZUlkXG4gICAgKTtcbiAgICByZXR1cm4gbWF0Y2ggPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBHZXQgZGlzcGxheSBuYW1lIGZvciBhIDEtYmFzZWQgcm93IGluZGV4IGZyb20gdGhlIHNlbGVjdGVkIHByb2ZpbGUncyBkYXRhIGFycmF5IChkYXRhW2luZGV4LTFdLm5hbWUpLiBSZXR1cm5zIG51bGwgaWYgbm8gbmFtZS4gKi9cbiAgcHJpdmF0ZSBnZXREYXRhUm93TmFtZUZvck9uZUJhc2VkSW5kZXgob25lQmFzZWRJbmRleDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgcHJvZmlsZSA9IHRoaXMuZ2V0U2VsZWN0ZWREYXRhUHJvZmlsZSgpO1xuICAgIGlmICghcHJvZmlsZT8uZGF0YSB8fCAhQXJyYXkuaXNBcnJheShwcm9maWxlLmRhdGEpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpZHggPSBvbmVCYXNlZEluZGV4IC0gMTtcbiAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gcHJvZmlsZS5kYXRhLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgcm93ID0gcHJvZmlsZS5kYXRhW2lkeF07XG4gICAgcmV0dXJuIHJvdyAmJiAocm93Lm5hbWUgIT0gbnVsbCA/IFN0cmluZyhyb3cubmFtZSkgOiBudWxsKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRlc3QgZGF0YSBwcm9maWxlIGlzIHNldCAoc28gd2UgY2FuIHNob3cvaGlkZSB0aGUgY2hpcCkgKi9cbiAgaGFzVGVzdERhdGFQcm9maWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldERpc3BsYXlUZXN0RGF0YVByb2ZpbGVOYW1lKCkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHN0YXJ0IHZhbHVlIGlzIGV4cGxpY2l0bHkgc2V0IChjb25maWcgb3Igc3RhcnRTdGVwIGlucHV0KSwgbm90IGluZmVycmVkIGZyb20gbmVzdGVkIHN0ZXBzICovXG4gIGhhc1N0YXJ0VmFsdWUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHYgPSBjZmc/LmZvckxvb3BTdGFydEluZGV4ID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BTdGFydEluZGV4ID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5zdGFydEluZGV4O1xuICAgIGlmICh2ICE9IG51bGwpIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLnN0YXJ0U3RlcCAhPSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogV2hldGhlciBlbmQgdmFsdWUgaXMgZXhwbGljaXRseSBzZXQgKGNvbmZpZyBvciBlbmRTdGVwIGlucHV0KSwgbm90IGluZmVycmVkIGZyb20gbmVzdGVkIHN0ZXBzICovXG4gIGhhc0VuZFZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB2ID0gY2ZnPy5mb3JMb29wRW5kSW5kZXggPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcEVuZEluZGV4ID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5lbmRJbmRleDtcbiAgICBpZiAodiAhPSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5lbmRTdGVwICE9IG51bGwpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldFN0ZXBzU3VtbWFyeSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcwIHN0ZXBzJztcbiAgICB9XG4gICAgY29uc3QgY291bnQgPSB0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aDtcbiAgICBsZXQgc3RhcnRWYWw6IG51bWJlciB8IHN0cmluZyA9IHRoaXMuZ2V0RGlzcGxheVN0YXJ0SW5kZXgoKTtcbiAgICBsZXQgZW5kVmFsOiBudW1iZXIgfCBzdHJpbmcgPSB0aGlzLmdldERpc3BsYXlFbmRJbmRleCgpO1xuICAgIC8vIC0xIG1lYW5zIFwiU3RhcnRcIi9cIkVuZFwiIHBsYWNlaG9sZGVyOyB1c2UgYWN0dWFsIHN0ZXAgbnVtYmVycyBmcm9tIG5lc3RlZCBzdGVwcyAoZS5nLiAxLjEsIDEuMTMpXG4gICAgaWYgKHN0YXJ0VmFsID09IG51bGwgfHwgc3RhcnRWYWwgPT09IC0xKSB7XG4gICAgICBzdGFydFZhbCA9ICh0aGlzLm5lc3RlZFN0ZXBzWzBdIGFzIGFueSk/LnN0ZXBOdW1iZXIgPz8gMTtcbiAgICB9XG4gICAgaWYgKGVuZFZhbCA9PSBudWxsIHx8IGVuZFZhbCA9PT0gLTEpIHtcbiAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLm5lc3RlZFN0ZXBzW3RoaXMubmVzdGVkU3RlcHMubGVuZ3RoIC0gMV07XG4gICAgICBlbmRWYWwgPSAobGFzdCBhcyBhbnkpPy5zdGVwTnVtYmVyID8/IGNvdW50O1xuICAgIH1cbiAgICByZXR1cm4gYFN0ZXBzICR7c3RhcnRWYWx9LSR7ZW5kVmFsfSAoJHtjb3VudH0gc3RlcCR7Y291bnQgIT09IDEgPyAncycgOiAnJ30pYDtcbiAgfVxuXG4gIGdldFN0YXJ0U3RlcExhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmdldERpc3BsYXlTdGFydEluZGV4KCk7XG4gICAgaWYgKHN0YXJ0ID09IG51bGwpIHJldHVybiBgU3RhcnQ6ICR7dGhpcy5uZXN0ZWRTdGVwc1swXT8uc3RlcE51bWJlciA/PyAxfWA7XG4gICAgLy8gSWYgc3RhcnQgaXMgLTEsIHVzZXIgc2VsZWN0ZWQgXCJTdGFydFwiIG9wdGlvbiwganVzdCByZXR1cm4gXCJTdGFydFwiXG4gICAgaWYgKHN0YXJ0ID09PSAtMSkgcmV0dXJuICdTdGFydCc7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KHN0YXJ0KTtcbiAgICByZXR1cm4gbmFtZSAhPSBudWxsID8gYFN0YXJ0OiAke25hbWV9YCA6IGBTdGFydDogJHtzdGFydH1gO1xuICB9XG5cbiAgZ2V0RW5kU3RlcExhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZW5kID0gdGhpcy5nZXREaXNwbGF5RW5kSW5kZXgoKTtcbiAgICBpZiAoZW5kID09IG51bGwpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRFbmQgPSB0aGlzLm5lc3RlZFN0ZXBzW3RoaXMubmVzdGVkU3RlcHMubGVuZ3RoIC0gMV0/LnN0ZXBOdW1iZXIgPz8gdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgICByZXR1cm4gYEVuZDogJHtkZWZhdWx0RW5kfWA7XG4gICAgfVxuICAgIC8vIElmIGVuZCBpcyAtMSwgdXNlciBzZWxlY3RlZCBcIkVuZFwiIG9wdGlvbiwganVzdCByZXR1cm4gXCJFbmRcIlxuICAgIGlmIChlbmQgPT09IC0xKSByZXR1cm4gJ0VuZCc7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KGVuZCk7XG4gICAgcmV0dXJuIG5hbWUgIT0gbnVsbCA/IGBFbmQ6ICR7bmFtZX1gIDogYEVuZDogJHtlbmR9YDtcbiAgfVxuXG4gIGdldFRlc3REYXRhUHJvZmlsZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGlzcGxheVRlc3REYXRhUHJvZmlsZU5hbWUoKTtcbiAgICBpZiAobmFtZSkgcmV0dXJuIGBUZXN0IERhdGEgcHJvZmlsZTogJHtuYW1lfWA7XG4gICAgcmV0dXJuICdUZXN0IERhdGEgcHJvZmlsZSc7XG4gIH1cblxuICAvKiogQ29tYmluZWQgZGlzcGxheSBmb3IgZm9yIGxvb3Agd2l0aCBIVE1MIGJhZGdlcyAtIHN1cHBvcnRzIHRlc3RfZGF0YSBiYWRnZXMgbGlrZSBjb25kaXRpb24gc3RlcDsgZGF0YS1rZXkvZGF0YS1ldmVudC1rZXkgZW5hYmxlIGNsaWNrLXRvLWVkaXQgKi9cbiAgZ2V0Rm9yTG9vcERpc3BsYXkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgaWYgKGNmZz8uZm9yTG9vcERpc3BsYXlIdG1sKSByZXR1cm4gY2ZnLmZvckxvb3BEaXNwbGF5SHRtbDtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5oYXNUZXN0RGF0YVByb2ZpbGUoKSkge1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGlzcGxheVRlc3REYXRhUHJvZmlsZU5hbWUoKTtcbiAgICAgIHBhcnRzLnB1c2goYFRlc3QgRGF0YSBwcm9maWxlOiA8c3BhbiBkYXRhLWtleT1cInRlc3QtZGF0YVwiIGRhdGEtZXZlbnQta2V5PVwidGVzdERhdGFQcm9maWxlXCIgY2xhc3M9XCJ0ZXN0X2RhdGFcIj4ke3RoaXMuZXNjYXBlRm9yTG9vcEh0bWwobmFtZSl9PC9zcGFuPmApO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNTdGFydFZhbHVlKCkpIHtcbiAgICAgIGNvbnN0IGZ1bGwgPSB0aGlzLmdldFN0YXJ0U3RlcExhYmVsKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGZ1bGwucmVwbGFjZSgvXlN0YXJ0OlxccyovLCAnJyk7XG4gICAgICBwYXJ0cy5wdXNoKGBTdGFydDogPHNwYW4gZGF0YS1rZXk9XCJ0ZXN0LWRhdGFcIiBkYXRhLWV2ZW50LWtleT1cImZvckxvb3BTdGFydEluZGV4XCIgY2xhc3M9XCJ0ZXN0X2RhdGFcIj4ke3RoaXMuZXNjYXBlRm9yTG9vcEh0bWwodmFsdWUpfTwvc3Bhbj5gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRW5kVmFsdWUoKSkge1xuICAgICAgY29uc3QgZnVsbCA9IHRoaXMuZ2V0RW5kU3RlcExhYmVsKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGZ1bGwucmVwbGFjZSgvXkVuZDpcXHMqLywgJycpO1xuICAgICAgcGFydHMucHVzaChgRW5kOiA8c3BhbiBkYXRhLWtleT1cInRlc3QtZGF0YVwiIGRhdGEtZXZlbnQta2V5PVwiZm9yTG9vcEVuZEluZGV4XCIgY2xhc3M9XCJ0ZXN0X2RhdGFcIj4ke3RoaXMuZXNjYXBlRm9yTG9vcEh0bWwodmFsdWUpfTwvc3Bhbj5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJywgJyk7XG4gIH1cblxuICBwcml2YXRlIGVzY2FwZUZvckxvb3BIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gJyc7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnRleHRDb250ZW50ID0gdGV4dDtcbiAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcbiAgfVxuXG4gIC8qKiBGdWxsIGRpc3BsYXkgZm9yIHdoaWxlIGxvb3A6IHN1YnN0aXR1dGVzICN7dmFyaWFibGV9IHdpdGggSFRNTCBiYWRnZXMgKGVsZW1lbnQvdGVzdF9kYXRhKSBzbyBjbGlja3Mgb3BlbiBwb3B1cCAtIG1heCBpdGVyYXRpb25zIHNob3duIGFzIHNlcGFyYXRlIGJhZGdlICovXG4gIGdldENvbmRpdGlvbkRpc3BsYXkoKTogc3RyaW5nIHtcbiAgICBsZXQgYmFzZSA9IHRoaXMuY29uZGl0aW9uIHx8ICdlbGVtZW50IFwiLm5vdGlmaWNhdGlvbi1iYWRnZVwiIGV4aXN0cyc7XG4gICAgY29uc3Qgd2l0aFdoaWxlID0gYmFzZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ3doaWxlICcpID8gYmFzZSA6IGBXaGlsZSAke2Jhc2V9YDtcbiAgICAvLyBTdHJpcCAobWF4IE4gaXRlcmF0aW9ucykgZnJvbSB0ZXh0IC0gc2hvd24gYXMgYmFkZ2UgaW5zdGVhZFxuICAgIGNvbnN0IHJlc3VsdCA9IHdpdGhXaGlsZS5yZXBsYWNlKC9cXHMqXFwobWF4XFxzK1xcZCtcXHMraXRlcmF0aW9uc1xcKVxccyokL2ksICcnKS50cmltKCk7XG4gICAgcmV0dXJuIHRoaXMuc3Vic3RpdHV0ZVRlbXBsYXRlVmFyaWFibGVzVG9IdG1sKHJlc3VsdCk7XG4gIH1cblxuICAvKiogU3Vic3RpdHV0ZXMgI3t2YXJpYWJsZX0gcGxhY2Vob2xkZXJzIHdpdGggSFRNTCBiYWRnZSBzcGFucyB1c2luZyBjb25maWcuZXZlbnQgLSBlbmFibGVzIGNsaWNrLXRvLWVkaXQgcG9wdXAgbGlrZSBjb25kaXRpb24gc3RlcCAqL1xuICBwcml2YXRlIHN1YnN0aXR1dGVUZW1wbGF0ZVZhcmlhYmxlc1RvSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCB8fCB0eXBlb2YgdGV4dCAhPT0gJ3N0cmluZycpIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGV2ID0gKHRoaXMuY29uZmlnIGFzIGFueSk/LmV2ZW50ID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy50ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgPz8ge307XG4gICAgaWYgKHR5cGVvZiBldiAhPT0gJ29iamVjdCcgfHwgZXYgPT09IG51bGwpIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGVzY2FwZSA9ICh2OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZGl2LnRleHRDb250ZW50ID0gdjtcbiAgICAgIHJldHVybiBkaXYuaW5uZXJIVE1MO1xuICAgIH07XG4gICAgY29uc3QgZWxlbWVudFZhcnMgPSBbJ2xhYmVsJywgJ2Rlc2NyaXB0aW9uJywgJ2VsZW1lbnQnLCAnc2VsZWN0b3InLCAnYWlfdGFzaycsICdxdWVyeScsICdjdXN0b21fY29kZSddO1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhcnMgPSBbJ2F0dHJpYnV0ZSddO1xuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcI1xceyhbXn1dKylcXH0vZywgKF8sIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBldltrZXldO1xuICAgICAgY29uc3QgZGlzcGxheVZhbCA9IHZhbCAhPSBudWxsICYmIHZhbCAhPT0gJycgPyBTdHJpbmcodmFsKSA6IGtleTtcbiAgICAgIGNvbnN0IGVzY2FwZWQgPSBlc2NhcGUoZGlzcGxheVZhbCk7XG4gICAgICBpZiAoZWxlbWVudFZhcnMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICByZXR1cm4gYDxzcGFuIGRhdGEta2V5PVwiJHtrZXl9XCIgZGF0YS1ldmVudC1rZXk9XCIke2tleX1cIiBjbGFzcz1cImVsZW1lbnRcIj4ke2VzY2FwZWR9PC9zcGFuPmA7XG4gICAgICB9XG4gICAgICBpZiAoYXR0cmlidXRlVmFycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBgPHNwYW4gZGF0YS1rZXk9XCIke2tleX1cIiBkYXRhLWV2ZW50LWtleT1cIiR7a2V5fVwiIGNsYXNzPVwiYXR0cmlidXRlXCI+JHtlc2NhcGVkfTwvc3Bhbj5gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGA8c3BhbiBkYXRhLWtleT1cIiR7a2V5fVwiIGRhdGEtZXZlbnQta2V5PVwiJHtrZXl9XCIgY2xhc3M9XCJ0ZXN0X2RhdGFcIj4ke2VzY2FwZWR9PC9zcGFuPmA7XG4gICAgfSk7XG4gIH1cblxuICAvKiogRXZlbnQga2V5LXZhbHVlIHBhaXJzIGZvciBkaXNwbGF5IChlLmcuIHNlbGVjdG9yLCBlbGVtZW50KSAtIHNhbWUgYXMgY29uZGl0aW9uIHN0ZXAgZ2V0QnJhbmNoRXZlbnREZXRhaWxzRm9yRGlzcGxheSAqL1xuICBnZXRMb29wRXZlbnREZXRhaWxzRm9yRGlzcGxheSgpOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gICAgY29uc3QgZXZlbnQgPSB0aGlzLmNvbmZpZz8uZXZlbnQ7XG4gICAgaWYgKCFldmVudCB8fCB0eXBlb2YgZXZlbnQgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGV2ZW50KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+IGtleSAhPT0gJ2N1c3RvbUV2ZW50JylcbiAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogdmFsdWUgIT0gbnVsbCA/IFN0cmluZyh2YWx1ZSkgOiAnJ1xuICAgICAgfSkpO1xuICB9XG5cbiAgb25Ub2dnbGVFeHBhbmRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gIXRoaXMuZXhwYW5kZWQ7XG4gICAgdGhpcy50b2dnbGVFeHBhbmRlZC5lbWl0KHtjb25maWc6dGhpcy5jb25maWcsIGV4cGFuZGVkOnRoaXMuZXhwYW5kZWR9KTtcbiAgfVxuXG4gIG9uVGVzdERhdGFQcm9maWxlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHZhbHVlO1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25TdGFydFN0ZXBDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc3RhcnRTdGVwID0gdmFsdWU7XG4gICAgdGhpcy5zdGFydFN0ZXBDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbkVuZFN0ZXBDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZW5kU3RlcCA9IHZhbHVlO1xuICAgIHRoaXMuZW5kU3RlcENoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uQ29uZGl0aW9uQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMuY29uZGl0aW9uQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25NYXhJdGVyYXRpb25zQ2hhbmdlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB2YWx1ZTtcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnNDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZXN0ZWRTdGVwQ2hhbmdlLmVtaXQoeyBzdGVwLCBpbmRleCB9KTtcbiAgfVxuXG4gIG9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoZXZlbnQ6IGJvb2xlYW4gfCB7Y29uZmlnOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGV4cGFuZGVkOiBib29sZWFufSwgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gSGFuZGxlIGJvdGggYm9vbGVhbiBhbmQgb2JqZWN0IGZvcm1hdHNcbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnb2JqZWN0JyAmJiBldmVudCAhPT0gbnVsbCAmJiAnZXhwYW5kZWQnIGluIGV2ZW50KSB7XG4gICAgICAvLyBPYmplY3QgZm9ybWF0IGZyb20gc3RlcC1ncm91cDoge2NvbmZpZywgZXhwYW5kZWR9XG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQuZXhwYW5kZWQ7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgZXZlbnQncyBjb25maWcgaXMgYSBzdGVwLWdyb3VwIChub3QgdGhlIGN1cnJlbnQgc3RlcClcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBuZXN0ZWQgc3RlcC1ncm91cCBldmVudHMgYnViYmxlIHVwIGNvcnJlY3RseSBldmVuIHdoZW4gY29uZGl0aW9uIHN0ZXAgaXMgaW5zaWRlIGxvb3Agc3RlcFxuICAgICAgaWYgKHRoaXMuaXNTdGVwR3JvdXAoZXZlbnQuY29uZmlnKSkge1xuICAgICAgICAvLyBSZS1lbWl0IHRoZSB0b2dnbGVFeHBhbmRlZCBldmVudCB3aXRoIHRoZSBvYmplY3QgZm9ybWF0LCBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCBjb25maWdcbiAgICAgICAgLy8gQ2FzdCB0byBzYXRpc2Z5IFR5cGVTY3JpcHQgLSB0aGUgcmVuZGVyZXIgYWNjZXB0cyBUZXN0Q2FzZVN0ZXBDb25maWcgd2hpY2ggaW5jbHVkZXMgU3RlcEdyb3VwQ29uZmlnXG4gICAgICAgIHRoaXMudG9nZ2xlRXhwYW5kZWQuZW1pdCh7Y29uZmlnOiBldmVudC5jb25maWcgYXMgYW55IGFzIExvb3BTdGVwQ29uZmlnLCBleHBhbmRlZDogZXZlbnQuZXhwYW5kZWR9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQm9vbGVhbiBmb3JtYXQgZnJvbSBvdGhlciBzdGVwIHR5cGVzXG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQgYXMgYm9vbGVhbjtcbiAgICB9XG4gICAgdGhpcy5vbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaW5kZXgpO1xuICB9XG5cbiAgb25BZGRTdGVwKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkU3RlcC5lbWl0KCk7XG4gIH1cblxuICAvKiogUmUtZW1pdCBhZGRTdGVwRm9yTG9vcCBmcm9tIG5lc3RlZCBsb29wIHNvIE4tbGV2ZWwgbmVzdGluZyB3b3JrcyAoZW1wdHktc3RhdGUgYWRkIHN0ZXApLiAqL1xuICBvbkFkZFN0ZXBGb3JMb29wRnJvbU5lc3RlZChldmVudDogeyBsb29wU3RlcENvbmZpZzogTG9vcFN0ZXBDb25maWcgfSk6IHZvaWQge1xuICAgIGlmIChldmVudD8ubG9vcFN0ZXBDb25maWcpIHtcbiAgICAgIHRoaXMuYWRkU3RlcC5lbWl0KHsgbG9vcFN0ZXBDb25maWc6IGV2ZW50Lmxvb3BTdGVwQ29uZmlnIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZFN0ZXAuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWxsZWQgZnJvbSBlbXB0eS1zdGF0ZSBwbHVzIG9ubHk7IHNhbWUgYmVoYXZpb3VyIGFzIGFkZC1zdGVwLWJldHdlZW4gKHBhcmVudElkID0gbG9vcCBzdGVwIGlkLCBwb3NpdGlvbiA9IHBhcmVudCArIDEpLiAqL1xuICBvbkFkZFN0ZXBFbXB0eSgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZFN0ZXAuZW1pdCh7IGxvb3BTdGVwQ29uZmlnOiB0aGlzLmNvbmZpZyB9KTtcbiAgfVxuXG4gIG9uRGVsZXRlU3RlcChwYXlsb2FkT3JJbmRleDogYW55LCBpbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGlkeCA9IHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicgPyBpbmRleCA6IHBheWxvYWRPckluZGV4O1xuICAgIGNvbnN0IHBheWxvYWQgPSB0eXBlb2YgaW5kZXggPT09ICdudW1iZXInID8gcGF5bG9hZE9ySW5kZXggOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5kZWxldGVTdGVwLmVtaXQoaWR4KTtcbiAgICBpZiAocGF5bG9hZD8uc3RlcCkgdGhpcy5kZWxldGUuZW1pdChwYXlsb2FkKTtcbiAgfVxuXG4gIC8qKiBSZS1lbWl0IGVkaXQgZnJvbSBuZXN0ZWQgc3RlcCBzbyB0aGUgcG9ydGFsIGNhbiBvcGVuIGVkaXQgbW9kYWwgKHNhbWUgYXMgcm9vdCBsZXZlbCkuICovXG4gIG9uTmVzdGVkRWRpdChldmVudDogeyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGlmIChldmVudD8uc3RlcCAhPSBudWxsKSB0aGlzLmVkaXQuZW1pdChldmVudCBhcyBhbnkpO1xuICB9XG5cbiAgLyoqIFJlLWVtaXQgZHVwbGljYXRlIGZyb20gbmVzdGVkIHN0ZXAgc28gdGhlIHBvcnRhbCBjYW4gZHVwbGljYXRlIChzYW1lIGFzIHJvb3QgbGV2ZWwpLiAqL1xuICBvbk5lc3RlZER1cGxpY2F0ZShldmVudDogYW55LCBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmR1cGxpY2F0ZS5lbWl0KChldmVudCAmJiBldmVudC5zdGVwICE9IG51bGwpID8gZXZlbnQgOiB7IHN0ZXAgfSBhcyBhbnkpO1xuICB9XG5cbiAgaXNOb3JtYWxTdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgTm9ybWFsU3RlcENvbmZpZyB7XG4gICAgcmV0dXJuICdldmVudFR5cGUnIGluIHN0ZXA7XG4gIH1cblxuICBpc0xvb3BTdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgTG9vcFN0ZXBDb25maWcge1xuICAgIHJldHVybiAnbG9vcFR5cGUnIGluIHN0ZXA7XG4gIH1cblxuICBpc0NvbmRpdGlvblN0ZXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBDb25kaXRpb25TdGVwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2NvbmRpdGlvbicgaW4gc3RlcCAmJiAnYnJhbmNoZXMnIGluIHN0ZXA7XG4gIH1cblxuICBpc1N0ZXBHcm91cChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIFN0ZXBHcm91cENvbmZpZyB7XG4gICAgcmV0dXJuICdncm91cE5hbWUnIGluIHN0ZXA7XG4gIH1cblxuICBvbkFkZEJyYW5jaCgpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBsb29wIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBjb25kaXRpb24gc3RlcHNcbiAgfVxuXG4gIG9uRGVsZXRlQnJhbmNoKGJyYW5jaDogYW55KTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gbG9vcCBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgY29uZGl0aW9uIHN0ZXBzXG4gIH1cblxuICBvbk5lc3RlZENvbmRpdGlvbkFkZEJyYW5jaChuZXN0ZWRTdGVwOiBDb25kaXRpb25TdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gQWRkIGEgbmV3IGJyYW5jaCB0byB0aGUgbmVzdGVkIGNvbmRpdGlvbiBzdGVwXG4gICAgaWYgKCFuZXN0ZWRTdGVwLmJyYW5jaGVzKSB7XG4gICAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzID0gW107XG4gICAgfVxuICAgIGNvbnN0IG5ld0JyYW5jaDogQ29uZGl0aW9uQnJhbmNoID0ge1xuICAgICAgdHlwZTogbmVzdGVkU3RlcC5icmFuY2hlcy5sZW5ndGggPT09IDAgPyAnaWYnIDogJ2Vsc2UnLFxuICAgICAgbGFiZWw6IG5lc3RlZFN0ZXAuYnJhbmNoZXMubGVuZ3RoID09PSAwID8gJ0lGIFRSVUUnIDogJ0VMU0UnLCBcbiAgICAgIHN0ZXBUeXBlOiBTdGVwVHlwZXMuQ09ORElUSU9OX0lGLFxuICAgICAgbmVzdGVkU3RlcHM6IFtdXG4gICAgfTtcbiAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzLnB1c2gobmV3QnJhbmNoKTtcbiAgICB0aGlzLm9uTmVzdGVkU3RlcENoYW5nZShuZXN0ZWRTdGVwLCBpbmRleCk7XG4gIH1cblxuICBvbk5lc3RlZENvbmRpdGlvbkRlbGV0ZUJyYW5jaChuZXN0ZWRTdGVwOiBDb25kaXRpb25TdGVwQ29uZmlnLCBicmFuY2g6IGFueSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIFJlLWVtaXQgZGVsZXRlQnJhbmNoIHNvIHN0ZXAtbGlzdCBjYW4gb3BlbiBkZWxldGUgbW9kYWwgYW5kIGNhbGwgQVBJXG4gICAgdGhpcy5kZWxldGVCcmFuY2guZW1pdChicmFuY2gpO1xuICB9XG5cbiAgb25PcGVuRXh0ZXJuYWwoKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gbG9vcCBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgc3RlcCBncm91cHNcbiAgfVxuXG4gIC8qKiBTeW5jIEZPUiBsb29wIGVkaXQgZm9ybSBzbyBkcm9wZG93bnMgc2hvdyBleGlzdGluZyBjb25maWcgKGZvck9wdGlvblR5cGUsIGZvckxvb3BUZXN0RGF0YUlkL3Rlc3REYXRhUHJvZmlsZSwgZm9yTG9vcFN0YXJ0SW5kZXgvZm9yTG9vcEVuZEluZGV4KSAqL1xuICBwcml2YXRlIHN5bmNGb3JMb29wRWRpdEZvcm1Gcm9tQ29uZmlnKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0Rm9ybSB8fCB0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuO1xuICAgIGNvbnN0IHRlc3REYXRhVmFsID0gdGhpcy5nZXRUZXN0RGF0YVByb2ZpbGVGb3JtVmFsdWUoKTtcbiAgICBjb25zdCBzdGFydFZhbCA9IHRoaXMuZ2V0TG9vcFN0YXJ0Rm9ybVZhbHVlKCk7XG4gICAgY29uc3QgZW5kVmFsID0gdGhpcy5nZXRMb29wRW5kRm9ybVZhbHVlKCk7XG4gICAgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIGZvck9wdGlvblR5cGU6IHRoaXMuZ2V0Rm9yT3B0aW9uVHlwZUZyb21Db25maWcoKSA/PyBudWxsLFxuICAgICAgdGVzdERhdGFQcm9maWxlOiB0ZXN0RGF0YVZhbCxcbiAgICAgIHN0YXJ0U3RlcDogc3RhcnRWYWwsXG4gICAgICBlbmRTdGVwOiBlbmRWYWwsXG4gICAgfSk7XG4gICAgLy8gRXhwbGljaXRseSBzZXQgZWFjaCBjb250cm9sIHNvIG1hdC1zZWxlY3QgcGlja3MgdXAgdGhlIHZhbHVlIChwYXRjaFZhbHVlIGNhbiBiZSBpZ25vcmVkIGJ5IGNoaWxkIGluIHNvbWUgdGltaW5nIGNhc2VzKVxuICAgIGNvbnN0IHRlc3REYXRhQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKTtcbiAgICBjb25zdCBzdGFydEN0cmwgPSB0aGlzLmVkaXRGb3JtLmdldCgnc3RhcnRTdGVwJyk7XG4gICAgY29uc3QgZW5kQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdlbmRTdGVwJyk7XG4gICAgaWYgKHRlc3REYXRhQ3RybCAmJiB0ZXN0RGF0YVZhbCAhPT0gdW5kZWZpbmVkICYmIHRlc3REYXRhVmFsICE9PSAnJykgdGVzdERhdGFDdHJsLnNldFZhbHVlKHRlc3REYXRhVmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgaWYgKHN0YXJ0Q3RybCAmJiBzdGFydFZhbCAhPSBudWxsKSBzdGFydEN0cmwuc2V0VmFsdWUoc3RhcnRWYWwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICBpZiAoZW5kQ3RybCAmJiBlbmRWYWwgIT0gbnVsbCkgZW5kQ3RybC5zZXRWYWx1ZShlbmRWYWwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBvbkVkaXQoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0U25hcHNob3QgPSB7XG4gICAgICB0ZXN0RGF0YVByb2ZpbGU6IHRoaXMudGVzdERhdGFQcm9maWxlLFxuICAgICAgc3RhcnRTdGVwOiB0aGlzLnN0YXJ0U3RlcCxcbiAgICAgIGVuZFN0ZXA6IHRoaXMuZW5kU3RlcCxcbiAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24sXG4gICAgICBtYXhJdGVyYXRpb25zOiB0aGlzLm1heEl0ZXJhdGlvbnMsXG4gICAgICBzZWxlY3RlZFRlbXBsYXRlOiB0aGlzLnNlbGVjdGVkVGVtcGxhdGUsXG4gICAgICB0ZW1wbGF0ZVZhcmlhYmxlczogdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA/IFsuLi50aGlzLnRlbXBsYXRlVmFyaWFibGVzXSA6IFtdLFxuICAgICAgY29uZGl0aW9uVGVtcGxhdGVGb3JtVmFsdWU6IHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID8geyAuLi50aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS52YWx1ZSB9IDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgLy8gRk9SIGxvb3A6IHJlZnJlc2ggc2VsZWN0IGNvbmZpZ3MgKHNvIFRlc3QgRGF0YSBQcm9maWxlIG9wdGlvbnMgaW5jbHVkZSBzZWxlY3RlZCBpZCBpZiBuZWVkZWQpIHRoZW4gc3luYyBmb3JtIHNvIGRyb3Bkb3ducyBzaG93IHNlbGVjdGVkXG4gICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZvckxvb3BTZWxlY3RDb25maWdzU2VsZWN0ZWRWYWx1ZXMoKTtcbiAgICAgIHRoaXMuc3luY0Zvckxvb3BFZGl0Rm9ybUZyb21Db25maWcoKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnN5bmNGb3JMb29wRWRpdEZvcm1Gcm9tQ29uZmlnKCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICB0ZXN0RGF0YVByb2ZpbGU6IHRoaXMudGVzdERhdGFQcm9maWxlID8/ICcnLFxuICAgICAgICBzdGFydFN0ZXA6IHRoaXMuc3RhcnRTdGVwID8/IG51bGwsXG4gICAgICAgIGVuZFN0ZXA6IHRoaXMuZW5kU3RlcCA/PyBudWxsLFxuICAgICAgICBjb25kaXRpb246IHRoaXMuY29uZGl0aW9uID8/ICcnLFxuICAgICAgICBtYXhJdGVyYXRpb25zOiB0aGlzLm1heEl0ZXJhdGlvbnMgPz8gNSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgLy8gV2hlbiBuYXR1cmFsVGV4dEFjdGlvbklkIGV4aXN0cywgcG9wdWxhdGUgY29uZGl0aW9uIGFuZCBzZWxlY3RlZCB0ZW1wbGF0ZSBmcm9tIG9wdGlvbnMgc28gYXV0b2NvbXBsZXRlIHNob3dzIHNlbGVjdGVkIHRlbXBsYXRlXG4gICAgICBjb25zdCBjb25maWdXaXRoSWQgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgICBpZiAoY29uZmlnV2l0aElkPy5uYXR1cmFsVGV4dEFjdGlvbklkICE9IG51bGwgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb24oKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25kaXRpb24gfHwgY29uZmlnV2l0aElkPy50ZW1wbGF0ZVZhcmlhYmxlc0RhdGEpIHtcbiAgICAgICAgLy8gRmFsbGJhY2s6IG1hdGNoIGJ5IGNvbmRpdGlvbiB0ZXh0IHdoZW4gbmF0dXJhbFRleHRBY3Rpb25JZCBub3Qgc2V0XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvblN0ciA9IHRoaXMuY29uZGl0aW9uIHx8IGNvbmZpZ1dpdGhJZD8uY29uZGl0aW9uIHx8ICcnO1xuICAgICAgICBpZiAoY29uZGl0aW9uU3RyICYmICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgfHwgW10pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYXMgYW55W10pLmZpbmQoXG4gICAgICAgICAgICAob3B0OiBhbnkpID0+IChvcHQubmF0dXJhbFRleHQgfHwgb3B0Lm5hbWUgfHwgb3B0LnZhbHVlKSA9PT0gY29uZGl0aW9uU3RyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbj8udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgICAgICAgaWYgKGZ1bGxUZW1wbGF0ZSAmJiBmdWxsVGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBmdWxsVGVtcGxhdGU7XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpIHx8IFtdO1xuICAgICAgICAgICAgdGhpcy5idWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgY29uZGl0aW9uOiB0aGlzLmNvbmRpdGlvbiA/PyAnJyxcbiAgICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zID8/IDUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5pc0VkaXRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZWRpdC5lbWl0KCk7XG4gIH1cblxuICBvbkVkaXRBcHBseSgpOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy5lZGl0Rm9ybS52YWx1ZTtcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWx1ZSA9IHYudGVzdERhdGFQcm9maWxlID8/ICcnO1xuICAgIHRoaXMuc3RhcnRTdGVwID0gdi5zdGFydFN0ZXAgPz8gdW5kZWZpbmVkO1xuICAgIHRoaXMuZW5kU3RlcCA9IHYuZW5kU3RlcCA/PyB1bmRlZmluZWQ7XG4gICAgdGhpcy5jb25kaXRpb24gPSB2LmNvbmRpdGlvbiA/PyAnJztcbiAgICBjb25zdCBtYXhWYWwgPSB2Lm1heEl0ZXJhdGlvbnM7XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zID0gdHlwZW9mIG1heFZhbCA9PT0gJ251bWJlcicgPyBtYXhWYWwgOiAobWF4VmFsICE9IG51bGwgJiYgbWF4VmFsICE9PSAnJyA/IE51bWJlcihtYXhWYWwpIDogdW5kZWZpbmVkKTtcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBzZWxlY3RlZCBkYXRhIHByb2ZpbGUgb3B0aW9uIHRvIGdldCBib3RoIElEIGFuZCBuYW1lXG4gICAgbGV0IHRlc3REYXRhUHJvZmlsZUlkOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRlc3REYXRhUHJvZmlsZU5hbWU6IHN0cmluZyA9ICcnO1xuICAgIFxuICAgIGlmICh0ZXN0RGF0YVByb2ZpbGVWYWx1ZSAmJiB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGUgZm9ybSB2YWx1ZSBtaWdodCBiZSBJRCAobnVtYmVyKSBvciBuYW1lIChzdHJpbmcpXG4gICAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5maW5kKFxuICAgICAgICBvcHRpb24gPT4gb3B0aW9uLmlkID09PSBOdW1iZXIodGVzdERhdGFQcm9maWxlVmFsdWUpIHx8IG9wdGlvbi5uYW1lID09PSB0ZXN0RGF0YVByb2ZpbGVWYWx1ZSB8fCBTdHJpbmcob3B0aW9uLmlkKSA9PT0gU3RyaW5nKHRlc3REYXRhUHJvZmlsZVZhbHVlKVxuICAgICAgKTtcbiAgICAgIGlmIChzZWxlY3RlZFByb2ZpbGUpIHtcbiAgICAgICAgdGVzdERhdGFQcm9maWxlSWQgPSBzZWxlY3RlZFByb2ZpbGUuaWQ7XG4gICAgICAgIHRlc3REYXRhUHJvZmlsZU5hbWUgPSBzZWxlY3RlZFByb2ZpbGUubmFtZTtcbiAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB0ZXN0RGF0YVByb2ZpbGVOYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgbm90IGZvdW5kLCB1c2UgdGhlIHZhbHVlIGFzLWlzIChtaWdodCBiZSBJRCBvciBuYW1lKVxuICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZVZhbHVlO1xuICAgICAgICB0ZXN0RGF0YVByb2ZpbGVJZCA9IE51bWJlcih0ZXN0RGF0YVByb2ZpbGVWYWx1ZSkgfHwgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZVZhbHVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBXaGlsZSBsb29wOiBidWlsZCB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgYW5kIG5hdHVyYWxUZXh0QWN0aW9uSWQgZnJvbSBzZWxlY3RlZCB0ZW1wbGF0ZSAoc2FtZSBhcyBjb25kaXRpb24tc3RlcClcbiAgICBsZXQgdGVtcGxhdGVWYXJpYWJsZXNEYXRhOiBhbnk7XG4gICAgbGV0IG5hdHVyYWxUZXh0QWN0aW9uSWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJyAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzPy5sZW5ndGgpIHtcbiAgICAgIHRlbXBsYXRlVmFyaWFibGVzRGF0YSA9IHt9O1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgdGVtcGxhdGVWYXJpYWJsZXNEYXRhW3ZhcmlhYmxlLm5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZT8uaWQgIT0gbnVsbCkge1xuICAgICAgICBuYXR1cmFsVGV4dEFjdGlvbklkID0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlLmlkO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBVcGRhdGUgY29uZmlnIHdpdGggbmV3IHZhbHVlcyAoaW5jbHVkZSB0ZXN0RGF0YVByb2ZpbGVJZCwgdGVtcGxhdGVWYXJpYWJsZXNEYXRhLCBuYXR1cmFsVGV4dEFjdGlvbklkIGZvciB3aGlsZTsgZm9yTG9vcFRlc3REYXRhSWQsIGZvckxvb3BTdGFydEluZGV4L2Zvckxvb3BFbmRJbmRleCBmb3IgZm9yKVxuICAgIGNvbnN0IHVwZGF0ZWRDb25maWc6IExvb3BTdGVwQ29uZmlnICYgeyB0ZXN0RGF0YVByb2ZpbGVJZD86IHN0cmluZyB8IG51bWJlcjsgdGVtcGxhdGVWYXJpYWJsZXNEYXRhPzogYW55OyBuYXR1cmFsVGV4dEFjdGlvbklkPzogbnVtYmVyIH0gPSB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogdGhpcy50ZXN0RGF0YVByb2ZpbGUsXG4gICAgICB0ZXN0RGF0YVByb2ZpbGVJZDogdGVzdERhdGFQcm9maWxlSWQsIC8vIEFkZCBJRCBmb3IgQVBJIGNhbGxcbiAgICAgIHN0YXJ0U3RlcDogdGhpcy5zdGFydFN0ZXAsXG4gICAgICBlbmRTdGVwOiB0aGlzLmVuZFN0ZXAsXG4gICAgICBjb25kaXRpb246IHRoaXMuY29uZGl0aW9uLFxuICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zLFxuICAgICAgLi4uKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScgJiYgT2JqZWN0LmtleXModGVtcGxhdGVWYXJpYWJsZXNEYXRhIHx8IHt9KS5sZW5ndGggPiAwICYmIHsgdGVtcGxhdGVWYXJpYWJsZXNEYXRhIH0pLFxuICAgICAgLi4uKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScgJiYgbmF0dXJhbFRleHRBY3Rpb25JZCAhPSBudWxsICYmIHsgbmF0dXJhbFRleHRBY3Rpb25JZCB9KSxcbiAgICAgIC4uLih0aGlzLmxvb3BUeXBlID09PSAnZm9yJyAmJiB0ZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmIHsgZm9yTG9vcFRlc3REYXRhSWQ6IE51bWJlcih0ZXN0RGF0YVByb2ZpbGVJZCkgfSksXG4gICAgICAuLi4odGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgJiYgdGhpcy5zdGFydFN0ZXAgIT0gbnVsbCAmJiB7IGZvckxvb3BTdGFydEluZGV4OiB0aGlzLnN0YXJ0U3RlcCB9KSxcbiAgICAgIC4uLih0aGlzLmxvb3BUeXBlID09PSAnZm9yJyAmJiB0aGlzLmVuZFN0ZXAgIT0gbnVsbCAmJiB7IGZvckxvb3BFbmRJbmRleDogdGhpcy5lbmRTdGVwIH0pLFxuICAgIH07XG4gICAgXG4gICAgLy8gRW1pdCBpbmRpdmlkdWFsIGNoYW5nZSBldmVudHNcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZUNoYW5nZS5lbWl0KHRoaXMudGVzdERhdGFQcm9maWxlKTtcbiAgICB0aGlzLnN0YXJ0U3RlcENoYW5nZS5lbWl0KHRoaXMuc3RhcnRTdGVwID8/IDEpO1xuICAgIHRoaXMuZW5kU3RlcENoYW5nZS5lbWl0KHRoaXMuZW5kU3RlcCA/PyAxKTtcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgdGhpcy5jb25kaXRpb25DaGFuZ2UuZW1pdCh0aGlzLmNvbmRpdGlvbik7XG4gICAgICB0aGlzLm1heEl0ZXJhdGlvbnNDaGFuZ2UuZW1pdCh0aGlzLm1heEl0ZXJhdGlvbnMgPz8gNSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEVtaXQgc3RlcCB1cGRhdGUgZXZlbnQgd2l0aCBmdWxsIGNvbmZpZ1xuICAgIGNvbnNvbGUubG9nKCdMb29wLXN0ZXA6IEVtaXR0aW5nIHN0ZXBVcGRhdGUgZXZlbnQnLCB1cGRhdGVkQ29uZmlnKTtcbiAgICB0aGlzLnN0ZXBVcGRhdGUuZW1pdCh1cGRhdGVkQ29uZmlnKTtcbiAgICBcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgb25FZGl0Q2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGhpcy5lZGl0U25hcHNob3QudGVzdERhdGFQcm9maWxlO1xuICAgIHRoaXMuc3RhcnRTdGVwID0gdGhpcy5lZGl0U25hcHNob3Quc3RhcnRTdGVwO1xuICAgIHRoaXMuZW5kU3RlcCA9IHRoaXMuZWRpdFNuYXBzaG90LmVuZFN0ZXA7XG4gICAgdGhpcy5jb25kaXRpb24gPSB0aGlzLmVkaXRTbmFwc2hvdC5jb25kaXRpb247XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zID0gdGhpcy5lZGl0U25hcHNob3QubWF4SXRlcmF0aW9ucztcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSB0aGlzLmVkaXRTbmFwc2hvdC5zZWxlY3RlZFRlbXBsYXRlO1xuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB0aGlzLmVkaXRTbmFwc2hvdC50ZW1wbGF0ZVZhcmlhYmxlcyB8fCBbXTtcbiAgICBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gJiYgdGhpcy5lZGl0U25hcHNob3QuY29uZGl0aW9uVGVtcGxhdGVGb3JtVmFsdWUpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtLnBhdGNoVmFsdWUodGhpcy5lZGl0U25hcHNob3QuY29uZGl0aW9uVGVtcGxhdGVGb3JtVmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgb25FZGl0SW5EZXB0aCh0ZW1wbGF0ZU92ZXJyaWRlPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5tb3JlT3B0aW9ucy5lbWl0KCk7XG4gICAgLy8gVXNlIHJlbmRlcmVyJ3MgaW5kZXggd2hlbiBhdmFpbGFibGUgKGNvcnJlY3QgZm9yIHN0cnVjdHVyYWwgc3RlcHMpLiBzdGVwTnVtYmVyIFwiMTAuM1wiIHBhcnNlcyB0byAxMCAtIHdyb25nLlxuICAgIGNvbnN0IGluZGV4ID0gdHlwZW9mIHRoaXMuaW5kZXggPT09ICdudW1iZXInXG4gICAgICA/IHRoaXMuaW5kZXhcbiAgICAgIDogKHR5cGVvZiB0aGlzLnN0ZXBOdW1iZXIgPT09ICdudW1iZXInID8gdGhpcy5zdGVwTnVtYmVyIDogKHR5cGVvZiB0aGlzLnN0ZXBOdW1iZXIgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQodGhpcy5zdGVwTnVtYmVyLCAxMCkgOiAwKSk7XG4gICAgY29uc3QgcGF5bG9hZDogeyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXI7IHRlbXBsYXRlT3ZlcnJpZGU/OiBhbnkgfSA9IHtcbiAgICAgIHN0ZXA6IHRoaXMuY29uZmlnIGFzIFRlc3RDYXNlU3RlcENvbmZpZyxcbiAgICAgIGluZGV4OiBpc05hTihpbmRleCBhcyBudW1iZXIpID8gMCA6IChpbmRleCBhcyBudW1iZXIpLFxuICAgIH07XG4gICAgaWYgKHRlbXBsYXRlT3ZlcnJpZGUpIHtcbiAgICAgIHBheWxvYWQudGVtcGxhdGVPdmVycmlkZSA9IHRlbXBsYXRlT3ZlcnJpZGU7XG4gICAgfVxuICAgIHRoaXMuZWRpdEluRGVwdGguZW1pdChwYXlsb2FkKTtcbiAgfVxuXG4gIG9uTGluaygpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBsb29wIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBzdGVwIGdyb3Vwc1xuICB9XG5cbiAgb25EdXBsaWNhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kdXBsaWNhdGUuZW1pdCgpO1xuICB9XG5cbiAgb25EZWxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGUuZW1pdCgpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2UoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoY2hlY2tlZCk7XG4gIH1cblxuICBvbk1vcmVPcHRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMubW9yZU9wdGlvbnMuZW1pdCgpO1xuICB9XG5cbiAgb25WaWV3RGV0YWlscyhldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbiB8fCB0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbi50cmltKCkgPT09ICcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBjb25zdCB0aXRsZSA9IHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gJ0ZPUiBMT09QIERldGFpbHMnIDogJ1dISUxFIExPT1AgRGV0YWlscyc7XG4gICAgICB0aGlzLnZpZXdEZXRhaWxzLmVtaXQoe1xuICAgICAgICBldmVudCxcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImxvb3Atc3RlcC1yb3cgY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gIDwhLS0gSW5saW5lIEVkaXQgTW9kZTogc3RvcCBwcm9wYWdhdGlvbiBzbyBkcm9wZG93bi9zZWxlY3QgaW50ZXJhY3Rpb25zIGRvbid0IGJ1YmJsZSBhbmQgY29sbGFwc2UgdGhlIHN0ZXAgb3Igc3RhcnQgZHJhZyAtLT5cbiAgPGRpdiAqbmdJZj1cImlzRWRpdGluZ1wiIGNsYXNzPVwiY3FhLXB5LTIuNSBjcWEtcHgtNCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1qdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtZmxleC1ncm93XCI+XG4gICAgICAgIDwhLS0gTG9vcCBUeXBlIExhYmVsIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxQzM5OEVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj5cbiAgICAgICAgICB7eyBnZXRMb29wVHlwZUxhYmVsKCkgfX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBGT1IgTE9PUCBpbmxpbmUgZWRpdDogY3FhLWR5bmFtaWMtc2VsZWN0IChzYW1lIHVzYWdlIGFzIGRlZmF1bHQgc3RvcmllcykgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcidcIj5cbiAgICAgICAgICA8IS0tIEZpcnN0IHNlbGVjdDogd2lkdGggMjE2LjI1cHgsIGhlaWdodCAzNnB4LCBnYXAgNHB4LCBvcGFjaXR5IDEgLS0+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwiZm9yT3B0aW9uVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1heC13LVsyMTZweF1cIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImVkaXRGb3JtXCIgW2NvbmZpZ109XCJ0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwic3RhcnRTdGVwU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZWRpdEZvcm1cIiBbY29uZmlnXT1cImVuZFN0ZXBTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gV0hJTEUgTE9PUCBpbmxpbmUgZWRpdDogY3FhLWF1dG9jb21wbGV0ZSArIHRlbXBsYXRlIHZhcmlhYmxlcyAoc2FtZSBhcyBjb25kaXRpb24tc3RlcCkgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1doaWxlTG9vcCgpXCI+XG4gICAgICAgICAgPGNxYS1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICpuZ0lmPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwid2hpbGVDb25kaXRpb25BdXRvY29tcGxldGVPcHRpb25zXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ3aGlsZUNvbmRpdGlvbkRpc3BsYXlWYWx1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdjb25kaXRpb24nLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChvcHRpb25TZWxlY3QpPVwib25Db25kaXRpb25TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBjb25kaXRpb25cIlxuICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPlxuICAgICAgICAgIDwvY3FhLWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICA8IS0tIFRlbXBsYXRlIHZhcmlhYmxlcyBoaWRkZW4gaW4gd2hpbGUgbG9vcCAtIHVzZSBFZGl0IEluIGRlcHRoIHRvIGNvbmZpZ3VyZSAtLT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBFZGl0IEluIGRlcHRoIGxpbmsgLS0+XG4gICAgICA8YSBocmVmPVwiI1wiICpuZ0lmPVwiaXNXaGlsZUxvb3AoKVwiIChjbGljayk9XCJvbkVkaXRJbkRlcHRoKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLVsycHhdIGNxYS1uby11bmRlcmxpbmVcIj5cbiAgICAgICAgRWRpdCBJbiBkZXB0aFxuICAgICAgICA8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTIuMDM4MDkgNi43NDMyOUwyLjYyODA5IDcuMzMzMjlMNS45NjE0MiAzLjk5OTk2TDIuNjI4MDkgMC42NjY2MjZMMi4wMzgwOSAxLjI1NjYzTDQuNzgxNDIgMy45OTk5NkwyLjAzODA5IDYuNzQzMjlaXCJcbiAgICAgICAgICAgIGZpbGw9XCIjM0Y0M0VFXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2E+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgPCEtLSBDYW5jZWwgLyBBcHBseSAtLT5cbiAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQ2FuY2VsJ1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uRWRpdENhbmNlbCgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQXBwbHknXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25FZGl0QXBwbHkoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIExvb3AgSGVhZGVyIChub3JtYWwgdmlldyB3aGVuIG5vdCBlZGl0aW5nKSAtLT5cbiAgPGRpdiAqbmdJZj1cIiFpc0VkaXRpbmdcIlxuICAgIFtjbGFzc109XCInc3RlcC1yb3cgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB5LTIgJyArIChpc0luc2lkZUxvb3AgJiYgaXNJbnNpZGVTdGVwR3JvdXAgPyAnY3FhLXBsLTIwIGNxYS1wci00JyA6IChpc0luc2lkZUxvb3AgfHwgaXNJbnNpZGVTdGVwR3JvdXApID8gJ2NxYS1wbC0xMCBjcWEtcHItNCcgOiAnY3FhLXB4LTQnKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgIDwhLS0gRHJhZyBIYW5kbGUgSWNvbiAod2hlbiBpc1Jlb3JkZXIgaXMgdHJ1ZSBhbmQgbm90IGluc2lkZSBzdGVwIGdyb3VwIC0gc3RlcHMgaW5zaWRlIHN0ZXAgZ3JvdXBzIGNhbm5vdCBiZSByZW9yZGVyZWQpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc1Jlb3JkZXIgJiYgIWlzSW5zaWRlU3RlcEdyb3VwXCIgY2xhc3M9XCJjcWEtbXItMiBjcWEtY3Vyc29yLW1vdmUgY3FhLXRleHQtWyM2QjcyODBdIGhvdmVyOmNxYS10ZXh0LVsjMTExODI3XVwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIENoZWNrYm94ICh3aGVuIGlzUmVvcmRlciBpcyBmYWxzZSBvciBpbnNpZGUgc3RlcCBncm91cCAtIHN0ZXBzIGluc2lkZSBzdGVwIGdyb3VwcyBjYW5ub3QgYmUgcmVvcmRlcmVkKSAtLT5cbiAgICA8bGFiZWwgKm5nSWY9XCIhaXNSZW9yZGVyIHx8IGlzSW5zaWRlU3RlcEdyb3VwXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtcmVsYXRpdmUgY3FhLW1yLTJcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZFwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICBjbGFzcz1cImNxYS1oLTQgY3FhLXctNCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRyYW5zaXRpb24tYWxsIGNxYS1hcHBlYXJhbmNlLW5vbmUgY3FhLXJvdW5kZWQgc2hhZG93IGhvdmVyOmNxYS1zaGFkb3ctbWQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItc2xhdGUtMzAwIGNxYS1mbGV4LXNocmluay0wXCJcbiAgICAgICAgW2NsYXNzLmNxYS1iZy1bIzNGNDNFRV1dPVwic2VsZWN0ZWRcIlxuICAgICAgICBbY2xhc3MuY3FhLWJvcmRlci1bIzNGNDNFRV1dPVwic2VsZWN0ZWRcIlxuICAgICAgICBpZD1cImNoZWNrLWxvb3Atc3RlcFwiIC8+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtdGV4dC13aGl0ZSBjcWEtdG9wLTEvMiBjcWEtbGVmdC0xLzIgY3FhLS10cmFuc2xhdGUteC0xLzIgY3FhLS10cmFuc2xhdGUteS0xLzIgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIlxuICAgICAgICBbY2xhc3MuY3FhLW9wYWNpdHktMF09XCIhc2VsZWN0ZWRcIlxuICAgICAgICBbY2xhc3MuY3FhLW9wYWNpdHktMTAwXT1cInNlbGVjdGVkXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxMiAxM1wiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMTAgMy4xMjVMNC41IDguNjI1TDIgNi4xMjVcIiBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLW1pbi13LVszMnB4XVwiPnt7IHN0ZXBOdW1iZXIgfX08L3NwYW4+XG4gICAgPCEtLSBFeHBhbmQvQ29sbGFwc2UgSWNvbiAtLT5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25Ub2dnbGVFeHBhbmRlZCgpXCIgY2xhc3M9XCJjcWEtcC0wXCI+XG4gICAgICA8c3ZnIFtjbGFzcy5jcWEtcm90YXRlLTE4MF09XCIhZXhwYW5kZWRcIiBjbGFzcz1cImNxYS10cmFuc2l0aW9uLXRyYW5zZm9ybVwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXG4gICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMiAxMEw4IDZMNCAxMFwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9idXR0b24+XG5cbiAgICA8IS0tIExvb3AgSWNvbiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwibG9vcFR5cGUgPT09ICdmb3InXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMS4zMzQgMS4zMzMyNUwxNC4wMDA3IDMuOTk5OTJMMTEuMzM0IDYuNjY2NTlcIiBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGggZD1cIk0yIDcuMzMzMzNWNi42NjY2N0MyIDUuOTU5NDIgMi4yODA5NSA1LjI4MTE1IDIuNzgxMDUgNC43ODEwNUMzLjI4MTE1IDQuMjgwOTUgMy45NTk0MiA0IDQuNjY2NjcgNEgxNFwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzFDMzk4RVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTQuNjY2NjcgMTQuNjY2NkwyIDExLjk5OTlMNC42NjY2NyA5LjMzMzI1XCIgc3Ryb2tlPVwiIzFDMzk4RVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xNCA4LjY2Njc1VjkuMzMzNDFDMTQgMTAuMDQwNyAxMy43MTkgMTAuNzE4OSAxMy4yMTkgMTEuMjE5QzEyLjcxODkgMTEuNzE5MSAxMi4wNDA2IDEyLjAwMDEgMTEuMzMzMyAxMi4wMDAxSDJcIlxuICAgICAgICAgIHN0cm9rZT1cIiMxQzM5OEVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ3doaWxlJ1wiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNMTEuMzM0IDEuMzMzMjVMMTQuMDAwNyAzLjk5OTkyTDExLjMzNCA2LjY2NjU5XCIgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoIGQ9XCJNMiA3LjMzMzMzVjYuNjY2NjdDMiA1Ljk1OTQyIDIuMjgwOTUgNS4yODExNSAyLjc4MTA1IDQuNzgxMDVDMy4yODExNSA0LjI4MDk1IDMuOTU5NDIgNCA0LjY2NjY3IDRIMTRcIlxuICAgICAgICAgIHN0cm9rZT1cIiM1OTE2OEJcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGggZD1cIk00LjY2NjY3IDE0LjY2NjZMMiAxMS45OTk5TDQuNjY2NjcgOS4zMzMyNVwiIHN0cm9rZT1cIiM1OTE2OEJcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGQ9XCJNMTQgOC42NjY3NVY5LjMzMzQxQzE0IDEwLjA0MDcgMTMuNzE5IDEwLjcxODkgMTMuMjE5IDExLjIxOUMxMi43MTg5IDExLjcxOTEgMTIuMDQwNiAxMi4wMDAxIDExLjMzMzMgMTIuMDAwMUgyXCJcbiAgICAgICAgICBzdHJva2U9XCIjNTkxNjhCXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTG9vcCBUeXBlIExhYmVsIC0tPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxQzM5OEVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1ub25lXCI+XG4gICAgICB7eyBnZXRMb29wVHlwZUxhYmVsKCkgfX1cbiAgICA8L3NwYW4+XG5cbiAgICA8IS0tIEZvciBMb29wIERpc3BsYXkgKHNhbWUgc3R5bGluZyBhcyBjb25kaXRpb24gc3RlcCwgSFRNTCBiYWRnZXMgdmlhIGlubmVySFRNTCkgLS0+XG4gICAgPGRpdiAqbmdJZj1cImxvb3BUeXBlID09PSAnZm9yJyAmJiAoaGFzVGVzdERhdGFQcm9maWxlKCkgfHwgaGFzU3RhcnRWYWx1ZSgpIHx8IGhhc0VuZFZhbHVlKCkpXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtbWwtMiBjcWEtZmxleC0xIGNxYS1mbGV4LXdyYXBcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMxMTE4MjddIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLWFjdGlvbi1mb3JtYXRcIiBbaW5uZXJIVE1MXT1cImdldEZvckxvb3BEaXNwbGF5KClcIiAoY2xpY2spPVwib25Mb29wQWN0aW9uQ2xpY2soJGV2ZW50KVwiPjwvc3Bhbj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRMb29wRXZlbnREZXRhaWxzRm9yRGlzcGxheSgpLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0TG9vcEV2ZW50RGV0YWlsc0ZvckRpc3BsYXkoKVwiIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXJvdW5kZWQgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtYmctWyNGM0Y0RjZdIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl1cIiAoY2xpY2spPVwib25Mb29wQWN0aW9uQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkI3MjgwXVwiPnt7IGl0ZW0ua2V5IH19Ojwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMTExODI3XVwiPnt7IGl0ZW0udmFsdWUgfX08L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBXaGlsZSBMb29wIENvbmRpdGlvbiAob25seSBzaG93IGlmIGNvbmRpdGlvbiBleGlzdHMpIC0gc2FtZSBzdHlsaW5nIGFzIGNvbmRpdGlvbiBzdGVwIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc1doaWxlTG9vcCgpICYmIGNvbmRpdGlvblwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1sLTIgY3FhLWZsZXgtMSBjcWEtZmxleC13cmFwXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMTExODI3XSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1hY3Rpb24tZm9ybWF0XCIgW2lubmVySFRNTF09XCJnZXRDb25kaXRpb25EaXNwbGF5KClcIiAoY2xpY2spPVwib25Mb29wQWN0aW9uQ2xpY2soJGV2ZW50KVwiPjwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwibWF4SXRlcmF0aW9ucyAhPSBudWxsICYmIG1heEl0ZXJhdGlvbnMgPiAwXCIgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtcm91bmRlZCBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1iZy1bI0YzRjRGNl0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFN0VCXVwiIChjbGljayk9XCJvbkxvb3BBY3Rpb25DbGljaygkZXZlbnQpXCIgZGF0YS1rZXk9XCJtYXhJdGVyYXRpb25zXCIgZGF0YS1ldmVudC1rZXk9XCJtYXhJdGVyYXRpb25zXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkI3MjgwXVwiPm1heCBpdGVyYXRpb25zOjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzExMTgyN11cIj57eyBtYXhJdGVyYXRpb25zIH19PC9zcGFuPlxuICAgICAgPC9zcGFuPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldExvb3BFdmVudERldGFpbHNGb3JEaXNwbGF5KCkubGVuZ3RoID4gMFwiPlxuICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRMb29wRXZlbnREZXRhaWxzRm9yRGlzcGxheSgpXCIgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtcm91bmRlZCBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1iZy1bI0YzRjRGNl0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFN0VCXVwiIChjbGljayk9XCJvbkxvb3BBY3Rpb25DbGljaygkZXZlbnQpXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM2QjcyODBdXCI+e3sgaXRlbS5rZXkgfX06PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMxMTE4MjddXCI+e3sgaXRlbS52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLW1sLWF1dG9cIj5cbiAgICAgIDwhLS0gU3RlcHMgU3VtbWFyeSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjcWEtbWwtYXV0byBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTVFNV0gY3FhLXJvdW5kZWQtbGcgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XVwiPlxuICAgICAgICB7eyBnZXRTdGVwc1N1bW1hcnkoKSB9fVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVmlldyBEZXRhaWxzIExpbmsgKHNob3cgb25seSBpZiBkZXNjcmlwdGlvbiBpcyBub3QgZW1wdHkpIC0tPlxuICAgICAgPGEgKm5nSWY9XCJjb25maWcuZGVzY3JpcHRpb24gJiYgY29uZmlnLmRlc2NyaXB0aW9uLnRyaW0oKSAhPT0gJydcIiAjdmlld0RldGFpbHNUcmlnZ2VyIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uVmlld0RldGFpbHMoJGV2ZW50KVwiIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1uby11bmRlcmxpbmUgY3FhLW1sLWF1dG9cIj5WaWV3IERldGFpbHM8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMi4wMzgwOSA2Ljc0MzI5TDIuNjI4MDkgNy4zMzMyOUw1Ljk2MTQyIDMuOTk5OTZMMi42MjgwOSAwLjY2NjYyNkwyLjAzODA5IDEuMjU2NjNMNC43ODE0MiAzLjk5OTk2TDIuMDM4MDkgNi43NDMyOVpcIiBmaWxsPVwiIzNGNDNFRVwiLz48L3N2Zz48L2E+XG5cbiAgICAgIDwhLS0gQWN0aW9uIEljb25zOiBFZGl0LCBMaW5rLCBEdXBsaWNhdGUsIERlbGV0ZSAoc2hvdyBvbiBob3ZlcjsgaGlkZGVuIHdoZW4gaW5zaWRlIHN0ZXAtZ3JvdXApIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIiFpc0luc2lkZVN0ZXBHcm91cCAmJiAhaXNSZW9yZGVyXCIgY2xhc3M9XCJzdGVwLWFjdGlvbnMgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB4LVs3cHhdXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkVkaXQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdGl0bGU9XCJFZGl0XCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk03IDExLjY2NjZIMTIuMjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNOS41NTIwOCAyLjExMjhDOS43ODQzIDEuODgwNTggMTAuMDk5MyAxLjc1MDEyIDEwLjQyNzcgMS43NTAxMkMxMC43NTYxIDEuNzUwMTIgMTEuMDcxIDEuODgwNTggMTEuMzAzMyAyLjExMjhDMTEuNTM1NSAyLjM0NTAyIDExLjY2NTkgMi42NTk5OCAxMS42NjU5IDIuOTg4MzhDMTEuNjY1OSAzLjMxNjc5IDExLjUzNTUgMy42MzE3NSAxMS4zMDMzIDMuODYzOTdMNC4yOTc0MiAxMC44NzA0QzQuMTU4NjQgMTEuMDA5MiAzLjk4NzEgMTEuMTEwNyAzLjc5ODY3IDExLjE2NTZMMi4xMjMzMyAxMS42NTQ0QzIuMDczMTQgMTEuNjY5IDIuMDE5OTMgMTEuNjY5OSAxLjk2OTI4IDExLjY1NjlDMS45MTg2MyAxMS42NDM5IDEuODcyNCAxMS42MTc2IDEuODM1NDMgMTEuNTgwNkMxLjc5ODQ2IDExLjU0MzcgMS43NzIxIDExLjQ5NzQgMS43NTkxMyAxMS40NDY4QzEuNzQ2MTUgMTEuMzk2MSAxLjc0NzAzIDExLjM0MjkgMS43NjE2NyAxMS4yOTI3TDIuMjUwNSA5LjYxNzM4QzIuMzA1NDYgOS40MjkxNiAyLjQwNjk4IDkuMjU3ODMgMi41NDU2NyA5LjExOTIyTDkuNTUyMDggMi4xMTI4WlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPCEtLSA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25MaW5rKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiTGlua1wiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjOTlBMUFmXSBob3ZlcjpjcWEtdGV4dC1bIzE0NDdFNl1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNNS4wMDA2NSA5LjkxNjcxSDMuNjY3MzJDMi43ODMyNiA5LjkxNjcxIDEuOTM1NDIgOS42MDk0MiAxLjMxMDMgOS4wNjI0NEMwLjY4NTE3NCA4LjUxNTQ1IDAuMzMzOTg0IDcuNzczNTkgMC4zMzM5ODQgNy4wMDAwNEMwLjMzMzk4NCA2LjIyNjQ5IDAuNjg1MTc0IDUuNDg0NjMgMS4zMTAzIDQuOTM3NjVDMS45MzU0MiA0LjM5MDY2IDIuNzgzMjYgNC4wODMzNyAzLjY2NzMyIDQuMDgzMzdINS4wMDA2NVwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk05IDQuMDgzMzdIMTAuMzMzM0MxMS4yMTc0IDQuMDgzMzcgMTIuMDY1MiA0LjM5MDY2IDEyLjY5MDQgNC45Mzc2NUMxMy4zMTU1IDUuNDg0NjMgMTMuNjY2NyA2LjIyNjQ5IDEzLjY2NjcgNy4wMDAwNEMxMy42NjY3IDcuNzczNTkgMTMuMzE1NSA4LjUxNTQ1IDEyLjY5MDQgOS4wNjI0NEMxMi4wNjUyIDkuNjA5NDIgMTEuMjE3NCA5LjkxNjcxIDEwLjMzMzMgOS45MTY3MUg5XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTQuMzMzOTggN0g5LjY2NzMyXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPiAtLT5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRHVwbGljYXRlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRHVwbGljYXRlXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk0xMS42NjYgNC42NjY2M0g1LjgzMjY4QzUuMTg4MzUgNC42NjY2MyA0LjY2NjAyIDUuMTg4OTYgNC42NjYwMiA1LjgzMzI5VjExLjY2NjZDNC42NjYwMiAxMi4zMTEgNS4xODgzNSAxMi44MzMzIDUuODMyNjggMTIuODMzM0gxMS42NjZDMTIuMzEwMyAxMi44MzMzIDEyLjgzMjcgMTIuMzExIDEyLjgzMjcgMTEuNjY2NlY1LjgzMzI5QzEyLjgzMjcgNS4xODg5NiAxMi4zMTAzIDQuNjY2NjMgMTEuNjY2IDQuNjY2NjNaXCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTIuMzMyNjggOS4zMzMyOUMxLjY5MTAyIDkuMzMzMjkgMS4xNjYwMiA4LjgwODI5IDEuMTY2MDIgOC4xNjY2M1YyLjMzMzI5QzEuMTY2MDIgMS42OTE2MyAxLjY5MTAyIDEuMTY2NjMgMi4zMzI2OCAxLjE2NjYzSDguMTY2MDJDOC44MDc2OCAxLjE2NjYzIDkuMzMyNjggMS42OTE2MyA5LjMzMjY4IDIuMzMzMjlcIlxuICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkRlbGV0ZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkRlbGV0ZVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjZmY2NDY3XSBob3ZlcjpjcWEtdGV4dC1bI0M2MzUzNV1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS43NSAzLjVIMTIuMjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMTEuMDgyNyAzLjVWMTEuNjY2N0MxMS4wODI3IDEyLjI1IDEwLjQ5OTMgMTIuODMzMyA5LjkxNjAyIDEyLjgzMzNINC4wODI2OEMzLjQ5OTM1IDEyLjgzMzMgMi45MTYwMiAxMi4yNSAyLjkxNjAyIDExLjY2NjdWMy41XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTQuNjY2MDIgMy40OTk5NlYyLjMzMzI5QzQuNjY2MDIgMS43NDk5NiA1LjI0OTM1IDEuMTY2NjMgNS44MzI2OCAxLjE2NjYzSDguMTY2MDJDOC43NDkzNSAxLjE2NjYzIDkuMzMyNjggMS43NDk5NiA5LjMzMjY4IDIuMzMzMjlWMy40OTk5NlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk01LjgzMzk4IDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk04LjE2NjAyIDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBDcmVhdGVkIERhdGUgKGZyb20gQVBJKSAtIGxhc3Qgc28gYWxpZ25lZCBhY3Jvc3MgYWxsIHN0ZXBzLCBmb3JtYXQ6IDI1IEZlYiAyMDI2IC0tPlxuICAgICAgPHNwYW4gKm5nSWY9XCJjb25maWcuY3JlYXRlZERhdGVcIiBjbGFzcz1cInN0ZXAtZGF0ZSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtbWwtYXV0byBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICB7eyBjb25maWcuY3JlYXRlZERhdGUgfCBkYXRlOidkIE1NTSB5eXl5JyB9fVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEV4cGFuZGVkIENvbnRlbnQgd2l0aCBOZXN0ZWQgU3RlcHMgKHJlbmRlcmVyIGRpc3BhdGNoZXMgYnkgc3RlcCB0eXBlLCBuLWxldmVsIG5lc3RpbmcpIC0tPlxuICA8ZGl2ICpuZ0lmPVwiZXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgIDwhLS0gU1RBUlQgTWFya2VyIChjZW50ZXJlZCB3aXRoIGRlY29yYXRpdmUgbGluZXMpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHktMSBjcWEtcHgtNCBjcWEtYmctWyNEQkVBRkU4MF1cIiBzdHlsZT1cImJvcmRlci10b3A6IDFweCBzb2xpZCAjQkVEQkZGO1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1zZWxmLXN0cmV0Y2ggY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyMxQzM5OEVdIGNxYS1vcGFjaXR5LTQwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDIwcHg7XCI+PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzFDMzk4RV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXdoaXRlc3BhY2Utbm93cmFwXCI+e3sgZ2V0U3RhcnRMYWJlbCgpIH19PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1zZWxmLXN0cmV0Y2ggY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyMxQzM5OEVdIGNxYS1vcGFjaXR5LTQwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDIwcHg7XCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhaXNSZW9yZGVyXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgIDxjcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXIgKm5nRm9yPVwibGV0IHN0ZXAgb2YgbmVzdGVkU3RlcHM7IGxldCBpID0gaW5kZXhcIiBbc3RlcF09XCJzdGVwXCIgW2luZGV4XT1cImlcIlxuICAgICAgICBbc2VsZWN0ZWRdPVwiJGFueShzdGVwKS5zZWxlY3RlZFwiXG4gICAgICAgIFtpc05lc3RlZF09XCJ0cnVlXCIgW2lzSW5zaWRlTG9vcF09XCJ0cnVlXCIgW2lzUmVvcmRlcl09XCJpc1Jlb3JkZXJcIlxuICAgICAgICBbYWRkU3RlcEJldHdlZW5dPVwiYWRkU3RlcEJldHdlZW5cIlxuICAgICAgICBbZGF0YVByb2ZpbGVPcHRpb25zXT1cImRhdGFQcm9maWxlT3B0aW9uc1wiIFtoYXNNb3JlRGF0YVByb2ZpbGVzXT1cImhhc01vcmVEYXRhUHJvZmlsZXNcIiBbaXNMb2FkaW5nRGF0YVByb2ZpbGVzXT1cImlzTG9hZGluZ0RhdGFQcm9maWxlc1wiXG4gICAgICAgIFtuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXT1cIm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNcIlxuICAgICAgICAobmVzdGVkU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2UoJGV2ZW50LnN0ZXAsICRldmVudC5pbmRleClcIlxuICAgICAgICAoYWRkU3RlcCk9XCJvbkFkZFN0ZXAoKVwiIChhZGRTdGVwRm9yTG9vcCk9XCJvbkFkZFN0ZXBGb3JMb29wRnJvbU5lc3RlZCgkZXZlbnQpXCIgKGRlbGV0ZVN0ZXApPVwib25EZWxldGVTdGVwKCRldmVudClcIlxuICAgICAgICAodG9nZ2xlRXhwYW5kZWQpPVwib25OZXN0ZWRUb2dnbGVFeHBhbmRlZCgkZXZlbnQsIHN0ZXAsIGkpXCJcbiAgICAgICAgKGdyb3VwTmFtZUNoYW5nZSk9XCIkYW55KHN0ZXApLmdyb3VwTmFtZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGRlc2NyaXB0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZGVzY3JpcHRpb24gPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChyZXVzYWJsZUNoYW5nZSk9XCIkYW55KHN0ZXApLnJldXNhYmxlID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAob3BlbkV4dGVybmFsKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChlZGl0KT1cIm9uTmVzdGVkRWRpdCgkZXZlbnQpXCJcbiAgICAgICAgKGxpbmspPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGR1cGxpY2F0ZSk9XCJvbk5lc3RlZER1cGxpY2F0ZSgkZXZlbnQsIHN0ZXApXCIgKGRlbGV0ZSk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50LCBpKVwiXG4gICAgICAgICh2aWV3RGV0YWlscyk9XCJ2aWV3RGV0YWlscy5lbWl0KCRldmVudClcIlxuICAgICAgICAoY29uZGl0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuY29uZGl0aW9uID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoYnJhbmNoU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoYWRkQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKCRhbnkoc3RlcCksIGkpXCJcbiAgICAgICAgKGRlbGV0ZUJyYW5jaCk9XCJvbk5lc3RlZENvbmRpdGlvbkRlbGV0ZUJyYW5jaCgkYW55KHN0ZXApLCAkZXZlbnQsIGkpXCJcbiAgICAgICAgKHRlc3REYXRhUHJvZmlsZUNoYW5nZSk9XCIkYW55KHN0ZXApLnRlc3REYXRhUHJvZmlsZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKHN0YXJ0U3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLnN0YXJ0U3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGVuZFN0ZXBDaGFuZ2UpPVwiJGFueShzdGVwKS5lbmRTdGVwID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAobWF4SXRlcmF0aW9uc0NoYW5nZSk9XCIkYW55KHN0ZXApLm1heEl0ZXJhdGlvbnMgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChldmVudFR5cGVDaGFuZ2UpPVwiJGFueShzdGVwKS5ldmVudFR5cGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChwYXJhbWV0ZXJDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLnNlbGVjdGVkID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAobG9hZE1vcmVEYXRhUHJvZmlsZXMpPVwibG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKHNlYXJjaERhdGFQcm9maWxlcyk9XCJzZWFyY2hEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGRuZERyb3BJblpvbmUpPVwiZG5kRHJvcEluWm9uZS5lbWl0KCRldmVudClcIlxuICAgICAgICAoY2xpY2tBY3Rpb24pPVwiY2xpY2tBY3Rpb24uZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGVkaXRJbkRlcHRoKT1cImVkaXRJbkRlcHRoLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChhZGRTdGVwQmV0d2VlbkNsaWNrKT1cImFkZFN0ZXBCZXR3ZWVuQ2xpY2suZW1pdCgkZXZlbnQpXCI+XG4gICAgICA8L2NxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNSZW9yZGVyXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgbmVzdGVkLXN0ZXAtZHJvcC1saXN0XCJcbiAgICAgICAgIFtzdHlsZS5taW4taGVpZ2h0LnB4XT1cIm5lc3RlZFN0ZXBzLmxlbmd0aCA9PT0gMCA/IDUyIDogbnVsbFwiXG4gICAgICAgICBbZG5kRHJvcHpvbmVdPVwiWydzdGVwJ11cIlxuICAgICAgICAgZG5kRWZmZWN0QWxsb3dlZD1cIm1vdmVcIlxuICAgICAgICAgZG5kRHJhZ292ZXJDbGFzcz1cImRuZERyYWdvdmVyXCJcbiAgICAgICAgIChkbmREcm9wKT1cIm9uRG5kRHJvcCgkZXZlbnQpXCI+XG4gICAgICA8ZGl2IGRuZFBsYWNlaG9sZGVyUmVmIGNsYXNzPVwic3RlcC1kcmFnLXBsYWNlaG9sZGVyLW5lc3RlZCBjcWEtbXktMSBjcWEtbWluLWgtWzUwcHhdIGNxYS1ib3JkZXItMiBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjM0Y0M0VFXSBjcWEtcm91bmRlZCBjcWEtYmctW3JnYmEoNjMsNjcsMjM4LDAuMDgpXSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQteHNcIj5Ecm9wIGhlcmU8L2Rpdj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHN0ZXAgb2YgbmVzdGVkU3RlcHM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cIm5lc3RlZC1zdGVwLWRyYWctaXRlbVwiXG4gICAgICAgICAgIFtkbmREcmFnZ2FibGVdPVwic3RlcFwiXG4gICAgICAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgICAgICAgZG5kVHlwZT1cInN0ZXBcIj5cbiAgICAgICAgPGNxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlciBbc3RlcF09XCJzdGVwXCIgW2luZGV4XT1cImlcIlxuICAgICAgICAgIFtzZWxlY3RlZF09XCIkYW55KHN0ZXApLnNlbGVjdGVkXCJcbiAgICAgICAgICBbaXNOZXN0ZWRdPVwidHJ1ZVwiIFtpc0luc2lkZUxvb3BdPVwidHJ1ZVwiIFtpc1Jlb3JkZXJdPVwiaXNSZW9yZGVyXCJcbiAgICAgICAgICBbYWRkU3RlcEJldHdlZW5BYm92ZV09XCJhZGRTdGVwQmV0d2VlbkFib3ZlXCJcbiAgICAgICAgICBbYWRkU3RlcEJldHdlZW5CZWxvd109XCJhZGRTdGVwQmV0d2VlbkJlbG93XCJcbiAgICAgICAgICBbYWRkU3RlcEJldHdlZW5dPVwiYWRkU3RlcEJldHdlZW5cIlxuICAgICAgICAgIFtkYXRhUHJvZmlsZU9wdGlvbnNdPVwiZGF0YVByb2ZpbGVPcHRpb25zXCIgW2hhc01vcmVEYXRhUHJvZmlsZXNdPVwiaGFzTW9yZURhdGFQcm9maWxlc1wiIFtpc0xvYWRpbmdEYXRhUHJvZmlsZXNdPVwiaXNMb2FkaW5nRGF0YVByb2ZpbGVzXCJcbiAgICAgICAgICBbbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc109XCJuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXCJcbiAgICAgICAgICAobmVzdGVkU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2UoJGV2ZW50LnN0ZXAsICRldmVudC5pbmRleClcIlxuICAgICAgICAgIChhZGRTdGVwKT1cIm9uQWRkU3RlcCgpXCIgKGFkZFN0ZXBGb3JMb29wKT1cIm9uQWRkU3RlcEZvckxvb3BGcm9tTmVzdGVkKCRldmVudClcIiAoZGVsZXRlU3RlcCk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50KVwiXG4gICAgICAgICAgKHRvZ2dsZUV4cGFuZGVkKT1cIm9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoJGV2ZW50LCBzdGVwLCBpKVwiXG4gICAgICAgICAgKGdyb3VwTmFtZUNoYW5nZSk9XCIkYW55KHN0ZXApLmdyb3VwTmFtZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZGVzY3JpcHRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5kZXNjcmlwdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAocmV1c2FibGVDaGFuZ2UpPVwiJGFueShzdGVwKS5yZXVzYWJsZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAob3BlbkV4dGVybmFsKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChlZGl0KT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGxpbmspPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGR1cGxpY2F0ZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZGVsZXRlKT1cIm9uRGVsZXRlU3RlcCgkZXZlbnQsIGkpXCJcbiAgICAgICAgICAodmlld0RldGFpbHMpPVwidmlld0RldGFpbHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoY29uZGl0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuY29uZGl0aW9uID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChicmFuY2hTdGVwQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChhZGRCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25BZGRCcmFuY2goJGFueShzdGVwKSwgaSlcIlxuICAgICAgICAgIChkZWxldGVCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2goJGFueShzdGVwKSwgJGV2ZW50LCBpKVwiXG4gICAgICAgICAgKHRlc3REYXRhUHJvZmlsZUNoYW5nZSk9XCIkYW55KHN0ZXApLnRlc3REYXRhUHJvZmlsZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoc3RhcnRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuc3RhcnRTdGVwID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChlbmRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZW5kU3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAobWF4SXRlcmF0aW9uc0NoYW5nZSk9XCIkYW55KHN0ZXApLm1heEl0ZXJhdGlvbnMgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGV2ZW50VHlwZUNoYW5nZSk9XCIkYW55KHN0ZXApLmV2ZW50VHlwZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAocGFyYW1ldGVyQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLnNlbGVjdGVkID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAobG9hZE1vcmVEYXRhUHJvZmlsZXMpPVwibG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKHNlYXJjaERhdGFQcm9maWxlcyk9XCJzZWFyY2hEYXRhUHJvZmlsZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGRuZERyb3BJblpvbmUpPVwiZG5kRHJvcEluWm9uZS5lbWl0KCRldmVudClcIlxuICAgICAgICAoY2xpY2tBY3Rpb24pPVwiY2xpY2tBY3Rpb24uZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGVkaXRJbkRlcHRoKT1cImVkaXRJbkRlcHRoLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChhZGRTdGVwQmV0d2VlbkNsaWNrKT1cImFkZFN0ZXBCZXR3ZWVuQ2xpY2suZW1pdCgkZXZlbnQpXCI+XG4gICAgICAgIDwvY3FhLXRlc3QtY2FzZS1kZXRhaWxzLXJlbmRlcmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEVtcHR5IGxvb3A6IHNob3cgcGx1cyBpY29uIG9uIGhvdmVyIHdoZW4gZXhwYW5kZWQgYW5kIG5vIHN0ZXBzLlxuICAgICAgICAgV2hlbiByZW5kZXJlZCBpbnNpZGUgYSBzdGVwIGdyb3VwIG9yIHdoZW4gcmVvcmRlcmluZywgaGlkZSB0aGlzIEFkZCBidXR0b24gZW50aXJlbHkuIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJuZXN0ZWRTdGVwcy5sZW5ndGggPT09IDAgJiYgIWlzSW5zaWRlU3RlcEdyb3VwICYmICFpc1Jlb3JkZXJcIiBjbGFzcz1cImxvb3Atc3RlcC1lbXB0eSBjcWEtbWluLWgtWzUycHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wbC00IGNxYS1wci00XCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25BZGRTdGVwRW1wdHkoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkFkZCBzdGVwXCJcbiAgICAgICAgY2xhc3M9XCJsb29wLXN0ZXAtZW1wdHktYWRkXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxyZWN0IHg9XCIxXCIgeT1cIjFcIiB3aWR0aD1cIjIxLjE4MjJcIiBoZWlnaHQ9XCIyMlwiIHJ4PVwiMTAuNTkxMVwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgPHJlY3QgeD1cIjFcIiB5PVwiMVwiIHdpZHRoPVwiMjEuMTgyMlwiIGhlaWdodD1cIjIyXCIgcng9XCIxMC41OTExXCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS13aWR0aD1cIjJcIiAvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNOC41IDEySDE1LjVcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTEyIDguNVYxNS41XCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEVORCBNYXJrZXIgKGNlbnRlcmVkIHdpdGggZGVjb3JhdGl2ZSBsaW5lcykgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1weS0xIGNxYS1weC00IGNxYS1iZy1bI0RCRUFGRTgwXVwiIHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IHNvbGlkICNCRURCRkY7XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXNlbGYtc3RyZXRjaCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bIzFDMzk4RV0gY3FhLW9wYWNpdHktNDBcIiBzdHlsZT1cIm1pbi13aWR0aDogMjBweDtcIj48L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMUMzOThFXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtd2hpdGVzcGFjZS1ub3dyYXBcIj57eyBnZXRFbmRMYWJlbCgpIH19PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1zZWxmLXN0cmV0Y2ggY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyMxQzM5OEVdIGNxYS1vcGFjaXR5LTQwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDIwcHg7XCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
1265
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC1zdGVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvbG9vcC1zdGVwL2xvb3Atc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2xvb3Atc3RlcC9sb29wLXN0ZXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsU0FBUyxFQUFpQyxNQUFNLGVBQWUsQ0FBQztBQUNuSixPQUFPLEVBQTBCLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JFLE9BQU8sRUFBK0csU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEssT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7OztBQUtyRSxNQUFNLHNCQUFzQixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7O0NBZ0I5QixDQUFDO0FBVUYsTUFBTSxPQUFPLHlCQUF5QjtJQXNIcEMsWUFDVSxFQUFlLEVBQ2YsR0FBc0I7UUFEdEIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBckh2QixhQUFRLEdBQW9CLEtBQUssQ0FBQztRQVNsQyxnQkFBVyxHQUF5QixFQUFFLENBQUM7UUFDdkMsYUFBUSxHQUFZLElBQUksQ0FBQztRQUN6QixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUNuQyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDbkMsZ0ZBQWdGO1FBQ3ZFLHVCQUFrQixHQUF3QixFQUFFLENBQUM7UUFDdEQsZ0VBQWdF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O3NCQUExQixLQUFLO2dCQUVHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFFRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUcseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUVHLDZCQUE2QjtzQkFBckMsS0FBSztnQkFFRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcsb0JBQW9CO3NCQUE3QixNQUFNO2dCQUVHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFFRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkF3QzZDLGtCQUFrQjtzQkFBckUsU0FBUzt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRG5kRHJvcEV2ZW50IH0gZnJvbSAnbmd4LWRyYWctZHJvcCc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb29wU3RlcENvbmZpZywgVGVzdENhc2VTdGVwQ29uZmlnLCBOb3JtYWxTdGVwQ29uZmlnLCBDb25kaXRpb25TdGVwQ29uZmlnLCBTdGVwR3JvdXBDb25maWcsIENvbmRpdGlvbkJyYW5jaCwgU3RlcFR5cGVzIH0gZnJvbSAnLi4vdGVzdC1jYXNlLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IFNURVBfUk9XX0FDVElPTlNfU1RZTEVTIH0gZnJvbSAnLi4vc3RlcC1yb3ctYWN0aW9ucy5zdHlsZXMnO1xuaW1wb3J0IHsgRGF0YVByb2ZpbGVPcHRpb24gfSBmcm9tICcuLi8uLi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50JztcbmltcG9ydCB7IFZpZXdEZXRhaWxzUGF5bG9hZCB9IGZyb20gJy4uL3N0ZXAtZGV0YWlscy1tb2RhbC9zdGVwLWRldGFpbHMtbW9kYWwtZGF0YSc7XG5pbXBvcnQgeyBDcWFBdXRvY29tcGxldGVPcHRpb24gfSBmcm9tICcuLi8uLi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLm1vZGVsJztcblxuY29uc3QgTE9PUF9TVEVQX0VNUFRZX1NUWUxFUyA9IGBcbiAgLyogRW1wdHkgbG9vcDogcGx1cyBpY29uIGFsd2F5cyB2aXNpYmxlIHdoZW4gZXhwYW5kZWQgYW5kIG5vIHN0ZXBzICovXG4gIC5sb29wLXN0ZXAtZW1wdHkge1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbiAgLmxvb3Atc3RlcC1lbXB0eS1hZGQge1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyOiAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjb2xvcjogIzNGNDNFRTtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2U7XG4gIH1cbiAgLmxvb3Atc3RlcC1lbXB0eS1hZGQ6aG92ZXIge1xuICAgIG9wYWNpdHk6IDAuOTtcbiAgfVxuYDtcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZXN0LWNhc2UtbG9vcC1zdGVwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xvb3Atc3RlcC5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgc3R5bGVzOiBbXG4gICAgU1RFUF9ST1dfQUNUSU9OU19TVFlMRVMsXG4gICAgTE9PUF9TVEVQX0VNUFRZX1NUWUxFUyxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdENhc2VMb29wU3RlcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgY29uZmlnITogTG9vcFN0ZXBDb25maWc7XG4gIEBJbnB1dCgpIGlkITogc3RyaW5nO1xuICBASW5wdXQoKSBsb29wVHlwZTogJ2ZvcicgfCAnd2hpbGUnID0gJ2Zvcic7XG4gIEBJbnB1dCgpIHN0ZXBOdW1iZXIhOiBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBBcnJheSBpbmRleCBmcm9tIHBhcmVudCByZW5kZXJlciAtIHVzZSB0aGlzIGZvciBlZGl0SW5EZXB0aCBpbnN0ZWFkIG9mIHN0ZXBOdW1iZXIgKHN0ZXBOdW1iZXIgXCIxMC4zXCIgcGFyc2VzIHRvIDEwKSAqL1xuICBASW5wdXQoKSBpbmRleD86IG51bWJlcjtcbiAgQElucHV0KCkgY29uZGl0aW9uPzogc3RyaW5nO1xuICBASW5wdXQoKSBtYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuICBASW5wdXQoKSB0ZXN0RGF0YVByb2ZpbGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN0YXJ0U3RlcD86IG51bWJlcjtcbiAgQElucHV0KCkgZW5kU3RlcD86IG51bWJlcjtcbiAgQElucHV0KCkgbmVzdGVkU3RlcHM6IFRlc3RDYXNlU3RlcENvbmZpZ1tdID0gW107XG4gIEBJbnB1dCgpIGV4cGFuZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgaXNOZXN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNJbnNpZGVMb29wOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzSW5zaWRlU3RlcEdyb3VwOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzUmVvcmRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogT3B0aW9ucyBmb3IgdGhlIGRhdGEgcHJvZmlsZSBkcm9wZG93biAtIGFjY2VwdHMgRGF0YVByb2ZpbGVPcHRpb24gb2JqZWN0cyAqL1xuICBASW5wdXQoKSBkYXRhUHJvZmlsZU9wdGlvbnM6IERhdGFQcm9maWxlT3B0aW9uW10gPSBbXTtcbiAgLyoqIEluZGljYXRlcyBpZiBtb3JlIGRhdGEgcHJvZmlsZXMgYXJlIGF2YWlsYWJsZSBmb3IgbG9hZGluZyAqL1xuICBASW5wdXQoKSBoYXNNb3JlRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBMb2FkaW5nIHN0YXRlIGZvciBkYXRhIHByb2ZpbGVzICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ0RhdGFQcm9maWxlczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogT3B0aW9ucyBmb3IgbmF0dXJhbCB0ZXh0IGFjdGlvbnMgKGZvciB3aGlsZSBsb29wIGNvbmRpdGlvbikgKi9cbiAgQElucHV0KCkgbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXTtcbiAgLyoqIEZ1bmN0aW9uIHRvIHByb2Nlc3MgdGVtcGxhdGUgdmFyaWFibGVzIGZvciB3aGlsZSBjb25kaXRpb24gKHNhbWUgYXMgY29uZGl0aW9uLXN0ZXApICovXG4gIEBJbnB1dCgpIHNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzOiAodGVtcGxhdGU6IGFueSkgPT4gYW55W10gPSAoKSA9PiBbXTtcbiAgLyoqIFNob3cgXCJBZGQgU3RlcCBCZXR3ZWVuXCIgYnV0dG9uIGFib3ZlIG5lc3RlZCBzdGVwcyAqL1xuICBASW5wdXQoKSBhZGRTdGVwQmV0d2VlbkFib3ZlOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBTaG93IFwiQWRkIFN0ZXAgQmV0d2VlblwiIGJ1dHRvbiBiZWxvdyBuZXN0ZWQgc3RlcHMgKi9cbiAgQElucHV0KCkgYWRkU3RlcEJldHdlZW5CZWxvdzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGFkZFN0ZXBCZXR3ZWVuQWJvdmUgYW5kIGFkZFN0ZXBCZXR3ZWVuQmVsb3cgaW5zdGVhZC4gSWYgc2V0LCBhcHBsaWVzIHRvIGJvdGggYnV0dG9ucy4gKi9cbiAgQElucHV0KCkgYWRkU3RlcEJldHdlZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgdG9nZ2xlRXhwYW5kZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHtjb25maWc6IExvb3BTdGVwQ29uZmlnLCBleHBhbmRlZDogYm9vbGVhbn0+KCk7XG4gIEBPdXRwdXQoKSB0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHN0YXJ0U3RlcENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgZW5kU3RlcENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgY29uZGl0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBtYXhJdGVyYXRpb25zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBuZXN0ZWRTdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgaW5kZXg6IG51bWJlciB9PigpO1xuICAvKiogRW1pdHMgdm9pZCB3aGVuIGFkZCBpcyBmcm9tIG5lc3RlZCBjb250ZW50OyBlbWl0cyB7IGxvb3BTdGVwQ29uZmlnIH0gd2hlbiBlbXB0eS1zdGF0ZSBhZGQgaXMgY2xpY2tlZCAoc2FtZSBiZWhhdmlvdXIgYXMgYWRkLXN0ZXAtYmV0d2VlbikuICovXG4gIEBPdXRwdXQoKSBhZGRTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkIHwgeyBsb29wU3RlcENvbmZpZzogTG9vcFN0ZXBDb25maWcgfT4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZVN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGR1cGxpY2F0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG1vcmVPcHRpb25zID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgdmlld0RldGFpbHMgPSBuZXcgRXZlbnRFbWl0dGVyPFZpZXdEZXRhaWxzUGF5bG9hZD4oKTtcbiAgQE91dHB1dCgpIGVkaXRJbkRlcHRoID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgaW5kZXg6IG51bWJlcjsgdGVtcGxhdGVPdmVycmlkZT86IGFueSB9PigpO1xuICBAT3V0cHV0KCkgZWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGRuZERyb3BJblpvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IERuZERyb3BFdmVudDsgdGFyZ2V0TGlzdDogVGVzdENhc2VTdGVwQ29uZmlnW10gfT4oKTtcbiAgLyoqIEVtaXQgd2hlbiBtb3JlIGRhdGEgcHJvZmlsZXMgbmVlZCB0byBiZSBsb2FkZWQgKi9cbiAgQE91dHB1dCgpIGxvYWRNb3JlRGF0YVByb2ZpbGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0IHdoZW4gZGF0YSBwcm9maWxlIHNlYXJjaCBxdWVyeSBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBzZWFyY2hEYXRhUHJvZmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXQgd2hlbiBzdGVwIGlzIHVwZGF0ZWQgKEFwcGx5IGJ1dHRvbiBjbGlja2VkIGluIGVkaXQgbW9kZSkgKi9cbiAgQE91dHB1dCgpIHN0ZXBVcGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPExvb3BTdGVwQ29uZmlnPigpO1xuICAvKiogUmUtZW1pdCB3aGVuIGEgbmVzdGVkIHN0ZXAgKGUuZy4gbm9ybWFsLXN0ZXApIGVtaXRzIGNsaWNrQWN0aW9uIChlLmcuIGVsZW1lbnQvbGFiZWwgY2xpY2sgZm9yIHBvcHVwKSAqL1xuICBAT3V0cHV0KCkgY2xpY2tBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IE1vdXNlRXZlbnQ7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyB9PigpO1xuICAvKiogUmUtZW1pdCBhZGRTdGVwQmV0d2VlbkNsaWNrIGZyb20gbmVzdGVkIHJlbmRlcmVycyAqL1xuICBAT3V0cHV0KCkgYWRkU3RlcEJldHdlZW5DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8e3N0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZywgaW5kZXg6IG51bWJlciwgcG9zaXRpb246ICdBQk9WRScgfCAnQkVMT1cnfT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZUJyYW5jaCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29uZGl0aW9uQnJhbmNoPigpO1xuXG4gIG9uRG5kRHJvcChldmVudDogRG5kRHJvcEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5kbmREcm9wSW5ab25lLmVtaXQoeyBldmVudCwgdGFyZ2V0TGlzdDogdGhpcy5uZXN0ZWRTdGVwcyB9KTtcbiAgfVxuXG4gIC8qKiBFbWl0IGNsaWNrQWN0aW9uIHdoZW4gdXNlciBjbGlja3Mgb24gbG9vcCBkaXNwbGF5IGJhZGdlcyAoZWxlbWVudCwgdGVzdF9kYXRhLCBldGMuKSBzbyBwYXJlbnQgY2FuIG9wZW4gZWRpdCBtb2RhbHMgKi9cbiAgb25Mb29wQWN0aW9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNsaWNrQWN0aW9uLmVtaXQoeyBldmVudCwgc3RlcDogdGhpcy5jb25maWcgfSk7XG4gIH1cblxuICAvKiogRXhwb3NlIGdsb2JhbCBjb25zdHJ1Y3RvcnMgZm9yIHRlbXBsYXRlIChBbmd1bGFyIHRlbXBsYXRlcyBkb24ndCBoYXZlIFN0cmluZy9OdW1iZXIpICovXG4gIHJlYWRvbmx5IHN0cmluZ0ZuID0gU3RyaW5nO1xuICByZWFkb25seSBudW1iZXJGbiA9IE51bWJlcjtcblxuICAvKiogV2hlbiB0cnVlLCBoZWFkZXIgc2hvd3MgaW5saW5lIGVkaXQgZm9ybSAoZHJvcGRvd25zLCBpbnB1dHMsIENhbmNlbC9BcHBseSkgKi9cbiAgaXNFZGl0aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEZvcm0gZm9yIGVkaXQgbW9kZTsgYm91bmQgdG8gY3FhLWR5bmFtaWMtc2VsZWN0IChzYW1lIHBhdHRlcm4gYXMgZGVmYXVsdCBzdG9yaWVzKSAqL1xuICBlZGl0Rm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogQ2FjaGVkIHNlbGVjdCBjb25maWdzIChzdGFibGUgcmVmcyB0byBhdm9pZCBjaGFuZ2UtZGV0ZWN0aW9uIGxvb3BzKSAqL1xuICBmb3JPcHRpb25UeXBlU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICB0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIHN0YXJ0U3RlcFNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgZW5kU3RlcFNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgY29uZGl0aW9uU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICAvKiogV2hpbGUgbG9vcDogY29uZmlnIGZvciBhdXRvY29tcGxldGUgb3B0aW9ucyAoV0hJTEVfQ09ORElUSU9OIG9ubHkpICovXG4gIHdoaWxlQ29uZGl0aW9uU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuXG4gIC8qKiBTZWxlY3RlZCB0ZW1wbGF0ZSBmb3Igd2hpbGUgY29uZGl0aW9uIChzYW1lIHBhdHRlcm4gYXMgY29uZGl0aW9uLXN0ZXApICovXG4gIHNlbGVjdGVkVGVtcGxhdGU6IGFueSA9IG51bGw7XG4gIC8qKiBUZW1wbGF0ZSB2YXJpYWJsZXMgZm9yIHdoaWxlIGNvbmRpdGlvbiAqL1xuICB0ZW1wbGF0ZVZhcmlhYmxlczogYW55W10gPSBbXTtcbiAgLyoqIEZvcm0gZ3JvdXAgZm9yIHRlbXBsYXRlIHZhcmlhYmxlcyAqL1xuICB0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIERlZmF1bHQgbWF4IGZvciBMb29wIFN0YXJ0IC8gRW5kIHdoZW4gbm8gcHJvZmlsZSBzZWxlY3RlZCAob3B0aW9ucyAxLi4xMCkgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9MT09QX09QVElPTlNfTUFYID0gMTA7XG5cbiAgQFZpZXdDaGlsZCgndmlld0RldGFpbHNUcmlnZ2VyJywgeyBzdGF0aWM6IGZhbHNlIH0pIHZpZXdEZXRhaWxzVHJpZ2dlcj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIC8qKiBMb2NhbCBjb3B5IG9mIHZhbHVlcyB3aGlsZSBlZGl0aW5nIChmb3IgQ2FuY2VsIHJldmVydCkgKi9cbiAgcHJpdmF0ZSBlZGl0U25hcHNob3Q6IHtcbiAgICB0ZXN0RGF0YVByb2ZpbGU/OiBzdHJpbmc7XG4gICAgc3RhcnRTdGVwPzogbnVtYmVyO1xuICAgIGVuZFN0ZXA/OiBudW1iZXI7XG4gICAgY29uZGl0aW9uPzogc3RyaW5nO1xuICAgIG1heEl0ZXJhdGlvbnM/OiBudW1iZXI7XG4gICAgc2VsZWN0ZWRUZW1wbGF0ZT86IGFueTtcbiAgICB0ZW1wbGF0ZVZhcmlhYmxlcz86IGFueVtdO1xuICAgIGNvbmRpdGlvblRlbXBsYXRlRm9ybVZhbHVlPzogYW55O1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuaWQgPSB0aGlzLmNvbmZpZy5pZDtcbiAgICAgIHRoaXMubG9vcFR5cGUgPSB0aGlzLmNvbmZpZy5sb29wVHlwZTtcbiAgICAgIHRoaXMuc3RlcE51bWJlciA9IHRoaXMuY29uZmlnLnN0ZXBOdW1iZXI7XG4gICAgICB0aGlzLmNvbmRpdGlvbiA9IHRoaXMuY29uZmlnLmNvbmRpdGlvbjtcbiAgICAgIHRoaXMubWF4SXRlcmF0aW9ucyA9IHRoaXMuY29uZmlnLm1heEl0ZXJhdGlvbnM7XG4gICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRoaXMuY29uZmlnLnRlc3REYXRhUHJvZmlsZTtcbiAgICAgIHRoaXMuc3RhcnRTdGVwID0gdGhpcy5jb25maWcuc3RhcnRTdGVwO1xuICAgICAgdGhpcy5lbmRTdGVwID0gdGhpcy5jb25maWcuZW5kU3RlcDtcbiAgICAgIHRoaXMubmVzdGVkU3RlcHMgPSB0aGlzLmNvbmZpZy5uZXN0ZWRTdGVwcyB8fCBbXTtcbiAgICAgIHRoaXMuZXhwYW5kZWQgPSB0aGlzLmNvbmZpZy5leHBhbmRlZCAhPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWcuZXhwYW5kZWQgOiB0cnVlO1xuICAgICAgdGhpcy5zZWxlY3RlZCA9ICh0aGlzLmNvbmZpZyBhcyBhbnkpLnNlbGVjdGVkIHx8IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmJ1aWxkRWRpdEZvcm0oKTtcbiAgICB0aGlzLmJ1aWxkU2VsZWN0Q29uZmlncygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydjb25maWcnXSAmJiB0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9ICh0aGlzLmNvbmZpZyBhcyBhbnkpLnNlbGVjdGVkIHx8IGZhbHNlO1xuICAgICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb24oKTtcbiAgICAgIH1cbiAgICAgIC8vIEZPUiBsb29wOiB3aGVuIHN0ZXAgY29uZmlnIGhhcyBmb3JMb29wVGVzdERhdGFJZC9mb3JMb29wU3RhcnRJbmRleC9mb3JMb29wRW5kSW5kZXgsIHN5bmMgZm9ybSBhbmQgcmVmcmVzaCBzZWxlY3QgY29uZmlncyBzbyBkcm9wZG93bnMgc2hvdyBzZWxlY3RlZFxuICAgICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRm9yTG9vcFNlbGVjdENvbmZpZ3NTZWxlY3RlZFZhbHVlcygpO1xuICAgICAgICBpZiAodGhpcy5lZGl0Rm9ybSkgdGhpcy5zeW5jRm9yTG9vcEVkaXRGb3JtRnJvbUNvbmZpZygpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydkYXRhUHJvZmlsZU9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlRGF0YVByb2ZpbGVzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRGF0YVByb2ZpbGVzJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk7XG4gICAgICAvLyBXaGVuIGRhdGEgcHJvZmlsZXMgbG9hZCBpbiBlZGl0IG1vZGUsIHN5bmMgZm9ybSB2YWx1ZSBzbyBkcm9wZG93biBzaG93cyBzZWxlY3RlZCAoZm9yTG9vcFRlc3REYXRhSWQgb3IgdGVzdERhdGFQcm9maWxlKVxuICAgICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InICYmIHRoaXMuZWRpdEZvcm0gJiYgdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgICAgIGlmIChjZmc/LmZvckxvb3BUZXN0RGF0YUlkICE9IG51bGwgfHwgdGhpcy50ZXN0RGF0YVByb2ZpbGUpIHRoaXMuc3luY0Zvckxvb3BFZGl0Rm9ybUZyb21Db25maWcoKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvblNlbGVjdENvbmZpZygpO1xuICAgICAgLy8gV2hlbiBvcHRpb25zIGxvYWQsIHBvcHVsYXRlIGNvbmRpdGlvbiArIHRlbXBsYXRlIGZyb20gbmF0dXJhbFRleHRBY3Rpb25JZCAoc2FtZSBhcyBjb25kaXRpb24tc3RlcClcbiAgICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnICYmIHRoaXMuZWRpdEZvcm0gJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogRGVyaXZlIGZvck9wdGlvblR5cGUgZm9yIEZPUiBsb29wIGZyb20gY29uZmlnIHNvIGRyb3Bkb3duIHNob3dzIGV4aXN0aW5nIHNlbGVjdGlvbiAqL1xuICBwcml2YXRlIGdldEZvck9wdGlvblR5cGVGcm9tQ29uZmlnKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGhhc1Rlc3REYXRhSWQgPSBjZmc/LmZvckxvb3BUZXN0RGF0YUlkICE9IG51bGwgfHwgY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFRlc3REYXRhSWQgIT0gbnVsbCB8fCBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8udGVzdERhdGFJZCAhPSBudWxsO1xuICAgIGlmIChoYXNUZXN0RGF0YUlkIHx8IHRoaXMudGVzdERhdGFQcm9maWxlKSByZXR1cm4gJ3Rlc3QtZGF0YSc7XG4gICAgY29uc3QgaGFzRml4ZWQgPSBjZmc/LmZvckxvb3BTdGFydEluZGV4ICE9IG51bGwgfHwgY2ZnPy5mb3JMb29wRW5kSW5kZXggIT0gbnVsbFxuICAgICAgfHwgY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFN0YXJ0SW5kZXggIT0gbnVsbCB8fCBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wRW5kSW5kZXggIT0gbnVsbFxuICAgICAgfHwgY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnN0YXJ0SW5kZXggIT0gbnVsbCB8fCBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uZW5kSW5kZXggIT0gbnVsbDtcbiAgICBpZiAodGhpcy5zdGFydFN0ZXAgIT0gbnVsbCB8fCB0aGlzLmVuZFN0ZXAgIT0gbnVsbCB8fCBoYXNGaXhlZCkgcmV0dXJuICdmaXhlZCc7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogVGVzdCBEYXRhIFByb2ZpbGUgZHJvcGRvd24gdmFsdWU6IHByZWZlciBmb3JMb29wVGVzdERhdGFJZCBmcm9tIGNvbmZpZyAob3IgZGF0YU1hcEpzb24vZGF0YU1hcEJlYW4pLiBVc2Ugb3B0aW9uLmlkIHdoZW4gb3B0aW9ucyBsb2FkZWQgc28gdHlwZSBtYXRjaGVzIHNlbGVjdC4gKi9cbiAgcHJpdmF0ZSBnZXRUZXN0RGF0YVByb2ZpbGVGb3JtVmFsdWUoKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgaWRGcm9tQ29uZmlnID0gY2ZnPy5mb3JMb29wVGVzdERhdGFJZCA/PyBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wVGVzdERhdGFJZCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8udGVzdERhdGFJZDtcbiAgICAvLyBXaGVuIHdlIGhhdmUgb3B0aW9ucywgcmVzb2x2ZSBieSBpZCBzbyBmb3JtIHZhbHVlIG1hdGNoZXMgb3B0aW9uLmlkIChzdHJpY3QgZXF1YWxpdHkgaW4gZHluYW1pYy1zZWxlY3QpXG4gICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InICYmIHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgIGlmIChpZEZyb21Db25maWcgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAgICAgbyA9PiBvLmlkID09PSBpZEZyb21Db25maWcgfHwgU3RyaW5nKG8uaWQpID09PSBTdHJpbmcoaWRGcm9tQ29uZmlnKVxuICAgICAgICApO1xuICAgICAgICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaC5pZDtcbiAgICAgICAgcmV0dXJuIGlkRnJvbUNvbmZpZyBhcyBzdHJpbmcgfCBudW1iZXI7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudGVzdERhdGFQcm9maWxlID8/ICcnO1xuICAgICAgaWYgKHZhbHVlICE9PSAnJykge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAgICAgbyA9PiBvLm5hbWUgPT09IHZhbHVlIHx8IFN0cmluZyhvLmlkKSA9PT0gU3RyaW5nKHZhbHVlKVxuICAgICAgICApO1xuICAgICAgICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaC5pZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZSBhcyBzdHJpbmcgfCBudW1iZXI7XG4gICAgfVxuICAgIGlmIChpZEZyb21Db25maWcgIT0gbnVsbCkgcmV0dXJuIGlkRnJvbUNvbmZpZyBhcyBzdHJpbmcgfCBudW1iZXI7XG4gICAgcmV0dXJuICh0aGlzLnRlc3REYXRhUHJvZmlsZSA/PyAnJykgYXMgc3RyaW5nIHwgbnVtYmVyO1xuICB9XG5cbiAgLyoqIExvb3AgU3RhcnQgZHJvcGRvd24gdmFsdWU6IHByZWZlciBmb3JMb29wU3RhcnRJbmRleCBmcm9tIGNvbmZpZyAob3IgZGF0YU1hcEpzb24vZGF0YU1hcEJlYW4pLCBlbHNlIHN0YXJ0U3RlcCAqL1xuICBwcml2YXRlIGdldExvb3BTdGFydEZvcm1WYWx1ZSgpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgdiA9IGNmZz8uZm9yTG9vcFN0YXJ0SW5kZXggPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFN0YXJ0SW5kZXggPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnN0YXJ0SW5kZXg7XG4gICAgaWYgKHYgIT0gbnVsbCkgcmV0dXJuIE51bWJlcih2KTtcbiAgICByZXR1cm4gdGhpcy5zdGFydFN0ZXAgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBMb29wIEVuZCBkcm9wZG93biB2YWx1ZTogcHJlZmVyIGZvckxvb3BFbmRJbmRleCBmcm9tIGNvbmZpZyAob3IgZGF0YU1hcEpzb24vZGF0YU1hcEJlYW4pLCBlbHNlIGVuZFN0ZXAgKi9cbiAgcHJpdmF0ZSBnZXRMb29wRW5kRm9ybVZhbHVlKCk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB2ID0gY2ZnPy5mb3JMb29wRW5kSW5kZXggPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcEVuZEluZGV4ID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5lbmRJbmRleDtcbiAgICBpZiAodiAhPSBudWxsKSByZXR1cm4gTnVtYmVyKHYpO1xuICAgIHJldHVybiB0aGlzLmVuZFN0ZXAgPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRFZGl0Rm9ybSgpOiB2b2lkIHtcbiAgICAvLyBGb3Igd2hpbGUgbG9vcDogaWYgY29uZmlnIGhhcyBuYXR1cmFsVGV4dEFjdGlvbklkIGFuZCBvcHRpb25zIGFyZSBhbHJlYWR5IGxvYWRlZCwgdXNlIHRoZW0gZm9yIGluaXRpYWwgY29uZGl0aW9uICsgdGVtcGxhdGVcbiAgICBsZXQgY29uZGl0aW9uVmFsdWUgPSB0aGlzLmNvbmRpdGlvbiA/PyAnJztcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgY29uc3QgcG9wdWxhdGVkID0gdGhpcy5wb3B1bGF0ZVdoaWxlQ29uZGl0aW9uRnJvbU5hdHVyYWxUZXh0QWN0aW9uSWQoKTtcbiAgICAgIGlmIChwb3B1bGF0ZWQ/LmNvbmRpdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIGNvbmRpdGlvblZhbHVlID0gcG9wdWxhdGVkLmNvbmRpdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRm9yIEZPUiBsb29wOiBpbml0aWFsIGZvcm0gdmFsdWVzIHNvIGRyb3Bkb3ducyBzaG93IGV4aXN0aW5nIHNlbGVjdGlvbiAoZm9yT3B0aW9uVHlwZSwgZm9yTG9vcFRlc3REYXRhSWQvdGVzdERhdGFQcm9maWxlLCBmb3JMb29wU3RhcnRJbmRleC9mb3JMb29wRW5kSW5kZXgpXG4gICAgY29uc3QgZm9yT3B0aW9uVHlwZSA9IHRoaXMuZ2V0Rm9yT3B0aW9uVHlwZUZyb21Db25maWcoKTtcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWx1ZSA9IHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gdGhpcy5nZXRUZXN0RGF0YVByb2ZpbGVGb3JtVmFsdWUoKSA6ICh0aGlzLnRlc3REYXRhUHJvZmlsZSA/PyAnJyk7XG4gICAgY29uc3QgbG9vcFN0YXJ0VmFsdWUgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/IHRoaXMuZ2V0TG9vcFN0YXJ0Rm9ybVZhbHVlKCkgOiAodGhpcy5zdGFydFN0ZXAgPz8gbnVsbCk7XG4gICAgY29uc3QgbG9vcEVuZFZhbHVlID0gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyB0aGlzLmdldExvb3BFbmRGb3JtVmFsdWUoKSA6ICh0aGlzLmVuZFN0ZXAgPz8gbnVsbCk7XG4gICAgdGhpcy5lZGl0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZm9yT3B0aW9uVHlwZTogW2Zvck9wdGlvblR5cGUgYXMgc3RyaW5nIHwgbnVsbF0sXG4gICAgICB0ZXN0RGF0YVByb2ZpbGU6IFt0ZXN0RGF0YVByb2ZpbGVWYWx1ZV0sXG4gICAgICBzdGFydFN0ZXA6IFtsb29wU3RhcnRWYWx1ZSBhcyBudW1iZXIgfCBudWxsXSxcbiAgICAgIGVuZFN0ZXA6IFtsb29wRW5kVmFsdWUgYXMgbnVtYmVyIHwgbnVsbF0sXG4gICAgICBjb25kaXRpb246IFtjb25kaXRpb25WYWx1ZV0sXG4gICAgICBtYXhJdGVyYXRpb25zOiBbdGhpcy5tYXhJdGVyYXRpb25zID8/IDVdLFxuICAgIH0pO1xuICAgIGlmICghdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0pIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBvcHVsYXRlIGNvbmRpdGlvbiwgc2VsZWN0ZWRUZW1wbGF0ZSBhbmQgdGVtcGxhdGUgdmFyaWFibGVzIGZyb20gY29uZmlnLm5hdHVyYWxUZXh0QWN0aW9uSWQgd2hlbiBvcHRpb25zIGFyZSBhdmFpbGFibGUuXG4gICAqIFJldHVybnMgeyBjb25kaXRpb24gfSBpZiBhIG1hdGNoIHdhcyBmb3VuZCBzbyBidWlsZEVkaXRGb3JtIGNhbiBzZXQgaW5pdGlhbCBmb3JtIHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSBwb3B1bGF0ZVdoaWxlQ29uZGl0aW9uRnJvbU5hdHVyYWxUZXh0QWN0aW9uSWQoKTogeyBjb25kaXRpb246IHN0cmluZyB9IHwgbnVsbCB7XG4gICAgY29uc3QgY29uZmlnV2l0aElkID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGlmICghY29uZmlnV2l0aElkPy5uYXR1cmFsVGV4dEFjdGlvbklkIHx8ICF0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID0gKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyBhcyBhbnlbXSkuZmluZChcbiAgICAgIChvcHRpb246IGFueSkgPT4gU3RyaW5nKG9wdGlvbi5pZCkgPT09IFN0cmluZyhjb25maWdXaXRoSWQubmF0dXJhbFRleHRBY3Rpb25JZClcbiAgICApO1xuICAgIGlmICghbWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBuYXR1cmFsVGV4dCA9IG1hdGNoaW5nT3B0aW9uLm5hdHVyYWxUZXh0ID8/IG1hdGNoaW5nT3B0aW9uLm5hbWUgPz8gbWF0Y2hpbmdPcHRpb24udmFsdWUgPz8gJyc7XG4gICAgaWYgKCFuYXR1cmFsVGV4dCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRoaXMuY29uZGl0aW9uID0gbmF0dXJhbFRleHQ7XG4gICAgY29uc3QgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdPcHRpb24udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gZnVsbFRlbXBsYXRlO1xuICAgIGlmIChmdWxsVGVtcGxhdGU/LnZhcmlhYmxlcykge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMoZnVsbFRlbXBsYXRlKSB8fCBbXTtcbiAgICAgIHRoaXMuYnVpbGRUZW1wbGF0ZVZhcmlhYmxlc0Zvcm0oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IFtdO1xuICAgIH1cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgcmV0dXJuIHsgY29uZGl0aW9uOiBuYXR1cmFsVGV4dCB9O1xuICB9XG5cbiAgLyoqIFJlYnVpbGQgY29uZGl0aW9uICsgdGVtcGxhdGUgc3RhdGUgd2hlbiBuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIGxvYWQgb3IgY29uZmlnIGNoYW5nZXMgKHNhbWUgYXMgY29uZGl0aW9uLXN0ZXApLiAqL1xuICBwcml2YXRlIHJlYnVpbGRXaGlsZUNvbmRpdGlvbkZyb21OYXR1cmFsVGV4dEFjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdEZvcm0gfHwgdGhpcy5sb29wVHlwZSAhPT0gJ3doaWxlJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb25maWdXaXRoSWQgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgaWYgKCFjb25maWdXaXRoSWQ/Lm5hdHVyYWxUZXh0QWN0aW9uSWQgfHwgIXRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID0gKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyBhcyBhbnlbXSkuZmluZChcbiAgICAgIChvcHRpb246IGFueSkgPT4gU3RyaW5nKG9wdGlvbi5pZCkgPT09IFN0cmluZyhjb25maWdXaXRoSWQubmF0dXJhbFRleHRBY3Rpb25JZClcbiAgICApO1xuICAgIGlmICghbWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmF0dXJhbFRleHQgPSBtYXRjaGluZ09wdGlvbi5uYXR1cmFsVGV4dCA/PyBtYXRjaGluZ09wdGlvbi5uYW1lID8/IG1hdGNoaW5nT3B0aW9uLnZhbHVlID8/ICcnO1xuICAgIGlmIChuYXR1cmFsVGV4dCkge1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2NvbmRpdGlvbicpPy52YWx1ZSA/PyAnJztcbiAgICAgIGlmICghY3VycmVudFZhbHVlIHx8IGN1cnJlbnRWYWx1ZSAhPT0gbmF0dXJhbFRleHQpIHtcbiAgICAgICAgdGhpcy5lZGl0Rm9ybS5nZXQoJ2NvbmRpdGlvbicpPy5zZXRWYWx1ZShuYXR1cmFsVGV4dCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbmRpdGlvbiA9IG5hdHVyYWxUZXh0O1xuICAgIH1cbiAgICBjb25zdCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbi50ZW1wbGF0ZSB8fCBtYXRjaGluZ09wdGlvbjtcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBmdWxsVGVtcGxhdGU7XG4gICAgaWYgKGZ1bGxUZW1wbGF0ZT8udmFyaWFibGVzKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpIHx8IFtdO1xuICAgICAgdGhpcy5idWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBzZWxlY3QgY29uZmlncyBvbmNlIChzYW1lIG9wdGlvbiBzaGFwZSBhcyBkZWZhdWx0IHN0b3JpZXM6IGlkICsgbmFtZSk7IEZPUiBsb29wIGFkZHMgc2VsZWN0ZWRWYWx1ZSBmcm9tIHN0ZXAgKi9cbiAgcHJpdmF0ZSBidWlsZFNlbGVjdENvbmZpZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JPcHRpb25UeXBlU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnZm9yT3B0aW9uVHlwZScsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBvcHRpb24nLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgaWQ6ICd0ZXN0LWRhdGEnLCB2YWx1ZTogJ3Rlc3QtZGF0YScsIG5hbWU6ICdUZXN0IERhdGEgUHJvZmlsZScsIGxhYmVsOiAnVGVzdCBEYXRhIFByb2ZpbGUnIH0sXG4gICAgICAgIHsgaWQ6ICdmaXhlZCcsIHZhbHVlOiAnZml4ZWQnLCBuYW1lOiAnRml4ZWQgY291bnQnLCBsYWJlbDogJ0ZpeGVkIGNvdW50JyB9LFxuICAgICAgXSxcbiAgICB9O1xuICAgIHRoaXMudXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk7XG4gICAgY29uc3Qgc3RhcnRWYWwgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/IHRoaXMuZ2V0TG9vcFN0YXJ0Rm9ybVZhbHVlKCkgOiBudWxsO1xuICAgIGNvbnN0IGVuZFZhbCA9IHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gdGhpcy5nZXRMb29wRW5kRm9ybVZhbHVlKCkgOiBudWxsO1xuICAgIHRoaXMuc3RhcnRTdGVwU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnc3RhcnRTdGVwJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnTG9vcCBTdGFydCcsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuZ2V0TG9vcFN0YXJ0U2VsZWN0T3B0aW9ucygpLFxuICAgICAgLi4uKHN0YXJ0VmFsICE9IG51bGwgJiYgeyBzZWxlY3RlZFZhbHVlOiBzdGFydFZhbCB9KSxcbiAgICB9O1xuICAgIHRoaXMuZW5kU3RlcFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2VuZFN0ZXAnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdMb29wIEVuZCcsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuZ2V0TG9vcEVuZFNlbGVjdE9wdGlvbnMoKSxcbiAgICAgIC4uLihlbmRWYWwgIT0gbnVsbCAmJiB7IHNlbGVjdGVkVmFsdWU6IGVuZFZhbCB9KSxcbiAgICB9O1xuICAgIHRoaXMudXBkYXRlQ29uZGl0aW9uU2VsZWN0Q29uZmlnKCk7XG4gIH1cblxuICAvKiogVXBkYXRlIGNvbmRpdGlvbiBzZWxlY3QgY29uZmlnIHdpdGggbmF0dXJhbCB0ZXh0IGFjdGlvbnMgb3B0aW9ucyAobGVnYWN5IG1hdC1zZWxlY3QpICovXG4gIHByaXZhdGUgdXBkYXRlQ29uZGl0aW9uU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZGl0aW9uU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnY29uZGl0aW9uJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGNvbmRpdGlvbicsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgb3B0aW9uczogdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIHx8IFtdLFxuICAgIH07XG4gICAgdGhpcy51cGRhdGVXaGlsZUNvbmRpdGlvblNlbGVjdENvbmZpZygpO1xuICB9XG5cbiAgLyoqIFdoaWxlIGxvb3A6IG9ubHkgc2hvdyBvcHRpb25zIHdpdGggc3RlcEFjdGlvblR5cGUgPT09IFwiV0hJTEVfTE9PUFwiICovXG4gIHByaXZhdGUgdXBkYXRlV2hpbGVDb25kaXRpb25TZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyB8fCBbXSkuZmlsdGVyKChvcHRpb246IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIG9wdGlvbi5zdGVwQWN0aW9uVHlwZSA9PT0gJ1dISUxFX0xPT1AnO1xuICAgIH0pO1xuICAgIHRoaXMud2hpbGVDb25kaXRpb25TZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdjb25kaXRpb24nLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgY29uZGl0aW9uJyxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBvcHRpb25zOiBmaWx0ZXJlZE9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBPcHRpb25zIGZvciB0aGUgd2hpbGUgY29uZGl0aW9uIGF1dG9jb21wbGV0ZSAoV0hJTEVfTE9PUCBuYXR1cmFsIHRleHQgYWN0aW9ucyBvbmx5KSAqL1xuICBnZXQgd2hpbGVDb25kaXRpb25BdXRvY29tcGxldGVPcHRpb25zKCk6IChDcWFBdXRvY29tcGxldGVPcHRpb24gJiB7IHRlbXBsYXRlPzogYW55IH0pW10ge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLndoaWxlQ29uZGl0aW9uU2VsZWN0Q29uZmlnPy5vcHRpb25zID8/IFtdO1xuICAgIHJldHVybiBvcHRzLm1hcCgob3B0aW9uOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gb3B0aW9uLm5hdHVyYWxUZXh0ID8/IG9wdGlvbi5uYW1lID8/IG9wdGlvbi52YWx1ZSA/PyBTdHJpbmcob3B0aW9uLmlkID8/ICcnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBuYXR1cmFsVGV4dCxcbiAgICAgICAgbGFiZWw6IG5hdHVyYWxUZXh0LFxuICAgICAgICB0ZW1wbGF0ZTogb3B0aW9uLnRlbXBsYXRlIHx8IG9wdGlvbixcbiAgICAgIH0gYXMgQ3FhQXV0b2NvbXBsZXRlT3B0aW9uICYgeyB0ZW1wbGF0ZT86IGFueSB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIERpc3BsYXkgdmFsdWUgZm9yIHdoaWxlIGNvbmRpdGlvbiBhdXRvY29tcGxldGU6IHNob3cgbmF0dXJhbCB0ZXh0IGZyb20gb3B0aW9uIG1hdGNoaW5nIG5hdHVyYWxUZXh0QWN0aW9uSWQgd2hlbiBhdmFpbGFibGUgKGluY2x1ZGluZyB3aGVuIGZvcm0gaXMgZW1wdHkgb24gb3BlbiksIGVsc2UgZm9ybSB2YWx1ZS4gV2hlbiB1c2VyIGhhcyBzZWxlY3RlZCBhIGRpZmZlcmVudCBvcHRpb24sIHNob3cgZm9ybSB2YWx1ZS4gKi9cbiAgZ2V0IHdoaWxlQ29uZGl0aW9uRGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29uZmlnV2l0aElkID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGlzRm9ybUh0bWwgPSBmb3JtVmFsdWUgJiYgKFN0cmluZyhmb3JtVmFsdWUpLmluY2x1ZGVzKCc8JykgfHwgU3RyaW5nKGZvcm1WYWx1ZSkuaW5jbHVkZXMoJz4nKSk7XG4gICAgaWYgKGNvbmZpZ1dpdGhJZD8ubmF0dXJhbFRleHRBY3Rpb25JZCAhPSBudWxsICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYXMgYW55W10pLmZpbmQoXG4gICAgICAgIChvcHRpb246IGFueSkgPT4gU3RyaW5nKG9wdGlvbi5pZCkgPT09IFN0cmluZyhjb25maWdXaXRoSWQubmF0dXJhbFRleHRBY3Rpb25JZClcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgICAgY29uc3QgbmF0dXJhbFRleHQgPSBtYXRjaGluZ09wdGlvbi5uYXR1cmFsVGV4dCA/PyBtYXRjaGluZ09wdGlvbi5uYW1lID8/IG1hdGNoaW5nT3B0aW9uLnZhbHVlID8/ICcnO1xuICAgICAgICBpZiAobmF0dXJhbFRleHQpIHtcbiAgICAgICAgICBjb25zdCBuYXR1cmFsVGV4dFN0ciA9IFN0cmluZyhuYXR1cmFsVGV4dCk7XG4gICAgICAgICAgLy8gU2hvdyBzZWxlY3RlZDogd2hlbiBmb3JtIGlzIGVtcHR5IChpbml0aWFsIG9wZW4pLCBvciBmb3JtIG1hdGNoZXMgdGhpcyBvcHRpb24sIG9yIGZvcm0gaGFzIEhUTUwuIE9ubHkgdXNlIGZvcm0gdmFsdWUgd2hlbiB1c2VyIHBpY2tlZCBhIGRpZmZlcmVudCBvcHRpb24uXG4gICAgICAgICAgaWYgKCFmb3JtVmFsdWUgfHwgZm9ybVZhbHVlID09PSBuYXR1cmFsVGV4dFN0ciB8fCBpc0Zvcm1IdG1sKSByZXR1cm4gbmF0dXJhbFRleHRTdHI7XG4gICAgICAgICAgcmV0dXJuIGZvcm1WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNGb3JtSHRtbCkgcmV0dXJuICcnO1xuICAgIHJldHVybiBmb3JtVmFsdWU7XG4gIH1cblxuICBvbkNvbmRpdGlvblNlbGVjdChvcHRpb246IENxYUF1dG9jb21wbGV0ZU9wdGlvbiAmIHsgdGVtcGxhdGU/OiBhbnkgfSk6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uJyk/LnNldFZhbHVlKG9wdGlvbi52YWx1ZSk7XG4gICAgY29uc3QgbWF0Y2hpbmdUZW1wbGF0ZSA9IG9wdGlvbi50ZW1wbGF0ZTtcbiAgICBsZXQgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdUZW1wbGF0ZTtcbiAgICBpZiAoIWZ1bGxUZW1wbGF0ZSB8fCAhZnVsbFRlbXBsYXRlLnZhcmlhYmxlcykge1xuICAgICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSAodGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIHx8IFtdKS5maW5kKFxuICAgICAgICAob3B0OiBhbnkpID0+IG9wdC5uYXR1cmFsVGV4dCA9PT0gb3B0aW9uLnZhbHVlIHx8IG9wdC5uYW1lID09PSBvcHRpb24udmFsdWUgfHwgb3B0LnZhbHVlID09PSBvcHRpb24udmFsdWVcbiAgICAgICkgYXMgYW55O1xuICAgICAgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdPcHRpb24/LnRlbXBsYXRlIHx8IG1hdGNoaW5nT3B0aW9uO1xuICAgIH1cbiAgICBpZiAoZnVsbFRlbXBsYXRlICYmIGZ1bGxUZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IGZ1bGxUZW1wbGF0ZTtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKGZ1bGxUZW1wbGF0ZSkgfHwgW107XG4gICAgICB0aGlzLmJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIC8vIEF1dG8tb3BlbiBFZGl0IEluIGRlcHRoIHdoZW4gdXNlciBzZWxlY3RzIGEgY29uZGl0aW9uIGZyb20gdGhlIGF1dG9jb21wbGV0ZS5cbiAgICAvLyBQYXNzIGZ1bGxUZW1wbGF0ZSBzbyB0aGUgbW9kYWwgc2hvd3MgdGhlIG5ld2x5IHNlbGVjdGVkIHRlbXBsYXRlLCBub3QgdGhlIG9sZCBzdGVwIHRlbXBsYXRlLlxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vbkVkaXRJbkRlcHRoKGZ1bGxUZW1wbGF0ZSksIDEwMCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0pIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgfVxuICAgIE9iamVjdC5rZXlzKHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5yZW1vdmVDb250cm9sKGtleSk7XG4gICAgfSk7XG4gICAgY29uc3QgY29uZmlnV2l0aERhdGEgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgZXhpc3RpbmdEYXRhID0gY29uZmlnV2l0aERhdGEudGVtcGxhdGVWYXJpYWJsZXNEYXRhIHx8IHt9O1xuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnk7XG4gICAgICBpZiAoZXhpc3RpbmdEYXRhLmhhc093blByb3BlcnR5KHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGV4aXN0aW5nRGF0YVt2YXJpYWJsZS5uYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJ1xuICAgICAgICAgID8gKHZhcmlhYmxlLnZhbHVlID09PSB0cnVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAndHJ1ZScgfHwgdmFyaWFibGUudmFsdWUgPT09IDEpXG4gICAgICAgICAgOiAodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgICAgfVxuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyAmJiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWUgPT09ICd0cnVlJyB8fCBkZWZhdWx0VmFsdWUgPT09ICcxJztcbiAgICAgIH1cbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtLmFkZENvbnRyb2wodmFyaWFibGUubmFtZSwgbmV3IEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0U2VsZWN0Q29uZmlnRm9yVmFyaWFibGUodmFyaWFibGU6IGFueSk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3Qgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSAodmFyaWFibGUub3B0aW9ucyB8fCBbXSkubWFwKChvcHQ6IHN0cmluZykgPT4gKHtcbiAgICAgIGlkOiBvcHQsXG4gICAgICB2YWx1ZTogb3B0LFxuICAgICAgbmFtZTogb3B0LFxuICAgICAgbGFiZWw6IG9wdFxuICAgIH0pKTtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiB2YXJpYWJsZS5uYW1lLFxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSkpIHtcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKiogVXBkYXRlIHRlc3QgZGF0YSBwcm9maWxlIHNlbGVjdCBjb25maWcgd2l0aCBjdXJyZW50IG9wdGlvbnMgYW5kIHNlbGVjdGVkVmFsdWUgKGZvckxvb3BUZXN0RGF0YUlkKS4gRW5zdXJlIHNlbGVjdGVkIGlkIGlzIGluIG9wdGlvbnMgc28gbWF0LXNlbGVjdCBjYW4gZGlzcGxheSBpdC4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgbGV0IG9wdGlvbnMgPSB0aGlzLmNvbnZlcnREYXRhUHJvZmlsZU9wdGlvbnNUb1NlbGVjdE9wdGlvbnModGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMpO1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBmb3JMb29wVGVzdERhdGFJZCA9IGNmZz8uZm9yTG9vcFRlc3REYXRhSWQgPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFRlc3REYXRhSWQgPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnRlc3REYXRhSWQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRWYWwgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/IHRoaXMuZ2V0VGVzdERhdGFQcm9maWxlRm9ybVZhbHVlKCkgOiB1bmRlZmluZWQ7XG4gICAgLy8gSWYgd2UgaGF2ZSBhIHByZXNlbGVjdGVkIGlkIGJ1dCBpdCdzIG5vdCBpbiB0aGUgY3VycmVudCBvcHRpb25zIGxpc3QgKGUuZy4gb3B0aW9ucyBub3QgbG9hZGVkIHlldCksIGFkZCBhIHBsYWNlaG9sZGVyIG9wdGlvbiBzbyB0aGUgZHJvcGRvd24gY2FuIHNob3cgdGhlIHNlbGVjdGlvblxuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnZm9yJyAmJiBmb3JMb29wVGVzdERhdGFJZCAhPSBudWxsKSB7XG4gICAgICBjb25zdCBpZFN0ciA9IFN0cmluZyhmb3JMb29wVGVzdERhdGFJZCk7XG4gICAgICBjb25zdCBhbHJlYWR5SW5MaXN0ID0gb3B0aW9ucy5zb21lKChvOiBTZWxlY3RPcHRpb24pID0+IFN0cmluZyhvLmlkID8/IG8udmFsdWUpID09PSBpZFN0cik7XG4gICAgICBpZiAoIWFscmVhZHlJbkxpc3QpIHtcbiAgICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSB0aGlzLnRlc3REYXRhUHJvZmlsZSB8fCAnU2VsZWN0ZWQgcHJvZmlsZSc7XG4gICAgICAgIG9wdGlvbnMgPSBbeyBpZDogZm9yTG9vcFRlc3REYXRhSWQsIHZhbHVlOiBmb3JMb29wVGVzdERhdGFJZCwgbmFtZTogZGlzcGxheU5hbWUsIGxhYmVsOiBkaXNwbGF5TmFtZSB9LCAuLi5vcHRpb25zXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICd0ZXN0RGF0YVByb2ZpbGUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdUZXN0ZGF0YXByb2ZpbGUnLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgIGluaXRpYWxGZXRjaE9uT3BlbjogdHJ1ZSxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZURhdGFQcm9maWxlcyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdEYXRhUHJvZmlsZXMsXG4gICAgICBvcHRpb25zLFxuICAgICAgLi4uKHNlbGVjdGVkVmFsICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0ZWRWYWwgIT09ICcnICYmIHsgc2VsZWN0ZWRWYWx1ZTogc2VsZWN0ZWRWYWwgfSksXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkRhdGFQcm9maWxlQ2hhbmdlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5vblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeSk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMub25Mb2FkTW9yZURhdGFQcm9maWxlcyhxdWVyeSB8fCAnJyk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKiogVXBkYXRlIExvb3AgU3RhcnQgLyBMb29wIEVuZCBzZWxlY3QgY29uZmlncyB3aXRoIHNlbGVjdGVkVmFsdWUgKGZvckxvb3BTdGFydEluZGV4LCBmb3JMb29wRW5kSW5kZXgpIHNvIGRyb3Bkb3ducyBzaG93IHNlbGVjdGVkICovXG4gIHByaXZhdGUgdXBkYXRlU3RhcnRFbmRTdGVwU2VsZWN0Q29uZmlnc1NlbGVjdGVkVmFsdWVzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXJ0VmFsID0gdGhpcy5nZXRMb29wU3RhcnRGb3JtVmFsdWUoKTtcbiAgICBjb25zdCBlbmRWYWwgPSB0aGlzLmdldExvb3BFbmRGb3JtVmFsdWUoKTtcbiAgICB0aGlzLnN0YXJ0U3RlcFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuc3RhcnRTdGVwU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9uczogdGhpcy5nZXRMb29wU3RhcnRTZWxlY3RPcHRpb25zKCksXG4gICAgICAuLi4oc3RhcnRWYWwgIT0gbnVsbCAmJiB7IHNlbGVjdGVkVmFsdWU6IHN0YXJ0VmFsIH0pLFxuICAgIH07XG4gICAgdGhpcy5lbmRTdGVwU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5lbmRTdGVwU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9uczogdGhpcy5nZXRMb29wRW5kU2VsZWN0T3B0aW9ucygpLFxuICAgICAgLi4uKGVuZFZhbCAhPSBudWxsICYmIHsgc2VsZWN0ZWRWYWx1ZTogZW5kVmFsIH0pLFxuICAgIH07XG4gIH1cblxuICAvKiogVXBkYXRlIGFsbCBGT1IgbG9vcCBzZWxlY3QgY29uZmlncyAodGVzdERhdGFQcm9maWxlLCBzdGFydFN0ZXAsIGVuZFN0ZXApIHdpdGggc2VsZWN0ZWRWYWx1ZSBmcm9tIHN0ZXAgc28gZHJvcGRvd25zIHNob3cgc2VsZWN0ZWQgKi9cbiAgcHJpdmF0ZSB1cGRhdGVGb3JMb29wU2VsZWN0Q29uZmlnc1NlbGVjdGVkVmFsdWVzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy51cGRhdGVTdGFydEVuZFN0ZXBTZWxlY3RDb25maWdzU2VsZWN0ZWRWYWx1ZXMoKTtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0IERhdGFQcm9maWxlT3B0aW9uW10gdG8gU2VsZWN0T3B0aW9uW10gKi9cbiAgcHJpdmF0ZSBjb252ZXJ0RGF0YVByb2ZpbGVPcHRpb25zVG9TZWxlY3RPcHRpb25zKG9wdGlvbnM6IERhdGFQcm9maWxlT3B0aW9uW10pOiBTZWxlY3RPcHRpb25bXSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubWFwKG9wdGlvbiA9PiAoe1xuICAgICAgaWQ6IG9wdGlvbi5pZCxcbiAgICAgIHZhbHVlOiBvcHRpb24uaWQsXG4gICAgICBuYW1lOiBvcHRpb24ubmFtZSxcbiAgICAgIGxhYmVsOiBvcHRpb24ubmFtZVxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKiBEYXRhIGxlbmd0aCAoTikgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZXN0IGRhdGEgcHJvZmlsZTsgMCBpZiBub25lIHNlbGVjdGVkIG9yIG5vdCBmb3VuZC4gKi9cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZFByb2ZpbGVEYXRhTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgY29uc3QgcHJvZmlsZUlkID0gdGhpcy5lZGl0Rm9ybT8uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKT8udmFsdWUgPz8gKHRoaXMuY29uZmlnIGFzIGFueSk/LmZvckxvb3BUZXN0RGF0YUlkID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFRlc3REYXRhSWQgPz8gKHRoaXMuY29uZmlnIGFzIGFueSk/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8udGVzdERhdGFJZDtcbiAgICBpZiAocHJvZmlsZUlkID09IG51bGwgfHwgIXRoaXMuZGF0YVByb2ZpbGVPcHRpb25zPy5sZW5ndGgpIHJldHVybiAwO1xuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChcbiAgICAgIChvOiBEYXRhUHJvZmlsZU9wdGlvbikgPT4gU3RyaW5nKG8uaWQpID09PSBTdHJpbmcocHJvZmlsZUlkKSB8fCBvLmlkID09PSBwcm9maWxlSWRcbiAgICApO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiAwO1xuICAgIGNvbnN0IGxlbiA9IChtYXRjaC5kYXRhICYmIEFycmF5LmlzQXJyYXkobWF0Y2guZGF0YSkgPyBtYXRjaC5kYXRhLmxlbmd0aCA6IDApIHx8IChtYXRjaC5kYXRhTGVuZ3RoID8/IDApO1xuICAgIHJldHVybiB0eXBlb2YgbGVuID09PSAnbnVtYmVyJyA/IGxlbiA6IDA7XG4gIH1cblxuICAvKiogTG9vcCBTdGFydC9FbmQgb3B0aW9uczogMSB0byBOIGJhc2VkIG9uIHNlbGVjdGVkIGRhdGEgcHJvZmlsZSdzIGRhdGEgYXJyYXkgbGVuZ3RoOyBmYWxscyBiYWNrIHRvIDEuLjEwIGlmIG5vIHByb2ZpbGUuICovXG4gIGdldExvb3BTdGVwT3B0aW9ucygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgTiA9IHRoaXMuZ2V0U2VsZWN0ZWRQcm9maWxlRGF0YUxlbmd0aCgpO1xuICAgIGNvbnN0IG1heCA9IE4gPiAwID8gTiA6IFRlc3RDYXNlTG9vcFN0ZXBDb21wb25lbnQuREVGQVVMVF9MT09QX09QVElPTlNfTUFYO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBtYXggfSwgKF8sIGkpID0+IGkgKyAxKTtcbiAgfVxuXG4gIC8qKiBTZW50aW5lbCB2YWx1ZSBmb3IgXCJTdGFydFwiIC8gXCJFbmRcIiBvcHRpb25zIChzYW1lIGFzIG9sZCBVSSkuICovXG4gIHN0YXRpYyByZWFkb25seSBMT09QX0lOREVYX1NUQVJUID0gLTE7XG4gIHN0YXRpYyByZWFkb25seSBMT09QX0lOREVYX0VORCA9IC0xO1xuXG4gIC8qKiBMb29wIFN0YXJ0L0VuZCBzZWxlY3Qgb3B0aW9uczogc2FtZSBpbmRpY2VzIGFzIGdldExvb3BTdGVwT3B0aW9ucygpLCB3aXRoIGxhYmVsIFwibmFtZSAoaW5kZXgpXCIgd2hlbiBwcm9maWxlIGRhdGEgaGFzIHJvdyBuYW1lcywgZWxzZSBcIlN0ZXAgKGluZGV4KVwiLiAqL1xuICBwcml2YXRlIGdldExvb3BTdGVwU2VsZWN0T3B0aW9ucygpOiBTZWxlY3RPcHRpb25bXSB7XG4gICAgY29uc3QgaW5kaWNlcyA9IHRoaXMuZ2V0TG9vcFN0ZXBPcHRpb25zKCk7XG4gICAgcmV0dXJuIGluZGljZXMubWFwKChuKSA9PiB7XG4gICAgICBjb25zdCByb3dOYW1lID0gdGhpcy5nZXREYXRhUm93TmFtZUZvck9uZUJhc2VkSW5kZXgobik7XG4gICAgICBjb25zdCBsYWJlbCA9IHJvd05hbWUgPyBgJHtyb3dOYW1lfSAoJHtufSlgIDogYFN0ZXAgKCR7bn0pYDtcbiAgICAgIHJldHVybiB7IGlkOiBuLCB2YWx1ZTogbiwgbmFtZTogbGFiZWwsIGxhYmVsIH07XG4gICAgfSk7XG4gIH1cblxuICAvKiogTG9vcCBTdGFydCBkcm9wZG93biBvcHRpb25zOiBcIlN0YXJ0XCIgKHZhbHVlIC0xKSBmaXJzdCwgdGhlbiBkYXRhIHJvd3MuIFNhbWUgdmFsdWVzIGFzIG9sZCBVSS4gKi9cbiAgcHJpdmF0ZSBnZXRMb29wU3RhcnRTZWxlY3RPcHRpb25zKCk6IFNlbGVjdE9wdGlvbltdIHtcbiAgICBjb25zdCBzdGFydE9wdGlvbjogU2VsZWN0T3B0aW9uID0ge1xuICAgICAgaWQ6IFRlc3RDYXNlTG9vcFN0ZXBDb21wb25lbnQuTE9PUF9JTkRFWF9TVEFSVCxcbiAgICAgIHZhbHVlOiBUZXN0Q2FzZUxvb3BTdGVwQ29tcG9uZW50LkxPT1BfSU5ERVhfU1RBUlQsXG4gICAgICBuYW1lOiAnU3RhcnQnLFxuICAgICAgbGFiZWw6ICdTdGFydCcsXG4gICAgfTtcbiAgICByZXR1cm4gW3N0YXJ0T3B0aW9uLCAuLi50aGlzLmdldExvb3BTdGVwU2VsZWN0T3B0aW9ucygpXTtcbiAgfVxuXG4gIC8qKiBMb29wIEVuZCBkcm9wZG93biBvcHRpb25zOiBkYXRhIHJvd3MgZmlyc3QsIHRoZW4gXCJFbmRcIiAodmFsdWUgLTEpIGxhc3QuIFNhbWUgdmFsdWVzIGFzIG9sZCBVSS4gKi9cbiAgcHJpdmF0ZSBnZXRMb29wRW5kU2VsZWN0T3B0aW9ucygpOiBTZWxlY3RPcHRpb25bXSB7XG4gICAgY29uc3QgZW5kT3B0aW9uOiBTZWxlY3RPcHRpb24gPSB7XG4gICAgICBpZDogVGVzdENhc2VMb29wU3RlcENvbXBvbmVudC5MT09QX0lOREVYX0VORCxcbiAgICAgIHZhbHVlOiBUZXN0Q2FzZUxvb3BTdGVwQ29tcG9uZW50LkxPT1BfSU5ERVhfRU5ELFxuICAgICAgbmFtZTogJ0VuZCcsXG4gICAgICBsYWJlbDogJ0VuZCcsXG4gICAgfTtcbiAgICByZXR1cm4gWy4uLnRoaXMuZ2V0TG9vcFN0ZXBTZWxlY3RPcHRpb25zKCksIGVuZE9wdGlvbl07XG4gIH1cblxuICAvKiogSGFuZGxlIGRhdGEgcHJvZmlsZSBzZWxlY3Rpb246IHVwZGF0ZSBkaXNwbGF5LCBjbGFtcCBzdGFydC9lbmQgdG8gbmV3IHByb2ZpbGUgcmFuZ2UsIHJlZnJlc2ggc3RhcnQvZW5kIGRyb3Bkb3ducy4gKi9cbiAgcHJpdmF0ZSBvbkRhdGFQcm9maWxlQ2hhbmdlKHByb2ZpbGVJZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRlc3REYXRhUHJvZmlsZUNoYW5nZShwcm9maWxlSWQpO1xuICAgIGlmICh0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuO1xuICAgIGNvbnN0IE4gPSB0aGlzLmdldFNlbGVjdGVkUHJvZmlsZURhdGFMZW5ndGgoKTtcbiAgICBpZiAoTiA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldExvb3BTdGVwT3B0aW9ucygpO1xuICAgIGNvbnN0IG1heFZhbCA9IG9wdGlvbnMubGVuZ3RoID4gMCA/IG9wdGlvbnNbb3B0aW9ucy5sZW5ndGggLSAxXSA6IDE7XG4gICAgbGV0IHN0YXJ0VmFsID0gdGhpcy5lZGl0Rm9ybT8uZ2V0KCdzdGFydFN0ZXAnKT8udmFsdWUgPz8gdGhpcy5zdGFydFN0ZXA7XG4gICAgbGV0IGVuZFZhbCA9IHRoaXMuZWRpdEZvcm0/LmdldCgnZW5kU3RlcCcpPy52YWx1ZSA/PyB0aGlzLmVuZFN0ZXA7XG4gICAgaWYgKHN0YXJ0VmFsICE9IG51bGwgJiYgc3RhcnRWYWwgPiBtYXhWYWwpIHN0YXJ0VmFsID0gbWF4VmFsO1xuICAgIGlmIChlbmRWYWwgIT0gbnVsbCAmJiBlbmRWYWwgPiBtYXhWYWwpIGVuZFZhbCA9IG1heFZhbDtcbiAgICBpZiAoc3RhcnRWYWwgIT0gbnVsbCAmJiBlbmRWYWwgIT0gbnVsbCAmJiBzdGFydFZhbCA+IGVuZFZhbCkgZW5kVmFsID0gc3RhcnRWYWw7XG4gICAgaWYgKHRoaXMuZWRpdEZvcm0pIHtcbiAgICAgIGlmIChzdGFydFZhbCAhPSBudWxsKSB0aGlzLmVkaXRGb3JtLmdldCgnc3RhcnRTdGVwJyk/LnNldFZhbHVlKHN0YXJ0VmFsKTtcbiAgICAgIGlmIChlbmRWYWwgIT0gbnVsbCkgdGhpcy5lZGl0Rm9ybS5nZXQoJ2VuZFN0ZXAnKT8uc2V0VmFsdWUoZW5kVmFsKTtcbiAgICB9XG4gICAgdGhpcy5zdGFydFN0ZXAgPSBzdGFydFZhbCA/PyB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbmRTdGVwID0gZW5kVmFsID8/IHVuZGVmaW5lZDtcbiAgICB0aGlzLnVwZGF0ZVN0YXJ0RW5kU3RlcFNlbGVjdENvbmZpZ3NTZWxlY3RlZFZhbHVlcygpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgc2VhcmNoIGZvciBkYXRhIHByb2ZpbGVzICovXG4gIHByaXZhdGUgb25TZWFyY2hEYXRhUHJvZmlsZXMocXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQocXVlcnkpO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBsb2FkIG1vcmUgZGF0YSBwcm9maWxlcyAqL1xuICBwcml2YXRlIG9uTG9hZE1vcmVEYXRhUHJvZmlsZXMocXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSk7XG4gIH1cblxuICBvbkVkaXRGb3JtRmllbGRDaGFuZ2UoY29udHJvbE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0uZ2V0KGNvbnRyb2xOYW1lKT8uc2V0VmFsdWUodmFsdWUpO1xuICB9XG5cbiAgZ2V0TG9vcFR5cGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdGT1IgTE9PUCcgOiAnV0hJTEUgTE9PUCc7XG4gIH1cblxuICBpc1doaWxlTG9vcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJztcbiAgfVxuXG4gIGlzRm9yTG9vcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ2Zvcic7XG4gIH1cblxuICBnZXRTdGFydExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gJ1NUQVJUIEZPUicgOiAnU1RBUlQgV0hJTEUnO1xuICB9XG5cbiAgZ2V0RW5kTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyAnRU5EIEZPUicgOiAnRU5EIFdISUxFJztcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGRpc3BsYXkgc3RhcnQgaW5kZXg6IHByZWZlciBmb3JMb29wU3RhcnRJbmRleCBmcm9tIHN0ZXAgKG9yIGRhdGFNYXBKc29uL2RhdGFNYXBCZWFuKSwgZWxzZSBzdGFydFN0ZXAsIGVsc2UgZnJvbSBuZXN0ZWQgc3RlcHMgKi9cbiAgcHJpdmF0ZSBnZXREaXNwbGF5U3RhcnRJbmRleCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB2ID0gY2ZnPy5mb3JMb29wU3RhcnRJbmRleCA/PyBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wU3RhcnRJbmRleCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uc3RhcnRJbmRleDtcbiAgICBpZiAodiAhPSBudWxsKSByZXR1cm4gTnVtYmVyKHYpO1xuICAgIGlmICh0aGlzLnN0YXJ0U3RlcCAhPSBudWxsKSByZXR1cm4gdGhpcy5zdGFydFN0ZXA7XG4gICAgcmV0dXJuIHRoaXMubmVzdGVkU3RlcHNbMF0/LnN0ZXBOdW1iZXIgYXMgbnVtYmVyIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFJlc29sdmUgZGlzcGxheSBlbmQgaW5kZXg6IHByZWZlciBmb3JMb29wRW5kSW5kZXggZnJvbSBzdGVwIChvciBkYXRhTWFwSnNvbi9kYXRhTWFwQmVhbiksIGVsc2UgZW5kU3RlcCwgZWxzZSBmcm9tIG5lc3RlZCBzdGVwcyAqL1xuICBwcml2YXRlIGdldERpc3BsYXlFbmRJbmRleCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB2ID0gY2ZnPy5mb3JMb29wRW5kSW5kZXggPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcEVuZEluZGV4ID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5lbmRJbmRleDtcbiAgICBpZiAodiAhPSBudWxsKSByZXR1cm4gTnVtYmVyKHYpO1xuICAgIGlmICh0aGlzLmVuZFN0ZXAgIT0gbnVsbCkgcmV0dXJuIHRoaXMuZW5kU3RlcDtcbiAgICBjb25zdCBsYXN0ID0gdGhpcy5uZXN0ZWRTdGVwc1t0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiBsYXN0Py5zdGVwTnVtYmVyIGFzIG51bWJlciB8IHVuZGVmaW5lZCA/PyB0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGRpc3BsYXkgcHJvZmlsZSBuYW1lOiBtYXAgZm9yTG9vcFRlc3REYXRhSWQgdG8gcHJvZmlsZSBuYW1lIGZyb20gZGF0YVByb2ZpbGVPcHRpb25zLCBlbHNlIHVzZSB0ZXN0RGF0YVByb2ZpbGUgKi9cbiAgcHJpdmF0ZSBnZXREaXNwbGF5VGVzdERhdGFQcm9maWxlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBpZCA9IGNmZz8uZm9yTG9vcFRlc3REYXRhSWQgPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFRlc3REYXRhSWQgPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnRlc3REYXRhSWQ7XG4gICAgaWYgKGlkICE9IG51bGwgJiYgdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5maW5kKFxuICAgICAgICBvID0+IG8uaWQgPT09IGlkIHx8IFN0cmluZyhvLmlkKSA9PT0gU3RyaW5nKGlkKVxuICAgICAgKTtcbiAgICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoLm5hbWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRlc3REYXRhUHJvZmlsZSA/PyAnJztcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHNlbGVjdGVkIGRhdGEgcHJvZmlsZSAoYnkgZm9yTG9vcFRlc3REYXRhSWQgb3IgZm9ybSB2YWx1ZSksIG9yIG51bGwuICovXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWREYXRhUHJvZmlsZSgpOiBEYXRhUHJvZmlsZU9wdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IHByb2ZpbGVJZCA9IHRoaXMuZWRpdEZvcm0/LmdldCgndGVzdERhdGFQcm9maWxlJyk/LnZhbHVlID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5mb3JMb29wVGVzdERhdGFJZCA/PyAodGhpcy5jb25maWcgYXMgYW55KT8uZGF0YU1hcEpzb24/LmZvckxvb3BUZXN0RGF0YUlkID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnRlc3REYXRhSWQ7XG4gICAgaWYgKHByb2ZpbGVJZCA9PSBudWxsIHx8ICF0aGlzLmRhdGFQcm9maWxlT3B0aW9ucz8ubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAobzogRGF0YVByb2ZpbGVPcHRpb24pID0+IFN0cmluZyhvLmlkKSA9PT0gU3RyaW5nKHByb2ZpbGVJZCkgfHwgby5pZCA9PT0gcHJvZmlsZUlkXG4gICAgKTtcbiAgICByZXR1cm4gbWF0Y2ggPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBHZXQgZGlzcGxheSBuYW1lIGZvciBhIDEtYmFzZWQgcm93IGluZGV4IGZyb20gdGhlIHNlbGVjdGVkIHByb2ZpbGUncyBkYXRhIGFycmF5IChkYXRhW2luZGV4LTFdLm5hbWUpLiBSZXR1cm5zIG51bGwgaWYgbm8gbmFtZS4gKi9cbiAgcHJpdmF0ZSBnZXREYXRhUm93TmFtZUZvck9uZUJhc2VkSW5kZXgob25lQmFzZWRJbmRleDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgcHJvZmlsZSA9IHRoaXMuZ2V0U2VsZWN0ZWREYXRhUHJvZmlsZSgpO1xuICAgIGlmICghcHJvZmlsZT8uZGF0YSB8fCAhQXJyYXkuaXNBcnJheShwcm9maWxlLmRhdGEpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpZHggPSBvbmVCYXNlZEluZGV4IC0gMTtcbiAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gcHJvZmlsZS5kYXRhLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgcm93ID0gcHJvZmlsZS5kYXRhW2lkeF07XG4gICAgcmV0dXJuIHJvdyAmJiAocm93Lm5hbWUgIT0gbnVsbCA/IFN0cmluZyhyb3cubmFtZSkgOiBudWxsKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRlc3QgZGF0YSBwcm9maWxlIGlzIHNldCAoc28gd2UgY2FuIHNob3cvaGlkZSB0aGUgY2hpcCkgKi9cbiAgaGFzVGVzdERhdGFQcm9maWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldERpc3BsYXlUZXN0RGF0YVByb2ZpbGVOYW1lKCkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHN0YXJ0IHZhbHVlIGlzIGV4cGxpY2l0bHkgc2V0IChjb25maWcgb3Igc3RhcnRTdGVwIGlucHV0KSwgbm90IGluZmVycmVkIGZyb20gbmVzdGVkIHN0ZXBzICovXG4gIGhhc1N0YXJ0VmFsdWUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHYgPSBjZmc/LmZvckxvb3BTdGFydEluZGV4ID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BTdGFydEluZGV4ID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5zdGFydEluZGV4O1xuICAgIGlmICh2ICE9IG51bGwpIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLnN0YXJ0U3RlcCAhPSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogV2hldGhlciBlbmQgdmFsdWUgaXMgZXhwbGljaXRseSBzZXQgKGNvbmZpZyBvciBlbmRTdGVwIGlucHV0KSwgbm90IGluZmVycmVkIGZyb20gbmVzdGVkIHN0ZXBzICovXG4gIGhhc0VuZFZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB2ID0gY2ZnPy5mb3JMb29wRW5kSW5kZXggPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcEVuZEluZGV4ID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5lbmRJbmRleDtcbiAgICBpZiAodiAhPSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5lbmRTdGVwICE9IG51bGwpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldFN0ZXBzU3VtbWFyeSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcwIHN0ZXBzJztcbiAgICB9XG4gICAgY29uc3QgY291bnQgPSB0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aDtcbiAgICBsZXQgc3RhcnRWYWw6IG51bWJlciB8IHN0cmluZyA9IHRoaXMuZ2V0RGlzcGxheVN0YXJ0SW5kZXgoKTtcbiAgICBsZXQgZW5kVmFsOiBudW1iZXIgfCBzdHJpbmcgPSB0aGlzLmdldERpc3BsYXlFbmRJbmRleCgpO1xuICAgIC8vIC0xIG1lYW5zIFwiU3RhcnRcIi9cIkVuZFwiIHBsYWNlaG9sZGVyOyB1c2UgYWN0dWFsIHN0ZXAgbnVtYmVycyBmcm9tIG5lc3RlZCBzdGVwcyAoZS5nLiAxLjEsIDEuMTMpXG4gICAgaWYgKHN0YXJ0VmFsID09IG51bGwgfHwgc3RhcnRWYWwgPT09IC0xKSB7XG4gICAgICBzdGFydFZhbCA9ICh0aGlzLm5lc3RlZFN0ZXBzWzBdIGFzIGFueSk/LnN0ZXBOdW1iZXIgPz8gMTtcbiAgICB9XG4gICAgaWYgKGVuZFZhbCA9PSBudWxsIHx8IGVuZFZhbCA9PT0gLTEpIHtcbiAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLm5lc3RlZFN0ZXBzW3RoaXMubmVzdGVkU3RlcHMubGVuZ3RoIC0gMV07XG4gICAgICBlbmRWYWwgPSAobGFzdCBhcyBhbnkpPy5zdGVwTnVtYmVyID8/IGNvdW50O1xuICAgIH1cbiAgICByZXR1cm4gYFN0ZXBzICR7c3RhcnRWYWx9LSR7ZW5kVmFsfSAoJHtjb3VudH0gc3RlcCR7Y291bnQgIT09IDEgPyAncycgOiAnJ30pYDtcbiAgfVxuXG4gIGdldFN0YXJ0U3RlcExhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmdldERpc3BsYXlTdGFydEluZGV4KCk7XG4gICAgaWYgKHN0YXJ0ID09IG51bGwpIHJldHVybiBgU3RhcnQ6ICR7dGhpcy5uZXN0ZWRTdGVwc1swXT8uc3RlcE51bWJlciA/PyAxfWA7XG4gICAgLy8gSWYgc3RhcnQgaXMgLTEsIHVzZXIgc2VsZWN0ZWQgXCJTdGFydFwiIG9wdGlvbiwganVzdCByZXR1cm4gXCJTdGFydFwiXG4gICAgaWYgKHN0YXJ0ID09PSAtMSkgcmV0dXJuICdTdGFydCc7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KHN0YXJ0KTtcbiAgICByZXR1cm4gbmFtZSAhPSBudWxsID8gYFN0YXJ0OiAke25hbWV9YCA6IGBTdGFydDogJHtzdGFydH1gO1xuICB9XG5cbiAgZ2V0RW5kU3RlcExhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZW5kID0gdGhpcy5nZXREaXNwbGF5RW5kSW5kZXgoKTtcbiAgICBpZiAoZW5kID09IG51bGwpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRFbmQgPSB0aGlzLm5lc3RlZFN0ZXBzW3RoaXMubmVzdGVkU3RlcHMubGVuZ3RoIC0gMV0/LnN0ZXBOdW1iZXIgPz8gdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgICByZXR1cm4gYEVuZDogJHtkZWZhdWx0RW5kfWA7XG4gICAgfVxuICAgIC8vIElmIGVuZCBpcyAtMSwgdXNlciBzZWxlY3RlZCBcIkVuZFwiIG9wdGlvbiwganVzdCByZXR1cm4gXCJFbmRcIlxuICAgIGlmIChlbmQgPT09IC0xKSByZXR1cm4gJ0VuZCc7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KGVuZCk7XG4gICAgcmV0dXJuIG5hbWUgIT0gbnVsbCA/IGBFbmQ6ICR7bmFtZX1gIDogYEVuZDogJHtlbmR9YDtcbiAgfVxuXG4gIGdldFRlc3REYXRhUHJvZmlsZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGlzcGxheVRlc3REYXRhUHJvZmlsZU5hbWUoKTtcbiAgICBpZiAobmFtZSkgcmV0dXJuIGBUZXN0IERhdGEgcHJvZmlsZTogJHtuYW1lfWA7XG4gICAgcmV0dXJuICdUZXN0IERhdGEgcHJvZmlsZSc7XG4gIH1cblxuICAvKiogQ29tYmluZWQgZGlzcGxheSBmb3IgZm9yIGxvb3Agd2l0aCBIVE1MIGJhZGdlcyAtIHN1cHBvcnRzIHRlc3RfZGF0YSBiYWRnZXMgbGlrZSBjb25kaXRpb24gc3RlcDsgZGF0YS1rZXkvZGF0YS1ldmVudC1rZXkgZW5hYmxlIGNsaWNrLXRvLWVkaXQgKi9cbiAgZ2V0Rm9yTG9vcERpc3BsYXkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgaWYgKGNmZz8uZm9yTG9vcERpc3BsYXlIdG1sKSByZXR1cm4gY2ZnLmZvckxvb3BEaXNwbGF5SHRtbDtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5oYXNUZXN0RGF0YVByb2ZpbGUoKSkge1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGlzcGxheVRlc3REYXRhUHJvZmlsZU5hbWUoKTtcbiAgICAgIHBhcnRzLnB1c2goYFRlc3QgRGF0YSBwcm9maWxlOiA8c3BhbiBkYXRhLWtleT1cInRlc3QtZGF0YVwiIGRhdGEtZXZlbnQta2V5PVwidGVzdERhdGFQcm9maWxlXCIgY2xhc3M9XCJ0ZXN0X2RhdGFcIj4ke3RoaXMuZXNjYXBlRm9yTG9vcEh0bWwobmFtZSl9PC9zcGFuPmApO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNTdGFydFZhbHVlKCkpIHtcbiAgICAgIGNvbnN0IGZ1bGwgPSB0aGlzLmdldFN0YXJ0U3RlcExhYmVsKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGZ1bGwucmVwbGFjZSgvXlN0YXJ0OlxccyovLCAnJyk7XG4gICAgICBwYXJ0cy5wdXNoKGBTdGFydDogPHNwYW4gZGF0YS1rZXk9XCJ0ZXN0LWRhdGFcIiBkYXRhLWV2ZW50LWtleT1cImZvckxvb3BTdGFydEluZGV4XCIgY2xhc3M9XCJ0ZXN0X2RhdGFcIj4ke3RoaXMuZXNjYXBlRm9yTG9vcEh0bWwodmFsdWUpfTwvc3Bhbj5gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRW5kVmFsdWUoKSkge1xuICAgICAgY29uc3QgZnVsbCA9IHRoaXMuZ2V0RW5kU3RlcExhYmVsKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGZ1bGwucmVwbGFjZSgvXkVuZDpcXHMqLywgJycpO1xuICAgICAgcGFydHMucHVzaChgRW5kOiA8c3BhbiBkYXRhLWtleT1cInRlc3QtZGF0YVwiIGRhdGEtZXZlbnQta2V5PVwiZm9yTG9vcEVuZEluZGV4XCIgY2xhc3M9XCJ0ZXN0X2RhdGFcIj4ke3RoaXMuZXNjYXBlRm9yTG9vcEh0bWwodmFsdWUpfTwvc3Bhbj5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJywgJyk7XG4gIH1cblxuICBwcml2YXRlIGVzY2FwZUZvckxvb3BIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gJyc7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnRleHRDb250ZW50ID0gdGV4dDtcbiAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcbiAgfVxuXG4gIC8qKiBGdWxsIGRpc3BsYXkgZm9yIHdoaWxlIGxvb3A6IHN1YnN0aXR1dGVzICN7dmFyaWFibGV9IHdpdGggSFRNTCBiYWRnZXMgKGVsZW1lbnQvdGVzdF9kYXRhKSBzbyBjbGlja3Mgb3BlbiBwb3B1cCAtIG1heCBpdGVyYXRpb25zIHNob3duIGFzIHNlcGFyYXRlIGJhZGdlICovXG4gIGdldENvbmRpdGlvbkRpc3BsYXkoKTogc3RyaW5nIHtcbiAgICBsZXQgYmFzZSA9IHRoaXMuY29uZGl0aW9uIHx8ICdlbGVtZW50IFwiLm5vdGlmaWNhdGlvbi1iYWRnZVwiIGV4aXN0cyc7XG4gICAgY29uc3Qgd2l0aFdoaWxlID0gYmFzZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ3doaWxlICcpID8gYmFzZSA6IGBXaGlsZSAke2Jhc2V9YDtcbiAgICAvLyBTdHJpcCAobWF4IE4gaXRlcmF0aW9ucykgZnJvbSB0ZXh0IC0gc2hvd24gYXMgYmFkZ2UgaW5zdGVhZFxuICAgIGNvbnN0IHJlc3VsdCA9IHdpdGhXaGlsZS5yZXBsYWNlKC9cXHMqXFwobWF4XFxzK1xcZCtcXHMraXRlcmF0aW9uc1xcKVxccyokL2ksICcnKS50cmltKCk7XG4gICAgcmV0dXJuIHRoaXMuc3Vic3RpdHV0ZVRlbXBsYXRlVmFyaWFibGVzVG9IdG1sKHJlc3VsdCk7XG4gIH1cblxuICAvKiogU3Vic3RpdHV0ZXMgI3t2YXJpYWJsZX0gcGxhY2Vob2xkZXJzIHdpdGggSFRNTCBiYWRnZSBzcGFucyB1c2luZyBjb25maWcuZXZlbnQgLSBlbmFibGVzIGNsaWNrLXRvLWVkaXQgcG9wdXAgbGlrZSBjb25kaXRpb24gc3RlcCAqL1xuICBwcml2YXRlIHN1YnN0aXR1dGVUZW1wbGF0ZVZhcmlhYmxlc1RvSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCB8fCB0eXBlb2YgdGV4dCAhPT0gJ3N0cmluZycpIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGV2ID0gKHRoaXMuY29uZmlnIGFzIGFueSk/LmV2ZW50ID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy50ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgPz8ge307XG4gICAgaWYgKHR5cGVvZiBldiAhPT0gJ29iamVjdCcgfHwgZXYgPT09IG51bGwpIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGVzY2FwZSA9ICh2OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZGl2LnRleHRDb250ZW50ID0gdjtcbiAgICAgIHJldHVybiBkaXYuaW5uZXJIVE1MO1xuICAgIH07XG4gICAgY29uc3QgZWxlbWVudFZhcnMgPSBbJ2xhYmVsJywgJ2Rlc2NyaXB0aW9uJywgJ2VsZW1lbnQnLCAnc2VsZWN0b3InLCAnYWlfdGFzaycsICdxdWVyeScsICdjdXN0b21fY29kZSddO1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhcnMgPSBbJ2F0dHJpYnV0ZSddO1xuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcI1xceyhbXn1dKylcXH0vZywgKF8sIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBldltrZXldO1xuICAgICAgY29uc3QgZGlzcGxheVZhbCA9IHZhbCAhPSBudWxsICYmIHZhbCAhPT0gJycgPyBTdHJpbmcodmFsKSA6IGtleTtcbiAgICAgIGNvbnN0IGVzY2FwZWQgPSBlc2NhcGUoZGlzcGxheVZhbCk7XG4gICAgICBpZiAoZWxlbWVudFZhcnMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICByZXR1cm4gYDxzcGFuIGRhdGEta2V5PVwiJHtrZXl9XCIgZGF0YS1ldmVudC1rZXk9XCIke2tleX1cIiBjbGFzcz1cImVsZW1lbnRcIj4ke2VzY2FwZWR9PC9zcGFuPmA7XG4gICAgICB9XG4gICAgICBpZiAoYXR0cmlidXRlVmFycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBgPHNwYW4gZGF0YS1rZXk9XCIke2tleX1cIiBkYXRhLWV2ZW50LWtleT1cIiR7a2V5fVwiIGNsYXNzPVwiYXR0cmlidXRlXCI+JHtlc2NhcGVkfTwvc3Bhbj5gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGA8c3BhbiBkYXRhLWtleT1cIiR7a2V5fVwiIGRhdGEtZXZlbnQta2V5PVwiJHtrZXl9XCIgY2xhc3M9XCJ0ZXN0X2RhdGFcIj4ke2VzY2FwZWR9PC9zcGFuPmA7XG4gICAgfSk7XG4gIH1cblxuICAvKiogRXZlbnQga2V5LXZhbHVlIHBhaXJzIGZvciBkaXNwbGF5IChlLmcuIHNlbGVjdG9yLCBlbGVtZW50KSAtIHNhbWUgYXMgY29uZGl0aW9uIHN0ZXAgZ2V0QnJhbmNoRXZlbnREZXRhaWxzRm9yRGlzcGxheSAqL1xuICBnZXRMb29wRXZlbnREZXRhaWxzRm9yRGlzcGxheSgpOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gICAgY29uc3QgZXZlbnQgPSB0aGlzLmNvbmZpZz8uZXZlbnQ7XG4gICAgaWYgKCFldmVudCB8fCB0eXBlb2YgZXZlbnQgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGV2ZW50KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+IGtleSAhPT0gJ2N1c3RvbUV2ZW50JylcbiAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogdmFsdWUgIT0gbnVsbCA/IFN0cmluZyh2YWx1ZSkgOiAnJ1xuICAgICAgfSkpO1xuICB9XG5cbiAgb25Ub2dnbGVFeHBhbmRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gIXRoaXMuZXhwYW5kZWQ7XG4gICAgdGhpcy50b2dnbGVFeHBhbmRlZC5lbWl0KHtjb25maWc6dGhpcy5jb25maWcsIGV4cGFuZGVkOnRoaXMuZXhwYW5kZWR9KTtcbiAgfVxuXG4gIG9uVGVzdERhdGFQcm9maWxlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHZhbHVlO1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25TdGFydFN0ZXBDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc3RhcnRTdGVwID0gdmFsdWU7XG4gICAgdGhpcy5zdGFydFN0ZXBDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbkVuZFN0ZXBDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZW5kU3RlcCA9IHZhbHVlO1xuICAgIHRoaXMuZW5kU3RlcENoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uQ29uZGl0aW9uQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMuY29uZGl0aW9uQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25NYXhJdGVyYXRpb25zQ2hhbmdlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB2YWx1ZTtcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnNDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZXN0ZWRTdGVwQ2hhbmdlLmVtaXQoeyBzdGVwLCBpbmRleCB9KTtcbiAgfVxuXG4gIG9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoZXZlbnQ6IGJvb2xlYW4gfCB7Y29uZmlnOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGV4cGFuZGVkOiBib29sZWFufSwgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gSGFuZGxlIGJvdGggYm9vbGVhbiBhbmQgb2JqZWN0IGZvcm1hdHNcbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnb2JqZWN0JyAmJiBldmVudCAhPT0gbnVsbCAmJiAnZXhwYW5kZWQnIGluIGV2ZW50KSB7XG4gICAgICAvLyBPYmplY3QgZm9ybWF0IGZyb20gc3RlcC1ncm91cDoge2NvbmZpZywgZXhwYW5kZWR9XG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQuZXhwYW5kZWQ7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgZXZlbnQncyBjb25maWcgaXMgYSBzdGVwLWdyb3VwIChub3QgdGhlIGN1cnJlbnQgc3RlcClcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBuZXN0ZWQgc3RlcC1ncm91cCBldmVudHMgYnViYmxlIHVwIGNvcnJlY3RseSBldmVuIHdoZW4gY29uZGl0aW9uIHN0ZXAgaXMgaW5zaWRlIGxvb3Agc3RlcFxuICAgICAgaWYgKHRoaXMuaXNTdGVwR3JvdXAoZXZlbnQuY29uZmlnKSkge1xuICAgICAgICAvLyBSZS1lbWl0IHRoZSB0b2dnbGVFeHBhbmRlZCBldmVudCB3aXRoIHRoZSBvYmplY3QgZm9ybWF0LCBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCBjb25maWdcbiAgICAgICAgLy8gQ2FzdCB0byBzYXRpc2Z5IFR5cGVTY3JpcHQgLSB0aGUgcmVuZGVyZXIgYWNjZXB0cyBUZXN0Q2FzZVN0ZXBDb25maWcgd2hpY2ggaW5jbHVkZXMgU3RlcEdyb3VwQ29uZmlnXG4gICAgICAgIHRoaXMudG9nZ2xlRXhwYW5kZWQuZW1pdCh7Y29uZmlnOiBldmVudC5jb25maWcgYXMgYW55IGFzIExvb3BTdGVwQ29uZmlnLCBleHBhbmRlZDogZXZlbnQuZXhwYW5kZWR9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQm9vbGVhbiBmb3JtYXQgZnJvbSBvdGhlciBzdGVwIHR5cGVzXG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQgYXMgYm9vbGVhbjtcbiAgICB9XG4gICAgdGhpcy5vbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaW5kZXgpO1xuICB9XG5cbiAgb25BZGRTdGVwKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkU3RlcC5lbWl0KCk7XG4gIH1cblxuICAvKiogUmUtZW1pdCBhZGRTdGVwRm9yTG9vcCBmcm9tIG5lc3RlZCBsb29wIHNvIE4tbGV2ZWwgbmVzdGluZyB3b3JrcyAoZW1wdHktc3RhdGUgYWRkIHN0ZXApLiAqL1xuICBvbkFkZFN0ZXBGb3JMb29wRnJvbU5lc3RlZChldmVudDogeyBsb29wU3RlcENvbmZpZzogTG9vcFN0ZXBDb25maWcgfSk6IHZvaWQge1xuICAgIGlmIChldmVudD8ubG9vcFN0ZXBDb25maWcpIHtcbiAgICAgIHRoaXMuYWRkU3RlcC5lbWl0KHsgbG9vcFN0ZXBDb25maWc6IGV2ZW50Lmxvb3BTdGVwQ29uZmlnIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZFN0ZXAuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWxsZWQgZnJvbSBlbXB0eS1zdGF0ZSBwbHVzIG9ubHk7IHNhbWUgYmVoYXZpb3VyIGFzIGFkZC1zdGVwLWJldHdlZW4gKHBhcmVudElkID0gbG9vcCBzdGVwIGlkLCBwb3NpdGlvbiA9IHBhcmVudCArIDEpLiAqL1xuICBvbkFkZFN0ZXBFbXB0eSgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZFN0ZXAuZW1pdCh7IGxvb3BTdGVwQ29uZmlnOiB0aGlzLmNvbmZpZyB9KTtcbiAgfVxuXG4gIG9uRGVsZXRlU3RlcChwYXlsb2FkT3JJbmRleDogYW55LCBpbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGlkeCA9IHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicgPyBpbmRleCA6IHBheWxvYWRPckluZGV4O1xuICAgIGNvbnN0IHBheWxvYWQgPSB0eXBlb2YgaW5kZXggPT09ICdudW1iZXInID8gcGF5bG9hZE9ySW5kZXggOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5kZWxldGVTdGVwLmVtaXQoaWR4KTtcbiAgICBpZiAocGF5bG9hZD8uc3RlcCkgdGhpcy5kZWxldGUuZW1pdChwYXlsb2FkKTtcbiAgfVxuXG4gIC8qKiBSZS1lbWl0IGVkaXQgZnJvbSBuZXN0ZWQgc3RlcCBzbyB0aGUgcG9ydGFsIGNhbiBvcGVuIGVkaXQgbW9kYWwgKHNhbWUgYXMgcm9vdCBsZXZlbCkuICovXG4gIG9uTmVzdGVkRWRpdChldmVudDogeyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGlmIChldmVudD8uc3RlcCAhPSBudWxsKSB0aGlzLmVkaXQuZW1pdChldmVudCBhcyBhbnkpO1xuICB9XG5cbiAgLyoqIFJlLWVtaXQgZHVwbGljYXRlIGZyb20gbmVzdGVkIHN0ZXAgc28gdGhlIHBvcnRhbCBjYW4gZHVwbGljYXRlIChzYW1lIGFzIHJvb3QgbGV2ZWwpLiAqL1xuICBvbk5lc3RlZER1cGxpY2F0ZShldmVudDogYW55LCBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmR1cGxpY2F0ZS5lbWl0KChldmVudCAmJiBldmVudC5zdGVwICE9IG51bGwpID8gZXZlbnQgOiB7IHN0ZXAgfSBhcyBhbnkpO1xuICB9XG5cbiAgaXNOb3JtYWxTdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgTm9ybWFsU3RlcENvbmZpZyB7XG4gICAgcmV0dXJuICdldmVudFR5cGUnIGluIHN0ZXA7XG4gIH1cblxuICBpc0xvb3BTdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgTG9vcFN0ZXBDb25maWcge1xuICAgIHJldHVybiAnbG9vcFR5cGUnIGluIHN0ZXA7XG4gIH1cblxuICBpc0NvbmRpdGlvblN0ZXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBDb25kaXRpb25TdGVwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2NvbmRpdGlvbicgaW4gc3RlcCAmJiAnYnJhbmNoZXMnIGluIHN0ZXA7XG4gIH1cblxuICBpc1N0ZXBHcm91cChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIFN0ZXBHcm91cENvbmZpZyB7XG4gICAgcmV0dXJuICdncm91cE5hbWUnIGluIHN0ZXA7XG4gIH1cblxuICBvbkFkZEJyYW5jaCgpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBsb29wIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBjb25kaXRpb24gc3RlcHNcbiAgfVxuXG4gIG9uRGVsZXRlQnJhbmNoKGJyYW5jaDogYW55KTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gbG9vcCBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgY29uZGl0aW9uIHN0ZXBzXG4gIH1cblxuICBvbk5lc3RlZENvbmRpdGlvbkFkZEJyYW5jaChuZXN0ZWRTdGVwOiBDb25kaXRpb25TdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gQWRkIGEgbmV3IGJyYW5jaCB0byB0aGUgbmVzdGVkIGNvbmRpdGlvbiBzdGVwXG4gICAgaWYgKCFuZXN0ZWRTdGVwLmJyYW5jaGVzKSB7XG4gICAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzID0gW107XG4gICAgfVxuICAgIGNvbnN0IG5ld0JyYW5jaDogQ29uZGl0aW9uQnJhbmNoID0ge1xuICAgICAgdHlwZTogbmVzdGVkU3RlcC5icmFuY2hlcy5sZW5ndGggPT09IDAgPyAnaWYnIDogJ2Vsc2UnLFxuICAgICAgbGFiZWw6IG5lc3RlZFN0ZXAuYnJhbmNoZXMubGVuZ3RoID09PSAwID8gJ0lGIFRSVUUnIDogJ0VMU0UnLCBcbiAgICAgIHN0ZXBUeXBlOiBTdGVwVHlwZXMuQ09ORElUSU9OX0lGLFxuICAgICAgbmVzdGVkU3RlcHM6IFtdXG4gICAgfTtcbiAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzLnB1c2gobmV3QnJhbmNoKTtcbiAgICB0aGlzLm9uTmVzdGVkU3RlcENoYW5nZShuZXN0ZWRTdGVwLCBpbmRleCk7XG4gIH1cblxuICBvbk5lc3RlZENvbmRpdGlvbkRlbGV0ZUJyYW5jaChuZXN0ZWRTdGVwOiBDb25kaXRpb25TdGVwQ29uZmlnLCBicmFuY2g6IGFueSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIFJlLWVtaXQgZGVsZXRlQnJhbmNoIHNvIHN0ZXAtbGlzdCBjYW4gb3BlbiBkZWxldGUgbW9kYWwgYW5kIGNhbGwgQVBJXG4gICAgdGhpcy5kZWxldGVCcmFuY2guZW1pdChicmFuY2gpO1xuICB9XG5cbiAgb25PcGVuRXh0ZXJuYWwoKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gbG9vcCBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgc3RlcCBncm91cHNcbiAgfVxuXG4gIC8qKiBTeW5jIEZPUiBsb29wIGVkaXQgZm9ybSBzbyBkcm9wZG93bnMgc2hvdyBleGlzdGluZyBjb25maWcgKGZvck9wdGlvblR5cGUsIGZvckxvb3BUZXN0RGF0YUlkL3Rlc3REYXRhUHJvZmlsZSwgZm9yTG9vcFN0YXJ0SW5kZXgvZm9yTG9vcEVuZEluZGV4KSAqL1xuICBwcml2YXRlIHN5bmNGb3JMb29wRWRpdEZvcm1Gcm9tQ29uZmlnKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0Rm9ybSB8fCB0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuO1xuICAgIGNvbnN0IHRlc3REYXRhVmFsID0gdGhpcy5nZXRUZXN0RGF0YVByb2ZpbGVGb3JtVmFsdWUoKTtcbiAgICBjb25zdCBzdGFydFZhbCA9IHRoaXMuZ2V0TG9vcFN0YXJ0Rm9ybVZhbHVlKCk7XG4gICAgY29uc3QgZW5kVmFsID0gdGhpcy5nZXRMb29wRW5kRm9ybVZhbHVlKCk7XG4gICAgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIGZvck9wdGlvblR5cGU6IHRoaXMuZ2V0Rm9yT3B0aW9uVHlwZUZyb21Db25maWcoKSA/PyBudWxsLFxuICAgICAgdGVzdERhdGFQcm9maWxlOiB0ZXN0RGF0YVZhbCxcbiAgICAgIHN0YXJ0U3RlcDogc3RhcnRWYWwsXG4gICAgICBlbmRTdGVwOiBlbmRWYWwsXG4gICAgfSk7XG4gICAgLy8gRXhwbGljaXRseSBzZXQgZWFjaCBjb250cm9sIHNvIG1hdC1zZWxlY3QgcGlja3MgdXAgdGhlIHZhbHVlIChwYXRjaFZhbHVlIGNhbiBiZSBpZ25vcmVkIGJ5IGNoaWxkIGluIHNvbWUgdGltaW5nIGNhc2VzKVxuICAgIGNvbnN0IHRlc3REYXRhQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKTtcbiAgICBjb25zdCBzdGFydEN0cmwgPSB0aGlzLmVkaXRGb3JtLmdldCgnc3RhcnRTdGVwJyk7XG4gICAgY29uc3QgZW5kQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdlbmRTdGVwJyk7XG4gICAgaWYgKHRlc3REYXRhQ3RybCAmJiB0ZXN0RGF0YVZhbCAhPT0gdW5kZWZpbmVkICYmIHRlc3REYXRhVmFsICE9PSAnJykgdGVzdERhdGFDdHJsLnNldFZhbHVlKHRlc3REYXRhVmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgaWYgKHN0YXJ0Q3RybCAmJiBzdGFydFZhbCAhPSBudWxsKSBzdGFydEN0cmwuc2V0VmFsdWUoc3RhcnRWYWwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICBpZiAoZW5kQ3RybCAmJiBlbmRWYWwgIT0gbnVsbCkgZW5kQ3RybC5zZXRWYWx1ZShlbmRWYWwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBvbkVkaXQoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0U25hcHNob3QgPSB7XG4gICAgICB0ZXN0RGF0YVByb2ZpbGU6IHRoaXMudGVzdERhdGFQcm9maWxlLFxuICAgICAgc3RhcnRTdGVwOiB0aGlzLnN0YXJ0U3RlcCxcbiAgICAgIGVuZFN0ZXA6IHRoaXMuZW5kU3RlcCxcbiAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24sXG4gICAgICBtYXhJdGVyYXRpb25zOiB0aGlzLm1heEl0ZXJhdGlvbnMsXG4gICAgICBzZWxlY3RlZFRlbXBsYXRlOiB0aGlzLnNlbGVjdGVkVGVtcGxhdGUsXG4gICAgICB0ZW1wbGF0ZVZhcmlhYmxlczogdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA/IFsuLi50aGlzLnRlbXBsYXRlVmFyaWFibGVzXSA6IFtdLFxuICAgICAgY29uZGl0aW9uVGVtcGxhdGVGb3JtVmFsdWU6IHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID8geyAuLi50aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS52YWx1ZSB9IDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgLy8gRk9SIGxvb3A6IHJlZnJlc2ggc2VsZWN0IGNvbmZpZ3MgKHNvIFRlc3QgRGF0YSBQcm9maWxlIG9wdGlvbnMgaW5jbHVkZSBzZWxlY3RlZCBpZCBpZiBuZWVkZWQpIHRoZW4gc3luYyBmb3JtIHNvIGRyb3Bkb3ducyBzaG93IHNlbGVjdGVkXG4gICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZvckxvb3BTZWxlY3RDb25maWdzU2VsZWN0ZWRWYWx1ZXMoKTtcbiAgICAgIHRoaXMuc3luY0Zvckxvb3BFZGl0Rm9ybUZyb21Db25maWcoKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnN5bmNGb3JMb29wRWRpdEZvcm1Gcm9tQ29uZmlnKCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICB0ZXN0RGF0YVByb2ZpbGU6IHRoaXMudGVzdERhdGFQcm9maWxlID8/ICcnLFxuICAgICAgICBzdGFydFN0ZXA6IHRoaXMuc3RhcnRTdGVwID8/IG51bGwsXG4gICAgICAgIGVuZFN0ZXA6IHRoaXMuZW5kU3RlcCA/PyBudWxsLFxuICAgICAgICBjb25kaXRpb246IHRoaXMuY29uZGl0aW9uID8/ICcnLFxuICAgICAgICBtYXhJdGVyYXRpb25zOiB0aGlzLm1heEl0ZXJhdGlvbnMgPz8gNSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgLy8gV2hlbiBuYXR1cmFsVGV4dEFjdGlvbklkIGV4aXN0cywgcG9wdWxhdGUgY29uZGl0aW9uIGFuZCBzZWxlY3RlZCB0ZW1wbGF0ZSBmcm9tIG9wdGlvbnMgc28gYXV0b2NvbXBsZXRlIHNob3dzIHNlbGVjdGVkIHRlbXBsYXRlXG4gICAgICBjb25zdCBjb25maWdXaXRoSWQgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgICBpZiAoY29uZmlnV2l0aElkPy5uYXR1cmFsVGV4dEFjdGlvbklkICE9IG51bGwgJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb24oKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25kaXRpb24gfHwgY29uZmlnV2l0aElkPy50ZW1wbGF0ZVZhcmlhYmxlc0RhdGEpIHtcbiAgICAgICAgLy8gRmFsbGJhY2s6IG1hdGNoIGJ5IGNvbmRpdGlvbiB0ZXh0IHdoZW4gbmF0dXJhbFRleHRBY3Rpb25JZCBub3Qgc2V0XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvblN0ciA9IHRoaXMuY29uZGl0aW9uIHx8IGNvbmZpZ1dpdGhJZD8uY29uZGl0aW9uIHx8ICcnO1xuICAgICAgICBpZiAoY29uZGl0aW9uU3RyICYmICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgfHwgW10pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYXMgYW55W10pLmZpbmQoXG4gICAgICAgICAgICAob3B0OiBhbnkpID0+IChvcHQubmF0dXJhbFRleHQgfHwgb3B0Lm5hbWUgfHwgb3B0LnZhbHVlKSA9PT0gY29uZGl0aW9uU3RyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbj8udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgICAgICAgaWYgKGZ1bGxUZW1wbGF0ZSAmJiBmdWxsVGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBmdWxsVGVtcGxhdGU7XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpIHx8IFtdO1xuICAgICAgICAgICAgdGhpcy5idWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgY29uZGl0aW9uOiB0aGlzLmNvbmRpdGlvbiA/PyAnJyxcbiAgICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zID8/IDUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5pc0VkaXRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZWRpdC5lbWl0KCk7XG4gIH1cblxuICBvbkVkaXRBcHBseSgpOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy5lZGl0Rm9ybS52YWx1ZTtcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWx1ZSA9IHYudGVzdERhdGFQcm9maWxlID8/ICcnO1xuICAgIHRoaXMuc3RhcnRTdGVwID0gdi5zdGFydFN0ZXAgPz8gdW5kZWZpbmVkO1xuICAgIHRoaXMuZW5kU3RlcCA9IHYuZW5kU3RlcCA/PyB1bmRlZmluZWQ7XG4gICAgdGhpcy5jb25kaXRpb24gPSB2LmNvbmRpdGlvbiA/PyAnJztcbiAgICBjb25zdCBtYXhWYWwgPSB2Lm1heEl0ZXJhdGlvbnM7XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zID0gdHlwZW9mIG1heFZhbCA9PT0gJ251bWJlcicgPyBtYXhWYWwgOiAobWF4VmFsICE9IG51bGwgJiYgbWF4VmFsICE9PSAnJyA/IE51bWJlcihtYXhWYWwpIDogdW5kZWZpbmVkKTtcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBzZWxlY3RlZCBkYXRhIHByb2ZpbGUgb3B0aW9uIHRvIGdldCBib3RoIElEIGFuZCBuYW1lXG4gICAgbGV0IHRlc3REYXRhUHJvZmlsZUlkOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRlc3REYXRhUHJvZmlsZU5hbWU6IHN0cmluZyA9ICcnO1xuICAgIFxuICAgIGlmICh0ZXN0RGF0YVByb2ZpbGVWYWx1ZSAmJiB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGUgZm9ybSB2YWx1ZSBtaWdodCBiZSBJRCAobnVtYmVyKSBvciBuYW1lIChzdHJpbmcpXG4gICAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5maW5kKFxuICAgICAgICBvcHRpb24gPT4gb3B0aW9uLmlkID09PSBOdW1iZXIodGVzdERhdGFQcm9maWxlVmFsdWUpIHx8IG9wdGlvbi5uYW1lID09PSB0ZXN0RGF0YVByb2ZpbGVWYWx1ZSB8fCBTdHJpbmcob3B0aW9uLmlkKSA9PT0gU3RyaW5nKHRlc3REYXRhUHJvZmlsZVZhbHVlKVxuICAgICAgKTtcbiAgICAgIGlmIChzZWxlY3RlZFByb2ZpbGUpIHtcbiAgICAgICAgdGVzdERhdGFQcm9maWxlSWQgPSBzZWxlY3RlZFByb2ZpbGUuaWQ7XG4gICAgICAgIHRlc3REYXRhUHJvZmlsZU5hbWUgPSBzZWxlY3RlZFByb2ZpbGUubmFtZTtcbiAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB0ZXN0RGF0YVByb2ZpbGVOYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgbm90IGZvdW5kLCB1c2UgdGhlIHZhbHVlIGFzLWlzIChtaWdodCBiZSBJRCBvciBuYW1lKVxuICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZVZhbHVlO1xuICAgICAgICB0ZXN0RGF0YVByb2ZpbGVJZCA9IE51bWJlcih0ZXN0RGF0YVByb2ZpbGVWYWx1ZSkgfHwgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZVZhbHVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBXaGlsZSBsb29wOiBidWlsZCB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgYW5kIG5hdHVyYWxUZXh0QWN0aW9uSWQgZnJvbSBzZWxlY3RlZCB0ZW1wbGF0ZSAoc2FtZSBhcyBjb25kaXRpb24tc3RlcClcbiAgICBsZXQgdGVtcGxhdGVWYXJpYWJsZXNEYXRhOiBhbnk7XG4gICAgbGV0IG5hdHVyYWxUZXh0QWN0aW9uSWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJyAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzPy5sZW5ndGgpIHtcbiAgICAgIHRlbXBsYXRlVmFyaWFibGVzRGF0YSA9IHt9O1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgdGVtcGxhdGVWYXJpYWJsZXNEYXRhW3ZhcmlhYmxlLm5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZT8uaWQgIT0gbnVsbCkge1xuICAgICAgICBuYXR1cmFsVGV4dEFjdGlvbklkID0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlLmlkO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBVcGRhdGUgY29uZmlnIHdpdGggbmV3IHZhbHVlcyAoaW5jbHVkZSB0ZXN0RGF0YVByb2ZpbGVJZCwgdGVtcGxhdGVWYXJpYWJsZXNEYXRhLCBuYXR1cmFsVGV4dEFjdGlvbklkIGZvciB3aGlsZTsgZm9yTG9vcFRlc3REYXRhSWQsIGZvckxvb3BTdGFydEluZGV4L2Zvckxvb3BFbmRJbmRleCBmb3IgZm9yKVxuICAgIGNvbnN0IHVwZGF0ZWRDb25maWc6IExvb3BTdGVwQ29uZmlnICYgeyB0ZXN0RGF0YVByb2ZpbGVJZD86IHN0cmluZyB8IG51bWJlcjsgdGVtcGxhdGVWYXJpYWJsZXNEYXRhPzogYW55OyBuYXR1cmFsVGV4dEFjdGlvbklkPzogbnVtYmVyIH0gPSB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogdGhpcy50ZXN0RGF0YVByb2ZpbGUsXG4gICAgICB0ZXN0RGF0YVByb2ZpbGVJZDogdGVzdERhdGFQcm9maWxlSWQsIC8vIEFkZCBJRCBmb3IgQVBJIGNhbGxcbiAgICAgIHN0YXJ0U3RlcDogdGhpcy5zdGFydFN0ZXAsXG4gICAgICBlbmRTdGVwOiB0aGlzLmVuZFN0ZXAsXG4gICAgICBjb25kaXRpb246IHRoaXMuY29uZGl0aW9uLFxuICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zLFxuICAgICAgLi4uKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScgJiYgT2JqZWN0LmtleXModGVtcGxhdGVWYXJpYWJsZXNEYXRhIHx8IHt9KS5sZW5ndGggPiAwICYmIHsgdGVtcGxhdGVWYXJpYWJsZXNEYXRhIH0pLFxuICAgICAgLi4uKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScgJiYgbmF0dXJhbFRleHRBY3Rpb25JZCAhPSBudWxsICYmIHsgbmF0dXJhbFRleHRBY3Rpb25JZCB9KSxcbiAgICAgIC4uLih0aGlzLmxvb3BUeXBlID09PSAnZm9yJyAmJiB0ZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmIHsgZm9yTG9vcFRlc3REYXRhSWQ6IE51bWJlcih0ZXN0RGF0YVByb2ZpbGVJZCkgfSksXG4gICAgICAuLi4odGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgJiYgdGhpcy5zdGFydFN0ZXAgIT0gbnVsbCAmJiB7IGZvckxvb3BTdGFydEluZGV4OiB0aGlzLnN0YXJ0U3RlcCB9KSxcbiAgICAgIC4uLih0aGlzLmxvb3BUeXBlID09PSAnZm9yJyAmJiB0aGlzLmVuZFN0ZXAgIT0gbnVsbCAmJiB7IGZvckxvb3BFbmRJbmRleDogdGhpcy5lbmRTdGVwIH0pLFxuICAgIH07XG4gICAgXG4gICAgLy8gRW1pdCBpbmRpdmlkdWFsIGNoYW5nZSBldmVudHNcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZUNoYW5nZS5lbWl0KHRoaXMudGVzdERhdGFQcm9maWxlKTtcbiAgICB0aGlzLnN0YXJ0U3RlcENoYW5nZS5lbWl0KHRoaXMuc3RhcnRTdGVwID8/IDEpO1xuICAgIHRoaXMuZW5kU3RlcENoYW5nZS5lbWl0KHRoaXMuZW5kU3RlcCA/PyAxKTtcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgdGhpcy5jb25kaXRpb25DaGFuZ2UuZW1pdCh0aGlzLmNvbmRpdGlvbik7XG4gICAgICB0aGlzLm1heEl0ZXJhdGlvbnNDaGFuZ2UuZW1pdCh0aGlzLm1heEl0ZXJhdGlvbnMgPz8gNSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEVtaXQgc3RlcCB1cGRhdGUgZXZlbnQgd2l0aCBmdWxsIGNvbmZpZ1xuICAgIGNvbnNvbGUubG9nKCdMb29wLXN0ZXA6IEVtaXR0aW5nIHN0ZXBVcGRhdGUgZXZlbnQnLCB1cGRhdGVkQ29uZmlnKTtcbiAgICB0aGlzLnN0ZXBVcGRhdGUuZW1pdCh1cGRhdGVkQ29uZmlnKTtcbiAgICBcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgb25FZGl0Q2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGhpcy5lZGl0U25hcHNob3QudGVzdERhdGFQcm9maWxlO1xuICAgIHRoaXMuc3RhcnRTdGVwID0gdGhpcy5lZGl0U25hcHNob3Quc3RhcnRTdGVwO1xuICAgIHRoaXMuZW5kU3RlcCA9IHRoaXMuZWRpdFNuYXBzaG90LmVuZFN0ZXA7XG4gICAgdGhpcy5jb25kaXRpb24gPSB0aGlzLmVkaXRTbmFwc2hvdC5jb25kaXRpb247XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zID0gdGhpcy5lZGl0U25hcHNob3QubWF4SXRlcmF0aW9ucztcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSB0aGlzLmVkaXRTbmFwc2hvdC5zZWxlY3RlZFRlbXBsYXRlO1xuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB0aGlzLmVkaXRTbmFwc2hvdC50ZW1wbGF0ZVZhcmlhYmxlcyB8fCBbXTtcbiAgICBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gJiYgdGhpcy5lZGl0U25hcHNob3QuY29uZGl0aW9uVGVtcGxhdGVGb3JtVmFsdWUpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtLnBhdGNoVmFsdWUodGhpcy5lZGl0U25hcHNob3QuY29uZGl0aW9uVGVtcGxhdGVGb3JtVmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgb25FZGl0SW5EZXB0aCh0ZW1wbGF0ZU92ZXJyaWRlPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5tb3JlT3B0aW9ucy5lbWl0KCk7XG4gICAgLy8gVXNlIHJlbmRlcmVyJ3MgaW5kZXggd2hlbiBhdmFpbGFibGUgKGNvcnJlY3QgZm9yIHN0cnVjdHVyYWwgc3RlcHMpLiBzdGVwTnVtYmVyIFwiMTAuM1wiIHBhcnNlcyB0byAxMCAtIHdyb25nLlxuICAgIGNvbnN0IGluZGV4ID0gdHlwZW9mIHRoaXMuaW5kZXggPT09ICdudW1iZXInXG4gICAgICA/IHRoaXMuaW5kZXhcbiAgICAgIDogKHR5cGVvZiB0aGlzLnN0ZXBOdW1iZXIgPT09ICdudW1iZXInID8gdGhpcy5zdGVwTnVtYmVyIDogKHR5cGVvZiB0aGlzLnN0ZXBOdW1iZXIgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQodGhpcy5zdGVwTnVtYmVyLCAxMCkgOiAwKSk7XG4gICAgY29uc3QgcGF5bG9hZDogeyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXI7IHRlbXBsYXRlT3ZlcnJpZGU/OiBhbnkgfSA9IHtcbiAgICAgIHN0ZXA6IHRoaXMuY29uZmlnIGFzIFRlc3RDYXNlU3RlcENvbmZpZyxcbiAgICAgIGluZGV4OiBpc05hTihpbmRleCBhcyBudW1iZXIpID8gMCA6IChpbmRleCBhcyBudW1iZXIpLFxuICAgIH07XG4gICAgaWYgKHRlbXBsYXRlT3ZlcnJpZGUpIHtcbiAgICAgIHBheWxvYWQudGVtcGxhdGVPdmVycmlkZSA9IHRlbXBsYXRlT3ZlcnJpZGU7XG4gICAgfVxuICAgIHRoaXMuZWRpdEluRGVwdGguZW1pdChwYXlsb2FkKTtcbiAgfVxuXG4gIG9uTGluaygpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBsb29wIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBzdGVwIGdyb3Vwc1xuICB9XG5cbiAgb25EdXBsaWNhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kdXBsaWNhdGUuZW1pdCgpO1xuICB9XG5cbiAgb25EZWxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGUuZW1pdCgpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2UoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoY2hlY2tlZCk7XG4gIH1cblxuICBvbk1vcmVPcHRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMubW9yZU9wdGlvbnMuZW1pdCgpO1xuICB9XG5cbiAgb25WaWV3RGV0YWlscyhldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbiB8fCB0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbi50cmltKCkgPT09ICcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBjb25zdCB0aXRsZSA9IHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gJ0ZPUiBMT09QIERldGFpbHMnIDogJ1dISUxFIExPT1AgRGV0YWlscyc7XG4gICAgICB0aGlzLnZpZXdEZXRhaWxzLmVtaXQoe1xuICAgICAgICBldmVudCxcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImxvb3Atc3RlcC1yb3cgY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gIDwhLS0gSW5saW5lIEVkaXQgTW9kZTogc3RvcCBwcm9wYWdhdGlvbiBzbyBkcm9wZG93bi9zZWxlY3QgaW50ZXJhY3Rpb25zIGRvbid0IGJ1YmJsZSBhbmQgY29sbGFwc2UgdGhlIHN0ZXAgb3Igc3RhcnQgZHJhZyAtLT5cbiAgPGRpdiAqbmdJZj1cImlzRWRpdGluZ1wiIGNsYXNzPVwiY3FhLXB5LTIuNSBjcWEtcHgtNCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1qdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtZmxleC1ncm93XCI+XG4gICAgICAgIDwhLS0gTG9vcCBUeXBlIExhYmVsIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxQzM5OEVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj5cbiAgICAgICAgICB7eyBnZXRMb29wVHlwZUxhYmVsKCkgfX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBGT1IgTE9PUCBpbmxpbmUgZWRpdDogY3FhLWR5bmFtaWMtc2VsZWN0IChzYW1lIHVzYWdlIGFzIGRlZmF1bHQgc3RvcmllcykgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcidcIj5cbiAgICAgICAgICA8IS0tIEZpcnN0IHNlbGVjdDogd2lkdGggMjE2LjI1cHgsIGhlaWdodCAzNnB4LCBnYXAgNHB4LCBvcGFjaXR5IDEgLS0+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwiZm9yT3B0aW9uVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1heC13LVsyMTZweF1cIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImVkaXRGb3JtXCIgW2NvbmZpZ109XCJ0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwic3RhcnRTdGVwU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZWRpdEZvcm1cIiBbY29uZmlnXT1cImVuZFN0ZXBTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gV0hJTEUgTE9PUCBpbmxpbmUgZWRpdDogY3FhLWF1dG9jb21wbGV0ZSArIHRlbXBsYXRlIHZhcmlhYmxlcyAoc2FtZSBhcyBjb25kaXRpb24tc3RlcCkgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1doaWxlTG9vcCgpXCI+XG4gICAgICAgICAgPGNxYS1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICpuZ0lmPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwid2hpbGVDb25kaXRpb25BdXRvY29tcGxldGVPcHRpb25zXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ3aGlsZUNvbmRpdGlvbkRpc3BsYXlWYWx1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdjb25kaXRpb24nLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChvcHRpb25TZWxlY3QpPVwib25Db25kaXRpb25TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBjb25kaXRpb25cIlxuICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPlxuICAgICAgICAgIDwvY3FhLWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICA8IS0tIFRlbXBsYXRlIHZhcmlhYmxlcyBoaWRkZW4gaW4gd2hpbGUgbG9vcCAtIHVzZSBFZGl0IEluIGRlcHRoIHRvIGNvbmZpZ3VyZSAtLT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBFZGl0IEluIGRlcHRoIGxpbmsgLS0+XG4gICAgICA8YSBocmVmPVwiI1wiICpuZ0lmPVwiaXNXaGlsZUxvb3AoKVwiIChjbGljayk9XCJvbkVkaXRJbkRlcHRoKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLVsycHhdIGNxYS1uby11bmRlcmxpbmVcIj5cbiAgICAgICAgRWRpdCBJbiBkZXB0aFxuICAgICAgICA8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTIuMDM4MDkgNi43NDMyOUwyLjYyODA5IDcuMzMzMjlMNS45NjE0MiAzLjk5OTk2TDIuNjI4MDkgMC42NjY2MjZMMi4wMzgwOSAxLjI1NjYzTDQuNzgxNDIgMy45OTk5NkwyLjAzODA5IDYuNzQzMjlaXCJcbiAgICAgICAgICAgIGZpbGw9XCIjM0Y0M0VFXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2E+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgPCEtLSBDYW5jZWwgLyBBcHBseSAtLT5cbiAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQ2FuY2VsJ1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uRWRpdENhbmNlbCgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQXBwbHknXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25FZGl0QXBwbHkoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIExvb3AgSGVhZGVyIChub3JtYWwgdmlldyB3aGVuIG5vdCBlZGl0aW5nKSAtLT5cbiAgPGRpdiAqbmdJZj1cIiFpc0VkaXRpbmdcIlxuICAgIFtjbGFzc109XCInc3RlcC1yb3cgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB5LTIgJyArIChpc0luc2lkZUxvb3AgJiYgaXNJbnNpZGVTdGVwR3JvdXAgPyAnY3FhLXBsLTIwIGNxYS1wci00JyA6IChpc0luc2lkZUxvb3AgfHwgaXNJbnNpZGVTdGVwR3JvdXApID8gJ2NxYS1wbC0xMCBjcWEtcHItNCcgOiAnY3FhLXB4LTQnKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgIDwhLS0gRHJhZyBIYW5kbGUgSWNvbiAod2hlbiBpc1Jlb3JkZXIgaXMgdHJ1ZSBhbmQgbm90IGluc2lkZSBzdGVwIGdyb3VwIC0gc3RlcHMgaW5zaWRlIHN0ZXAgZ3JvdXBzIGNhbm5vdCBiZSByZW9yZGVyZWQpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc1Jlb3JkZXIgJiYgIWlzSW5zaWRlU3RlcEdyb3VwXCIgY2xhc3M9XCJjcWEtbXItMiBjcWEtY3Vyc29yLW1vdmUgY3FhLXRleHQtWyM2QjcyODBdIGhvdmVyOmNxYS10ZXh0LVsjMTExODI3XVwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIENoZWNrYm94ICh3aGVuIGlzUmVvcmRlciBpcyBmYWxzZSBhbmQgbm90IGluc2lkZSBzdGVwIGdyb3VwIC0gaGlkZSBmb3Igc3RlcHMgaW5zaWRlIHN0ZXAgZ3JvdXBzKSAtLT5cbiAgICA8bGFiZWwgKm5nSWY9XCIhaXNSZW9yZGVyICYmICFpc0luc2lkZVN0ZXBHcm91cFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXJlbGF0aXZlIGNxYS1tci0yXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtaC00IGNxYS13LTQgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWFsbCBjcWEtYXBwZWFyYW5jZS1ub25lIGNxYS1yb3VuZGVkIHNoYWRvdyBob3ZlcjpjcWEtc2hhZG93LW1kIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLXNsYXRlLTMwMCBjcWEtZmxleC1zaHJpbmstMFwiXG4gICAgICAgIFtjbGFzcy5jcWEtYmctWyMzRjQzRUVdXT1cInNlbGVjdGVkXCJcbiAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXItWyMzRjQzRUVdXT1cInNlbGVjdGVkXCJcbiAgICAgICAgaWQ9XCJjaGVjay1sb29wLXN0ZXBcIiAvPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLXRleHQtd2hpdGUgY3FhLXRvcC0xLzIgY3FhLWxlZnQtMS8yIGNxYS0tdHJhbnNsYXRlLXgtMS8yIGNxYS0tdHJhbnNsYXRlLXktMS8yIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgW2NsYXNzLmNxYS1vcGFjaXR5LTBdPVwiIXNlbGVjdGVkXCJcbiAgICAgICAgW2NsYXNzLmNxYS1vcGFjaXR5LTEwMF09XCJzZWxlY3RlZFwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTIgMTNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTEwIDMuMTI1TDQuNSA4LjYyNUwyIDYuMTI1XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgICA8L3NwYW4+XG4gICAgPC9sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1taW4tdy1bMzJweF1cIj57eyBzdGVwTnVtYmVyIH19PC9zcGFuPlxuICAgIDwhLS0gRXhwYW5kL0NvbGxhcHNlIEljb24gLS0+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uVG9nZ2xlRXhwYW5kZWQoKVwiIGNsYXNzPVwiY3FhLXAtMFwiPlxuICAgICAgPHN2ZyBbY2xhc3MuY3FhLXJvdGF0ZS0xODBdPVwiIWV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtdHJhbnNpdGlvbi10cmFuc2Zvcm1cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIlxuICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNMTIgMTBMOCA2TDQgMTBcIiBzdHJva2U9XCIjNkI3MjgwXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPCEtLSBMb29wIEljb24gLS0+XG4gICAgPGRpdiAqbmdJZj1cImxvb3BUeXBlID09PSAnZm9yJ1wiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNMTEuMzM0IDEuMzMzMjVMMTQuMDAwNyAzLjk5OTkyTDExLjMzNCA2LjY2NjU5XCIgc3Ryb2tlPVwiIzFDMzk4RVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoIGQ9XCJNMiA3LjMzMzMzVjYuNjY2NjdDMiA1Ljk1OTQyIDIuMjgwOTUgNS4yODExNSAyLjc4MTA1IDQuNzgxMDVDMy4yODExNSA0LjI4MDk1IDMuOTU5NDIgNCA0LjY2NjY3IDRIMTRcIlxuICAgICAgICAgIHN0cm9rZT1cIiMxQzM5OEVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGggZD1cIk00LjY2NjY3IDE0LjY2NjZMMiAxMS45OTk5TDQuNjY2NjcgOS4zMzMyNVwiIHN0cm9rZT1cIiMxQzM5OEVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGQ9XCJNMTQgOC42NjY3NVY5LjMzMzQxQzE0IDEwLjA0MDcgMTMuNzE5IDEwLjcxODkgMTMuMjE5IDExLjIxOUMxMi43MTg5IDExLjcxOTEgMTIuMDQwNiAxMi4wMDAxIDExLjMzMzMgMTIuMDAwMUgyXCJcbiAgICAgICAgICBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwibG9vcFR5cGUgPT09ICd3aGlsZSdcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTExLjMzNCAxLjMzMzI1TDE0LjAwMDcgMy45OTk5MkwxMS4zMzQgNi42NjY1OVwiIHN0cm9rZT1cIiM1OTE2OEJcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTIgNy4zMzMzM1Y2LjY2NjY3QzIgNS45NTk0MiAyLjI4MDk1IDUuMjgxMTUgMi43ODEwNSA0Ljc4MTA1QzMuMjgxMTUgNC4yODA5NSAzLjk1OTQyIDQgNC42NjY2NyA0SDE0XCJcbiAgICAgICAgICBzdHJva2U9XCIjNTkxNjhCXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoIGQ9XCJNNC42NjY2NyAxNC42NjY2TDIgMTEuOTk5OUw0LjY2NjY3IDkuMzMzMjVcIiBzdHJva2U9XCIjNTkxNjhCXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTTE0IDguNjY2NzVWOS4zMzM0MUMxNCAxMC4wNDA3IDEzLjcxOSAxMC43MTg5IDEzLjIxOSAxMS4yMTlDMTIuNzE4OSAxMS43MTkxIDEyLjA0MDYgMTIuMDAwMSAxMS4zMzMzIDEyLjAwMDFIMlwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIExvb3AgVHlwZSBMYWJlbCAtLT5cbiAgICA8c3BhbiBjbGFzcz1cImNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMUMzOThFXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctbm9uZVwiPlxuICAgICAge3sgZ2V0TG9vcFR5cGVMYWJlbCgpIH19XG4gICAgPC9zcGFuPlxuXG4gICAgPCEtLSBGb3IgTG9vcCBEaXNwbGF5IChzYW1lIHN0eWxpbmcgYXMgY29uZGl0aW9uIHN0ZXAsIEhUTUwgYmFkZ2VzIHZpYSBpbm5lckhUTUwpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcicgJiYgKGhhc1Rlc3REYXRhUHJvZmlsZSgpIHx8IGhhc1N0YXJ0VmFsdWUoKSB8fCBoYXNFbmRWYWx1ZSgpKVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1sLTIgY3FhLWZsZXgtMSBjcWEtZmxleC13cmFwXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMTExODI3XSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1hY3Rpb24tZm9ybWF0XCIgW2lubmVySFRNTF09XCJnZXRGb3JMb29wRGlzcGxheSgpXCIgKGNsaWNrKT1cIm9uTG9vcEFjdGlvbkNsaWNrKCRldmVudClcIj48L3NwYW4+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0TG9vcEV2ZW50RGV0YWlsc0ZvckRpc3BsYXkoKS5sZW5ndGggPiAwXCI+XG4gICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldExvb3BFdmVudERldGFpbHNGb3JEaXNwbGF5KClcIiBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtcHktMC41IGNxYS1weC0yIGNxYS1yb3VuZGVkIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWJnLVsjRjNGNEY2XSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdXCIgKGNsaWNrKT1cIm9uTG9vcEFjdGlvbkNsaWNrKCRldmVudClcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzZCNzI4MF1cIj57eyBpdGVtLmtleSB9fTo8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzExMTgyN11cIj57eyBpdGVtLnZhbHVlIH19PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gV2hpbGUgTG9vcCBDb25kaXRpb24gKG9ubHkgc2hvdyBpZiBjb25kaXRpb24gZXhpc3RzKSAtIHNhbWUgc3R5bGluZyBhcyBjb25kaXRpb24gc3RlcCAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNXaGlsZUxvb3AoKSAmJiBjb25kaXRpb25cIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1tbC0yIGNxYS1mbGV4LTEgY3FhLWZsZXgtd3JhcFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzExMTgyN10gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtYWN0aW9uLWZvcm1hdFwiIFtpbm5lckhUTUxdPVwiZ2V0Q29uZGl0aW9uRGlzcGxheSgpXCIgKGNsaWNrKT1cIm9uTG9vcEFjdGlvbkNsaWNrKCRldmVudClcIj48L3NwYW4+XG4gICAgICA8c3BhbiAqbmdJZj1cIm1heEl0ZXJhdGlvbnMgIT0gbnVsbCAmJiBtYXhJdGVyYXRpb25zID4gMFwiIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXJvdW5kZWQgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtYmctWyNGM0Y0RjZdIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl1cIiAoY2xpY2spPVwib25Mb29wQWN0aW9uQ2xpY2soJGV2ZW50KVwiIGRhdGEta2V5PVwibWF4SXRlcmF0aW9uc1wiIGRhdGEtZXZlbnQta2V5PVwibWF4SXRlcmF0aW9uc1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzZCNzI4MF1cIj5tYXggaXRlcmF0aW9uczo8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMxMTE4MjddXCI+e3sgbWF4SXRlcmF0aW9ucyB9fTwvc3Bhbj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRMb29wRXZlbnREZXRhaWxzRm9yRGlzcGxheSgpLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0TG9vcEV2ZW50RGV0YWlsc0ZvckRpc3BsYXkoKVwiIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXJvdW5kZWQgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtYmctWyNGM0Y0RjZdIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl1cIiAoY2xpY2spPVwib25Mb29wQWN0aW9uQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkI3MjgwXVwiPnt7IGl0ZW0ua2V5IH19Ojwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMTExODI3XVwiPnt7IGl0ZW0udmFsdWUgfX08L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1tbC1hdXRvXCI+XG4gICAgICA8IS0tIFN0ZXBzIFN1bW1hcnkgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY3FhLW1sLWF1dG8gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU1RTVdIGNxYS1yb3VuZGVkLWxnIGNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXRleHQtWyMwQTBBMEFdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj5cbiAgICAgICAge3sgZ2V0U3RlcHNTdW1tYXJ5KCkgfX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFZpZXcgRGV0YWlscyBMaW5rIChzaG93IG9ubHkgaWYgZGVzY3JpcHRpb24gaXMgbm90IGVtcHR5KSAtLT5cbiAgICAgIDxhICpuZ0lmPVwiY29uZmlnLmRlc2NyaXB0aW9uICYmIGNvbmZpZy5kZXNjcmlwdGlvbi50cmltKCkgIT09ICcnXCIgI3ZpZXdEZXRhaWxzVHJpZ2dlciBocmVmPVwiI1wiIChjbGljayk9XCJvblZpZXdEZXRhaWxzKCRldmVudClcIiBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtbm8tdW5kZXJsaW5lIGNxYS1tbC1hdXRvXCI+VmlldyBEZXRhaWxzPHN2ZyB3aWR0aD1cIjhcIiBoZWlnaHQ9XCI4XCIgdmlld0JveD1cIjAgMCA4IDhcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTIuMDM4MDkgNi43NDMyOUwyLjYyODA5IDcuMzMzMjlMNS45NjE0MiAzLjk5OTk2TDIuNjI4MDkgMC42NjY2MjZMMi4wMzgwOSAxLjI1NjYzTDQuNzgxNDIgMy45OTk5NkwyLjAzODA5IDYuNzQzMjlaXCIgZmlsbD1cIiMzRjQzRUVcIi8+PC9zdmc+PC9hPlxuXG4gICAgICA8IS0tIEFjdGlvbiBJY29uczogRWRpdCwgTGluaywgRHVwbGljYXRlLCBEZWxldGUgKHNob3cgb24gaG92ZXI7IGhpZGRlbiB3aGVuIGluc2lkZSBzdGVwLWdyb3VwKSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIhaXNJbnNpZGVTdGVwR3JvdXAgJiYgIWlzUmVvcmRlclwiIGNsYXNzPVwic3RlcC1hY3Rpb25zIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1weC1bN3B4XVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25FZGl0KCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRWRpdFwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjOTlBMUFmXSBob3ZlcjpjcWEtdGV4dC1bIzE0NDdFNl1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyAxMS42NjY2SDEyLjI1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTkuNTUyMDggMi4xMTI4QzkuNzg0MyAxLjg4MDU4IDEwLjA5OTMgMS43NTAxMiAxMC40Mjc3IDEuNzUwMTJDMTAuNzU2MSAxLjc1MDEyIDExLjA3MSAxLjg4MDU4IDExLjMwMzMgMi4xMTI4QzExLjUzNTUgMi4zNDUwMiAxMS42NjU5IDIuNjU5OTggMTEuNjY1OSAyLjk4ODM4QzExLjY2NTkgMy4zMTY3OSAxMS41MzU1IDMuNjMxNzUgMTEuMzAzMyAzLjg2Mzk3TDQuMjk3NDIgMTAuODcwNEM0LjE1ODY0IDExLjAwOTIgMy45ODcxIDExLjExMDcgMy43OTg2NyAxMS4xNjU2TDIuMTIzMzMgMTEuNjU0NEMyLjA3MzE0IDExLjY2OSAyLjAxOTkzIDExLjY2OTkgMS45NjkyOCAxMS42NTY5QzEuOTE4NjMgMTEuNjQzOSAxLjg3MjQgMTEuNjE3NiAxLjgzNTQzIDExLjU4MDZDMS43OTg0NiAxMS41NDM3IDEuNzcyMSAxMS40OTc0IDEuNzU5MTMgMTEuNDQ2OEMxLjc0NjE1IDExLjM5NjEgMS43NDcwMyAxMS4zNDI5IDEuNzYxNjcgMTEuMjkyN0wyLjI1MDUgOS42MTczOEMyLjMwNTQ2IDkuNDI5MTYgMi40MDY5OCA5LjI1NzgzIDIuNTQ1NjcgOS4xMTkyMkw5LjU1MjA4IDIuMTEyOFpcIlxuICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwhLS0gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uTGluaygpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkxpbmtcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bIzk5QTFBZl0gaG92ZXI6Y3FhLXRleHQtWyMxNDQ3RTZdXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTUuMDAwNjUgOS45MTY3MUgzLjY2NzMyQzIuNzgzMjYgOS45MTY3MSAxLjkzNTQyIDkuNjA5NDIgMS4zMTAzIDkuMDYyNDRDMC42ODUxNzQgOC41MTU0NSAwLjMzMzk4NCA3Ljc3MzU5IDAuMzMzOTg0IDcuMDAwMDRDMC4zMzM5ODQgNi4yMjY0OSAwLjY4NTE3NCA1LjQ4NDYzIDEuMzEwMyA0LjkzNzY1QzEuOTM1NDIgNC4zOTA2NiAyLjc4MzI2IDQuMDgzMzcgMy42NjczMiA0LjA4MzM3SDUuMDAwNjVcIlxuICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNOSA0LjA4MzM3SDEwLjMzMzNDMTEuMjE3NCA0LjA4MzM3IDEyLjA2NTIgNC4zOTA2NiAxMi42OTA0IDQuOTM3NjVDMTMuMzE1NSA1LjQ4NDYzIDEzLjY2NjcgNi4yMjY0OSAxMy42NjY3IDcuMDAwMDRDMTMuNjY2NyA3Ljc3MzU5IDEzLjMxNTUgOC41MTU0NSAxMi42OTA0IDkuMDYyNDRDMTIuMDY1MiA5LjYwOTQyIDExLjIxNzQgOS45MTY3MSAxMC4zMzMzIDkuOTE2NzFIOVwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk00LjMzMzk4IDdIOS42NjczMlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj4gLS0+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkR1cGxpY2F0ZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkR1cGxpY2F0ZVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjOTlBMUFmXSBob3ZlcjpjcWEtdGV4dC1bIzE0NDdFNl1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMTEuNjY2IDQuNjY2NjNINS44MzI2OEM1LjE4ODM1IDQuNjY2NjMgNC42NjYwMiA1LjE4ODk2IDQuNjY2MDIgNS44MzMyOVYxMS42NjY2QzQuNjY2MDIgMTIuMzExIDUuMTg4MzUgMTIuODMzMyA1LjgzMjY4IDEyLjgzMzNIMTEuNjY2QzEyLjMxMDMgMTIuODMzMyAxMi44MzI3IDEyLjMxMSAxMi44MzI3IDExLjY2NjZWNS44MzMyOUMxMi44MzI3IDUuMTg4OTYgMTIuMzEwMyA0LjY2NjYzIDExLjY2NiA0LjY2NjYzWlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk0yLjMzMjY4IDkuMzMzMjlDMS42OTEwMiA5LjMzMzI5IDEuMTY2MDIgOC44MDgyOSAxLjE2NjAyIDguMTY2NjNWMi4zMzMyOUMxLjE2NjAyIDEuNjkxNjMgMS42OTEwMiAxLjE2NjYzIDIuMzMyNjggMS4xNjY2M0g4LjE2NjAyQzguODA3NjggMS4xNjY2MyA5LjMzMjY4IDEuNjkxNjMgOS4zMzI2OCAyLjMzMzI5XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25EZWxldGUoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdGl0bGU9XCJEZWxldGVcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bI2ZmNjQ2N10gaG92ZXI6Y3FhLXRleHQtWyNDNjM1MzVdXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTEuNzUgMy41SDEyLjI1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTExLjA4MjcgMy41VjExLjY2NjdDMTEuMDgyNyAxMi4yNSAxMC40OTkzIDEyLjgzMzMgOS45MTYwMiAxMi44MzMzSDQuMDgyNjhDMy40OTkzNSAxMi44MzMzIDIuOTE2MDIgMTIuMjUgMi45MTYwMiAxMS42NjY3VjMuNVwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk00LjY2NjAyIDMuNDk5OTZWMi4zMzMyOUM0LjY2NjAyIDEuNzQ5OTYgNS4yNDkzNSAxLjE2NjYzIDUuODMyNjggMS4xNjY2M0g4LjE2NjAyQzguNzQ5MzUgMS4xNjY2MyA5LjMzMjY4IDEuNzQ5OTYgOS4zMzI2OCAyLjMzMzI5VjMuNDk5OTZcIlxuICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNS44MzM5OCA2LjQxNjYzVjkuOTE2NjNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4xNjYwMiA2LjQxNjYzVjkuOTE2NjNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gQ3JlYXRlZCBEYXRlIChmcm9tIEFQSSkgLSBsYXN0IHNvIGFsaWduZWQgYWNyb3NzIGFsbCBzdGVwcywgZm9ybWF0OiAyNSBGZWIgMjAyNiAtLT5cbiAgICAgIDxzcGFuICpuZ0lmPVwiY29uZmlnLmNyZWF0ZWREYXRlXCIgY2xhc3M9XCJzdGVwLWRhdGUgY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLW1sLWF1dG8gY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAge3sgY29uZmlnLmNyZWF0ZWREYXRlIHwgZGF0ZTonZCBNTU0geXl5eScgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBFeHBhbmRlZCBDb250ZW50IHdpdGggTmVzdGVkIFN0ZXBzIChyZW5kZXJlciBkaXNwYXRjaGVzIGJ5IHN0ZXAgdHlwZSwgbi1sZXZlbCBuZXN0aW5nKSAtLT5cbiAgPGRpdiAqbmdJZj1cImV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICA8IS0tIFNUQVJUIE1hcmtlciAoY2VudGVyZWQgd2l0aCBkZWNvcmF0aXZlIGxpbmVzKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB5LTEgY3FhLXB4LTQgY3FhLWJnLVsjREJFQUZFODBdXCIgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggc29saWQgI0JFREJGRjtcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtc2VsZi1zdHJldGNoIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjMUMzOThFXSBjcWEtb3BhY2l0eS00MFwiIHN0eWxlPVwibWluLXdpZHRoOiAyMHB4O1wiPjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMxQzM5OEVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS13aGl0ZXNwYWNlLW5vd3JhcFwiPnt7IGdldFN0YXJ0TGFiZWwoKSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtc2VsZi1zdHJldGNoIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjMUMzOThFXSBjcWEtb3BhY2l0eS00MFwiIHN0eWxlPVwibWluLXdpZHRoOiAyMHB4O1wiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzUmVvcmRlclwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgICA8Y3FhLXRlc3QtY2FzZS1kZXRhaWxzLXJlbmRlcmVyICpuZ0Zvcj1cImxldCBzdGVwIG9mIG5lc3RlZFN0ZXBzOyBsZXQgaSA9IGluZGV4XCIgW3N0ZXBdPVwic3RlcFwiIFtpbmRleF09XCJpXCJcbiAgICAgICAgW3NlbGVjdGVkXT1cIiRhbnkoc3RlcCkuc2VsZWN0ZWRcIlxuICAgICAgICBbaXNOZXN0ZWRdPVwidHJ1ZVwiIFtpc0luc2lkZUxvb3BdPVwidHJ1ZVwiIFtpc1Jlb3JkZXJdPVwiaXNSZW9yZGVyXCJcbiAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuXT1cImFkZFN0ZXBCZXR3ZWVuXCJcbiAgICAgICAgW2RhdGFQcm9maWxlT3B0aW9uc109XCJkYXRhUHJvZmlsZU9wdGlvbnNcIiBbaGFzTW9yZURhdGFQcm9maWxlc109XCJoYXNNb3JlRGF0YVByb2ZpbGVzXCIgW2lzTG9hZGluZ0RhdGFQcm9maWxlc109XCJpc0xvYWRpbmdEYXRhUHJvZmlsZXNcIlxuICAgICAgICBbbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc109XCJuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXCJcbiAgICAgICAgKG5lc3RlZFN0ZXBDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKCRldmVudC5zdGVwLCAkZXZlbnQuaW5kZXgpXCJcbiAgICAgICAgKGFkZFN0ZXApPVwib25BZGRTdGVwKClcIiAoYWRkU3RlcEZvckxvb3ApPVwib25BZGRTdGVwRm9yTG9vcEZyb21OZXN0ZWQoJGV2ZW50KVwiIChkZWxldGVTdGVwKT1cIm9uRGVsZXRlU3RlcCgkZXZlbnQpXCJcbiAgICAgICAgKHRvZ2dsZUV4cGFuZGVkKT1cIm9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoJGV2ZW50LCBzdGVwLCBpKVwiXG4gICAgICAgIChncm91cE5hbWVDaGFuZ2UpPVwiJGFueShzdGVwKS5ncm91cE5hbWUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmRlc2NyaXB0aW9uID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAocmV1c2FibGVDaGFuZ2UpPVwiJGFueShzdGVwKS5yZXVzYWJsZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKG9wZW5FeHRlcm5hbCk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZWRpdCk9XCJvbk5lc3RlZEVkaXQoJGV2ZW50KVwiXG4gICAgICAgIChsaW5rKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChkdXBsaWNhdGUpPVwib25OZXN0ZWREdXBsaWNhdGUoJGV2ZW50LCBzdGVwKVwiIChkZWxldGUpPVwib25EZWxldGVTdGVwKCRldmVudCwgaSlcIlxuICAgICAgICAodmlld0RldGFpbHMpPVwidmlld0RldGFpbHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGNvbmRpdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmNvbmRpdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGJyYW5jaFN0ZXBDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGFkZEJyYW5jaCk9XCJvbk5lc3RlZENvbmRpdGlvbkFkZEJyYW5jaCgkYW55KHN0ZXApLCBpKVwiXG4gICAgICAgIChkZWxldGVCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2goJGFueShzdGVwKSwgJGV2ZW50LCBpKVwiXG4gICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChzdGFydFN0ZXBDaGFuZ2UpPVwiJGFueShzdGVwKS5zdGFydFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChlbmRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZW5kU3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoZXZlbnRUeXBlQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZXZlbnRUeXBlID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAocGFyYW1ldGVyQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGxvYWRNb3JlRGF0YVByb2ZpbGVzKT1cImxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzZWFyY2hEYXRhUHJvZmlsZXMpPVwic2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChkbmREcm9wSW5ab25lKT1cImRuZERyb3BJblpvbmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrQWN0aW9uKT1cImNsaWNrQWN0aW9uLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChlZGl0SW5EZXB0aCk9XCJlZGl0SW5EZXB0aC5lbWl0KCRldmVudClcIlxuICAgICAgICAoYWRkU3RlcEJldHdlZW5DbGljayk9XCJhZGRTdGVwQmV0d2VlbkNsaWNrLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgPC9jcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImlzUmVvcmRlclwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIG5lc3RlZC1zdGVwLWRyb3AtbGlzdFwiXG4gICAgICAgICBbc3R5bGUubWluLWhlaWdodC5weF09XCJuZXN0ZWRTdGVwcy5sZW5ndGggPT09IDAgPyA1MiA6IG51bGxcIlxuICAgICAgICAgW2RuZERyb3B6b25lXT1cIlsnc3RlcCddXCJcbiAgICAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgICAgIGRuZERyYWdvdmVyQ2xhc3M9XCJkbmREcmFnb3ZlclwiXG4gICAgICAgICAoZG5kRHJvcCk9XCJvbkRuZERyb3AoJGV2ZW50KVwiPlxuICAgICAgPGRpdiBkbmRQbGFjZWhvbGRlclJlZiBjbGFzcz1cInN0ZXAtZHJhZy1wbGFjZWhvbGRlci1uZXN0ZWQgY3FhLW15LTEgY3FhLW1pbi1oLVs1MHB4XSBjcWEtYm9yZGVyLTIgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bIzNGNDNFRV0gY3FhLXJvdW5kZWQgY3FhLWJnLVtyZ2JhKDYzLDY3LDIzOCwwLjA4KV0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LXhzXCI+RHJvcCBoZXJlPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdGVwIG9mIG5lc3RlZFN0ZXBzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJuZXN0ZWQtc3RlcC1kcmFnLWl0ZW1cIlxuICAgICAgICAgICBbZG5kRHJhZ2dhYmxlXT1cInN0ZXBcIlxuICAgICAgICAgICBkbmRFZmZlY3RBbGxvd2VkPVwibW92ZVwiXG4gICAgICAgICAgIGRuZFR5cGU9XCJzdGVwXCI+XG4gICAgICAgIDxjcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXIgW3N0ZXBdPVwic3RlcFwiIFtpbmRleF09XCJpXCJcbiAgICAgICAgICBbc2VsZWN0ZWRdPVwiJGFueShzdGVwKS5zZWxlY3RlZFwiXG4gICAgICAgICAgW2lzTmVzdGVkXT1cInRydWVcIiBbaXNJbnNpZGVMb29wXT1cInRydWVcIiBbaXNSZW9yZGVyXT1cImlzUmVvcmRlclwiXG4gICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuQWJvdmVdPVwiYWRkU3RlcEJldHdlZW5BYm92ZVwiXG4gICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuQmVsb3ddPVwiYWRkU3RlcEJldHdlZW5CZWxvd1wiXG4gICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuXT1cImFkZFN0ZXBCZXR3ZWVuXCJcbiAgICAgICAgICBbZGF0YVByb2ZpbGVPcHRpb25zXT1cImRhdGFQcm9maWxlT3B0aW9uc1wiIFtoYXNNb3JlRGF0YVByb2ZpbGVzXT1cImhhc01vcmVEYXRhUHJvZmlsZXNcIiBbaXNMb2FkaW5nRGF0YVByb2ZpbGVzXT1cImlzTG9hZGluZ0RhdGFQcm9maWxlc1wiXG4gICAgICAgICAgW25hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNdPVwibmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc1wiXG4gICAgICAgICAgKG5lc3RlZFN0ZXBDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKCRldmVudC5zdGVwLCAkZXZlbnQuaW5kZXgpXCJcbiAgICAgICAgICAoYWRkU3RlcCk9XCJvbkFkZFN0ZXAoKVwiIChhZGRTdGVwRm9yTG9vcCk9XCJvbkFkZFN0ZXBGb3JMb29wRnJvbU5lc3RlZCgkZXZlbnQpXCIgKGRlbGV0ZVN0ZXApPVwib25EZWxldGVTdGVwKCRldmVudClcIlxuICAgICAgICAgICh0b2dnbGVFeHBhbmRlZCk9XCJvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKCRldmVudCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChncm91cE5hbWVDaGFuZ2UpPVwiJGFueShzdGVwKS5ncm91cE5hbWUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGRlc2NyaXB0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZGVzY3JpcHRpb24gPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHJldXNhYmxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkucmV1c2FibGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKG9wZW5FeHRlcm5hbCk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZWRpdCk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChsaW5rKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChkdXBsaWNhdGUpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGRlbGV0ZSk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgKHZpZXdEZXRhaWxzKT1cInZpZXdEZXRhaWxzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGNvbmRpdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmNvbmRpdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoYnJhbmNoU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoYWRkQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKCRhbnkoc3RlcCksIGkpXCJcbiAgICAgICAgICAoZGVsZXRlQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKCRhbnkoc3RlcCksICRldmVudCwgaSlcIlxuICAgICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHN0YXJ0U3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLnN0YXJ0U3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZW5kU3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLmVuZFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChldmVudFR5cGVDaGFuZ2UpPVwiJGFueShzdGVwKS5ldmVudFR5cGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHBhcmFtZXRlckNoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGxvYWRNb3JlRGF0YVByb2ZpbGVzKT1cImxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzZWFyY2hEYXRhUHJvZmlsZXMpPVwic2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChkbmREcm9wSW5ab25lKT1cImRuZERyb3BJblpvbmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrQWN0aW9uKT1cImNsaWNrQWN0aW9uLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChlZGl0SW5EZXB0aCk9XCJlZGl0SW5EZXB0aC5lbWl0KCRldmVudClcIlxuICAgICAgICAoYWRkU3RlcEJldHdlZW5DbGljayk9XCJhZGRTdGVwQmV0d2VlbkNsaWNrLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFbXB0eSBsb29wOiBzaG93IHBsdXMgaWNvbiBvbiBob3ZlciB3aGVuIGV4cGFuZGVkIGFuZCBubyBzdGVwcy5cbiAgICAgICAgIFdoZW4gcmVuZGVyZWQgaW5zaWRlIGEgc3RlcCBncm91cCBvciB3aGVuIHJlb3JkZXJpbmcsIGhpZGUgdGhpcyBBZGQgYnV0dG9uIGVudGlyZWx5LiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwibmVzdGVkU3RlcHMubGVuZ3RoID09PSAwICYmICFpc0luc2lkZVN0ZXBHcm91cCAmJiAhaXNSZW9yZGVyXCIgY2xhc3M9XCJsb29wLXN0ZXAtZW1wdHkgY3FhLW1pbi1oLVs1MnB4XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcGwtNCBjcWEtcHItNFwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQWRkU3RlcEVtcHR5KCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdGl0bGU9XCJBZGQgc3RlcFwiXG4gICAgICAgIGNsYXNzPVwibG9vcC1zdGVwLWVtcHR5LWFkZFwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cmVjdCB4PVwiMVwiIHk9XCIxXCIgd2lkdGg9XCIyMS4xODIyXCIgaGVpZ2h0PVwiMjJcIiByeD1cIjEwLjU5MTFcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgIDxyZWN0IHg9XCIxXCIgeT1cIjFcIiB3aWR0aD1cIjIxLjE4MjJcIiBoZWlnaHQ9XCIyMlwiIHJ4PVwiMTAuNTkxMVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2Utd2lkdGg9XCIyXCIgLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTguNSAxMkgxNS41XCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPHBhdGggZD1cIk0xMiA4LjVWMTUuNVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFTkQgTWFya2VyIChjZW50ZXJlZCB3aXRoIGRlY29yYXRpdmUgbGluZXMpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHktMSBjcWEtcHgtNCBjcWEtYmctWyNEQkVBRkU4MF1cIiBzdHlsZT1cImJvcmRlci10b3A6IDFweCBzb2xpZCAjQkVEQkZGO1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1zZWxmLXN0cmV0Y2ggY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyMxQzM5OEVdIGNxYS1vcGFjaXR5LTQwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDIwcHg7XCI+PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzFDMzk4RV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXdoaXRlc3BhY2Utbm93cmFwXCI+e3sgZ2V0RW5kTGFiZWwoKSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtc2VsZi1zdHJldGNoIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjMUMzOThFXSBjcWEtb3BhY2l0eS00MFwiIHN0eWxlPVwibWluLXdpZHRoOiAyMHB4O1wiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=