@cqa-lib/cqa-ui 1.1.248 → 1.1.249

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.
@@ -0,0 +1,30 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../button/button.component";
4
+ import * as i2 from "@angular/common";
5
+ export class RecordingBannerComponent {
6
+ constructor() {
7
+ /** Whether the banner is visible (recording active) */
8
+ this.isVisible = false;
9
+ /** Number of steps captured so far */
10
+ this.stepsCaptured = 0;
11
+ /** Emitted when the user clicks Stop */
12
+ this.stopRecording = new EventEmitter();
13
+ }
14
+ onStop() {
15
+ this.stopRecording.emit();
16
+ }
17
+ }
18
+ RecordingBannerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: RecordingBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
19
+ RecordingBannerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: RecordingBannerComponent, selector: "cqa-recording-banner", inputs: { isVisible: "isVisible", stepsCaptured: "stepsCaptured" }, outputs: { stopRecording: "stopRecording" }, host: { classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div\n *ngIf=\"isVisible\"\n class=\"cqa-fixed cqa-left-1/2 cqa-top-6 cqa-z-[60] cqa-flex cqa-items-center cqa-justify-center cqa--translate-x-1/2\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"Recording in progress\"\n>\n <div\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-6 cqa-px-6 cqa-py-3 cqa-bg-red-500 cqa-rounded-full cqa-shadow-md cqa-text-white\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-shrink-0\">\n <span class=\"cqa-w-[10px] cqa-h-[10px] cqa-rounded-full cqa-bg-white cqa-border cqa-border-white cqa-opacity-100 cqa-flex-shrink-0\" aria-hidden=\"true\"></span>\n <span class=\"cqa-font-[Inter] cqa-font-normal cqa-text-[14px] cqa-leading-[18px] cqa-tracking-normal cqa-text-white cqa-align-middle cqa-whitespace-nowrap\">Recording</span>\n <span class=\"cqa-font-[Inter] cqa-font-normal cqa-text-[14px] cqa-text-[#FFFFFF] cqa-leading-[18px] cqa-tracking-normal cqa-text-white cqa-align-middle cqa-whitespace-nowrap\">{{ stepsCaptured }} steps captured</span>\n </div>\n <cqa-button\n type=\"button\"\n variant=\"outlined\"\n btnSize=\"md\"\n [text]=\"'Stop'\"\n icon=\"crop_square\"\n iconColor=\"#FFFFFF\"\n customClass=\"!cqa-bg-[#F9FAFB33] !cqa-border-[#F9FAFB33] !cqa-text-white cqa-text-[14px] cqa-w-[77px] cqa-h-[28px] cqa-min-h-[28px] cqa-gap-[6px] cqa-pl-[12px] cqa-pr-[12px] cqa-rounded-[6px] cqa-flex-shrink-0\"\n (clicked)=\"onStop()\">\n </cqa-button>\n </div>\n</div>\n", components: [{ type: i1.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: RecordingBannerComponent, decorators: [{
21
+ type: Component,
22
+ args: [{ selector: 'cqa-recording-banner', host: { class: 'cqa-ui-root' }, template: "<div\n *ngIf=\"isVisible\"\n class=\"cqa-fixed cqa-left-1/2 cqa-top-6 cqa-z-[60] cqa-flex cqa-items-center cqa-justify-center cqa--translate-x-1/2\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"Recording in progress\"\n>\n <div\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-6 cqa-px-6 cqa-py-3 cqa-bg-red-500 cqa-rounded-full cqa-shadow-md cqa-text-white\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-shrink-0\">\n <span class=\"cqa-w-[10px] cqa-h-[10px] cqa-rounded-full cqa-bg-white cqa-border cqa-border-white cqa-opacity-100 cqa-flex-shrink-0\" aria-hidden=\"true\"></span>\n <span class=\"cqa-font-[Inter] cqa-font-normal cqa-text-[14px] cqa-leading-[18px] cqa-tracking-normal cqa-text-white cqa-align-middle cqa-whitespace-nowrap\">Recording</span>\n <span class=\"cqa-font-[Inter] cqa-font-normal cqa-text-[14px] cqa-text-[#FFFFFF] cqa-leading-[18px] cqa-tracking-normal cqa-text-white cqa-align-middle cqa-whitespace-nowrap\">{{ stepsCaptured }} steps captured</span>\n </div>\n <cqa-button\n type=\"button\"\n variant=\"outlined\"\n btnSize=\"md\"\n [text]=\"'Stop'\"\n icon=\"crop_square\"\n iconColor=\"#FFFFFF\"\n customClass=\"!cqa-bg-[#F9FAFB33] !cqa-border-[#F9FAFB33] !cqa-text-white cqa-text-[14px] cqa-w-[77px] cqa-h-[28px] cqa-min-h-[28px] cqa-gap-[6px] cqa-pl-[12px] cqa-pr-[12px] cqa-rounded-[6px] cqa-flex-shrink-0\"\n (clicked)=\"onStop()\">\n </cqa-button>\n </div>\n</div>\n", styles: [] }]
23
+ }], propDecorators: { isVisible: [{
24
+ type: Input
25
+ }], stepsCaptured: [{
26
+ type: Input
27
+ }], stopRecording: [{
28
+ type: Output
29
+ }] } });
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nLWJhbm5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2V4ZWN1dGlvbi1zY3JlZW4vcmVjb3JkaW5nLWJhbm5lci9yZWNvcmRpbmctYmFubmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9yZWNvcmRpbmctYmFubmVyL3JlY29yZGluZy1iYW5uZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQzs7OztBQVF2RSxNQUFNLE9BQU8sd0JBQXdCO0lBTnJDO1FBT0UsdURBQXVEO1FBQzlDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFFcEMsc0NBQXNDO1FBQzdCLGtCQUFhLEdBQVcsQ0FBQyxDQUFDO1FBRW5DLHdDQUF3QztRQUM5QixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7S0FLcEQ7SUFIQyxNQUFNO1FBQ0osSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1QixDQUFDOztxSEFaVSx3QkFBd0I7eUdBQXhCLHdCQUF3QixzTkNSckMsdy9DQTJCQTsyRkRuQmEsd0JBQXdCO2tCQU5wQyxTQUFTOytCQUNFLHNCQUFzQixRQUcxQixFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7OEJBSXJCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSztnQkFHSSxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXJlY29yZGluZy1iYW5uZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVjb3JkaW5nLWJhbm5lci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbn0pXG5leHBvcnQgY2xhc3MgUmVjb3JkaW5nQmFubmVyQ29tcG9uZW50IHtcbiAgLyoqIFdoZXRoZXIgdGhlIGJhbm5lciBpcyB2aXNpYmxlIChyZWNvcmRpbmcgYWN0aXZlKSAqL1xuICBASW5wdXQoKSBpc1Zpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogTnVtYmVyIG9mIHN0ZXBzIGNhcHR1cmVkIHNvIGZhciAqL1xuICBASW5wdXQoKSBzdGVwc0NhcHR1cmVkOiBudW1iZXIgPSAwO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIFN0b3AgKi9cbiAgQE91dHB1dCgpIHN0b3BSZWNvcmRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgb25TdG9wKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFJlY29yZGluZy5lbWl0KCk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgKm5nSWY9XCJpc1Zpc2libGVcIlxuICBjbGFzcz1cImNxYS1maXhlZCBjcWEtbGVmdC0xLzIgY3FhLXRvcC02IGNxYS16LVs2MF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLS10cmFuc2xhdGUteC0xLzJcIlxuICByb2xlPVwic3RhdHVzXCJcbiAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgYXJpYS1sYWJlbD1cIlJlY29yZGluZyBpbiBwcm9ncmVzc1wiXG4+XG4gIDxkaXZcbiAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTYgY3FhLXB4LTYgY3FhLXB5LTMgY3FhLWJnLXJlZC01MDAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtc2hhZG93LW1kIGNxYS10ZXh0LXdoaXRlXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdy1bMTBweF0gY3FhLWgtWzEwcHhdIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLXdoaXRlIGNxYS1ib3JkZXIgY3FhLWJvcmRlci13aGl0ZSBjcWEtb3BhY2l0eS0xMDAgY3FhLWZsZXgtc2hyaW5rLTBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1mb250LVtJbnRlcl0gY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRyYWNraW5nLW5vcm1hbCBjcWEtdGV4dC13aGl0ZSBjcWEtYWxpZ24tbWlkZGxlIGNxYS13aGl0ZXNwYWNlLW5vd3JhcFwiPlJlY29yZGluZzwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtW0ludGVyXSBjcWEtZm9udC1ub3JtYWwgY3FhLXRleHQtWzE0cHhdIGNxYS10ZXh0LVsjRkZGRkZGXSBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRyYWNraW5nLW5vcm1hbCBjcWEtdGV4dC13aGl0ZSBjcWEtYWxpZ24tbWlkZGxlIGNxYS13aGl0ZXNwYWNlLW5vd3JhcFwiPnt7IHN0ZXBzQ2FwdHVyZWQgfX0gc3RlcHMgY2FwdHVyZWQ8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGNxYS1idXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICBbdGV4dF09XCInU3RvcCdcIlxuICAgICAgaWNvbj1cImNyb3Bfc3F1YXJlXCJcbiAgICAgIGljb25Db2xvcj1cIiNGRkZGRkZcIlxuICAgICAgY3VzdG9tQ2xhc3M9XCIhY3FhLWJnLVsjRjlGQUZCMzNdICFjcWEtYm9yZGVyLVsjRjlGQUZCMzNdICFjcWEtdGV4dC13aGl0ZSBjcWEtdGV4dC1bMTRweF0gY3FhLXctWzc3cHhdIGNxYS1oLVsyOHB4XSBjcWEtbWluLWgtWzI4cHhdIGNxYS1nYXAtWzZweF0gY3FhLXBsLVsxMnB4XSBjcWEtcHItWzEycHhdIGNxYS1yb3VuZGVkLVs2cHhdIGNxYS1mbGV4LXNocmluay0wXCJcbiAgICAgIChjbGlja2VkKT1cIm9uU3RvcCgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -0,0 +1,112 @@
1
+ import { Component, Input, Output, EventEmitter, HostListener } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../button/button.component";
4
+ import * as i2 from "@angular/material/icon";
5
+ import * as i3 from "@angular/material/radio";
6
+ import * as i4 from "@angular/common";
7
+ import * as i5 from "ngx-drag-drop";
8
+ export class ReviewRecordedStepsModalComponent {
9
+ constructor() {
10
+ this.isOpen = false;
11
+ this.title = 'Review Recorded Steps';
12
+ this.steps = [];
13
+ this.saveOption = 'run_only';
14
+ this.saveButtonDisabled = false;
15
+ this.closeModal = new EventEmitter();
16
+ this.discard = new EventEmitter();
17
+ this.save = new EventEmitter();
18
+ this.saveOptionChange = new EventEmitter();
19
+ this.stepLabelChange = new EventEmitter();
20
+ this.removeStep = new EventEmitter();
21
+ this.reorderSteps = new EventEmitter();
22
+ }
23
+ onBackdropClick(event) {
24
+ const target = event.target;
25
+ const currentTarget = event.currentTarget;
26
+ if (target === currentTarget || target.classList.contains('cqa-review-recorded-steps-backdrop')) {
27
+ this.onClose();
28
+ }
29
+ }
30
+ onClose() {
31
+ this.closeModal.emit();
32
+ }
33
+ onDiscard() {
34
+ this.discard.emit();
35
+ }
36
+ onSave() {
37
+ if (!this.saveButtonDisabled) {
38
+ this.save.emit();
39
+ }
40
+ }
41
+ onSaveOptionChange(value) {
42
+ this.saveOption = value;
43
+ this.saveOptionChange.emit(value);
44
+ }
45
+ onStepLabelChange(id, label) {
46
+ this.stepLabelChange.emit({ id, label });
47
+ }
48
+ onRemoveStep(id, event) {
49
+ event.preventDefault();
50
+ event.stopPropagation();
51
+ this.removeStep.emit(id);
52
+ }
53
+ onDndDrop(event) {
54
+ if (event.data == null || event.index == null)
55
+ return;
56
+ const droppedStep = event.data;
57
+ let dropIndex = event.index;
58
+ const currentIndex = this.steps.findIndex((s) => s.id === droppedStep.id);
59
+ if (currentIndex < 0)
60
+ return;
61
+ if (currentIndex === dropIndex)
62
+ return;
63
+ const newSteps = [...this.steps];
64
+ newSteps.splice(currentIndex, 1);
65
+ if (currentIndex < dropIndex)
66
+ dropIndex--;
67
+ newSteps.splice(dropIndex, 0, droppedStep);
68
+ this.reorderSteps.emit(newSteps);
69
+ }
70
+ onEscape() {
71
+ if (this.isOpen) {
72
+ this.onClose();
73
+ }
74
+ }
75
+ trackByStepId(_index, step) {
76
+ return step.id;
77
+ }
78
+ }
79
+ ReviewRecordedStepsModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ReviewRecordedStepsModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
80
+ ReviewRecordedStepsModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ReviewRecordedStepsModalComponent, selector: "cqa-review-recorded-steps-modal", inputs: { isOpen: "isOpen", title: "title", steps: "steps", saveOption: "saveOption", saveButtonDisabled: "saveButtonDisabled" }, outputs: { closeModal: "closeModal", discard: "discard", save: "save", saveOptionChange: "saveOptionChange", stepLabelChange: "stepLabelChange", removeStep: "removeStep", reorderSteps: "reorderSteps" }, host: { listeners: { "document:keydown.escape": "onEscape()" }, classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div\n *ngIf=\"isOpen\"\n class=\"cqa-review-recorded-steps-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-50 cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"review-recorded-steps-title\"\n aria-describedby=\"review-recorded-steps-content\">\n <div\n class=\"cqa-rounded-xl cqa-bg-[#FBFCFF] cqa-border cqa-border-[#E5E5E5] cqa-w-full cqa-max-w-[499px] cqa-max-h-[90vh] cqa-overflow-hidden cqa-flex cqa-flex-col cqa-shadow-[0_4px_6px_-1px_#00000040,0_2px_4px_-2px_#00000040]\"\n (click)=\"$event.stopPropagation()\">\n\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-6 cqa-pt-4 cqa-pb-4\" style=\"border-bottom: 1px solid #E5E7EB\">\n <h2\n id=\"review-recorded-steps-title\"\n class=\"cqa-text-[16px] cqa-font-semibold cqa-leading-7 cqa-text-gray-800 cqa-m-0\">\n {{ title }}\n </h2>\n <cqa-button\n type=\"button\"\n variant=\"text\"\n btnSize=\"md\"\n icon=\"close\"\n iconColor=\"#4A5565\"\n [tooltip]=\"'Close'\"\n tooltipPosition=\"below\"\n customClass=\"!cqa-min-w-0 cqa-p-1\"\n (clicked)=\"onClose()\">\n </cqa-button>\n </div>\n\n <!-- Content -->\n <div id=\"review-recorded-steps-content\" class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-6 cqa-py-4 cqa-flex cqa-flex-col cqa-gap-5\">\n\n <!-- Alert: Recording Finished -->\n <div class=\"cqa-flex cqa-items-start cqa-gap-3 cqa-px-4 cqa-py-3 cqa-bg-[#EFF6FF] cqa-border cqa-border-[#DBEAFE] cqa-rounded-lg\">\n <mat-icon fontSet=\"material-symbols-outlined\" class=\"cqa-flex-shrink-0 cqa-w-6 cqa-h-5 cqa-text-[#1E40AF] cqa-text-xl\" aria-hidden=\"true\">videocam</mat-icon>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-min-w-0\">\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-[#1E40AF]\">Recording Finished</span>\n <p class=\"cqa-text-xs cqa-font-normal cqa-text-[#1E40AF] cqa-m-0\">\n Review the steps captured below before adding them to your test. You can rename, delete, or reorder them.\n </p>\n </div>\n </div>\n\n <!-- Recorded steps list -->\n <section class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-h-0\" aria-labelledby=\"recorded-steps-heading\">\n <h3 id=\"recorded-steps-heading\" class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900 cqa-m-0 cqa-sr-only\">Recorded steps</h3>\n <div\n class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-max-h-[240px] cqa-overflow-y-auto cqa-min-h-0\"\n [dndDropzone]=\"['recorded-step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"cqa-opacity-70\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"cqa-rounded-lg cqa-border cqa-border-dashed cqa-border-[#E5E7EB] cqa-p-2 cqa-min-h-[44px] cqa-bg-[#F3F4F6]\"></div>\n <div\n *ngFor=\"let step of steps; let i = index; trackBy: trackByStepId\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-rounded-lg cqa-p-2 cqa-bg-[#F9FAFB] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\"\n [dndDraggable]=\"step\"\n [dndDisableIf]=\"steps.length <= 1\"\n dndEffectAllowed=\"move\"\n dndType=\"recorded-step\">\n <span dndHandle class=\"cqa-flex-shrink-0 cqa-text-[#9CA3AF] cqa-cursor-grab cqa-p-1 active:cqa-cursor-grabbing\" aria-hidden=\"true\" title=\"Drag to reorder\">\n <mat-icon class=\"cqa-w-5 cqa-h-5 cqa-text-[20px] cqa-block cqa-leading-none\">drag_indicator</mat-icon>\n </span>\n <span class=\"cqa-flex-shrink-0 cqa-text-[12px] cqa-text-[#9CA3AF]\">{{ i + 1 }}</span>\n <span class=\"cqa-flex-1 cqa-min-w-0 cqa-text-sm cqa-font-normal cqa-text-gray-800 cqa-truncate\">{{ step.label || 'Step' }}</span>\n <!-- <cqa-custom-input\n [value]=\"step.label\"\n [placeholder]=\"'Step name'\"\n [fullWidth]=\"true\"\n size=\"md\"\n (valueChange)=\"onStepLabelChange(step.id, $event)\">\n </cqa-custom-input>\n <cqa-button\n type=\"button\"\n variant=\"text\"\n btnSize=\"md\"\n icon=\"delete_outline\"\n iconColor=\"#99999E\"\n [tooltip]=\"'Remove step'\"\n tooltipPosition=\"below\"\n customClass=\"cqa-shrink-0\"\n (clicked)=\"onRemoveStep(step.id, $event)\">\n </cqa-button> -->\n </div>\n </div>\n </section>\n\n <!-- Save option -->\n <section class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-rounded-lg cqa-p-4\" aria-labelledby=\"save-option-heading\">\n <h3 id=\"save-option-heading\" class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900 cqa-m-0\">Save option</h3>\n <mat-radio-group\n [value]=\"saveOption\"\n (change)=\"onSaveOptionChange($any($event).value)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <label class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-cursor-pointer\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <mat-radio-button value=\"run_only\" color=\"primary\"></mat-radio-button>\n <span class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900\">Save for this run only</span>\n </span>\n <span class=\"cqa-text-sm cqa-font-normal cqa-text-gray-500 cqa-pl-6\">Changes will be reverted after this debug session</span>\n </label>\n <label class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-cursor-pointer\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <mat-radio-button value=\"test_case\" color=\"primary\"></mat-radio-button>\n <span class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900\">Save to test case</span>\n </span>\n <span class=\"cqa-text-sm cqa-font-normal cqa-text-gray-500 cqa-pl-6\">Changes will be permanently saved</span>\n </label>\n </mat-radio-group>\n </section>\n </div>\n\n <!-- Footer -->\n <div class=\"cqa-px-6 cqa-pb-6 cqa-border-t cqa-border-gray-200 cqa-grid cqa-grid-cols-2 cqa-gap-3 cqa-w-full\">\n <cqa-button\n type=\"button\"\n variant=\"outlined\"\n btnSize=\"lg\"\n [text]=\"'Discard'\"\n [fullWidth]=\"true\"\n customClass=\"cqa-w-full cqa-bg-white cqa-border cqa-border-[#414146] cqa-text-[#414146] cqa-rounded-lg hover:cqa-bg-gray-50\"\n (clicked)=\"onDiscard()\">\n </cqa-button>\n <cqa-button\n type=\"button\"\n variant=\"filled\"\n btnSize=\"lg\"\n [text]=\"'Save'\"\n [disabled]=\"saveButtonDisabled\"\n [fullWidth]=\"true\"\n customClass=\"cqa-w-full cqa-bg-[#4F46E5] cqa-border-[#4F46E5] cqa-text-white cqa-rounded-lg\"\n (clicked)=\"onSave()\">\n </cqa-button>\n </div>\n </div>\n</div>\n", components: [{ type: i1.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i5.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }, { type: i5.DndHandleDirective, selector: "[dndHandle]" }, { type: i3.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }] });
81
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ReviewRecordedStepsModalComponent, decorators: [{
82
+ type: Component,
83
+ args: [{ selector: 'cqa-review-recorded-steps-modal', host: { class: 'cqa-ui-root' }, template: "<div\n *ngIf=\"isOpen\"\n class=\"cqa-review-recorded-steps-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-50 cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"review-recorded-steps-title\"\n aria-describedby=\"review-recorded-steps-content\">\n <div\n class=\"cqa-rounded-xl cqa-bg-[#FBFCFF] cqa-border cqa-border-[#E5E5E5] cqa-w-full cqa-max-w-[499px] cqa-max-h-[90vh] cqa-overflow-hidden cqa-flex cqa-flex-col cqa-shadow-[0_4px_6px_-1px_#00000040,0_2px_4px_-2px_#00000040]\"\n (click)=\"$event.stopPropagation()\">\n\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-6 cqa-pt-4 cqa-pb-4\" style=\"border-bottom: 1px solid #E5E7EB\">\n <h2\n id=\"review-recorded-steps-title\"\n class=\"cqa-text-[16px] cqa-font-semibold cqa-leading-7 cqa-text-gray-800 cqa-m-0\">\n {{ title }}\n </h2>\n <cqa-button\n type=\"button\"\n variant=\"text\"\n btnSize=\"md\"\n icon=\"close\"\n iconColor=\"#4A5565\"\n [tooltip]=\"'Close'\"\n tooltipPosition=\"below\"\n customClass=\"!cqa-min-w-0 cqa-p-1\"\n (clicked)=\"onClose()\">\n </cqa-button>\n </div>\n\n <!-- Content -->\n <div id=\"review-recorded-steps-content\" class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-6 cqa-py-4 cqa-flex cqa-flex-col cqa-gap-5\">\n\n <!-- Alert: Recording Finished -->\n <div class=\"cqa-flex cqa-items-start cqa-gap-3 cqa-px-4 cqa-py-3 cqa-bg-[#EFF6FF] cqa-border cqa-border-[#DBEAFE] cqa-rounded-lg\">\n <mat-icon fontSet=\"material-symbols-outlined\" class=\"cqa-flex-shrink-0 cqa-w-6 cqa-h-5 cqa-text-[#1E40AF] cqa-text-xl\" aria-hidden=\"true\">videocam</mat-icon>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-min-w-0\">\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-[#1E40AF]\">Recording Finished</span>\n <p class=\"cqa-text-xs cqa-font-normal cqa-text-[#1E40AF] cqa-m-0\">\n Review the steps captured below before adding them to your test. You can rename, delete, or reorder them.\n </p>\n </div>\n </div>\n\n <!-- Recorded steps list -->\n <section class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-h-0\" aria-labelledby=\"recorded-steps-heading\">\n <h3 id=\"recorded-steps-heading\" class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900 cqa-m-0 cqa-sr-only\">Recorded steps</h3>\n <div\n class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-max-h-[240px] cqa-overflow-y-auto cqa-min-h-0\"\n [dndDropzone]=\"['recorded-step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"cqa-opacity-70\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"cqa-rounded-lg cqa-border cqa-border-dashed cqa-border-[#E5E7EB] cqa-p-2 cqa-min-h-[44px] cqa-bg-[#F3F4F6]\"></div>\n <div\n *ngFor=\"let step of steps; let i = index; trackBy: trackByStepId\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-rounded-lg cqa-p-2 cqa-bg-[#F9FAFB] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\"\n [dndDraggable]=\"step\"\n [dndDisableIf]=\"steps.length <= 1\"\n dndEffectAllowed=\"move\"\n dndType=\"recorded-step\">\n <span dndHandle class=\"cqa-flex-shrink-0 cqa-text-[#9CA3AF] cqa-cursor-grab cqa-p-1 active:cqa-cursor-grabbing\" aria-hidden=\"true\" title=\"Drag to reorder\">\n <mat-icon class=\"cqa-w-5 cqa-h-5 cqa-text-[20px] cqa-block cqa-leading-none\">drag_indicator</mat-icon>\n </span>\n <span class=\"cqa-flex-shrink-0 cqa-text-[12px] cqa-text-[#9CA3AF]\">{{ i + 1 }}</span>\n <span class=\"cqa-flex-1 cqa-min-w-0 cqa-text-sm cqa-font-normal cqa-text-gray-800 cqa-truncate\">{{ step.label || 'Step' }}</span>\n <!-- <cqa-custom-input\n [value]=\"step.label\"\n [placeholder]=\"'Step name'\"\n [fullWidth]=\"true\"\n size=\"md\"\n (valueChange)=\"onStepLabelChange(step.id, $event)\">\n </cqa-custom-input>\n <cqa-button\n type=\"button\"\n variant=\"text\"\n btnSize=\"md\"\n icon=\"delete_outline\"\n iconColor=\"#99999E\"\n [tooltip]=\"'Remove step'\"\n tooltipPosition=\"below\"\n customClass=\"cqa-shrink-0\"\n (clicked)=\"onRemoveStep(step.id, $event)\">\n </cqa-button> -->\n </div>\n </div>\n </section>\n\n <!-- Save option -->\n <section class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-rounded-lg cqa-p-4\" aria-labelledby=\"save-option-heading\">\n <h3 id=\"save-option-heading\" class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900 cqa-m-0\">Save option</h3>\n <mat-radio-group\n [value]=\"saveOption\"\n (change)=\"onSaveOptionChange($any($event).value)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <label class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-cursor-pointer\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <mat-radio-button value=\"run_only\" color=\"primary\"></mat-radio-button>\n <span class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900\">Save for this run only</span>\n </span>\n <span class=\"cqa-text-sm cqa-font-normal cqa-text-gray-500 cqa-pl-6\">Changes will be reverted after this debug session</span>\n </label>\n <label class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-cursor-pointer\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <mat-radio-button value=\"test_case\" color=\"primary\"></mat-radio-button>\n <span class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900\">Save to test case</span>\n </span>\n <span class=\"cqa-text-sm cqa-font-normal cqa-text-gray-500 cqa-pl-6\">Changes will be permanently saved</span>\n </label>\n </mat-radio-group>\n </section>\n </div>\n\n <!-- Footer -->\n <div class=\"cqa-px-6 cqa-pb-6 cqa-border-t cqa-border-gray-200 cqa-grid cqa-grid-cols-2 cqa-gap-3 cqa-w-full\">\n <cqa-button\n type=\"button\"\n variant=\"outlined\"\n btnSize=\"lg\"\n [text]=\"'Discard'\"\n [fullWidth]=\"true\"\n customClass=\"cqa-w-full cqa-bg-white cqa-border cqa-border-[#414146] cqa-text-[#414146] cqa-rounded-lg hover:cqa-bg-gray-50\"\n (clicked)=\"onDiscard()\">\n </cqa-button>\n <cqa-button\n type=\"button\"\n variant=\"filled\"\n btnSize=\"lg\"\n [text]=\"'Save'\"\n [disabled]=\"saveButtonDisabled\"\n [fullWidth]=\"true\"\n customClass=\"cqa-w-full cqa-bg-[#4F46E5] cqa-border-[#4F46E5] cqa-text-white cqa-rounded-lg\"\n (clicked)=\"onSave()\">\n </cqa-button>\n </div>\n </div>\n</div>\n", styles: [] }]
84
+ }], propDecorators: { isOpen: [{
85
+ type: Input
86
+ }], title: [{
87
+ type: Input
88
+ }], steps: [{
89
+ type: Input
90
+ }], saveOption: [{
91
+ type: Input
92
+ }], saveButtonDisabled: [{
93
+ type: Input
94
+ }], closeModal: [{
95
+ type: Output
96
+ }], discard: [{
97
+ type: Output
98
+ }], save: [{
99
+ type: Output
100
+ }], saveOptionChange: [{
101
+ type: Output
102
+ }], stepLabelChange: [{
103
+ type: Output
104
+ }], removeStep: [{
105
+ type: Output
106
+ }], reorderSteps: [{
107
+ type: Output
108
+ }], onEscape: [{
109
+ type: HostListener,
110
+ args: ['document:keydown.escape']
111
+ }] } });
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2aWV3LXJlY29yZGVkLXN0ZXBzLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9yZXZpZXctcmVjb3JkZWQtc3RlcHMtbW9kYWwvcmV2aWV3LXJlY29yZGVkLXN0ZXBzLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9yZXZpZXctcmVjb3JkZWQtc3RlcHMtbW9kYWwvcmV2aWV3LXJlY29yZGVkLXN0ZXBzLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBZ0JyRixNQUFNLE9BQU8saUNBQWlDO0lBTjlDO1FBT1csV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixVQUFLLEdBQVcsdUJBQXVCLENBQUM7UUFDeEMsVUFBSyxHQUF1QixFQUFFLENBQUM7UUFDL0IsZUFBVSxHQUFlLFVBQVUsQ0FBQztRQUNwQyx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFFbkMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDdEMsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDbkMsU0FBSSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDaEMscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUNsRCxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFpQyxDQUFDO1FBQ3BFLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3hDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7S0FnRWpFO0lBOURDLGVBQWUsQ0FBQyxLQUFpQjtRQUMvQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBcUIsQ0FBQztRQUMzQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBNEIsQ0FBQztRQUN6RCxJQUFJLE1BQU0sS0FBSyxhQUFhLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsb0NBQW9DLENBQUMsRUFBRTtZQUMvRixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDaEI7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2xCO0lBQ0gsQ0FBQztJQUVELGtCQUFrQixDQUFDLEtBQWlCO1FBQ2xDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQVUsRUFBRSxLQUFhO1FBQ3pDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELFlBQVksQ0FBQyxFQUFVLEVBQUUsS0FBWTtRQUNuQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBbUI7UUFDM0IsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUk7WUFBRSxPQUFPO1FBQ3RELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUF3QixDQUFDO1FBQ25ELElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDNUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLElBQUksWUFBWSxHQUFHLENBQUM7WUFBRSxPQUFPO1FBQzdCLElBQUksWUFBWSxLQUFLLFNBQVM7WUFBRSxPQUFPO1FBRXZDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakMsSUFBSSxZQUFZLEdBQUcsU0FBUztZQUFFLFNBQVMsRUFBRSxDQUFDO1FBQzFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBR0QsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNoQjtJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsTUFBYyxFQUFFLElBQXNCO1FBQ2xELE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNqQixDQUFDOzs4SEE1RVUsaUNBQWlDO2tIQUFqQyxpQ0FBaUMscWZDaEI5Qyx3aE9BMklBOzJGRDNIYSxpQ0FBaUM7a0JBTjdDLFNBQVM7K0JBQ0UsaUNBQWlDLFFBR3JDLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRTs4QkFHckIsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBdURQLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEbmREcm9wRXZlbnQgfSBmcm9tICduZ3gtZHJhZy1kcm9wJztcblxuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRlZFN0ZXBJdGVtIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgU2F2ZU9wdGlvbiA9ICdydW5fb25seScgfCAndGVzdF9jYXNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXJldmlldy1yZWNvcmRlZC1zdGVwcy1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXZpZXctcmVjb3JkZWQtc3RlcHMtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG59KVxuZXhwb3J0IGNsYXNzIFJldmlld1JlY29yZGVkU3RlcHNNb2RhbENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJ1JldmlldyBSZWNvcmRlZCBTdGVwcyc7XG4gIEBJbnB1dCgpIHN0ZXBzOiBSZWNvcmRlZFN0ZXBJdGVtW10gPSBbXTtcbiAgQElucHV0KCkgc2F2ZU9wdGlvbjogU2F2ZU9wdGlvbiA9ICdydW5fb25seSc7XG4gIEBJbnB1dCgpIHNhdmVCdXR0b25EaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBjbG9zZU1vZGFsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZGlzY2FyZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzYXZlT3B0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTYXZlT3B0aW9uPigpO1xuICBAT3V0cHV0KCkgc3RlcExhYmVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfT4oKTtcbiAgQE91dHB1dCgpIHJlbW92ZVN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHJlb3JkZXJTdGVwcyA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkZWRTdGVwSXRlbVtdPigpO1xuXG4gIG9uQmFja2Ryb3BDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBjdXJyZW50VGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0ID09PSBjdXJyZW50VGFyZ2V0IHx8IHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2NxYS1yZXZpZXctcmVjb3JkZWQtc3RlcHMtYmFja2Ryb3AnKSkge1xuICAgICAgdGhpcy5vbkNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlTW9kYWwuZW1pdCgpO1xuICB9XG5cbiAgb25EaXNjYXJkKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzY2FyZC5lbWl0KCk7XG4gIH1cblxuICBvblNhdmUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNhdmVCdXR0b25EaXNhYmxlZCkge1xuICAgICAgdGhpcy5zYXZlLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBvblNhdmVPcHRpb25DaGFuZ2UodmFsdWU6IFNhdmVPcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnNhdmVPcHRpb24gPSB2YWx1ZTtcbiAgICB0aGlzLnNhdmVPcHRpb25DaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvblN0ZXBMYWJlbENoYW5nZShpZDogc3RyaW5nLCBsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zdGVwTGFiZWxDaGFuZ2UuZW1pdCh7IGlkLCBsYWJlbCB9KTtcbiAgfVxuXG4gIG9uUmVtb3ZlU3RlcChpZDogc3RyaW5nLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmVtb3ZlU3RlcC5lbWl0KGlkKTtcbiAgfVxuXG4gIG9uRG5kRHJvcChldmVudDogRG5kRHJvcEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmRhdGEgPT0gbnVsbCB8fCBldmVudC5pbmRleCA9PSBudWxsKSByZXR1cm47XG4gICAgY29uc3QgZHJvcHBlZFN0ZXAgPSBldmVudC5kYXRhIGFzIFJlY29yZGVkU3RlcEl0ZW07XG4gICAgbGV0IGRyb3BJbmRleCA9IGV2ZW50LmluZGV4O1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMuc3RlcHMuZmluZEluZGV4KChzKSA9PiBzLmlkID09PSBkcm9wcGVkU3RlcC5pZCk7XG4gICAgaWYgKGN1cnJlbnRJbmRleCA8IDApIHJldHVybjtcbiAgICBpZiAoY3VycmVudEluZGV4ID09PSBkcm9wSW5kZXgpIHJldHVybjtcblxuICAgIGNvbnN0IG5ld1N0ZXBzID0gWy4uLnRoaXMuc3RlcHNdO1xuICAgIG5ld1N0ZXBzLnNwbGljZShjdXJyZW50SW5kZXgsIDEpO1xuICAgIGlmIChjdXJyZW50SW5kZXggPCBkcm9wSW5kZXgpIGRyb3BJbmRleC0tO1xuICAgIG5ld1N0ZXBzLnNwbGljZShkcm9wSW5kZXgsIDAsIGRyb3BwZWRTdGVwKTtcbiAgICB0aGlzLnJlb3JkZXJTdGVwcy5lbWl0KG5ld1N0ZXBzKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJylcbiAgb25Fc2NhcGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICB0aGlzLm9uQ2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICB0cmFja0J5U3RlcElkKF9pbmRleDogbnVtYmVyLCBzdGVwOiBSZWNvcmRlZFN0ZXBJdGVtKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RlcC5pZDtcbiAgfVxufVxuIiwiPGRpdlxuICAqbmdJZj1cImlzT3BlblwiXG4gIGNsYXNzPVwiY3FhLXJldmlldy1yZWNvcmRlZC1zdGVwcy1iYWNrZHJvcCBjcWEtZml4ZWQgY3FhLWluc2V0LTAgY3FhLWJnLWJsYWNrIGNxYS1iZy1vcGFjaXR5LTUwIGNxYS16LTUwIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIlxuICAoY2xpY2spPVwib25CYWNrZHJvcENsaWNrKCRldmVudClcIlxuICByb2xlPVwiZGlhbG9nXCJcbiAgYXJpYS1tb2RhbD1cInRydWVcIlxuICBhcmlhLWxhYmVsbGVkYnk9XCJyZXZpZXctcmVjb3JkZWQtc3RlcHMtdGl0bGVcIlxuICBhcmlhLWRlc2NyaWJlZGJ5PVwicmV2aWV3LXJlY29yZGVkLXN0ZXBzLWNvbnRlbnRcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLXJvdW5kZWQteGwgY3FhLWJnLVsjRkJGQ0ZGXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNFNUU1RTVdIGNxYS13LWZ1bGwgY3FhLW1heC13LVs0OTlweF0gY3FhLW1heC1oLVs5MHZoXSBjcWEtb3ZlcmZsb3ctaGlkZGVuIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtc2hhZG93LVswXzRweF82cHhfLTFweF8jMDAwMDAwNDAsMF8ycHhfNHB4Xy0ycHhfIzAwMDAwMDQwXVwiXG4gICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuXG4gICAgPCEtLSBIZWFkZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcHgtNiBjcWEtcHQtNCBjcWEtcGItNFwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNFNUU3RUJcIj5cbiAgICAgIDxoMlxuICAgICAgICBpZD1cInJldmlldy1yZWNvcmRlZC1zdGVwcy10aXRsZVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWzE2cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS1sZWFkaW5nLTcgY3FhLXRleHQtZ3JheS04MDAgY3FhLW0tMFwiPlxuICAgICAgICB7eyB0aXRsZSB9fVxuICAgICAgPC9oMj5cbiAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICB2YXJpYW50PVwidGV4dFwiXG4gICAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICAgIGljb249XCJjbG9zZVwiXG4gICAgICAgIGljb25Db2xvcj1cIiM0QTU1NjVcIlxuICAgICAgICBbdG9vbHRpcF09XCInQ2xvc2UnXCJcbiAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICBjdXN0b21DbGFzcz1cIiFjcWEtbWluLXctMCBjcWEtcC0xXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DbG9zZSgpXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIENvbnRlbnQgLS0+XG4gICAgPGRpdiBpZD1cInJldmlldy1yZWNvcmRlZC1zdGVwcy1jb250ZW50XCIgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1vdmVyZmxvdy15LWF1dG8gY3FhLXB4LTYgY3FhLXB5LTQgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNVwiPlxuXG4gICAgICA8IS0tIEFsZXJ0OiBSZWNvcmRpbmcgRmluaXNoZWQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLXN0YXJ0IGNxYS1nYXAtMyBjcWEtcHgtNCBjcWEtcHktMyBjcWEtYmctWyNFRkY2RkZdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0RCRUFGRV0gY3FhLXJvdW5kZWQtbGdcIj5cbiAgICAgICAgPG1hdC1pY29uIGZvbnRTZXQ9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMCBjcWEtdy02IGNxYS1oLTUgY3FhLXRleHQtWyMxRTQwQUZdIGNxYS10ZXh0LXhsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+dmlkZW9jYW08L21hdC1pY29uPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMSBjcWEtbWluLXctMFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxRTQwQUZdXCI+UmVjb3JkaW5nIEZpbmlzaGVkPC9zcGFuPlxuICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LVsjMUU0MEFGXSBjcWEtbS0wXCI+XG4gICAgICAgICAgICBSZXZpZXcgdGhlIHN0ZXBzIGNhcHR1cmVkIGJlbG93IGJlZm9yZSBhZGRpbmcgdGhlbSB0byB5b3VyIHRlc3QuIFlvdSBjYW4gcmVuYW1lLCBkZWxldGUsIG9yIHJlb3JkZXIgdGhlbS5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUmVjb3JkZWQgc3RlcHMgbGlzdCAtLT5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtbWluLWgtMFwiIGFyaWEtbGFiZWxsZWRieT1cInJlY29yZGVkLXN0ZXBzLWhlYWRpbmdcIj5cbiAgICAgICAgPGgzIGlkPVwicmVjb3JkZWQtc3RlcHMtaGVhZGluZ1wiIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktOTAwIGNxYS1tLTAgY3FhLXNyLW9ubHlcIj5SZWNvcmRlZCBzdGVwczwvaDM+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLW1heC1oLVsyNDBweF0gY3FhLW92ZXJmbG93LXktYXV0byBjcWEtbWluLWgtMFwiXG4gICAgICAgICAgW2RuZERyb3B6b25lXT1cIlsncmVjb3JkZWQtc3RlcCddXCJcbiAgICAgICAgICBkbmRFZmZlY3RBbGxvd2VkPVwibW92ZVwiXG4gICAgICAgICAgZG5kRHJhZ292ZXJDbGFzcz1cImNxYS1vcGFjaXR5LTcwXCJcbiAgICAgICAgICAoZG5kRHJvcCk9XCJvbkRuZERyb3AoJGV2ZW50KVwiPlxuICAgICAgICAgIDxkaXYgZG5kUGxhY2Vob2xkZXJSZWYgY2xhc3M9XCJjcWEtcm91bmRlZC1sZyBjcWEtYm9yZGVyIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1wLTIgY3FhLW1pbi1oLVs0NHB4XSBjcWEtYmctWyNGM0Y0RjZdXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHN0ZXAgb2Ygc3RlcHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlTdGVwSWRcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcm91bmRlZC1sZyBjcWEtcC0yIGNxYS1iZy1bI0Y5RkFGQl0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdXCJcbiAgICAgICAgICAgIFtkbmREcmFnZ2FibGVdPVwic3RlcFwiXG4gICAgICAgICAgICBbZG5kRGlzYWJsZUlmXT1cInN0ZXBzLmxlbmd0aCA8PSAxXCJcbiAgICAgICAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgICAgICAgIGRuZFR5cGU9XCJyZWNvcmRlZC1zdGVwXCI+XG4gICAgICAgICAgICA8c3BhbiBkbmRIYW5kbGUgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMCBjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLWN1cnNvci1ncmFiIGNxYS1wLTEgYWN0aXZlOmNxYS1jdXJzb3ItZ3JhYmJpbmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB0aXRsZT1cIkRyYWcgdG8gcmVvcmRlclwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXRleHQtWzIwcHhdIGNxYS1ibG9jayBjcWEtbGVhZGluZy1ub25lXCI+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMCBjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyM5Q0EzQUZdXCI+e3sgaSArIDEgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTAgY3FhLXRleHQtc20gY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LWdyYXktODAwIGNxYS10cnVuY2F0ZVwiPnt7IHN0ZXAubGFiZWwgfHwgJ1N0ZXAnIH19PC9zcGFuPlxuICAgICAgICAgICAgPCEtLSA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICBbdmFsdWVdPVwic3RlcC5sYWJlbFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU3RlcCBuYW1lJ1wiXG4gICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblN0ZXBMYWJlbENoYW5nZShzdGVwLmlkLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgdmFyaWFudD1cInRleHRcIlxuICAgICAgICAgICAgICBidG5TaXplPVwibWRcIlxuICAgICAgICAgICAgICBpY29uPVwiZGVsZXRlX291dGxpbmVcIlxuICAgICAgICAgICAgICBpY29uQ29sb3I9XCIjOTk5OTlFXCJcbiAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSBzdGVwJ1wiXG4gICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCJcbiAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtc2hyaW5rLTBcIlxuICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJvblJlbW92ZVN0ZXAoc3RlcC5pZCwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9jcWEtYnV0dG9uPiAtLT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NlY3Rpb24+XG5cbiAgICAgIDwhLS0gU2F2ZSBvcHRpb24gLS0+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1yb3VuZGVkLWxnIGNxYS1wLTRcIiBhcmlhLWxhYmVsbGVkYnk9XCJzYXZlLW9wdGlvbi1oZWFkaW5nXCI+XG4gICAgICAgIDxoMyBpZD1cInNhdmUtb3B0aW9uLWhlYWRpbmdcIiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTkwMCBjcWEtbS0wXCI+U2F2ZSBvcHRpb248L2gzPlxuICAgICAgICA8bWF0LXJhZGlvLWdyb3VwXG4gICAgICAgICAgW3ZhbHVlXT1cInNhdmVPcHRpb25cIlxuICAgICAgICAgIChjaGFuZ2UpPVwib25TYXZlT3B0aW9uQ2hhbmdlKCRhbnkoJGV2ZW50KS52YWx1ZSlcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNFwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEgY3FhLWN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwicnVuX29ubHlcIiBjb2xvcj1cInByaW1hcnlcIj48L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktOTAwXCI+U2F2ZSBmb3IgdGhpcyBydW4gb25seTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LWdyYXktNTAwIGNxYS1wbC02XCI+Q2hhbmdlcyB3aWxsIGJlIHJldmVydGVkIGFmdGVyIHRoaXMgZGVidWcgc2Vzc2lvbjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEgY3FhLWN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwidGVzdF9jYXNlXCIgY29sb3I9XCJwcmltYXJ5XCI+PC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTkwMFwiPlNhdmUgdG8gdGVzdCBjYXNlPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1ub3JtYWwgY3FhLXRleHQtZ3JheS01MDAgY3FhLXBsLTZcIj5DaGFuZ2VzIHdpbGwgYmUgcGVybWFuZW50bHkgc2F2ZWQ8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XG4gICAgICA8L3NlY3Rpb24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEZvb3RlciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXB4LTYgY3FhLXBiLTYgY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZ3JheS0yMDAgY3FhLWdyaWQgY3FhLWdyaWQtY29scy0yIGNxYS1nYXAtMyBjcWEtdy1mdWxsXCI+XG4gICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgICAgYnRuU2l6ZT1cImxnXCJcbiAgICAgICAgW3RleHRdPVwiJ0Rpc2NhcmQnXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1iZy13aGl0ZSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyM0MTQxNDZdIGNxYS10ZXh0LVsjNDE0MTQ2XSBjcWEtcm91bmRlZC1sZyBob3ZlcjpjcWEtYmctZ3JheS01MFwiXG4gICAgICAgIChjbGlja2VkKT1cIm9uRGlzY2FyZCgpXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgdmFyaWFudD1cImZpbGxlZFwiXG4gICAgICAgIGJ0blNpemU9XCJsZ1wiXG4gICAgICAgIFt0ZXh0XT1cIidTYXZlJ1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJzYXZlQnV0dG9uRGlzYWJsZWRcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICBjdXN0b21DbGFzcz1cImNxYS13LWZ1bGwgY3FhLWJnLVsjNEY0NkU1XSBjcWEtYm9yZGVyLVsjNEY0NkU1XSBjcWEtdGV4dC13aGl0ZSBjcWEtcm91bmRlZC1sZ1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uU2F2ZSgpXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=