@o3r/rules-engine 10.0.11 → 10.0.14

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.
@@ -8,7 +8,7 @@ import * as i6 from "../shared/fallback-to.pipe";
8
8
  import * as i7 from "@angular/common";
9
9
  export declare class RulesetHistoryPresModule {
10
10
  static ɵfac: i0.ɵɵFactoryDeclaration<RulesetHistoryPresModule, never>;
11
- static ɵmod: i0.ɵɵNgModuleDeclaration<RulesetHistoryPresModule, [typeof i1.RulesetHistoryPresComponent, typeof i2.RuleConditionPresComponent, typeof i3.RuleTreePresComponent, typeof i4.RuleActionsPresComponent, typeof i5.RuleKeyValuePresComponent], [typeof i6.O3rFallbackToPipe, typeof i7.CommonModule, typeof i7.CommonModule, typeof i7.CommonModule], [typeof i1.RulesetHistoryPresComponent]>;
11
+ static ɵmod: i0.ɵɵNgModuleDeclaration<RulesetHistoryPresModule, [typeof i1.RulesetHistoryPresComponent, typeof i2.RuleConditionPresComponent, typeof i3.RuleTreePresComponent, typeof i4.RuleActionsPresComponent, typeof i5.RuleKeyValuePresComponent], [typeof i6.O3rFallbackToPipe, typeof i7.CommonModule, typeof i7.CommonModule, typeof i7.CommonModule, typeof i7.JsonPipe], [typeof i1.RulesetHistoryPresComponent]>;
12
12
  static ɵinj: i0.ɵɵInjectorDeclaration<RulesetHistoryPresModule>;
13
13
  }
14
14
  //# sourceMappingURL=ruleset-history-pres.module.d.ts.map
@@ -36,14 +36,14 @@ export class RulesetHistoryPresComponent {
36
36
  this.cd.detectChanges();
37
37
  }
38
38
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: RulesetHistoryPresComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
39
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.1", type: RulesetHistoryPresComponent, selector: "o3r-ruleset-history-pres", inputs: { rulesetExecutions: "rulesetExecutions", executionDurationFormat: "executionDurationFormat" }, ngImport: i0, template: "<section>\n <h4 class=\"mb-4\">Ruleset Execution History</h4>\n <ng-template #noRulesEngine>\n <div class=\"alert alert-danger m-2\" role=\"alert\">\n The Rules Engine is not configured on this page.\n </div>\n </ng-template>\n <ul *ngIf=\"rulesetExecutions; else noRulesEngine\" class=\"rulesets\">\n <li *ngFor=\"let execution of rulesetExecutions\" class=\"ruleset\">\n <div class=\"ruleset-panel-title ruleset-expansion-action\"\n [class.error]=\"execution.type === 'RulesetExecutionError'\"\n (click)=\"toggleExpansion(execution.executionId, 'ruleset')\">\n <div><span [title]=\"'This ruleset has been evaluated ' + execution.executionCounter + ' time(s)'\">{{execution.executionCounter}}</span> - {{execution.rulesetName | titlecase }}\n <div class=\"ruleset-panel-subtitle\" *ngIf=\"execution.rulesetInformation?.linkedComponent as linkedComponent\">\n {{linkedComponent.name}} {{linkedComponent.library}}\n </div>\n <div class=\"ruleset-panel-subtitle\" *ngIf=\"execution.rulesetInformation?.validityRange as validityRange\">\n Date range: {{validityRange.from}} - {{validityRange.to}}\n </div>\n </div>\n <div class=\"ruleset-panel-title-aside\">\n <span class=\"error capsule\" *ngIf=\"execution.status === 'Error'\">Error</span>\n <span class=\"success capsule\" *ngIf=\"execution.status === 'Active'\">Applied</span>\n <span class=\"inactive capsule\" *ngIf=\"execution.status === 'Deactivated'\">Deactivated</span>\n <span class=\"warn capsule\" *ngIf=\"execution.status === 'NoEffect'\">No effect</span>\n <span class=\"time capsule\">\n <span>{{execution.timestamp | date: 'HH:mm:ss SSS'}}</span>\n <span>({{execution.duration | number: executionDurationFormat}}ms)</span>\n </span>\n <button\n class=\"icon\"\n [class.icon-caret-down]=\"!expansionStatus[execution.executionId]?.ruleset\"\n [class.icon-caret-up]=\"expansionStatus[execution.executionId]?.ruleset\">\n </button>\n </div>\n </div>\n <div class=\"ruleset-panel-description\" *ngIf=\"expansionStatus[execution.executionId]?.ruleset\">\n <ng-container [ngTemplateOutlet]=\"rules\"\n [ngTemplateOutletContext]=\"{\n rules: execution.rulesetInformation.rules,\n expansionID: execution.executionId\n }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"inputs\"\n [ngTemplateOutletContext]=\"{\n inputs: execution.inputFacts\n }\"></ng-container>\n <ng-container *ngIf=\"execution.type === 'RulesetExecutionError'; else success\">\n <div class=\"ruleset-panel-category-title\">Rules:</div>\n <ul class=\"ruleset-panel-category-body rule-description\">\n <li *ngFor=\"let ruleEvaluation of execution.rulesEvaluations; let index=index;\">\n <ng-container>\n <div class=\"ruleset-panel-title\" [class.error]=\"ruleEvaluation.error\">\n <span>{{ruleEvaluation.rule.name | titlecase}} </span>\n <span class=\"capsule error\" *ngIf=\"ruleEvaluation.error\">Error</span>\n </div>\n <div>\n <ng-container *ngIf=\"ruleEvaluation.error\">\n <span class=\"ruleset-panel-category-title\">Error:</span>\n <span class=\"ruleset-panel-category-body error\">{{ruleEvaluation.error.message}}</span>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"inputs\"\n [ngTemplateOutletContext]=\"{\n inputs: execution.inputFacts,\n runtimeInputs: execution.rulesetInformation?.rules[index]?.inputRuntimeFacts\n }\"></ng-container>\n <o3r-rule-actions-pres *ngIf=\"!ruleEvaluation.error\"\n [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n [runtimeOutputs]=\"execution.rulesetInformation?.rules[index]?.outputRuntimeFacts\"\n ></o3r-rule-actions-pres>\n </div>\n </ng-container>\n </li>\n </ul>\n </ng-container>\n <ng-template #success>\n <o3r-rule-actions-pres [actions]=\"execution.outputActions\"></o3r-rule-actions-pres>\n <div class=\"ruleset-panel-category-title\">Executed Rules</div>\n <ul class=\"rule-description ruleset-panel-category-body\">\n <li *ngFor=\"let ruleEvaluation of execution.rulesEvaluations; let index=index;\">\n <div class=\"ruleset-panel-title\">\n <span>{{ruleEvaluation.rule.name | titlecase}}</span>\n <span class=\"capsule inactive\" *ngIf=\"ruleEvaluation.cached\">Cached</span>\n <span class=\"capsule\">({{ruleEvaluation.duration | number: executionDurationFormat}}ms)</span>\n </div>\n <div>\n <ng-container [ngTemplateOutlet]=\"triggers\"\n [ngTemplateOutletContext]=\"{triggers: (ruleEvaluation.triggers[ruleEvaluation.rule.id])}\"></ng-container>\n <o3r-rule-actions-pres\n [actions]=\"ruleEvaluation.outputActions\"\n [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n [runtimeOutputs]=\"execution.rulesetInformation?.rules[index]?.outputRuntimeFacts\">\n </o3r-rule-actions-pres>\n </div>\n </li>\n </ul>\n </ng-template>\n </div>\n </li>\n </ul>\n</section>\n\n<ng-template let-triggers=\"triggers\" #triggers>\n <div class=\"ruleset-panel-category-title\">Basefacts Triggers</div>\n <ul class=\"ruleset-panel-category-body triggers\">\n <ng-container *ngFor=\"let trigger of (triggers | keyvalue)\">\n <li *ngIf=\"trigger.value?.factName\">\n <o3r-rule-key-value-pres\n [key]=\"trigger.value.factName\"\n [oldValue]=\"trigger.value.oldValue | o3rFallbackTo\"\n [value]=\"trigger.value.newValue | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </li>\n </ng-container>\n </ul>\n</ng-template>\n\n<ng-template let-rules=\"rules\" let-expansionID=\"expansionID\" #rules>\n <div class=\"ruleset-panel-category-title ruleset-expansion-action\"\n (click)=\"toggleExpansion(expansionID, 'rulesOverview')\">\n <span>Rules Overview</span>\n <button class=\"icon\"\n [class.icon-caret-down]=\"!expansionStatus[expansionID]?.rulesOverview\"\n [class.icon-caret-up]=\"expansionStatus[expansionID]?.rulesOverview\">\n </button>\n </div>\n <ng-container *ngIf=\"expansionStatus[expansionID]?.rulesOverview\">\n <div *ngIf=\"rules?.length === 0\" class=\"ruleset-panel-category-body empty\">No rule</div>\n <ul class=\"ruleset-panel-category-body\" *ngIf=\"rules?.length > 0\">\n <li *ngFor=\"let rule of rules\">\n <o3r-rule-tree-pres [name]=\"rule.name\"\n [condition]=\"rule?.rootElement?.condition\"\n [blockType]=\"rule?.rootElement?.blockType\"\n [successElements]=\"rule?.rootElement?.successElements\"\n [failureElements]=\"rule?.rootElement?.failureElements\">\n </o3r-rule-tree-pres>\n </li>\n </ul>\n </ng-container>\n</ng-template>\n\n<ng-template let-inputs=\"inputs\" let-runtimeInputs=\"runtimeInputs\" #inputs>\n <div class=\"ruleset-panel-category-title\">Inputs snapshot</div>\n <div *ngIf=\"inputs?.length === 0\" class=\"ruleset-panel-category-body empty\">No inputs</div>\n <ul class=\"ruleset-panel-category-body\" *ngIf=\"inputs?.length > 0\">\n <li *ngFor=\"let input of inputs\">\n <o3r-rule-key-value-pres\n [key]=\"input.factName\"\n [value]=\"input.value | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </li>\n <li *ngFor=\"let input of runtimeInputs\">{{input}} (scope limited to ruleset)</li>\n </ul>\n</ng-template>\n", styles: ["o3r-ruleset-history-pres .ruleset-panel-title,o3r-ruleset-history-pres .ruleset-panel-category-title{display:flex;justify-content:space-between;align-items:center}o3r-ruleset-history-pres .ruleset-panel-title{font-size:1rem;padding:.5rem 0 .1rem}o3r-ruleset-history-pres .ruleset-expansion-action,o3r-ruleset-history-pres .icon-caret-down,o3r-ruleset-history-pres .icon-caret-up{cursor:pointer}o3r-ruleset-history-pres .ruleset-panel-subtitle{font-size:.75rem}o3r-ruleset-history-pres .ruleset-panel-title-aside{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;min-width:fit-content}o3r-ruleset-history-pres .ruleset-panel-category-title{font-size:.95rem;background:#eee;padding:.5rem;margin-bottom:.5rem;margin-top:1rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-title{font-size:.893rem;cursor:default}o3r-ruleset-history-pres .rule-description .ruleset-panel-title{font-size:.94rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-body{padding-bottom:.5rem;padding-left:1.5rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-body:empty{margin:0;padding:0 0 0 1.5rem}o3r-ruleset-history-pres .rulesets{margin:0;padding:0;list-style:none}o3r-ruleset-history-pres .rulesets ul{margin:0;padding-left:2rem}o3r-ruleset-history-pres .rulesets li.ruleset:nth-child(odd){background:#fbfbfb}o3r-ruleset-history-pres .ruleset-panel-category-body li{list-style:disc}o3r-ruleset-history-pres li:empty{display:none}o3r-ruleset-history-pres .ruleset{border-bottom:1px solid #dddddd}o3r-ruleset-history-pres .ruleset .ruleset-panel-description{padding:0 1rem 0 2rem;margin-bottom:2em}o3r-ruleset-history-pres .ruleset:first-child{border-top:1px solid #dddddd}o3r-ruleset-history-pres .ruleset-panel-title.ruleset-expansion-action{padding:.5rem 1rem}o3r-ruleset-history-pres .empty{font-style:italic;padding-left:1.5rem}o3r-ruleset-history-pres .ruleset-panel-category-body:empty.triggers:after{content:\"No trigger for this rule\";display:block;font-style:italic;padding-bottom:.5rem}o3r-ruleset-history-pres .ruleset-panel-title-aside{padding-left:1rem}o3r-ruleset-history-pres .rule-description .capsule{font-size:.8em;padding:.1rem .5rem;margin:0 .5rem}o3r-ruleset-history-pres .icon{background:none;border:none;font-size:1em}o3r-ruleset-history-pres .capsule{padding:.3rem;margin:.5rem;font-size:.875em;min-width:6rem;text-align:center}o3r-ruleset-history-pres .capsule.time{display:flex;flex-direction:column}o3r-ruleset-history-pres .success{background-color:#16aa32;color:#fff}o3r-ruleset-history-pres .inactive{background-color:#aaa;color:#fff}o3r-ruleset-history-pres .error{color:#c02020}o3r-ruleset-history-pres .error .capsule.error{background-color:#c02020;color:#fff}o3r-ruleset-history-pres .warn{background-color:#b92;color:#fff}o3r-ruleset-history-pres .input-key{color:#26c}o3r-ruleset-history-pres .input-value{color:#c29}o3r-ruleset-history-pres .input-key,o3r-ruleset-history-pres .input-value{font-family:monospace}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.RuleTreePresComponent, selector: "o3r-rule-tree-pres", inputs: ["name", "blockType", "condition", "successElements", "failureElements"] }, { kind: "component", type: i3.RuleActionsPresComponent, selector: "o3r-rule-actions-pres", inputs: ["actions", "temporaryFacts", "runtimeOutputs"] }, { kind: "component", type: i4.RuleKeyValuePresComponent, selector: "o3r-rule-key-value-pres", inputs: ["key", "value", "oldValue", "type"] }, { kind: "pipe", type: i5.O3rFallbackToPipe, name: "o3rFallbackTo" }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: i1.KeyValuePipe, name: "keyvalue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
39
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.1", type: RulesetHistoryPresComponent, selector: "o3r-ruleset-history-pres", inputs: { rulesetExecutions: "rulesetExecutions", executionDurationFormat: "executionDurationFormat" }, ngImport: i0, template: "<section>\n <h4 class=\"mb-4\">Ruleset Execution History</h4>\n <ng-template #noRulesEngine>\n <div class=\"alert alert-danger m-2\" role=\"alert\">\n The Rules Engine is not configured on this page.\n </div>\n </ng-template>\n <ul *ngIf=\"rulesetExecutions; else noRulesEngine\" class=\"rulesets\">\n <li *ngFor=\"let execution of rulesetExecutions\" class=\"ruleset\">\n <div class=\"ruleset-panel-title ruleset-expansion-action\"\n [class.error]=\"execution.type === 'RulesetExecutionError'\"\n (click)=\"toggleExpansion(execution.executionId, 'ruleset')\">\n <div><span [title]=\"'This ruleset has been evaluated ' + execution.executionCounter + ' time(s)'\">{{execution.executionCounter}}</span> - {{execution.rulesetName | titlecase }}\n <div class=\"ruleset-panel-subtitle\" *ngIf=\"execution.rulesetInformation?.linkedComponent as linkedComponent\">\n {{linkedComponent.name}} {{linkedComponent.library}}\n </div>\n <div class=\"ruleset-panel-subtitle\" *ngIf=\"execution.rulesetInformation?.validityRange as validityRange\">\n Date range: {{validityRange.from}} - {{validityRange.to}}\n </div>\n </div>\n <div class=\"ruleset-panel-title-aside\">\n <span class=\"error capsule\" *ngIf=\"execution.status === 'Error'\">Error</span>\n <span class=\"success capsule\" *ngIf=\"execution.status === 'Active'\">Applied</span>\n <span class=\"inactive capsule\" *ngIf=\"execution.status === 'Deactivated'\">Deactivated</span>\n <span class=\"warn capsule\" *ngIf=\"execution.status === 'NoEffect'\">No effect</span>\n <span class=\"time capsule\">\n <span>{{execution.timestamp | date: 'HH:mm:ss SSS'}}</span>\n <span>({{execution.duration | number: executionDurationFormat}}ms)</span>\n </span>\n <button\n class=\"icon\"\n [class.icon-caret-down]=\"!expansionStatus[execution.executionId]?.ruleset\"\n [class.icon-caret-up]=\"expansionStatus[execution.executionId]?.ruleset\">\n </button>\n </div>\n </div>\n <div class=\"ruleset-panel-description\" *ngIf=\"expansionStatus[execution.executionId]?.ruleset\">\n <ng-container [ngTemplateOutlet]=\"rules\"\n [ngTemplateOutletContext]=\"{\n rules: execution.rulesetInformation.rules,\n expansionID: execution.executionId\n }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"inputs\"\n [ngTemplateOutletContext]=\"{\n inputs: execution.inputFacts\n }\"></ng-container>\n <ng-container *ngIf=\"execution.type === 'RulesetExecutionError'; else success\">\n <div class=\"ruleset-panel-category-title\">Rules:</div>\n <ul class=\"ruleset-panel-category-body rule-description\">\n <li *ngFor=\"let ruleEvaluation of execution.rulesEvaluations; let index=index;\">\n <ng-container>\n <div class=\"ruleset-panel-title\" [class.error]=\"ruleEvaluation.error\">\n <span>{{ruleEvaluation.rule.name | titlecase}} </span>\n <span class=\"capsule error\" *ngIf=\"ruleEvaluation.error\">Error</span>\n </div>\n <div>\n <ng-container *ngIf=\"ruleEvaluation.error\">\n <span class=\"ruleset-panel-category-title\">Error:</span>\n <pre class=\"ruleset-panel-category-body error\">{{ruleEvaluation.error | json}}</pre>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"inputs\"\n [ngTemplateOutletContext]=\"{\n inputs: execution.inputFacts,\n runtimeInputs: execution.rulesetInformation?.rules[index]?.inputRuntimeFacts\n }\"></ng-container>\n <o3r-rule-actions-pres *ngIf=\"!ruleEvaluation.error\"\n [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n [runtimeOutputs]=\"execution.rulesetInformation?.rules[index]?.outputRuntimeFacts\"\n ></o3r-rule-actions-pres>\n </div>\n </ng-container>\n </li>\n </ul>\n </ng-container>\n <ng-template #success>\n <o3r-rule-actions-pres [actions]=\"execution.outputActions\"></o3r-rule-actions-pres>\n <div class=\"ruleset-panel-category-title\">Executed Rules</div>\n <ul class=\"rule-description ruleset-panel-category-body\">\n <li *ngFor=\"let ruleEvaluation of execution.rulesEvaluations; let index=index;\">\n <div class=\"ruleset-panel-title\">\n <span>{{ruleEvaluation.rule.name | titlecase}}</span>\n <span class=\"capsule inactive\" *ngIf=\"ruleEvaluation.cached\">Cached</span>\n <span class=\"capsule\">({{ruleEvaluation.duration | number: executionDurationFormat}}ms)</span>\n </div>\n <div>\n <ng-container [ngTemplateOutlet]=\"triggers\"\n [ngTemplateOutletContext]=\"{triggers: (ruleEvaluation.triggers[ruleEvaluation.rule.id])}\"></ng-container>\n <o3r-rule-actions-pres\n [actions]=\"ruleEvaluation.outputActions\"\n [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n [runtimeOutputs]=\"execution.rulesetInformation?.rules[index]?.outputRuntimeFacts\">\n </o3r-rule-actions-pres>\n </div>\n </li>\n </ul>\n </ng-template>\n </div>\n </li>\n </ul>\n</section>\n\n<ng-template let-triggers=\"triggers\" #triggers>\n <div class=\"ruleset-panel-category-title\">Basefacts Triggers</div>\n <ul class=\"ruleset-panel-category-body triggers\">\n <ng-container *ngFor=\"let trigger of (triggers | keyvalue)\">\n <li *ngIf=\"trigger.value?.factName\">\n <o3r-rule-key-value-pres\n [key]=\"trigger.value.factName\"\n [oldValue]=\"trigger.value.oldValue | o3rFallbackTo\"\n [value]=\"trigger.value.newValue | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </li>\n </ng-container>\n </ul>\n</ng-template>\n\n<ng-template let-rules=\"rules\" let-expansionID=\"expansionID\" #rules>\n <div class=\"ruleset-panel-category-title ruleset-expansion-action\"\n (click)=\"toggleExpansion(expansionID, 'rulesOverview')\">\n <span>Rules Overview</span>\n <button class=\"icon\"\n [class.icon-caret-down]=\"!expansionStatus[expansionID]?.rulesOverview\"\n [class.icon-caret-up]=\"expansionStatus[expansionID]?.rulesOverview\">\n </button>\n </div>\n <ng-container *ngIf=\"expansionStatus[expansionID]?.rulesOverview\">\n <div *ngIf=\"rules?.length === 0\" class=\"ruleset-panel-category-body empty\">No rule</div>\n <ul class=\"ruleset-panel-category-body\" *ngIf=\"rules?.length > 0\">\n <li *ngFor=\"let rule of rules\">\n <o3r-rule-tree-pres [name]=\"rule.name\"\n [condition]=\"rule?.rootElement?.condition\"\n [blockType]=\"rule?.rootElement?.blockType\"\n [successElements]=\"rule?.rootElement?.successElements\"\n [failureElements]=\"rule?.rootElement?.failureElements\">\n </o3r-rule-tree-pres>\n </li>\n </ul>\n </ng-container>\n</ng-template>\n\n<ng-template let-inputs=\"inputs\" let-runtimeInputs=\"runtimeInputs\" #inputs>\n <div class=\"ruleset-panel-category-title\">Inputs snapshot</div>\n <div *ngIf=\"inputs?.length === 0\" class=\"ruleset-panel-category-body empty\">No inputs</div>\n <ul class=\"ruleset-panel-category-body\" *ngIf=\"inputs?.length > 0\">\n <li *ngFor=\"let input of inputs\">\n <o3r-rule-key-value-pres\n [key]=\"input.factName\"\n [value]=\"input.value | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </li>\n <li *ngFor=\"let input of runtimeInputs\">{{input}} (scope limited to ruleset)</li>\n </ul>\n</ng-template>\n", styles: ["o3r-ruleset-history-pres .ruleset-panel-title,o3r-ruleset-history-pres .ruleset-panel-category-title{display:flex;justify-content:space-between;align-items:center}o3r-ruleset-history-pres .ruleset-panel-title{font-size:1rem;padding:.5rem 0 .1rem}o3r-ruleset-history-pres .ruleset-expansion-action,o3r-ruleset-history-pres .icon-caret-down,o3r-ruleset-history-pres .icon-caret-up{cursor:pointer}o3r-ruleset-history-pres .ruleset-panel-subtitle{font-size:.75rem}o3r-ruleset-history-pres .ruleset-panel-title-aside{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;min-width:fit-content}o3r-ruleset-history-pres .ruleset-panel-category-title{font-size:.95rem;background:#eee;padding:.5rem;margin-bottom:.5rem;margin-top:1rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-title{font-size:.893rem;cursor:default}o3r-ruleset-history-pres .rule-description .ruleset-panel-title{font-size:.94rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-body{padding-bottom:.5rem;padding-left:1.5rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-body:empty{margin:0;padding:0 0 0 1.5rem}o3r-ruleset-history-pres .rulesets{margin:0;padding:0;list-style:none}o3r-ruleset-history-pres .rulesets ul{margin:0;padding-left:2rem}o3r-ruleset-history-pres .rulesets li.ruleset:nth-child(odd){background:#fbfbfb}o3r-ruleset-history-pres .ruleset-panel-category-body li{list-style:disc}o3r-ruleset-history-pres li:empty{display:none}o3r-ruleset-history-pres .ruleset{border-bottom:1px solid #dddddd}o3r-ruleset-history-pres .ruleset .ruleset-panel-description{padding:0 1rem 0 2rem;margin-bottom:2em}o3r-ruleset-history-pres .ruleset:first-child{border-top:1px solid #dddddd}o3r-ruleset-history-pres .ruleset-panel-title.ruleset-expansion-action{padding:.5rem 1rem}o3r-ruleset-history-pres .empty{font-style:italic;padding-left:1.5rem}o3r-ruleset-history-pres .ruleset-panel-category-body:empty.triggers:after{content:\"No trigger for this rule\";display:block;font-style:italic;padding-bottom:.5rem}o3r-ruleset-history-pres .ruleset-panel-title-aside{padding-left:1rem}o3r-ruleset-history-pres .rule-description .capsule{font-size:.8em;padding:.1rem .5rem;margin:0 .5rem}o3r-ruleset-history-pres .icon{background:none;border:none;font-size:1em}o3r-ruleset-history-pres .capsule{padding:.3rem;margin:.5rem;font-size:.875em;min-width:6rem;text-align:center}o3r-ruleset-history-pres .capsule.time{display:flex;flex-direction:column}o3r-ruleset-history-pres .success{background-color:#16aa32;color:#fff}o3r-ruleset-history-pres .inactive{background-color:#aaa;color:#fff}o3r-ruleset-history-pres .error{color:#c02020}o3r-ruleset-history-pres .error .capsule.error{background-color:#c02020;color:#fff}o3r-ruleset-history-pres .warn{background-color:#b92;color:#fff}o3r-ruleset-history-pres .input-key{color:#26c}o3r-ruleset-history-pres .input-value{color:#c29}o3r-ruleset-history-pres .input-key,o3r-ruleset-history-pres .input-value{font-family:monospace}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.RuleTreePresComponent, selector: "o3r-rule-tree-pres", inputs: ["name", "blockType", "condition", "successElements", "failureElements"] }, { kind: "component", type: i3.RuleActionsPresComponent, selector: "o3r-rule-actions-pres", inputs: ["actions", "temporaryFacts", "runtimeOutputs"] }, { kind: "component", type: i4.RuleKeyValuePresComponent, selector: "o3r-rule-key-value-pres", inputs: ["key", "value", "oldValue", "type"] }, { kind: "pipe", type: i5.O3rFallbackToPipe, name: "o3rFallbackTo" }, { kind: "pipe", type: i1.JsonPipe, name: "json" }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: i1.KeyValuePipe, name: "keyvalue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
40
40
  }
41
41
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: RulesetHistoryPresComponent, decorators: [{
42
42
  type: Component,
43
- args: [{ selector: 'o3r-ruleset-history-pres', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<section>\n <h4 class=\"mb-4\">Ruleset Execution History</h4>\n <ng-template #noRulesEngine>\n <div class=\"alert alert-danger m-2\" role=\"alert\">\n The Rules Engine is not configured on this page.\n </div>\n </ng-template>\n <ul *ngIf=\"rulesetExecutions; else noRulesEngine\" class=\"rulesets\">\n <li *ngFor=\"let execution of rulesetExecutions\" class=\"ruleset\">\n <div class=\"ruleset-panel-title ruleset-expansion-action\"\n [class.error]=\"execution.type === 'RulesetExecutionError'\"\n (click)=\"toggleExpansion(execution.executionId, 'ruleset')\">\n <div><span [title]=\"'This ruleset has been evaluated ' + execution.executionCounter + ' time(s)'\">{{execution.executionCounter}}</span> - {{execution.rulesetName | titlecase }}\n <div class=\"ruleset-panel-subtitle\" *ngIf=\"execution.rulesetInformation?.linkedComponent as linkedComponent\">\n {{linkedComponent.name}} {{linkedComponent.library}}\n </div>\n <div class=\"ruleset-panel-subtitle\" *ngIf=\"execution.rulesetInformation?.validityRange as validityRange\">\n Date range: {{validityRange.from}} - {{validityRange.to}}\n </div>\n </div>\n <div class=\"ruleset-panel-title-aside\">\n <span class=\"error capsule\" *ngIf=\"execution.status === 'Error'\">Error</span>\n <span class=\"success capsule\" *ngIf=\"execution.status === 'Active'\">Applied</span>\n <span class=\"inactive capsule\" *ngIf=\"execution.status === 'Deactivated'\">Deactivated</span>\n <span class=\"warn capsule\" *ngIf=\"execution.status === 'NoEffect'\">No effect</span>\n <span class=\"time capsule\">\n <span>{{execution.timestamp | date: 'HH:mm:ss SSS'}}</span>\n <span>({{execution.duration | number: executionDurationFormat}}ms)</span>\n </span>\n <button\n class=\"icon\"\n [class.icon-caret-down]=\"!expansionStatus[execution.executionId]?.ruleset\"\n [class.icon-caret-up]=\"expansionStatus[execution.executionId]?.ruleset\">\n </button>\n </div>\n </div>\n <div class=\"ruleset-panel-description\" *ngIf=\"expansionStatus[execution.executionId]?.ruleset\">\n <ng-container [ngTemplateOutlet]=\"rules\"\n [ngTemplateOutletContext]=\"{\n rules: execution.rulesetInformation.rules,\n expansionID: execution.executionId\n }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"inputs\"\n [ngTemplateOutletContext]=\"{\n inputs: execution.inputFacts\n }\"></ng-container>\n <ng-container *ngIf=\"execution.type === 'RulesetExecutionError'; else success\">\n <div class=\"ruleset-panel-category-title\">Rules:</div>\n <ul class=\"ruleset-panel-category-body rule-description\">\n <li *ngFor=\"let ruleEvaluation of execution.rulesEvaluations; let index=index;\">\n <ng-container>\n <div class=\"ruleset-panel-title\" [class.error]=\"ruleEvaluation.error\">\n <span>{{ruleEvaluation.rule.name | titlecase}} </span>\n <span class=\"capsule error\" *ngIf=\"ruleEvaluation.error\">Error</span>\n </div>\n <div>\n <ng-container *ngIf=\"ruleEvaluation.error\">\n <span class=\"ruleset-panel-category-title\">Error:</span>\n <span class=\"ruleset-panel-category-body error\">{{ruleEvaluation.error.message}}</span>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"inputs\"\n [ngTemplateOutletContext]=\"{\n inputs: execution.inputFacts,\n runtimeInputs: execution.rulesetInformation?.rules[index]?.inputRuntimeFacts\n }\"></ng-container>\n <o3r-rule-actions-pres *ngIf=\"!ruleEvaluation.error\"\n [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n [runtimeOutputs]=\"execution.rulesetInformation?.rules[index]?.outputRuntimeFacts\"\n ></o3r-rule-actions-pres>\n </div>\n </ng-container>\n </li>\n </ul>\n </ng-container>\n <ng-template #success>\n <o3r-rule-actions-pres [actions]=\"execution.outputActions\"></o3r-rule-actions-pres>\n <div class=\"ruleset-panel-category-title\">Executed Rules</div>\n <ul class=\"rule-description ruleset-panel-category-body\">\n <li *ngFor=\"let ruleEvaluation of execution.rulesEvaluations; let index=index;\">\n <div class=\"ruleset-panel-title\">\n <span>{{ruleEvaluation.rule.name | titlecase}}</span>\n <span class=\"capsule inactive\" *ngIf=\"ruleEvaluation.cached\">Cached</span>\n <span class=\"capsule\">({{ruleEvaluation.duration | number: executionDurationFormat}}ms)</span>\n </div>\n <div>\n <ng-container [ngTemplateOutlet]=\"triggers\"\n [ngTemplateOutletContext]=\"{triggers: (ruleEvaluation.triggers[ruleEvaluation.rule.id])}\"></ng-container>\n <o3r-rule-actions-pres\n [actions]=\"ruleEvaluation.outputActions\"\n [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n [runtimeOutputs]=\"execution.rulesetInformation?.rules[index]?.outputRuntimeFacts\">\n </o3r-rule-actions-pres>\n </div>\n </li>\n </ul>\n </ng-template>\n </div>\n </li>\n </ul>\n</section>\n\n<ng-template let-triggers=\"triggers\" #triggers>\n <div class=\"ruleset-panel-category-title\">Basefacts Triggers</div>\n <ul class=\"ruleset-panel-category-body triggers\">\n <ng-container *ngFor=\"let trigger of (triggers | keyvalue)\">\n <li *ngIf=\"trigger.value?.factName\">\n <o3r-rule-key-value-pres\n [key]=\"trigger.value.factName\"\n [oldValue]=\"trigger.value.oldValue | o3rFallbackTo\"\n [value]=\"trigger.value.newValue | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </li>\n </ng-container>\n </ul>\n</ng-template>\n\n<ng-template let-rules=\"rules\" let-expansionID=\"expansionID\" #rules>\n <div class=\"ruleset-panel-category-title ruleset-expansion-action\"\n (click)=\"toggleExpansion(expansionID, 'rulesOverview')\">\n <span>Rules Overview</span>\n <button class=\"icon\"\n [class.icon-caret-down]=\"!expansionStatus[expansionID]?.rulesOverview\"\n [class.icon-caret-up]=\"expansionStatus[expansionID]?.rulesOverview\">\n </button>\n </div>\n <ng-container *ngIf=\"expansionStatus[expansionID]?.rulesOverview\">\n <div *ngIf=\"rules?.length === 0\" class=\"ruleset-panel-category-body empty\">No rule</div>\n <ul class=\"ruleset-panel-category-body\" *ngIf=\"rules?.length > 0\">\n <li *ngFor=\"let rule of rules\">\n <o3r-rule-tree-pres [name]=\"rule.name\"\n [condition]=\"rule?.rootElement?.condition\"\n [blockType]=\"rule?.rootElement?.blockType\"\n [successElements]=\"rule?.rootElement?.successElements\"\n [failureElements]=\"rule?.rootElement?.failureElements\">\n </o3r-rule-tree-pres>\n </li>\n </ul>\n </ng-container>\n</ng-template>\n\n<ng-template let-inputs=\"inputs\" let-runtimeInputs=\"runtimeInputs\" #inputs>\n <div class=\"ruleset-panel-category-title\">Inputs snapshot</div>\n <div *ngIf=\"inputs?.length === 0\" class=\"ruleset-panel-category-body empty\">No inputs</div>\n <ul class=\"ruleset-panel-category-body\" *ngIf=\"inputs?.length > 0\">\n <li *ngFor=\"let input of inputs\">\n <o3r-rule-key-value-pres\n [key]=\"input.factName\"\n [value]=\"input.value | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </li>\n <li *ngFor=\"let input of runtimeInputs\">{{input}} (scope limited to ruleset)</li>\n </ul>\n</ng-template>\n", styles: ["o3r-ruleset-history-pres .ruleset-panel-title,o3r-ruleset-history-pres .ruleset-panel-category-title{display:flex;justify-content:space-between;align-items:center}o3r-ruleset-history-pres .ruleset-panel-title{font-size:1rem;padding:.5rem 0 .1rem}o3r-ruleset-history-pres .ruleset-expansion-action,o3r-ruleset-history-pres .icon-caret-down,o3r-ruleset-history-pres .icon-caret-up{cursor:pointer}o3r-ruleset-history-pres .ruleset-panel-subtitle{font-size:.75rem}o3r-ruleset-history-pres .ruleset-panel-title-aside{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;min-width:fit-content}o3r-ruleset-history-pres .ruleset-panel-category-title{font-size:.95rem;background:#eee;padding:.5rem;margin-bottom:.5rem;margin-top:1rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-title{font-size:.893rem;cursor:default}o3r-ruleset-history-pres .rule-description .ruleset-panel-title{font-size:.94rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-body{padding-bottom:.5rem;padding-left:1.5rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-body:empty{margin:0;padding:0 0 0 1.5rem}o3r-ruleset-history-pres .rulesets{margin:0;padding:0;list-style:none}o3r-ruleset-history-pres .rulesets ul{margin:0;padding-left:2rem}o3r-ruleset-history-pres .rulesets li.ruleset:nth-child(odd){background:#fbfbfb}o3r-ruleset-history-pres .ruleset-panel-category-body li{list-style:disc}o3r-ruleset-history-pres li:empty{display:none}o3r-ruleset-history-pres .ruleset{border-bottom:1px solid #dddddd}o3r-ruleset-history-pres .ruleset .ruleset-panel-description{padding:0 1rem 0 2rem;margin-bottom:2em}o3r-ruleset-history-pres .ruleset:first-child{border-top:1px solid #dddddd}o3r-ruleset-history-pres .ruleset-panel-title.ruleset-expansion-action{padding:.5rem 1rem}o3r-ruleset-history-pres .empty{font-style:italic;padding-left:1.5rem}o3r-ruleset-history-pres .ruleset-panel-category-body:empty.triggers:after{content:\"No trigger for this rule\";display:block;font-style:italic;padding-bottom:.5rem}o3r-ruleset-history-pres .ruleset-panel-title-aside{padding-left:1rem}o3r-ruleset-history-pres .rule-description .capsule{font-size:.8em;padding:.1rem .5rem;margin:0 .5rem}o3r-ruleset-history-pres .icon{background:none;border:none;font-size:1em}o3r-ruleset-history-pres .capsule{padding:.3rem;margin:.5rem;font-size:.875em;min-width:6rem;text-align:center}o3r-ruleset-history-pres .capsule.time{display:flex;flex-direction:column}o3r-ruleset-history-pres .success{background-color:#16aa32;color:#fff}o3r-ruleset-history-pres .inactive{background-color:#aaa;color:#fff}o3r-ruleset-history-pres .error{color:#c02020}o3r-ruleset-history-pres .error .capsule.error{background-color:#c02020;color:#fff}o3r-ruleset-history-pres .warn{background-color:#b92;color:#fff}o3r-ruleset-history-pres .input-key{color:#26c}o3r-ruleset-history-pres .input-value{color:#c29}o3r-ruleset-history-pres .input-key,o3r-ruleset-history-pres .input-value{font-family:monospace}\n"] }]
43
+ args: [{ selector: 'o3r-ruleset-history-pres', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<section>\n <h4 class=\"mb-4\">Ruleset Execution History</h4>\n <ng-template #noRulesEngine>\n <div class=\"alert alert-danger m-2\" role=\"alert\">\n The Rules Engine is not configured on this page.\n </div>\n </ng-template>\n <ul *ngIf=\"rulesetExecutions; else noRulesEngine\" class=\"rulesets\">\n <li *ngFor=\"let execution of rulesetExecutions\" class=\"ruleset\">\n <div class=\"ruleset-panel-title ruleset-expansion-action\"\n [class.error]=\"execution.type === 'RulesetExecutionError'\"\n (click)=\"toggleExpansion(execution.executionId, 'ruleset')\">\n <div><span [title]=\"'This ruleset has been evaluated ' + execution.executionCounter + ' time(s)'\">{{execution.executionCounter}}</span> - {{execution.rulesetName | titlecase }}\n <div class=\"ruleset-panel-subtitle\" *ngIf=\"execution.rulesetInformation?.linkedComponent as linkedComponent\">\n {{linkedComponent.name}} {{linkedComponent.library}}\n </div>\n <div class=\"ruleset-panel-subtitle\" *ngIf=\"execution.rulesetInformation?.validityRange as validityRange\">\n Date range: {{validityRange.from}} - {{validityRange.to}}\n </div>\n </div>\n <div class=\"ruleset-panel-title-aside\">\n <span class=\"error capsule\" *ngIf=\"execution.status === 'Error'\">Error</span>\n <span class=\"success capsule\" *ngIf=\"execution.status === 'Active'\">Applied</span>\n <span class=\"inactive capsule\" *ngIf=\"execution.status === 'Deactivated'\">Deactivated</span>\n <span class=\"warn capsule\" *ngIf=\"execution.status === 'NoEffect'\">No effect</span>\n <span class=\"time capsule\">\n <span>{{execution.timestamp | date: 'HH:mm:ss SSS'}}</span>\n <span>({{execution.duration | number: executionDurationFormat}}ms)</span>\n </span>\n <button\n class=\"icon\"\n [class.icon-caret-down]=\"!expansionStatus[execution.executionId]?.ruleset\"\n [class.icon-caret-up]=\"expansionStatus[execution.executionId]?.ruleset\">\n </button>\n </div>\n </div>\n <div class=\"ruleset-panel-description\" *ngIf=\"expansionStatus[execution.executionId]?.ruleset\">\n <ng-container [ngTemplateOutlet]=\"rules\"\n [ngTemplateOutletContext]=\"{\n rules: execution.rulesetInformation.rules,\n expansionID: execution.executionId\n }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"inputs\"\n [ngTemplateOutletContext]=\"{\n inputs: execution.inputFacts\n }\"></ng-container>\n <ng-container *ngIf=\"execution.type === 'RulesetExecutionError'; else success\">\n <div class=\"ruleset-panel-category-title\">Rules:</div>\n <ul class=\"ruleset-panel-category-body rule-description\">\n <li *ngFor=\"let ruleEvaluation of execution.rulesEvaluations; let index=index;\">\n <ng-container>\n <div class=\"ruleset-panel-title\" [class.error]=\"ruleEvaluation.error\">\n <span>{{ruleEvaluation.rule.name | titlecase}} </span>\n <span class=\"capsule error\" *ngIf=\"ruleEvaluation.error\">Error</span>\n </div>\n <div>\n <ng-container *ngIf=\"ruleEvaluation.error\">\n <span class=\"ruleset-panel-category-title\">Error:</span>\n <pre class=\"ruleset-panel-category-body error\">{{ruleEvaluation.error | json}}</pre>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"inputs\"\n [ngTemplateOutletContext]=\"{\n inputs: execution.inputFacts,\n runtimeInputs: execution.rulesetInformation?.rules[index]?.inputRuntimeFacts\n }\"></ng-container>\n <o3r-rule-actions-pres *ngIf=\"!ruleEvaluation.error\"\n [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n [runtimeOutputs]=\"execution.rulesetInformation?.rules[index]?.outputRuntimeFacts\"\n ></o3r-rule-actions-pres>\n </div>\n </ng-container>\n </li>\n </ul>\n </ng-container>\n <ng-template #success>\n <o3r-rule-actions-pres [actions]=\"execution.outputActions\"></o3r-rule-actions-pres>\n <div class=\"ruleset-panel-category-title\">Executed Rules</div>\n <ul class=\"rule-description ruleset-panel-category-body\">\n <li *ngFor=\"let ruleEvaluation of execution.rulesEvaluations; let index=index;\">\n <div class=\"ruleset-panel-title\">\n <span>{{ruleEvaluation.rule.name | titlecase}}</span>\n <span class=\"capsule inactive\" *ngIf=\"ruleEvaluation.cached\">Cached</span>\n <span class=\"capsule\">({{ruleEvaluation.duration | number: executionDurationFormat}}ms)</span>\n </div>\n <div>\n <ng-container [ngTemplateOutlet]=\"triggers\"\n [ngTemplateOutletContext]=\"{triggers: (ruleEvaluation.triggers[ruleEvaluation.rule.id])}\"></ng-container>\n <o3r-rule-actions-pres\n [actions]=\"ruleEvaluation.outputActions\"\n [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n [runtimeOutputs]=\"execution.rulesetInformation?.rules[index]?.outputRuntimeFacts\">\n </o3r-rule-actions-pres>\n </div>\n </li>\n </ul>\n </ng-template>\n </div>\n </li>\n </ul>\n</section>\n\n<ng-template let-triggers=\"triggers\" #triggers>\n <div class=\"ruleset-panel-category-title\">Basefacts Triggers</div>\n <ul class=\"ruleset-panel-category-body triggers\">\n <ng-container *ngFor=\"let trigger of (triggers | keyvalue)\">\n <li *ngIf=\"trigger.value?.factName\">\n <o3r-rule-key-value-pres\n [key]=\"trigger.value.factName\"\n [oldValue]=\"trigger.value.oldValue | o3rFallbackTo\"\n [value]=\"trigger.value.newValue | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </li>\n </ng-container>\n </ul>\n</ng-template>\n\n<ng-template let-rules=\"rules\" let-expansionID=\"expansionID\" #rules>\n <div class=\"ruleset-panel-category-title ruleset-expansion-action\"\n (click)=\"toggleExpansion(expansionID, 'rulesOverview')\">\n <span>Rules Overview</span>\n <button class=\"icon\"\n [class.icon-caret-down]=\"!expansionStatus[expansionID]?.rulesOverview\"\n [class.icon-caret-up]=\"expansionStatus[expansionID]?.rulesOverview\">\n </button>\n </div>\n <ng-container *ngIf=\"expansionStatus[expansionID]?.rulesOverview\">\n <div *ngIf=\"rules?.length === 0\" class=\"ruleset-panel-category-body empty\">No rule</div>\n <ul class=\"ruleset-panel-category-body\" *ngIf=\"rules?.length > 0\">\n <li *ngFor=\"let rule of rules\">\n <o3r-rule-tree-pres [name]=\"rule.name\"\n [condition]=\"rule?.rootElement?.condition\"\n [blockType]=\"rule?.rootElement?.blockType\"\n [successElements]=\"rule?.rootElement?.successElements\"\n [failureElements]=\"rule?.rootElement?.failureElements\">\n </o3r-rule-tree-pres>\n </li>\n </ul>\n </ng-container>\n</ng-template>\n\n<ng-template let-inputs=\"inputs\" let-runtimeInputs=\"runtimeInputs\" #inputs>\n <div class=\"ruleset-panel-category-title\">Inputs snapshot</div>\n <div *ngIf=\"inputs?.length === 0\" class=\"ruleset-panel-category-body empty\">No inputs</div>\n <ul class=\"ruleset-panel-category-body\" *ngIf=\"inputs?.length > 0\">\n <li *ngFor=\"let input of inputs\">\n <o3r-rule-key-value-pres\n [key]=\"input.factName\"\n [value]=\"input.value | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </li>\n <li *ngFor=\"let input of runtimeInputs\">{{input}} (scope limited to ruleset)</li>\n </ul>\n</ng-template>\n", styles: ["o3r-ruleset-history-pres .ruleset-panel-title,o3r-ruleset-history-pres .ruleset-panel-category-title{display:flex;justify-content:space-between;align-items:center}o3r-ruleset-history-pres .ruleset-panel-title{font-size:1rem;padding:.5rem 0 .1rem}o3r-ruleset-history-pres .ruleset-expansion-action,o3r-ruleset-history-pres .icon-caret-down,o3r-ruleset-history-pres .icon-caret-up{cursor:pointer}o3r-ruleset-history-pres .ruleset-panel-subtitle{font-size:.75rem}o3r-ruleset-history-pres .ruleset-panel-title-aside{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;min-width:fit-content}o3r-ruleset-history-pres .ruleset-panel-category-title{font-size:.95rem;background:#eee;padding:.5rem;margin-bottom:.5rem;margin-top:1rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-title{font-size:.893rem;cursor:default}o3r-ruleset-history-pres .rule-description .ruleset-panel-title{font-size:.94rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-body{padding-bottom:.5rem;padding-left:1.5rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-body:empty{margin:0;padding:0 0 0 1.5rem}o3r-ruleset-history-pres .rulesets{margin:0;padding:0;list-style:none}o3r-ruleset-history-pres .rulesets ul{margin:0;padding-left:2rem}o3r-ruleset-history-pres .rulesets li.ruleset:nth-child(odd){background:#fbfbfb}o3r-ruleset-history-pres .ruleset-panel-category-body li{list-style:disc}o3r-ruleset-history-pres li:empty{display:none}o3r-ruleset-history-pres .ruleset{border-bottom:1px solid #dddddd}o3r-ruleset-history-pres .ruleset .ruleset-panel-description{padding:0 1rem 0 2rem;margin-bottom:2em}o3r-ruleset-history-pres .ruleset:first-child{border-top:1px solid #dddddd}o3r-ruleset-history-pres .ruleset-panel-title.ruleset-expansion-action{padding:.5rem 1rem}o3r-ruleset-history-pres .empty{font-style:italic;padding-left:1.5rem}o3r-ruleset-history-pres .ruleset-panel-category-body:empty.triggers:after{content:\"No trigger for this rule\";display:block;font-style:italic;padding-bottom:.5rem}o3r-ruleset-history-pres .ruleset-panel-title-aside{padding-left:1rem}o3r-ruleset-history-pres .rule-description .capsule{font-size:.8em;padding:.1rem .5rem;margin:0 .5rem}o3r-ruleset-history-pres .icon{background:none;border:none;font-size:1em}o3r-ruleset-history-pres .capsule{padding:.3rem;margin:.5rem;font-size:.875em;min-width:6rem;text-align:center}o3r-ruleset-history-pres .capsule.time{display:flex;flex-direction:column}o3r-ruleset-history-pres .success{background-color:#16aa32;color:#fff}o3r-ruleset-history-pres .inactive{background-color:#aaa;color:#fff}o3r-ruleset-history-pres .error{color:#c02020}o3r-ruleset-history-pres .error .capsule.error{background-color:#c02020;color:#fff}o3r-ruleset-history-pres .warn{background-color:#b92;color:#fff}o3r-ruleset-history-pres .input-key{color:#26c}o3r-ruleset-history-pres .input-value{color:#c29}o3r-ruleset-history-pres .input-key,o3r-ruleset-history-pres .input-value{font-family:monospace}\n"] }]
44
44
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { rulesetExecutions: [{
45
45
  type: Input
46
46
  }], executionDurationFormat: [{
47
47
  type: Input
48
48
  }] } });
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZXNldC1oaXN0b3J5LXByZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcnVsZXMtZW5naW5lL3J1bGVzZXQtaGlzdG9yeS9ydWxlc2V0LWhpc3RvcnktcHJlcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9ydWxlcy1lbmdpbmUvcnVsZXNldC1oaXN0b3J5L3J1bGVzZXQtaGlzdG9yeS1wcmVzLnRlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7QUFxQmhILE1BQU0sT0FBTywyQkFBMkI7SUFtQnRDLFlBQTZCLEVBQXFCO1FBQXJCLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBbEJsRDs7Ozs7Ozs7V0FRRztRQUNJLG9CQUFlLEdBQW9ELEVBQUUsQ0FBQztRQUl0RSxzQkFBaUIsR0FBNEIsRUFBRSxDQUFDO1FBR2hELDRCQUF1QixHQUFHLE9BQU8sQ0FBQztJQUVZLENBQUM7SUFFdEQ7Ozs7T0FJRztJQUNJLGVBQWUsQ0FBQyxNQUFjLEVBQUUsUUFBZ0I7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQztRQUNwRCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25GLENBQUM7UUFDRCxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzFCLENBQUM7aUlBakNVLDJCQUEyQjtxSEFBM0IsMkJBQTJCLHdLQ3JCeEMsNHFRQXlKQTs7MkZEcElhLDJCQUEyQjtrQkFQdkMsU0FBUzsrQkFDRSwwQkFBMEIsbUJBR25CLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUk7c0ZBZ0I5QixpQkFBaUI7c0JBRHZCLEtBQUs7Z0JBSUMsdUJBQXVCO3NCQUQ3QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIElucHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBSdWxlc2V0LCBSdWxlc2V0RXhlY3V0aW9uRXJyb3JFdmVudCwgUnVsZXNldEV4ZWN1dGlvbkV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vZW5naW5lJztcblxuZXhwb3J0IHR5cGUgUnVsZXNldEV4ZWN1dGlvblN0YXR1cyA9ICdFcnJvcicgfCAnQWN0aXZlJyB8ICdEZWFjdGl2YXRlZCcgfCAnTm9FZmZlY3QnO1xuLyoqXG4gKiBNb2RlbCBvZiBhIFJ1bGVzZXRFeGVjdXRpb24gd2l0aCBtb3JlIGluZm9ybWF0aW9uIGZvciBkZWJ1ZyBwdXJwb3NlXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bGVzZXRFeGVjdXRpb25EZWJ1ZyA9IChSdWxlc2V0RXhlY3V0aW9uRXZlbnQgfCBSdWxlc2V0RXhlY3V0aW9uRXJyb3JFdmVudCkgJiB7XG4gIGlzQWN0aXZlOiBib29sZWFuO1xuICBzdGF0dXM6IFJ1bGVzZXRFeGVjdXRpb25TdGF0dXM7XG4gIHJ1bGVzZXRJbmZvcm1hdGlvbjogUnVsZXNldCB8IHVuZGVmaW5lZDtcbn07XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbzNyLXJ1bGVzZXQtaGlzdG9yeS1wcmVzJyxcbiAgc3R5bGVVcmxzOiBbJy4vcnVsZXNldC1oaXN0b3J5LXByZXMuc3R5bGUuc2NzcyddLFxuICB0ZW1wbGF0ZVVybDogJy4vcnVsZXNldC1oaXN0b3J5LXByZXMudGVtcGxhdGUuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFJ1bGVzZXRIaXN0b3J5UHJlc0NvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBSZWZsZWN0cyB0aGUgc3RhdGUgb2YgZWFjaCBydWxlc2V0IGV4cGFuZGVkIGVsZW1lbnRzLlxuICAgKiBFYWNoIHJ1bGVzZXQgZW50cnkgY29udGFpbnMgYSBsaXN0IG9mIHN1YnBhbmVsIHRoYXQgY2FuIGJlIGNvbGxhcHNlZCBvciBleHBhbmRlZC5cbiAgICogUnVsZXNldCB3aG9sZSBwYW5lbCBzdGF0dXMgaXMgc3RvcmUgdGhlICdydWxlc2V0JyBlbnRyeS5cbiAgICogQGV4YW1wbGVcbiAgICogRXhwYW5kZWQgcnVsZXNldCB3aXRoIHJ1bGUgb3ZlcnZpZXcgY29sbGFwc2VkOlxuICAgKiB7J3J1bGVzZXRJZCc6IHsncnVsZXNldCcgOiB0cnVlLCAncnVsZU92ZXJ2aWV3JzogZmFsc2V9fVxuICAgKiBAbm90ZSBDb2xsYXBzaW5nIGEgcnVsZXNldCB3aWxsIG5vdCByZXNldCB0aGUgc3VicGFuZWwgZXhwYW5zaW9uIHN0YXR1c1xuICAgKi9cbiAgcHVibGljIGV4cGFuc2lvblN0YXR1czoge1trZXk6IHN0cmluZ106IHtbc3VicGFuZWw6IHN0cmluZ106IGJvb2xlYW59IH0gPSB7fTtcblxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBydWxlc2V0RXhlY3V0aW9uczogUnVsZXNldEV4ZWN1dGlvbkRlYnVnW10gPSBbXTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZXhlY3V0aW9uRHVyYXRpb25Gb3JtYXQgPSAnMS4zLTMnO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgYSBydWxlc2V0IHN1YnBhbmVsXG4gICAqIEBwYXJhbSBydWxlSWRcbiAgICogQHBhcmFtIHN1YnBhbmVsIGVsZW1lbnQgdG8gY29sbGFwc2UuICdydWxlc2V0JyB3aWxsIHRvZ2dsZSB0aGUgd2hvbGUgcGFuZWwgYnV0IHdvbid0IHJlc2V0IHRoZSBzdWJwYW5lbHMgc3RhdGVzLlxuICAgKi9cbiAgcHVibGljIHRvZ2dsZUV4cGFuc2lvbihydWxlSWQ6IHN0cmluZywgc3VicGFuZWw6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5leHBhbnNpb25TdGF0dXNbcnVsZUlkXSkge1xuICAgICAgdGhpcy5leHBhbnNpb25TdGF0dXNbcnVsZUlkXSA9IHtbc3VicGFuZWxdOiB0cnVlfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5leHBhbnNpb25TdGF0dXNbcnVsZUlkXVtzdWJwYW5lbF0gPSAhdGhpcy5leHBhbnNpb25TdGF0dXNbcnVsZUlkXVtzdWJwYW5lbF07XG4gICAgfVxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG59XG4iLCI8c2VjdGlvbj5cbiAgPGg0IGNsYXNzPVwibWItNFwiPlJ1bGVzZXQgRXhlY3V0aW9uIEhpc3Rvcnk8L2g0PlxuICA8bmctdGVtcGxhdGUgI25vUnVsZXNFbmdpbmU+XG4gICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlciBtLTJcIiByb2xlPVwiYWxlcnRcIj5cbiAgICAgIFRoZSBSdWxlcyBFbmdpbmUgaXMgbm90IGNvbmZpZ3VyZWQgb24gdGhpcyBwYWdlLlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuICA8dWwgKm5nSWY9XCJydWxlc2V0RXhlY3V0aW9uczsgZWxzZSBub1J1bGVzRW5naW5lXCIgY2xhc3M9XCJydWxlc2V0c1wiPlxuICAgIDxsaSAqbmdGb3I9XCJsZXQgZXhlY3V0aW9uIG9mIHJ1bGVzZXRFeGVjdXRpb25zXCIgY2xhc3M9XCJydWxlc2V0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicnVsZXNldC1wYW5lbC10aXRsZSBydWxlc2V0LWV4cGFuc2lvbi1hY3Rpb25cIlxuICAgICAgICBbY2xhc3MuZXJyb3JdPVwiZXhlY3V0aW9uLnR5cGUgPT09ICdSdWxlc2V0RXhlY3V0aW9uRXJyb3InXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUV4cGFuc2lvbihleGVjdXRpb24uZXhlY3V0aW9uSWQsICdydWxlc2V0JylcIj5cbiAgICAgICAgPGRpdj48c3BhbiBbdGl0bGVdPVwiJ1RoaXMgcnVsZXNldCBoYXMgYmVlbiBldmFsdWF0ZWQgJyArIGV4ZWN1dGlvbi5leGVjdXRpb25Db3VudGVyICsgJyB0aW1lKHMpJ1wiPnt7ZXhlY3V0aW9uLmV4ZWN1dGlvbkNvdW50ZXJ9fTwvc3Bhbj4gLSB7e2V4ZWN1dGlvbi5ydWxlc2V0TmFtZSB8IHRpdGxlY2FzZSB9fVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJydWxlc2V0LXBhbmVsLXN1YnRpdGxlXCIgKm5nSWY9XCJleGVjdXRpb24ucnVsZXNldEluZm9ybWF0aW9uPy5saW5rZWRDb21wb25lbnQgYXMgbGlua2VkQ29tcG9uZW50XCI+XG4gICAgICAgICAgICB7e2xpbmtlZENvbXBvbmVudC5uYW1lfX0ge3tsaW5rZWRDb21wb25lbnQubGlicmFyeX19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJ1bGVzZXQtcGFuZWwtc3VidGl0bGVcIiAqbmdJZj1cImV4ZWN1dGlvbi5ydWxlc2V0SW5mb3JtYXRpb24/LnZhbGlkaXR5UmFuZ2UgYXMgdmFsaWRpdHlSYW5nZVwiPlxuICAgICAgICAgICAgRGF0ZSByYW5nZToge3t2YWxpZGl0eVJhbmdlLmZyb219fSAtIHt7dmFsaWRpdHlSYW5nZS50b319XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicnVsZXNldC1wYW5lbC10aXRsZS1hc2lkZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3IgY2Fwc3VsZVwiICpuZ0lmPVwiZXhlY3V0aW9uLnN0YXR1cyA9PT0gJ0Vycm9yJ1wiPkVycm9yPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VjY2VzcyBjYXBzdWxlXCIgKm5nSWY9XCJleGVjdXRpb24uc3RhdHVzID09PSAnQWN0aXZlJ1wiPkFwcGxpZWQ8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbmFjdGl2ZSBjYXBzdWxlXCIgKm5nSWY9XCJleGVjdXRpb24uc3RhdHVzID09PSAnRGVhY3RpdmF0ZWQnXCI+RGVhY3RpdmF0ZWQ8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ3YXJuIGNhcHN1bGVcIiAqbmdJZj1cImV4ZWN1dGlvbi5zdGF0dXMgPT09ICdOb0VmZmVjdCdcIj5ObyBlZmZlY3Q8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lIGNhcHN1bGVcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7ZXhlY3V0aW9uLnRpbWVzdGFtcCB8IGRhdGU6ICdISDptbTpzcyBTU1MnfX08L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj4oe3tleGVjdXRpb24uZHVyYXRpb24gfCBudW1iZXI6IGV4ZWN1dGlvbkR1cmF0aW9uRm9ybWF0fX1tcyk8L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiaWNvblwiXG4gICAgICAgICAgICBbY2xhc3MuaWNvbi1jYXJldC1kb3duXT1cIiFleHBhbnNpb25TdGF0dXNbZXhlY3V0aW9uLmV4ZWN1dGlvbklkXT8ucnVsZXNldFwiXG4gICAgICAgICAgICBbY2xhc3MuaWNvbi1jYXJldC11cF09XCJleHBhbnNpb25TdGF0dXNbZXhlY3V0aW9uLmV4ZWN1dGlvbklkXT8ucnVsZXNldFwiPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInJ1bGVzZXQtcGFuZWwtZGVzY3JpcHRpb25cIiAqbmdJZj1cImV4cGFuc2lvblN0YXR1c1tleGVjdXRpb24uZXhlY3V0aW9uSWRdPy5ydWxlc2V0XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicnVsZXNcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlczogZXhlY3V0aW9uLnJ1bGVzZXRJbmZvcm1hdGlvbi5ydWxlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuc2lvbklEOiBleGVjdXRpb24uZXhlY3V0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaW5wdXRzXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBleGVjdXRpb24uaW5wdXRGYWN0c1xuICAgICAgICAgICAgICAgICAgICAgIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4ZWN1dGlvbi50eXBlID09PSAnUnVsZXNldEV4ZWN1dGlvbkVycm9yJzsgZWxzZSBzdWNjZXNzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJ1bGVzZXQtcGFuZWwtY2F0ZWdvcnktdGl0bGVcIj5SdWxlczo8L2Rpdj5cbiAgICAgICAgICA8dWwgY2xhc3M9XCJydWxlc2V0LXBhbmVsLWNhdGVnb3J5LWJvZHkgcnVsZS1kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBydWxlRXZhbHVhdGlvbiBvZiBleGVjdXRpb24ucnVsZXNFdmFsdWF0aW9uczsgbGV0IGluZGV4PWluZGV4O1wiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydWxlc2V0LXBhbmVsLXRpdGxlXCIgW2NsYXNzLmVycm9yXT1cInJ1bGVFdmFsdWF0aW9uLmVycm9yXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57e3J1bGVFdmFsdWF0aW9uLnJ1bGUubmFtZSB8IHRpdGxlY2FzZX19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2Fwc3VsZSBlcnJvclwiICpuZ0lmPVwicnVsZUV2YWx1YXRpb24uZXJyb3JcIj5FcnJvcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJ1bGVFdmFsdWF0aW9uLmVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnVsZXNldC1wYW5lbC1jYXRlZ29yeS10aXRsZVwiPkVycm9yOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJydWxlc2V0LXBhbmVsLWNhdGVnb3J5LWJvZHkgZXJyb3JcIj57e3J1bGVFdmFsdWF0aW9uLmVycm9yLm1lc3NhZ2V9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJpbnB1dHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0czogZXhlY3V0aW9uLmlucHV0RmFjdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUlucHV0czogZXhlY3V0aW9uLnJ1bGVzZXRJbmZvcm1hdGlvbj8ucnVsZXNbaW5kZXhdPy5pbnB1dFJ1bnRpbWVGYWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bzNyLXJ1bGUtYWN0aW9ucy1wcmVzICpuZ0lmPVwiIXJ1bGVFdmFsdWF0aW9uLmVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgW3RlbXBvcmFyeUZhY3RzXT1cInJ1bGVFdmFsdWF0aW9uLnRlbXBvcmFyeUZhY3RzXCJcbiAgICAgICAgICAgICAgICAgICAgW3J1bnRpbWVPdXRwdXRzXT1cImV4ZWN1dGlvbi5ydWxlc2V0SW5mb3JtYXRpb24/LnJ1bGVzW2luZGV4XT8ub3V0cHV0UnVudGltZUZhY3RzXCJcbiAgICAgICAgICAgICAgICAgID48L28zci1ydWxlLWFjdGlvbnMtcHJlcz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3N1Y2Nlc3M+XG4gICAgICAgICAgPG8zci1ydWxlLWFjdGlvbnMtcHJlcyBbYWN0aW9uc109XCJleGVjdXRpb24ub3V0cHV0QWN0aW9uc1wiPjwvbzNyLXJ1bGUtYWN0aW9ucy1wcmVzPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJydWxlc2V0LXBhbmVsLWNhdGVnb3J5LXRpdGxlXCI+RXhlY3V0ZWQgUnVsZXM8L2Rpdj5cbiAgICAgICAgICA8dWwgY2xhc3M9XCJydWxlLWRlc2NyaXB0aW9uIHJ1bGVzZXQtcGFuZWwtY2F0ZWdvcnktYm9keVwiPlxuICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBydWxlRXZhbHVhdGlvbiBvZiBleGVjdXRpb24ucnVsZXNFdmFsdWF0aW9uczsgbGV0IGluZGV4PWluZGV4O1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnVsZXNldC1wYW5lbC10aXRsZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7cnVsZUV2YWx1YXRpb24ucnVsZS5uYW1lIHwgdGl0bGVjYXNlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXBzdWxlIGluYWN0aXZlXCIgKm5nSWY9XCJydWxlRXZhbHVhdGlvbi5jYWNoZWRcIj5DYWNoZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXBzdWxlXCI+KHt7cnVsZUV2YWx1YXRpb24uZHVyYXRpb24gfCBudW1iZXI6IGV4ZWN1dGlvbkR1cmF0aW9uRm9ybWF0fX1tcyk8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwidHJpZ2dlcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInt0cmlnZ2VyczogKHJ1bGVFdmFsdWF0aW9uLnRyaWdnZXJzW3J1bGVFdmFsdWF0aW9uLnJ1bGUuaWRdKX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bzNyLXJ1bGUtYWN0aW9ucy1wcmVzXG4gICAgICAgICAgICAgICAgICBbYWN0aW9uc109XCJydWxlRXZhbHVhdGlvbi5vdXRwdXRBY3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgIFt0ZW1wb3JhcnlGYWN0c109XCJydWxlRXZhbHVhdGlvbi50ZW1wb3JhcnlGYWN0c1wiXG4gICAgICAgICAgICAgICAgICBbcnVudGltZU91dHB1dHNdPVwiZXhlY3V0aW9uLnJ1bGVzZXRJbmZvcm1hdGlvbj8ucnVsZXNbaW5kZXhdPy5vdXRwdXRSdW50aW1lRmFjdHNcIj5cbiAgICAgICAgICAgICAgICA8L28zci1ydWxlLWFjdGlvbnMtcHJlcz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2xpPlxuICA8L3VsPlxuPC9zZWN0aW9uPlxuXG48bmctdGVtcGxhdGUgbGV0LXRyaWdnZXJzPVwidHJpZ2dlcnNcIiAjdHJpZ2dlcnM+XG4gIDxkaXYgY2xhc3M9XCJydWxlc2V0LXBhbmVsLWNhdGVnb3J5LXRpdGxlXCI+QmFzZWZhY3RzIFRyaWdnZXJzPC9kaXY+XG4gIDx1bCBjbGFzcz1cInJ1bGVzZXQtcGFuZWwtY2F0ZWdvcnktYm9keSB0cmlnZ2Vyc1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRyaWdnZXIgb2YgKHRyaWdnZXJzIHwga2V5dmFsdWUpXCI+XG4gICAgICA8bGkgKm5nSWY9XCJ0cmlnZ2VyLnZhbHVlPy5mYWN0TmFtZVwiPlxuICAgICAgICA8bzNyLXJ1bGUta2V5LXZhbHVlLXByZXNcbiAgICAgICAgICBba2V5XT1cInRyaWdnZXIudmFsdWUuZmFjdE5hbWVcIlxuICAgICAgICAgIFtvbGRWYWx1ZV09XCJ0cmlnZ2VyLnZhbHVlLm9sZFZhbHVlIHwgbzNyRmFsbGJhY2tUb1wiXG4gICAgICAgICAgW3ZhbHVlXT1cInRyaWdnZXIudmFsdWUubmV3VmFsdWUgfCBvM3JGYWxsYmFja1RvXCJcbiAgICAgICAgICBbdHlwZV09XCInc3RhdGUnXCI+PC9vM3ItcnVsZS1rZXktdmFsdWUtcHJlcz5cbiAgICAgIDwvbGk+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvdWw+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgbGV0LXJ1bGVzPVwicnVsZXNcIiBsZXQtZXhwYW5zaW9uSUQ9XCJleHBhbnNpb25JRFwiICNydWxlcz5cbiAgPGRpdiBjbGFzcz1cInJ1bGVzZXQtcGFuZWwtY2F0ZWdvcnktdGl0bGUgcnVsZXNldC1leHBhbnNpb24tYWN0aW9uXCJcbiAgICAoY2xpY2spPVwidG9nZ2xlRXhwYW5zaW9uKGV4cGFuc2lvbklELCAncnVsZXNPdmVydmlldycpXCI+XG4gICAgPHNwYW4+UnVsZXMgT3ZlcnZpZXc8L3NwYW4+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImljb25cIlxuICAgICAgICAgICAgW2NsYXNzLmljb24tY2FyZXQtZG93bl09XCIhZXhwYW5zaW9uU3RhdHVzW2V4cGFuc2lvbklEXT8ucnVsZXNPdmVydmlld1wiXG4gICAgICAgICAgICBbY2xhc3MuaWNvbi1jYXJldC11cF09XCJleHBhbnNpb25TdGF0dXNbZXhwYW5zaW9uSURdPy5ydWxlc092ZXJ2aWV3XCI+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXhwYW5zaW9uU3RhdHVzW2V4cGFuc2lvbklEXT8ucnVsZXNPdmVydmlld1wiPlxuICAgIDxkaXYgKm5nSWY9XCJydWxlcz8ubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJydWxlc2V0LXBhbmVsLWNhdGVnb3J5LWJvZHkgZW1wdHlcIj5ObyBydWxlPC9kaXY+XG4gICAgPHVsIGNsYXNzPVwicnVsZXNldC1wYW5lbC1jYXRlZ29yeS1ib2R5XCIgKm5nSWY9XCJydWxlcz8ubGVuZ3RoID4gMFwiPlxuICAgICAgPGxpICpuZ0Zvcj1cImxldCBydWxlIG9mIHJ1bGVzXCI+XG4gICAgICAgIDxvM3ItcnVsZS10cmVlLXByZXMgW25hbWVdPVwicnVsZS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29uZGl0aW9uXT1cInJ1bGU/LnJvb3RFbGVtZW50Py5jb25kaXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtibG9ja1R5cGVdPVwicnVsZT8ucm9vdEVsZW1lbnQ/LmJsb2NrVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1Y2Nlc3NFbGVtZW50c109XCJydWxlPy5yb290RWxlbWVudD8uc3VjY2Vzc0VsZW1lbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmFpbHVyZUVsZW1lbnRzXT1cInJ1bGU/LnJvb3RFbGVtZW50Py5mYWlsdXJlRWxlbWVudHNcIj5cbiAgICAgICAgPC9vM3ItcnVsZS10cmVlLXByZXM+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIGxldC1pbnB1dHM9XCJpbnB1dHNcIiBsZXQtcnVudGltZUlucHV0cz1cInJ1bnRpbWVJbnB1dHNcIiAjaW5wdXRzPlxuICA8ZGl2IGNsYXNzPVwicnVsZXNldC1wYW5lbC1jYXRlZ29yeS10aXRsZVwiPklucHV0cyBzbmFwc2hvdDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwiaW5wdXRzPy5sZW5ndGggPT09IDBcIiBjbGFzcz1cInJ1bGVzZXQtcGFuZWwtY2F0ZWdvcnktYm9keSBlbXB0eVwiPk5vIGlucHV0czwvZGl2PlxuICA8dWwgY2xhc3M9XCJydWxlc2V0LXBhbmVsLWNhdGVnb3J5LWJvZHlcIiAqbmdJZj1cImlucHV0cz8ubGVuZ3RoID4gMFwiPlxuICAgIDxsaSAqbmdGb3I9XCJsZXQgaW5wdXQgb2YgaW5wdXRzXCI+XG4gICAgICA8bzNyLXJ1bGUta2V5LXZhbHVlLXByZXNcbiAgICAgICAgW2tleV09XCJpbnB1dC5mYWN0TmFtZVwiXG4gICAgICAgIFt2YWx1ZV09XCJpbnB1dC52YWx1ZSB8IG8zckZhbGxiYWNrVG9cIlxuICAgICAgICBbdHlwZV09XCInc3RhdGUnXCI+PC9vM3ItcnVsZS1rZXktdmFsdWUtcHJlcz5cbiAgICA8L2xpPlxuICAgIDxsaSAqbmdGb3I9XCJsZXQgaW5wdXQgb2YgcnVudGltZUlucHV0c1wiPnt7aW5wdXR9fSAoc2NvcGUgbGltaXRlZCB0byBydWxlc2V0KTwvbGk+XG4gIDwvdWw+XG48L25nLXRlbXBsYXRlPlxuIl19
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZXNldC1oaXN0b3J5LXByZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcnVsZXMtZW5naW5lL3J1bGVzZXQtaGlzdG9yeS9ydWxlc2V0LWhpc3RvcnktcHJlcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9ydWxlcy1lbmdpbmUvcnVsZXNldC1oaXN0b3J5L3J1bGVzZXQtaGlzdG9yeS1wcmVzLnRlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7QUFxQmhILE1BQU0sT0FBTywyQkFBMkI7SUFtQnRDLFlBQTZCLEVBQXFCO1FBQXJCLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBbEJsRDs7Ozs7Ozs7V0FRRztRQUNJLG9CQUFlLEdBQW9ELEVBQUUsQ0FBQztRQUl0RSxzQkFBaUIsR0FBNEIsRUFBRSxDQUFDO1FBR2hELDRCQUF1QixHQUFHLE9BQU8sQ0FBQztJQUVZLENBQUM7SUFFdEQ7Ozs7T0FJRztJQUNJLGVBQWUsQ0FBQyxNQUFjLEVBQUUsUUFBZ0I7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQztRQUNwRCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25GLENBQUM7UUFDRCxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzFCLENBQUM7aUlBakNVLDJCQUEyQjtxSEFBM0IsMkJBQTJCLHdLQ3JCeEMseXFRQXlKQTs7MkZEcElhLDJCQUEyQjtrQkFQdkMsU0FBUzsrQkFDRSwwQkFBMEIsbUJBR25CLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUk7c0ZBZ0I5QixpQkFBaUI7c0JBRHZCLEtBQUs7Z0JBSUMsdUJBQXVCO3NCQUQ3QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIElucHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBSdWxlc2V0LCBSdWxlc2V0RXhlY3V0aW9uRXJyb3JFdmVudCwgUnVsZXNldEV4ZWN1dGlvbkV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vZW5naW5lJztcblxuZXhwb3J0IHR5cGUgUnVsZXNldEV4ZWN1dGlvblN0YXR1cyA9ICdFcnJvcicgfCAnQWN0aXZlJyB8ICdEZWFjdGl2YXRlZCcgfCAnTm9FZmZlY3QnO1xuLyoqXG4gKiBNb2RlbCBvZiBhIFJ1bGVzZXRFeGVjdXRpb24gd2l0aCBtb3JlIGluZm9ybWF0aW9uIGZvciBkZWJ1ZyBwdXJwb3NlXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bGVzZXRFeGVjdXRpb25EZWJ1ZyA9IChSdWxlc2V0RXhlY3V0aW9uRXZlbnQgfCBSdWxlc2V0RXhlY3V0aW9uRXJyb3JFdmVudCkgJiB7XG4gIGlzQWN0aXZlOiBib29sZWFuO1xuICBzdGF0dXM6IFJ1bGVzZXRFeGVjdXRpb25TdGF0dXM7XG4gIHJ1bGVzZXRJbmZvcm1hdGlvbjogUnVsZXNldCB8IHVuZGVmaW5lZDtcbn07XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbzNyLXJ1bGVzZXQtaGlzdG9yeS1wcmVzJyxcbiAgc3R5bGVVcmxzOiBbJy4vcnVsZXNldC1oaXN0b3J5LXByZXMuc3R5bGUuc2NzcyddLFxuICB0ZW1wbGF0ZVVybDogJy4vcnVsZXNldC1oaXN0b3J5LXByZXMudGVtcGxhdGUuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFJ1bGVzZXRIaXN0b3J5UHJlc0NvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBSZWZsZWN0cyB0aGUgc3RhdGUgb2YgZWFjaCBydWxlc2V0IGV4cGFuZGVkIGVsZW1lbnRzLlxuICAgKiBFYWNoIHJ1bGVzZXQgZW50cnkgY29udGFpbnMgYSBsaXN0IG9mIHN1YnBhbmVsIHRoYXQgY2FuIGJlIGNvbGxhcHNlZCBvciBleHBhbmRlZC5cbiAgICogUnVsZXNldCB3aG9sZSBwYW5lbCBzdGF0dXMgaXMgc3RvcmUgdGhlICdydWxlc2V0JyBlbnRyeS5cbiAgICogQGV4YW1wbGVcbiAgICogRXhwYW5kZWQgcnVsZXNldCB3aXRoIHJ1bGUgb3ZlcnZpZXcgY29sbGFwc2VkOlxuICAgKiB7J3J1bGVzZXRJZCc6IHsncnVsZXNldCcgOiB0cnVlLCAncnVsZU92ZXJ2aWV3JzogZmFsc2V9fVxuICAgKiBAbm90ZSBDb2xsYXBzaW5nIGEgcnVsZXNldCB3aWxsIG5vdCByZXNldCB0aGUgc3VicGFuZWwgZXhwYW5zaW9uIHN0YXR1c1xuICAgKi9cbiAgcHVibGljIGV4cGFuc2lvblN0YXR1czoge1trZXk6IHN0cmluZ106IHtbc3VicGFuZWw6IHN0cmluZ106IGJvb2xlYW59IH0gPSB7fTtcblxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBydWxlc2V0RXhlY3V0aW9uczogUnVsZXNldEV4ZWN1dGlvbkRlYnVnW10gPSBbXTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZXhlY3V0aW9uRHVyYXRpb25Gb3JtYXQgPSAnMS4zLTMnO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgYSBydWxlc2V0IHN1YnBhbmVsXG4gICAqIEBwYXJhbSBydWxlSWRcbiAgICogQHBhcmFtIHN1YnBhbmVsIGVsZW1lbnQgdG8gY29sbGFwc2UuICdydWxlc2V0JyB3aWxsIHRvZ2dsZSB0aGUgd2hvbGUgcGFuZWwgYnV0IHdvbid0IHJlc2V0IHRoZSBzdWJwYW5lbHMgc3RhdGVzLlxuICAgKi9cbiAgcHVibGljIHRvZ2dsZUV4cGFuc2lvbihydWxlSWQ6IHN0cmluZywgc3VicGFuZWw6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5leHBhbnNpb25TdGF0dXNbcnVsZUlkXSkge1xuICAgICAgdGhpcy5leHBhbnNpb25TdGF0dXNbcnVsZUlkXSA9IHtbc3VicGFuZWxdOiB0cnVlfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5leHBhbnNpb25TdGF0dXNbcnVsZUlkXVtzdWJwYW5lbF0gPSAhdGhpcy5leHBhbnNpb25TdGF0dXNbcnVsZUlkXVtzdWJwYW5lbF07XG4gICAgfVxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG59XG4iLCI8c2VjdGlvbj5cbiAgPGg0IGNsYXNzPVwibWItNFwiPlJ1bGVzZXQgRXhlY3V0aW9uIEhpc3Rvcnk8L2g0PlxuICA8bmctdGVtcGxhdGUgI25vUnVsZXNFbmdpbmU+XG4gICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlciBtLTJcIiByb2xlPVwiYWxlcnRcIj5cbiAgICAgIFRoZSBSdWxlcyBFbmdpbmUgaXMgbm90IGNvbmZpZ3VyZWQgb24gdGhpcyBwYWdlLlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuICA8dWwgKm5nSWY9XCJydWxlc2V0RXhlY3V0aW9uczsgZWxzZSBub1J1bGVzRW5naW5lXCIgY2xhc3M9XCJydWxlc2V0c1wiPlxuICAgIDxsaSAqbmdGb3I9XCJsZXQgZXhlY3V0aW9uIG9mIHJ1bGVzZXRFeGVjdXRpb25zXCIgY2xhc3M9XCJydWxlc2V0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicnVsZXNldC1wYW5lbC10aXRsZSBydWxlc2V0LWV4cGFuc2lvbi1hY3Rpb25cIlxuICAgICAgICBbY2xhc3MuZXJyb3JdPVwiZXhlY3V0aW9uLnR5cGUgPT09ICdSdWxlc2V0RXhlY3V0aW9uRXJyb3InXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUV4cGFuc2lvbihleGVjdXRpb24uZXhlY3V0aW9uSWQsICdydWxlc2V0JylcIj5cbiAgICAgICAgPGRpdj48c3BhbiBbdGl0bGVdPVwiJ1RoaXMgcnVsZXNldCBoYXMgYmVlbiBldmFsdWF0ZWQgJyArIGV4ZWN1dGlvbi5leGVjdXRpb25Db3VudGVyICsgJyB0aW1lKHMpJ1wiPnt7ZXhlY3V0aW9uLmV4ZWN1dGlvbkNvdW50ZXJ9fTwvc3Bhbj4gLSB7e2V4ZWN1dGlvbi5ydWxlc2V0TmFtZSB8IHRpdGxlY2FzZSB9fVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJydWxlc2V0LXBhbmVsLXN1YnRpdGxlXCIgKm5nSWY9XCJleGVjdXRpb24ucnVsZXNldEluZm9ybWF0aW9uPy5saW5rZWRDb21wb25lbnQgYXMgbGlua2VkQ29tcG9uZW50XCI+XG4gICAgICAgICAgICB7e2xpbmtlZENvbXBvbmVudC5uYW1lfX0ge3tsaW5rZWRDb21wb25lbnQubGlicmFyeX19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJ1bGVzZXQtcGFuZWwtc3VidGl0bGVcIiAqbmdJZj1cImV4ZWN1dGlvbi5ydWxlc2V0SW5mb3JtYXRpb24/LnZhbGlkaXR5UmFuZ2UgYXMgdmFsaWRpdHlSYW5nZVwiPlxuICAgICAgICAgICAgRGF0ZSByYW5nZToge3t2YWxpZGl0eVJhbmdlLmZyb219fSAtIHt7dmFsaWRpdHlSYW5nZS50b319XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicnVsZXNldC1wYW5lbC10aXRsZS1hc2lkZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3IgY2Fwc3VsZVwiICpuZ0lmPVwiZXhlY3V0aW9uLnN0YXR1cyA9PT0gJ0Vycm9yJ1wiPkVycm9yPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VjY2VzcyBjYXBzdWxlXCIgKm5nSWY9XCJleGVjdXRpb24uc3RhdHVzID09PSAnQWN0aXZlJ1wiPkFwcGxpZWQ8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbmFjdGl2ZSBjYXBzdWxlXCIgKm5nSWY9XCJleGVjdXRpb24uc3RhdHVzID09PSAnRGVhY3RpdmF0ZWQnXCI+RGVhY3RpdmF0ZWQ8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ3YXJuIGNhcHN1bGVcIiAqbmdJZj1cImV4ZWN1dGlvbi5zdGF0dXMgPT09ICdOb0VmZmVjdCdcIj5ObyBlZmZlY3Q8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lIGNhcHN1bGVcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7ZXhlY3V0aW9uLnRpbWVzdGFtcCB8IGRhdGU6ICdISDptbTpzcyBTU1MnfX08L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj4oe3tleGVjdXRpb24uZHVyYXRpb24gfCBudW1iZXI6IGV4ZWN1dGlvbkR1cmF0aW9uRm9ybWF0fX1tcyk8L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiaWNvblwiXG4gICAgICAgICAgICBbY2xhc3MuaWNvbi1jYXJldC1kb3duXT1cIiFleHBhbnNpb25TdGF0dXNbZXhlY3V0aW9uLmV4ZWN1dGlvbklkXT8ucnVsZXNldFwiXG4gICAgICAgICAgICBbY2xhc3MuaWNvbi1jYXJldC11cF09XCJleHBhbnNpb25TdGF0dXNbZXhlY3V0aW9uLmV4ZWN1dGlvbklkXT8ucnVsZXNldFwiPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInJ1bGVzZXQtcGFuZWwtZGVzY3JpcHRpb25cIiAqbmdJZj1cImV4cGFuc2lvblN0YXR1c1tleGVjdXRpb24uZXhlY3V0aW9uSWRdPy5ydWxlc2V0XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicnVsZXNcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlczogZXhlY3V0aW9uLnJ1bGVzZXRJbmZvcm1hdGlvbi5ydWxlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuc2lvbklEOiBleGVjdXRpb24uZXhlY3V0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaW5wdXRzXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBleGVjdXRpb24uaW5wdXRGYWN0c1xuICAgICAgICAgICAgICAgICAgICAgIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4ZWN1dGlvbi50eXBlID09PSAnUnVsZXNldEV4ZWN1dGlvbkVycm9yJzsgZWxzZSBzdWNjZXNzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJ1bGVzZXQtcGFuZWwtY2F0ZWdvcnktdGl0bGVcIj5SdWxlczo8L2Rpdj5cbiAgICAgICAgICA8dWwgY2xhc3M9XCJydWxlc2V0LXBhbmVsLWNhdGVnb3J5LWJvZHkgcnVsZS1kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBydWxlRXZhbHVhdGlvbiBvZiBleGVjdXRpb24ucnVsZXNFdmFsdWF0aW9uczsgbGV0IGluZGV4PWluZGV4O1wiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydWxlc2V0LXBhbmVsLXRpdGxlXCIgW2NsYXNzLmVycm9yXT1cInJ1bGVFdmFsdWF0aW9uLmVycm9yXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57e3J1bGVFdmFsdWF0aW9uLnJ1bGUubmFtZSB8IHRpdGxlY2FzZX19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2Fwc3VsZSBlcnJvclwiICpuZ0lmPVwicnVsZUV2YWx1YXRpb24uZXJyb3JcIj5FcnJvcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJ1bGVFdmFsdWF0aW9uLmVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnVsZXNldC1wYW5lbC1jYXRlZ29yeS10aXRsZVwiPkVycm9yOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz1cInJ1bGVzZXQtcGFuZWwtY2F0ZWdvcnktYm9keSBlcnJvclwiPnt7cnVsZUV2YWx1YXRpb24uZXJyb3IgfCBqc29ufX08L3ByZT5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJpbnB1dHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0czogZXhlY3V0aW9uLmlucHV0RmFjdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUlucHV0czogZXhlY3V0aW9uLnJ1bGVzZXRJbmZvcm1hdGlvbj8ucnVsZXNbaW5kZXhdPy5pbnB1dFJ1bnRpbWVGYWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bzNyLXJ1bGUtYWN0aW9ucy1wcmVzICpuZ0lmPVwiIXJ1bGVFdmFsdWF0aW9uLmVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgW3RlbXBvcmFyeUZhY3RzXT1cInJ1bGVFdmFsdWF0aW9uLnRlbXBvcmFyeUZhY3RzXCJcbiAgICAgICAgICAgICAgICAgICAgW3J1bnRpbWVPdXRwdXRzXT1cImV4ZWN1dGlvbi5ydWxlc2V0SW5mb3JtYXRpb24/LnJ1bGVzW2luZGV4XT8ub3V0cHV0UnVudGltZUZhY3RzXCJcbiAgICAgICAgICAgICAgICAgID48L28zci1ydWxlLWFjdGlvbnMtcHJlcz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3N1Y2Nlc3M+XG4gICAgICAgICAgPG8zci1ydWxlLWFjdGlvbnMtcHJlcyBbYWN0aW9uc109XCJleGVjdXRpb24ub3V0cHV0QWN0aW9uc1wiPjwvbzNyLXJ1bGUtYWN0aW9ucy1wcmVzPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJydWxlc2V0LXBhbmVsLWNhdGVnb3J5LXRpdGxlXCI+RXhlY3V0ZWQgUnVsZXM8L2Rpdj5cbiAgICAgICAgICA8dWwgY2xhc3M9XCJydWxlLWRlc2NyaXB0aW9uIHJ1bGVzZXQtcGFuZWwtY2F0ZWdvcnktYm9keVwiPlxuICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBydWxlRXZhbHVhdGlvbiBvZiBleGVjdXRpb24ucnVsZXNFdmFsdWF0aW9uczsgbGV0IGluZGV4PWluZGV4O1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnVsZXNldC1wYW5lbC10aXRsZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7cnVsZUV2YWx1YXRpb24ucnVsZS5uYW1lIHwgdGl0bGVjYXNlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXBzdWxlIGluYWN0aXZlXCIgKm5nSWY9XCJydWxlRXZhbHVhdGlvbi5jYWNoZWRcIj5DYWNoZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXBzdWxlXCI+KHt7cnVsZUV2YWx1YXRpb24uZHVyYXRpb24gfCBudW1iZXI6IGV4ZWN1dGlvbkR1cmF0aW9uRm9ybWF0fX1tcyk8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwidHJpZ2dlcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInt0cmlnZ2VyczogKHJ1bGVFdmFsdWF0aW9uLnRyaWdnZXJzW3J1bGVFdmFsdWF0aW9uLnJ1bGUuaWRdKX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bzNyLXJ1bGUtYWN0aW9ucy1wcmVzXG4gICAgICAgICAgICAgICAgICBbYWN0aW9uc109XCJydWxlRXZhbHVhdGlvbi5vdXRwdXRBY3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgIFt0ZW1wb3JhcnlGYWN0c109XCJydWxlRXZhbHVhdGlvbi50ZW1wb3JhcnlGYWN0c1wiXG4gICAgICAgICAgICAgICAgICBbcnVudGltZU91dHB1dHNdPVwiZXhlY3V0aW9uLnJ1bGVzZXRJbmZvcm1hdGlvbj8ucnVsZXNbaW5kZXhdPy5vdXRwdXRSdW50aW1lRmFjdHNcIj5cbiAgICAgICAgICAgICAgICA8L28zci1ydWxlLWFjdGlvbnMtcHJlcz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2xpPlxuICA8L3VsPlxuPC9zZWN0aW9uPlxuXG48bmctdGVtcGxhdGUgbGV0LXRyaWdnZXJzPVwidHJpZ2dlcnNcIiAjdHJpZ2dlcnM+XG4gIDxkaXYgY2xhc3M9XCJydWxlc2V0LXBhbmVsLWNhdGVnb3J5LXRpdGxlXCI+QmFzZWZhY3RzIFRyaWdnZXJzPC9kaXY+XG4gIDx1bCBjbGFzcz1cInJ1bGVzZXQtcGFuZWwtY2F0ZWdvcnktYm9keSB0cmlnZ2Vyc1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRyaWdnZXIgb2YgKHRyaWdnZXJzIHwga2V5dmFsdWUpXCI+XG4gICAgICA8bGkgKm5nSWY9XCJ0cmlnZ2VyLnZhbHVlPy5mYWN0TmFtZVwiPlxuICAgICAgICA8bzNyLXJ1bGUta2V5LXZhbHVlLXByZXNcbiAgICAgICAgICBba2V5XT1cInRyaWdnZXIudmFsdWUuZmFjdE5hbWVcIlxuICAgICAgICAgIFtvbGRWYWx1ZV09XCJ0cmlnZ2VyLnZhbHVlLm9sZFZhbHVlIHwgbzNyRmFsbGJhY2tUb1wiXG4gICAgICAgICAgW3ZhbHVlXT1cInRyaWdnZXIudmFsdWUubmV3VmFsdWUgfCBvM3JGYWxsYmFja1RvXCJcbiAgICAgICAgICBbdHlwZV09XCInc3RhdGUnXCI+PC9vM3ItcnVsZS1rZXktdmFsdWUtcHJlcz5cbiAgICAgIDwvbGk+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvdWw+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgbGV0LXJ1bGVzPVwicnVsZXNcIiBsZXQtZXhwYW5zaW9uSUQ9XCJleHBhbnNpb25JRFwiICNydWxlcz5cbiAgPGRpdiBjbGFzcz1cInJ1bGVzZXQtcGFuZWwtY2F0ZWdvcnktdGl0bGUgcnVsZXNldC1leHBhbnNpb24tYWN0aW9uXCJcbiAgICAoY2xpY2spPVwidG9nZ2xlRXhwYW5zaW9uKGV4cGFuc2lvbklELCAncnVsZXNPdmVydmlldycpXCI+XG4gICAgPHNwYW4+UnVsZXMgT3ZlcnZpZXc8L3NwYW4+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImljb25cIlxuICAgICAgICAgICAgW2NsYXNzLmljb24tY2FyZXQtZG93bl09XCIhZXhwYW5zaW9uU3RhdHVzW2V4cGFuc2lvbklEXT8ucnVsZXNPdmVydmlld1wiXG4gICAgICAgICAgICBbY2xhc3MuaWNvbi1jYXJldC11cF09XCJleHBhbnNpb25TdGF0dXNbZXhwYW5zaW9uSURdPy5ydWxlc092ZXJ2aWV3XCI+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXhwYW5zaW9uU3RhdHVzW2V4cGFuc2lvbklEXT8ucnVsZXNPdmVydmlld1wiPlxuICAgIDxkaXYgKm5nSWY9XCJydWxlcz8ubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJydWxlc2V0LXBhbmVsLWNhdGVnb3J5LWJvZHkgZW1wdHlcIj5ObyBydWxlPC9kaXY+XG4gICAgPHVsIGNsYXNzPVwicnVsZXNldC1wYW5lbC1jYXRlZ29yeS1ib2R5XCIgKm5nSWY9XCJydWxlcz8ubGVuZ3RoID4gMFwiPlxuICAgICAgPGxpICpuZ0Zvcj1cImxldCBydWxlIG9mIHJ1bGVzXCI+XG4gICAgICAgIDxvM3ItcnVsZS10cmVlLXByZXMgW25hbWVdPVwicnVsZS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29uZGl0aW9uXT1cInJ1bGU/LnJvb3RFbGVtZW50Py5jb25kaXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtibG9ja1R5cGVdPVwicnVsZT8ucm9vdEVsZW1lbnQ/LmJsb2NrVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1Y2Nlc3NFbGVtZW50c109XCJydWxlPy5yb290RWxlbWVudD8uc3VjY2Vzc0VsZW1lbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmFpbHVyZUVsZW1lbnRzXT1cInJ1bGU/LnJvb3RFbGVtZW50Py5mYWlsdXJlRWxlbWVudHNcIj5cbiAgICAgICAgPC9vM3ItcnVsZS10cmVlLXByZXM+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIGxldC1pbnB1dHM9XCJpbnB1dHNcIiBsZXQtcnVudGltZUlucHV0cz1cInJ1bnRpbWVJbnB1dHNcIiAjaW5wdXRzPlxuICA8ZGl2IGNsYXNzPVwicnVsZXNldC1wYW5lbC1jYXRlZ29yeS10aXRsZVwiPklucHV0cyBzbmFwc2hvdDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwiaW5wdXRzPy5sZW5ndGggPT09IDBcIiBjbGFzcz1cInJ1bGVzZXQtcGFuZWwtY2F0ZWdvcnktYm9keSBlbXB0eVwiPk5vIGlucHV0czwvZGl2PlxuICA8dWwgY2xhc3M9XCJydWxlc2V0LXBhbmVsLWNhdGVnb3J5LWJvZHlcIiAqbmdJZj1cImlucHV0cz8ubGVuZ3RoID4gMFwiPlxuICAgIDxsaSAqbmdGb3I9XCJsZXQgaW5wdXQgb2YgaW5wdXRzXCI+XG4gICAgICA8bzNyLXJ1bGUta2V5LXZhbHVlLXByZXNcbiAgICAgICAgW2tleV09XCJpbnB1dC5mYWN0TmFtZVwiXG4gICAgICAgIFt2YWx1ZV09XCJpbnB1dC52YWx1ZSB8IG8zckZhbGxiYWNrVG9cIlxuICAgICAgICBbdHlwZV09XCInc3RhdGUnXCI+PC9vM3ItcnVsZS1rZXktdmFsdWUtcHJlcz5cbiAgICA8L2xpPlxuICAgIDxsaSAqbmdGb3I9XCJsZXQgaW5wdXQgb2YgcnVudGltZUlucHV0c1wiPnt7aW5wdXR9fSAoc2NvcGUgbGltaXRlZCB0byBydWxlc2V0KTwvbGk+XG4gIDwvdWw+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -1,4 +1,4 @@
1
- import { CommonModule } from '@angular/common';
1
+ import { CommonModule, JsonPipe } from '@angular/common';
2
2
  import { NgModule } from '@angular/core';
3
3
  import { RuleActionsPresComponent } from '../rule-actions/rule-actions-pres.component';
4
4
  import { RuleConditionPresComponent } from '../rule-condition/rule-condition-pres.component';
@@ -9,15 +9,15 @@ import { RulesetHistoryPresComponent } from './ruleset-history-pres.component';
9
9
  import * as i0 from "@angular/core";
10
10
  export class RulesetHistoryPresModule {
11
11
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: RulesetHistoryPresModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
12
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.2.1", ngImport: i0, type: RulesetHistoryPresModule, declarations: [RulesetHistoryPresComponent, RuleConditionPresComponent, RuleTreePresComponent, RuleActionsPresComponent, RuleKeyValuePresComponent], imports: [O3rFallbackToPipe, CommonModule, CommonModule, CommonModule], exports: [RulesetHistoryPresComponent] }); }
12
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.2.1", ngImport: i0, type: RulesetHistoryPresModule, declarations: [RulesetHistoryPresComponent, RuleConditionPresComponent, RuleTreePresComponent, RuleActionsPresComponent, RuleKeyValuePresComponent], imports: [O3rFallbackToPipe, CommonModule, CommonModule, CommonModule, JsonPipe], exports: [RulesetHistoryPresComponent] }); }
13
13
  /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: RulesetHistoryPresModule, imports: [CommonModule, CommonModule, CommonModule] }); }
14
14
  }
15
15
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: RulesetHistoryPresModule, decorators: [{
16
16
  type: NgModule,
17
17
  args: [{
18
- imports: [O3rFallbackToPipe, CommonModule, CommonModule, CommonModule],
18
+ imports: [O3rFallbackToPipe, CommonModule, CommonModule, CommonModule, JsonPipe],
19
19
  declarations: [RulesetHistoryPresComponent, RuleConditionPresComponent, RuleTreePresComponent, RuleActionsPresComponent, RuleKeyValuePresComponent],
20
20
  exports: [RulesetHistoryPresComponent]
21
21
  }]
22
22
  }] });
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZXNldC1oaXN0b3J5LXByZXMubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcnVsZXMtZW5naW5lL3J1bGVzZXQtaGlzdG9yeS9ydWxlc2V0LWhpc3RvcnktcHJlcy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDdkYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDN0YsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDNUYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7O0FBTy9FLE1BQU0sT0FBTyx3QkFBd0I7aUlBQXhCLHdCQUF3QjtrSUFBeEIsd0JBQXdCLGlCQUhwQiwyQkFBMkIsRUFBRSwwQkFBMEIsRUFBRSxxQkFBcUIsRUFBRSx3QkFBd0IsRUFBRSx5QkFBeUIsYUFEeEksaUJBQWlCLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLGFBRTNELDJCQUEyQjtrSUFFMUIsd0JBQXdCLFlBSk4sWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZOzsyRkFJMUQsd0JBQXdCO2tCQUxwQyxRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFDO29CQUN0RSxZQUFZLEVBQUUsQ0FBQywyQkFBMkIsRUFBRSwwQkFBMEIsRUFBRSxxQkFBcUIsRUFBRSx3QkFBd0IsRUFBRSx5QkFBeUIsQ0FBQztvQkFDbkosT0FBTyxFQUFFLENBQUMsMkJBQTJCLENBQUM7aUJBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSdWxlQWN0aW9uc1ByZXNDb21wb25lbnQgfSBmcm9tICcuLi9ydWxlLWFjdGlvbnMvcnVsZS1hY3Rpb25zLXByZXMuY29tcG9uZW50JztcbmltcG9ydCB7IFJ1bGVDb25kaXRpb25QcmVzQ29tcG9uZW50IH0gZnJvbSAnLi4vcnVsZS1jb25kaXRpb24vcnVsZS1jb25kaXRpb24tcHJlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUnVsZUtleVZhbHVlUHJlc0NvbXBvbmVudCB9IGZyb20gJy4uL3J1bGUta2V5LXZhbHVlL3J1bGUta2V5LXZhbHVlLXByZXMuY29tcG9uZW50JztcbmltcG9ydCB7IFJ1bGVUcmVlUHJlc0NvbXBvbmVudCB9IGZyb20gJy4uL3J1bGUtdHJlZS9ydWxlLXRyZWUtcHJlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgTzNyRmFsbGJhY2tUb1BpcGUgfSBmcm9tICcuLi9zaGFyZWQvaW5kZXgnO1xuaW1wb3J0IHsgUnVsZXNldEhpc3RvcnlQcmVzQ29tcG9uZW50IH0gZnJvbSAnLi9ydWxlc2V0LWhpc3RvcnktcHJlcy5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbTzNyRmFsbGJhY2tUb1BpcGUsIENvbW1vbk1vZHVsZSwgQ29tbW9uTW9kdWxlLCBDb21tb25Nb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtSdWxlc2V0SGlzdG9yeVByZXNDb21wb25lbnQsIFJ1bGVDb25kaXRpb25QcmVzQ29tcG9uZW50LCBSdWxlVHJlZVByZXNDb21wb25lbnQsIFJ1bGVBY3Rpb25zUHJlc0NvbXBvbmVudCwgUnVsZUtleVZhbHVlUHJlc0NvbXBvbmVudF0sXG4gIGV4cG9ydHM6IFtSdWxlc2V0SGlzdG9yeVByZXNDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIFJ1bGVzZXRIaXN0b3J5UHJlc01vZHVsZSB7fVxuIl19
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZXNldC1oaXN0b3J5LXByZXMubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcnVsZXMtZW5naW5lL3J1bGVzZXQtaGlzdG9yeS9ydWxlc2V0LWhpc3RvcnktcHJlcy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQzdGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQzVGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOztBQU8vRSxNQUFNLE9BQU8sd0JBQXdCO2lJQUF4Qix3QkFBd0I7a0lBQXhCLHdCQUF3QixpQkFIcEIsMkJBQTJCLEVBQUUsMEJBQTBCLEVBQUUscUJBQXFCLEVBQUUsd0JBQXdCLEVBQUUseUJBQXlCLGFBRHhJLGlCQUFpQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFFBQVEsYUFFckUsMkJBQTJCO2tJQUUxQix3QkFBd0IsWUFKTixZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVk7OzJGQUkxRCx3QkFBd0I7a0JBTHBDLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDO29CQUNoRixZQUFZLEVBQUUsQ0FBQywyQkFBMkIsRUFBRSwwQkFBMEIsRUFBRSxxQkFBcUIsRUFBRSx3QkFBd0IsRUFBRSx5QkFBeUIsQ0FBQztvQkFDbkosT0FBTyxFQUFFLENBQUMsMkJBQTJCLENBQUM7aUJBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBKc29uUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUnVsZUFjdGlvbnNQcmVzQ29tcG9uZW50IH0gZnJvbSAnLi4vcnVsZS1hY3Rpb25zL3J1bGUtYWN0aW9ucy1wcmVzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSdWxlQ29uZGl0aW9uUHJlc0NvbXBvbmVudCB9IGZyb20gJy4uL3J1bGUtY29uZGl0aW9uL3J1bGUtY29uZGl0aW9uLXByZXMuY29tcG9uZW50JztcbmltcG9ydCB7IFJ1bGVLZXlWYWx1ZVByZXNDb21wb25lbnQgfSBmcm9tICcuLi9ydWxlLWtleS12YWx1ZS9ydWxlLWtleS12YWx1ZS1wcmVzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSdWxlVHJlZVByZXNDb21wb25lbnQgfSBmcm9tICcuLi9ydWxlLXRyZWUvcnVsZS10cmVlLXByZXMuY29tcG9uZW50JztcbmltcG9ydCB7IE8zckZhbGxiYWNrVG9QaXBlIH0gZnJvbSAnLi4vc2hhcmVkL2luZGV4JztcbmltcG9ydCB7IFJ1bGVzZXRIaXN0b3J5UHJlc0NvbXBvbmVudCB9IGZyb20gJy4vcnVsZXNldC1oaXN0b3J5LXByZXMuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW08zckZhbGxiYWNrVG9QaXBlLCBDb21tb25Nb2R1bGUsIENvbW1vbk1vZHVsZSwgQ29tbW9uTW9kdWxlLCBKc29uUGlwZV0sXG4gIGRlY2xhcmF0aW9uczogW1J1bGVzZXRIaXN0b3J5UHJlc0NvbXBvbmVudCwgUnVsZUNvbmRpdGlvblByZXNDb21wb25lbnQsIFJ1bGVUcmVlUHJlc0NvbXBvbmVudCwgUnVsZUFjdGlvbnNQcmVzQ29tcG9uZW50LCBSdWxlS2V5VmFsdWVQcmVzQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW1J1bGVzZXRIaXN0b3J5UHJlc0NvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgUnVsZXNldEhpc3RvcnlQcmVzTW9kdWxlIHt9XG4iXX0=
@@ -1,5 +1,5 @@
1
1
  import * as i1 from '@angular/common';
2
- import { CommonModule } from '@angular/common';
2
+ import { CommonModule, JsonPipe } from '@angular/common';
3
3
  import * as i0 from '@angular/core';
4
4
  import { Component, ChangeDetectionStrategy, ViewEncapsulation, Input, Pipe, NgModule, Injectable, InjectionToken, Optional, Inject } from '@angular/core';
5
5
  import { Subject, of, from, ReplaySubject, Observable, combineLatest, BehaviorSubject, merge, firstValueFrom, Subscription, fromEvent } from 'rxjs';
@@ -284,11 +284,11 @@ class RulesetHistoryPresComponent {
284
284
  this.cd.detectChanges();
285
285
  }
286
286
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: RulesetHistoryPresComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
287
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.1", type: RulesetHistoryPresComponent, selector: "o3r-ruleset-history-pres", inputs: { rulesetExecutions: "rulesetExecutions", executionDurationFormat: "executionDurationFormat" }, ngImport: i0, template: "<section>\n <h4 class=\"mb-4\">Ruleset Execution History</h4>\n <ng-template #noRulesEngine>\n <div class=\"alert alert-danger m-2\" role=\"alert\">\n The Rules Engine is not configured on this page.\n </div>\n </ng-template>\n <ul *ngIf=\"rulesetExecutions; else noRulesEngine\" class=\"rulesets\">\n <li *ngFor=\"let execution of rulesetExecutions\" class=\"ruleset\">\n <div class=\"ruleset-panel-title ruleset-expansion-action\"\n [class.error]=\"execution.type === 'RulesetExecutionError'\"\n (click)=\"toggleExpansion(execution.executionId, 'ruleset')\">\n <div><span [title]=\"'This ruleset has been evaluated ' + execution.executionCounter + ' time(s)'\">{{execution.executionCounter}}</span> - {{execution.rulesetName | titlecase }}\n <div class=\"ruleset-panel-subtitle\" *ngIf=\"execution.rulesetInformation?.linkedComponent as linkedComponent\">\n {{linkedComponent.name}} {{linkedComponent.library}}\n </div>\n <div class=\"ruleset-panel-subtitle\" *ngIf=\"execution.rulesetInformation?.validityRange as validityRange\">\n Date range: {{validityRange.from}} - {{validityRange.to}}\n </div>\n </div>\n <div class=\"ruleset-panel-title-aside\">\n <span class=\"error capsule\" *ngIf=\"execution.status === 'Error'\">Error</span>\n <span class=\"success capsule\" *ngIf=\"execution.status === 'Active'\">Applied</span>\n <span class=\"inactive capsule\" *ngIf=\"execution.status === 'Deactivated'\">Deactivated</span>\n <span class=\"warn capsule\" *ngIf=\"execution.status === 'NoEffect'\">No effect</span>\n <span class=\"time capsule\">\n <span>{{execution.timestamp | date: 'HH:mm:ss SSS'}}</span>\n <span>({{execution.duration | number: executionDurationFormat}}ms)</span>\n </span>\n <button\n class=\"icon\"\n [class.icon-caret-down]=\"!expansionStatus[execution.executionId]?.ruleset\"\n [class.icon-caret-up]=\"expansionStatus[execution.executionId]?.ruleset\">\n </button>\n </div>\n </div>\n <div class=\"ruleset-panel-description\" *ngIf=\"expansionStatus[execution.executionId]?.ruleset\">\n <ng-container [ngTemplateOutlet]=\"rules\"\n [ngTemplateOutletContext]=\"{\n rules: execution.rulesetInformation.rules,\n expansionID: execution.executionId\n }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"inputs\"\n [ngTemplateOutletContext]=\"{\n inputs: execution.inputFacts\n }\"></ng-container>\n <ng-container *ngIf=\"execution.type === 'RulesetExecutionError'; else success\">\n <div class=\"ruleset-panel-category-title\">Rules:</div>\n <ul class=\"ruleset-panel-category-body rule-description\">\n <li *ngFor=\"let ruleEvaluation of execution.rulesEvaluations; let index=index;\">\n <ng-container>\n <div class=\"ruleset-panel-title\" [class.error]=\"ruleEvaluation.error\">\n <span>{{ruleEvaluation.rule.name | titlecase}} </span>\n <span class=\"capsule error\" *ngIf=\"ruleEvaluation.error\">Error</span>\n </div>\n <div>\n <ng-container *ngIf=\"ruleEvaluation.error\">\n <span class=\"ruleset-panel-category-title\">Error:</span>\n <span class=\"ruleset-panel-category-body error\">{{ruleEvaluation.error.message}}</span>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"inputs\"\n [ngTemplateOutletContext]=\"{\n inputs: execution.inputFacts,\n runtimeInputs: execution.rulesetInformation?.rules[index]?.inputRuntimeFacts\n }\"></ng-container>\n <o3r-rule-actions-pres *ngIf=\"!ruleEvaluation.error\"\n [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n [runtimeOutputs]=\"execution.rulesetInformation?.rules[index]?.outputRuntimeFacts\"\n ></o3r-rule-actions-pres>\n </div>\n </ng-container>\n </li>\n </ul>\n </ng-container>\n <ng-template #success>\n <o3r-rule-actions-pres [actions]=\"execution.outputActions\"></o3r-rule-actions-pres>\n <div class=\"ruleset-panel-category-title\">Executed Rules</div>\n <ul class=\"rule-description ruleset-panel-category-body\">\n <li *ngFor=\"let ruleEvaluation of execution.rulesEvaluations; let index=index;\">\n <div class=\"ruleset-panel-title\">\n <span>{{ruleEvaluation.rule.name | titlecase}}</span>\n <span class=\"capsule inactive\" *ngIf=\"ruleEvaluation.cached\">Cached</span>\n <span class=\"capsule\">({{ruleEvaluation.duration | number: executionDurationFormat}}ms)</span>\n </div>\n <div>\n <ng-container [ngTemplateOutlet]=\"triggers\"\n [ngTemplateOutletContext]=\"{triggers: (ruleEvaluation.triggers[ruleEvaluation.rule.id])}\"></ng-container>\n <o3r-rule-actions-pres\n [actions]=\"ruleEvaluation.outputActions\"\n [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n [runtimeOutputs]=\"execution.rulesetInformation?.rules[index]?.outputRuntimeFacts\">\n </o3r-rule-actions-pres>\n </div>\n </li>\n </ul>\n </ng-template>\n </div>\n </li>\n </ul>\n</section>\n\n<ng-template let-triggers=\"triggers\" #triggers>\n <div class=\"ruleset-panel-category-title\">Basefacts Triggers</div>\n <ul class=\"ruleset-panel-category-body triggers\">\n <ng-container *ngFor=\"let trigger of (triggers | keyvalue)\">\n <li *ngIf=\"trigger.value?.factName\">\n <o3r-rule-key-value-pres\n [key]=\"trigger.value.factName\"\n [oldValue]=\"trigger.value.oldValue | o3rFallbackTo\"\n [value]=\"trigger.value.newValue | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </li>\n </ng-container>\n </ul>\n</ng-template>\n\n<ng-template let-rules=\"rules\" let-expansionID=\"expansionID\" #rules>\n <div class=\"ruleset-panel-category-title ruleset-expansion-action\"\n (click)=\"toggleExpansion(expansionID, 'rulesOverview')\">\n <span>Rules Overview</span>\n <button class=\"icon\"\n [class.icon-caret-down]=\"!expansionStatus[expansionID]?.rulesOverview\"\n [class.icon-caret-up]=\"expansionStatus[expansionID]?.rulesOverview\">\n </button>\n </div>\n <ng-container *ngIf=\"expansionStatus[expansionID]?.rulesOverview\">\n <div *ngIf=\"rules?.length === 0\" class=\"ruleset-panel-category-body empty\">No rule</div>\n <ul class=\"ruleset-panel-category-body\" *ngIf=\"rules?.length > 0\">\n <li *ngFor=\"let rule of rules\">\n <o3r-rule-tree-pres [name]=\"rule.name\"\n [condition]=\"rule?.rootElement?.condition\"\n [blockType]=\"rule?.rootElement?.blockType\"\n [successElements]=\"rule?.rootElement?.successElements\"\n [failureElements]=\"rule?.rootElement?.failureElements\">\n </o3r-rule-tree-pres>\n </li>\n </ul>\n </ng-container>\n</ng-template>\n\n<ng-template let-inputs=\"inputs\" let-runtimeInputs=\"runtimeInputs\" #inputs>\n <div class=\"ruleset-panel-category-title\">Inputs snapshot</div>\n <div *ngIf=\"inputs?.length === 0\" class=\"ruleset-panel-category-body empty\">No inputs</div>\n <ul class=\"ruleset-panel-category-body\" *ngIf=\"inputs?.length > 0\">\n <li *ngFor=\"let input of inputs\">\n <o3r-rule-key-value-pres\n [key]=\"input.factName\"\n [value]=\"input.value | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </li>\n <li *ngFor=\"let input of runtimeInputs\">{{input}} (scope limited to ruleset)</li>\n </ul>\n</ng-template>\n", styles: ["o3r-ruleset-history-pres .ruleset-panel-title,o3r-ruleset-history-pres .ruleset-panel-category-title{display:flex;justify-content:space-between;align-items:center}o3r-ruleset-history-pres .ruleset-panel-title{font-size:1rem;padding:.5rem 0 .1rem}o3r-ruleset-history-pres .ruleset-expansion-action,o3r-ruleset-history-pres .icon-caret-down,o3r-ruleset-history-pres .icon-caret-up{cursor:pointer}o3r-ruleset-history-pres .ruleset-panel-subtitle{font-size:.75rem}o3r-ruleset-history-pres .ruleset-panel-title-aside{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;min-width:fit-content}o3r-ruleset-history-pres .ruleset-panel-category-title{font-size:.95rem;background:#eee;padding:.5rem;margin-bottom:.5rem;margin-top:1rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-title{font-size:.893rem;cursor:default}o3r-ruleset-history-pres .rule-description .ruleset-panel-title{font-size:.94rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-body{padding-bottom:.5rem;padding-left:1.5rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-body:empty{margin:0;padding:0 0 0 1.5rem}o3r-ruleset-history-pres .rulesets{margin:0;padding:0;list-style:none}o3r-ruleset-history-pres .rulesets ul{margin:0;padding-left:2rem}o3r-ruleset-history-pres .rulesets li.ruleset:nth-child(odd){background:#fbfbfb}o3r-ruleset-history-pres .ruleset-panel-category-body li{list-style:disc}o3r-ruleset-history-pres li:empty{display:none}o3r-ruleset-history-pres .ruleset{border-bottom:1px solid #dddddd}o3r-ruleset-history-pres .ruleset .ruleset-panel-description{padding:0 1rem 0 2rem;margin-bottom:2em}o3r-ruleset-history-pres .ruleset:first-child{border-top:1px solid #dddddd}o3r-ruleset-history-pres .ruleset-panel-title.ruleset-expansion-action{padding:.5rem 1rem}o3r-ruleset-history-pres .empty{font-style:italic;padding-left:1.5rem}o3r-ruleset-history-pres .ruleset-panel-category-body:empty.triggers:after{content:\"No trigger for this rule\";display:block;font-style:italic;padding-bottom:.5rem}o3r-ruleset-history-pres .ruleset-panel-title-aside{padding-left:1rem}o3r-ruleset-history-pres .rule-description .capsule{font-size:.8em;padding:.1rem .5rem;margin:0 .5rem}o3r-ruleset-history-pres .icon{background:none;border:none;font-size:1em}o3r-ruleset-history-pres .capsule{padding:.3rem;margin:.5rem;font-size:.875em;min-width:6rem;text-align:center}o3r-ruleset-history-pres .capsule.time{display:flex;flex-direction:column}o3r-ruleset-history-pres .success{background-color:#16aa32;color:#fff}o3r-ruleset-history-pres .inactive{background-color:#aaa;color:#fff}o3r-ruleset-history-pres .error{color:#c02020}o3r-ruleset-history-pres .error .capsule.error{background-color:#c02020;color:#fff}o3r-ruleset-history-pres .warn{background-color:#b92;color:#fff}o3r-ruleset-history-pres .input-key{color:#26c}o3r-ruleset-history-pres .input-value{color:#c29}o3r-ruleset-history-pres .input-key,o3r-ruleset-history-pres .input-value{font-family:monospace}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: RuleTreePresComponent, selector: "o3r-rule-tree-pres", inputs: ["name", "blockType", "condition", "successElements", "failureElements"] }, { kind: "component", type: RuleActionsPresComponent, selector: "o3r-rule-actions-pres", inputs: ["actions", "temporaryFacts", "runtimeOutputs"] }, { kind: "component", type: RuleKeyValuePresComponent, selector: "o3r-rule-key-value-pres", inputs: ["key", "value", "oldValue", "type"] }, { kind: "pipe", type: O3rFallbackToPipe, name: "o3rFallbackTo" }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: i1.KeyValuePipe, name: "keyvalue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
287
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.1", type: RulesetHistoryPresComponent, selector: "o3r-ruleset-history-pres", inputs: { rulesetExecutions: "rulesetExecutions", executionDurationFormat: "executionDurationFormat" }, ngImport: i0, template: "<section>\n <h4 class=\"mb-4\">Ruleset Execution History</h4>\n <ng-template #noRulesEngine>\n <div class=\"alert alert-danger m-2\" role=\"alert\">\n The Rules Engine is not configured on this page.\n </div>\n </ng-template>\n <ul *ngIf=\"rulesetExecutions; else noRulesEngine\" class=\"rulesets\">\n <li *ngFor=\"let execution of rulesetExecutions\" class=\"ruleset\">\n <div class=\"ruleset-panel-title ruleset-expansion-action\"\n [class.error]=\"execution.type === 'RulesetExecutionError'\"\n (click)=\"toggleExpansion(execution.executionId, 'ruleset')\">\n <div><span [title]=\"'This ruleset has been evaluated ' + execution.executionCounter + ' time(s)'\">{{execution.executionCounter}}</span> - {{execution.rulesetName | titlecase }}\n <div class=\"ruleset-panel-subtitle\" *ngIf=\"execution.rulesetInformation?.linkedComponent as linkedComponent\">\n {{linkedComponent.name}} {{linkedComponent.library}}\n </div>\n <div class=\"ruleset-panel-subtitle\" *ngIf=\"execution.rulesetInformation?.validityRange as validityRange\">\n Date range: {{validityRange.from}} - {{validityRange.to}}\n </div>\n </div>\n <div class=\"ruleset-panel-title-aside\">\n <span class=\"error capsule\" *ngIf=\"execution.status === 'Error'\">Error</span>\n <span class=\"success capsule\" *ngIf=\"execution.status === 'Active'\">Applied</span>\n <span class=\"inactive capsule\" *ngIf=\"execution.status === 'Deactivated'\">Deactivated</span>\n <span class=\"warn capsule\" *ngIf=\"execution.status === 'NoEffect'\">No effect</span>\n <span class=\"time capsule\">\n <span>{{execution.timestamp | date: 'HH:mm:ss SSS'}}</span>\n <span>({{execution.duration | number: executionDurationFormat}}ms)</span>\n </span>\n <button\n class=\"icon\"\n [class.icon-caret-down]=\"!expansionStatus[execution.executionId]?.ruleset\"\n [class.icon-caret-up]=\"expansionStatus[execution.executionId]?.ruleset\">\n </button>\n </div>\n </div>\n <div class=\"ruleset-panel-description\" *ngIf=\"expansionStatus[execution.executionId]?.ruleset\">\n <ng-container [ngTemplateOutlet]=\"rules\"\n [ngTemplateOutletContext]=\"{\n rules: execution.rulesetInformation.rules,\n expansionID: execution.executionId\n }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"inputs\"\n [ngTemplateOutletContext]=\"{\n inputs: execution.inputFacts\n }\"></ng-container>\n <ng-container *ngIf=\"execution.type === 'RulesetExecutionError'; else success\">\n <div class=\"ruleset-panel-category-title\">Rules:</div>\n <ul class=\"ruleset-panel-category-body rule-description\">\n <li *ngFor=\"let ruleEvaluation of execution.rulesEvaluations; let index=index;\">\n <ng-container>\n <div class=\"ruleset-panel-title\" [class.error]=\"ruleEvaluation.error\">\n <span>{{ruleEvaluation.rule.name | titlecase}} </span>\n <span class=\"capsule error\" *ngIf=\"ruleEvaluation.error\">Error</span>\n </div>\n <div>\n <ng-container *ngIf=\"ruleEvaluation.error\">\n <span class=\"ruleset-panel-category-title\">Error:</span>\n <pre class=\"ruleset-panel-category-body error\">{{ruleEvaluation.error | json}}</pre>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"inputs\"\n [ngTemplateOutletContext]=\"{\n inputs: execution.inputFacts,\n runtimeInputs: execution.rulesetInformation?.rules[index]?.inputRuntimeFacts\n }\"></ng-container>\n <o3r-rule-actions-pres *ngIf=\"!ruleEvaluation.error\"\n [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n [runtimeOutputs]=\"execution.rulesetInformation?.rules[index]?.outputRuntimeFacts\"\n ></o3r-rule-actions-pres>\n </div>\n </ng-container>\n </li>\n </ul>\n </ng-container>\n <ng-template #success>\n <o3r-rule-actions-pres [actions]=\"execution.outputActions\"></o3r-rule-actions-pres>\n <div class=\"ruleset-panel-category-title\">Executed Rules</div>\n <ul class=\"rule-description ruleset-panel-category-body\">\n <li *ngFor=\"let ruleEvaluation of execution.rulesEvaluations; let index=index;\">\n <div class=\"ruleset-panel-title\">\n <span>{{ruleEvaluation.rule.name | titlecase}}</span>\n <span class=\"capsule inactive\" *ngIf=\"ruleEvaluation.cached\">Cached</span>\n <span class=\"capsule\">({{ruleEvaluation.duration | number: executionDurationFormat}}ms)</span>\n </div>\n <div>\n <ng-container [ngTemplateOutlet]=\"triggers\"\n [ngTemplateOutletContext]=\"{triggers: (ruleEvaluation.triggers[ruleEvaluation.rule.id])}\"></ng-container>\n <o3r-rule-actions-pres\n [actions]=\"ruleEvaluation.outputActions\"\n [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n [runtimeOutputs]=\"execution.rulesetInformation?.rules[index]?.outputRuntimeFacts\">\n </o3r-rule-actions-pres>\n </div>\n </li>\n </ul>\n </ng-template>\n </div>\n </li>\n </ul>\n</section>\n\n<ng-template let-triggers=\"triggers\" #triggers>\n <div class=\"ruleset-panel-category-title\">Basefacts Triggers</div>\n <ul class=\"ruleset-panel-category-body triggers\">\n <ng-container *ngFor=\"let trigger of (triggers | keyvalue)\">\n <li *ngIf=\"trigger.value?.factName\">\n <o3r-rule-key-value-pres\n [key]=\"trigger.value.factName\"\n [oldValue]=\"trigger.value.oldValue | o3rFallbackTo\"\n [value]=\"trigger.value.newValue | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </li>\n </ng-container>\n </ul>\n</ng-template>\n\n<ng-template let-rules=\"rules\" let-expansionID=\"expansionID\" #rules>\n <div class=\"ruleset-panel-category-title ruleset-expansion-action\"\n (click)=\"toggleExpansion(expansionID, 'rulesOverview')\">\n <span>Rules Overview</span>\n <button class=\"icon\"\n [class.icon-caret-down]=\"!expansionStatus[expansionID]?.rulesOverview\"\n [class.icon-caret-up]=\"expansionStatus[expansionID]?.rulesOverview\">\n </button>\n </div>\n <ng-container *ngIf=\"expansionStatus[expansionID]?.rulesOverview\">\n <div *ngIf=\"rules?.length === 0\" class=\"ruleset-panel-category-body empty\">No rule</div>\n <ul class=\"ruleset-panel-category-body\" *ngIf=\"rules?.length > 0\">\n <li *ngFor=\"let rule of rules\">\n <o3r-rule-tree-pres [name]=\"rule.name\"\n [condition]=\"rule?.rootElement?.condition\"\n [blockType]=\"rule?.rootElement?.blockType\"\n [successElements]=\"rule?.rootElement?.successElements\"\n [failureElements]=\"rule?.rootElement?.failureElements\">\n </o3r-rule-tree-pres>\n </li>\n </ul>\n </ng-container>\n</ng-template>\n\n<ng-template let-inputs=\"inputs\" let-runtimeInputs=\"runtimeInputs\" #inputs>\n <div class=\"ruleset-panel-category-title\">Inputs snapshot</div>\n <div *ngIf=\"inputs?.length === 0\" class=\"ruleset-panel-category-body empty\">No inputs</div>\n <ul class=\"ruleset-panel-category-body\" *ngIf=\"inputs?.length > 0\">\n <li *ngFor=\"let input of inputs\">\n <o3r-rule-key-value-pres\n [key]=\"input.factName\"\n [value]=\"input.value | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </li>\n <li *ngFor=\"let input of runtimeInputs\">{{input}} (scope limited to ruleset)</li>\n </ul>\n</ng-template>\n", styles: ["o3r-ruleset-history-pres .ruleset-panel-title,o3r-ruleset-history-pres .ruleset-panel-category-title{display:flex;justify-content:space-between;align-items:center}o3r-ruleset-history-pres .ruleset-panel-title{font-size:1rem;padding:.5rem 0 .1rem}o3r-ruleset-history-pres .ruleset-expansion-action,o3r-ruleset-history-pres .icon-caret-down,o3r-ruleset-history-pres .icon-caret-up{cursor:pointer}o3r-ruleset-history-pres .ruleset-panel-subtitle{font-size:.75rem}o3r-ruleset-history-pres .ruleset-panel-title-aside{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;min-width:fit-content}o3r-ruleset-history-pres .ruleset-panel-category-title{font-size:.95rem;background:#eee;padding:.5rem;margin-bottom:.5rem;margin-top:1rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-title{font-size:.893rem;cursor:default}o3r-ruleset-history-pres .rule-description .ruleset-panel-title{font-size:.94rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-body{padding-bottom:.5rem;padding-left:1.5rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-body:empty{margin:0;padding:0 0 0 1.5rem}o3r-ruleset-history-pres .rulesets{margin:0;padding:0;list-style:none}o3r-ruleset-history-pres .rulesets ul{margin:0;padding-left:2rem}o3r-ruleset-history-pres .rulesets li.ruleset:nth-child(odd){background:#fbfbfb}o3r-ruleset-history-pres .ruleset-panel-category-body li{list-style:disc}o3r-ruleset-history-pres li:empty{display:none}o3r-ruleset-history-pres .ruleset{border-bottom:1px solid #dddddd}o3r-ruleset-history-pres .ruleset .ruleset-panel-description{padding:0 1rem 0 2rem;margin-bottom:2em}o3r-ruleset-history-pres .ruleset:first-child{border-top:1px solid #dddddd}o3r-ruleset-history-pres .ruleset-panel-title.ruleset-expansion-action{padding:.5rem 1rem}o3r-ruleset-history-pres .empty{font-style:italic;padding-left:1.5rem}o3r-ruleset-history-pres .ruleset-panel-category-body:empty.triggers:after{content:\"No trigger for this rule\";display:block;font-style:italic;padding-bottom:.5rem}o3r-ruleset-history-pres .ruleset-panel-title-aside{padding-left:1rem}o3r-ruleset-history-pres .rule-description .capsule{font-size:.8em;padding:.1rem .5rem;margin:0 .5rem}o3r-ruleset-history-pres .icon{background:none;border:none;font-size:1em}o3r-ruleset-history-pres .capsule{padding:.3rem;margin:.5rem;font-size:.875em;min-width:6rem;text-align:center}o3r-ruleset-history-pres .capsule.time{display:flex;flex-direction:column}o3r-ruleset-history-pres .success{background-color:#16aa32;color:#fff}o3r-ruleset-history-pres .inactive{background-color:#aaa;color:#fff}o3r-ruleset-history-pres .error{color:#c02020}o3r-ruleset-history-pres .error .capsule.error{background-color:#c02020;color:#fff}o3r-ruleset-history-pres .warn{background-color:#b92;color:#fff}o3r-ruleset-history-pres .input-key{color:#26c}o3r-ruleset-history-pres .input-value{color:#c29}o3r-ruleset-history-pres .input-key,o3r-ruleset-history-pres .input-value{font-family:monospace}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: RuleTreePresComponent, selector: "o3r-rule-tree-pres", inputs: ["name", "blockType", "condition", "successElements", "failureElements"] }, { kind: "component", type: RuleActionsPresComponent, selector: "o3r-rule-actions-pres", inputs: ["actions", "temporaryFacts", "runtimeOutputs"] }, { kind: "component", type: RuleKeyValuePresComponent, selector: "o3r-rule-key-value-pres", inputs: ["key", "value", "oldValue", "type"] }, { kind: "pipe", type: O3rFallbackToPipe, name: "o3rFallbackTo" }, { kind: "pipe", type: i1.JsonPipe, name: "json" }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: i1.KeyValuePipe, name: "keyvalue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
288
288
  }
289
289
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: RulesetHistoryPresComponent, decorators: [{
290
290
  type: Component,
291
- args: [{ selector: 'o3r-ruleset-history-pres', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<section>\n <h4 class=\"mb-4\">Ruleset Execution History</h4>\n <ng-template #noRulesEngine>\n <div class=\"alert alert-danger m-2\" role=\"alert\">\n The Rules Engine is not configured on this page.\n </div>\n </ng-template>\n <ul *ngIf=\"rulesetExecutions; else noRulesEngine\" class=\"rulesets\">\n <li *ngFor=\"let execution of rulesetExecutions\" class=\"ruleset\">\n <div class=\"ruleset-panel-title ruleset-expansion-action\"\n [class.error]=\"execution.type === 'RulesetExecutionError'\"\n (click)=\"toggleExpansion(execution.executionId, 'ruleset')\">\n <div><span [title]=\"'This ruleset has been evaluated ' + execution.executionCounter + ' time(s)'\">{{execution.executionCounter}}</span> - {{execution.rulesetName | titlecase }}\n <div class=\"ruleset-panel-subtitle\" *ngIf=\"execution.rulesetInformation?.linkedComponent as linkedComponent\">\n {{linkedComponent.name}} {{linkedComponent.library}}\n </div>\n <div class=\"ruleset-panel-subtitle\" *ngIf=\"execution.rulesetInformation?.validityRange as validityRange\">\n Date range: {{validityRange.from}} - {{validityRange.to}}\n </div>\n </div>\n <div class=\"ruleset-panel-title-aside\">\n <span class=\"error capsule\" *ngIf=\"execution.status === 'Error'\">Error</span>\n <span class=\"success capsule\" *ngIf=\"execution.status === 'Active'\">Applied</span>\n <span class=\"inactive capsule\" *ngIf=\"execution.status === 'Deactivated'\">Deactivated</span>\n <span class=\"warn capsule\" *ngIf=\"execution.status === 'NoEffect'\">No effect</span>\n <span class=\"time capsule\">\n <span>{{execution.timestamp | date: 'HH:mm:ss SSS'}}</span>\n <span>({{execution.duration | number: executionDurationFormat}}ms)</span>\n </span>\n <button\n class=\"icon\"\n [class.icon-caret-down]=\"!expansionStatus[execution.executionId]?.ruleset\"\n [class.icon-caret-up]=\"expansionStatus[execution.executionId]?.ruleset\">\n </button>\n </div>\n </div>\n <div class=\"ruleset-panel-description\" *ngIf=\"expansionStatus[execution.executionId]?.ruleset\">\n <ng-container [ngTemplateOutlet]=\"rules\"\n [ngTemplateOutletContext]=\"{\n rules: execution.rulesetInformation.rules,\n expansionID: execution.executionId\n }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"inputs\"\n [ngTemplateOutletContext]=\"{\n inputs: execution.inputFacts\n }\"></ng-container>\n <ng-container *ngIf=\"execution.type === 'RulesetExecutionError'; else success\">\n <div class=\"ruleset-panel-category-title\">Rules:</div>\n <ul class=\"ruleset-panel-category-body rule-description\">\n <li *ngFor=\"let ruleEvaluation of execution.rulesEvaluations; let index=index;\">\n <ng-container>\n <div class=\"ruleset-panel-title\" [class.error]=\"ruleEvaluation.error\">\n <span>{{ruleEvaluation.rule.name | titlecase}} </span>\n <span class=\"capsule error\" *ngIf=\"ruleEvaluation.error\">Error</span>\n </div>\n <div>\n <ng-container *ngIf=\"ruleEvaluation.error\">\n <span class=\"ruleset-panel-category-title\">Error:</span>\n <span class=\"ruleset-panel-category-body error\">{{ruleEvaluation.error.message}}</span>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"inputs\"\n [ngTemplateOutletContext]=\"{\n inputs: execution.inputFacts,\n runtimeInputs: execution.rulesetInformation?.rules[index]?.inputRuntimeFacts\n }\"></ng-container>\n <o3r-rule-actions-pres *ngIf=\"!ruleEvaluation.error\"\n [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n [runtimeOutputs]=\"execution.rulesetInformation?.rules[index]?.outputRuntimeFacts\"\n ></o3r-rule-actions-pres>\n </div>\n </ng-container>\n </li>\n </ul>\n </ng-container>\n <ng-template #success>\n <o3r-rule-actions-pres [actions]=\"execution.outputActions\"></o3r-rule-actions-pres>\n <div class=\"ruleset-panel-category-title\">Executed Rules</div>\n <ul class=\"rule-description ruleset-panel-category-body\">\n <li *ngFor=\"let ruleEvaluation of execution.rulesEvaluations; let index=index;\">\n <div class=\"ruleset-panel-title\">\n <span>{{ruleEvaluation.rule.name | titlecase}}</span>\n <span class=\"capsule inactive\" *ngIf=\"ruleEvaluation.cached\">Cached</span>\n <span class=\"capsule\">({{ruleEvaluation.duration | number: executionDurationFormat}}ms)</span>\n </div>\n <div>\n <ng-container [ngTemplateOutlet]=\"triggers\"\n [ngTemplateOutletContext]=\"{triggers: (ruleEvaluation.triggers[ruleEvaluation.rule.id])}\"></ng-container>\n <o3r-rule-actions-pres\n [actions]=\"ruleEvaluation.outputActions\"\n [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n [runtimeOutputs]=\"execution.rulesetInformation?.rules[index]?.outputRuntimeFacts\">\n </o3r-rule-actions-pres>\n </div>\n </li>\n </ul>\n </ng-template>\n </div>\n </li>\n </ul>\n</section>\n\n<ng-template let-triggers=\"triggers\" #triggers>\n <div class=\"ruleset-panel-category-title\">Basefacts Triggers</div>\n <ul class=\"ruleset-panel-category-body triggers\">\n <ng-container *ngFor=\"let trigger of (triggers | keyvalue)\">\n <li *ngIf=\"trigger.value?.factName\">\n <o3r-rule-key-value-pres\n [key]=\"trigger.value.factName\"\n [oldValue]=\"trigger.value.oldValue | o3rFallbackTo\"\n [value]=\"trigger.value.newValue | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </li>\n </ng-container>\n </ul>\n</ng-template>\n\n<ng-template let-rules=\"rules\" let-expansionID=\"expansionID\" #rules>\n <div class=\"ruleset-panel-category-title ruleset-expansion-action\"\n (click)=\"toggleExpansion(expansionID, 'rulesOverview')\">\n <span>Rules Overview</span>\n <button class=\"icon\"\n [class.icon-caret-down]=\"!expansionStatus[expansionID]?.rulesOverview\"\n [class.icon-caret-up]=\"expansionStatus[expansionID]?.rulesOverview\">\n </button>\n </div>\n <ng-container *ngIf=\"expansionStatus[expansionID]?.rulesOverview\">\n <div *ngIf=\"rules?.length === 0\" class=\"ruleset-panel-category-body empty\">No rule</div>\n <ul class=\"ruleset-panel-category-body\" *ngIf=\"rules?.length > 0\">\n <li *ngFor=\"let rule of rules\">\n <o3r-rule-tree-pres [name]=\"rule.name\"\n [condition]=\"rule?.rootElement?.condition\"\n [blockType]=\"rule?.rootElement?.blockType\"\n [successElements]=\"rule?.rootElement?.successElements\"\n [failureElements]=\"rule?.rootElement?.failureElements\">\n </o3r-rule-tree-pres>\n </li>\n </ul>\n </ng-container>\n</ng-template>\n\n<ng-template let-inputs=\"inputs\" let-runtimeInputs=\"runtimeInputs\" #inputs>\n <div class=\"ruleset-panel-category-title\">Inputs snapshot</div>\n <div *ngIf=\"inputs?.length === 0\" class=\"ruleset-panel-category-body empty\">No inputs</div>\n <ul class=\"ruleset-panel-category-body\" *ngIf=\"inputs?.length > 0\">\n <li *ngFor=\"let input of inputs\">\n <o3r-rule-key-value-pres\n [key]=\"input.factName\"\n [value]=\"input.value | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </li>\n <li *ngFor=\"let input of runtimeInputs\">{{input}} (scope limited to ruleset)</li>\n </ul>\n</ng-template>\n", styles: ["o3r-ruleset-history-pres .ruleset-panel-title,o3r-ruleset-history-pres .ruleset-panel-category-title{display:flex;justify-content:space-between;align-items:center}o3r-ruleset-history-pres .ruleset-panel-title{font-size:1rem;padding:.5rem 0 .1rem}o3r-ruleset-history-pres .ruleset-expansion-action,o3r-ruleset-history-pres .icon-caret-down,o3r-ruleset-history-pres .icon-caret-up{cursor:pointer}o3r-ruleset-history-pres .ruleset-panel-subtitle{font-size:.75rem}o3r-ruleset-history-pres .ruleset-panel-title-aside{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;min-width:fit-content}o3r-ruleset-history-pres .ruleset-panel-category-title{font-size:.95rem;background:#eee;padding:.5rem;margin-bottom:.5rem;margin-top:1rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-title{font-size:.893rem;cursor:default}o3r-ruleset-history-pres .rule-description .ruleset-panel-title{font-size:.94rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-body{padding-bottom:.5rem;padding-left:1.5rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-body:empty{margin:0;padding:0 0 0 1.5rem}o3r-ruleset-history-pres .rulesets{margin:0;padding:0;list-style:none}o3r-ruleset-history-pres .rulesets ul{margin:0;padding-left:2rem}o3r-ruleset-history-pres .rulesets li.ruleset:nth-child(odd){background:#fbfbfb}o3r-ruleset-history-pres .ruleset-panel-category-body li{list-style:disc}o3r-ruleset-history-pres li:empty{display:none}o3r-ruleset-history-pres .ruleset{border-bottom:1px solid #dddddd}o3r-ruleset-history-pres .ruleset .ruleset-panel-description{padding:0 1rem 0 2rem;margin-bottom:2em}o3r-ruleset-history-pres .ruleset:first-child{border-top:1px solid #dddddd}o3r-ruleset-history-pres .ruleset-panel-title.ruleset-expansion-action{padding:.5rem 1rem}o3r-ruleset-history-pres .empty{font-style:italic;padding-left:1.5rem}o3r-ruleset-history-pres .ruleset-panel-category-body:empty.triggers:after{content:\"No trigger for this rule\";display:block;font-style:italic;padding-bottom:.5rem}o3r-ruleset-history-pres .ruleset-panel-title-aside{padding-left:1rem}o3r-ruleset-history-pres .rule-description .capsule{font-size:.8em;padding:.1rem .5rem;margin:0 .5rem}o3r-ruleset-history-pres .icon{background:none;border:none;font-size:1em}o3r-ruleset-history-pres .capsule{padding:.3rem;margin:.5rem;font-size:.875em;min-width:6rem;text-align:center}o3r-ruleset-history-pres .capsule.time{display:flex;flex-direction:column}o3r-ruleset-history-pres .success{background-color:#16aa32;color:#fff}o3r-ruleset-history-pres .inactive{background-color:#aaa;color:#fff}o3r-ruleset-history-pres .error{color:#c02020}o3r-ruleset-history-pres .error .capsule.error{background-color:#c02020;color:#fff}o3r-ruleset-history-pres .warn{background-color:#b92;color:#fff}o3r-ruleset-history-pres .input-key{color:#26c}o3r-ruleset-history-pres .input-value{color:#c29}o3r-ruleset-history-pres .input-key,o3r-ruleset-history-pres .input-value{font-family:monospace}\n"] }]
291
+ args: [{ selector: 'o3r-ruleset-history-pres', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<section>\n <h4 class=\"mb-4\">Ruleset Execution History</h4>\n <ng-template #noRulesEngine>\n <div class=\"alert alert-danger m-2\" role=\"alert\">\n The Rules Engine is not configured on this page.\n </div>\n </ng-template>\n <ul *ngIf=\"rulesetExecutions; else noRulesEngine\" class=\"rulesets\">\n <li *ngFor=\"let execution of rulesetExecutions\" class=\"ruleset\">\n <div class=\"ruleset-panel-title ruleset-expansion-action\"\n [class.error]=\"execution.type === 'RulesetExecutionError'\"\n (click)=\"toggleExpansion(execution.executionId, 'ruleset')\">\n <div><span [title]=\"'This ruleset has been evaluated ' + execution.executionCounter + ' time(s)'\">{{execution.executionCounter}}</span> - {{execution.rulesetName | titlecase }}\n <div class=\"ruleset-panel-subtitle\" *ngIf=\"execution.rulesetInformation?.linkedComponent as linkedComponent\">\n {{linkedComponent.name}} {{linkedComponent.library}}\n </div>\n <div class=\"ruleset-panel-subtitle\" *ngIf=\"execution.rulesetInformation?.validityRange as validityRange\">\n Date range: {{validityRange.from}} - {{validityRange.to}}\n </div>\n </div>\n <div class=\"ruleset-panel-title-aside\">\n <span class=\"error capsule\" *ngIf=\"execution.status === 'Error'\">Error</span>\n <span class=\"success capsule\" *ngIf=\"execution.status === 'Active'\">Applied</span>\n <span class=\"inactive capsule\" *ngIf=\"execution.status === 'Deactivated'\">Deactivated</span>\n <span class=\"warn capsule\" *ngIf=\"execution.status === 'NoEffect'\">No effect</span>\n <span class=\"time capsule\">\n <span>{{execution.timestamp | date: 'HH:mm:ss SSS'}}</span>\n <span>({{execution.duration | number: executionDurationFormat}}ms)</span>\n </span>\n <button\n class=\"icon\"\n [class.icon-caret-down]=\"!expansionStatus[execution.executionId]?.ruleset\"\n [class.icon-caret-up]=\"expansionStatus[execution.executionId]?.ruleset\">\n </button>\n </div>\n </div>\n <div class=\"ruleset-panel-description\" *ngIf=\"expansionStatus[execution.executionId]?.ruleset\">\n <ng-container [ngTemplateOutlet]=\"rules\"\n [ngTemplateOutletContext]=\"{\n rules: execution.rulesetInformation.rules,\n expansionID: execution.executionId\n }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"inputs\"\n [ngTemplateOutletContext]=\"{\n inputs: execution.inputFacts\n }\"></ng-container>\n <ng-container *ngIf=\"execution.type === 'RulesetExecutionError'; else success\">\n <div class=\"ruleset-panel-category-title\">Rules:</div>\n <ul class=\"ruleset-panel-category-body rule-description\">\n <li *ngFor=\"let ruleEvaluation of execution.rulesEvaluations; let index=index;\">\n <ng-container>\n <div class=\"ruleset-panel-title\" [class.error]=\"ruleEvaluation.error\">\n <span>{{ruleEvaluation.rule.name | titlecase}} </span>\n <span class=\"capsule error\" *ngIf=\"ruleEvaluation.error\">Error</span>\n </div>\n <div>\n <ng-container *ngIf=\"ruleEvaluation.error\">\n <span class=\"ruleset-panel-category-title\">Error:</span>\n <pre class=\"ruleset-panel-category-body error\">{{ruleEvaluation.error | json}}</pre>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"inputs\"\n [ngTemplateOutletContext]=\"{\n inputs: execution.inputFacts,\n runtimeInputs: execution.rulesetInformation?.rules[index]?.inputRuntimeFacts\n }\"></ng-container>\n <o3r-rule-actions-pres *ngIf=\"!ruleEvaluation.error\"\n [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n [runtimeOutputs]=\"execution.rulesetInformation?.rules[index]?.outputRuntimeFacts\"\n ></o3r-rule-actions-pres>\n </div>\n </ng-container>\n </li>\n </ul>\n </ng-container>\n <ng-template #success>\n <o3r-rule-actions-pres [actions]=\"execution.outputActions\"></o3r-rule-actions-pres>\n <div class=\"ruleset-panel-category-title\">Executed Rules</div>\n <ul class=\"rule-description ruleset-panel-category-body\">\n <li *ngFor=\"let ruleEvaluation of execution.rulesEvaluations; let index=index;\">\n <div class=\"ruleset-panel-title\">\n <span>{{ruleEvaluation.rule.name | titlecase}}</span>\n <span class=\"capsule inactive\" *ngIf=\"ruleEvaluation.cached\">Cached</span>\n <span class=\"capsule\">({{ruleEvaluation.duration | number: executionDurationFormat}}ms)</span>\n </div>\n <div>\n <ng-container [ngTemplateOutlet]=\"triggers\"\n [ngTemplateOutletContext]=\"{triggers: (ruleEvaluation.triggers[ruleEvaluation.rule.id])}\"></ng-container>\n <o3r-rule-actions-pres\n [actions]=\"ruleEvaluation.outputActions\"\n [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n [runtimeOutputs]=\"execution.rulesetInformation?.rules[index]?.outputRuntimeFacts\">\n </o3r-rule-actions-pres>\n </div>\n </li>\n </ul>\n </ng-template>\n </div>\n </li>\n </ul>\n</section>\n\n<ng-template let-triggers=\"triggers\" #triggers>\n <div class=\"ruleset-panel-category-title\">Basefacts Triggers</div>\n <ul class=\"ruleset-panel-category-body triggers\">\n <ng-container *ngFor=\"let trigger of (triggers | keyvalue)\">\n <li *ngIf=\"trigger.value?.factName\">\n <o3r-rule-key-value-pres\n [key]=\"trigger.value.factName\"\n [oldValue]=\"trigger.value.oldValue | o3rFallbackTo\"\n [value]=\"trigger.value.newValue | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </li>\n </ng-container>\n </ul>\n</ng-template>\n\n<ng-template let-rules=\"rules\" let-expansionID=\"expansionID\" #rules>\n <div class=\"ruleset-panel-category-title ruleset-expansion-action\"\n (click)=\"toggleExpansion(expansionID, 'rulesOverview')\">\n <span>Rules Overview</span>\n <button class=\"icon\"\n [class.icon-caret-down]=\"!expansionStatus[expansionID]?.rulesOverview\"\n [class.icon-caret-up]=\"expansionStatus[expansionID]?.rulesOverview\">\n </button>\n </div>\n <ng-container *ngIf=\"expansionStatus[expansionID]?.rulesOverview\">\n <div *ngIf=\"rules?.length === 0\" class=\"ruleset-panel-category-body empty\">No rule</div>\n <ul class=\"ruleset-panel-category-body\" *ngIf=\"rules?.length > 0\">\n <li *ngFor=\"let rule of rules\">\n <o3r-rule-tree-pres [name]=\"rule.name\"\n [condition]=\"rule?.rootElement?.condition\"\n [blockType]=\"rule?.rootElement?.blockType\"\n [successElements]=\"rule?.rootElement?.successElements\"\n [failureElements]=\"rule?.rootElement?.failureElements\">\n </o3r-rule-tree-pres>\n </li>\n </ul>\n </ng-container>\n</ng-template>\n\n<ng-template let-inputs=\"inputs\" let-runtimeInputs=\"runtimeInputs\" #inputs>\n <div class=\"ruleset-panel-category-title\">Inputs snapshot</div>\n <div *ngIf=\"inputs?.length === 0\" class=\"ruleset-panel-category-body empty\">No inputs</div>\n <ul class=\"ruleset-panel-category-body\" *ngIf=\"inputs?.length > 0\">\n <li *ngFor=\"let input of inputs\">\n <o3r-rule-key-value-pres\n [key]=\"input.factName\"\n [value]=\"input.value | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </li>\n <li *ngFor=\"let input of runtimeInputs\">{{input}} (scope limited to ruleset)</li>\n </ul>\n</ng-template>\n", styles: ["o3r-ruleset-history-pres .ruleset-panel-title,o3r-ruleset-history-pres .ruleset-panel-category-title{display:flex;justify-content:space-between;align-items:center}o3r-ruleset-history-pres .ruleset-panel-title{font-size:1rem;padding:.5rem 0 .1rem}o3r-ruleset-history-pres .ruleset-expansion-action,o3r-ruleset-history-pres .icon-caret-down,o3r-ruleset-history-pres .icon-caret-up{cursor:pointer}o3r-ruleset-history-pres .ruleset-panel-subtitle{font-size:.75rem}o3r-ruleset-history-pres .ruleset-panel-title-aside{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;min-width:fit-content}o3r-ruleset-history-pres .ruleset-panel-category-title{font-size:.95rem;background:#eee;padding:.5rem;margin-bottom:.5rem;margin-top:1rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-title{font-size:.893rem;cursor:default}o3r-ruleset-history-pres .rule-description .ruleset-panel-title{font-size:.94rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-body{padding-bottom:.5rem;padding-left:1.5rem}o3r-ruleset-history-pres .rule-description .ruleset-panel-category-body:empty{margin:0;padding:0 0 0 1.5rem}o3r-ruleset-history-pres .rulesets{margin:0;padding:0;list-style:none}o3r-ruleset-history-pres .rulesets ul{margin:0;padding-left:2rem}o3r-ruleset-history-pres .rulesets li.ruleset:nth-child(odd){background:#fbfbfb}o3r-ruleset-history-pres .ruleset-panel-category-body li{list-style:disc}o3r-ruleset-history-pres li:empty{display:none}o3r-ruleset-history-pres .ruleset{border-bottom:1px solid #dddddd}o3r-ruleset-history-pres .ruleset .ruleset-panel-description{padding:0 1rem 0 2rem;margin-bottom:2em}o3r-ruleset-history-pres .ruleset:first-child{border-top:1px solid #dddddd}o3r-ruleset-history-pres .ruleset-panel-title.ruleset-expansion-action{padding:.5rem 1rem}o3r-ruleset-history-pres .empty{font-style:italic;padding-left:1.5rem}o3r-ruleset-history-pres .ruleset-panel-category-body:empty.triggers:after{content:\"No trigger for this rule\";display:block;font-style:italic;padding-bottom:.5rem}o3r-ruleset-history-pres .ruleset-panel-title-aside{padding-left:1rem}o3r-ruleset-history-pres .rule-description .capsule{font-size:.8em;padding:.1rem .5rem;margin:0 .5rem}o3r-ruleset-history-pres .icon{background:none;border:none;font-size:1em}o3r-ruleset-history-pres .capsule{padding:.3rem;margin:.5rem;font-size:.875em;min-width:6rem;text-align:center}o3r-ruleset-history-pres .capsule.time{display:flex;flex-direction:column}o3r-ruleset-history-pres .success{background-color:#16aa32;color:#fff}o3r-ruleset-history-pres .inactive{background-color:#aaa;color:#fff}o3r-ruleset-history-pres .error{color:#c02020}o3r-ruleset-history-pres .error .capsule.error{background-color:#c02020;color:#fff}o3r-ruleset-history-pres .warn{background-color:#b92;color:#fff}o3r-ruleset-history-pres .input-key{color:#26c}o3r-ruleset-history-pres .input-value{color:#c29}o3r-ruleset-history-pres .input-key,o3r-ruleset-history-pres .input-value{font-family:monospace}\n"] }]
292
292
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { rulesetExecutions: [{
293
293
  type: Input
294
294
  }], executionDurationFormat: [{
@@ -297,13 +297,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImpor
297
297
 
298
298
  class RulesetHistoryPresModule {
299
299
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: RulesetHistoryPresModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
300
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.2.1", ngImport: i0, type: RulesetHistoryPresModule, declarations: [RulesetHistoryPresComponent, RuleConditionPresComponent, RuleTreePresComponent, RuleActionsPresComponent, RuleKeyValuePresComponent], imports: [O3rFallbackToPipe, CommonModule, CommonModule, CommonModule], exports: [RulesetHistoryPresComponent] }); }
300
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.2.1", ngImport: i0, type: RulesetHistoryPresModule, declarations: [RulesetHistoryPresComponent, RuleConditionPresComponent, RuleTreePresComponent, RuleActionsPresComponent, RuleKeyValuePresComponent], imports: [O3rFallbackToPipe, CommonModule, CommonModule, CommonModule, JsonPipe], exports: [RulesetHistoryPresComponent] }); }
301
301
  /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: RulesetHistoryPresModule, imports: [CommonModule, CommonModule, CommonModule] }); }
302
302
  }
303
303
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: RulesetHistoryPresModule, decorators: [{
304
304
  type: NgModule,
305
305
  args: [{
306
- imports: [O3rFallbackToPipe, CommonModule, CommonModule, CommonModule],
306
+ imports: [O3rFallbackToPipe, CommonModule, CommonModule, CommonModule, JsonPipe],
307
307
  declarations: [RulesetHistoryPresComponent, RuleConditionPresComponent, RuleTreePresComponent, RuleActionsPresComponent, RuleKeyValuePresComponent],
308
308
  exports: [RulesetHistoryPresComponent]
309
309
  }]