@cqa-lib/cqa-ui 1.1.66 → 1.1.68

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.
@@ -50,6 +50,28 @@ export class StepGroupComponent extends BaseStepComponent {
50
50
  // Emit event when expanding (transitioning from collapsed to expanded)
51
51
  if (!wasExpanded && this.isExpanded) {
52
52
  this.onExpand.emit();
53
+ // If this step has children (hasChild is true) and onExpandHandler is provided, call it to fetch children
54
+ if (this.onExpandHandler && this.config) {
55
+ const hasChild = this.config.hasChild ||
56
+ ((this.config.steps?.length === 0 || !this.config.steps) && this.testStepResultId);
57
+ if (hasChild) {
58
+ // Create a step config object for the handler with hasChild property
59
+ const stepConfig = {
60
+ ...this.config,
61
+ hasChild: true,
62
+ expanded: true,
63
+ testStepType: this.config.testStepType || 'STEP_GROUP',
64
+ children: this.config.steps || [],
65
+ testStepResultId: this.testStepResultId,
66
+ id: this.id
67
+ };
68
+ this.onExpandHandler(stepConfig);
69
+ }
70
+ }
71
+ }
72
+ // Ensure expanded state is synced with config
73
+ if (this.config) {
74
+ this.config.expanded = this.isExpanded;
53
75
  }
54
76
  }
55
77
  // Helper method to check if a step is a step-group with hasChild
@@ -66,12 +88,141 @@ export class StepGroupComponent extends BaseStepComponent {
66
88
  const stepGroup = step;
67
89
  return stepGroup.steps || step.children || [];
68
90
  }
91
+ // Helper method to check if a step is a loop step
92
+ isNestedLoopStep(step) {
93
+ const stepType = step.testStepType || step.type;
94
+ return stepType === 'FOR_LOOP' || stepType === 'WHILE_LOOP' || stepType === 'loop';
95
+ }
96
+ // Helper method to check if a step is a condition step
97
+ isNestedConditionStep(step) {
98
+ const stepType = step.testStepType || step.type;
99
+ return stepType === 'CONDITION_IF' || stepType === 'CONDITION_ELSE' ||
100
+ stepType === 'CONDITION_ELSE_IF' || stepType === 'CONDITION_ELSEIF' ||
101
+ stepType === 'condition';
102
+ }
103
+ // Helper method to get step title
104
+ getStepTitle(step) {
105
+ return step.action || step.title || '';
106
+ }
107
+ // Helper method to get step status
108
+ getStepStatus(step) {
109
+ const result = step.result;
110
+ if (result) {
111
+ const resultLower = result.toLowerCase();
112
+ if (resultLower === 'success' || resultLower === 'passed') {
113
+ return 'success';
114
+ }
115
+ else if (resultLower === 'failure' || resultLower === 'failed') {
116
+ return 'failed';
117
+ }
118
+ else if (resultLower === 'pending' || resultLower === 'not-executed') {
119
+ return 'pending';
120
+ }
121
+ else if (resultLower === 'running') {
122
+ return 'running';
123
+ }
124
+ }
125
+ return step.status || 'pending';
126
+ }
127
+ // Helper method to get step duration
128
+ getStepDuration(step) {
129
+ return step.duration || step.duration || 0;
130
+ }
131
+ // Helper methods for loop step properties
132
+ getLoopType(step) {
133
+ const stepType = step.testStepType || step.type;
134
+ if (stepType === 'FOR_LOOP' || step.loopType === 'for') {
135
+ return 'for';
136
+ }
137
+ else if (stepType === 'WHILE_LOOP' || step.loopType === 'while') {
138
+ return 'while';
139
+ }
140
+ return step.loopType;
141
+ }
142
+ getLoopIterations(step) {
143
+ const loopStep = step;
144
+ return loopStep.iterations || [];
145
+ }
146
+ getLoopNestedSteps(step) {
147
+ const loopStep = step;
148
+ return loopStep.nestedSteps || step.children || [];
149
+ }
150
+ // Helper methods for condition step properties
151
+ getConditionStepDuration(step) {
152
+ const duration = this.getStepDuration(step);
153
+ if (this.convertMsToSecondsHandler) {
154
+ return this.convertMsToSecondsHandler(duration);
155
+ }
156
+ return duration;
157
+ }
158
+ getConditionStepExpanded(step) {
159
+ if (this.isStepExpandedHandler) {
160
+ return this.isStepExpandedHandler(step);
161
+ }
162
+ return step.expanded || false;
163
+ }
164
+ getConditionStepText(step) {
165
+ return step.action || step.title || '';
166
+ }
167
+ getConditionStepBranches(step) {
168
+ if (this.getConditionBranchesHandler) {
169
+ return this.getConditionBranchesHandler(step);
170
+ }
171
+ return [];
172
+ }
173
+ getConditionStepLoading(step) {
174
+ if (this.isStepLoadingHandler) {
175
+ return this.isStepLoadingHandler(step);
176
+ }
177
+ return false;
178
+ }
179
+ handleConditionStepExpand(step) {
180
+ if (this.onExpandHandler) {
181
+ this.onExpandHandler(step);
182
+ }
183
+ }
184
+ handleLoopStepExpand(step) {
185
+ if (this.onExpandHandler) {
186
+ this.onExpandHandler(step);
187
+ }
188
+ }
189
+ handleLoopStepIterationChange(step, iterationId) {
190
+ // This would typically be handled by the parent component
191
+ if (this.onExpandHandler) {
192
+ this.onExpandHandler(step);
193
+ }
194
+ }
195
+ getConditionStepFailureDetails(step) {
196
+ if (this.formatFailureDetailsHandler) {
197
+ return this.formatFailureDetailsHandler(step);
198
+ }
199
+ return undefined;
200
+ }
201
+ getConditionStepSelfHealAnalysis(step) {
202
+ if (this.getSelfHealAnalysisHandler) {
203
+ return this.getSelfHealAnalysisHandler(step);
204
+ }
205
+ return undefined;
206
+ }
207
+ // Helper methods to safely access LoopStepConfig properties
208
+ getLoopSelectedIterationId(step) {
209
+ const loopStep = step;
210
+ return loopStep.selectedIterationId;
211
+ }
212
+ getLoopDefaultIteration(step) {
213
+ const loopStep = step;
214
+ return loopStep.defaultIteration || 'last';
215
+ }
216
+ getLoopShowViewAllIterations(step) {
217
+ const loopStep = step;
218
+ return loopStep.showViewAllIterations;
219
+ }
69
220
  }
70
221
  StepGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepGroupComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
71
- StepGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepGroupComponent, selector: "cqa-step-group", inputs: { id: "id", testStepResultId: "testStepResultId", stepNumber: "stepNumber", title: "title", status: "status", duration: "duration", timingBreakdown: "timingBreakdown", expanded: "expanded", groupName: "groupName", steps: "steps", onExpandHandler: "onExpandHandler" }, outputs: { onExpand: "onExpand" }, host: { classAttribute: "cqa-ui-root" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div style=\"border-bottom: '1px solid #F3F4F6'\">\n <!-- Header -->\n <div\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-p-2 cqa-cursor-pointer\"\n (click)=\"toggle()\">\n \n <!-- Status Icon -->\n <div>\n <!-- Success -->\n <svg *ngIf=\"config.status.toLowerCase() === 'success'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Failed -->\n <svg *ngIf=\"config.status.toLowerCase() === 'failure'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4 4L8 8M8 4L4 8\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Pending -->\n <svg *ngIf=\"config.status.toLowerCase() === 'pending'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Running -->\n <svg *ngIf=\"config.status.toLowerCase() === 'running'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n\n <!-- Folder Icon -->\n <div><svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M11.6666 11.6667C11.976 11.6667 12.2728 11.5437 12.4916 11.325C12.7104 11.1062 12.8333 10.8094 12.8333 10.5V4.66667C12.8333 4.35725 12.7104 4.0605 12.4916 3.84171C12.2728 3.62292 11.976 3.5 11.6666 3.5H7.05829C6.86318 3.50191 6.67069 3.45486 6.49847 3.36314C6.32624 3.27142 6.17977 3.13797 6.07246 2.975L5.59996 2.275C5.49373 2.11369 5.34911 1.98128 5.17908 1.88965C5.00906 1.79802 4.81894 1.75003 4.62579 1.75H2.33329C2.02387 1.75 1.72713 1.87292 1.50833 2.09171C1.28954 2.3105 1.16663 2.60725 1.16663 2.91667V10.5C1.16663 10.8094 1.28954 11.1062 1.50833 11.325C1.72713 11.5437 2.02387 11.6667 2.33329 11.6667H11.6666Z\" fill=\"#EFF6FF\" stroke=\"#60A5FA\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n\n <!-- Step Number and Title -->\n <div class=\"cqa-font-bold cqa-flex-1 cqa-text-[#334155] cqa-text-[11px] cqa-leading-[13px]\">\n {{ config.stepNumber }}. Step group: {{ config.groupName }}\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-[9px] cqa-leading-[11px] cqa-text-[#9CA3AF]\">\n {{ formatDuration(config.duration) }}\n </span>\n <svg [class.cqa-rotate-180]=\"isExpanded\" class=\"cqa-transition-transform\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3.5 5L7 8.5L10.5 5\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n\n <!-- Expanded Content -->\n <div *ngIf=\"isExpanded\">\n <!-- Nested Steps -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-mt-2 cqa-ml-[18px]\">\n <ng-container *ngFor=\"let step of config.steps\">\n <!-- For nested step groups with hasChild, render directly with onExpand handler -->\n <cqa-step-group \n *ngIf=\"isNestedStepGroupWithChildren(step) && onExpandHandler\"\n [id]=\"step.id\"\n [testStepResultId]=\"step.testStepResultId\"\n [stepNumber]=\"step.stepNumber\"\n [title]=\"step.title\"\n [status]=\"step.status\"\n [duration]=\"step.duration\"\n [expanded]=\"step.expanded\"\n [groupName]=\"getGroupName(step)\"\n [steps]=\"getSteps(step)\"\n [timingBreakdown]=\"step.timingBreakdown\"\n [onExpandHandler]=\"onExpandHandler\"\n (onExpand)=\"onExpandHandler && onExpandHandler(step)\">\n </cqa-step-group>\n <!-- For other step types, use step-renderer -->\n <cqa-step-renderer \n *ngIf=\"!isNestedStepGroupWithChildren(step) || !onExpandHandler\" \n [step]=\"step\">\n </cqa-step-renderer>\n </ng-container>\n </div>\n </div>\n</div>\n", components: [{ type: StepGroupComponent, selector: "cqa-step-group", inputs: ["id", "testStepResultId", "stepNumber", "title", "status", "duration", "timingBreakdown", "expanded", "groupName", "steps", "onExpandHandler"], outputs: ["onExpand"] }, { type: i1.StepRendererComponent, selector: "cqa-step-renderer", inputs: ["step"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
222
+ StepGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepGroupComponent, selector: "cqa-step-group", inputs: { id: "id", testStepResultId: "testStepResultId", stepNumber: "stepNumber", title: "title", status: "status", duration: "duration", timingBreakdown: "timingBreakdown", expanded: "expanded", groupName: "groupName", steps: "steps", onExpandHandler: "onExpandHandler", getConditionBranchesHandler: "getConditionBranchesHandler", isStepLoadingHandler: "isStepLoadingHandler", isStepExpandedHandler: "isStepExpandedHandler", convertMsToSecondsHandler: "convertMsToSecondsHandler", formatFailureDetailsHandler: "formatFailureDetailsHandler", getSelfHealAnalysisHandler: "getSelfHealAnalysisHandler", onMakeCurrentBaselineHandler: "onMakeCurrentBaselineHandler", onUploadBaselineHandler: "onUploadBaselineHandler", onAnalyzeHandler: "onAnalyzeHandler", onViewFullLogsHandler: "onViewFullLogsHandler", onSelfHealActionHandler: "onSelfHealActionHandler", getLoopIterationsHandler: "getLoopIterationsHandler", isUploadingBaseline: "isUploadingBaseline" }, outputs: { onExpand: "onExpand" }, host: { classAttribute: "cqa-ui-root" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div style=\"border-bottom: '1px solid #F3F4F6'\">\n <!-- Header -->\n <div\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-p-2 cqa-cursor-pointer\"\n (click)=\"toggle()\">\n \n <!-- Status Icon -->\n <div>\n <!-- Success -->\n <svg *ngIf=\"config.status.toLowerCase() === 'success'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Failed -->\n <svg *ngIf=\"config.status.toLowerCase() === 'failure'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4 4L8 8M8 4L4 8\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Pending -->\n <svg *ngIf=\"config.status.toLowerCase() === 'pending'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Running -->\n <svg *ngIf=\"config.status.toLowerCase() === 'running'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n\n <!-- Folder Icon -->\n <div><svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M11.6666 11.6667C11.976 11.6667 12.2728 11.5437 12.4916 11.325C12.7104 11.1062 12.8333 10.8094 12.8333 10.5V4.66667C12.8333 4.35725 12.7104 4.0605 12.4916 3.84171C12.2728 3.62292 11.976 3.5 11.6666 3.5H7.05829C6.86318 3.50191 6.67069 3.45486 6.49847 3.36314C6.32624 3.27142 6.17977 3.13797 6.07246 2.975L5.59996 2.275C5.49373 2.11369 5.34911 1.98128 5.17908 1.88965C5.00906 1.79802 4.81894 1.75003 4.62579 1.75H2.33329C2.02387 1.75 1.72713 1.87292 1.50833 2.09171C1.28954 2.3105 1.16663 2.60725 1.16663 2.91667V10.5C1.16663 10.8094 1.28954 11.1062 1.50833 11.325C1.72713 11.5437 2.02387 11.6667 2.33329 11.6667H11.6666Z\" fill=\"#EFF6FF\" stroke=\"#60A5FA\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n\n <!-- Step Number and Title -->\n <div class=\"cqa-font-bold cqa-flex-1 cqa-text-[#334155] cqa-text-[11px] cqa-leading-[13px]\">\n {{ config.stepNumber }}. Step group: {{ config.groupName }}\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-[9px] cqa-leading-[11px] cqa-text-[#9CA3AF]\">\n {{ formatDuration(config.duration) }}\n </span>\n <svg [class.cqa-rotate-180]=\"isExpanded\" class=\"cqa-transition-transform\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3.5 5L7 8.5L10.5 5\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n\n <!-- Expanded Content -->\n <div *ngIf=\"isExpanded\">\n <!-- Nested Steps -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-mt-2 cqa-ml-[18px]\">\n <ng-container *ngFor=\"let step of config.steps\">\n <!-- Use step-renderer for all nested steps to avoid circular dependencies -->\n <!-- The step-renderer will dynamically load the appropriate component and pass handlers -->\n <cqa-step-renderer \n [step]=\"step\"\n [onExpandHandler]=\"onExpandHandler\"\n [getConditionBranchesHandler]=\"getConditionBranchesHandler\"\n [isStepLoadingHandler]=\"isStepLoadingHandler\"\n [isStepExpandedHandler]=\"isStepExpandedHandler\"\n [convertMsToSecondsHandler]=\"convertMsToSecondsHandler\"\n [formatFailureDetailsHandler]=\"formatFailureDetailsHandler\"\n [getSelfHealAnalysisHandler]=\"getSelfHealAnalysisHandler\"\n [getLoopIterationsHandler]=\"getLoopIterationsHandler\"\n [onMakeCurrentBaselineHandler]=\"onMakeCurrentBaselineHandler\"\n [onUploadBaselineHandler]=\"onUploadBaselineHandler\"\n [onAnalyzeHandler]=\"onAnalyzeHandler\"\n [onViewFullLogsHandler]=\"onViewFullLogsHandler\"\n [onSelfHealActionHandler]=\"onSelfHealActionHandler\"\n [isUploadingBaseline]=\"isUploadingBaseline\">\n </cqa-step-renderer>\n </ng-container>\n </div>\n </div>\n</div>\n", components: [{ type: i1.StepRendererComponent, selector: "cqa-step-renderer", inputs: ["step", "onExpandHandler", "getConditionBranchesHandler", "isStepLoadingHandler", "isStepExpandedHandler", "convertMsToSecondsHandler", "formatFailureDetailsHandler", "getSelfHealAnalysisHandler", "onMakeCurrentBaselineHandler", "onUploadBaselineHandler", "onAnalyzeHandler", "onViewFullLogsHandler", "onSelfHealActionHandler", "isUploadingBaseline", "getLoopIterationsHandler"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
72
223
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepGroupComponent, decorators: [{
73
224
  type: Component,
74
- args: [{ selector: 'cqa-step-group', host: { class: 'cqa-ui-root' }, template: "<div style=\"border-bottom: '1px solid #F3F4F6'\">\n <!-- Header -->\n <div\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-p-2 cqa-cursor-pointer\"\n (click)=\"toggle()\">\n \n <!-- Status Icon -->\n <div>\n <!-- Success -->\n <svg *ngIf=\"config.status.toLowerCase() === 'success'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Failed -->\n <svg *ngIf=\"config.status.toLowerCase() === 'failure'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4 4L8 8M8 4L4 8\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Pending -->\n <svg *ngIf=\"config.status.toLowerCase() === 'pending'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Running -->\n <svg *ngIf=\"config.status.toLowerCase() === 'running'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n\n <!-- Folder Icon -->\n <div><svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M11.6666 11.6667C11.976 11.6667 12.2728 11.5437 12.4916 11.325C12.7104 11.1062 12.8333 10.8094 12.8333 10.5V4.66667C12.8333 4.35725 12.7104 4.0605 12.4916 3.84171C12.2728 3.62292 11.976 3.5 11.6666 3.5H7.05829C6.86318 3.50191 6.67069 3.45486 6.49847 3.36314C6.32624 3.27142 6.17977 3.13797 6.07246 2.975L5.59996 2.275C5.49373 2.11369 5.34911 1.98128 5.17908 1.88965C5.00906 1.79802 4.81894 1.75003 4.62579 1.75H2.33329C2.02387 1.75 1.72713 1.87292 1.50833 2.09171C1.28954 2.3105 1.16663 2.60725 1.16663 2.91667V10.5C1.16663 10.8094 1.28954 11.1062 1.50833 11.325C1.72713 11.5437 2.02387 11.6667 2.33329 11.6667H11.6666Z\" fill=\"#EFF6FF\" stroke=\"#60A5FA\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n\n <!-- Step Number and Title -->\n <div class=\"cqa-font-bold cqa-flex-1 cqa-text-[#334155] cqa-text-[11px] cqa-leading-[13px]\">\n {{ config.stepNumber }}. Step group: {{ config.groupName }}\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-[9px] cqa-leading-[11px] cqa-text-[#9CA3AF]\">\n {{ formatDuration(config.duration) }}\n </span>\n <svg [class.cqa-rotate-180]=\"isExpanded\" class=\"cqa-transition-transform\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3.5 5L7 8.5L10.5 5\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n\n <!-- Expanded Content -->\n <div *ngIf=\"isExpanded\">\n <!-- Nested Steps -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-mt-2 cqa-ml-[18px]\">\n <ng-container *ngFor=\"let step of config.steps\">\n <!-- For nested step groups with hasChild, render directly with onExpand handler -->\n <cqa-step-group \n *ngIf=\"isNestedStepGroupWithChildren(step) && onExpandHandler\"\n [id]=\"step.id\"\n [testStepResultId]=\"step.testStepResultId\"\n [stepNumber]=\"step.stepNumber\"\n [title]=\"step.title\"\n [status]=\"step.status\"\n [duration]=\"step.duration\"\n [expanded]=\"step.expanded\"\n [groupName]=\"getGroupName(step)\"\n [steps]=\"getSteps(step)\"\n [timingBreakdown]=\"step.timingBreakdown\"\n [onExpandHandler]=\"onExpandHandler\"\n (onExpand)=\"onExpandHandler && onExpandHandler(step)\">\n </cqa-step-group>\n <!-- For other step types, use step-renderer -->\n <cqa-step-renderer \n *ngIf=\"!isNestedStepGroupWithChildren(step) || !onExpandHandler\" \n [step]=\"step\">\n </cqa-step-renderer>\n </ng-container>\n </div>\n </div>\n</div>\n", styles: [] }]
225
+ args: [{ selector: 'cqa-step-group', host: { class: 'cqa-ui-root' }, template: "<div style=\"border-bottom: '1px solid #F3F4F6'\">\n <!-- Header -->\n <div\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-p-2 cqa-cursor-pointer\"\n (click)=\"toggle()\">\n \n <!-- Status Icon -->\n <div>\n <!-- Success -->\n <svg *ngIf=\"config.status.toLowerCase() === 'success'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Failed -->\n <svg *ngIf=\"config.status.toLowerCase() === 'failure'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4 4L8 8M8 4L4 8\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Pending -->\n <svg *ngIf=\"config.status.toLowerCase() === 'pending'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Running -->\n <svg *ngIf=\"config.status.toLowerCase() === 'running'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n\n <!-- Folder Icon -->\n <div><svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M11.6666 11.6667C11.976 11.6667 12.2728 11.5437 12.4916 11.325C12.7104 11.1062 12.8333 10.8094 12.8333 10.5V4.66667C12.8333 4.35725 12.7104 4.0605 12.4916 3.84171C12.2728 3.62292 11.976 3.5 11.6666 3.5H7.05829C6.86318 3.50191 6.67069 3.45486 6.49847 3.36314C6.32624 3.27142 6.17977 3.13797 6.07246 2.975L5.59996 2.275C5.49373 2.11369 5.34911 1.98128 5.17908 1.88965C5.00906 1.79802 4.81894 1.75003 4.62579 1.75H2.33329C2.02387 1.75 1.72713 1.87292 1.50833 2.09171C1.28954 2.3105 1.16663 2.60725 1.16663 2.91667V10.5C1.16663 10.8094 1.28954 11.1062 1.50833 11.325C1.72713 11.5437 2.02387 11.6667 2.33329 11.6667H11.6666Z\" fill=\"#EFF6FF\" stroke=\"#60A5FA\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n\n <!-- Step Number and Title -->\n <div class=\"cqa-font-bold cqa-flex-1 cqa-text-[#334155] cqa-text-[11px] cqa-leading-[13px]\">\n {{ config.stepNumber }}. Step group: {{ config.groupName }}\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-[9px] cqa-leading-[11px] cqa-text-[#9CA3AF]\">\n {{ formatDuration(config.duration) }}\n </span>\n <svg [class.cqa-rotate-180]=\"isExpanded\" class=\"cqa-transition-transform\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3.5 5L7 8.5L10.5 5\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n\n <!-- Expanded Content -->\n <div *ngIf=\"isExpanded\">\n <!-- Nested Steps -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-mt-2 cqa-ml-[18px]\">\n <ng-container *ngFor=\"let step of config.steps\">\n <!-- Use step-renderer for all nested steps to avoid circular dependencies -->\n <!-- The step-renderer will dynamically load the appropriate component and pass handlers -->\n <cqa-step-renderer \n [step]=\"step\"\n [onExpandHandler]=\"onExpandHandler\"\n [getConditionBranchesHandler]=\"getConditionBranchesHandler\"\n [isStepLoadingHandler]=\"isStepLoadingHandler\"\n [isStepExpandedHandler]=\"isStepExpandedHandler\"\n [convertMsToSecondsHandler]=\"convertMsToSecondsHandler\"\n [formatFailureDetailsHandler]=\"formatFailureDetailsHandler\"\n [getSelfHealAnalysisHandler]=\"getSelfHealAnalysisHandler\"\n [getLoopIterationsHandler]=\"getLoopIterationsHandler\"\n [onMakeCurrentBaselineHandler]=\"onMakeCurrentBaselineHandler\"\n [onUploadBaselineHandler]=\"onUploadBaselineHandler\"\n [onAnalyzeHandler]=\"onAnalyzeHandler\"\n [onViewFullLogsHandler]=\"onViewFullLogsHandler\"\n [onSelfHealActionHandler]=\"onSelfHealActionHandler\"\n [isUploadingBaseline]=\"isUploadingBaseline\">\n </cqa-step-renderer>\n </ng-container>\n </div>\n </div>\n</div>\n", styles: [] }]
75
226
  }], propDecorators: { id: [{
76
227
  type: Input
77
228
  }], testStepResultId: [{
@@ -94,7 +245,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
94
245
  type: Input
95
246
  }], onExpandHandler: [{
96
247
  type: Input
248
+ }], getConditionBranchesHandler: [{
249
+ type: Input
250
+ }], isStepLoadingHandler: [{
251
+ type: Input
252
+ }], isStepExpandedHandler: [{
253
+ type: Input
254
+ }], convertMsToSecondsHandler: [{
255
+ type: Input
256
+ }], formatFailureDetailsHandler: [{
257
+ type: Input
258
+ }], getSelfHealAnalysisHandler: [{
259
+ type: Input
260
+ }], onMakeCurrentBaselineHandler: [{
261
+ type: Input
262
+ }], onUploadBaselineHandler: [{
263
+ type: Input
264
+ }], onAnalyzeHandler: [{
265
+ type: Input
266
+ }], onViewFullLogsHandler: [{
267
+ type: Input
268
+ }], onSelfHealActionHandler: [{
269
+ type: Input
270
+ }], getLoopIterationsHandler: [{
271
+ type: Input
272
+ }], isUploadingBaseline: [{
273
+ type: Input
97
274
  }], onExpand: [{
98
275
  type: Output
99
276
  }] } });
100
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2V4ZWN1dGlvbi1zY3JlZW4vc3RlcC1ncm91cC9zdGVwLWdyb3VwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9zdGVwLWdyb3VwL3N0ZXAtZ3JvdXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFFekcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7QUFRM0QsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGlCQUFpQjtJQU56RDs7UUFzQkUsK0NBQStDO1FBQ3JDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0tBc0UvQztJQWpFVSxRQUFRO1FBQ2Ysc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakIsNERBQTREO1FBQzVELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyx5Q0FBeUM7UUFDekMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdkYsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO1FBRUQsbUNBQW1DO1FBQ25DLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQ3RELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUNqQztJQUNILENBQUM7SUFFTyxZQUFZO1FBQ2xCLGdEQUFnRDtRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1osRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ1gsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUN2QyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsSUFBSSxFQUFFLFlBQVk7WUFDbEIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDdkIsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ3JDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtTQUNMLENBQUM7SUFDdkIsQ0FBQztJQUVRLE1BQU07UUFDYixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3BDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNmLHVFQUF1RTtRQUN2RSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN0QjtJQUNILENBQUM7SUFFRCxpRUFBaUU7SUFDakUsNkJBQTZCLENBQUMsSUFBeUI7UUFDckQsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUUsSUFBWSxDQUFDLFFBQVEsQ0FBQztJQUNoRSxDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELFlBQVksQ0FBQyxJQUF5QjtRQUNwQyxPQUFRLElBQXdCLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRUQsOENBQThDO0lBQzlDLFFBQVEsQ0FBQyxJQUF5QjtRQUNoQyw2REFBNkQ7UUFDN0QsTUFBTSxTQUFTLEdBQUcsSUFBdUIsQ0FBQztRQUMxQyxPQUFPLFNBQVMsQ0FBQyxLQUFLLElBQUssSUFBWSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7SUFDekQsQ0FBQzs7K0dBdEZVLGtCQUFrQjttR0FBbEIsa0JBQWtCLGtjQ1YvQixvd0tBZ0VBLHVCRHREYSxrQkFBa0I7MkZBQWxCLGtCQUFrQjtrQkFOOUIsU0FBUzsrQkFDRSxnQkFBZ0IsUUFHcEIsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFOzhCQUlyQixFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxlQUFlO3NCQUF2QixLQUFLO2dCQUdJLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0ZXBHcm91cENvbmZpZywgRXhlY3V0aW9uU3RlcENvbmZpZywgU3RlcFN0YXR1cywgVGltaW5nQnJlYWtkb3duIH0gZnJvbSAnLi4vZXhlY3V0aW9uLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IEJhc2VTdGVwQ29tcG9uZW50IH0gZnJvbSAnLi4vYmFzZS1zdGVwLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zdGVwLWdyb3VwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXAtZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH1cbn0pXG5leHBvcnQgY2xhc3MgU3RlcEdyb3VwQ29tcG9uZW50IGV4dGVuZHMgQmFzZVN0ZXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIC8vIEluZGl2aWR1YWwgaW5wdXRzXG4gIEBJbnB1dCgpIGlkITogc3RyaW5nO1xuICBASW5wdXQoKSB0ZXN0U3RlcFJlc3VsdElkITogc3RyaW5nO1xuICBASW5wdXQoKSBzdGVwTnVtYmVyITogc3RyaW5nO1xuICBASW5wdXQoKSB0aXRsZSE6IHN0cmluZztcbiAgQElucHV0KCkgc3RhdHVzITogU3RlcFN0YXR1cztcbiAgQElucHV0KCkgZHVyYXRpb24hOiBudW1iZXI7XG4gIEBJbnB1dCgpIHRpbWluZ0JyZWFrZG93bj86IFRpbWluZ0JyZWFrZG93bjtcbiAgQElucHV0KCkgZXhwYW5kZWQ/OiBib29sZWFuO1xuICBASW5wdXQoKSBncm91cE5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN0ZXBzITogRXhlY3V0aW9uU3RlcENvbmZpZ1tdO1xuICBcbiAgLy8gSGFuZGxlciBmdW5jdGlvbiB0byBwYXNzIGRvd24gdG8gbmVzdGVkIGNoaWxkIHN0ZXAgZ3JvdXBzIGZvciByZWN1cnNpdmUgZXhwYW5zaW9uXG4gIEBJbnB1dCgpIG9uRXhwYW5kSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiB2b2lkO1xuXG4gIC8vIE91dHB1dCBldmVudCBmb3Igd2hlbiB0aGUgc3RlcCBncm91cCBleHBhbmRzXG4gIEBPdXRwdXQoKSBvbkV4cGFuZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvLyBDb25maWcgcHJvcGVydHkgZm9yIGJhc2UgY2xhc3MgLSBidWlsdCBmcm9tIGluZGl2aWR1YWwgaW5wdXRzIGluIG5nT25Jbml0XG4gIG92ZXJyaWRlIGNvbmZpZyE6IFN0ZXBHcm91cENvbmZpZztcblxuICBvdmVycmlkZSBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBCdWlsZCBjb25maWcgZnJvbSBpbmRpdmlkdWFsIGlucHV0c1xuICAgIHRoaXMudXBkYXRlQ29uZmlnKCk7XG5cbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgIC8vIEVuc3VyZSBpc0V4cGFuZGVkIGlzIHNldCBjb3JyZWN0bHkgYWZ0ZXIgc3VwZXIubmdPbkluaXQoKVxuICAgIGlmICh0aGlzLmV4cGFuZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFeHBhbmRlZCA9IHRoaXMuZXhwYW5kZWQ7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSBjb25maWcgd2hlbiBzdGVwcyBpbnB1dCBjaGFuZ2VzXG4gICAgaWYgKGNoYW5nZXNbJ3N0ZXBzJ10gfHwgY2hhbmdlc1snZXhwYW5kZWQnXSB8fCBjaGFuZ2VzWydzdGF0dXMnXSB8fCBjaGFuZ2VzWydkdXJhdGlvbiddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmZpZygpO1xuICAgIH1cbiAgICBcbiAgICAvLyBVcGRhdGUgZXhwYW5kZWQgc3RhdGUgaWYgY2hhbmdlZFxuICAgIGlmIChjaGFuZ2VzWydleHBhbmRlZCddICYmIHRoaXMuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0V4cGFuZGVkID0gdGhpcy5leHBhbmRlZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbmZpZygpOiB2b2lkIHtcbiAgICAvLyBCdWlsZCBvciB1cGRhdGUgY29uZmlnIGZyb20gaW5kaXZpZHVhbCBpbnB1dHNcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdGVzdFN0ZXBSZXN1bHRJZDogdGhpcy50ZXN0U3RlcFJlc3VsdElkLFxuICAgICAgc3RlcE51bWJlcjogdGhpcy5zdGVwTnVtYmVyLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICB0eXBlOiAnc3RlcC1ncm91cCcsXG4gICAgICBncm91cE5hbWU6IHRoaXMuZ3JvdXBOYW1lLFxuICAgICAgc3RlcHM6IHRoaXMuc3RlcHMgfHwgW10sXG4gICAgICB0aW1pbmdCcmVha2Rvd246IHRoaXMudGltaW5nQnJlYWtkb3duLFxuICAgICAgZXhwYW5kZWQ6IHRoaXMuZXhwYW5kZWQsXG4gICAgfSBhcyBTdGVwR3JvdXBDb25maWc7XG4gIH1cblxuICBvdmVycmlkZSB0b2dnbGUoKTogdm9pZCB7XG4gICAgY29uc3Qgd2FzRXhwYW5kZWQgPSB0aGlzLmlzRXhwYW5kZWQ7XG4gICAgc3VwZXIudG9nZ2xlKCk7XG4gICAgLy8gRW1pdCBldmVudCB3aGVuIGV4cGFuZGluZyAodHJhbnNpdGlvbmluZyBmcm9tIGNvbGxhcHNlZCB0byBleHBhbmRlZClcbiAgICBpZiAoIXdhc0V4cGFuZGVkICYmIHRoaXMuaXNFeHBhbmRlZCkge1xuICAgICAgdGhpcy5vbkV4cGFuZC5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBjaGVjayBpZiBhIHN0ZXAgaXMgYSBzdGVwLWdyb3VwIHdpdGggaGFzQ2hpbGRcbiAgaXNOZXN0ZWRTdGVwR3JvdXBXaXRoQ2hpbGRyZW4oc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdGVwLnR5cGUgPT09ICdzdGVwLWdyb3VwJyAmJiAhIShzdGVwIGFzIGFueSkuaGFzQ2hpbGQ7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCBncm91cE5hbWUgZnJvbSBzdGVwIGNvbmZpZ1xuICBnZXRHcm91cE5hbWUoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChzdGVwIGFzIFN0ZXBHcm91cENvbmZpZykuZ3JvdXBOYW1lIHx8ICcnO1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgc3RlcHMgZnJvbSBzdGVwIGNvbmZpZ1xuICBnZXRTdGVwcyhzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogRXhlY3V0aW9uU3RlcENvbmZpZ1tdIHtcbiAgICAvLyBDaGVjayBib3RoIHN0ZXBzIGFuZCBjaGlsZHJlbiBwcm9wZXJ0aWVzIGZvciBjb21wYXRpYmlsaXR5XG4gICAgY29uc3Qgc3RlcEdyb3VwID0gc3RlcCBhcyBTdGVwR3JvdXBDb25maWc7XG4gICAgcmV0dXJuIHN0ZXBHcm91cC5zdGVwcyB8fCAoc3RlcCBhcyBhbnkpLmNoaWxkcmVuIHx8IFtdO1xuICB9XG59XG4iLCI8ZGl2IHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogJzFweCBzb2xpZCAjRjNGNEY2J1wiPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXAtMiBjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgIChjbGljayk9XCJ0b2dnbGUoKVwiPlxuICAgIFxuICAgIDwhLS0gU3RhdHVzIEljb24gLS0+XG4gICAgPGRpdj5cbiAgICAgIDwhLS0gU3VjY2VzcyAtLT5cbiAgICAgIDxzdmcgKm5nSWY9XCJjb25maWcuc3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdzdWNjZXNzJ1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTEwLjkwMDUgNC45OTk5OUMxMS4xMjg5IDYuMTIwNjQgMTAuOTY2MiA3LjI4NTcxIDEwLjQzOTUgOC4zMDA4OUM5LjkxMjc5IDkuMzE2MDggOS4wNTQgMTAuMTIgOC4wMDYzMSAxMC41Nzg3QzYuOTU4NjIgMTEuMDM3MyA1Ljc4NTM2IDExLjEyMjkgNC42ODIyIDEwLjgyMTJDMy41NzkwNCAxMC41MTk1IDIuNjEyNjUgOS44NDg2OSAxLjk0NDE5IDguOTIwNzFDMS4yNzU3MyA3Ljk5MjcyIDAuOTQ1NjExIDYuODYzNjEgMS4wMDg4OCA1LjcyMTY5QzEuMDcyMTUgNC41Nzk3NiAxLjUyNDk5IDMuNDk0MDQgMi4yOTE4OCAyLjY0NTU4QzMuMDU4NzYgMS43OTcxMiA0LjA5MzM0IDEuMjM3MjEgNS4yMjMwOCAxLjA1OTIyQzYuMzUyODIgMC44ODEyMzMgNy41MDk0NCAxLjA5NTkyIDguNTAwMDUgMS42Njc0OVwiIHN0cm9rZT1cIiMyMkM1NUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk00LjUgNS41TDYgN0wxMSAyXCIgc3Ryb2tlPVwiIzIyQzU1RVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgIDwhLS0gRmFpbGVkIC0tPlxuICAgICAgPHN2ZyAqbmdJZj1cImNvbmZpZy5zdGF0dXMudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhaWx1cmUnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNiAxMUM4Ljc2MTQyIDExIDExIDguNzYxNDIgMTEgNkMxMSAzLjIzODU4IDguNzYxNDIgMSA2IDFDMy4yMzg1OCAxIDEgMy4yMzg1OCAxIDZDMSA4Ljc2MTQyIDMuMjM4NTggMTEgNiAxMVpcIiBzdHJva2U9XCIjRUY0NDQ0XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNCA0TDggOE04IDRMNCA4XCIgc3Ryb2tlPVwiI0VGNDQ0NFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgIDwhLS0gUGVuZGluZyAtLT5cbiAgICAgIDxzdmcgKm5nSWY9XCJjb25maWcuc3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdwZW5kaW5nJ1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTYgMTFDOC43NjE0MiAxMSAxMSA4Ljc2MTQyIDExIDZDMTEgMy4yMzg1OCA4Ljc2MTQyIDEgNiAxQzMuMjM4NTggMSAxIDMuMjM4NTggMSA2QzEgOC43NjE0MiAzLjIzODU4IDExIDYgMTFaXCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTYgM1Y2TDggN1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgICA8IS0tIFJ1bm5pbmcgLS0+XG4gICAgICA8c3ZnICpuZ0lmPVwiY29uZmlnLnN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAncnVubmluZydcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk02IDExQzguNzYxNDIgMTEgMTEgOC43NjE0MiAxMSA2QzExIDMuMjM4NTggOC43NjE0MiAxIDYgMUMzLjIzODU4IDEgMSAzLjIzODU4IDEgNkMxIDguNzYxNDIgMy4yMzg1OCAxMSA2IDExWlwiIHN0cm9rZT1cIiMzQjgyRjZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk02IDNWNkw4IDdcIiBzdHJva2U9XCIjM0I4MkY2XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGb2xkZXIgSWNvbiAtLT5cbiAgICA8ZGl2Pjxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMTEuNjY2NiAxMS42NjY3QzExLjk3NiAxMS42NjY3IDEyLjI3MjggMTEuNTQzNyAxMi40OTE2IDExLjMyNUMxMi43MTA0IDExLjEwNjIgMTIuODMzMyAxMC44MDk0IDEyLjgzMzMgMTAuNVY0LjY2NjY3QzEyLjgzMzMgNC4zNTcyNSAxMi43MTA0IDQuMDYwNSAxMi40OTE2IDMuODQxNzFDMTIuMjcyOCAzLjYyMjkyIDExLjk3NiAzLjUgMTEuNjY2NiAzLjVINy4wNTgyOUM2Ljg2MzE4IDMuNTAxOTEgNi42NzA2OSAzLjQ1NDg2IDYuNDk4NDcgMy4zNjMxNEM2LjMyNjI0IDMuMjcxNDIgNi4xNzk3NyAzLjEzNzk3IDYuMDcyNDYgMi45NzVMNS41OTk5NiAyLjI3NUM1LjQ5MzczIDIuMTEzNjkgNS4zNDkxMSAxLjk4MTI4IDUuMTc5MDggMS44ODk2NUM1LjAwOTA2IDEuNzk4MDIgNC44MTg5NCAxLjc1MDAzIDQuNjI1NzkgMS43NUgyLjMzMzI5QzIuMDIzODcgMS43NSAxLjcyNzEzIDEuODcyOTIgMS41MDgzMyAyLjA5MTcxQzEuMjg5NTQgMi4zMTA1IDEuMTY2NjMgMi42MDcyNSAxLjE2NjYzIDIuOTE2NjdWMTAuNUMxLjE2NjYzIDEwLjgwOTQgMS4yODk1NCAxMS4xMDYyIDEuNTA4MzMgMTEuMzI1QzEuNzI3MTMgMTEuNTQzNyAyLjAyMzg3IDExLjY2NjcgMi4zMzMyOSAxMS42NjY3SDExLjY2NjZaXCIgZmlsbD1cIiNFRkY2RkZcIiBzdHJva2U9XCIjNjBBNUZBXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz48L2Rpdj5cblxuICAgIDwhLS0gU3RlcCBOdW1iZXIgYW5kIFRpdGxlIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZm9udC1ib2xkIGNxYS1mbGV4LTEgY3FhLXRleHQtWyMzMzQxNTVdIGNxYS10ZXh0LVsxMXB4XSBjcWEtbGVhZGluZy1bMTNweF1cIj5cbiAgICAgIHt7IGNvbmZpZy5zdGVwTnVtYmVyIH19LiBTdGVwIGdyb3VwOiB7eyBjb25maWcuZ3JvdXBOYW1lIH19XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzlweF0gY3FhLWxlYWRpbmctWzExcHhdIGNxYS10ZXh0LVsjOUNBM0FGXVwiPlxuICAgICAgICB7eyBmb3JtYXREdXJhdGlvbihjb25maWcuZHVyYXRpb24pIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3ZnIFtjbGFzcy5jcWEtcm90YXRlLTE4MF09XCJpc0V4cGFuZGVkXCIgY2xhc3M9XCJjcWEtdHJhbnNpdGlvbi10cmFuc2Zvcm1cIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0zLjUgNUw3IDguNUwxMC41IDVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRXhwYW5kZWQgQ29udGVudCAtLT5cbiAgPGRpdiAqbmdJZj1cImlzRXhwYW5kZWRcIj5cbiAgICA8IS0tIE5lc3RlZCBTdGVwcyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMiBjcWEtbXQtMiBjcWEtbWwtWzE4cHhdXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdGVwIG9mIGNvbmZpZy5zdGVwc1wiPlxuICAgICAgICA8IS0tIEZvciBuZXN0ZWQgc3RlcCBncm91cHMgd2l0aCBoYXNDaGlsZCwgcmVuZGVyIGRpcmVjdGx5IHdpdGggb25FeHBhbmQgaGFuZGxlciAtLT5cbiAgICAgICAgPGNxYS1zdGVwLWdyb3VwIFxuICAgICAgICAgICpuZ0lmPVwiaXNOZXN0ZWRTdGVwR3JvdXBXaXRoQ2hpbGRyZW4oc3RlcCkgJiYgb25FeHBhbmRIYW5kbGVyXCJcbiAgICAgICAgICBbaWRdPVwic3RlcC5pZFwiXG4gICAgICAgICAgW3Rlc3RTdGVwUmVzdWx0SWRdPVwic3RlcC50ZXN0U3RlcFJlc3VsdElkXCJcbiAgICAgICAgICBbc3RlcE51bWJlcl09XCJzdGVwLnN0ZXBOdW1iZXJcIlxuICAgICAgICAgIFt0aXRsZV09XCJzdGVwLnRpdGxlXCJcbiAgICAgICAgICBbc3RhdHVzXT1cInN0ZXAuc3RhdHVzXCJcbiAgICAgICAgICBbZHVyYXRpb25dPVwic3RlcC5kdXJhdGlvblwiXG4gICAgICAgICAgW2V4cGFuZGVkXT1cInN0ZXAuZXhwYW5kZWRcIlxuICAgICAgICAgIFtncm91cE5hbWVdPVwiZ2V0R3JvdXBOYW1lKHN0ZXApXCJcbiAgICAgICAgICBbc3RlcHNdPVwiZ2V0U3RlcHMoc3RlcClcIlxuICAgICAgICAgIFt0aW1pbmdCcmVha2Rvd25dPVwic3RlcC50aW1pbmdCcmVha2Rvd25cIlxuICAgICAgICAgIFtvbkV4cGFuZEhhbmRsZXJdPVwib25FeHBhbmRIYW5kbGVyXCJcbiAgICAgICAgICAob25FeHBhbmQpPVwib25FeHBhbmRIYW5kbGVyICYmIG9uRXhwYW5kSGFuZGxlcihzdGVwKVwiPlxuICAgICAgICA8L2NxYS1zdGVwLWdyb3VwPlxuICAgICAgICA8IS0tIEZvciBvdGhlciBzdGVwIHR5cGVzLCB1c2Ugc3RlcC1yZW5kZXJlciAtLT5cbiAgICAgICAgPGNxYS1zdGVwLXJlbmRlcmVyIFxuICAgICAgICAgICpuZ0lmPVwiIWlzTmVzdGVkU3RlcEdyb3VwV2l0aENoaWxkcmVuKHN0ZXApIHx8ICFvbkV4cGFuZEhhbmRsZXJcIiBcbiAgICAgICAgICBbc3RlcF09XCJzdGVwXCI+XG4gICAgICAgIDwvY3FhLXN0ZXAtcmVuZGVyZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
277
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2V4ZWN1dGlvbi1zY3JlZW4vc3RlcC1ncm91cC9zdGVwLWdyb3VwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9zdGVwLWdyb3VwL3N0ZXAtZ3JvdXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFFekcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7QUFRM0QsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGlCQUFpQjtJQU56RDs7UUFxQ0UsK0NBQStDO1FBQ3JDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0tBK08vQztJQTFPVSxRQUFRO1FBQ2Ysc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakIsNERBQTREO1FBQzVELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyx5Q0FBeUM7UUFDekMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdkYsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO1FBRUQsbUNBQW1DO1FBQ25DLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FB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ZTtzQkFBdkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUdHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBR0csMkJBQTJCO3NCQUFuQyxLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUNHLDJCQUEyQjtzQkFBbkMsS0FBSztnQkFDRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBQ0csNEJBQTRCO3NCQUFwQyxLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUdJLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0ZXBHcm91cENvbmZpZywgTG9vcFN0ZXBDb25maWcsIENvbmRpdGlvbkJyYW5jaCwgRXhlY3V0aW9uU3RlcENvbmZpZywgU3RlcFN0YXR1cywgVGltaW5nQnJlYWtkb3duIH0gZnJvbSAnLi4vZXhlY3V0aW9uLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IEJhc2VTdGVwQ29tcG9uZW50IH0gZnJvbSAnLi4vYmFzZS1zdGVwLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zdGVwLWdyb3VwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXAtZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH1cbn0pXG5leHBvcnQgY2xhc3MgU3RlcEdyb3VwQ29tcG9uZW50IGV4dGVuZHMgQmFzZVN0ZXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIC8vIEluZGl2aWR1YWwgaW5wdXRzXG4gIEBJbnB1dCgpIGlkITogc3RyaW5nO1xuICBASW5wdXQoKSB0ZXN0U3RlcFJlc3VsdElkITogc3RyaW5nO1xuICBASW5wdXQoKSBzdGVwTnVtYmVyITogc3RyaW5nO1xuICBASW5wdXQoKSB0aXRsZSE6IHN0cmluZztcbiAgQElucHV0KCkgc3RhdHVzITogU3RlcFN0YXR1cztcbiAgQElucHV0KCkgZHVyYXRpb24hOiBudW1iZXI7XG4gIEBJbnB1dCgpIHRpbWluZ0JyZWFrZG93bj86IFRpbWluZ0JyZWFrZG93bjtcbiAgQElucHV0KCkgZXhwYW5kZWQ/OiBib29sZWFuO1xuICBASW5wdXQoKSBncm91cE5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN0ZXBzITogRXhlY3V0aW9uU3RlcENvbmZpZ1tdO1xuICBcbiAgLy8gSGFuZGxlciBmdW5jdGlvbiB0byBwYXNzIGRvd24gdG8gbmVzdGVkIGNoaWxkIHN0ZXAgZ3JvdXBzIGZvciByZWN1cnNpdmUgZXhwYW5zaW9uXG4gIEBJbnB1dCgpIG9uRXhwYW5kSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiB2b2lkO1xuICBcbiAgLy8gSGFuZGxlciBmdW5jdGlvbnMgZm9yIG5lc3RlZCBjb21wb25lbnRzIChvcHRpb25hbCwgcGFzc2VkIGZyb20gcGFyZW50KVxuICBASW5wdXQoKSBnZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gQ29uZGl0aW9uQnJhbmNoW107XG4gIEBJbnB1dCgpIGlzU3RlcExvYWRpbmdIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlzU3RlcEV4cGFuZGVkSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBib29sZWFuO1xuICBASW5wdXQoKSBjb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyPzogKGR1cmF0aW9uOiBudW1iZXIpID0+IG51bWJlcjtcbiAgQElucHV0KCkgZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueTtcbiAgQElucHV0KCkgZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55O1xuICBASW5wdXQoKSBvbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uQW5hbHl6ZUhhbmRsZXI/OiAoKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblZpZXdGdWxsTG9nc0hhbmRsZXI/OiAoKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblNlbGZIZWFsQWN0aW9uSGFuZGxlcj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBnZXRMb29wSXRlcmF0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55W107XG4gIEBJbnB1dCgpIGlzVXBsb2FkaW5nQmFzZWxpbmU/OiBhbnk7XG5cbiAgLy8gT3V0cHV0IGV2ZW50IGZvciB3aGVuIHRoZSBzdGVwIGdyb3VwIGV4cGFuZHNcbiAgQE91dHB1dCgpIG9uRXhwYW5kID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8vIENvbmZpZyBwcm9wZXJ0eSBmb3IgYmFzZSBjbGFzcyAtIGJ1aWx0IGZyb20gaW5kaXZpZHVhbCBpbnB1dHMgaW4gbmdPbkluaXRcbiAgb3ZlcnJpZGUgY29uZmlnITogU3RlcEdyb3VwQ29uZmlnO1xuXG4gIG92ZXJyaWRlIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIEJ1aWxkIGNvbmZpZyBmcm9tIGluZGl2aWR1YWwgaW5wdXRzXG4gICAgdGhpcy51cGRhdGVDb25maWcoKTtcblxuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgLy8gRW5zdXJlIGlzRXhwYW5kZWQgaXMgc2V0IGNvcnJlY3RseSBhZnRlciBzdXBlci5uZ09uSW5pdCgpXG4gICAgaWYgKHRoaXMuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0V4cGFuZGVkID0gdGhpcy5leHBhbmRlZDtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIGNvbmZpZyB3aGVuIHN0ZXBzIGlucHV0IGNoYW5nZXNcbiAgICBpZiAoY2hhbmdlc1snc3RlcHMnXSB8fCBjaGFuZ2VzWydleHBhbmRlZCddIHx8IGNoYW5nZXNbJ3N0YXR1cyddIHx8IGNoYW5nZXNbJ2R1cmF0aW9uJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlQ29uZmlnKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFVwZGF0ZSBleHBhbmRlZCBzdGF0ZSBpZiBjaGFuZ2VkXG4gICAgaWYgKGNoYW5nZXNbJ2V4cGFuZGVkJ10gJiYgdGhpcy5leHBhbmRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29uZmlnKCk6IHZvaWQge1xuICAgIC8vIEJ1aWxkIG9yIHVwZGF0ZSBjb25maWcgZnJvbSBpbmRpdmlkdWFsIGlucHV0c1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB0ZXN0U3RlcFJlc3VsdElkOiB0aGlzLnRlc3RTdGVwUmVzdWx0SWQsXG4gICAgICBzdGVwTnVtYmVyOiB0aGlzLnN0ZXBOdW1iZXIsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgIHR5cGU6ICdzdGVwLWdyb3VwJyxcbiAgICAgIGdyb3VwTmFtZTogdGhpcy5ncm91cE5hbWUsXG4gICAgICBzdGVwczogdGhpcy5zdGVwcyB8fCBbXSxcbiAgICAgIHRpbWluZ0JyZWFrZG93bjogdGhpcy50aW1pbmdCcmVha2Rvd24sXG4gICAgICBleHBhbmRlZDogdGhpcy5leHBhbmRlZCxcbiAgICB9IGFzIFN0ZXBHcm91cENvbmZpZztcbiAgfVxuXG4gIG92ZXJyaWRlIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICBjb25zdCB3YXNFeHBhbmRlZCA9IHRoaXMuaXNFeHBhbmRlZDtcbiAgICBzdXBlci50b2dnbGUoKTtcbiAgICAvLyBFbWl0IGV2ZW50IHdoZW4gZXhwYW5kaW5nICh0cmFuc2l0aW9uaW5nIGZyb20gY29sbGFwc2VkIHRvIGV4cGFuZGVkKVxuICAgIGlmICghd2FzRXhwYW5kZWQgJiYgdGhpcy5pc0V4cGFuZGVkKSB7XG4gICAgICB0aGlzLm9uRXhwYW5kLmVtaXQoKTtcbiAgICAgIC8vIElmIHRoaXMgc3RlcCBoYXMgY2hpbGRyZW4gKGhhc0NoaWxkIGlzIHRydWUpIGFuZCBvbkV4cGFuZEhhbmRsZXIgaXMgcHJvdmlkZWQsIGNhbGwgaXQgdG8gZmV0Y2ggY2hpbGRyZW5cbiAgICAgIGlmICh0aGlzLm9uRXhwYW5kSGFuZGxlciAmJiB0aGlzLmNvbmZpZykge1xuICAgICAgICBjb25zdCBoYXNDaGlsZCA9ICh0aGlzLmNvbmZpZyBhcyBhbnkpLmhhc0NoaWxkIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgKCh0aGlzLmNvbmZpZy5zdGVwcz8ubGVuZ3RoID09PSAwIHx8ICF0aGlzLmNvbmZpZy5zdGVwcykgJiYgdGhpcy50ZXN0U3RlcFJlc3VsdElkKTtcbiAgICAgICAgaWYgKGhhc0NoaWxkKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgc3RlcCBjb25maWcgb2JqZWN0IGZvciB0aGUgaGFuZGxlciB3aXRoIGhhc0NoaWxkIHByb3BlcnR5XG4gICAgICAgICAgY29uc3Qgc3RlcENvbmZpZyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgICAgICAgaGFzQ2hpbGQ6IHRydWUsXG4gICAgICAgICAgICBleHBhbmRlZDogdHJ1ZSwgLy8gRW5zdXJlIGV4cGFuZGVkIGlzIHNldFxuICAgICAgICAgICAgdGVzdFN0ZXBUeXBlOiAodGhpcy5jb25maWcgYXMgYW55KS50ZXN0U3RlcFR5cGUgfHwgJ1NURVBfR1JPVVAnLFxuICAgICAgICAgICAgY2hpbGRyZW46IHRoaXMuY29uZmlnLnN0ZXBzIHx8IFtdLFxuICAgICAgICAgICAgdGVzdFN0ZXBSZXN1bHRJZDogdGhpcy50ZXN0U3RlcFJlc3VsdElkLFxuICAgICAgICAgICAgaWQ6IHRoaXMuaWRcbiAgICAgICAgICB9IGFzIEV4ZWN1dGlvblN0ZXBDb25maWcgJiB7IGhhc0NoaWxkOiBib29sZWFuOyB0ZXN0U3RlcFR5cGU/OiBzdHJpbmc7IGNoaWxkcmVuPzogYW55W107IGV4cGFuZGVkPzogYm9vbGVhbiB9O1xuICAgICAgICAgIHRoaXMub25FeHBhbmRIYW5kbGVyKHN0ZXBDb25maWcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEVuc3VyZSBleHBhbmRlZCBzdGF0ZSBpcyBzeW5jZWQgd2l0aCBjb25maWdcbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuY29uZmlnLmV4cGFuZGVkID0gdGhpcy5pc0V4cGFuZGVkO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gY2hlY2sgaWYgYSBzdGVwIGlzIGEgc3RlcC1ncm91cCB3aXRoIGhhc0NoaWxkXG4gIGlzTmVzdGVkU3RlcEdyb3VwV2l0aENoaWxkcmVuKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3RlcC50eXBlID09PSAnc3RlcC1ncm91cCcgJiYgISEoc3RlcCBhcyBhbnkpLmhhc0NoaWxkO1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgZ3JvdXBOYW1lIGZyb20gc3RlcCBjb25maWdcbiAgZ2V0R3JvdXBOYW1lKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoc3RlcCBhcyBTdGVwR3JvdXBDb25maWcpLmdyb3VwTmFtZSB8fCAnJztcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHN0ZXBzIGZyb20gc3RlcCBjb25maWdcbiAgZ2V0U3RlcHMoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IEV4ZWN1dGlvblN0ZXBDb25maWdbXSB7XG4gICAgLy8gQ2hlY2sgYm90aCBzdGVwcyBhbmQgY2hpbGRyZW4gcHJvcGVydGllcyBmb3IgY29tcGF0aWJpbGl0eVxuICAgIGNvbnN0IHN0ZXBHcm91cCA9IHN0ZXAgYXMgU3RlcEdyb3VwQ29uZmlnO1xuICAgIHJldHVybiBzdGVwR3JvdXAuc3RlcHMgfHwgKHN0ZXAgYXMgYW55KS5jaGlsZHJlbiB8fCBbXTtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gY2hlY2sgaWYgYSBzdGVwIGlzIGEgbG9vcCBzdGVwXG4gIGlzTmVzdGVkTG9vcFN0ZXAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0ZXBUeXBlID0gKHN0ZXAgYXMgYW55KS50ZXN0U3RlcFR5cGUgfHwgc3RlcC50eXBlO1xuICAgIHJldHVybiBzdGVwVHlwZSA9PT0gJ0ZPUl9MT09QJyB8fCBzdGVwVHlwZSA9PT0gJ1dISUxFX0xPT1AnIHx8IHN0ZXBUeXBlID09PSAnbG9vcCc7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGNoZWNrIGlmIGEgc3RlcCBpcyBhIGNvbmRpdGlvbiBzdGVwXG4gIGlzTmVzdGVkQ29uZGl0aW9uU3RlcChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RlcFR5cGUgPSAoc3RlcCBhcyBhbnkpLnRlc3RTdGVwVHlwZSB8fCBzdGVwLnR5cGU7XG4gICAgcmV0dXJuIHN0ZXBUeXBlID09PSAnQ09ORElUSU9OX0lGJyB8fCBzdGVwVHlwZSA9PT0gJ0NPTkRJVElPTl9FTFNFJyB8fCBcbiAgICAgICAgICAgc3RlcFR5cGUgPT09ICdDT05ESVRJT05fRUxTRV9JRicgfHwgc3RlcFR5cGUgPT09ICdDT05ESVRJT05fRUxTRUlGJyB8fFxuICAgICAgICAgICBzdGVwVHlwZSA9PT0gJ2NvbmRpdGlvbic7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCBzdGVwIHRpdGxlXG4gIGdldFN0ZXBUaXRsZShzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHN0ZXAgYXMgYW55KS5hY3Rpb24gfHwgc3RlcC50aXRsZSB8fCAnJztcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHN0ZXAgc3RhdHVzXG4gIGdldFN0ZXBTdGF0dXMoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IFN0ZXBTdGF0dXMge1xuICAgIGNvbnN0IHJlc3VsdCA9IChzdGVwIGFzIGFueSkucmVzdWx0O1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdExvd2VyID0gcmVzdWx0LnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAocmVzdWx0TG93ZXIgPT09ICdzdWNjZXNzJyB8fCByZXN1bHRMb3dlciA9PT0gJ3Bhc3NlZCcpIHtcbiAgICAgICAgcmV0dXJuICdzdWNjZXNzJztcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0TG93ZXIgPT09ICdmYWlsdXJlJyB8fCByZXN1bHRMb3dlciA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgcmV0dXJuICdmYWlsZWQnO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHRMb3dlciA9PT0gJ3BlbmRpbmcnIHx8IHJlc3VsdExvd2VyID09PSAnbm90LWV4ZWN1dGVkJykge1xuICAgICAgICByZXR1cm4gJ3BlbmRpbmcnO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHRMb3dlciA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgIHJldHVybiAncnVubmluZyc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGVwLnN0YXR1cyB8fCAncGVuZGluZyc7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCBzdGVwIGR1cmF0aW9uXG4gIGdldFN0ZXBEdXJhdGlvbihzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHN0ZXAgYXMgYW55KS5kdXJhdGlvbiB8fCBzdGVwLmR1cmF0aW9uIHx8IDA7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kcyBmb3IgbG9vcCBzdGVwIHByb3BlcnRpZXNcbiAgZ2V0TG9vcFR5cGUoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6ICdmb3InIHwgJ3doaWxlJyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3RlcFR5cGUgPSAoc3RlcCBhcyBhbnkpLnRlc3RTdGVwVHlwZSB8fCBzdGVwLnR5cGU7XG4gICAgaWYgKHN0ZXBUeXBlID09PSAnRk9SX0xPT1AnIHx8IChzdGVwIGFzIExvb3BTdGVwQ29uZmlnKS5sb29wVHlwZSA9PT0gJ2ZvcicpIHtcbiAgICAgIHJldHVybiAnZm9yJztcbiAgICB9IGVsc2UgaWYgKHN0ZXBUeXBlID09PSAnV0hJTEVfTE9PUCcgfHwgKHN0ZXAgYXMgTG9vcFN0ZXBDb25maWcpLmxvb3BUeXBlID09PSAnd2hpbGUnKSB7XG4gICAgICByZXR1cm4gJ3doaWxlJztcbiAgICB9XG4gICAgcmV0dXJuIChzdGVwIGFzIExvb3BTdGVwQ29uZmlnKS5sb29wVHlwZTtcbiAgfVxuXG4gIGdldExvb3BJdGVyYXRpb25zKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBhbnlbXSB7XG4gICAgY29uc3QgbG9vcFN0ZXAgPSBzdGVwIGFzIExvb3BTdGVwQ29uZmlnO1xuICAgIHJldHVybiBsb29wU3RlcC5pdGVyYXRpb25zIHx8IFtdO1xuICB9XG5cbiAgZ2V0TG9vcE5lc3RlZFN0ZXBzKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBFeGVjdXRpb25TdGVwQ29uZmlnW10ge1xuICAgIGNvbnN0IGxvb3BTdGVwID0gc3RlcCBhcyBMb29wU3RlcENvbmZpZztcbiAgICByZXR1cm4gbG9vcFN0ZXAubmVzdGVkU3RlcHMgfHwgKHN0ZXAgYXMgYW55KS5jaGlsZHJlbiB8fCBbXTtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2RzIGZvciBjb25kaXRpb24gc3RlcCBwcm9wZXJ0aWVzXG4gIGdldENvbmRpdGlvblN0ZXBEdXJhdGlvbihzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogbnVtYmVyIHtcbiAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuZ2V0U3RlcER1cmF0aW9uKHN0ZXApO1xuICAgIGlmICh0aGlzLmNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXIoZHVyYXRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gZHVyYXRpb247XG4gIH1cblxuICBnZXRDb25kaXRpb25TdGVwRXhwYW5kZWQoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKHN0ZXApO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcC5leHBhbmRlZCB8fCBmYWxzZTtcbiAgfVxuXG4gIGdldENvbmRpdGlvblN0ZXBUZXh0KHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoc3RlcCBhcyBhbnkpLmFjdGlvbiB8fCBzdGVwLnRpdGxlIHx8ICcnO1xuICB9XG5cbiAgZ2V0Q29uZGl0aW9uU3RlcEJyYW5jaGVzKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBDb25kaXRpb25CcmFuY2hbXSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXIoc3RlcCk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldENvbmRpdGlvblN0ZXBMb2FkaW5nKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIoc3RlcCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGhhbmRsZUNvbmRpdGlvblN0ZXBFeHBhbmQoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9uRXhwYW5kSGFuZGxlcikge1xuICAgICAgdGhpcy5vbkV4cGFuZEhhbmRsZXIoc3RlcCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTG9vcFN0ZXBFeHBhbmQoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9uRXhwYW5kSGFuZGxlcikge1xuICAgICAgdGhpcy5vbkV4cGFuZEhhbmRsZXIoc3RlcCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTG9vcFN0ZXBJdGVyYXRpb25DaGFuZ2Uoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZywgaXRlcmF0aW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFRoaXMgd291bGQgdHlwaWNhbGx5IGJlIGhhbmRsZWQgYnkgdGhlIHBhcmVudCBjb21wb25lbnRcbiAgICBpZiAodGhpcy5vbkV4cGFuZEhhbmRsZXIpIHtcbiAgICAgIHRoaXMub25FeHBhbmRIYW5kbGVyKHN0ZXApO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbmRpdGlvblN0ZXBGYWlsdXJlRGV0YWlscyhzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogYW55IHtcbiAgICBpZiAodGhpcy5mb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlcihzdGVwKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldENvbmRpdGlvblN0ZXBTZWxmSGVhbEFuYWx5c2lzKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBhbnkge1xuICAgIGlmICh0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcihzdGVwKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2RzIHRvIHNhZmVseSBhY2Nlc3MgTG9vcFN0ZXBDb25maWcgcHJvcGVydGllc1xuICBnZXRMb29wU2VsZWN0ZWRJdGVyYXRpb25JZChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsb29wU3RlcCA9IHN0ZXAgYXMgTG9vcFN0ZXBDb25maWc7XG4gICAgcmV0dXJuIGxvb3BTdGVwLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gIH1cblxuICBnZXRMb29wRGVmYXVsdEl0ZXJhdGlvbihzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogJ2ZpcnN0JyB8ICdsYXN0JyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbG9vcFN0ZXAgPSBzdGVwIGFzIExvb3BTdGVwQ29uZmlnO1xuICAgIHJldHVybiBsb29wU3RlcC5kZWZhdWx0SXRlcmF0aW9uIHx8ICdsYXN0JztcbiAgfVxuXG4gIGdldExvb3BTaG93Vmlld0FsbEl0ZXJhdGlvbnMoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxvb3BTdGVwID0gc3RlcCBhcyBMb29wU3RlcENvbmZpZztcbiAgICByZXR1cm4gbG9vcFN0ZXAuc2hvd1ZpZXdBbGxJdGVyYXRpb25zO1xuICB9XG59XG4iLCI8ZGl2IHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogJzFweCBzb2xpZCAjRjNGNEY2J1wiPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXAtMiBjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgIChjbGljayk9XCJ0b2dnbGUoKVwiPlxuICAgIFxuICAgIDwhLS0gU3RhdHVzIEljb24gLS0+XG4gICAgPGRpdj5cbiAgICAgIDwhLS0gU3VjY2VzcyAtLT5cbiAgICAgIDxzdmcgKm5nSWY9XCJjb25maWcuc3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdzdWNjZXNzJ1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTEwLjkwMDUgNC45OTk5OUMxMS4xMjg5IDYuMTIwNjQgMTAuOTY2MiA3LjI4NTcxIDEwLjQzOTUgOC4zMDA4OUM5LjkxMjc5IDkuMzE2MDggOS4wNTQgMTAuMTIgOC4wMDYzMSAxMC41Nzg3QzYuOTU4NjIgMTEuMDM3MyA1Ljc4NTM2IDExLjEyMjkgNC42ODIyIDEwLjgyMTJDMy41NzkwNCAxMC41MTk1IDIuNjEyNjUgOS44NDg2OSAxLjk0NDE5IDguOTIwNzFDMS4yNzU3MyA3Ljk5MjcyIDAuOTQ1NjExIDYuODYzNjEgMS4wMDg4OCA1LjcyMTY5QzEuMDcyMTUgNC41Nzk3NiAxLjUyNDk5IDMuNDk0MDQgMi4yOTE4OCAyLjY0NTU4QzMuMDU4NzYgMS43OTcxMiA0LjA5MzM0IDEuMjM3MjEgNS4yMjMwOCAxLjA1OTIyQzYuMzUyODIgMC44ODEyMzMgNy41MDk0NCAxLjA5NTkyIDguNTAwMDUgMS42Njc0OVwiIHN0cm9rZT1cIiMyMkM1NUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk00LjUgNS41TDYgN0wxMSAyXCIgc3Ryb2tlPVwiIzIyQzU1RVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgIDwhLS0gRmFpbGVkIC0tPlxuICAgICAgPHN2ZyAqbmdJZj1cImNvbmZpZy5zdGF0dXMudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhaWx1cmUnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNiAxMUM4Ljc2MTQyIDExIDExIDguNzYxNDIgMTEgNkMxMSAzLjIzODU4IDguNzYxNDIgMSA2IDFDMy4yMzg1OCAxIDEgMy4yMzg1OCAxIDZDMSA4Ljc2MTQyIDMuMjM4NTggMTEgNiAxMVpcIiBzdHJva2U9XCIjRUY0NDQ0XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNCA0TDggOE04IDRMNCA4XCIgc3Ryb2tlPVwiI0VGNDQ0NFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgIDwhLS0gUGVuZGluZyAtLT5cbiAgICAgIDxzdmcgKm5nSWY9XCJjb25maWcuc3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdwZW5kaW5nJ1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTYgMTFDOC43NjE0MiAxMSAxMSA4Ljc2MTQyIDExIDZDMTEgMy4yMzg1OCA4Ljc2MTQyIDEgNiAxQzMuMjM4NTggMSAxIDMuMjM4NTggMSA2QzEgOC43NjE0MiAzLjIzODU4IDExIDYgMTFaXCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTYgM1Y2TDggN1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgICA8IS0tIFJ1bm5pbmcgLS0+XG4gICAgICA8c3ZnICpuZ0lmPVwiY29uZmlnLnN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAncnVubmluZydcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk02IDExQzguNzYxNDIgMTEgMTEgOC43NjE0MiAxMSA2QzExIDMuMjM4NTggOC43NjE0MiAxIDYgMUMzLjIzODU4IDEgMSAzLjIzODU4IDEgNkMxIDguNzYxNDIgMy4yMzg1OCAxMSA2IDExWlwiIHN0cm9rZT1cIiMzQjgyRjZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk02IDNWNkw4IDdcIiBzdHJva2U9XCIjM0I4MkY2XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGb2xkZXIgSWNvbiAtLT5cbiAgICA8ZGl2Pjxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMTEuNjY2NiAxMS42NjY3QzExLjk3NiAxMS42NjY3IDEyLjI3MjggMTEuNTQzNyAxMi40OTE2IDExLjMyNUMxMi43MTA0IDExLjEwNjIgMTIuODMzMyAxMC44MDk0IDEyLjgzMzMgMTAuNVY0LjY2NjY3QzEyLjgzMzMgNC4zNTcyNSAxMi43MTA0IDQuMDYwNSAxMi40OTE2IDMuODQxNzFDMTIuMjcyOCAzLjYyMjkyIDExLjk3NiAzLjUgMTEuNjY2NiAzLjVINy4wNTgyOUM2Ljg2MzE4IDMuNTAxOTEgNi42NzA2OSAzLjQ1NDg2IDYuNDk4NDcgMy4zNjMxNEM2LjMyNjI0IDMuMjcxNDIgNi4xNzk3NyAzLjEzNzk3IDYuMDcyNDYgMi45NzVMNS41OTk5NiAyLjI3NUM1LjQ5MzczIDIuMTEzNjkgNS4zNDkxMSAxLjk4MTI4IDUuMTc5MDggMS44ODk2NUM1LjAwOTA2IDEuNzk4MDIgNC44MTg5NCAxLjc1MDAzIDQuNjI1NzkgMS43NUgyLjMzMzI5QzIuMDIzODcgMS43NSAxLjcyNzEzIDEuODcyOTIgMS41MDgzMyAyLjA5MTcxQzEuMjg5NTQgMi4zMTA1IDEuMTY2NjMgMi42MDcyNSAxLjE2NjYzIDIuOTE2NjdWMTAuNUMxLjE2NjYzIDEwLjgwOTQgMS4yODk1NCAxMS4xMDYyIDEuNTA4MzMgMTEuMzI1QzEuNzI3MTMgMTEuNTQzNyAyLjAyMzg3IDExLjY2NjcgMi4zMzMyOSAxMS42NjY3SDExLjY2NjZaXCIgZmlsbD1cIiNFRkY2RkZcIiBzdHJva2U9XCIjNjBBNUZBXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz48L2Rpdj5cblxuICAgIDwhLS0gU3RlcCBOdW1iZXIgYW5kIFRpdGxlIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZm9udC1ib2xkIGNxYS1mbGV4LTEgY3FhLXRleHQtWyMzMzQxNTVdIGNxYS10ZXh0LVsxMXB4XSBjcWEtbGVhZGluZy1bMTNweF1cIj5cbiAgICAgIHt7IGNvbmZpZy5zdGVwTnVtYmVyIH19LiBTdGVwIGdyb3VwOiB7eyBjb25maWcuZ3JvdXBOYW1lIH19XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzlweF0gY3FhLWxlYWRpbmctWzExcHhdIGNxYS10ZXh0LVsjOUNBM0FGXVwiPlxuICAgICAgICB7eyBmb3JtYXREdXJhdGlvbihjb25maWcuZHVyYXRpb24pIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3ZnIFtjbGFzcy5jcWEtcm90YXRlLTE4MF09XCJpc0V4cGFuZGVkXCIgY2xhc3M9XCJjcWEtdHJhbnNpdGlvbi10cmFuc2Zvcm1cIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0zLjUgNUw3IDguNUwxMC41IDVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRXhwYW5kZWQgQ29udGVudCAtLT5cbiAgPGRpdiAqbmdJZj1cImlzRXhwYW5kZWRcIj5cbiAgICA8IS0tIE5lc3RlZCBTdGVwcyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMiBjcWEtbXQtMiBjcWEtbWwtWzE4cHhdXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdGVwIG9mIGNvbmZpZy5zdGVwc1wiPlxuICAgICAgICA8IS0tIFVzZSBzdGVwLXJlbmRlcmVyIGZvciBhbGwgbmVzdGVkIHN0ZXBzIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcyAtLT5cbiAgICAgICAgPCEtLSBUaGUgc3RlcC1yZW5kZXJlciB3aWxsIGR5bmFtaWNhbGx5IGxvYWQgdGhlIGFwcHJvcHJpYXRlIGNvbXBvbmVudCBhbmQgcGFzcyBoYW5kbGVycyAtLT5cbiAgICAgICAgPGNxYS1zdGVwLXJlbmRlcmVyIFxuICAgICAgICAgIFtzdGVwXT1cInN0ZXBcIlxuICAgICAgICAgIFtvbkV4cGFuZEhhbmRsZXJdPVwib25FeHBhbmRIYW5kbGVyXCJcbiAgICAgICAgICBbZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyXT1cImdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlclwiXG4gICAgICAgICAgW2lzU3RlcExvYWRpbmdIYW5kbGVyXT1cImlzU3RlcExvYWRpbmdIYW5kbGVyXCJcbiAgICAgICAgICBbaXNTdGVwRXhwYW5kZWRIYW5kbGVyXT1cImlzU3RlcEV4cGFuZGVkSGFuZGxlclwiXG4gICAgICAgICAgW2NvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXJdPVwiY29udmVydE1zVG9TZWNvbmRzSGFuZGxlclwiXG4gICAgICAgICAgW2Zvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlcl09XCJmb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXJcIlxuICAgICAgICAgIFtnZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcl09XCJnZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlclwiXG4gICAgICAgICAgW2dldExvb3BJdGVyYXRpb25zSGFuZGxlcl09XCJnZXRMb29wSXRlcmF0aW9uc0hhbmRsZXJcIlxuICAgICAgICAgIFtvbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyXT1cIm9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXJcIlxuICAgICAgICAgIFtvblVwbG9hZEJhc2VsaW5lSGFuZGxlcl09XCJvblVwbG9hZEJhc2VsaW5lSGFuZGxlclwiXG4gICAgICAgICAgW29uQW5hbHl6ZUhhbmRsZXJdPVwib25BbmFseXplSGFuZGxlclwiXG4gICAgICAgICAgW29uVmlld0Z1bGxMb2dzSGFuZGxlcl09XCJvblZpZXdGdWxsTG9nc0hhbmRsZXJcIlxuICAgICAgICAgIFtvblNlbGZIZWFsQWN0aW9uSGFuZGxlcl09XCJvblNlbGZIZWFsQWN0aW9uSGFuZGxlclwiXG4gICAgICAgICAgW2lzVXBsb2FkaW5nQmFzZWxpbmVdPVwiaXNVcGxvYWRpbmdCYXNlbGluZVwiPlxuICAgICAgICA8L2NxYS1zdGVwLXJlbmRlcmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -14,6 +14,19 @@ export class StepRendererComponent {
14
14
  if (changes['step'] && this.container) {
15
15
  this.loadComponent();
16
16
  }
17
+ // Also reload if step properties change (like nestedSteps, children, steps)
18
+ if (changes['step'] && changes['step'].currentValue && this.container) {
19
+ const currentStep = changes['step'].currentValue;
20
+ const previousStep = changes['step'].previousValue;
21
+ // Check if nestedSteps, children, steps, or expanded changed for loop/step-group
22
+ if (previousStep && (currentStep.nestedSteps !== previousStep.nestedSteps ||
23
+ currentStep.children !== previousStep.children ||
24
+ currentStep.steps !== previousStep.steps ||
25
+ currentStep.expanded !== previousStep.expanded ||
26
+ (currentStep.config && currentStep.config.expanded !== previousStep.config?.expanded))) {
27
+ this.loadComponent();
28
+ }
29
+ }
17
30
  }
18
31
  ngAfterViewInit() {
19
32
  this.loadComponent();
@@ -33,6 +46,106 @@ export class StepRendererComponent {
33
46
  instance[key] = this.step[key];
34
47
  }
35
48
  });
49
+ // Special handling for loop-step: map children to nestedSteps if nestedSteps is not present
50
+ if (this.step.type === 'loop' && this.step.children && !this.step.nestedSteps) {
51
+ instance.nestedSteps = this.step.children;
52
+ }
53
+ // Special handling for loop-step: initialize iterations if not present
54
+ if (this.step.type === 'loop' && !instance.iterations) {
55
+ // Use handler if available, otherwise try to initialize from step.executedResult.stepResult
56
+ if (this.getLoopIterationsHandler) {
57
+ instance.iterations = this.getLoopIterationsHandler(this.step);
58
+ }
59
+ else if (this.step.executedResult?.stepResult && Array.isArray(this.step.executedResult.stepResult)) {
60
+ // Initialize iterations directly from stepResult
61
+ const iterations = [];
62
+ this.step.executedResult.stepResult.forEach((iteration) => {
63
+ const iterationIndex = iteration.index !== undefined && iteration.index !== null ? iteration.index : iterations.length;
64
+ let status = 'pending';
65
+ if (iteration.status) {
66
+ const statusLower = iteration.status.toLowerCase();
67
+ if (statusLower === 'success' || statusLower === 'passed') {
68
+ status = 'success';
69
+ }
70
+ else if (statusLower === 'failure' || statusLower === 'failed') {
71
+ status = 'failed';
72
+ }
73
+ else if (statusLower === 'running' || statusLower === 'in_progress') {
74
+ status = 'running';
75
+ }
76
+ }
77
+ iterations.push({
78
+ id: `iter-${iterationIndex}`,
79
+ label: `iter ${iterationIndex}`,
80
+ status: status,
81
+ subSteps: [],
82
+ index: iterationIndex
83
+ });
84
+ });
85
+ instance.iterations = iterations;
86
+ }
87
+ }
88
+ // Special handling for loop-step: set defaultIteration and selectedIterationId
89
+ if (this.step.type === 'loop') {
90
+ // Set defaultIteration to 'last' if not already set
91
+ if (!instance.defaultIteration) {
92
+ instance.defaultIteration = 'last';
93
+ }
94
+ // Set selectedIterationId to last iteration if not already set
95
+ const iterations = instance.iterations;
96
+ if (iterations && Array.isArray(iterations) && iterations.length > 0 && !instance.selectedIterationId) {
97
+ const lastIteration = iterations[iterations.length - 1];
98
+ instance.selectedIterationId = lastIteration.id;
99
+ }
100
+ }
101
+ // Special handling for step-group: map children to steps if steps is not present
102
+ if (this.step.type === 'step-group' && this.step.children && !this.step.steps) {
103
+ instance.steps = this.step.children;
104
+ }
105
+ // Ensure expanded property is passed correctly
106
+ // Use isStepExpandedHandler if available, otherwise use step.expanded or step.config.expanded
107
+ if (this.isStepExpandedHandler && this.step) {
108
+ const expandedState = this.isStepExpandedHandler(this.step);
109
+ instance.expanded = expandedState;
110
+ if (instance.config) {
111
+ instance.config.expanded = expandedState;
112
+ }
113
+ }
114
+ else if (this.step.expanded !== undefined) {
115
+ instance.expanded = this.step.expanded;
116
+ if (instance.config) {
117
+ instance.config.expanded = this.step.expanded;
118
+ }
119
+ }
120
+ // Pass handler functions to the component instance
121
+ if (this.onExpandHandler)
122
+ instance.onExpandHandler = this.onExpandHandler;
123
+ if (this.getConditionBranchesHandler)
124
+ instance.getConditionBranchesHandler = this.getConditionBranchesHandler;
125
+ if (this.isStepLoadingHandler)
126
+ instance.isStepLoadingHandler = this.isStepLoadingHandler;
127
+ if (this.isStepExpandedHandler)
128
+ instance.isStepExpandedHandler = this.isStepExpandedHandler;
129
+ if (this.convertMsToSecondsHandler)
130
+ instance.convertMsToSecondsHandler = this.convertMsToSecondsHandler;
131
+ if (this.formatFailureDetailsHandler)
132
+ instance.formatFailureDetailsHandler = this.formatFailureDetailsHandler;
133
+ if (this.getSelfHealAnalysisHandler)
134
+ instance.getSelfHealAnalysisHandler = this.getSelfHealAnalysisHandler;
135
+ if (this.getLoopIterationsHandler)
136
+ instance.getLoopIterationsHandler = this.getLoopIterationsHandler;
137
+ if (this.onMakeCurrentBaselineHandler)
138
+ instance.onMakeCurrentBaselineHandler = this.onMakeCurrentBaselineHandler;
139
+ if (this.onUploadBaselineHandler)
140
+ instance.onUploadBaselineHandler = this.onUploadBaselineHandler;
141
+ if (this.onAnalyzeHandler)
142
+ instance.onAnalyzeHandler = this.onAnalyzeHandler;
143
+ if (this.onViewFullLogsHandler)
144
+ instance.onViewFullLogsHandler = this.onViewFullLogsHandler;
145
+ if (this.onSelfHealActionHandler)
146
+ instance.onSelfHealActionHandler = this.onSelfHealActionHandler;
147
+ if (this.isUploadingBaseline !== undefined)
148
+ instance.isUploadingBaseline = this.isUploadingBaseline;
36
149
  // Also set config for backward compatibility with components that still use config input
37
150
  if ('config' in instance) {
38
151
  instance.config = this.step;
@@ -41,7 +154,7 @@ export class StepRendererComponent {
41
154
  }
42
155
  }
43
156
  StepRendererComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepRendererComponent, deps: [{ token: STEP_COMPONENT_MAP }], target: i0.ɵɵFactoryTarget.Component });
44
- StepRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepRendererComponent, selector: "cqa-step-renderer", inputs: { step: "step" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: '<ng-container #container></ng-container>', isInline: true });
157
+ StepRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepRendererComponent, selector: "cqa-step-renderer", inputs: { step: "step", onExpandHandler: "onExpandHandler", getConditionBranchesHandler: "getConditionBranchesHandler", isStepLoadingHandler: "isStepLoadingHandler", isStepExpandedHandler: "isStepExpandedHandler", convertMsToSecondsHandler: "convertMsToSecondsHandler", formatFailureDetailsHandler: "formatFailureDetailsHandler", getSelfHealAnalysisHandler: "getSelfHealAnalysisHandler", onMakeCurrentBaselineHandler: "onMakeCurrentBaselineHandler", onUploadBaselineHandler: "onUploadBaselineHandler", onAnalyzeHandler: "onAnalyzeHandler", onViewFullLogsHandler: "onViewFullLogsHandler", onSelfHealActionHandler: "onSelfHealActionHandler", isUploadingBaseline: "isUploadingBaseline", getLoopIterationsHandler: "getLoopIterationsHandler" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: '<ng-container #container></ng-container>', isInline: true });
45
158
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepRendererComponent, decorators: [{
46
159
  type: Component,
47
160
  args: [{
@@ -53,8 +166,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
53
166
  args: [STEP_COMPONENT_MAP]
54
167
  }] }]; }, propDecorators: { step: [{
55
168
  type: Input
169
+ }], onExpandHandler: [{
170
+ type: Input
171
+ }], getConditionBranchesHandler: [{
172
+ type: Input
173
+ }], isStepLoadingHandler: [{
174
+ type: Input
175
+ }], isStepExpandedHandler: [{
176
+ type: Input
177
+ }], convertMsToSecondsHandler: [{
178
+ type: Input
179
+ }], formatFailureDetailsHandler: [{
180
+ type: Input
181
+ }], getSelfHealAnalysisHandler: [{
182
+ type: Input
183
+ }], onMakeCurrentBaselineHandler: [{
184
+ type: Input
185
+ }], onUploadBaselineHandler: [{
186
+ type: Input
187
+ }], onAnalyzeHandler: [{
188
+ type: Input
189
+ }], onViewFullLogsHandler: [{
190
+ type: Input
191
+ }], onSelfHealActionHandler: [{
192
+ type: Input
193
+ }], isUploadingBaseline: [{
194
+ type: Input
195
+ }], getLoopIterationsHandler: [{
196
+ type: Input
56
197
  }], container: [{
57
198
  type: ViewChild,
58
199
  args: ['container', { read: ViewContainerRef }]
59
200
  }] } });
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2V4ZWN1dGlvbi1zY3JlZW4vc3RlcC1yZW5kZXJlci9zdGVwLXJlbmRlcmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQWlELE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVySSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFFNUQ7Ozs7R0FJRztBQUtILE1BQU0sT0FBTyxxQkFBcUI7SUFJaEMsWUFDc0MsWUFBb0M7UUFBcEMsaUJBQVksR0FBWixZQUFZLENBQXdCO0lBQ3ZFLENBQUM7SUFFSixXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNyQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDdEI7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUUxQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUQsSUFBSSxhQUFhLEVBQUU7WUFDakIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbkUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQztZQUV2QywwRkFBMEY7WUFDMUYsMkdBQTJHO1lBQzNHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbkMsSUFBSSxHQUFHLEtBQUssTUFBTSxFQUFFO29CQUNqQixRQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFJLElBQUksQ0FBQyxJQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ2xEO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCx5RkFBeUY7WUFDekYsSUFBSSxRQUFRLElBQUksUUFBUSxFQUFFO2dCQUN2QixRQUFnQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ3RDO1NBQ0Y7SUFDSCxDQUFDOztrSEF6Q1UscUJBQXFCLGtCQUt0QixrQkFBa0I7c0dBTGpCLHFCQUFxQixzS0FFQSxnQkFBZ0Isa0RBSnRDLDBDQUEwQzsyRkFFekMscUJBQXFCO2tCQUpqQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLFFBQVEsRUFBRSwwQ0FBMEM7aUJBQ3JEOzBEQU1xRCxHQUFHOzBCQUFwRCxNQUFNOzJCQUFDLGtCQUFrQjs0Q0FKbkIsSUFBSTtzQkFBWixLQUFLO2dCQUM4QyxTQUFTO3NCQUE1RCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBUeXBlLCBBZnRlclZpZXdJbml0LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEV4ZWN1dGlvblN0ZXBDb25maWcgfSBmcm9tICcuLi9leGVjdXRpb24tc3RlcC5tb2RlbHMnO1xuaW1wb3J0IHsgU1RFUF9DT01QT05FTlRfTUFQIH0gZnJvbSAnLi4vc3RlcC1yZWdpc3RyeS50b2tlbic7XG5cbi8qKlxuICogQ29tcG9uZW50IHRoYXQgcmVuZGVycyB0aGUgYXBwcm9wcmlhdGUgc3RlcCBjb21wb25lbnQgYmFzZWQgb24gdGhlIHN0ZXAgdHlwZS5cbiAqIFVzZXMgZHluYW1pYyBjb21wb25lbnQgbG9hZGluZyBhbmQgYW4gaW5qZWN0aW9uIHRva2VuIHRvIGJyZWFrIGNpcmN1bGFyIGRlcGVuZGVuY2llc1xuICogYmV0d2VlbiBzdGVwIGNvbXBvbmVudHMgaW4gQW5ndWxhciBJdnkgcGFydGlhbCBjb21waWxhdGlvbiBtb2RlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc3RlcC1yZW5kZXJlcicsXG4gIHRlbXBsYXRlOiAnPG5nLWNvbnRhaW5lciAjY29udGFpbmVyPjwvbmctY29udGFpbmVyPidcbn0pXG5leHBvcnQgY2xhc3MgU3RlcFJlbmRlcmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KCkgc3RlcCE6IEV4ZWN1dGlvblN0ZXBDb25maWc7XG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSBjb250YWluZXIhOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoU1RFUF9DT01QT05FTlRfTUFQKSBwcml2YXRlIGNvbXBvbmVudE1hcDogTWFwPHN0cmluZywgVHlwZTxhbnk+PlxuICApIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydzdGVwJ10gJiYgdGhpcy5jb250YWluZXIpIHtcbiAgICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRDb21wb25lbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZENvbXBvbmVudCgpIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyIHx8ICF0aGlzLnN0ZXApIHJldHVybjtcbiAgICBcbiAgICB0aGlzLmNvbnRhaW5lci5jbGVhcigpO1xuICAgIGNvbnN0IGNvbXBvbmVudFR5cGUgPSB0aGlzLmNvbXBvbmVudE1hcC5nZXQodGhpcy5zdGVwLnR5cGUpO1xuICAgIFxuICAgIGlmIChjb21wb25lbnRUeXBlKSB7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLmNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50VHlwZSk7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZTtcbiAgICAgIFxuICAgICAgLy8gU3ByZWFkIGNvbmZpZyBwcm9wZXJ0aWVzIGFzIGluZGl2aWR1YWwgaW5wdXRzIGZvciBjb21wb25lbnRzIHRoYXQgdXNlIGluZGl2aWR1YWwgaW5wdXRzXG4gICAgICAvLyBUaGlzIHN1cHBvcnRzIGJvdGggcGF0dGVybnM6IGNvbXBvbmVudHMgdGhhdCBhY2NlcHQgY29uZmlnIGRpcmVjdGx5IGFuZCB0aG9zZSB0aGF0IHVzZSBpbmRpdmlkdWFsIGlucHV0c1xuICAgICAgT2JqZWN0LmtleXModGhpcy5zdGVwKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGlmIChrZXkgIT09ICd0eXBlJykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSAodGhpcy5zdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIEFsc28gc2V0IGNvbmZpZyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGNvbXBvbmVudHMgdGhhdCBzdGlsbCB1c2UgY29uZmlnIGlucHV0XG4gICAgICBpZiAoJ2NvbmZpZycgaW4gaW5zdGFuY2UpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0gdGhpcy5zdGVwO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2V4ZWN1dGlvbi1zY3JlZW4vc3RlcC1yZW5kZXJlci9zdGVwLXJlbmRlcmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQWlELE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVySSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFFNUQ7Ozs7R0FJRztBQUtILE1BQU0sT0FBTyxxQkFBcUI7SUFrQmhDLFlBQ3NDLFlBQW9DO1FBQXBDLGlCQUFZLEdBQVosWUFBWSxDQUF3QjtJQUN2RSxDQUFDO0lBRUosV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDckMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3RCO1FBQ0QsNEVBQTRFO1FBQzVFLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNyRSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDO1lBQ2pELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFFbkQsaUZBQWlGO1lBQ2pGLElBQUksWUFBWSxJQUFJLENBQ2pCLFdBQW1CLENBQUMsV0FBVyxLQUFNLFlBQW9CLENBQUMsV0FBVztnQkFDckUsV0FBbUIsQ0FBQyxRQUFRLEtBQU0sWUFBb0IsQ0FBQyxRQUFRO2dCQUMvRCxXQUFtQixDQUFDLEtBQUssS0FBTSxZQUFvQixDQUFDLEtB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QUFtQixDQUFDO1lBRTdHLHlGQUF5RjtZQUN6RixJQUFJLFFBQVEsSUFBSSxRQUFRLEVBQUU7Z0JBQ3ZCLFFBQWdCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDdEM7U0FDRjtJQUNILENBQUM7O2tIQWhLVSxxQkFBcUIsa0JBbUJ0QixrQkFBa0I7c0dBbkJqQixxQkFBcUIsZzNCQWdCQSxnQkFBZ0Isa0RBbEJ0QywwQ0FBMEM7MkZBRXpDLHFCQUFxQjtrQkFKakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsbUJBQW1CO29CQUM3QixRQUFRLEVBQUUsMENBQTBDO2lCQUNyRDswREFvQnFELEdBQUc7MEJBQXBELE1BQU07MkJBQUMsa0JBQWtCOzRDQWxCbkIsSUFBSTtzQkFBWixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csMkJBQTJCO3NCQUFuQyxLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUNHLDJCQUEyQjtzQkFBbkMsS0FBSztnQkFDRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBQ0csNEJBQTRCO3NCQUFwQyxLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUM4QyxTQUFTO3NCQUE1RCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBUeXBlLCBBZnRlclZpZXdJbml0LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEV4ZWN1dGlvblN0ZXBDb25maWcgfSBmcm9tICcuLi9leGVjdXRpb24tc3RlcC5tb2RlbHMnO1xuaW1wb3J0IHsgU1RFUF9DT01QT05FTlRfTUFQIH0gZnJvbSAnLi4vc3RlcC1yZWdpc3RyeS50b2tlbic7XG5cbi8qKlxuICogQ29tcG9uZW50IHRoYXQgcmVuZGVycyB0aGUgYXBwcm9wcmlhdGUgc3RlcCBjb21wb25lbnQgYmFzZWQgb24gdGhlIHN0ZXAgdHlwZS5cbiAqIFVzZXMgZHluYW1pYyBjb21wb25lbnQgbG9hZGluZyBhbmQgYW4gaW5qZWN0aW9uIHRva2VuIHRvIGJyZWFrIGNpcmN1bGFyIGRlcGVuZGVuY2llc1xuICogYmV0d2VlbiBzdGVwIGNvbXBvbmVudHMgaW4gQW5ndWxhciBJdnkgcGFydGlhbCBjb21waWxhdGlvbiBtb2RlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc3RlcC1yZW5kZXJlcicsXG4gIHRlbXBsYXRlOiAnPG5nLWNvbnRhaW5lciAjY29udGFpbmVyPjwvbmctY29udGFpbmVyPidcbn0pXG5leHBvcnQgY2xhc3MgU3RlcFJlbmRlcmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KCkgc3RlcCE6IEV4ZWN1dGlvblN0ZXBDb25maWc7XG4gIEBJbnB1dCgpIG9uRXhwYW5kSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiB2b2lkO1xuICBASW5wdXQoKSBnZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55O1xuICBASW5wdXQoKSBpc1N0ZXBMb2FkaW5nSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBib29sZWFuO1xuICBASW5wdXQoKSBpc1N0ZXBFeHBhbmRlZEhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgY29udmVydE1zVG9TZWNvbmRzSGFuZGxlcj86IChkdXJhdGlvbjogbnVtYmVyKSA9PiBudW1iZXI7XG4gIEBJbnB1dCgpIGZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnk7XG4gIEBJbnB1dCgpIGdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueTtcbiAgQElucHV0KCkgb25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblVwbG9hZEJhc2VsaW5lSGFuZGxlcj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvbkFuYWx5emVIYW5kbGVyPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25WaWV3RnVsbExvZ3NIYW5kbGVyPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25TZWxmSGVhbEFjdGlvbkhhbmRsZXI/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgaXNVcGxvYWRpbmdCYXNlbGluZT86IGFueTtcbiAgQElucHV0KCkgZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueVtdO1xuICBAVmlld0NoaWxkKCdjb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgY29udGFpbmVyITogVmlld0NvbnRhaW5lclJlZjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFNURVBfQ09NUE9ORU5UX01BUCkgcHJpdmF0ZSBjb21wb25lbnRNYXA6IE1hcDxzdHJpbmcsIFR5cGU8YW55Pj5cbiAgKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snc3RlcCddICYmIHRoaXMuY29udGFpbmVyKSB7XG4gICAgICB0aGlzLmxvYWRDb21wb25lbnQoKTtcbiAgICB9XG4gICAgLy8gQWxzbyByZWxvYWQgaWYgc3RlcCBwcm9wZXJ0aWVzIGNoYW5nZSAobGlrZSBuZXN0ZWRTdGVwcywgY2hpbGRyZW4sIHN0ZXBzKVxuICAgIGlmIChjaGFuZ2VzWydzdGVwJ10gJiYgY2hhbmdlc1snc3RlcCddLmN1cnJlbnRWYWx1ZSAmJiB0aGlzLmNvbnRhaW5lcikge1xuICAgICAgY29uc3QgY3VycmVudFN0ZXAgPSBjaGFuZ2VzWydzdGVwJ10uY3VycmVudFZhbHVlO1xuICAgICAgY29uc3QgcHJldmlvdXNTdGVwID0gY2hhbmdlc1snc3RlcCddLnByZXZpb3VzVmFsdWU7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIG5lc3RlZFN0ZXBzLCBjaGlsZHJlbiwgc3RlcHMsIG9yIGV4cGFuZGVkIGNoYW5nZWQgZm9yIGxvb3Avc3RlcC1ncm91cFxuICAgICAgaWYgKHByZXZpb3VzU3RlcCAmJiAoXG4gICAgICAgIChjdXJyZW50U3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzICE9PSAocHJldmlvdXNTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMgfHxcbiAgICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4gIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5jaGlsZHJlbiB8fFxuICAgICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5zdGVwcyAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLnN0ZXBzIHx8XG4gICAgICAgIChjdXJyZW50U3RlcCBhcyBhbnkpLmV4cGFuZGVkICE9PSAocHJldmlvdXNTdGVwIGFzIGFueSkuZXhwYW5kZWQgfHxcbiAgICAgICAgKChjdXJyZW50U3RlcCBhcyBhbnkpLmNvbmZpZyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5jb25maWcuZXhwYW5kZWQgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5jb25maWc/LmV4cGFuZGVkKVxuICAgICAgKSkge1xuICAgICAgICB0aGlzLmxvYWRDb21wb25lbnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkQ29tcG9uZW50KCk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRDb21wb25lbnQoKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lciB8fCAhdGhpcy5zdGVwKSByZXR1cm47XG4gICAgXG4gICAgdGhpcy5jb250YWluZXIuY2xlYXIoKTtcbiAgICBjb25zdCBjb21wb25lbnRUeXBlID0gdGhpcy5jb21wb25lbnRNYXAuZ2V0KHRoaXMuc3RlcC50eXBlKTtcbiAgICBcbiAgICBpZiAoY29tcG9uZW50VHlwZSkge1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5jb250YWluZXIuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudFR5cGUpO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2U7XG4gICAgICBcbiAgICAgIC8vIFNwcmVhZCBjb25maWcgcHJvcGVydGllcyBhcyBpbmRpdmlkdWFsIGlucHV0cyBmb3IgY29tcG9uZW50cyB0aGF0IHVzZSBpbmRpdmlkdWFsIGlucHV0c1xuICAgICAgLy8gVGhpcyBzdXBwb3J0cyBib3RoIHBhdHRlcm5zOiBjb21wb25lbnRzIHRoYXQgYWNjZXB0IGNvbmZpZyBkaXJlY3RseSBhbmQgdGhvc2UgdGhhdCB1c2UgaW5kaXZpZHVhbCBpbnB1dHNcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3RlcCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoa2V5ICE9PSAndHlwZScpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gKHRoaXMuc3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IG1hcCBjaGlsZHJlbiB0byBuZXN0ZWRTdGVwcyBpZiBuZXN0ZWRTdGVwcyBpcyBub3QgcHJlc2VudFxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnbG9vcCcgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmNoaWxkcmVuICYmICEodGhpcy5zdGVwIGFzIGFueSkubmVzdGVkU3RlcHMpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMgPSAodGhpcy5zdGVwIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogaW5pdGlhbGl6ZSBpdGVyYXRpb25zIGlmIG5vdCBwcmVzZW50XG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdsb29wJyAmJiAhKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucykge1xuICAgICAgICAvLyBVc2UgaGFuZGxlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB0cnkgdG8gaW5pdGlhbGl6ZSBmcm9tIHN0ZXAuZXhlY3V0ZWRSZXN1bHQuc3RlcFJlc3VsdFxuICAgICAgICBpZiAodGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zID0gdGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgICAgfSBlbHNlIGlmICgodGhpcy5zdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQ/LnN0ZXBSZXN1bHQgJiYgQXJyYXkuaXNBcnJheSgodGhpcy5zdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQuc3RlcFJlc3VsdCkpIHtcbiAgICAgICAgICAvLyBJbml0aWFsaXplIGl0ZXJhdGlvbnMgZGlyZWN0bHkgZnJvbSBzdGVwUmVzdWx0XG4gICAgICAgICAgY29uc3QgaXRlcmF0aW9uczogYW55W10gPSBbXTtcbiAgICAgICAgICAodGhpcy5zdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQuc3RlcFJlc3VsdC5mb3JFYWNoKChpdGVyYXRpb246IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlcmF0aW9uSW5kZXggPSBpdGVyYXRpb24uaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpdGVyYXRpb24uaW5kZXggIT09IG51bGwgPyBpdGVyYXRpb24uaW5kZXggOiBpdGVyYXRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBzdGF0dXM6ICdzdWNjZXNzJyB8ICdmYWlsZWQnIHwgJ3BlbmRpbmcnIHwgJ3J1bm5pbmcnID0gJ3BlbmRpbmcnO1xuICAgICAgICAgICAgaWYgKGl0ZXJhdGlvbi5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzTG93ZXIgPSBpdGVyYXRpb24uc3RhdHVzLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgIGlmIChzdGF0dXNMb3dlciA9PT0gJ3N1Y2Nlc3MnIHx8IHN0YXR1c0xvd2VyID09PSAncGFzc2VkJykge1xuICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdzdWNjZXNzJztcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXNMb3dlciA9PT0gJ2ZhaWx1cmUnIHx8IHN0YXR1c0xvd2VyID09PSAnZmFpbGVkJykge1xuICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdmYWlsZWQnO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1c0xvd2VyID09PSAncnVubmluZycgfHwgc3RhdHVzTG93ZXIgPT09ICdpbl9wcm9ncmVzcycpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSAncnVubmluZyc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgIGlkOiBgaXRlci0ke2l0ZXJhdGlvbkluZGV4fWAsXG4gICAgICAgICAgICAgIGxhYmVsOiBgaXRlciAke2l0ZXJhdGlvbkluZGV4fWAsXG4gICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgICAgICAgICBzdWJTdGVwczogW10sXG4gICAgICAgICAgICAgIGluZGV4OiBpdGVyYXRpb25JbmRleFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucyA9IGl0ZXJhdGlvbnM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBzZXQgZGVmYXVsdEl0ZXJhdGlvbiBhbmQgc2VsZWN0ZWRJdGVyYXRpb25JZFxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnbG9vcCcpIHtcbiAgICAgICAgLy8gU2V0IGRlZmF1bHRJdGVyYXRpb24gdG8gJ2xhc3QnIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLmRlZmF1bHRJdGVyYXRpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kZWZhdWx0SXRlcmF0aW9uID0gJ2xhc3QnO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBTZXQgc2VsZWN0ZWRJdGVyYXRpb25JZCB0byBsYXN0IGl0ZXJhdGlvbiBpZiBub3QgYWxyZWFkeSBzZXRcbiAgICAgICAgY29uc3QgaXRlcmF0aW9ucyA9IChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnM7XG4gICAgICAgIGlmIChpdGVyYXRpb25zICYmIEFycmF5LmlzQXJyYXkoaXRlcmF0aW9ucykgJiYgaXRlcmF0aW9ucy5sZW5ndGggPiAwICYmICEoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgICAgY29uc3QgbGFzdEl0ZXJhdGlvbiA9IGl0ZXJhdGlvbnNbaXRlcmF0aW9ucy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gbGFzdEl0ZXJhdGlvbi5pZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBzdGVwLWdyb3VwOiBtYXAgY2hpbGRyZW4gdG8gc3RlcHMgaWYgc3RlcHMgaXMgbm90IHByZXNlbnRcbiAgICAgIGlmICh0aGlzLnN0ZXAudHlwZSA9PT0gJ3N0ZXAtZ3JvdXAnICYmICh0aGlzLnN0ZXAgYXMgYW55KS5jaGlsZHJlbiAmJiAhKHRoaXMuc3RlcCBhcyBhbnkpLnN0ZXBzKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBzID0gKHRoaXMuc3RlcCBhcyBhbnkpLmNoaWxkcmVuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbnN1cmUgZXhwYW5kZWQgcHJvcGVydHkgaXMgcGFzc2VkIGNvcnJlY3RseVxuICAgICAgLy8gVXNlIGlzU3RlcEV4cGFuZGVkSGFuZGxlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2Ugc3RlcC5leHBhbmRlZCBvciBzdGVwLmNvbmZpZy5leHBhbmRlZFxuICAgICAgaWYgKHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyICYmIHRoaXMuc3RlcCkge1xuICAgICAgICBjb25zdCBleHBhbmRlZFN0YXRlID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQgPSBleHBhbmRlZFN0YXRlO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmV4cGFuZGVkID0gZXhwYW5kZWRTdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgodGhpcy5zdGVwIGFzIGFueSkuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBQYXNzIGhhbmRsZXIgZnVuY3Rpb25zIHRvIHRoZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICAgIGlmICh0aGlzLm9uRXhwYW5kSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25FeHBhbmRIYW5kbGVyID0gdGhpcy5vbkV4cGFuZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlciA9IHRoaXMuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmlzU3RlcExvYWRpbmdIYW5kbGVyID0gdGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuaXNTdGVwRXhwYW5kZWRIYW5kbGVyID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyID0gdGhpcy5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5mb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXIgPSB0aGlzLmZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlciA9IHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldExvb3BJdGVyYXRpb25zSGFuZGxlciA9IHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlciA9IHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblVwbG9hZEJhc2VsaW5lSGFuZGxlciA9IHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbkFuYWx5emVIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkFuYWx5emVIYW5kbGVyID0gdGhpcy5vbkFuYWx5emVIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblZpZXdGdWxsTG9nc0hhbmRsZXIgPSB0aGlzLm9uVmlld0Z1bGxMb2dzSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblNlbGZIZWFsQWN0aW9uSGFuZGxlciA9IHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5pc1VwbG9hZGluZ0Jhc2VsaW5lICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmlzVXBsb2FkaW5nQmFzZWxpbmUgPSB0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmU7XG4gICAgICBcbiAgICAgIC8vIEFsc28gc2V0IGNvbmZpZyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGNvbXBvbmVudHMgdGhhdCBzdGlsbCB1c2UgY29uZmlnIGlucHV0XG4gICAgICBpZiAoJ2NvbmZpZycgaW4gaW5zdGFuY2UpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0gdGhpcy5zdGVwO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19