@o3r/rules-engine 14.0.0-next.2 → 14.0.0-next.4
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.
- package/builders/metadata-check/helpers/index.d.ts +1 -1
- package/builders/metadata-check/helpers/index.js +1 -1
- package/builders/metadata-check/helpers/{rulefact-metadata-comparison.helper.d.ts → rulefact-metadata-comparison-helper.d.ts} +1 -1
- package/builders/metadata-check/helpers/{rulefact-metadata-comparison.helper.d.ts.map → rulefact-metadata-comparison-helper.d.ts.map} +1 -1
- package/builders/metadata-check/helpers/{rulefact-metadata-comparison.helper.js → rulefact-metadata-comparison-helper.js} +1 -1
- package/builders/rules-engine-extractor/helpers/index.d.ts +2 -2
- package/builders/rules-engine-extractor/helpers/index.js +2 -2
- package/builders/rules-engine-extractor/helpers/{rules-engine.extractor.interfaces.d.ts → rules-engine-extractor-interfaces.d.ts} +1 -1
- package/builders/rules-engine-extractor/helpers/{rules-engine.extractor.interfaces.d.ts.map → rules-engine-extractor-interfaces.d.ts.map} +1 -1
- package/builders/rules-engine-extractor/helpers/{rules-engine.extractor.interfaces.js → rules-engine-extractor-interfaces.js} +1 -1
- package/builders/rules-engine-extractor/helpers/{rules-engine.extractor.d.ts → rules-engine-extractor.d.ts} +2 -2
- package/builders/rules-engine-extractor/helpers/{rules-engine.extractor.d.ts.map → rules-engine-extractor.d.ts.map} +1 -1
- package/builders/rules-engine-extractor/helpers/{rules-engine.extractor.js → rules-engine-extractor.js} +2 -2
- package/fesm2022/o3r-rules-engine-fixtures-jasmine.mjs.map +1 -1
- package/fesm2022/o3r-rules-engine-fixtures-jest.mjs.map +1 -1
- package/fesm2022/o3r-rules-engine.mjs +61 -60
- package/fesm2022/o3r-rules-engine.mjs.map +1 -1
- package/fixtures/jasmine/index.d.ts +1 -1
- package/fixtures/jasmine/{rules-engine.runner.service.fixture.jasmine.d.ts → rules-engine-runner-service-fixture-jasmine.d.ts} +1 -1
- package/fixtures/jasmine/{rules-engine.runner.service.fixture.jasmine.d.ts.map → rules-engine-runner-service-fixture-jasmine.d.ts.map} +1 -1
- package/fixtures/jest/index.d.ts +1 -1
- package/fixtures/jest/index.js +1 -1
- package/fixtures/jest/{rules-engine.runner.service.fixture.jest.d.ts → rules-engine-runner-service-fixture-jest.d.ts} +1 -1
- package/fixtures/jest/{rules-engine.runner.service.fixture.jest.d.ts.map → rules-engine-runner-service-fixture-jest.d.ts.map} +1 -1
- package/fixtures/jest/{rules-engine.runner.service.fixture.jest.js → rules-engine-runner-service-fixture-jest.js} +1 -1
- package/fixtures/jest/{rules-engine.runner.service.fixture.jest.js.map → rules-engine-runner-service-fixture-jest.js.map} +1 -1
- package/index.d.ts.map +1 -1
- package/package.json +6 -7
- package/rules.operators.metadata.json +1 -867
- package/schematics/facts-service/index.d.ts.map +1 -1
- package/schematics/facts-service/index.js +11 -8
- package/schematics/rules-engine-to-component/index.js +1 -1
- package/builders/metadata-check/helpers/index.js.map +0 -1
- package/builders/metadata-check/helpers/rulefact-metadata-comparison.helper.js.map +0 -1
- package/builders/metadata-check/index.js.map +0 -1
- package/builders/metadata-check/schema.js.map +0 -1
- package/builders/rules-engine-extractor/helpers/index.js.map +0 -1
- package/builders/rules-engine-extractor/helpers/rules-engine.extractor.interfaces.js.map +0 -1
- package/builders/rules-engine-extractor/helpers/rules-engine.extractor.js.map +0 -1
- package/builders/rules-engine-extractor/index.js.map +0 -1
- package/builders/rules-engine-extractor/schema.js.map +0 -1
- package/schematics/cms-adapter/index.js.map +0 -1
- package/schematics/facts-service/index.js.map +0 -1
- package/schematics/facts-service/schema.js.map +0 -1
- package/schematics/ng-add/helpers/devtools-registration.js.map +0 -1
- package/schematics/ng-add/index.js.map +0 -1
- package/schematics/ng-add/schema.js.map +0 -1
- package/schematics/ng-update/index.js.map +0 -1
- package/schematics/ng-update/v10.0/action-module-split.js.map +0 -1
- package/schematics/ng-update/v11.6/use-register-action-handlers.js.map +0 -1
- package/schematics/operator/index.js.map +0 -1
- package/schematics/operator/schema.js.map +0 -1
- package/schematics/rules-engine-to-component/index.js.map +0 -1
- package/schematics/rules-engine-to-component/schema.js.map +0 -1
- /package/schematics/facts-service/templates/{__name__.facts.ts.template → __name__-facts.ts.template} +0 -0
- /package/schematics/operator/templates/{__name__.operator.ts.template → __name__-operator.ts.template} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"o3r-rules-engine.mjs","sources":["../../src/components/rules-engine/shared/fallback-to.pipe.ts","../../src/components/rules-engine/shared/json-or-string.pipe.ts","../../src/components/rules-engine/shared/ruleset-history.helper.ts","../../src/components/rules-engine/facts-snapshot/facts-snapshot.component.ts","../../src/components/rules-engine/facts-snapshot/facts-snapshot.template.html","../../src/components/rules-engine/rule-key-value/rule-key-value-pres.component.ts","../../src/components/rules-engine/rule-key-value/rule-key-value-pres.template.html","../../src/components/rules-engine/rule-actions/rule-actions-pres.component.ts","../../src/components/rules-engine/rule-actions/rule-actions-pres.template.html","../../src/components/rules-engine/rule-condition/rule-condition-pres.component.ts","../../src/components/rules-engine/rule-condition/rule-condition-pres.template.html","../../src/components/rules-engine/rule-tree/rule-tree-pres.component.ts","../../src/components/rules-engine/rule-tree/rule-tree-pres.template.html","../../src/components/rules-engine/ruleset-history/ruleset-history-pres.component.ts","../../src/components/rules-engine/ruleset-history/ruleset-history-pres.template.html","../../src/components/rules-engine/ruleset-history/ruleset-history-pres.module.ts","../../src/devkit/rules-engine-devkit.interface.ts","../../src/services/rules-engine.token.ts","../../src/stores/rulesets/rulesets.actions.ts","../../src/stores/rulesets/rulesets.effect.ts","../../src/stores/rulesets/rulesets.reducer.ts","../../src/stores/rulesets/rulesets.state.ts","../../src/stores/rulesets/rulesets.module.ts","../../src/stores/rulesets/rulesets.selectors.ts","../../src/stores/rulesets/rulesets.sync.ts","../../src/engine/debug/helpers.ts","../../src/engine/debug/engine.debug.ts","../../src/engine/helpers/filter-ruleset-event.operator.ts","../../src/engine/operator/operator.helpers.ts","../../src/engine/operator/operators/array-based.operators.ts","../../src/engine/operator/operators/basic.operators.ts","../../src/engine/operator/operators/date-based.operators.ts","../../src/engine/operator/operators/number-based.operators.ts","../../src/engine/operator/operators/index.ts","../../src/engine/rule/rule.helpers.ts","../../src/engine/ruleset-executor.ts","../../src/engine/engine.ts","../../src/services/runner/rules-engine.runner.service.ts","../../src/services/runner/rules-engine.runner.module.ts","../../src/devkit/rules-engine-devtools.token.ts","../../src/devkit/rules-engine-devtools.service.ts","../../src/devkit/rules-engine-devtools.console.service.ts","../../src/devkit/rules-engine-devtools.message.service.ts","../../src/devkit/rules-engine-devtools.module.ts","../../src/fact/fact.abstract-service.ts","../../src/inner-facts/current-time/current-time-fact.service.ts","../../src/o3r-rules-engine.ts"],"sourcesContent":["import {\n Pipe,\n PipeTransform,\n} from '@angular/core';\n\n@Pipe({ name: 'o3rFallbackTo' })\nexport class O3rFallbackToPipe implements PipeTransform {\n public transform<T>(value: T, fallback = 'undefined'): T | string {\n return value === undefined ? fallback : value;\n }\n}\n","import {\n Pipe,\n PipeTransform,\n} from '@angular/core';\n\n@Pipe({ name: 'o3rJsonOrString' })\nexport class O3rJsonOrStringPipe implements PipeTransform {\n /**\n * @inheritDoc\n */\n public transform(value: any): string {\n if (typeof value === 'string') {\n return value;\n }\n return JSON.stringify(value, null, 2);\n }\n}\n","import type {\n DebugEvent,\n Ruleset,\n RulesetExecutionErrorEvent,\n RulesetExecutionEvent,\n} from '../../../engine';\nimport type {\n RulesetExecutionDebug,\n RulesetExecutionStatus,\n} from '../ruleset-history/ruleset-history-pres.component';\n\n/**\n * Compute the status of the execution depending on its execution event type, the output and whether the execution\n * is still active\n * @param rulesetExecution\n * @param isActive\n */\nexport const getStatus = (rulesetExecution: RulesetExecutionErrorEvent | RulesetExecutionEvent, isActive: boolean): RulesetExecutionStatus => {\n if (rulesetExecution.type === 'RulesetExecutionError') {\n return 'Error';\n } else if (rulesetExecution.outputActions?.length === 0) {\n return 'NoEffect';\n } else if (isActive) {\n return 'Active';\n }\n return 'Deactivated';\n};\n\n/**\n * Transform the output of the debug reports into the model for the ruleset history debug panel\n * @param events\n * @param rulesetMap\n */\nexport const rulesetReportToHistory = (events: DebugEvent[], rulesetMap: Record<string, Ruleset>): RulesetExecutionDebug[] => {\n const availableRulesets = (events.filter((e) => e.type === 'AvailableRulesets').reverse()[0])?.availableRulesets || [];\n const lastActiveRulesets = (events.filter((e) => e.type === 'ActiveRulesets').reverse()[0])?.rulesets || [];\n\n return availableRulesets\n .filter((ruleset) => !!ruleset)\n .reduce<(RulesetExecutionEvent | RulesetExecutionErrorEvent)[]>((acc, ruleset) => {\n const rulesetExecutions = events\n .filter((e): e is RulesetExecutionEvent | RulesetExecutionErrorEvent => ((e.type === 'RulesetExecutionError' || e.type === 'RulesetExecution') && e.rulesetId === ruleset.id));\n if (rulesetExecutions) {\n acc.push(...rulesetExecutions);\n }\n return acc;\n }, [])\n .sort((execA, execB) => execB.timestamp - execA.timestamp)\n .map((rulesetExecution) => {\n const rulesetInformation = rulesetMap[rulesetExecution.rulesetId];\n const isActive = lastActiveRulesets.find((r) => r.id === rulesetExecution.rulesetId);\n return {\n ...rulesetExecution,\n status: getStatus(rulesetExecution, !!isActive),\n isActive: !!isActive,\n rulesetInformation,\n rulesEvaluations: (rulesetExecution.rulesEvaluations || []).sort((evalA, evalB) =>\n (rulesetInformation?.rules.findIndex((r) => r.id === evalA.rule.id) || -1)\n - (rulesetInformation?.rules.findIndex((r) => r.id === evalB.rule.id) || -1)\n )\n };\n });\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n FormsModule,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport type {\n Facts,\n} from '../../../engine';\nimport {\n O3rJsonOrStringPipe,\n} from '../shared/index';\n\n@Component({\n selector: 'o3r-facts-snapshot',\n styleUrls: ['./facts-snapshot.style.scss'],\n templateUrl: './facts-snapshot.template.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n O3rJsonOrStringPipe,\n FormsModule,\n ReactiveFormsModule\n ],\n encapsulation: ViewEncapsulation.None\n})\nexport class FactsSnapshotComponent {\n /**\n * Full list of available facts with their current value\n */\n public readonly facts = input.required<{ factName: string; value: Facts }[]>();\n\n /**\n * Search terms\n */\n public readonly search = signal('');\n\n /**\n * Filtered list of facts using search terms\n */\n public readonly filteredFacts = computed(() => {\n const search = this.search();\n const facts = this.facts();\n if (search) {\n const matchString = new RegExp(search.replace(/[\\s#$()*+,.?[\\\\\\]^{|}-]/g, '\\\\$&'), 'i');\n return facts.filter(({ factName, value }) =>\n matchString.test(factName)\n || (typeof value === 'object'\n ? matchString.test(JSON.stringify(value))\n : matchString.test(String(value)))\n );\n } else {\n return facts;\n }\n });\n}\n","<section>\n @if (facts().length < 1) {\n <div class=\"m-2\">\n No facts are registered.\n </div>\n } @else {\n <div class=\"input-group\">\n <label class=\"input-group-text\" for=\"search-fact\">\n <span class=\"mx-1 fa-search\" aria-label=\"Search\"></span>\n </label>\n <input class=\"form-control\" [(ngModel)]=\"search\" type=\"text\" id=\"search-fact\" placeholder=\"Search for fact name or value\" />\n </div>\n <div class=\"mt-3\">\n List of <b>{{facts().length}}</b> registered facts\n @if (facts().length > filteredFacts().length) { (<b>{{filteredFacts().length}}</b> matching the search) }\n </div>\n <ul>\n @for (fact of filteredFacts(); track fact.factName) {\n <li>\n <span class=\"fact-name\">{{fact.factName}}: </span>\n <span class=\"fact-value\">{{fact.value | o3rJsonOrString}}</span>\n </li>\n }\n </ul>\n }\n</section>\n","import {\n CommonModule,\n JsonPipe,\n} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnChanges,\n SimpleChanges,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n of,\n Subject,\n} from 'rxjs';\nimport {\n delay,\n startWith,\n switchMap,\n} from 'rxjs/operators';\n\n/**\n * Duration of the notification for clipboard feature (in milliseconds)\n */\nconst NOTIFICATION_DURATION = 1750;\n\n/**\n * Minimal length required to enable clipboard feature\n */\nconst CLIPBOARD_FEATURE_LENGTH_THRESHOLD = 80;\n\n@Component({\n selector: 'o3r-rule-key-value-pres',\n styleUrls: ['./rule-key-value-pres.style.scss'],\n templateUrl: './rule-key-value-pres.template.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, JsonPipe]\n})\nexport class RuleKeyValuePresComponent implements OnChanges {\n /**\n * Key of the object (name of the fact for example)\n */\n @Input()\n public key?: string;\n\n /**\n * Current value of the object\n */\n @Input()\n public value!: string;\n\n /**\n * Previous value of the object\n */\n @Input()\n public oldValue?: string;\n\n /**\n * Type of display:\n * - 'state': `key: value`, `key: oldValue -> value` or `oldValue -> value`\n * - 'assignment': `key = value`\n */\n @Input()\n public type: 'state' | 'assignment' = 'state';\n\n public shouldLimitCharactersForValue = true;\n public isClipBoardFeatureAvailableForValue = false;\n public isValuePrimitiveType = false;\n\n public shouldLimitCharactersForOldValue = true;\n public isClipBoardFeatureAvailableForOldValue = false;\n public isOldValuePrimitiveType = false;\n\n private readonly triggerNotification = new Subject<void>();\n public showNotification$ = this.triggerNotification.asObservable().pipe(\n switchMap(() => of(false).pipe(delay(NOTIFICATION_DURATION), startWith(true)))\n );\n\n private isClipBoardFeatureAvailable(value: string | undefined) {\n return !!(navigator.clipboard && value && value.length > CLIPBOARD_FEATURE_LENGTH_THRESHOLD);\n }\n\n public ngOnChanges({ value, oldValue }: SimpleChanges) {\n if (value) {\n this.isValuePrimitiveType = value.currentValue === null || typeof value.currentValue !== 'object';\n this.isClipBoardFeatureAvailableForValue = this.isClipBoardFeatureAvailable(this.isValuePrimitiveType ? String(value.currentValue) : JSON.stringify(value.currentValue));\n }\n if (oldValue) {\n this.isOldValuePrimitiveType = oldValue.currentValue === null || typeof oldValue.currentValue !== 'object';\n this.isClipBoardFeatureAvailableForOldValue = this.isClipBoardFeatureAvailable(this.isOldValuePrimitiveType ? String(oldValue.currentValue) : JSON.stringify(oldValue.currentValue));\n }\n }\n\n public async copyToClipBoard(content: string) {\n await navigator.clipboard.writeText(content);\n this.triggerNotification.next();\n }\n}\n","@if (key) {\n <span class=\"input-key\">{{key}}{{type === 'state' ? ':' : ''}}</span>\n}\n{{type === 'assignment' ? '=' : ''}}\n@if (oldValue) {\n <pre class=\"input-value\"\n [class.limit-characters]=\"shouldLimitCharactersForOldValue\"\n (click)=\"shouldLimitCharactersForOldValue = !shouldLimitCharactersForOldValue\"\n (keyup.enter)=\"shouldLimitCharactersForOldValue = !shouldLimitCharactersForOldValue\"\n tabindex=\"0\"\n >\n {{isOldValuePrimitiveType ? oldValue : (oldValue | json)}}\n </pre>\n @if (isClipBoardFeatureAvailableForOldValue) {\n <button (click)=\"copyToClipBoard(oldValue)\" title=\"Copy to clipboard\">📋</button>\n }\n →\n}\n<pre class=\"input-value\"\n [class.limit-characters]=\"shouldLimitCharactersForValue\"\n (click)=\"shouldLimitCharactersForValue = !shouldLimitCharactersForValue\"\n (keyup.enter)=\"shouldLimitCharactersForValue = !shouldLimitCharactersForValue\"\n tabindex=\"0\"\n>\n {{isValuePrimitiveType ? value : (value | json)}}\n</pre>\n@if (isClipBoardFeatureAvailableForValue) {\n <button (click)=\"copyToClipBoard(value)\" title=\"Copy to clipboard\">📋</button>\n}\n@if (showNotification$ | async) {\n <div role=\"alert\" class=\"notification\">Copied to clipboard</div>\n}\n","import {\n CommonModule,\n JsonPipe,\n} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n ActionBlock,\n AllBlock,\n Facts,\n} from '../../../engine';\nimport {\n RuleKeyValuePresComponent,\n} from '../rule-key-value/rule-key-value-pres.component';\nimport {\n O3rFallbackToPipe,\n} from '../shared/index';\n\n@Component({\n selector: 'o3r-rule-actions-pres',\n styleUrls: ['./rule-actions-pres.style.scss'],\n templateUrl: './rule-actions-pres.template.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, JsonPipe, RuleKeyValuePresComponent, O3rFallbackToPipe]\n})\nexport class RuleActionsPresComponent {\n /**\n * List of all the output actions of a rules or ruleset execution\n */\n @Input()\n public actions: AllBlock[] = [];\n\n /**\n * The list of temporary facts used and/or modified within the rule or the ruleset.\n * They are scoped to the ruleset and their value is the one after the rule or ruleset execution.\n */\n @Input()\n public temporaryFacts: Record<string, Facts> = {};\n\n /**\n * List of temporary facts that will be modified by the ruleset or the rule.\n */\n @Input()\n public runtimeOutputs: string[] = [];\n\n /**\n * Check if a given block is of type ActionBlock\n * @param block\n */\n public isActionBlock(block: AllBlock): block is ActionBlock {\n return !!(block as ActionBlock).actionType;\n }\n}\n","<div class=\"ruleset-panel-category-title\">Output Actions</div>\n@if (actions?.length === 0 && runtimeOutputs.length === 0) {\n <div class=\"ruleset-panel-category-body empty\">\n No action\n </div>\n} @else {\n <ul class=\"ruleset-panel-category-body\">\n @for (action of actions; track $index) {\n <li>\n @if (isActionBlock(action)) {\n @switch (action.actionType) {\n @case ('SET_FACT') {\n <div>\n <div>Set Fact</div>\n <div>\n <o3r-rule-key-value-pres\n [key]=\"action.fact | o3rFallbackTo: 'Missing \\'fact\\''\"\n [value]=\"action.value | o3rFallbackTo\"\n [type]=\"'assignment'\"></o3r-rule-key-value-pres>\n </div>\n </div>\n }\n @case ('UPDATE_CONFIG') {\n <div>\n <div>Update Config {{action.component}} {{action.library}}</div>\n <div>\n <o3r-rule-key-value-pres\n [key]=\"action.property | o3rFallbackTo: 'Missing \\'property\\''\"\n [value]=\"action.value | o3rFallbackTo\"\n [type]=\"'assignment'\"></o3r-rule-key-value-pres>\n </div>\n </div>\n }\n @case ('UPDATE_ASSET') {\n <div>\n <div>Update Asset:</div>\n <div>\n <o3r-rule-key-value-pres\n [oldValue]=\"action.asset | o3rFallbackTo: 'Missing \\'asset\\''\"\n [value]=\"action.value | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </div>\n </div>\n }\n @case ('UPDATE_LOCALISATION') {\n <div>\n <div>Update localization:</div>\n <div>\n <o3r-rule-key-value-pres\n [oldValue]=\"action.key | o3rFallbackTo: 'Missing \\'key\\''\"\n [value]=\"action.value | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </div>\n </div>\n }\n @case ('UPDATE_PLACEHOLDER') {\n <div [class.error]=\"!action.placeholderId\">\n <div>Update placeholder in {{action.component}} {{action.library}}</div>\n <div>\n <o3r-rule-key-value-pres\n [oldValue]=\"action.placeholderId | o3rFallbackTo: 'Missing \\'placeholderId\\''\"\n [value]=\"action.value\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </div>\n </div>\n }\n @default {\n <div class=\"error\">\n <div>Unrecognized action</div>\n <div>{{action | json}}</div>\n </div>\n }\n }\n }\n </li>\n }\n @for (runtimeOutput of runtimeOutputs; track $index) {\n <li>\n <div>Set temporary fact</div>\n <div>\n <o3r-rule-key-value-pres\n [key]=\"runtimeOutput | o3rFallbackTo: 'Missing \\'fact\\''\"\n [value]=\"temporaryFacts[runtimeOutput] | o3rFallbackTo\"\n [type]=\"'assignment'\"></o3r-rule-key-value-pres>\n </div>\n </li>\n }\n </ul>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n BinaryOperation,\n GenericOperand,\n OperandFact,\n TopLevelCondition,\n UnaryOperation,\n} from '../../../engine';\n\n@Component({\n selector: 'o3r-rule-condition-pres',\n styleUrls: ['./rule-condition-pres.style.scss'],\n templateUrl: './rule-condition-pres.template.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: []\n})\nexport class RuleConditionPresComponent {\n private _condition?: TopLevelCondition;\n\n /**\n * Left hand operator as it will be displayed in the template.\n * In the case of a fact with a json path, will resolve the whole fact path, else will only display the value\n */\n public lhs = 'undefined';\n\n /**\n * Right hand operator as it will be displayed in the template.\n * In the case of a fact with a json path, will resolve the whole fact path, else will only display the value\n */\n public rhs: string | undefined;\n\n /**\n * Rule condition that will be flattened by the component setter\n */\n @Input()\n public set condition(condition: TopLevelCondition | undefined) {\n this._condition = condition;\n this.lhs = (condition as UnaryOperation | BinaryOperation)?.lhs ? this.getOperandName((condition as UnaryOperation | BinaryOperation).lhs) : 'undefined';\n this.rhs = (condition as BinaryOperation)?.rhs ? this.getOperandName((condition as BinaryOperation).rhs) : undefined;\n }\n\n public get condition(): TopLevelCondition | undefined {\n return this._condition;\n }\n\n private getOperandName(operand: GenericOperand): string {\n const value = `${operand.value ?? 'MISSING_VALUE'}`;\n return (operand as OperandFact).path ? (operand as OperandFact).path!.replace(/^\\$/, value) : value;\n }\n}\n","@if (!condition) {\n <span class=\"input-value\">true</span>\n} @else {\n @if (!$any(condition).all && !$any(condition).any && !$any(condition).not) {\n <span class=\"input-key\">{{ lhs }}</span> {{ $any(condition).operator }}\n @if (rhs !== undefined) {\n <span class=\"input-value\">{{ rhs }}</span>\n }\n }\n @if ($any(condition).all || $any(condition).any || $any(condition).not) {\n @if ($any(condition).all) {\n <span>ALL</span>\n }\n @if ($any(condition).any) {\n <span>ANY</span>\n }\n @if ($any(condition).not) {\n <span>NOT</span>\n }\n <span>(\n @for (cond of $any(condition).all || $any(condition).any || [$any(condition).not]; track cond; let last = $last) {\n <o3r-rule-condition-pres [condition]=\"cond\"></o3r-rule-condition-pres>\n @if (!last) {\n <span>, </span>\n }\n }\n )</span>\n }\n}\n","import {\n CommonModule,\n} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n AllBlock,\n TopLevelCondition,\n} from '../../../engine';\nimport {\n RuleActionsPresComponent,\n} from '../rule-actions/rule-actions-pres.component';\nimport {\n RuleConditionPresComponent,\n} from '../rule-condition/rule-condition-pres.component';\n\n@Component({\n selector: 'o3r-rule-tree-pres',\n styleUrls: ['./rule-tree-pres.style.scss'],\n templateUrl: './rule-tree-pres.template.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, RuleActionsPresComponent, RuleConditionPresComponent]\n})\nexport class RuleTreePresComponent {\n /**\n * Rule name. Will only be defined at the root of the rule tree.\n */\n @Input()\n public name?: string;\n\n /**\n * Type of the block being resolved.\n * A type \"IF_ELSE\" will display two branches and the success and failure outputs associated\n * Else, only the successElements will be shown\n */\n @Input()\n public blockType = '';\n\n /**\n * The condition under which the success elements will be displayed.\n */\n @Input()\n public condition?: TopLevelCondition;\n\n /**\n * If case output\n */\n @Input()\n public successElements: AllBlock[] = [];\n\n /**\n * Else case output\n */\n @Input()\n public failureElements: AllBlock[] = [];\n\n /**\n * Should the \"Else case scenario\" actions be displayed\n */\n public failureActionsExpanded = false;\n\n /**\n * Should the \"If case scenario\" actions be displayed\n */\n public successActionsExpanded = false;\n}\n","@if (name) {\n <span>{{name | titlecase}}:</span>\n}\n<div class=\"rule-wrapper tree\">\n @if (blockType === 'IF_ELSE') {\n @if (!name) {\n <div class=\"tree-root\" [attr.aria-hidden]=\"true\">\n <div></div>\n <div></div>\n </div>\n }\n <div class=\"rule-conditions\">\n <div class=\"rule-conditions-title\">If\n <o3r-rule-condition-pres [condition]=\"condition\"></o3r-rule-condition-pres>\n </div>\n <div class=\"tree-root\" [attr.aria-hidden]=\"true\">\n <div></div>\n <div></div>\n </div>\n </div>\n <div class=\"rule-actions-wrapper tree-node\">\n <div class=\"rule-actions tree-branch\">\n <div class=\"tree-leaf\" [attr.aria-hidden]=\"true\">\n <div></div>\n <div></div>\n </div>\n <div class=\"rule-action-title success-actions\"\n tabindex=\"0\"\n (click)=\"successActionsExpanded = !successActionsExpanded\"\n (keyup.enter)=\"successActionsExpanded = !successActionsExpanded\">\n <i class=\"icon refx-icon-validate\"></i>\n <span>Then</span>\n <i class=\"icon\"\n [class.icon-caret-down]=\"!successActionsExpanded\"\n [class.icon-caret-up]=\"successActionsExpanded\">\n </i>\n </div>\n @if (successActionsExpanded) {\n <o3r-rule-actions-pres class=\"rule-tree-actions\"\n [actions]=\"successElements\">\n </o3r-rule-actions-pres>\n }\n <ng-container [ngTemplateOutlet]=\"subTree\" [ngTemplateOutletContext]=\"{blocks: successElements}\"></ng-container>\n </div>\n <div class=\"rule-actions tree-branch\">\n <div class=\"tree-leaf\" [attr.aria-hidden]=\"true\">\n <div></div>\n <div></div>\n </div>\n <div class=\"rule-action-title error-actions\"\n tabindex=\"0\"\n (click)=\"failureActionsExpanded = !failureActionsExpanded\"\n (keyup.enter)=\"failureActionsExpanded = !failureActionsExpanded\">\n <i class=\"icon refx-icon-cross\"></i>\n <span>Else</span>\n <i class=\"icon\"\n [class.icon-caret-down]=\"!failureActionsExpanded\"\n [class.icon-caret-up]=\"failureActionsExpanded\">\n </i>\n </div>\n @if (failureActionsExpanded) {\n <o3r-rule-actions-pres class=\"rule-tree-actions\"\n [actions]=\"failureElements\">\n </o3r-rule-actions-pres>\n }\n <ng-container [ngTemplateOutlet]=\"subTree\" [ngTemplateOutletContext]=\"{blocks: failureElements}\"></ng-container>\n </div>\n </div>\n } @else {\n <div class=\"rule-conditions\">\n <div class=\"rule-conditions-title\">If <span class=\"input-value\">true</span></div>\n <div class=\"tree-root\" [attr.aria-hidden]=\"true\">\n <div></div>\n <div></div>\n </div>\n </div>\n <div class=\"rule-actions-wrapper\">\n <div class=\"rule-actions\">\n <div class=\"rule-action-title success-actions\" tabindex=\"0\"\n (keyup.enter)=\"successActionsExpanded = !successActionsExpanded\"\n (click)=\"successActionsExpanded = !successActionsExpanded\">\n <i class=\"icon refx-icon-validate\">\n </i>\n <span>Then</span>\n <i class=\"icon\"\n [class.icon-caret-down]=\"!successActionsExpanded\"\n [class.icon-caret-up]=\"successActionsExpanded\">\n </i>\n </div>\n @if (successActionsExpanded) {\n <o3r-rule-actions-pres class=\"rule-tree-actions\"\n [actions]=\"successElements\">\n </o3r-rule-actions-pres>\n }\n <ng-container [ngTemplateOutlet]=\"subTree\" [ngTemplateOutletContext]=\"{blocks: successElements}\"></ng-container>\n </div>\n </div>\n }\n</div>\n\n<ng-template #subTree let-blocks=\"blocks\">\n <div class=\"rule-sub-trees\">\n @for (block of blocks; track block) {\n @if (block.blockType === 'IF_ELSE') {\n <div class=\"tree-branch\">\n <o3r-rule-tree-pres\n [blockType]=\"'IF_ELSE'\"\n [condition]=\"block.condition\"\n [failureElements]=\"block.failureElements\"\n [successElements]=\"block.successElements\"></o3r-rule-tree-pres>\n </div>\n }\n }\n </div>\n</ng-template>\n","import {\n CommonModule,\n} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n inject,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n Ruleset,\n RulesetExecutionErrorEvent,\n RulesetExecutionEvent,\n} from '../../../engine';\nimport {\n RuleActionsPresComponent,\n} from '../rule-actions/rule-actions-pres.component';\nimport {\n RuleKeyValuePresComponent,\n} from '../rule-key-value/rule-key-value-pres.component';\nimport {\n RuleTreePresComponent,\n} from '../rule-tree/rule-tree-pres.component';\nimport {\n O3rFallbackToPipe,\n O3rJsonOrStringPipe,\n} from '../shared/index';\n\nexport type RulesetExecutionStatus = 'Error' | 'Active' | 'Deactivated' | 'NoEffect';\n/**\n * Model of a RulesetExecution with more information for debug purpose\n */\nexport type RulesetExecutionDebug = (RulesetExecutionEvent | RulesetExecutionErrorEvent) & {\n isActive: boolean;\n status: RulesetExecutionStatus;\n rulesetInformation: Ruleset | undefined;\n};\n\n@Component({\n selector: 'o3r-ruleset-history-pres',\n styleUrls: ['./ruleset-history-pres.style.scss'],\n templateUrl: './ruleset-history-pres.template.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n CommonModule,\n O3rFallbackToPipe,\n O3rJsonOrStringPipe,\n RuleActionsPresComponent,\n RuleKeyValuePresComponent,\n RuleTreePresComponent\n ]\n})\nexport class RulesetHistoryPresComponent {\n private readonly cd = inject(ChangeDetectorRef);\n\n /**\n * Reflects the state of each ruleset expanded elements.\n * Each ruleset entry contains a list of subpanel that can be collapsed or expanded.\n * Ruleset whole panel status is store the 'ruleset' entry.\n * @example\n * Expanded ruleset with rule overview collapsed:\n * {'rulesetId': {'ruleset' : true, 'ruleOverview': false}}\n * @note Collapsing a ruleset will not reset the subpanel expansion status\n */\n public expansionStatus: { [key: string]: { [subpanel: string]: boolean } } = {};\n\n @Input()\n public rulesetExecutions: RulesetExecutionDebug[] = [];\n\n @Input()\n public executionDurationFormat = '1.3-3';\n\n /**\n * Toggle a ruleset subpanel\n * @param ruleId\n * @param subpanel element to collapse. 'ruleset' will toggle the whole panel but won't reset the subpanels states.\n */\n public toggleExpansion(ruleId: string, subpanel: string) {\n if (this.expansionStatus[ruleId]) {\n this.expansionStatus[ruleId][subpanel] = !this.expansionStatus[ruleId][subpanel];\n } else {\n this.expansionStatus[ruleId] = { [subpanel]: true };\n }\n this.cd.detectChanges();\n }\n}\n","<section>\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 <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -- need to refactor the div to accordion from DF #1518 -->\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?.linkedComponents?.or\">\n <ng-container *ngFor=\"let lc of execution.rulesetInformation?.linkedComponents?.or; last as isLast\">\n <div>{{lc.name}} {{lc.library}} <span *ngIf=\"!isLast\"> OR </span></div>\n </ng-container>\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 | o3rJsonOrString}}</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 <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -- need to refactor the div to accordion from DF #1518 -->\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","import {\n JsonPipe,\n} from '@angular/common';\nimport {\n NgModule,\n} from '@angular/core';\nimport {\n RuleConditionPresComponent,\n} from '../rule-condition/rule-condition-pres.component';\nimport {\n RulesetHistoryPresComponent,\n} from './ruleset-history-pres.component';\n\n/**\n * @deprecated The Components and Pipes are now standalone, this module will be removed in v14\n */\n@NgModule({\n imports: [\n JsonPipe,\n RulesetHistoryPresComponent,\n RuleConditionPresComponent\n ],\n exports: [RulesetHistoryPresComponent]\n})\nexport class RulesetHistoryPresModule {}\n","import type {\n ConnectContentMessage,\n DevtoolsCommonOptions,\n MessageDataTypes,\n OtterMessageContent,\n RequestMessagesContentMessage,\n} from '@o3r/core';\nimport type {\n DebugEvent,\n Ruleset,\n} from '../engine';\n\nexport interface RulesEngineDevtoolsServiceOptions extends DevtoolsCommonOptions {\n /** Size of events list emitted by rules engine; When undefined all history will be kept */\n rulesEngineStackLimit?: number;\n}\n\n/** Rules Engine debug event Message Content */\nexport interface RulesEngineDebugEventsContentMessage extends OtterMessageContent<'rulesEngineEvents'> {\n /** Map of registered rulesets */\n rulesetMap: Record<string, Ruleset>;\n /** List of event from the Rules Engine Debugger */\n events: DebugEvent[];\n}\n\ntype RulesEngineMessageContents = RulesEngineDebugEventsContentMessage;\n\n/** List of possible DataTypes for RulesEngine messages */\nexport type RulesEngineMessageDataTypes = MessageDataTypes<RulesEngineMessageContents>;\n\n/** List of all messages for configuration purpose */\nexport type AvailableRulesEngineMessageContents = RulesEngineMessageContents\n | ConnectContentMessage\n | RequestMessagesContentMessage<RulesEngineMessageDataTypes>;\n\nexport const isRulesEngineMessage = (message: any): message is AvailableRulesEngineMessageContents => {\n return message && (\n message.dataType === 'rulesEngineEvents'\n || message.dataType === 'requestMessages'\n || message.dataType === 'connect'\n );\n};\n","import {\n InjectionToken,\n} from '@angular/core';\n\n/** Determine if the action should be executed */\nexport const RULES_ENGINE_OPTIONS = new InjectionToken<boolean>('Rules Engine Options');\n\n/** Rules engine configuration */\nexport interface RulesEngineServiceOptions {\n /** Determine if the actions resulting of the rule engine should be executed */\n dryRun: boolean;\n /** Flag to activate the run of Rules Engine in debug mode */\n debug: boolean;\n /** Limit the number of debug events kept in stack */\n debugEventsStackLimit?: number;\n}\n\n/** Default Rules engine options */\nexport const DEFAULT_RULES_ENGINE_OPTIONS: Readonly<RulesEngineServiceOptions> = {\n dryRun: false,\n debug: false\n} as const;\n","import {\n createAction,\n props,\n} from '@ngrx/store';\nimport {\n asyncProps,\n AsyncRequest,\n FailAsyncStoreItemEntitiesActionPayload,\n FromApiActionPayload,\n SetActionPayload,\n SetAsyncStoreItemEntitiesActionPayload,\n UpdateActionPayload,\n} from '@o3r/core';\nimport {\n RulesetsModel,\n RulesetsStateDetails,\n} from './rulesets.state';\n\n/** StateDetailsActions */\nconst ACTION_SET = '[Rulesets] set';\nconst ACTION_UPDATE = '[Rulesets] update';\nconst ACTION_RESET = '[Rulesets] reset';\nconst ACTION_CANCEL_REQUEST = '[Rulesets] cancel request';\n\n/** Entity Actions */\nconst ACTION_CLEAR_ENTITIES = '[Rulesets] clear entities';\nconst ACTION_UPSERT_ENTITIES = '[Rulesets] upsert entities';\nconst ACTION_SET_ENTITIES = '[Rulesets] set entities';\nconst ACTION_FAIL_ENTITIES = '[Rulesets] fail entities';\n\n/** Async Actions */\nconst ACTION_SET_ENTITIES_FROM_API = '[Rulesets] set entities from api';\nconst ACTION_UPSERT_ENTITIES_FROM_API = '[Rulesets] upsert entities from api';\n\n/** Action to clear the StateDetails of the store and replace it */\nexport const setRulesets = createAction(ACTION_SET, props<SetActionPayload<RulesetsStateDetails>>());\n\n/** Action to change a part or the whole object in the store. */\nexport const updateRulesets = createAction(ACTION_UPDATE, props<UpdateActionPayload<RulesetsStateDetails>>());\n\n/** Action to reset the whole state, by returning it to initial state. */\nexport const resetRulesets = createAction(ACTION_RESET);\n\n/** Action to cancel a Request ID registered in the store. Can happen from effect based on a switchMap for instance */\nexport const cancelRulesetsRequest = createAction(ACTION_CANCEL_REQUEST, props<AsyncRequest>());\n\n/** Action to clear all rulesets and fill the store with the payload */\nexport const setRulesetsEntities = createAction(ACTION_SET_ENTITIES, props<SetAsyncStoreItemEntitiesActionPayload<RulesetsModel>>());\n\n/** Action to update rulesets with known IDs, insert the new ones */\nexport const upsertRulesetsEntities = createAction(ACTION_UPSERT_ENTITIES, props<SetAsyncStoreItemEntitiesActionPayload<RulesetsModel>>());\n\n/** Action to empty the list of entities, keeping the global state */\nexport const clearRulesetsEntities = createAction(ACTION_CLEAR_ENTITIES);\n\n/** Action to update failureStatus for every RulesetsModel */\nexport const failRulesetsEntities = createAction(ACTION_FAIL_ENTITIES, props<FailAsyncStoreItemEntitiesActionPayload<any>>());\n\n/**\n * Action to put the global status of the store in a pending state. Call SET action with the list of RulesetsModels received, when this action resolves.\n * If the call fails, dispatch FAIL_ENTITIES action\n */\nexport const setRulesetsEntitiesFromApi = createAction(ACTION_SET_ENTITIES_FROM_API, asyncProps<FromApiActionPayload<RulesetsModel[]>>());\n\n/**\n * Action to put global status of the store in a pending state. Call UPSERT action with the list of RulesetsModels received, when this action resolves.\n * If the call fails, dispatch FAIL_ENTITIES action\n */\nexport const upsertRulesetsEntitiesFromApi = createAction(ACTION_UPSERT_ENTITIES_FROM_API, asyncProps<FromApiActionPayload<RulesetsModel[]>>());\n","import {\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n Actions,\n createEffect,\n ofType,\n} from '@ngrx/effects';\nimport {\n fromApiEffectSwitchMap,\n} from '@o3r/core';\nimport {\n from,\n of,\n} from 'rxjs';\nimport {\n catchError,\n map,\n mergeMap,\n} from 'rxjs/operators';\nimport {\n cancelRulesetsRequest,\n failRulesetsEntities,\n setRulesetsEntities,\n setRulesetsEntitiesFromApi,\n upsertRulesetsEntities,\n upsertRulesetsEntitiesFromApi,\n} from './rulesets.actions';\n\n/**\n * Service to handle async Rulesets actions\n */\n@Injectable()\nexport class RulesetsEffect {\n protected actions$ = inject(Actions);\n\n /**\n * Set the entities with the reply content, dispatch failRulesetsEntities if it catches a failure\n */\n public setEntitiesFromApi$ = createEffect(() =>\n this.actions$.pipe(\n ofType(setRulesetsEntitiesFromApi),\n fromApiEffectSwitchMap(\n (reply, action) => setRulesetsEntities({ entities: reply, requestId: action.requestId }),\n (error, action) => of(failRulesetsEntities({ error, requestId: action.requestId })),\n cancelRulesetsRequest\n )\n )\n );\n\n /**\n * Upsert the entities with the reply content, dispatch failRulesetsEntities if it catches a failure\n */\n public upsertEntitiesFromApi$ = createEffect(() =>\n this.actions$.pipe(\n ofType(upsertRulesetsEntitiesFromApi),\n mergeMap((payload) =>\n from(payload.call).pipe(\n map((reply) => upsertRulesetsEntities({ entities: reply, requestId: payload.requestId })),\n catchError((err) => of(failRulesetsEntities({ error: err, requestId: payload.requestId })))\n )\n )\n )\n );\n}\n","import {\n createEntityAdapter,\n} from '@ngrx/entity';\nimport {\n ActionCreator,\n createReducer,\n on,\n ReducerTypes,\n} from '@ngrx/store';\nimport {\n asyncStoreItemAdapter,\n} from '@o3r/core';\nimport * as actions from './rulesets.actions';\nimport {\n RulesetsModel,\n RulesetsState,\n} from './rulesets.state';\n\n/**\n * Rulesets Store adapter\n */\nexport const rulesetsAdapter = createEntityAdapter<RulesetsModel>({\n selectId: (model) => model.id\n});\n\n/**\n * Rulesets Store initial value\n */\nexport const rulesetsInitialState = rulesetsAdapter.getInitialState<RulesetsState>({\n requestIds: []\n});\n\n/**\n * List of basic actions for Rulesets Store\n */\nexport const rulesetsReducerFeatures: ReducerTypes<RulesetsState, ActionCreator[]>[] = [\n on(actions.resetRulesets, () => rulesetsInitialState),\n\n on(actions.setRulesets, (state, payload) => ({ ids: state.ids, entities: state.entities, ...payload.stateDetails })),\n\n on(actions.cancelRulesetsRequest, (state, action) => asyncStoreItemAdapter.resolveRequest(state, action.requestId)),\n\n on(actions.updateRulesets, (state, payload) => ({ ...state, ...payload.stateDetails })),\n\n on(actions.setRulesetsEntities, (state, payload) =>\n rulesetsAdapter.addMany(\n payload.entities,\n rulesetsAdapter.removeAll(asyncStoreItemAdapter.resolveRequest(state, payload.requestId)))\n ),\n\n on(actions.upsertRulesetsEntities, (state, payload) =>\n rulesetsAdapter.upsertMany(payload.entities, asyncStoreItemAdapter.resolveRequest(state, payload.requestId))\n ),\n\n on(actions.clearRulesetsEntities, (state) => rulesetsAdapter.removeAll(state)),\n\n on(actions.failRulesetsEntities, (state, payload) =>\n asyncStoreItemAdapter.failRequest(state, payload.requestId)\n ),\n\n on(actions.setRulesetsEntitiesFromApi, actions.upsertRulesetsEntitiesFromApi, (state, payload) =>\n asyncStoreItemAdapter.addRequest(state, payload.requestId))\n];\n\n/**\n * Rulesets Store reducer\n */\nexport const rulesetsReducer = createReducer(\n rulesetsInitialState,\n ...rulesetsReducerFeatures\n);\n","import {\n EntityState,\n} from '@ngrx/entity';\nimport {\n AsyncStoreItem,\n} from '@o3r/core';\nimport type {\n Ruleset,\n} from '../../engine';\n\n/**\n * Rulesets model\n */\nexport interface RulesetsModel extends Ruleset {\n}\n\n/**\n * Rulesets state details\n */\nexport interface RulesetsStateDetails extends AsyncStoreItem {\n}\n\n/**\n * Rulesets store state\n */\nexport interface RulesetsState extends EntityState<RulesetsModel>, RulesetsStateDetails {\n}\n\n/**\n * Name of the Rulesets Store\n */\nexport const RULESETS_STORE_NAME = 'rulesets';\n\n/**\n * Rulesets Store Interface\n */\nexport interface RulesetsStore {\n /** Rulesets state */\n [RULESETS_STORE_NAME]: RulesetsState;\n}\n","import {\n InjectionToken,\n ModuleWithProviders,\n NgModule,\n} from '@angular/core';\nimport {\n EffectsModule,\n} from '@ngrx/effects';\nimport {\n Action,\n ActionReducer,\n StoreModule,\n} from '@ngrx/store';\nimport {\n RulesetsEffect,\n} from './rulesets.effect';\nimport {\n rulesetsReducer,\n} from './rulesets.reducer';\nimport {\n RULESETS_STORE_NAME,\n RulesetsState,\n} from './rulesets.state';\n\n/** Token of the Rulesets reducer */\nexport const RULESETS_REDUCER_TOKEN = new InjectionToken<ActionReducer<RulesetsState, Action>>('Feature Rulesets Reducer');\n\n/** Provide default reducer for Rulesets store */\nexport function getDefaultRulesetsReducer() {\n return rulesetsReducer;\n}\n\n@NgModule({\n imports: [\n StoreModule.forFeature(RULESETS_STORE_NAME, RULESETS_REDUCER_TOKEN), EffectsModule.forFeature([RulesetsEffect])\n ],\n providers: [\n { provide: RULESETS_REDUCER_TOKEN, useFactory: getDefaultRulesetsReducer }\n ]\n})\nexport class RulesetsStoreModule {\n public static forRoot<T extends RulesetsState>(reducerFactory: () => ActionReducer<T, Action>): ModuleWithProviders<RulesetsStoreModule> {\n return {\n ngModule: RulesetsStoreModule,\n providers: [\n { provide: RULESETS_REDUCER_TOKEN, useFactory: reducerFactory }\n ]\n };\n }\n}\n","import {\n createFeatureSelector,\n createSelector,\n} from '@ngrx/store';\nimport {\n computeItemIdentifier,\n} from '@o3r/core';\nimport type {\n Ruleset,\n} from '../../engine';\nimport {\n rulesetsAdapter,\n} from './rulesets.reducer';\nimport {\n RULESETS_STORE_NAME,\n RulesetsState,\n} from './rulesets.state';\n\nconst { selectIds, selectEntities, selectAll, selectTotal } = rulesetsAdapter.getSelectors();\n\n/** Select Rulesets State */\nexport const selectRulesetsState = createFeatureSelector<RulesetsState>(RULESETS_STORE_NAME);\n\n/** Select the array of Rulesets ids */\nexport const selectRulesetsIds = createSelector(selectRulesetsState, selectIds);\n\n/** Select the array of Rulesets */\nexport const selectAllRulesets = createSelector(selectRulesetsState, selectAll);\n\n/** Select the dictionary of Rulesets entities */\nexport const selectRulesetsEntities = createSelector(selectRulesetsState, selectEntities);\n\n/** Select the total Rulesets count */\nexport const selectRulesetsTotal = createSelector(selectRulesetsState, selectTotal);\n\n/** Select the store pending status */\nexport const selectRulesetsStorePendingStatus = createSelector(selectRulesetsState, (state) => state.isPending || false);\n\n/**\n * Check if the given value is a valid date\n * @param d\n */\nconst isValidDate = (d: any) => !Number.isNaN(d) && d instanceof Date;\n\n/**\n * Returns the rulesets which are in the validity range, if provided\n */\nexport const selectRuleSetsInRange = createSelector(\n selectAllRulesets,\n (ruleSets) => ruleSets.filter((ruleSet: Ruleset) => {\n const validity = ruleSet.validityRange;\n if (!validity || (!validity.from && !validity.to)) {\n return true;\n }\n\n const from = validity.from && new Date(validity.from);\n const to = validity.to && new Date(validity.to);\n\n if ((to && !isValidDate(to)) || (from && !isValidDate(from))) {\n return false;\n }\n const time = Date.now();\n if (to && from) {\n return from.getTime() <= time && to.getTime() >= time;\n }\n\n if (from) {\n return from.getTime() <= time;\n }\n return to && to.getTime() >= time;\n })\n);\n\n/**\n * Returns the rulesets ids which are not onDemand and in the validity range\n */\nexport const selectActiveRuleSets = createSelector(\n selectRuleSetsInRange,\n (ruleSets) => ruleSets\n .filter((ruleSet: Ruleset) => (!ruleSet.linkedComponents?.or?.length))\n .map((ruleSet: Ruleset) => ruleSet.id));\n\n/**\n * Assign component to RulesetIds Map\n * @param compName\n * @param library\n * @param ruleSetId\n * @param acc\n */\nfunction linkComponentToRuleset(compName: string, library: string, ruleSetId: string, acc: Record<string, string[]> = {}) {\n const configName = computeItemIdentifier(compName, library);\n acc[ruleSetId] ||= [];\n acc[ruleSetId].push(configName);\n}\n\n/**\n * Select the map of ruleSets to activate based on linked components\n */\nexport const selectComponentsLinkedToRuleset = createSelector(\n selectRuleSetsInRange,\n (ruleSets) =>\n ruleSets\n .reduce((acc: { or: { [key: string]: string[] } }, ruleSet: Ruleset) => {\n if (!ruleSet.linkedComponents?.or || ruleSet.linkedComponents.or.length === 0) {\n return acc;\n }\n if (ruleSet.linkedComponents?.or?.length) {\n ruleSet.linkedComponents.or.forEach((linkComp) => {\n linkComponentToRuleset(linkComp.name, linkComp.library, ruleSet.id, acc.or);\n });\n return acc;\n }\n return acc;\n }, { or: {} })\n);\n","import {\n asyncStoreItemAdapter,\n Serializer,\n} from '@o3r/core';\nimport {\n rulesetsAdapter,\n rulesetsInitialState,\n} from './rulesets.reducer';\nimport {\n RulesetsModel,\n RulesetsState,\n} from './rulesets.state';\n\nexport const rulesetsStorageSerializer = (state: RulesetsState) => {\n return asyncStoreItemAdapter.clearAsyncStoreItem(state);\n};\n\nexport const rulesetsStorageDeserializer = (rawObject: any) => {\n if (!rawObject || !rawObject.ids) {\n return rulesetsInitialState;\n }\n const storeObject = rulesetsAdapter.getInitialState<RulesetsState>(rawObject);\n for (const id of rawObject.ids) {\n storeObject.entities[id] = rawObject.entities[id] as RulesetsModel;\n }\n return storeObject;\n};\n\nexport const rulesetsStorageSync: Serializer<RulesetsState> = {\n serialize: rulesetsStorageSerializer,\n deserialize: rulesetsStorageDeserializer\n};\n","import {\n EvaluationReason,\n RuleEvaluation,\n RuleEvaluationOutput,\n} from '../engine.interface';\nimport type {\n Facts,\n} from '../fact';\nimport {\n ActionBlock,\n Rule,\n} from '../structure';\n\n/**\n * Function to retrieve from 2 sequential executions only the triggers which activated the last ruleset execution\n * @param currRes Current ruleset execution object\n * @param prevRes Previous ruleset execution object\n * @returns The triggers list which activates the last ruleset execution\n */\nexport function retrieveRulesetTriggers(currRes: RuleEvaluationOutput[], prevRes: RuleEvaluationOutput[] | undefined) {\n let rulesetTriggers: Record<string, Record<string, EvaluationReason>> = {};\n\n const allCurrRulesetTriggersList = currRes.map((r) => r.evaluation).filter((e): e is RuleEvaluation => !!e).map((e) => e.triggers);\n const allCurrRulesetTriggers: Record<string, Record<string, EvaluationReason>> = {};\n\n allCurrRulesetTriggersList.forEach((rTrig) => {\n Object.keys(rTrig).forEach((ruleId) => {\n allCurrRulesetTriggers[ruleId] = rTrig[ruleId];\n });\n });\n\n if (prevRes) {\n const allPrevRulesetTriggersList = prevRes.map((r) => r.evaluation).filter((e): e is RuleEvaluation => !!e).map((e) => e.triggers);\n const allPrevRulesetTriggers: Record<string, Record<string, EvaluationReason>> = {};\n\n allPrevRulesetTriggersList.forEach((rTrig) => {\n Object.keys(rTrig).forEach((ruleId) => {\n allPrevRulesetTriggers[ruleId] = rTrig[ruleId];\n });\n });\n\n Object.entries(allCurrRulesetTriggers).forEach(([ruleId, ruleTriggers]) => {\n Object.keys(ruleTriggers).forEach((factName) => {\n if (!allPrevRulesetTriggers[ruleId]\n || !allPrevRulesetTriggers[ruleId][factName]\n || ruleTriggers[factName].newValue !== allPrevRulesetTriggers[ruleId][factName].newValue) {\n (rulesetTriggers[ruleId] ||= {})[factName] = ruleTriggers[factName];\n }\n });\n });\n } else {\n rulesetTriggers = allCurrRulesetTriggers;\n }\n return rulesetTriggers;\n}\n\n/**\n * Flag as cached the rules evaluations which are from previous ruleset executions\n * @param rulesEvaluations all rules evaluations list\n * @param triggers Ruleset triggers object\n * @returns Rules evaluation list with flagged rules evaluation from previous ruleset executions\n */\nexport function flagCachedRules(rulesEvaluations: RuleEvaluation[], triggers: Record<string, Record<string, EvaluationReason>>): (RuleEvaluation & { cached?: boolean })[] {\n const rulesWhichTriggeredExecution = Object.keys(triggers);\n\n return rulesEvaluations.map((e) => {\n if (e && !rulesWhichTriggeredExecution.includes(e.rule.id)) {\n return { ...e, cached: true };\n }\n return { ...e };\n });\n}\n\n/**\n * Create the debug rule evaluation object\n * @param rule\n * @param rulesetName\n * @param outputActions\n * @param outputError\n * @param runtimeFactValues\n * @param factValues\n * @param oldFactValues\n * @param inputFacts\n */\nexport function handleRuleEvaluationDebug(\n rule: Rule,\n rulesetName: string,\n outputActions: ActionBlock[] | undefined,\n outputError: any,\n runtimeFactValues: Record<string, Facts>,\n factValues: any[] | undefined,\n oldFactValues: any[] | undefined,\n inputFacts: string[] | undefined = []\n) {\n const executionId = `${rulesetName} - ${rule.name}`;\n\n const reasons: Record<string, Record<string, EvaluationReason>> = {};\n for (let index = 0; index < factValues!.length; index++) {\n if (!oldFactValues) {\n (reasons[rule.id] ||= {})[inputFacts[index]] = { factName: inputFacts[index], newValue: factValues![index] };\n } else if (oldFactValues[index]?.toString() !== factValues![index]?.toString()) {\n (reasons[rule.id] ||= {})[inputFacts[index]] = { factName: inputFacts[index], oldValue: oldFactValues[index], newValue: factValues![index] };\n }\n }\n\n const ruleEvaluation: RuleEvaluation = {\n timestamp: Date.now(),\n outputActions,\n id: executionId,\n triggers: reasons,\n temporaryFacts: rule.outputRuntimeFacts.concat(rule.inputRuntimeFacts).reduce<Record<string, Facts>>((acc, runtimeFactName) => {\n if (typeof runtimeFactValues[runtimeFactName] !== 'undefined') {\n acc[runtimeFactName] = runtimeFactValues[runtimeFactName];\n }\n return acc;\n }, {}\n ),\n rule: { id: rule.id, name: rule.name },\n ...(outputError ? { error: outputError } : {})\n };\n return ruleEvaluation;\n}\n","import {\n debounceTime,\n Observable,\n ReplaySubject,\n Subject,\n} from 'rxjs';\nimport {\n concatMap,\n share,\n shareReplay,\n startWith,\n switchMap,\n tap,\n withLatestFrom,\n} from 'rxjs/operators';\nimport type {\n RulesEngine,\n} from '../engine';\nimport {\n BaseRulesetExecution,\n DebugEvent,\n EvaluationReason,\n RuleEvaluation,\n RuleEvaluationOutput,\n RulesetExecutionErrorEvent,\n RulesetExecutionEvent,\n} from '../engine.interface';\nimport type {\n Facts,\n} from '../fact';\nimport {\n RulesetExecutor,\n} from '../ruleset-executor';\nimport type {\n ActionBlock,\n Ruleset,\n} from '../structure';\nimport {\n flagCachedRules,\n retrieveRulesetTriggers,\n} from './helpers';\n\nexport interface EngineDebuggerOptions {\n /**\n * Limit of events to keep in the stack before subscribing to the debugEvents$ stream.\n * @default undefined no limit\n */\n eventsStackLimit?: number;\n}\n\n/**\n * Rules engine debugger object to emit debug events\n */\nexport class EngineDebugger {\n private registeredRuleEngine?: RulesEngine;\n\n private registeredRulesets: Pick<Ruleset, 'name' | 'id'>[] = [];\n\n // Keep a small history in case the events$ stream from the engine is subscribed after rules engine initialization\n private readonly debugEventsSubject$: ReplaySubject<() => (Promise<DebugEvent> | DebugEvent)>;\n\n private performanceMeasures$!: Observable<PerformanceMeasure[]>;\n\n private readonly requestFactsSnapshot = new Subject<void>();\n\n /** Stream emitting a debug event when is fired; timeline is kept */\n public readonly debugEvents$: Observable<DebugEvent>;\n\n /** Retrieved the rules engine plugged to the debugger */\n public get rulesEngine(): RulesEngine | undefined {\n return this.registeredRuleEngine;\n }\n\n /**\n * Instantiate a rules engine debugger\n * @param options Options to configure the debugger\n */\n constructor(options?: EngineDebuggerOptions) {\n this.debugEventsSubject$ = new ReplaySubject<() => (Promise<DebugEvent> | DebugEvent)>(options?.eventsStackLimit);\n this.initializePerformanceObserver();\n this.debugEvents$ = new Observable<DebugEvent>((subscriber) => {\n const factsSnapshotSubscription = this.requestFactsSnapshot.pipe(\n debounceTime(1000),\n switchMap(async () => {\n const timestamp = Date.now();\n const facts = await this.getFactsSnapshot(this.registeredRuleEngine!.getRegisteredFactsNames());\n this.debugEventsSubject$.next(() => ({\n timestamp,\n type: 'AvailableFactsSnapshot',\n facts\n }));\n })\n ).subscribe();\n const debugEventsSubscription = this.debugEventsSubject$.pipe(\n withLatestFrom(this.performanceMeasures$),\n concatMap(async ([eventFunc, performanceMeasures]) => {\n const debugEvent: DebugEvent = await eventFunc();\n if (debugEvent.type === 'RulesetExecution' || debugEvent.type === 'RulesetExecutionError') {\n let rulesetDuration = 0;\n debugEvent.rulesEvaluations.forEach((rule) => {\n const mark = `rules-engine:${\n this.registeredRuleEngine?.rulesEngineInstanceName || ''\n }:${debugEvent.rulesetName}:${rule.rule.name}`;\n const measures = performanceMeasures.filter((m) => m.name === mark);\n const duration = measures.at(-1)?.duration || 0;\n rule.duration = duration;\n rulesetDuration += duration;\n });\n debugEvent.duration = rulesetDuration;\n }\n return debugEvent;\n }),\n tap((debugEvent) => {\n if (debugEvent.type === 'RulesetExecution') {\n this.rulesEngine?.logger?.debug?.(`${debugEvent.rulesetName} has been triggered and resulted in ${JSON.stringify(debugEvent.outputActions)}`);\n }\n })\n ).subscribe(subscriber);\n\n return () => {\n factsSnapshotSubscription.unsubscribe();\n debugEventsSubscription.unsubscribe();\n };\n }).pipe(share());\n }\n\n private initializePerformanceObserver() {\n this.performanceMeasures$ = new Observable<PerformanceMeasure[]>((subscriber) => {\n const performanceObserver = new PerformanceObserver((list) => {\n subscriber.next(list.getEntries() as PerformanceMeasure[]);\n });\n performanceObserver.observe({ entryTypes: ['measure'] });\n return () => performanceObserver.disconnect();\n }).pipe(startWith([]), shareReplay(1));\n }\n\n private async createBaseExecutionOutputObject(ruleset: Ruleset, executionCounter: number,\n rulesetInputFacts: string[], runtimeFactValues: Record<string, Facts>,\n rulesetTriggers: Record<string, Record<string, EvaluationReason>>, rulesExecutions: RuleEvaluation[]) {\n const inputFacts = await this.getFactsSnapshot(rulesetInputFacts);\n\n const baseRulesetOutputExecution: BaseRulesetExecution = {\n executionCounter,\n executionId: `${ruleset.id}-${executionCounter}`,\n rulesetId: ruleset.id,\n rulesetName: ruleset.name,\n inputFacts,\n triggers: rulesetTriggers,\n rulesEvaluations: flagCachedRules(rulesExecutions?.sort((a, b) => a.timestamp - b.timestamp) || [], rulesetTriggers),\n temporaryFacts: runtimeFactValues\n };\n return baseRulesetOutputExecution;\n }\n\n private async rulesetExecution(\n timestamp: number,\n ruleset: Ruleset,\n executionCounter: number,\n rulesetInputFacts: string[],\n allOutputActions: ActionBlock[],\n runtimeFactValues: Record<string, Facts>,\n rulesetTriggers: Record<string, Record<string, EvaluationReason>>,\n rulesExecutions: RuleEvaluation[]) {\n const baseRulesetOutputExecution = await this.createBaseExecutionOutputObject(ruleset, executionCounter, rulesetInputFacts, runtimeFactValues, rulesetTriggers, rulesExecutions);\n\n const rulesetOutputExecution: RulesetExecutionEvent = {\n timestamp,\n type: 'RulesetExecution',\n outputActions: allOutputActions,\n ...baseRulesetOutputExecution\n };\n\n return rulesetOutputExecution;\n }\n\n private async rulesetExecutionError(\n timestamp: number,\n ruleset: Ruleset,\n rulesetInputFacts: string[],\n executionCounter: number,\n runtimeFactValues: Record<string, Facts>,\n rulesetTriggers: Record<string, Record<string, EvaluationReason>>,\n rulesExecutions: RuleEvaluation[]\n ) {\n const baseRulesetOutputExecution = await this.createBaseExecutionOutputObject(ruleset, executionCounter, rulesetInputFacts, runtimeFactValues, rulesetTriggers, rulesExecutions);\n\n const rulesExecWithErrors = rulesExecutions.filter((ex) => !!ex && !!ex.error);\n const rulesetOutputExecutionSkip: RulesetExecutionErrorEvent = {\n timestamp,\n type: 'RulesetExecutionError',\n rulesCausingTheError: rulesExecWithErrors.map((e) => e.rule) || [],\n errors: rulesExecWithErrors.map((e) => e.error),\n ...baseRulesetOutputExecution\n };\n return rulesetOutputExecutionSkip;\n }\n\n /**\n * Plug the debugger to a Rule Engine\n * @param rulesEngine\n */\n public registerRuleEngine(rulesEngine: RulesEngine) {\n this.registeredRuleEngine = rulesEngine;\n }\n\n /**\n * Handle ruleset execution debug info\n * @param currRes\n * @param prevRes\n * @param allExecutionsValid\n * @param rulesetInputFacts\n * @param runtimeFactValues\n * @param executionCounter\n * @param ruleset\n */\n public handleDebugRulesetExecutionInfo(\n currRes: RuleEvaluationOutput[],\n prevRes: RuleEvaluationOutput[] | undefined,\n allExecutionsValid: boolean,\n rulesetInputFacts: string[],\n runtimeFactValues: Record<string, Facts>,\n executionCounter: number,\n ruleset: Ruleset) {\n const rulesetTriggers = retrieveRulesetTriggers(currRes, prevRes);\n const rulesetOutputExecution = currRes.map((r) => r.evaluation!);\n\n if (!allExecutionsValid) {\n this.addRulesetExecutionErrorEvent(ruleset, rulesetInputFacts, executionCounter, runtimeFactValues, rulesetTriggers, rulesetOutputExecution);\n }\n\n return {\n executionCounter,\n rulesetOutputExecution,\n allExecutionsValid,\n rulesetTriggers\n };\n }\n\n /**\n * Emits an 'AvailableRulesets' debug event when rulesets are registered to the rules engine\n * @param rulesets\n */\n public addAvailableRulesets(rulesets: Ruleset[]) {\n const timestamp = Date.now();\n this.registeredRulesets = [...this.registeredRulesets, ...rulesets.map((r) => ({ name: r.name, id: r.id }))];\n this.debugEventsSubject$.next(() => ({\n timestamp,\n type: 'AvailableRulesets',\n availableRulesets: this.registeredRulesets\n }));\n }\n\n /**\n * Computes and emits an 'ActiveRulesets' debug event when the active rulesets are changing\n * @param ruleSetExecutorMap map off all rulesets executors\n * @param restrictiveRuleSets ids of the rulesets to activate; if not provided all registered rulesets will be considered as active\n */\n public activeRulesetsChange(ruleSetExecutorMap: Record<string, RulesetExecutor>, restrictiveRuleSets?: string[]) {\n const timestamp = Date.now();\n const rulesets = Object.keys(ruleSetExecutorMap).map((rulesetId) => ruleSetExecutorMap[rulesetId].engineRuleset);\n const activeRulesets = restrictiveRuleSets\n ? Object.values(rulesets).filter((ruleSet) => restrictiveRuleSets.includes(ruleSet.id))\n : Object.values(rulesets);\n\n this.debugEventsSubject$.next(() => ({\n timestamp,\n type: 'ActiveRulesets',\n rulesets: activeRulesets.map((a) => ({ name: ruleSetExecutorMap[a.id].ruleset.name, id: ruleSetExecutorMap[a.id].ruleset.id }))\n }));\n }\n\n /**\n * Emits an 'AllActions' debug event each time the rules engine outputs the list of actions\n * @param actions list of outputted actions\n */\n public allActionsChange(actions: ActionBlock[]) {\n const timestamp = Date.now();\n this.debugEventsSubject$.next(() => ({ timestamp, type: 'AllActions', actions }));\n }\n\n /**\n * Emits a 'RulesetExecution' debug event at the output of a successful ruleset execution\n * @param ruleset\n * @param executionCounter\n * @param rulesetInputFacts\n * @param allOutputActions\n * @param runtimeFactValues\n * @param rulesetTriggers\n * @param rulesExecutions\n */\n public addRulesetExecutionEvent(ruleset: Ruleset, executionCounter: number,\n rulesetInputFacts: string[], allOutputActions: ActionBlock[], runtimeFactValues: Record<string, Facts>,\n rulesetTriggers: Record<string, Record<string, EvaluationReason>>, rulesExecutions: RuleEvaluation[]) {\n const timestamp = Date.now();\n this.debugEventsSubject$.next(() => this.rulesetExecution(timestamp, ruleset, executionCounter,\n rulesetInputFacts, allOutputActions, runtimeFactValues, rulesetTriggers, rulesExecutions));\n }\n\n /**\n * Emits a 'RulesetExecutionError' debug event at the output of a failing ruleset execution\n * @param ruleset\n * @param rulesetInputFacts\n * @param executionCounter\n * @param runtimeFactValues\n * @param rulesetTriggers\n * @param rulesExecutions\n */\n public addRulesetExecutionErrorEvent(\n ruleset: Ruleset,\n rulesetInputFacts: string[],\n executionCounter: number,\n runtimeFactValues: Record<string, Facts>,\n rulesetTriggers: Record<string, Record<string, EvaluationReason>>,\n rulesExecutions: RuleEvaluation[]\n ) {\n const timestamp = Date.now();\n this.debugEventsSubject$.next(() => this.rulesetExecutionError(timestamp, ruleset, rulesetInputFacts, executionCounter, runtimeFactValues, rulesetTriggers, rulesExecutions));\n }\n\n /**\n * Emits a 'AvailableFactsSnapshot' debug event when a fact value is updated\n * @param _id\n * @param factValue$\n */\n public addAvailableFactsSnapshotEvent(\n _id: string,\n factValue$: Observable<any>\n ) {\n factValue$.subscribe(() => this.requestFactsSnapshot.next());\n }\n\n /**\n * Returns a list of fact name and value pairs\n * @param factsNames List of facts names to get the value for\n */\n public async getFactsSnapshot(factsNames: string[]) {\n const facts: { factName: string; value: any }[] = [];\n if (!this.registeredRuleEngine) {\n throw new Error('Rule engine not plugged to the debugger');\n }\n for (const factName of factsNames) {\n facts.push({ factName, value: await this.registeredRuleEngine.retrieveFactValue(factName) });\n }\n return facts;\n }\n}\n","import {\n combineLatest,\n Observable,\n of,\n} from 'rxjs';\nimport {\n map,\n shareReplay,\n switchMap,\n} from 'rxjs/operators';\nimport {\n RulesetExecutor,\n} from '../ruleset-executor';\n\n/**\n * Filter the actions outputted by the rules engine, based on active rulesets\n * @param restrictiveRuleSets list of rules sets to get the event stream for\n */\nexport function filterRulesetsEventStream(restrictiveRuleSets?: string[]) {\n return (source$: Observable<Record<string, RulesetExecutor>>) => source$.pipe(\n switchMap((ruleSetExecutorMap) => {\n const rulesets = Object.keys(ruleSetExecutorMap).map((rulesetId) => ruleSetExecutorMap[rulesetId].engineRuleset);\n const activeRulesets = restrictiveRuleSets\n ? Object.values(rulesets).filter((ruleSet) => restrictiveRuleSets.includes(ruleSet.id))\n : Object.values(rulesets);\n\n return activeRulesets?.length > 0\n ? combineLatest(activeRulesets.map((ruleset) => ruleset.rulesResultsSubject$)).pipe(\n map((item) => item.reduce((acc, currentValue) => {\n acc.push(...currentValue);\n return acc;\n }, [])))\n : of([]);\n }),\n shareReplay(1)\n );\n}\n","import type {\n Facts,\n} from '../fact';\nimport {\n DateInput,\n Operator,\n SupportedSimpleTypes,\n} from './operator.interface';\n\n/**\n * Execute Operator\n * @param lhs Left hand side\n * @param rhs Right hand side\n * @param operator Operator to compare values\n * @param operatorFacts Facts that operator can depend on\n */\nexport function executeOperator<L = unknown, R = unknown>(lhs: L, rhs: R, operator: Operator<L, R>, operatorFacts?: Record<string, Facts | undefined>) {\n const validLhs = (!operator.validateLhs || operator.validateLhs(lhs));\n const validRhs = (!operator.validateRhs || operator.validateRhs(rhs));\n let operatorFactValues: Record<string, Facts> | undefined;\n if (operatorFacts && operator.factImplicitDependencies) {\n operatorFactValues = operator.factImplicitDependencies.reduce((acc, dep) => {\n if (operatorFacts[dep]) {\n acc[dep] = operatorFacts[dep]!;\n } else {\n throw new Error(`The fact \"${dep}\" requested by ${operator.name} cannot be found.`);\n }\n return acc;\n }, {} as Record<string, Facts>);\n }\n if (!validLhs) {\n throw new Error(`Invalid left operand: ${JSON.stringify(lhs)}`);\n }\n if (!validRhs) {\n throw new Error(`Invalid right operand: ${JSON.stringify(rhs)}`);\n }\n const obs = operator.evaluator(lhs, rhs, operatorFactValues);\n return obs;\n}\n\n/**\n * Validate a number operand\n * @param operand value of one of the operands\n */\nexport function numberValidator(operand: unknown): operand is number | string {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- needed to convert any variable in a number (or NaN)\n return operand !== '' && !Array.isArray(operand) && !Number.isNaN(+`${operand}`);\n}\n\n/**\n * Validate an operand is a range of numbers\n * @param operatorInput value of one of the operands\n */\nexport function isRangeNumber(operatorInput: unknown): operatorInput is [number | string, number | string] {\n return Array.isArray(operatorInput)\n && operatorInput.length === 2\n && numberValidator(operatorInput[0])\n && numberValidator(operatorInput[1])\n && operatorInput[0] <= operatorInput[1];\n}\n\n/**\n * Verifies if the parameter is a valid date for the operator (getTime function available returning a number)\n * @param operatorInput\n */\nexport const isValidDate = (operatorInput: any): operatorInput is Date => {\n if (!operatorInput || typeof operatorInput.getTime !== 'function') {\n return false;\n }\n const getTimeResult = operatorInput.getTime();\n return typeof getTimeResult === 'number' && !Number.isNaN(getTimeResult);\n};\n\n/**\n * Verifies if the parameter is a valid input for Date constructor (new Date returns a valid date)\n * @param operatorInput\n */\nexport const isValidDateInput = (operatorInput: any): operatorInput is DateInput => {\n return operatorInput === 0 || (!!operatorInput && isValidDate(new Date(operatorInput)));\n};\n\n/**\n * Verifies if the parameter is a valid date range\n * @param operatorInput\n */\nexport const isValidDateRange = (operatorInput: any): operatorInput is [DateInput, DateInput] => {\n return Array.isArray(operatorInput)\n && operatorInput.length === 2\n && isValidDateInput(operatorInput[0])\n && isValidDateInput(operatorInput[1])\n && new Date(operatorInput[0]) <= new Date(operatorInput[1]);\n};\n\n/**\n * Verifies if the parameter is a valid time input\n * @param operatorInput\n */\nexport const isValidTimeInput = (operatorInput: any): operatorInput is string => {\n if (!isString(operatorInput) || !/^\\d{1,2}:\\d{2}$/.test(operatorInput)) {\n return false;\n }\n const [hours, minutes] = operatorInput.split(':').map((value) => +value);\n return hours < 24 && minutes < 60;\n};\n\n/**\n * Verifies if the parameter is a valid time range\n * @param operatorInput\n */\nexport const isValidTimeRange = (operatorInput: any): operatorInput is [string, string] => {\n return Array.isArray(operatorInput)\n && operatorInput.length === 2\n && isValidTimeInput(operatorInput[0])\n && isValidTimeInput(operatorInput[1]);\n};\n\n/**\n * Validate that a value is a supported simple type\n * @param value value to validate\n */\nexport function isSupportedSimpleTypes(value: unknown): value is SupportedSimpleTypes {\n return ['string', 'boolean', 'number', 'undefined'].includes(typeof value) || value === null || isValidDate(value);\n}\n\n/**\n * Validate that a value is a string\n * @param value\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\n/**\n * Parse input to return RegExp\n * @param inputRegExp\n */\nexport function parseRegExp(inputRegExp: string) {\n if (inputRegExp.startsWith('/')) {\n const finalSlash = inputRegExp.lastIndexOf('/');\n const regexpPattern = inputRegExp.slice(1, finalSlash);\n const regexpFlags = inputRegExp.slice(finalSlash + 1);\n return new RegExp(regexpPattern, regexpFlags);\n }\n return new RegExp(inputRegExp);\n}\n","import {\n isRangeNumber,\n isString,\n isSupportedSimpleTypes,\n numberValidator,\n parseRegExp,\n} from '../operator.helpers';\nimport {\n Operator,\n SupportedSimpleTypes,\n} from '../operator.interface';\n\n/**\n * Check if any of the variable's value is equal to a specific value\n * @title contains\n */\nexport const arrayContains: Operator<SupportedSimpleTypes[], SupportedSimpleTypes> = {\n name: 'arrayContains',\n evaluator: (value, b) => value.includes(b),\n validateLhs: Array.isArray,\n validateRhs: isSupportedSimpleTypes\n};\n\n/**\n * Check if the specified text value is included in the text variable\n * @title contains\n */\nexport const stringContains: Operator<string, string> = {\n name: 'stringContains',\n evaluator: (inputString, substring) => inputString.includes(substring),\n validateLhs: isString,\n validateRhs: isString\n};\n\n/**\n * Check if every value of the variable is different from a specific value\n * @title does not contain\n */\nexport const notArrayContains: Operator<SupportedSimpleTypes[], SupportedSimpleTypes> = {\n name: 'notArrayContains',\n evaluator: (array, value) => !array.includes(value),\n validateLhs: Array.isArray,\n validateRhs: isSupportedSimpleTypes\n};\n\n/**\n * Check if the specified text value is not included in the text variable\n * @title does not contain\n */\nexport const notStringContains: Operator<string, string> = {\n name: 'notStringContains',\n evaluator: (inputString, substring: any) => !inputString.includes(substring),\n validateLhs: isString,\n validateRhs: isString\n};\n\n/**\n * Check if every value of the variable equals a specific value\n * @title all equal to\n */\nexport const allEqual: Operator<SupportedSimpleTypes[], SupportedSimpleTypes> = {\n name: 'allEqual',\n // eslint-disable-next-line eqeqeq -- possibility of comparing string and number values\n evaluator: (array, value) => array.every((elementValue) => elementValue == value),\n validateLhs: Array.isArray,\n validateRhs: isSupportedSimpleTypes\n};\n\n/**\n * Check if every numerical value of the variable is greater than a specific value\n * @title all >\n */\nexport const allGreater: Operator<SupportedSimpleTypes[], number | string> = {\n name: 'allGreater',\n evaluator: (array, value) => array.every((elementValue) => numberValidator(elementValue) && +elementValue > +value),\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if every value of the variable is in a specific list\n * @title all in\n */\nexport const allIn: Operator<SupportedSimpleTypes[], SupportedSimpleTypes[]> = {\n name: 'allIn',\n evaluator: (array, value) => array.every((elementValue) => value.includes(elementValue)),\n validateLhs: Array.isArray,\n validateRhs: Array.isArray\n};\n\n/**\n * Check if every value of the variable is not in a specific list\n * @title none in\n */\nexport const allNotIn: Operator<SupportedSimpleTypes[], SupportedSimpleTypes[]> = {\n name: 'allNotIn',\n evaluator: (array, value) => !array.some((elementValue) => value.includes(elementValue)),\n validateLhs: Array.isArray,\n validateRhs: Array.isArray\n};\n\n/**\n * Check if every numerical value of the variable is lower than a specific value\n * @title all <\n */\nexport const allLower: Operator<number[], number | string> = {\n name: 'allLower',\n evaluator: (arrayNumber, number) => arrayNumber.every((elementNumber) => elementNumber < +number),\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if every string value of the variable matches a specific pattern\n * @title all match\n */\nexport const allMatch: Operator<string[], string> = {\n name: 'allMatch',\n evaluator: (array, inputRegExp) => {\n const regExp = parseRegExp(inputRegExp);\n return array.every((elementValue) => regExp.test(elementValue));\n },\n validateLhs: Array.isArray,\n validateRhs: isString\n};\n\n/**\n * Check if every value of the variable is included in a specified range\n * @title all between\n */\nexport const allRangeNumber: Operator<number[], [number | string, number | string]> = {\n name: 'allRangeNumber',\n evaluator: (rangeArray, [from, to]) =>\n rangeArray.every((elementValue) => elementValue >= +from && elementValue <= +to),\n validateLhs: Array.isArray,\n validateRhs: isRangeNumber\n};\n\n/**\n * Check if at least one of the values of the variable equals a specific value\n * @title one equal to\n */\nexport const oneEquals: Operator<SupportedSimpleTypes[], SupportedSimpleTypes> = {\n name: 'oneEquals',\n // eslint-disable-next-line eqeqeq -- possibility of comparing string and number values\n evaluator: (array, value) => array.some((elementValue) => elementValue == value),\n validateLhs: Array.isArray,\n validateRhs: isSupportedSimpleTypes\n};\n\n/**\n * Check if one of the values of the variable is greater than a specific value\n * @title one >\n */\nexport const oneGreater: Operator<number[], number | string> = {\n name: 'oneGreater',\n evaluator: (arrayNumber, number) => arrayNumber.some((elementValue) => elementValue > +number),\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if at least one of the values of the variable is equal to one in a specified list\n * @title one in\n */\nexport const oneIn: Operator<SupportedSimpleTypes[], SupportedSimpleTypes[]> = {\n name: 'oneIn',\n evaluator: (firstArray, secondArray) =>\n firstArray.some((elementValue) => secondArray.includes(elementValue)),\n validateLhs: Array.isArray,\n validateRhs: Array.isArray\n};\n\n/**\n * Check if one of the values of the variable is lower than a specific value\n * @title one <\n */\nexport const oneLower: Operator<number[], number | string> = {\n name: 'oneLower',\n evaluator: (arrayNumber, number) => arrayNumber.some((elementValue) => elementValue < +number),\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if one of the values of the variable matches a specific pattern\n * @title one matches\n */\nexport const oneMatches: Operator<string[], string> = {\n name: 'oneMatches',\n evaluator: (arrayString, inputRegExp) => {\n const regExp = parseRegExp(inputRegExp);\n return arrayString.some((elementValue) => regExp.test(elementValue));\n },\n validateLhs: Array.isArray,\n validateRhs: isString\n};\n\n/**\n * Check if one of the values of the variable is included in a specified range\n * @title one between\n */\nexport const oneRangeNumber: Operator<number[], [number | string, number | string]> = {\n name: 'oneRangeNumber',\n evaluator: (arrayNumber, [from, to]) =>\n arrayNumber.some((elementValue) => elementValue >= +from && elementValue <= +to),\n validateLhs: Array.isArray,\n validateRhs: isRangeNumber\n};\n\n/**\n * Check if the number of values of the variable is equal to a specific value\n * @title number of =\n */\nexport const lengthEquals: Operator<any[], number | string> = {\n name: 'lengthEquals',\n evaluator: (array, length) => array.length === Number(length),\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is different from a specific value\n * @title number of ≠\n */\nexport const lengthNotEquals: Operator<any[], number | string> = {\n name: 'lengthNotEquals',\n evaluator: (array, length) => array.length !== Number(length),\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is lower or equal to a specific value\n * @title number of ≤\n */\nexport const lengthLessThanOrEquals: Operator<any[], number | string> = {\n name: 'lengthLessThanOrEquals',\n evaluator: (array, length) => array.length <= +length,\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is lower than a specific value\n * @title number of <\n */\nexport const lengthLessThan: Operator<any[], number | string> = {\n name: 'lengthLessThan',\n evaluator: (array, length) => array.length < +length,\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is greater or equal to a specific value\n * @title number of ≥\n */\nexport const lengthGreaterThanOrEquals: Operator<any[], number | string> = {\n name: 'lengthGreaterThanOrEquals',\n evaluator: (array, length) => array.length >= +length,\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is greater than a specific value\n * @title number of >\n */\nexport const lengthGreaterThan: Operator<any[], number | string> = {\n name: 'lengthGreaterThan',\n evaluator: (array, length) => array.length > +length,\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/** List of all default array operators */\nexport const arrayBasedOperators = [\n allEqual,\n allGreater,\n allIn,\n allLower,\n allMatch,\n allNotIn,\n allRangeNumber,\n arrayContains,\n lengthEquals,\n lengthNotEquals,\n lengthGreaterThan,\n lengthGreaterThanOrEquals,\n lengthLessThan,\n lengthLessThanOrEquals,\n notArrayContains,\n notStringContains,\n oneEquals,\n oneGreater,\n oneIn,\n oneLower,\n oneMatches,\n oneRangeNumber,\n stringContains\n];\n","import {\n isString,\n isSupportedSimpleTypes,\n parseRegExp,\n} from '../operator.helpers';\nimport {\n Operator,\n SupportedSimpleTypes,\n UnaryOperator,\n} from '../operator.interface';\n\n/**\n * Check if a variable is equal to a specific value\n * @title is equal to\n */\nexport const equals: Operator = {\n name: 'equals',\n // eslint-disable-next-line eqeqeq -- possibility of comparing string and number values\n evaluator: (firstValue, secondValue) => firstValue == secondValue\n};\n\n/**\n * Check if a variable is different from a specific value\n * @title is not equal to\n */\nexport const notEquals: Operator = {\n name: 'notEquals',\n // eslint-disable-next-line eqeqeq -- possibility of comparing string and number values\n evaluator: (firstValue, secondValue) => firstValue != secondValue\n};\n\n/**\n * Check if the variable's value is included in a specified list\n * @title is in\n */\nexport const inArray: Operator<SupportedSimpleTypes, SupportedSimpleTypes[]> = {\n name: 'inArray',\n evaluator: (value, array) => array.includes(value),\n validateLhs: isSupportedSimpleTypes,\n validateRhs: Array.isArray\n};\n\n/**\n * Check if the variable's value is not included in the value list\n * @title is not in\n */\nexport const notInArray: Operator<SupportedSimpleTypes, SupportedSimpleTypes[]> = {\n name: 'notInArray',\n evaluator: (value, array) => !array.includes(value),\n validateLhs: isSupportedSimpleTypes,\n validateRhs: Array.isArray\n};\n\n/**\n * Check if the text variable is part of the specified value\n * @title within\n */\nexport const inString: Operator<string, string> = {\n name: 'inString',\n evaluator: (value, inputString) => inputString.includes(value),\n validateLhs: isString,\n validateRhs: isString\n};\n\n/**\n * Check if the text variable is not part of the specified value\n * @title not within\n */\nexport const notInString: Operator<string, string> = {\n name: 'notInString',\n evaluator: (value, inputString) => !inputString.includes(value),\n validateLhs: isString,\n validateRhs: isString\n};\n\n/**\n * Check if the variable and its value are defined\n * @title is defined\n */\nexport const isDefined: UnaryOperator<any> = {\n name: 'isDefined',\n evaluator: (input) => input !== undefined && input !== null\n};\n\n/**\n * Check if the variable and its value are undefined\n * @title is not defined\n */\nexport const isUndefined: UnaryOperator<any> = {\n name: 'isUndefined',\n evaluator: (input) => input === undefined || input === null\n};\n\n/**\n * Check if the text variable matches the specified RegExp pattern\n * @title matches the pattern\n */\nexport const matchesPattern: Operator<string, string> = {\n name: 'matchesPattern',\n evaluator: (value, inputRegExp) => {\n const regExp = parseRegExp(inputRegExp);\n return regExp.test(value);\n },\n validateLhs: isString,\n validateRhs: isString\n};\n\n/** List of all default basic operators */\nexport const basicOperators = [\n equals, inArray, inString, isDefined, isUndefined, matchesPattern, notEquals, notInArray, notInString\n];\n","import {\n isValidDateInput,\n isValidDateRange,\n numberValidator,\n} from '../operator.helpers';\nimport {\n DateInput,\n Operator,\n} from '../operator.interface';\n\n/**\n * Check if a date variable is in a specified date range\n * @title is between\n */\nexport const inRangeDate: Operator<Date, [DateInput, DateInput], DateInput> = {\n name: 'inRangeDate',\n evaluator: (date, [from, to]) => {\n const dateObject = new Date(date);\n return new Date(from) <= dateObject && new Date(to) >= dateObject;\n },\n validateLhs: isValidDateInput,\n validateRhs: isValidDateRange\n};\n\n/**\n * Check if the value of the variable is in the next x minutes\n * @title is in next minutes\n * @returns false for dates before `now` and for dates after `now` + `nextMinutes`, true for dates between `now` and `now` + `nextMinutes`\n */\nexport const dateInNextMinutes: Operator<Date, number, DateInput, string | number> = {\n name: 'dateInNextMinutes',\n evaluator: (leftDateInput, minutes, operatorFactValues) => {\n if (!operatorFactValues) {\n throw new Error('No operatorFactValues. Unable to retrieve the current time.');\n }\n if (typeof operatorFactValues.o3rCurrentTime !== 'number') {\n throw new Error('o3rCurrentTime value is not a number');\n }\n const currentTimeValue = operatorFactValues.o3rCurrentTime;\n return inRangeDate.evaluator(leftDateInput, [currentTimeValue, currentTimeValue + +minutes * 60_000]);\n },\n factImplicitDependencies: ['o3rCurrentTime'],\n validateLhs: isValidDateInput,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the value of the variable is not in the next x minutes\n * @title is not in next minutes\n * @returns false for dates before `now` and for dates between `now` and `now` + `nextMinutes`, true for dates after `now` + `nextMinutes`\n */\nexport const dateNotInNextMinutes: Operator<Date, number, DateInput, string | number> = {\n name: 'dateNotInNextMinutes',\n evaluator: (leftDateInput, minutes, operatorFactValues) => {\n if (!operatorFactValues) {\n throw new Error('No operatorFactValues. Unable to retrieve the current time.');\n }\n if (typeof operatorFactValues.o3rCurrentTime !== 'number') {\n throw new Error('o3rCurrentTime value is not a number');\n }\n const currentTimeValue = operatorFactValues.o3rCurrentTime;\n const now = new Date(currentTimeValue);\n const leftDate = new Date(leftDateInput);\n const targetDate = new Date(new Date(currentTimeValue).setMinutes(now.getMinutes() + +minutes));\n return leftDate >= now && leftDate > targetDate;\n },\n factImplicitDependencies: ['o3rCurrentTime'],\n validateLhs: isValidDateInput,\n validateRhs: numberValidator\n};\n\n/**\n * Check if a date variable is prior than a specified date\n * @title is before\n */\nexport const dateBefore: Operator<Date, DateInput, DateInput> = {\n name: 'dateBefore',\n evaluator: (leftDate, rightDate) => {\n const firstDateTime = new Date(leftDate).setHours(0, 0, 0, 0);\n const secondDateTime = new Date(rightDate).setHours(0, 0, 0, 0);\n return firstDateTime < secondDateTime;\n },\n validateLhs: isValidDateInput,\n validateRhs: isValidDateInput\n};\n\n/**\n * Check if a date variable is posterior than a specified date\n * @title is after\n */\nexport const dateAfter: Operator<Date, DateInput, DateInput> = {\n name: 'dateAfter',\n evaluator: (leftDate, rightDate) => {\n const firstDateTime = new Date(leftDate).setHours(0, 0, 0, 0);\n const secondDateTime = new Date(rightDate).setHours(0, 0, 0, 0);\n return firstDateTime > secondDateTime;\n },\n validateLhs: isValidDateInput,\n validateRhs: isValidDateInput\n};\n\n/**\n * Check if a date variable is the same as a specified date\n * @title is equal to\n */\nexport const dateEquals: Operator<Date, DateInput, DateInput> = {\n name: 'dateEquals',\n evaluator: (leftDate, rightDate) => {\n const firstDateIgnoringHours = new Date(leftDate).setHours(0, 0, 0, 0);\n const secondDateIgnoringHours = new Date(rightDate).setHours(0, 0, 0, 0);\n return firstDateIgnoringHours === secondDateIgnoringHours;\n },\n validateLhs: isValidDateInput,\n validateRhs: isValidDateInput\n};\n\n/**\n * Check if a date variable is different from a specified date\n * @title is not equal\n */\nexport const dateNotEquals: Operator<Date, DateInput, DateInput> = {\n name: 'dateNotEquals',\n evaluator: (leftDate, rightDate) => {\n const firstDateIgnoringHours = new Date(leftDate).setHours(0, 0, 0, 0);\n const secondDateIgnoringHours = new Date(rightDate).setHours(0, 0, 0, 0);\n return firstDateIgnoringHours !== secondDateIgnoringHours;\n },\n validateLhs: isValidDateInput,\n validateRhs: isValidDateInput\n};\n\nexport const dateBasedOperators = [\n inRangeDate, dateInNextMinutes, dateNotInNextMinutes, dateAfter, dateBefore, dateEquals, dateNotEquals\n];\n","import {\n numberValidator,\n} from '../operator.helpers';\nimport {\n Operator,\n} from '../operator.interface';\n\n/**\n * Check if the number variable is greater or equal to a specific value\n * @title ≥\n */\nexport const greaterThanOrEqual: Operator<number, number, number | string, number | string> = {\n name: 'greaterThanOrEqual',\n evaluator: (firstNumber, secondNumber) => firstNumber >= secondNumber,\n validateLhs: numberValidator,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number variable is greater than a specific value\n * @title >\n */\nexport const greaterThan: Operator<number, number, number | string, number | string> = {\n name: 'greaterThan',\n evaluator: (firstNumber, secondNumber) => firstNumber > secondNumber,\n validateLhs: numberValidator,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number variable is lower or equal to a specific value\n * @title ≤\n */\nexport const lessOrEqual: Operator<number, number, number | string, number | string> = {\n name: 'lessOrEqual',\n evaluator: (firstNumber, secondNumber) => firstNumber <= secondNumber,\n validateLhs: numberValidator,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number variable is lower than a specific value\n * @title <\n */\nexport const lessThan: Operator<number, number, number | string, number | string> = {\n name: 'lessThan',\n evaluator: (firstNumber, secondNumber) => firstNumber < secondNumber,\n validateLhs: numberValidator,\n validateRhs: numberValidator\n};\n\n/** List of all default number based operators */\nexport const numberBasedOperators = [greaterThan, greaterThanOrEqual, lessThan, lessOrEqual];\n","import {\n arrayBasedOperators,\n} from './array-based.operators';\nimport {\n basicOperators,\n} from './basic.operators';\nimport {\n dateBasedOperators,\n} from './date-based.operators';\nimport {\n numberBasedOperators,\n} from './number-based.operators';\n\nexport * from './array-based.operators';\nexport * from './basic.operators';\nexport * from './date-based.operators';\nexport * from './number-based.operators';\n\nexport const operatorList = [...arrayBasedOperators, ...basicOperators, ...numberBasedOperators, ...dateBasedOperators];\n","import {\n AllConditions,\n AnyConditions,\n BinaryOperation,\n NotCondition,\n Operand,\n OperandFact,\n UnaryOperation,\n} from '../structure';\n\n/**\n * Determine if the condition is a properties condition\n * @param condition Condition to analyze\n */\nexport function isConditionProperties(condition: any): condition is BinaryOperation | UnaryOperation {\n return condition && typeof condition.operator !== 'undefined' && typeof condition.lhs !== 'undefined';\n}\n\n/**\n * Determine if the given operand is a Fact operand\n * @param operand Operand to analyze\n */\nexport function isOperandFact(operand: any): operand is OperandFact {\n return operand && operand.type === 'FACT';\n}\n\n/**\n * Determine if the given operand is a Inner Fact operand\n * @param operand Operand to analyze\n */\nexport function isOperandRuntimeFact(operand: any): operand is Operand<'RUNTIME_FACT', string> {\n return operand && operand.type === 'RUNTIME_FACT';\n}\n\n/**\n * Determine if the given operand is a Static Value operand\n * @param operand Operand to analyze\n */\nexport function isOperandLiteral(operand: any): operand is Operand<'LITERAL'> {\n return operand && operand.type === 'LITERAL';\n}\n\n/**\n * Determine if the given condition is All based child conditions\n * @param condition Condition node\n */\nexport function isAllConditions(condition: any): condition is AllConditions {\n return condition && typeof condition.all !== 'undefined';\n}\n\n/**\n * Determine if the given condition is Any based child conditions\n * @param condition Condition node\n */\nexport function isAnyConditions(condition: any): condition is AnyConditions {\n return condition && typeof condition.any !== 'undefined';\n}\n\n/**\n * Determine if the given condition is Not based child conditions\n * @param condition Condition node\n */\nexport function isNotCondition(condition: any): condition is NotCondition {\n return condition && typeof condition.not !== 'undefined';\n}\n","/** Ruleset executor */\nimport {\n JSONPath,\n} from 'jsonpath-plus';\nimport {\n combineLatest,\n Observable,\n of,\n} from 'rxjs';\nimport {\n distinctUntilChanged,\n map,\n pairwise,\n shareReplay,\n startWith,\n switchMap,\n tap,\n} from 'rxjs/operators';\nimport {\n handleRuleEvaluationDebug,\n} from './debug/helpers';\nimport type {\n RulesEngine,\n} from './engine';\nimport {\n EngineRuleset,\n EvaluationReason,\n RuleEvaluation,\n RuleEvaluationOutput,\n} from './engine.interface';\nimport type {\n Facts,\n} from './fact';\nimport {\n executeOperator,\n} from './operator/operator.helpers';\nimport {\n Operator,\n} from './operator/operator.interface';\nimport {\n isAllConditions,\n isConditionProperties,\n isNotCondition,\n isOperandFact,\n isOperandLiteral,\n isOperandRuntimeFact,\n} from './rule/rule.helpers';\nimport {\n ActionBlock,\n ActionSetTemporaryFactBlock,\n AllBlock,\n GenericOperand,\n IfElseBlock,\n NestedCondition,\n Rule,\n Ruleset,\n} from './structure';\n\n/** Type of the retrieve fact function */\nexport type RetrieveFactFuncType = <T = unknown> (id: string) => Observable<T | undefined>;\n\nexport class RulesetExecutor {\n /** retrieveFactFunc */\n protected readonly rulesEngine: RulesEngine;\n\n /** Map of available operators */\n protected readonly operators: Record<string, Operator<unknown, unknown>>;\n\n /** Delay before fact stream defaulting value */\n public readonly factDefaultDelay?: number;\n\n /** Ruleset associated to the current executor*/\n public readonly ruleset: Ruleset;\n\n /** Ruleset plugged to the fact stream, that contains actions stream result */\n public readonly engineRuleset: EngineRuleset;\n\n private executionCounter = 0;\n\n /**\n * Create a new ruleset executor\n * @param ruleset Ruleset to evaluate\n * @param rulesEngine Instance of the rules engine\n */\n constructor(ruleset: Ruleset, rulesEngine: RulesEngine) {\n this.ruleset = ruleset;\n this.rulesEngine = rulesEngine;\n this.operators = rulesEngine.operators;\n this.engineRuleset = this.plugRuleset();\n }\n\n /**\n * Recursively explores a rule to identify and collect input facts.\n * Input facts are identified based on the 'FACT' type and operator-specific implicit dependencies.\n * @param currentObject The current object being explored.\n * @param ruleInputFacts A set to store the identified input facts for the rule.\n */\n private collectRuleInputFacts(currentObject: AllBlock | NestedCondition | NestedCondition[], ruleInputFacts: Set<string>) {\n if (currentObject && isOperandFact(currentObject)) {\n ruleInputFacts.add(currentObject.value);\n } else if (Array.isArray(currentObject)) {\n currentObject.forEach((elem) => this.collectRuleInputFacts(elem, ruleInputFacts));\n } else {\n for (const key in currentObject) {\n if ((key === 'operator') && isConditionProperties(currentObject)) {\n const op = this.operators[currentObject[key]];\n if (op && op.factImplicitDependencies) {\n op.factImplicitDependencies.forEach((dep) => ruleInputFacts.add(dep));\n }\n } else if (typeof currentObject[key as keyof (AllBlock | NestedCondition)] === 'object') {\n this.collectRuleInputFacts(currentObject[key as keyof (AllBlock | NestedCondition)], ruleInputFacts);\n }\n }\n }\n }\n\n /**\n * Report performance mark for a rule run\n * @param rule Rule to measure\n * @param status status of the rule evaluation\n */\n protected performanceMark(rule: Rule, status: 'start' | 'end') {\n if (this.rulesEngine.performance) {\n const markName = `rules-engine:${this.rulesEngine.rulesEngineInstanceName}:${this.ruleset.name}:${rule.name}`;\n this.rulesEngine.performance.mark(`${markName}:${status}`);\n if (status === 'end') {\n this.rulesEngine.performance.measure(markName, `${markName}:start`, `${markName}:end`);\n }\n }\n }\n\n /**\n * Get operand value stream according to its type\n * @param operand operand of the condition\n * @param factsValue\n * @param runtimeFactValues\n */\n protected getOperandValue(operand: GenericOperand | undefined, factsValue: Record<string, Facts | undefined>, runtimeFactValues: Record<string, Facts>): unknown {\n if (typeof operand === 'undefined') {\n return undefined;\n } else if (isOperandFact(operand)) {\n const factValue = factsValue[operand.value];\n // eslint-disable-next-line new-cap -- convention for JSONPath\n return operand.path ? factValue && JSONPath({ wrap: false, json: factValue, path: operand.path }) : factValue;\n } else if (isOperandLiteral(operand)) {\n return operand.value;\n } else if (isOperandRuntimeFact(operand)) {\n return runtimeFactValues[operand.value];\n }\n return undefined;\n }\n\n /**\n * Process a root rule from a ruleset, and return the associated actions to be processed\n * Will also update the runtimeFactValues map that is ruleset wise\n * Note that runtimeFactValues will be mutated by all the runtime facts actions executed\n * @param rule\n * @param factsValue\n * @param runtimeFactValues\n * @protected\n */\n protected evaluateRule(rule: Rule, factsValue: Record<string, Facts | undefined>, runtimeFactValues: Record<string, Facts>) {\n return this.evaluateBlock(rule.rootElement, factsValue, runtimeFactValues);\n }\n\n /**\n * Recursively process a block to extract all the actions keeping the order\n * Note that runtimeFactValues will be mutated by all the runtime facts actions executed\n * @param element\n * @param factsValue\n * @param runtimeFactValues This runtime fact map will be mutated by all the runtime facts actions executed\n * @param actions\n * @protected\n */\n protected evaluateBlock(element: AllBlock, factsValue: Record<string, Facts | undefined>, runtimeFactValues: Record<string, Facts>, actions: ActionBlock[] = []) {\n if (this.isIfElseBlock(element)) {\n (!element.condition || this.evaluateCondition(element.condition, factsValue, runtimeFactValues) ? element.successElements : element.failureElements)\n .forEach((elementResult) => this.evaluateBlock(elementResult, factsValue, runtimeFactValues, actions));\n } else if (this.isActionBlock(element)) {\n if (this.isActionSetTemporaryFactBlock(element)) {\n runtimeFactValues[element.fact] = element.value;\n } else {\n actions.push(element);\n }\n }\n return actions;\n }\n\n /**\n * Returns true if the element is a IfElse block\n * @param element\n * @protected\n */\n protected isIfElseBlock(element: AllBlock): element is IfElseBlock {\n return element.blockType === 'IF_ELSE';\n }\n\n /**\n * Returns true if the element is an action block\n * @param element\n * @protected\n */\n protected isActionBlock(element: AllBlock): element is ActionBlock {\n return 'elementType' in element && element.elementType === 'ACTION';\n }\n\n /**\n * Returns true if the action sets a temporary fact\n * @param element\n * @protected\n */\n protected isActionSetTemporaryFactBlock(element: ActionBlock): element is ActionSetTemporaryFactBlock {\n return 'actionType' in element && element.actionType === 'SET_FACT';\n }\n\n /**\n * Evaluate a condition block\n * @param nestedCondition\n * @param factsValue\n * @param runtimeFactValues\n * @protected\n */\n protected evaluateCondition(nestedCondition: NestedCondition, factsValue: Record<string, Facts | undefined>, runtimeFactValues: Record<string, Facts>): boolean {\n if (isConditionProperties(nestedCondition)) {\n const operator = this.operators[nestedCondition.operator];\n if (operator === undefined) {\n throw new Error(`Unknown operator : ${nestedCondition.operator}, skipping the rule execution...`);\n }\n return executeOperator(this.getOperandValue(nestedCondition.lhs, factsValue, runtimeFactValues),\n this.getOperandValue('rhs' in nestedCondition ? nestedCondition.rhs : undefined, factsValue, runtimeFactValues), operator, factsValue);\n }\n\n if (isNotCondition(nestedCondition)) {\n return !this.evaluateCondition(nestedCondition.not, factsValue, runtimeFactValues);\n }\n if (nestedCondition.all || nestedCondition.any) {\n const evaluate = (condition: NestedCondition) => this.evaluateCondition(condition, factsValue, runtimeFactValues);\n return isAllConditions(nestedCondition) ? nestedCondition.all.every((element) => evaluate(element)) : nestedCondition.any.some((element) => evaluate(element));\n }\n throw new Error(`Unknown condition block met : ${JSON.stringify(nestedCondition)}`);\n }\n\n /**\n * Find rule input facts\n * @param obj\n */\n protected readonly findRuleInputFacts = (obj: AllBlock): string[] => {\n const ruleInputFacts = new Set<string>();\n this.collectRuleInputFacts(obj, ruleInputFacts);\n return Array.from(ruleInputFacts);\n };\n\n /**\n * Plug ruleset to fact streams and trigger a first evaluation\n */\n protected plugRuleset() {\n const inputFactsForRule: Record<string, string[]> = {};\n this.ruleset.rules.forEach((rule) => inputFactsForRule[rule.id] = this.findRuleInputFacts(rule.rootElement));\n const factsThatRerunEverything: string[] = [];\n this.ruleset.rules.forEach((rule) => {\n if (rule.outputRuntimeFacts.length > 0 || rule.inputRuntimeFacts.length > 0) {\n factsThatRerunEverything.push(...inputFactsForRule[rule.id]);\n } else {}\n });\n const triggerFull$: Observable<unknown[]> = factsThatRerunEverything.length === 0\n ? of([])\n : combineLatest(factsThatRerunEverything.map((fact) => this.rulesEngine.retrieveOrCreateFactStream(fact)));\n const result$ = triggerFull$.pipe(switchMap(() => {\n const runtimeFactValues: Record<string, Facts> = {};\n\n let rulesetInputFacts: string[];\n if (this.rulesEngine.debugMode) {\n rulesetInputFacts = Array.from(this.ruleset.rules.reduce((acc, rule) => {\n inputFactsForRule[rule.id].forEach((factName) => acc.add(factName));\n return acc;\n }, new Set<string>()));\n }\n\n return combineLatest(this.ruleset.rules.map((rule) => {\n const inputFacts = inputFactsForRule[rule.id];\n const values$ = inputFacts.map((fact) => this.rulesEngine.retrieveOrCreateFactStream(fact));\n return (values$.length > 0 ? combineLatest(values$) : of([[]] as (Facts | undefined)[]))\n .pipe(\n startWith(undefined),\n pairwise(),\n tap(() => this.performanceMark(rule, 'start')),\n map(([oldFactValues, factValues]) => {\n const output: RuleEvaluationOutput = { actions: undefined };\n\n try {\n output.actions = this.evaluateRule(rule, inputFacts.reduce<Record<string, Facts | undefined>>((acc, id, index) => {\n acc[id] = factValues![index];\n return acc;\n }, {}), runtimeFactValues);\n } catch (error) {\n output.actions = undefined;\n output.error = error;\n }\n\n if (this.rulesEngine.debugMode) {\n output.evaluation = handleRuleEvaluationDebug(rule, this.ruleset.name, output.actions, output.error, runtimeFactValues, factValues, oldFactValues, inputFacts);\n } else if (output.error) {\n const errorToLog = output.error instanceof Error || typeof output.error === 'string' ? output.error.toString() : JSON.stringify(output.error);\n this.rulesEngine.logger?.error(`Error while evaluating rule ID: ${rule.id}; message: ${errorToLog}`);\n this.rulesEngine.logger?.warn(`Skipping rule ${rule.name}, and the associated ruleset`);\n }\n return output;\n }),\n tap(() => this.performanceMark(rule, 'end'))\n );\n })).pipe(\n startWith(undefined),\n pairwise(),\n map(([prevRes, currRes]) => {\n const actionsLists = currRes!.map((r) => r.actions);\n const allExecutionsValid = actionsLists.every((actions) => !!actions);\n\n let execInfo: {\n executionCounter?: number;\n actionsLists: ActionBlock[][];\n rulesetOutputExecution?: RuleEvaluation[];\n allExecutionsValid?: boolean;\n rulesetTriggers?: Record<string, Record<string, EvaluationReason>>;\n } = { actionsLists: (allExecutionsValid ? actionsLists : [[]]) };\n\n if (this.rulesEngine.engineDebug) {\n execInfo = {\n ...execInfo,\n ...this.rulesEngine.engineDebug.handleDebugRulesetExecutionInfo(\n currRes!, prevRes, allExecutionsValid, rulesetInputFacts, runtimeFactValues, ++this.executionCounter, this.ruleset)\n };\n }\n return execInfo;\n }),\n map((output) => {\n const outputActions = ([] as ActionBlock[]).concat(...output.actionsLists);\n\n if (this.rulesEngine.engineDebug && output.allExecutionsValid) {\n this.rulesEngine.engineDebug.addRulesetExecutionEvent(this.ruleset, output.executionCounter!,\n rulesetInputFacts, outputActions, runtimeFactValues, output.rulesetTriggers!,\n output.rulesetOutputExecution!);\n }\n\n return outputActions;\n }),\n distinctUntilChanged((prev, curr) => prev.length === 0 && curr.length === 0)\n );\n }), shareReplay({ bufferSize: 1, refCount: true }));\n\n return {\n id: this.ruleset.id,\n validityRange: this.ruleset.validityRange,\n linkedComponents: this.ruleset.linkedComponents,\n rulesResultsSubject$: result$\n } as EngineRuleset;\n }\n}\n","import type {\n Logger,\n} from '@o3r/logger';\nimport {\n BehaviorSubject,\n firstValueFrom,\n merge,\n Observable,\n of,\n} from 'rxjs';\nimport {\n delay,\n distinctUntilChanged,\n shareReplay,\n switchMap,\n takeUntil,\n tap,\n} from 'rxjs/operators';\nimport {\n EngineDebugger,\n} from './debug/engine.debug';\nimport {\n FactObject,\n RulesEngineOptions,\n} from './engine.interface';\nimport type {\n Fact,\n Facts,\n} from './fact/index';\nimport {\n filterRulesetsEventStream,\n} from './helpers/filter-ruleset-event.operator';\nimport {\n Operator,\n operatorList,\n UnaryOperator,\n} from './operator/index';\nimport {\n RulesetExecutor,\n} from './ruleset-executor';\nimport {\n ActionBlock,\n Ruleset,\n} from './structure';\n\n/** Rules engine */\nexport class RulesEngine {\n /** Map of registered fact stream, this map is mutated by the ruleset executors */\n private readonly factMap: Record<string, FactObject<any>> = {};\n\n /** Subject containing the rulesets and the results stream*/\n private readonly rulesetMapSubject = new BehaviorSubject<Record<string, RulesetExecutor>>({});\n\n /** Map of available operators */\n public operators: Record<string, Operator<unknown, unknown>>;\n\n /** List of events for the current state of the rules engine */\n public readonly events$: Observable<ActionBlock[]>;\n\n /** Delay before fact stream defaulting value */\n public factDefaultDelay?: number;\n\n /**\n * Instance of engine debug object; Undefined if debugMode is not active\n */\n public readonly engineDebug?: EngineDebugger;\n\n /** Name of the rules engine instance */\n public readonly rulesEngineInstanceName: string;\n\n /**\n * Performance reporter to use for performance measurements.\n * @default window.performance on browser only, undefined on node\n */\n public readonly performance;\n\n /**\n * Log the engine errors\n */\n public readonly logger?: Logger;\n /**\n * Flag to check if the run is in debug mode or not\n */\n public get debugMode(): boolean {\n return !!this.engineDebug;\n }\n\n /**\n * Rules engine\n * @param options rules engine options\n */\n constructor(options?: RulesEngineOptions) {\n this.performance = options?.performance || (typeof window === 'undefined' ? undefined : window.performance);\n this.engineDebug = options?.debugger;\n this.engineDebug?.registerRuleEngine(this);\n this.logger = options?.logger;\n this.rulesEngineInstanceName = options?.rulesEngineInstanceName || 'RulesEngine';\n this.factDefaultDelay = options?.factDefaultDelay;\n // Load default operators\n this.operators = operatorList.reduce<Record<string, Operator<any, any>>>((acc, operator) => {\n acc[operator.name] = operator;\n return acc;\n }, {});\n this.events$ = this.rulesetMapSubject.pipe(\n this.prepareActionsStream(),\n this.handleActionsStreamOutput()\n );\n if (options?.facts) {\n this.upsertFacts(options.facts);\n }\n if (options?.rules) {\n this.upsertRulesets(options.rules);\n }\n if (options?.operators) {\n this.upsertOperators(options.operators);\n }\n }\n\n /**\n * Attach debug events to actions stream if debug engine is activated\n */\n private handleActionsStreamOutput<T extends ActionBlock = ActionBlock>(): (actionsStream$: Observable<T[]>) => Observable<T[]> {\n return (actionsStream$: Observable<T[]>) => this.engineDebug ? actionsStream$.pipe(tap((allActions) => this.engineDebug!.allActionsChange(allActions))) : actionsStream$;\n }\n\n /**\n * Create the actions stream event based on provided active rulesets ids; Handle debug too\n * @param ruleSets\n */\n private prepareActionsStream<T extends ActionBlock = ActionBlock>(ruleSets?: string[]): (rulesetMapSubject$: Observable<Record<string, RulesetExecutor>>) => Observable<T[]> {\n return (rulesetMapSubject$: Observable<Record<string, RulesetExecutor>>) => (this.engineDebug\n ? rulesetMapSubject$.pipe(\n tap((ruleSetExecutorMap) => this.engineDebug!.activeRulesetsChange(ruleSetExecutorMap, ruleSets)),\n filterRulesetsEventStream(ruleSets))\n : rulesetMapSubject$.pipe(filterRulesetsEventStream(ruleSets))) as Observable<T[]>;\n }\n\n /**\n * Create or retrieve a fact stream\n * The fact stream created will be registered in the engine\n * @param id ID of the fact to retrieve\n * @param factValue$ Value stream for the fact\n */\n public retrieveOrCreateFactStream<T = Facts>(id: string, factValue$?: Observable<T>): Observable<T | undefined> {\n // trick to emit undefined if the observable is not immediately emitting (to not bloc execution)\n const obs$ = factValue$\n ? merge(factValue$, of(undefined).pipe(delay(this.factDefaultDelay || 0), takeUntil(factValue$)))\n : factValue$;\n const factObj = this.factMap[id];\n if (factObj) {\n if (factValue$) {\n factObj.subject.next(obs$);\n }\n return factObj.value$;\n }\n\n const subject = new BehaviorSubject<Observable<T | undefined> | undefined>(obs$);\n const value$ = subject.pipe(\n switchMap((value) => value || of(undefined)),\n distinctUntilChanged(),\n shareReplay(1)\n );\n\n this.factMap[id] = {\n subject,\n value$\n };\n\n return value$;\n }\n\n /**\n * Retrieve the promise of the latest value of a fact.\n * Return undefined if the fact is not defined.\n * @param id ID of the fact to retrieve\n */\n public retrieveFactValue<T = unknown>(id: string): Promise<T | undefined> | undefined {\n return this.factMap[id].value$ && firstValueFrom(this.retrieveOrCreateFactStream<T>(id), { defaultValue: undefined });\n }\n\n /**\n * Update or insert fact in rules engine\n * @param facts fact list to add / update\n */\n public upsertFacts<T = unknown>(facts: Fact<T> | Fact<T>[]) {\n (Array.isArray(facts) ? facts : [facts]).forEach(({ id, value$ }) => {\n this.engineDebug?.addAvailableFactsSnapshotEvent(id, value$);\n this.retrieveOrCreateFactStream(id, value$);\n });\n }\n\n /**\n * Update or insert rule in rules engine\n * @param rulesets\n */\n public upsertRulesets(rulesets: Ruleset[]) {\n this.engineDebug?.addAvailableRulesets(rulesets);\n\n this.rulesetMapSubject.next(\n rulesets.reduce((accRuleset, ruleset) => {\n accRuleset[ruleset.id] = new RulesetExecutor(ruleset, this);\n return accRuleset;\n }, { ...this.rulesetMapSubject.value })\n );\n }\n\n /**\n * Update or insert operator in rules engine\n * @param operators operator list to add / update\n */\n public upsertOperators(operators: (Operator<any, any> | UnaryOperator<any>)[]) {\n this.operators = operators.reduce((acc, operator) => {\n acc[operator.name] = operator;\n return acc;\n }, { ...this.operators });\n }\n\n /**\n * Operator to apply on a stream of rulesets ids\n * Returns a stream of actions outputted by the rules engine, corresponding to the rulesetsIds\n */\n public getEventStream<T extends ActionBlock = ActionBlock>(): (rulesetsIds$: Observable<string[] | undefined>) => Observable<T[]> {\n return (rulesetsIds$: Observable<string[] | undefined>) =>\n rulesetsIds$.pipe(\n switchMap((ruleSets) => this.rulesetMapSubject.pipe(this.prepareActionsStream<T>(ruleSets))),\n this.handleActionsStreamOutput()\n );\n }\n\n /** Get the list of registered facts names */\n public getRegisteredFactsNames() {\n return Object.keys(this.factMap);\n }\n}\n","import {\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n takeUntilDestroyed,\n} from '@angular/core/rxjs-interop';\nimport {\n select,\n Store,\n} from '@ngrx/store';\nimport type {\n RulesEngineActionHandler,\n} from '@o3r/core';\nimport {\n LoggerService,\n} from '@o3r/logger';\nimport {\n BehaviorSubject,\n combineLatest,\n Observable,\n} from 'rxjs';\nimport {\n filter,\n map,\n shareReplay,\n switchMap,\n} from 'rxjs/operators';\nimport type {\n ActionBlock,\n Fact,\n Operator,\n Ruleset,\n UnaryOperator,\n} from '../../engine/index';\nimport {\n EngineDebugger,\n operatorList,\n RulesEngine,\n} from '../../engine/index';\nimport type {\n RulesetsStore,\n} from '../../stores';\nimport {\n selectActiveRuleSets,\n selectAllRulesets,\n selectComponentsLinkedToRuleset,\n setRulesetsEntities,\n} from '../../stores';\nimport {\n RULES_ENGINE_OPTIONS,\n RulesEngineServiceOptions,\n} from '../rules-engine.token';\n\n@Injectable()\nexport class RulesEngineRunnerService {\n private readonly store = inject<Store<RulesetsStore>>(Store);\n private readonly logger = inject(LoggerService);\n\n /** Rulesets to restrict the execution of the engine */\n protected ruleSets$: Observable<string[] | undefined>;\n\n /** List of action handlers */\n protected readonly actionHandlers = new Set<RulesEngineActionHandler>();\n\n /** Observable of component linked to the component */\n protected linkedComponents$: BehaviorSubject<{ [key: string]: number }> = new BehaviorSubject({});\n\n /** Map of engines dedicated to each rule sets */\n public readonly engine: RulesEngine;\n\n /** stream of the whole ruleset results */\n public events$: Observable<ActionBlock[]>;\n\n /** Enable action execution on new state change */\n public enabled: boolean;\n\n constructor() {\n const engineConfig = inject<RulesEngineServiceOptions>(RULES_ENGINE_OPTIONS, { optional: true });\n\n this.enabled = !engineConfig?.dryRun;\n this.engine = new RulesEngine({\n debugger: engineConfig?.debug ? new EngineDebugger({ eventsStackLimit: engineConfig?.debugEventsStackLimit }) : undefined,\n logger: this.logger\n });\n this.ruleSets$ = combineLatest([\n this.store.pipe(select(selectActiveRuleSets)),\n this.linkedComponents$.pipe(\n switchMap((linkedComponentsNamesMap) => this.store.pipe(\n select(selectComponentsLinkedToRuleset),\n map((rulesetsWithLinkedComponentsMap) =>\n Object.keys(rulesetsWithLinkedComponentsMap.or).filter((rulesetId) =>\n rulesetsWithLinkedComponentsMap.or[rulesetId].some((componentId) => linkedComponentsNamesMap[componentId] > 0)\n )\n )\n ))\n )\n ]).pipe(\n map(([activeRulesets, linkedComponentsRulesetsIds]) => ([...activeRulesets, ...linkedComponentsRulesetsIds]))\n );\n\n this.events$ = this.ruleSets$.pipe(\n this.engine.getEventStream<ActionBlock>(),\n shareReplay(1)\n );\n\n this.upsertOperators(operatorList);\n\n this.store.pipe(\n select(selectAllRulesets),\n takeUntilDestroyed()\n ).subscribe((rulesets: Ruleset[]) => this.engine.upsertRulesets(rulesets));\n this.events$.pipe(takeUntilDestroyed(), filter(() => this.enabled)).subscribe((events) => {\n void this.executeActions(events);\n });\n }\n\n /**\n * Execute the list of actions\n * @param actions\n */\n protected async executeActions(actions: ActionBlock[]) {\n const actionHandlers = [...this.actionHandlers];\n\n const supportedActions = new Set(actionHandlers.flatMap((handler) => handler.supportingActions));\n\n const actionMaps = actions\n .filter((action) => {\n const isKnown = supportedActions.has(action.actionType);\n if (!isKnown) {\n this.logger.warn(`The action ${action.actionType} does not have registered handler`);\n }\n return isKnown;\n })\n .reduce((acc, action) => {\n acc[action.actionType] ||= [];\n acc[action.actionType].push(action);\n return acc;\n }, {} as Record<string, ActionBlock[]>);\n\n const handling = actionHandlers\n .map((handler) =>\n handler.executeActions(\n handler.supportingActions\n .filter((supportedAction) => actionMaps[supportedAction])\n .reduce<ActionBlock[]>((acc, supportedAction) => acc.concat(actionMaps[supportedAction]), [])\n )\n );\n\n await Promise.all(handling);\n }\n\n /**\n * Update or insert fact in the rules engine\n * @param facts fact list to add / update\n */\n public upsertFacts(facts: Fact<unknown> | Fact<unknown>[]) {\n this.engine.upsertFacts(facts);\n }\n\n /**\n * Update or insert operator in the rules engine\n * @param operators operator list to add / update\n */\n public upsertOperators(operators: (Operator<any, any> | UnaryOperator<any>)[]) {\n this.engine.upsertOperators(operators);\n }\n\n /**\n * Upsert a list of RuleSets to be run in the rules engine\n * @param ruleSets\n */\n public upsertRulesets(ruleSets: Ruleset[]) {\n this.store.dispatch(setRulesetsEntities({ entities: ruleSets }));\n }\n\n /**\n * Add action handlers in the rules engine\n * @param actionHandlers\n */\n public registerActionHandlers(...actionHandlers: RulesEngineActionHandler[]) {\n actionHandlers.forEach((actionHandler) => this.actionHandlers.add(actionHandler));\n }\n\n /**\n * Remove action handlers in the rules engine\n * @param actionHandlers\n */\n public unregisterActionHandlers(...actionHandlers: RulesEngineActionHandler[]) {\n actionHandlers.forEach((actionHandler) => this.actionHandlers.delete(actionHandler));\n }\n\n /**\n * Enable temporary a rule set\n * @param componentComputedName Name of the component to enable the ruleset for\n */\n public enableRuleSetFor(componentComputedName: string) {\n const newMap = this.linkedComponents$.value;\n newMap[componentComputedName] = newMap[componentComputedName] ? newMap[componentComputedName] + 1 : 1;\n this.linkedComponents$.next(newMap);\n }\n\n /**\n * Disable temporary a rule set\n * @param componentComputedName Name of the component to disable the ruleset for\n */\n public disableRuleSetFor(componentComputedName: string) {\n const newMap = this.linkedComponents$.value;\n if (newMap[componentComputedName] > 0) {\n newMap[componentComputedName]--;\n this.linkedComponents$.next(newMap);\n }\n }\n}\n","import {\n ModuleWithProviders,\n NgModule,\n} from '@angular/core';\nimport {\n StoreModule,\n} from '@ngrx/store';\nimport {\n LoggerModule,\n} from '@o3r/logger';\nimport {\n RulesetsStoreModule,\n} from '../../stores/index';\nimport {\n DEFAULT_RULES_ENGINE_OPTIONS,\n RULES_ENGINE_OPTIONS,\n RulesEngineServiceOptions,\n} from '../rules-engine.token';\nimport {\n RulesEngineRunnerService,\n} from './rules-engine.runner.service';\n\n@NgModule({\n imports: [\n StoreModule,\n RulesetsStoreModule,\n LoggerModule\n ]\n})\nexport class RulesEngineRunnerModule {\n public static forRoot(options?: Partial<RulesEngineServiceOptions>): ModuleWithProviders<RulesEngineRunnerModule> {\n const opts = options ? { ...DEFAULT_RULES_ENGINE_OPTIONS, ...options } : DEFAULT_RULES_ENGINE_OPTIONS;\n return {\n ngModule: RulesEngineRunnerModule,\n providers: [\n { provide: RULES_ENGINE_OPTIONS, useValue: opts },\n RulesEngineRunnerService\n ]\n };\n }\n}\n","import {\n InjectionToken,\n} from '@angular/core';\nimport {\n RulesEngineDevtoolsServiceOptions,\n} from './rules-engine-devkit.interface';\n\nexport const OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS: Readonly<RulesEngineDevtoolsServiceOptions> = {\n isActivatedOnBootstrap: false\n} as const;\n\nexport const OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS = new InjectionToken<RulesEngineDevtoolsServiceOptions>('Otter RulesEngine Devtools options');\n","import {\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n select,\n Store,\n} from '@ngrx/store';\nimport {\n combineLatest,\n firstValueFrom,\n Observable,\n} from 'rxjs';\nimport {\n map,\n scan,\n shareReplay,\n} from 'rxjs/operators';\nimport type {\n ActiveRulesetsEvent,\n AvailableRulesets,\n BaseRulesetExecution,\n DebugEvent,\n Ruleset,\n RulesetExecutionErrorEvent,\n RulesetExecutionEvent,\n} from '../engine';\nimport {\n RulesEngineRunnerService,\n} from '../services';\nimport {\n RulesetsModel,\n RulesetsStore,\n selectRulesetsEntities,\n} from '../stores';\nimport {\n RulesEngineDevtoolsServiceOptions,\n} from './rules-engine-devkit.interface';\nimport {\n OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS,\n} from './rules-engine-devtools.token';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class OtterRulesEngineDevtools {\n protected store = inject<Store<RulesetsStore>>(Store);\n private readonly rulesEngineService = inject(RulesEngineRunnerService);\n\n /** Stream of rules engine report */\n public readonly rulesEngineReport$?: Observable<{ events: DebugEvent[]; rulesetMap: Record<string, Ruleset> }>;\n\n /** Stream of rules engine event */\n public readonly rulesEngineEvents$?: Observable<DebugEvent[]>;\n\n /**\n * Return true if the rules engine debug option is activated\n */\n public get isRulesEngineDebugActivated(): boolean {\n return !!this.rulesEngineService.engine.debugMode;\n }\n\n constructor() {\n const options = inject<RulesEngineDevtoolsServiceOptions>(OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS, { optional: true });\n\n const eventsStackLimit = (options || OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS).rulesEngineStackLimit;\n this.rulesEngineEvents$ = this.rulesEngineService.engine.engineDebug?.debugEvents$.pipe(\n scan((previousEvents, currentEvent) => {\n const stack = eventsStackLimit && previousEvents.length === eventsStackLimit ? previousEvents.slice(1) : previousEvents;\n return [...stack, currentEvent];\n }, [] as DebugEvent[]),\n shareReplay(1)\n );\n\n this.rulesEngineReport$ = this.rulesEngineEvents$ && combineLatest([this.rulesEngineEvents$, this.store.pipe(select(selectRulesetsEntities))]).pipe(\n map(([events, rulesetEntities]) => {\n const rulesetMap: Record<string, Ruleset> = Object.entries(rulesetEntities)\n .reduce<Record<string, RulesetsModel>>((acc, [id, ruleset]) => {\n if (ruleset) {\n acc[id] = ruleset;\n }\n return acc;\n }, {});\n return { events, rulesetMap };\n }),\n shareReplay(1)\n );\n }\n\n /** Return the list of debug events emitted by rules engine */\n public async getCurrentRulesEngineEventsStack(): Promise<DebugEvent[] | undefined> {\n return this.rulesEngineEvents$ && firstValueFrom(this.rulesEngineEvents$);\n }\n\n /** Returns the list of active rulesets (name and id) at the moment when the function is called */\n public async getActiveRulesets() {\n const lastActiveRulesetsEvent = (this.rulesEngineEvents$ && await firstValueFrom(this.rulesEngineEvents$))?.filter((e) => e.type === 'ActiveRulesets').reverse()[0];\n return (lastActiveRulesetsEvent as ActiveRulesetsEvent)?.rulesets;\n }\n\n /** Returns the list of available rulesets (name and id) at the moment when the function is called */\n public async getAvailableRulesets() {\n const lastAvailableRulesetsEvent = (this.rulesEngineEvents$ && await firstValueFrom(this.rulesEngineEvents$))?.filter((e) => e.type === 'AvailableRulesets').reverse()[0];\n return (lastAvailableRulesetsEvent as AvailableRulesets)?.availableRulesets;\n }\n\n /** Returns the list of output actions emitted by the rules engine at the moment when the function is called */\n public async getAllOutputActions() {\n return (this.rulesEngineEvents$ && await firstValueFrom(this.rulesEngineEvents$))?.filter((e) => e.type === 'AllActions')?.reverse()[0];\n }\n\n /**\n * Get the list of executions for the given ruleset\n * @param rulesetId\n */\n public async getRulesetExecutions(rulesetId: string): Promise<(RulesetExecutionEvent | RulesetExecutionErrorEvent)[] | undefined> {\n return (this.rulesEngineEvents$ && await firstValueFrom(this.rulesEngineEvents$))?.filter(\n (e): e is RulesetExecutionEvent | RulesetExecutionErrorEvent =>\n (e.type === 'RulesetExecution' || e.type === 'RulesetExecutionError')\n && (e as BaseRulesetExecution).rulesetId === rulesetId);\n }\n\n /**\n * Check if the ruleset is activ in the moment when the function is called\n * @param rulesetId\n * @returns True if the ruleset is active; False if the ruleset is inactive or it does not exist\n */\n public async isRulesetActive(rulesetId: string) {\n return !!(await this.getActiveRulesets())?.find((r) => r.id === rulesetId);\n }\n\n /**\n * Get the list of rules executed for the specified ruleset\n * @param rulesetId\n */\n public async getRulesEvaluationsForRuleset(rulesetId: string) {\n const rulesetExec = await this.getRulesetExecutions(rulesetId);\n return rulesetExec?.map((e) => (e as BaseRulesetExecution)?.rulesEvaluations?.filter((re) => !re.cached)).flat();\n }\n\n /**\n * Get the list of input facts (name, current value) for the specified ruleset, at the moment when the function is called\n * @param rulesetId\n */\n public async getInputFactsForRuleset(rulesetId: string) {\n const rulesetExecutions = await this.getRulesetExecutions(rulesetId);\n return rulesetExecutions ? (rulesetExecutions.at(-1) as BaseRulesetExecution).inputFacts : undefined;\n }\n\n /**\n * Get the list of triggers for the specified ruleset\n * @param rulesetId\n */\n public async getTriggersForRuleset(rulesetId: string) {\n return (await this.getRulesEvaluationsForRuleset(rulesetId))?.map((e) => e.triggers).flat().flatMap((triggersMap) => Object.values(triggersMap));\n }\n\n /**\n * Get the list of outputed actions emitted by the given ruleset, at the moment when the function is called\n * @param rulesetId\n */\n public async getOutputActionsForRuleset(rulesetId: string) {\n const rulesetExecutions = await this.getRulesetExecutions(rulesetId);\n return rulesetExecutions ? (rulesetExecutions.at(-1) as RulesetExecutionEvent).outputActions : undefined;\n }\n\n /** Get the list of fact names and corresponding values */\n public getAllFactsSnapshot() {\n const registeredFacts = this.rulesEngineService?.engine.getRegisteredFactsNames();\n if (registeredFacts) {\n return this.rulesEngineService.engine.engineDebug?.getFactsSnapshot(registeredFacts);\n }\n }\n\n /**\n * Retrieve the ruleset information (rules, linkedComponents, validity range etc.) for a ruleset id\n * @param rulesetId\n */\n public getRulesetInformation(rulesetId: string): Promise<Ruleset | undefined> {\n return firstValueFrom(this.store.pipe(\n select(selectRulesetsEntities),\n map((entities) => entities[rulesetId] as Ruleset | undefined)\n ));\n }\n}\n","/* eslint-disable no-console -- purpose of the service is to log in the console */\nimport {\n inject,\n Injectable,\n} from '@angular/core';\nimport type {\n DevtoolsServiceInterface,\n WindowWithDevtools,\n} from '@o3r/core';\nimport {\n RulesEngineDevtoolsServiceOptions,\n} from './rules-engine-devkit.interface';\nimport {\n OtterRulesEngineDevtools,\n} from './rules-engine-devtools.service';\nimport {\n OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS,\n} from './rules-engine-devtools.token';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RulesEngineDevtoolsConsoleService implements DevtoolsServiceInterface {\n /** Name of the Window property to access to the devtools */\n public static readonly windowModuleName = 'rulesEngine';\n\n private readonly rulesEngineDevtools = inject(OtterRulesEngineDevtools);\n\n private readonly options: RulesEngineDevtoolsServiceOptions;\n\n constructor() {\n const options = inject<RulesEngineDevtoolsServiceOptions>(OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS, { optional: true });\n\n this.options = {\n ...OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n ...options\n };\n\n if (this.options.isActivatedOnBootstrap) {\n this.activate();\n }\n }\n\n /** @inheritDoc */\n public activate() {\n const windowWithDevtools: WindowWithDevtools = window;\n windowWithDevtools._OTTER_DEVTOOLS_ ||= {};\n windowWithDevtools._OTTER_DEVTOOLS_[RulesEngineDevtoolsConsoleService.windowModuleName] = this;\n\n console.info(`Otter rules engine Devtools is now accessible via the _OTTER_DEVTOOLS_.${RulesEngineDevtoolsConsoleService.windowModuleName} variable`);\n }\n\n /** Return the list of debug events emitted by rules engine */\n public async getCurrentRulesEngineEventsStack() {\n console.log(await this.rulesEngineDevtools.getCurrentRulesEngineEventsStack());\n }\n\n /** Returns the list of active rulesets (name and id) at the moment when the function is called */\n public async getActiveRulesets() {\n console.log(await this.rulesEngineDevtools.getActiveRulesets());\n }\n\n /** Returns the list of available rulesets (name and id) at the moment when the function is called */\n public async getAvailableRulesets() {\n console.log(await this.rulesEngineDevtools.getAvailableRulesets());\n }\n\n /** Returns the list of output actions emitted by the rules engine at the moment when the function is called */\n public async getAllOutputActions() {\n console.log(await this.rulesEngineDevtools.getAllOutputActions());\n }\n\n /**\n * Get the list of executions for the given ruleset\n * @param rulesetId\n */\n public async getRulesetExecutions(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.getRulesetExecutions(rulesetId));\n }\n\n /**\n * Check if the ruleset is activ in the moment when the function is called\n * @param rulesetId\n * @returns True if the ruleset is active; False if the ruleset is inactive or it does not exist\n */\n public async isRulesetActive(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.isRulesetActive(rulesetId));\n }\n\n /**\n * Get the list of rules executed for the specified ruleset\n * @param rulesetId\n */\n public async getRulesEvaluationsForRuleset(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.getRulesEvaluationsForRuleset(rulesetId));\n }\n\n /**\n * Get the list of input facts (name, current value) for the specified ruleset, at the moment when the function is called\n * @param rulesetId\n */\n public async getInputFactsForRuleset(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.getInputFactsForRuleset(rulesetId));\n }\n\n /**\n * Get the list of triggers for the specified ruleset\n * @param rulesetId\n */\n public async getTriggersForRuleset(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.getTriggersForRuleset(rulesetId));\n }\n\n /**\n * Get the list of outputed actions emitted by the given ruleset, at the moment when the function is called\n * @param rulesetId\n */\n public async getOutputActionsForRuleset(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.getOutputActionsForRuleset(rulesetId));\n }\n\n /** Get the list of fact names and corresponding values */\n public async getAllFactsSnapshot() {\n console.log(await this.rulesEngineDevtools.getAllFactsSnapshot());\n }\n\n /**\n * Retrieve the ruleset information (rules, linkedComponents, validity range etc.) for a ruleset id\n * @param rulesetId\n */\n public async getRulesetInformation(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.getRulesetInformation(rulesetId));\n }\n}\n","import {\n DestroyRef,\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n takeUntilDestroyed,\n} from '@angular/core/rxjs-interop';\nimport {\n DevtoolsServiceInterface,\n filterMessageContent,\n sendOtterMessage,\n} from '@o3r/core';\nimport {\n LoggerService,\n} from '@o3r/logger';\nimport {\n BehaviorSubject,\n combineLatest,\n fromEvent,\n} from 'rxjs';\nimport type {\n DebugEvent,\n} from '../engine';\nimport {\n AvailableRulesEngineMessageContents,\n isRulesEngineMessage,\n RulesEngineDevtoolsServiceOptions,\n RulesEngineMessageDataTypes,\n} from './rules-engine-devkit.interface';\nimport {\n OtterRulesEngineDevtools,\n} from './rules-engine-devtools.service';\nimport {\n OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS,\n} from './rules-engine-devtools.token';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RulesEngineDevtoolsMessageService implements DevtoolsServiceInterface {\n private readonly rulesEngineDevtools = inject(OtterRulesEngineDevtools);\n private readonly logger = inject(LoggerService);\n\n private readonly options: RulesEngineDevtoolsServiceOptions;\n private readonly forceEmitRulesEngineReport = new BehaviorSubject<void>(undefined);\n private readonly sendMessage = sendOtterMessage<AvailableRulesEngineMessageContents>;\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n const options = inject<RulesEngineDevtoolsServiceOptions>(OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS, { optional: true });\n\n this.options = {\n ...OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n ...options\n };\n\n if (this.options.isActivatedOnBootstrap) {\n this.activate();\n }\n }\n\n /**\n * Function to trigger a re-send a requested messages to the Otter Chrome DevTools extension\n * @param only restricted list of messages to re-send\n */\n private handleReEmitRequest(only?: RulesEngineMessageDataTypes[]) {\n if (!only || only.includes('rulesEngineEvents')) {\n this.forceEmitRulesEngineReport.next();\n }\n }\n\n /**\n * Function to handle the incoming messages from Otter Chrome DevTools extension\n * @param message\n */\n private handleEvents(message: AvailableRulesEngineMessageContents) {\n this.logger.debug('Message handling by the configuration service', message);\n\n switch (message.dataType) {\n case 'connect': {\n this.connectPlugin();\n break;\n }\n case 'requestMessages': {\n this.handleReEmitRequest(message.only);\n break;\n }\n default: {\n this.logger.warn('Message ignored by the configuration service', message);\n }\n }\n }\n\n private readonly serializeError = (error: any) => error instanceof Error ? error.toString() : error;\n\n /**\n * Serialize exceptions in a way that will display the error message after a JSON.stringify()\n * @param debugEvent\n */\n private serializeReportEvent(debugEvent: DebugEvent) {\n if (debugEvent.type !== 'RulesetExecutionError') {\n return debugEvent;\n }\n return {\n ...debugEvent,\n rulesEvaluations: debugEvent.rulesEvaluations.map((ruleEvaluation) => ({\n ...ruleEvaluation,\n error: this.serializeError(ruleEvaluation.error)\n })),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return -- type is explicitly `any`\n errors: debugEvent.errors.map((error) => this.serializeError(error))\n };\n }\n\n /**\n * Function to start the rules engine reporting to the Otter Chrome DevTools extension\n */\n private startRulesEngineReport() {\n if (this.rulesEngineDevtools.rulesEngineReport$) {\n combineLatest([\n this.forceEmitRulesEngineReport,\n this.rulesEngineDevtools.rulesEngineReport$\n ]).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(\n ([,report]) => {\n const sanitizedReport = { ...report, events: report.events.map((reportEvents) => this.serializeReportEvent(reportEvents)) };\n this.sendMessage('rulesEngineEvents', sanitizedReport);\n }\n );\n }\n }\n\n /**\n * Function to connect the plugin to the Otter DevTools extension\n */\n private connectPlugin() {\n this.logger.info('Otter DevTools is plugged to the application');\n this.forceEmitRulesEngineReport.next();\n }\n\n /** Activate the Otter DevTools */\n public activate() {\n this.startRulesEngineReport();\n\n fromEvent(window, 'message').pipe(\n takeUntilDestroyed(this.destroyRef),\n filterMessageContent(isRulesEngineMessage)\n ).subscribe((e) => this.handleEvents(e));\n }\n}\n","import {\n ModuleWithProviders,\n NgModule,\n} from '@angular/core';\nimport {\n StoreModule,\n} from '@ngrx/store';\nimport {\n RulesetsStoreModule,\n} from '../stores/index';\nimport type {\n RulesEngineDevtoolsServiceOptions,\n} from './rules-engine-devkit.interface';\nimport {\n RulesEngineDevtoolsConsoleService,\n} from './rules-engine-devtools.console.service';\nimport {\n RulesEngineDevtoolsMessageService,\n} from './rules-engine-devtools.message.service';\nimport {\n OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS,\n} from './rules-engine-devtools.token';\n\n@NgModule({\n imports: [\n StoreModule,\n RulesetsStoreModule\n ],\n providers: [\n { provide: OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS, useValue: OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS },\n RulesEngineDevtoolsMessageService,\n RulesEngineDevtoolsConsoleService\n ]\n})\nexport class RulesEngineDevtoolsModule {\n /**\n * Initialize Otter Devtools\n * @param options\n */\n public static instrument(options: Partial<RulesEngineDevtoolsServiceOptions>): ModuleWithProviders<RulesEngineDevtoolsModule> {\n return {\n ngModule: RulesEngineDevtoolsModule,\n providers: [\n { provide: OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS, useValue: { ...OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS, ...options }, multi: false },\n RulesEngineDevtoolsMessageService,\n RulesEngineDevtoolsConsoleService\n ]\n };\n }\n}\n","import {\n FactDefinitions,\n FactSet,\n} from '../engine/index';\nimport {\n RulesEngineRunnerService,\n} from '../services/runner/rules-engine.runner.service';\n\n/** Abstract fact set service */\nexport abstract class FactsService<T extends FactDefinitions> {\n /** Set of facts provided */\n public abstract facts: FactSet<T>;\n\n constructor(private readonly rulesEngine: RulesEngineRunnerService) {}\n\n /** Register the set of facts */\n public register() {\n this.rulesEngine.upsertFacts(\n Object.entries(this.facts)\n .map(([id, factValue]) => ({ id, value$: factValue }))\n );\n }\n}\n","import {\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n BehaviorSubject,\n} from 'rxjs';\nimport {\n FactsService,\n} from '../../fact';\nimport {\n RulesEngineRunnerService,\n} from '../../services';\nimport {\n CurrentTimeFacts,\n} from './current-time.facts';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CurrentTimeFactsService extends FactsService<CurrentTimeFacts> {\n private readonly currentTimeSubject$ = new BehaviorSubject(Date.now());\n /** @inheritDoc */\n public facts = {\n o3rCurrentTime: this.currentTimeSubject$.asObservable()\n };\n\n constructor() {\n const rulesEngine = inject(RulesEngineRunnerService);\n\n super(rulesEngine);\n }\n\n /** Compute the current time */\n public tick() {\n this.currentTimeSubject$.next(Date.now());\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1","actions.resetRulesets","actions.setRulesets","actions.cancelRulesetsRequest","actions.updateRulesets","actions.setRulesetsEntities","actions.upsertRulesetsEntities","actions.clearRulesetsEntities","actions.failRulesetsEntities","actions.setRulesetsEntitiesFromApi","actions.upsertRulesetsEntitiesFromApi","isValidDate"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"o3r-rules-engine.mjs","sources":["../../src/components/rules-engine/shared/fallback-to-pipe.ts","../../src/components/rules-engine/shared/json-or-string-pipe.ts","../../src/components/rules-engine/shared/ruleset-history-helper.ts","../../src/components/rules-engine/facts-snapshot/facts-snapshot-component.ts","../../src/components/rules-engine/facts-snapshot/facts-snapshot-component.html","../../src/components/rules-engine/rule-key-value/rule-key-value-pres-component.ts","../../src/components/rules-engine/rule-key-value/rule-key-value-pres-component.html","../../src/components/rules-engine/rule-actions/rule-actions-pres-component.ts","../../src/components/rules-engine/rule-actions/rule-actions-pres-component.html","../../src/components/rules-engine/rule-condition/rule-condition-pres-component.ts","../../src/components/rules-engine/rule-condition/rule-condition-pres-component.html","../../src/components/rules-engine/rule-tree/rule-tree-pres-component.ts","../../src/components/rules-engine/rule-tree/rule-tree-pres-component.html","../../src/components/rules-engine/ruleset-history/ruleset-history-pres-component.ts","../../src/components/rules-engine/ruleset-history/ruleset-history-pres-component.html","../../src/components/rules-engine/ruleset-history/ruleset-history-pres-module.ts","../../src/devkit/rules-engine-devkit-interface.ts","../../src/services/rules-engine-token.ts","../../src/stores/rulesets/rulesets.actions.ts","../../src/stores/rulesets/rulesets.effect.ts","../../src/stores/rulesets/rulesets.reducer.ts","../../src/stores/rulesets/rulesets.state.ts","../../src/stores/rulesets/rulesets-module.ts","../../src/stores/rulesets/rulesets.selectors.ts","../../src/stores/rulesets/rulesets.sync.ts","../../src/engine/debug/helpers.ts","../../src/engine/debug/engine-debug.ts","../../src/engine/helpers/filter-ruleset-event-operator.ts","../../src/engine/operator/operator-helpers.ts","../../src/engine/operator/operators/array-based-operators.ts","../../src/engine/operator/operators/basic-operators.ts","../../src/engine/operator/operators/date-based-operators.ts","../../src/engine/operator/operators/number-based-operators.ts","../../src/engine/operator/operators/index.ts","../../src/engine/rule/rule-helpers.ts","../../src/engine/ruleset-executor.ts","../../src/engine/engine.ts","../../src/services/runner/rules-engine-runner-service.ts","../../src/services/runner/rules-engine-runner-module.ts","../../src/devkit/rules-engine-devtools-token.ts","../../src/devkit/rules-engine-devtools.ts","../../src/devkit/rules-engine-devtools-console-service.ts","../../src/devkit/rules-engine-devtools-message-service.ts","../../src/devkit/rules-engine-devtools-module.ts","../../src/fact/fact-abstract-service.ts","../../src/inner-facts/current-time/current-time-facts-service.ts","../../src/o3r-rules-engine.ts"],"sourcesContent":["import {\n Pipe,\n PipeTransform,\n} from '@angular/core';\n\n@Pipe({ name: 'o3rFallbackTo' })\nexport class O3rFallbackToPipe implements PipeTransform {\n public transform<T>(value: T, fallback = 'undefined'): T | string {\n return value === undefined ? fallback : value;\n }\n}\n","import {\n Pipe,\n PipeTransform,\n} from '@angular/core';\n\n@Pipe({ name: 'o3rJsonOrString' })\nexport class O3rJsonOrStringPipe implements PipeTransform {\n /**\n * @inheritDoc\n */\n public transform(value: any): string {\n if (typeof value === 'string') {\n return value;\n }\n return JSON.stringify(value, null, 2);\n }\n}\n","import type {\n DebugEvent,\n Ruleset,\n RulesetExecutionErrorEvent,\n RulesetExecutionEvent,\n} from '../../../engine';\nimport type {\n RulesetExecutionDebug,\n RulesetExecutionStatus,\n} from '../ruleset-history/ruleset-history-pres-component';\n\n/**\n * Compute the status of the execution depending on its execution event type, the output and whether the execution\n * is still active\n * @param rulesetExecution\n * @param isActive\n */\nexport const getStatus = (rulesetExecution: RulesetExecutionErrorEvent | RulesetExecutionEvent, isActive: boolean): RulesetExecutionStatus => {\n if (rulesetExecution.type === 'RulesetExecutionError') {\n return 'Error';\n } else if (rulesetExecution.outputActions?.length === 0) {\n return 'NoEffect';\n } else if (isActive) {\n return 'Active';\n }\n return 'Deactivated';\n};\n\n/**\n * Transform the output of the debug reports into the model for the ruleset history debug panel\n * @param events\n * @param rulesetMap\n */\nexport const rulesetReportToHistory = (events: DebugEvent[], rulesetMap: Record<string, Ruleset>): RulesetExecutionDebug[] => {\n const availableRulesets = Object.values(rulesetMap);\n const lastActiveRulesets = (events.filter((e) => e.type === 'ActiveRulesets').reverse()[0])?.rulesets || [];\n\n return availableRulesets\n .filter((ruleset) => !!ruleset)\n .reduce<(RulesetExecutionEvent | RulesetExecutionErrorEvent)[]>((acc, ruleset) => {\n const rulesetExecutions = events\n .filter((e): e is RulesetExecutionEvent | RulesetExecutionErrorEvent => ((e.type === 'RulesetExecutionError' || e.type === 'RulesetExecution') && e.rulesetId === ruleset.id));\n if (rulesetExecutions) {\n acc.push(...rulesetExecutions);\n }\n return acc;\n }, [])\n .sort((execA, execB) => execB.timestamp - execA.timestamp)\n .map((rulesetExecution) => {\n const rulesetInformation = rulesetMap[rulesetExecution.rulesetId];\n const isActive = lastActiveRulesets.find((r) => r.id === rulesetExecution.rulesetId);\n return {\n ...rulesetExecution,\n status: getStatus(rulesetExecution, !!isActive),\n isActive: !!isActive,\n rulesetInformation,\n rulesEvaluations: (rulesetExecution.rulesEvaluations || []).sort((evalA, evalB) =>\n (rulesetInformation?.rules.findIndex((r) => r.id === evalA.rule.id) || -1)\n - (rulesetInformation?.rules.findIndex((r) => r.id === evalB.rule.id) || -1)\n )\n };\n });\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n FormsModule,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport type {\n Facts,\n} from '../../../engine';\nimport {\n O3rJsonOrStringPipe,\n} from '../shared/index';\n\n@Component({\n selector: 'o3r-facts-snapshot',\n styleUrls: ['./facts-snapshot-component.scss'],\n templateUrl: './facts-snapshot-component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n O3rJsonOrStringPipe,\n FormsModule,\n ReactiveFormsModule\n ],\n encapsulation: ViewEncapsulation.None\n})\nexport class FactsSnapshotComponent {\n /**\n * Full list of available facts with their current value\n */\n public readonly facts = input.required<{ factName: string; value: Facts }[]>();\n\n /**\n * Search terms\n */\n public readonly search = signal('');\n\n /**\n * Filtered list of facts using search terms\n */\n public readonly filteredFacts = computed(() => {\n const search = this.search();\n const facts = this.facts();\n if (search) {\n const matchString = new RegExp(search.replace(/[\\s#$()*+,.?[\\\\\\]^{|}-]/g, '\\\\$&'), 'i');\n return facts.filter(({ factName, value }) =>\n matchString.test(factName)\n || (typeof value === 'object'\n ? matchString.test(JSON.stringify(value))\n : matchString.test(String(value)))\n );\n } else {\n return facts;\n }\n });\n}\n","<section>\n @if (facts().length < 1) {\n <div class=\"m-2\">\n No facts are registered.\n </div>\n } @else {\n <div class=\"input-group\">\n <label class=\"input-group-text\" for=\"search-fact\">\n <span class=\"mx-1 fa-search\" aria-label=\"Search\"></span>\n </label>\n <input class=\"form-control\" [(ngModel)]=\"search\" type=\"text\" id=\"search-fact\" placeholder=\"Search for fact name or value\" />\n </div>\n <div class=\"mt-3\">\n List of <b>{{facts().length}}</b> registered facts\n @if (facts().length > filteredFacts().length) { (<b>{{filteredFacts().length}}</b> matching the search) }\n </div>\n <ul>\n @for (fact of filteredFacts(); track fact.factName) {\n <li>\n <span class=\"fact-name\">{{fact.factName}}: </span>\n <span class=\"fact-value\">{{fact.value | o3rJsonOrString}}</span>\n </li>\n }\n </ul>\n }\n</section>\n","import {\n CommonModule,\n JsonPipe,\n} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnChanges,\n SimpleChanges,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n of,\n Subject,\n} from 'rxjs';\nimport {\n delay,\n startWith,\n switchMap,\n} from 'rxjs/operators';\n\n/**\n * Duration of the notification for clipboard feature (in milliseconds)\n */\nconst NOTIFICATION_DURATION = 1750;\n\n/**\n * Minimal length required to enable clipboard feature\n */\nconst CLIPBOARD_FEATURE_LENGTH_THRESHOLD = 80;\n\n@Component({\n selector: 'o3r-rule-key-value-pres',\n styleUrls: ['./rule-key-value-pres-component.scss'],\n templateUrl: './rule-key-value-pres-component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, JsonPipe]\n})\nexport class RuleKeyValuePresComponent implements OnChanges {\n /**\n * Key of the object (name of the fact for example)\n */\n @Input()\n public key?: string;\n\n /**\n * Current value of the object\n */\n @Input()\n public value!: string;\n\n /**\n * Previous value of the object\n */\n @Input()\n public oldValue?: string;\n\n /**\n * Type of display:\n * - 'state': `key: value`, `key: oldValue -> value` or `oldValue -> value`\n * - 'assignment': `key = value`\n */\n @Input()\n public type: 'state' | 'assignment' = 'state';\n\n public shouldLimitCharactersForValue = true;\n public isClipBoardFeatureAvailableForValue = false;\n public isValuePrimitiveType = false;\n\n public shouldLimitCharactersForOldValue = true;\n public isClipBoardFeatureAvailableForOldValue = false;\n public isOldValuePrimitiveType = false;\n\n private readonly triggerNotification = new Subject<void>();\n public showNotification$ = this.triggerNotification.asObservable().pipe(\n switchMap(() => of(false).pipe(delay(NOTIFICATION_DURATION), startWith(true)))\n );\n\n private isClipBoardFeatureAvailable(value: string | undefined) {\n return !!(navigator.clipboard && value && value.length > CLIPBOARD_FEATURE_LENGTH_THRESHOLD);\n }\n\n public ngOnChanges({ value, oldValue }: SimpleChanges) {\n if (value) {\n this.isValuePrimitiveType = value.currentValue === null || typeof value.currentValue !== 'object';\n this.isClipBoardFeatureAvailableForValue = this.isClipBoardFeatureAvailable(this.isValuePrimitiveType ? String(value.currentValue) : JSON.stringify(value.currentValue));\n }\n if (oldValue) {\n this.isOldValuePrimitiveType = oldValue.currentValue === null || typeof oldValue.currentValue !== 'object';\n this.isClipBoardFeatureAvailableForOldValue = this.isClipBoardFeatureAvailable(this.isOldValuePrimitiveType ? String(oldValue.currentValue) : JSON.stringify(oldValue.currentValue));\n }\n }\n\n public async copyToClipBoard(content: string) {\n await navigator.clipboard.writeText(content);\n this.triggerNotification.next();\n }\n}\n","@if (key) {\n <span class=\"input-key\">{{key}}{{type === 'state' ? ':' : ''}}</span>\n}\n{{type === 'assignment' ? '=' : ''}}\n@if (oldValue) {\n <pre class=\"input-value\"\n [class.limit-characters]=\"shouldLimitCharactersForOldValue\"\n (click)=\"shouldLimitCharactersForOldValue = !shouldLimitCharactersForOldValue\"\n (keyup.enter)=\"shouldLimitCharactersForOldValue = !shouldLimitCharactersForOldValue\"\n tabindex=\"0\"\n >\n {{isOldValuePrimitiveType ? oldValue : (oldValue | json)}}\n </pre>\n @if (isClipBoardFeatureAvailableForOldValue) {\n <button (click)=\"copyToClipBoard(oldValue)\" title=\"Copy to clipboard\">📋</button>\n }\n →\n}\n<pre class=\"input-value\"\n [class.limit-characters]=\"shouldLimitCharactersForValue\"\n (click)=\"shouldLimitCharactersForValue = !shouldLimitCharactersForValue\"\n (keyup.enter)=\"shouldLimitCharactersForValue = !shouldLimitCharactersForValue\"\n tabindex=\"0\"\n>\n {{isValuePrimitiveType ? value : (value | json)}}\n</pre>\n@if (isClipBoardFeatureAvailableForValue) {\n <button (click)=\"copyToClipBoard(value)\" title=\"Copy to clipboard\">📋</button>\n}\n@if (showNotification$ | async) {\n <div role=\"alert\" class=\"notification\">Copied to clipboard</div>\n}\n","import {\n CommonModule,\n JsonPipe,\n} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n ActionBlock,\n AllBlock,\n Facts,\n} from '../../../engine';\nimport {\n RuleKeyValuePresComponent,\n} from '../rule-key-value/rule-key-value-pres-component';\nimport {\n O3rFallbackToPipe,\n} from '../shared/index';\n\n@Component({\n selector: 'o3r-rule-actions-pres',\n styleUrls: ['./rule-actions-pres-component.scss'],\n templateUrl: './rule-actions-pres-component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, JsonPipe, RuleKeyValuePresComponent, O3rFallbackToPipe]\n})\nexport class RuleActionsPresComponent {\n /**\n * List of all the output actions of a rules or ruleset execution\n */\n @Input()\n public actions: AllBlock[] = [];\n\n /**\n * The list of temporary facts used and/or modified within the rule or the ruleset.\n * They are scoped to the ruleset and their value is the one after the rule or ruleset execution.\n */\n @Input()\n public temporaryFacts: Record<string, Facts> = {};\n\n /**\n * List of temporary facts that will be modified by the ruleset or the rule.\n */\n @Input()\n public runtimeOutputs: string[] = [];\n\n /**\n * Check if a given block is of type ActionBlock\n * @param block\n */\n public isActionBlock(block: AllBlock): block is ActionBlock {\n return !!(block as ActionBlock).actionType;\n }\n}\n","<div class=\"ruleset-panel-category-title\">Output Actions</div>\n@if (actions?.length === 0 && runtimeOutputs.length === 0) {\n <div class=\"ruleset-panel-category-body empty\">\n No action\n </div>\n} @else {\n <ul class=\"ruleset-panel-category-body\">\n @for (action of actions; track $index) {\n <li>\n @if (isActionBlock(action)) {\n @switch (action.actionType) {\n @case ('SET_FACT') {\n <div>\n <div>Set Fact</div>\n <div>\n <o3r-rule-key-value-pres\n [key]=\"action.fact | o3rFallbackTo: 'Missing \\'fact\\''\"\n [value]=\"action.value | o3rFallbackTo\"\n [type]=\"'assignment'\"></o3r-rule-key-value-pres>\n </div>\n </div>\n }\n @case ('UPDATE_CONFIG') {\n <div>\n <div>Update Config {{action.component}} {{action.library}}</div>\n <div>\n <o3r-rule-key-value-pres\n [key]=\"action.property | o3rFallbackTo: 'Missing \\'property\\''\"\n [value]=\"action.value | o3rFallbackTo\"\n [type]=\"'assignment'\"></o3r-rule-key-value-pres>\n </div>\n </div>\n }\n @case ('UPDATE_ASSET') {\n <div>\n <div>Update Asset:</div>\n <div>\n <o3r-rule-key-value-pres\n [oldValue]=\"action.asset | o3rFallbackTo: 'Missing \\'asset\\''\"\n [value]=\"action.value | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </div>\n </div>\n }\n @case ('UPDATE_LOCALISATION') {\n <div>\n <div>Update localization:</div>\n <div>\n <o3r-rule-key-value-pres\n [oldValue]=\"action.key | o3rFallbackTo: 'Missing \\'key\\''\"\n [value]=\"action.value | o3rFallbackTo\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </div>\n </div>\n }\n @case ('UPDATE_PLACEHOLDER') {\n <div [class.error]=\"!action.placeholderId\">\n <div>Update placeholder in {{action.component}} {{action.library}}</div>\n <div>\n <o3r-rule-key-value-pres\n [oldValue]=\"action.placeholderId | o3rFallbackTo: 'Missing \\'placeholderId\\''\"\n [value]=\"action.value\"\n [type]=\"'state'\"></o3r-rule-key-value-pres>\n </div>\n </div>\n }\n @default {\n <div class=\"error\">\n <div>Unrecognized action</div>\n <div>{{action | json}}</div>\n </div>\n }\n }\n }\n </li>\n }\n @for (runtimeOutput of runtimeOutputs; track $index) {\n <li>\n <div>Set temporary fact</div>\n <div>\n <o3r-rule-key-value-pres\n [key]=\"runtimeOutput | o3rFallbackTo: 'Missing \\'fact\\''\"\n [value]=\"temporaryFacts[runtimeOutput] | o3rFallbackTo\"\n [type]=\"'assignment'\"></o3r-rule-key-value-pres>\n </div>\n </li>\n }\n </ul>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n BinaryOperation,\n GenericOperand,\n OperandFact,\n TopLevelCondition,\n UnaryOperation,\n} from '../../../engine';\n\n@Component({\n selector: 'o3r-rule-condition-pres',\n styleUrls: ['./rule-condition-pres-component.scss'],\n templateUrl: './rule-condition-pres-component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: []\n})\nexport class RuleConditionPresComponent {\n private _condition?: TopLevelCondition;\n\n /**\n * Left hand operator as it will be displayed in the template.\n * In the case of a fact with a json path, will resolve the whole fact path, else will only display the value\n */\n public lhs = 'undefined';\n\n /**\n * Right hand operator as it will be displayed in the template.\n * In the case of a fact with a json path, will resolve the whole fact path, else will only display the value\n */\n public rhs: string | undefined;\n\n /**\n * Rule condition that will be flattened by the component setter\n */\n @Input()\n public set condition(condition: TopLevelCondition | undefined) {\n this._condition = condition;\n this.lhs = (condition as UnaryOperation | BinaryOperation)?.lhs ? this.getOperandName((condition as UnaryOperation | BinaryOperation).lhs) : 'undefined';\n this.rhs = (condition as BinaryOperation)?.rhs ? this.getOperandName((condition as BinaryOperation).rhs) : undefined;\n }\n\n public get condition(): TopLevelCondition | undefined {\n return this._condition;\n }\n\n private getOperandName(operand: GenericOperand): string {\n const value = `${operand.value ?? 'MISSING_VALUE'}`;\n return (operand as OperandFact).path ? (operand as OperandFact).path!.replace(/^\\$/, value) : value;\n }\n}\n","@if (!condition) {\n <span class=\"input-value\">true</span>\n} @else {\n @if (!$any(condition).all && !$any(condition).any && !$any(condition).not) {\n <span class=\"input-key\">{{ lhs }}</span> {{ $any(condition).operator }}\n @if (rhs !== undefined) {\n <span class=\"input-value\">{{ rhs }}</span>\n }\n }\n @if ($any(condition).all || $any(condition).any || $any(condition).not) {\n @if ($any(condition).all) {\n <span>ALL</span>\n }\n @if ($any(condition).any) {\n <span>ANY</span>\n }\n @if ($any(condition).not) {\n <span>NOT</span>\n }\n <span>(\n @for (cond of $any(condition).all || $any(condition).any || [$any(condition).not]; track cond; let last = $last) {\n <o3r-rule-condition-pres [condition]=\"cond\"></o3r-rule-condition-pres>\n @if (!last) {\n <span>, </span>\n }\n }\n )</span>\n }\n}\n","import {\n CommonModule,\n} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n AllBlock,\n TopLevelCondition,\n} from '../../../engine';\nimport {\n RuleActionsPresComponent,\n} from '../rule-actions/rule-actions-pres-component';\nimport {\n RuleConditionPresComponent,\n} from '../rule-condition/rule-condition-pres-component';\n\n@Component({\n selector: 'o3r-rule-tree-pres',\n styleUrls: ['./rule-tree-pres-component.scss'],\n templateUrl: './rule-tree-pres-component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, RuleActionsPresComponent, RuleConditionPresComponent]\n})\nexport class RuleTreePresComponent {\n /**\n * Rule name. Will only be defined at the root of the rule tree.\n */\n @Input()\n public name?: string;\n\n /**\n * Type of the block being resolved.\n * A type \"IF_ELSE\" will display two branches and the success and failure outputs associated\n * Else, only the successElements will be shown\n */\n @Input()\n public blockType = '';\n\n /**\n * The condition under which the success elements will be displayed.\n */\n @Input()\n public condition?: TopLevelCondition;\n\n /**\n * If case output\n */\n @Input()\n public successElements: AllBlock[] = [];\n\n /**\n * Else case output\n */\n @Input()\n public failureElements: AllBlock[] = [];\n\n /**\n * Should the \"Else case scenario\" actions be displayed\n */\n public failureActionsExpanded = false;\n\n /**\n * Should the \"If case scenario\" actions be displayed\n */\n public successActionsExpanded = false;\n}\n","@if (name) {\n <span>{{name | titlecase}}:</span>\n}\n<div class=\"rule-wrapper tree\">\n @if (blockType === 'IF_ELSE') {\n @if (!name) {\n <div class=\"tree-root\" [attr.aria-hidden]=\"true\">\n <div></div>\n <div></div>\n </div>\n }\n <div class=\"rule-conditions\">\n <div class=\"rule-conditions-title\">If\n <o3r-rule-condition-pres [condition]=\"condition\"></o3r-rule-condition-pres>\n </div>\n <div class=\"tree-root\" [attr.aria-hidden]=\"true\">\n <div></div>\n <div></div>\n </div>\n </div>\n <div class=\"rule-actions-wrapper tree-node\">\n <div class=\"rule-actions tree-branch\">\n <div class=\"tree-leaf\" [attr.aria-hidden]=\"true\">\n <div></div>\n <div></div>\n </div>\n <div class=\"rule-action-title success-actions\"\n tabindex=\"0\"\n (click)=\"successActionsExpanded = !successActionsExpanded\"\n (keyup.enter)=\"successActionsExpanded = !successActionsExpanded\">\n <i class=\"icon refx-icon-validate\"></i>\n <span>Then</span>\n <i class=\"icon\"\n [class.icon-caret-down]=\"!successActionsExpanded\"\n [class.icon-caret-up]=\"successActionsExpanded\">\n </i>\n </div>\n @if (successActionsExpanded) {\n <o3r-rule-actions-pres class=\"rule-tree-actions\"\n [actions]=\"successElements\">\n </o3r-rule-actions-pres>\n }\n <ng-container [ngTemplateOutlet]=\"subTree\" [ngTemplateOutletContext]=\"{blocks: successElements}\"></ng-container>\n </div>\n <div class=\"rule-actions tree-branch\">\n <div class=\"tree-leaf\" [attr.aria-hidden]=\"true\">\n <div></div>\n <div></div>\n </div>\n <div class=\"rule-action-title error-actions\"\n tabindex=\"0\"\n (click)=\"failureActionsExpanded = !failureActionsExpanded\"\n (keyup.enter)=\"failureActionsExpanded = !failureActionsExpanded\">\n <i class=\"icon refx-icon-cross\"></i>\n <span>Else</span>\n <i class=\"icon\"\n [class.icon-caret-down]=\"!failureActionsExpanded\"\n [class.icon-caret-up]=\"failureActionsExpanded\">\n </i>\n </div>\n @if (failureActionsExpanded) {\n <o3r-rule-actions-pres class=\"rule-tree-actions\"\n [actions]=\"failureElements\">\n </o3r-rule-actions-pres>\n }\n <ng-container [ngTemplateOutlet]=\"subTree\" [ngTemplateOutletContext]=\"{blocks: failureElements}\"></ng-container>\n </div>\n </div>\n } @else {\n <div class=\"rule-conditions\">\n <div class=\"rule-conditions-title\">If <span class=\"input-value\">true</span></div>\n <div class=\"tree-root\" [attr.aria-hidden]=\"true\">\n <div></div>\n <div></div>\n </div>\n </div>\n <div class=\"rule-actions-wrapper\">\n <div class=\"rule-actions\">\n <div class=\"rule-action-title success-actions\" tabindex=\"0\"\n (keyup.enter)=\"successActionsExpanded = !successActionsExpanded\"\n (click)=\"successActionsExpanded = !successActionsExpanded\">\n <i class=\"icon refx-icon-validate\">\n </i>\n <span>Then</span>\n <i class=\"icon\"\n [class.icon-caret-down]=\"!successActionsExpanded\"\n [class.icon-caret-up]=\"successActionsExpanded\">\n </i>\n </div>\n @if (successActionsExpanded) {\n <o3r-rule-actions-pres class=\"rule-tree-actions\"\n [actions]=\"successElements\">\n </o3r-rule-actions-pres>\n }\n <ng-container [ngTemplateOutlet]=\"subTree\" [ngTemplateOutletContext]=\"{blocks: successElements}\"></ng-container>\n </div>\n </div>\n }\n</div>\n\n<ng-template #subTree let-blocks=\"blocks\">\n <div class=\"rule-sub-trees\">\n @for (block of blocks; track block) {\n @if (block.blockType === 'IF_ELSE') {\n <div class=\"tree-branch\">\n <o3r-rule-tree-pres\n [blockType]=\"'IF_ELSE'\"\n [condition]=\"block.condition\"\n [failureElements]=\"block.failureElements\"\n [successElements]=\"block.successElements\"></o3r-rule-tree-pres>\n </div>\n }\n }\n </div>\n</ng-template>\n","import {\n CommonModule,\n} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n inject,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n Ruleset,\n RulesetExecutionErrorEvent,\n RulesetExecutionEvent,\n} from '../../../engine';\nimport {\n RuleActionsPresComponent,\n} from '../rule-actions/rule-actions-pres-component';\nimport {\n RuleKeyValuePresComponent,\n} from '../rule-key-value/rule-key-value-pres-component';\nimport {\n RuleTreePresComponent,\n} from '../rule-tree/rule-tree-pres-component';\nimport {\n O3rFallbackToPipe,\n O3rJsonOrStringPipe,\n} from '../shared/index';\n\nexport type RulesetExecutionStatus = 'Error' | 'Active' | 'Deactivated' | 'NoEffect';\n/**\n * Model of a RulesetExecution with more information for debug purpose\n */\nexport type RulesetExecutionDebug = (RulesetExecutionEvent | RulesetExecutionErrorEvent) & {\n isActive: boolean;\n status: RulesetExecutionStatus;\n rulesetInformation: Ruleset | undefined;\n};\n\n@Component({\n selector: 'o3r-ruleset-history-pres',\n styleUrls: ['./ruleset-history-pres-component.scss'],\n templateUrl: './ruleset-history-pres-component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n CommonModule,\n O3rFallbackToPipe,\n O3rJsonOrStringPipe,\n RuleActionsPresComponent,\n RuleKeyValuePresComponent,\n RuleTreePresComponent\n ]\n})\nexport class RulesetHistoryPresComponent {\n private readonly cd = inject(ChangeDetectorRef);\n\n /**\n * Reflects the state of each ruleset expanded elements.\n * Each ruleset entry contains a list of subpanel that can be collapsed or expanded.\n * Ruleset whole panel status is store the 'ruleset' entry.\n * @example\n * Expanded ruleset with rule overview collapsed:\n * {'rulesetId': {'ruleset' : true, 'ruleOverview': false}}\n * @note Collapsing a ruleset will not reset the subpanel expansion status\n */\n public expansionStatus: { [key: string]: { [subpanel: string]: boolean } } = {};\n\n @Input()\n public rulesetExecutions: RulesetExecutionDebug[] = [];\n\n @Input()\n public executionDurationFormat = '1.3-3';\n\n /**\n * Toggle a ruleset subpanel\n * @param ruleId\n * @param subpanel element to collapse. 'ruleset' will toggle the whole panel but won't reset the subpanels states.\n */\n public toggleExpansion(ruleId: string, subpanel: string) {\n if (this.expansionStatus[ruleId]) {\n this.expansionStatus[ruleId][subpanel] = !this.expansionStatus[ruleId][subpanel];\n } else {\n this.expansionStatus[ruleId] = { [subpanel]: true };\n }\n this.cd.detectChanges();\n }\n}\n","<section>\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 <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -- need to refactor the div to accordion from DF #1518 -->\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?.linkedComponents?.or\">\n <ng-container *ngFor=\"let lc of execution.rulesetInformation?.linkedComponents?.or; last as isLast\">\n <div>{{lc.name}} {{lc.library}} <span *ngIf=\"!isLast\"> OR </span></div>\n </ng-container>\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 | o3rJsonOrString}}</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 <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -- need to refactor the div to accordion from DF #1518 -->\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","import {\n JsonPipe,\n} from '@angular/common';\nimport {\n NgModule,\n} from '@angular/core';\nimport {\n RuleConditionPresComponent,\n} from '../rule-condition/rule-condition-pres-component';\nimport {\n RulesetHistoryPresComponent,\n} from './ruleset-history-pres-component';\n\n/**\n * @deprecated The Components and Pipes are now standalone, this module will be removed in v14\n */\n@NgModule({\n imports: [\n JsonPipe,\n RulesetHistoryPresComponent,\n RuleConditionPresComponent\n ],\n exports: [RulesetHistoryPresComponent]\n})\nexport class RulesetHistoryPresModule {}\n","import type {\n ConnectContentMessage,\n DevtoolsCommonOptions,\n MessageDataTypes,\n OtterMessageContent,\n RequestMessagesContentMessage,\n} from '@o3r/core';\nimport type {\n DebugEvent,\n Ruleset,\n} from '../engine';\n\nexport interface RulesEngineDevtoolsServiceOptions extends DevtoolsCommonOptions {\n /** Size of events list emitted by rules engine; When undefined all history will be kept */\n rulesEngineStackLimit?: number;\n}\n\n/** Rules Engine debug event Message Content */\nexport interface RulesEngineDebugEventsContentMessage extends OtterMessageContent<'rulesEngineEvents'> {\n /** Map of registered rulesets */\n rulesetMap: Record<string, Ruleset>;\n /** List of event from the Rules Engine Debugger */\n events: DebugEvent[];\n}\n\ntype RulesEngineMessageContents = RulesEngineDebugEventsContentMessage;\n\n/** List of possible DataTypes for RulesEngine messages */\nexport type RulesEngineMessageDataTypes = MessageDataTypes<RulesEngineMessageContents>;\n\n/** List of all messages for configuration purpose */\nexport type AvailableRulesEngineMessageContents = RulesEngineMessageContents\n | ConnectContentMessage\n | RequestMessagesContentMessage<RulesEngineMessageDataTypes>;\n\nexport const isRulesEngineMessage = (message: any): message is AvailableRulesEngineMessageContents => {\n return message && (\n message.dataType === 'rulesEngineEvents'\n || message.dataType === 'requestMessages'\n || message.dataType === 'connect'\n );\n};\n","import {\n InjectionToken,\n} from '@angular/core';\n\n/** Determine if the action should be executed */\nexport const RULES_ENGINE_OPTIONS = new InjectionToken<boolean>('Rules Engine Options');\n\n/** Rules engine configuration */\nexport interface RulesEngineServiceOptions {\n /** Determine if the actions resulting of the rule engine should be executed */\n dryRun: boolean;\n /** Flag to activate the run of Rules Engine in debug mode */\n debug: boolean;\n /** Limit the number of debug events kept in stack */\n debugEventsStackLimit?: number;\n}\n\n/** Default Rules engine options */\nexport const DEFAULT_RULES_ENGINE_OPTIONS: Readonly<RulesEngineServiceOptions> = {\n dryRun: false,\n debug: false\n} as const;\n","import {\n createAction,\n props,\n} from '@ngrx/store';\nimport {\n asyncProps,\n AsyncRequest,\n FailAsyncStoreItemEntitiesActionPayload,\n FromApiActionPayload,\n SetActionPayload,\n SetAsyncStoreItemEntitiesActionPayload,\n UpdateActionPayload,\n} from '@o3r/core';\nimport {\n RulesetsModel,\n RulesetsStateDetails,\n} from './rulesets.state';\n\n/** StateDetailsActions */\nconst ACTION_SET = '[Rulesets] set';\nconst ACTION_UPDATE = '[Rulesets] update';\nconst ACTION_RESET = '[Rulesets] reset';\nconst ACTION_CANCEL_REQUEST = '[Rulesets] cancel request';\n\n/** Entity Actions */\nconst ACTION_CLEAR_ENTITIES = '[Rulesets] clear entities';\nconst ACTION_UPSERT_ENTITIES = '[Rulesets] upsert entities';\nconst ACTION_SET_ENTITIES = '[Rulesets] set entities';\nconst ACTION_FAIL_ENTITIES = '[Rulesets] fail entities';\n\n/** Async Actions */\nconst ACTION_SET_ENTITIES_FROM_API = '[Rulesets] set entities from api';\nconst ACTION_UPSERT_ENTITIES_FROM_API = '[Rulesets] upsert entities from api';\n\n/** Action to clear the StateDetails of the store and replace it */\nexport const setRulesets = createAction(ACTION_SET, props<SetActionPayload<RulesetsStateDetails>>());\n\n/** Action to change a part or the whole object in the store. */\nexport const updateRulesets = createAction(ACTION_UPDATE, props<UpdateActionPayload<RulesetsStateDetails>>());\n\n/** Action to reset the whole state, by returning it to initial state. */\nexport const resetRulesets = createAction(ACTION_RESET);\n\n/** Action to cancel a Request ID registered in the store. Can happen from effect based on a switchMap for instance */\nexport const cancelRulesetsRequest = createAction(ACTION_CANCEL_REQUEST, props<AsyncRequest>());\n\n/** Action to clear all rulesets and fill the store with the payload */\nexport const setRulesetsEntities = createAction(ACTION_SET_ENTITIES, props<SetAsyncStoreItemEntitiesActionPayload<RulesetsModel>>());\n\n/** Action to update rulesets with known IDs, insert the new ones */\nexport const upsertRulesetsEntities = createAction(ACTION_UPSERT_ENTITIES, props<SetAsyncStoreItemEntitiesActionPayload<RulesetsModel>>());\n\n/** Action to empty the list of entities, keeping the global state */\nexport const clearRulesetsEntities = createAction(ACTION_CLEAR_ENTITIES);\n\n/** Action to update failureStatus for every RulesetsModel */\nexport const failRulesetsEntities = createAction(ACTION_FAIL_ENTITIES, props<FailAsyncStoreItemEntitiesActionPayload<any>>());\n\n/**\n * Action to put the global status of the store in a pending state. Call SET action with the list of RulesetsModels received, when this action resolves.\n * If the call fails, dispatch FAIL_ENTITIES action\n */\nexport const setRulesetsEntitiesFromApi = createAction(ACTION_SET_ENTITIES_FROM_API, asyncProps<FromApiActionPayload<RulesetsModel[]>>());\n\n/**\n * Action to put global status of the store in a pending state. Call UPSERT action with the list of RulesetsModels received, when this action resolves.\n * If the call fails, dispatch FAIL_ENTITIES action\n */\nexport const upsertRulesetsEntitiesFromApi = createAction(ACTION_UPSERT_ENTITIES_FROM_API, asyncProps<FromApiActionPayload<RulesetsModel[]>>());\n","import {\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n Actions,\n createEffect,\n ofType,\n} from '@ngrx/effects';\nimport {\n fromApiEffectSwitchMap,\n} from '@o3r/core';\nimport {\n from,\n of,\n} from 'rxjs';\nimport {\n catchError,\n map,\n mergeMap,\n} from 'rxjs/operators';\nimport {\n cancelRulesetsRequest,\n failRulesetsEntities,\n setRulesetsEntities,\n setRulesetsEntitiesFromApi,\n upsertRulesetsEntities,\n upsertRulesetsEntitiesFromApi,\n} from './rulesets.actions';\n\n/**\n * Service to handle async Rulesets actions\n */\n@Injectable()\nexport class RulesetsEffect {\n protected actions$ = inject(Actions);\n\n /**\n * Set the entities with the reply content, dispatch failRulesetsEntities if it catches a failure\n */\n public setEntitiesFromApi$ = createEffect(() =>\n this.actions$.pipe(\n ofType(setRulesetsEntitiesFromApi),\n fromApiEffectSwitchMap(\n (reply, action) => setRulesetsEntities({ entities: reply, requestId: action.requestId }),\n (error, action) => of(failRulesetsEntities({ error, requestId: action.requestId })),\n cancelRulesetsRequest\n )\n )\n );\n\n /**\n * Upsert the entities with the reply content, dispatch failRulesetsEntities if it catches a failure\n */\n public upsertEntitiesFromApi$ = createEffect(() =>\n this.actions$.pipe(\n ofType(upsertRulesetsEntitiesFromApi),\n mergeMap((payload) =>\n from(payload.call).pipe(\n map((reply) => upsertRulesetsEntities({ entities: reply, requestId: payload.requestId })),\n catchError((err) => of(failRulesetsEntities({ error: err, requestId: payload.requestId })))\n )\n )\n )\n );\n}\n","import {\n createEntityAdapter,\n} from '@ngrx/entity';\nimport {\n ActionCreator,\n createReducer,\n on,\n ReducerTypes,\n} from '@ngrx/store';\nimport {\n asyncStoreItemAdapter,\n} from '@o3r/core';\nimport * as actions from './rulesets.actions';\nimport {\n RulesetsModel,\n RulesetsState,\n} from './rulesets.state';\n\n/**\n * Rulesets Store adapter\n */\nexport const rulesetsAdapter = createEntityAdapter<RulesetsModel>({\n selectId: (model) => model.id\n});\n\n/**\n * Rulesets Store initial value\n */\nexport const rulesetsInitialState = rulesetsAdapter.getInitialState<RulesetsState>({\n requestIds: []\n});\n\n/**\n * List of basic actions for Rulesets Store\n */\nexport const rulesetsReducerFeatures: ReducerTypes<RulesetsState, ActionCreator[]>[] = [\n on(actions.resetRulesets, () => rulesetsInitialState),\n\n on(actions.setRulesets, (state, payload) => ({ ids: state.ids, entities: state.entities, ...payload.stateDetails })),\n\n on(actions.cancelRulesetsRequest, (state, action) => asyncStoreItemAdapter.resolveRequest(state, action.requestId)),\n\n on(actions.updateRulesets, (state, payload) => ({ ...state, ...payload.stateDetails })),\n\n on(actions.setRulesetsEntities, (state, payload) =>\n rulesetsAdapter.addMany(\n payload.entities,\n rulesetsAdapter.removeAll(asyncStoreItemAdapter.resolveRequest(state, payload.requestId)))\n ),\n\n on(actions.upsertRulesetsEntities, (state, payload) =>\n rulesetsAdapter.upsertMany(payload.entities, asyncStoreItemAdapter.resolveRequest(state, payload.requestId))\n ),\n\n on(actions.clearRulesetsEntities, (state) => rulesetsAdapter.removeAll(state)),\n\n on(actions.failRulesetsEntities, (state, payload) =>\n asyncStoreItemAdapter.failRequest(state, payload.requestId)\n ),\n\n on(actions.setRulesetsEntitiesFromApi, actions.upsertRulesetsEntitiesFromApi, (state, payload) =>\n asyncStoreItemAdapter.addRequest(state, payload.requestId))\n];\n\n/**\n * Rulesets Store reducer\n */\nexport const rulesetsReducer = createReducer(\n rulesetsInitialState,\n ...rulesetsReducerFeatures\n);\n","import {\n EntityState,\n} from '@ngrx/entity';\nimport {\n AsyncStoreItem,\n} from '@o3r/core';\nimport type {\n Ruleset,\n} from '../../engine';\n\n/**\n * Rulesets model\n */\nexport interface RulesetsModel extends Ruleset {\n}\n\n/**\n * Rulesets state details\n */\nexport interface RulesetsStateDetails extends AsyncStoreItem {\n}\n\n/**\n * Rulesets store state\n */\nexport interface RulesetsState extends EntityState<RulesetsModel>, RulesetsStateDetails {\n}\n\n/**\n * Name of the Rulesets Store\n */\nexport const RULESETS_STORE_NAME = 'rulesets';\n\n/**\n * Rulesets Store Interface\n */\nexport interface RulesetsStore {\n /** Rulesets state */\n [RULESETS_STORE_NAME]: RulesetsState;\n}\n","import {\n InjectionToken,\n ModuleWithProviders,\n NgModule,\n} from '@angular/core';\nimport {\n EffectsModule,\n} from '@ngrx/effects';\nimport {\n Action,\n ActionReducer,\n StoreModule,\n} from '@ngrx/store';\nimport {\n RulesetsEffect,\n} from './rulesets.effect';\nimport {\n rulesetsReducer,\n} from './rulesets.reducer';\nimport {\n RULESETS_STORE_NAME,\n RulesetsState,\n} from './rulesets.state';\n\n/** Token of the Rulesets reducer */\nexport const RULESETS_REDUCER_TOKEN = new InjectionToken<ActionReducer<RulesetsState, Action>>('Feature Rulesets Reducer');\n\n/** Provide default reducer for Rulesets store */\nexport function getDefaultRulesetsReducer() {\n return rulesetsReducer;\n}\n\n@NgModule({\n imports: [\n StoreModule.forFeature(RULESETS_STORE_NAME, RULESETS_REDUCER_TOKEN), EffectsModule.forFeature([RulesetsEffect])\n ],\n providers: [\n { provide: RULESETS_REDUCER_TOKEN, useFactory: getDefaultRulesetsReducer }\n ]\n})\nexport class RulesetsStoreModule {\n public static forRoot<T extends RulesetsState>(reducerFactory: () => ActionReducer<T, Action>): ModuleWithProviders<RulesetsStoreModule> {\n return {\n ngModule: RulesetsStoreModule,\n providers: [\n { provide: RULESETS_REDUCER_TOKEN, useFactory: reducerFactory }\n ]\n };\n }\n}\n","import {\n createFeatureSelector,\n createSelector,\n} from '@ngrx/store';\nimport {\n computeItemIdentifier,\n} from '@o3r/core';\nimport type {\n Ruleset,\n} from '../../engine';\nimport {\n rulesetsAdapter,\n} from './rulesets.reducer';\nimport {\n RULESETS_STORE_NAME,\n RulesetsState,\n} from './rulesets.state';\n\nconst { selectIds, selectEntities, selectAll, selectTotal } = rulesetsAdapter.getSelectors();\n\n/** Select Rulesets State */\nexport const selectRulesetsState = createFeatureSelector<RulesetsState>(RULESETS_STORE_NAME);\n\n/** Select the array of Rulesets ids */\nexport const selectRulesetsIds = createSelector(selectRulesetsState, selectIds);\n\n/** Select the array of Rulesets */\nexport const selectAllRulesets = createSelector(selectRulesetsState, selectAll);\n\n/** Select the dictionary of Rulesets entities */\nexport const selectRulesetsEntities = createSelector(selectRulesetsState, selectEntities);\n\n/** Select the total Rulesets count */\nexport const selectRulesetsTotal = createSelector(selectRulesetsState, selectTotal);\n\n/** Select the store pending status */\nexport const selectRulesetsStorePendingStatus = createSelector(selectRulesetsState, (state) => state.isPending || false);\n\n/**\n * Check if the given value is a valid date\n * @param d\n */\nconst isValidDate = (d: any) => !Number.isNaN(d) && d instanceof Date;\n\n/**\n * Returns the rulesets which are in the validity range, if provided\n */\nexport const selectRuleSetsInRange = createSelector(\n selectAllRulesets,\n (ruleSets) => ruleSets.filter((ruleSet: Ruleset) => {\n const validity = ruleSet.validityRange;\n if (!validity || (!validity.from && !validity.to)) {\n return true;\n }\n\n const from = validity.from && new Date(validity.from);\n const to = validity.to && new Date(validity.to);\n\n if ((to && !isValidDate(to)) || (from && !isValidDate(from))) {\n return false;\n }\n const time = Date.now();\n if (to && from) {\n return from.getTime() <= time && to.getTime() >= time;\n }\n\n if (from) {\n return from.getTime() <= time;\n }\n return to && to.getTime() >= time;\n })\n);\n\n/**\n * Returns the rulesets ids which are not onDemand and in the validity range\n */\nexport const selectActiveRuleSets = createSelector(\n selectRuleSetsInRange,\n (ruleSets) => ruleSets\n .filter((ruleSet: Ruleset) => (!ruleSet.linkedComponents?.or?.length))\n .map((ruleSet: Ruleset) => ruleSet.id));\n\n/**\n * Assign component to RulesetIds Map\n * @param compName\n * @param library\n * @param ruleSetId\n * @param acc\n */\nfunction linkComponentToRuleset(compName: string, library: string, ruleSetId: string, acc: Record<string, string[]> = {}) {\n const configName = computeItemIdentifier(compName, library);\n acc[ruleSetId] ||= [];\n acc[ruleSetId].push(configName);\n}\n\n/**\n * Select the map of ruleSets to activate based on linked components\n */\nexport const selectComponentsLinkedToRuleset = createSelector(\n selectRuleSetsInRange,\n (ruleSets) =>\n ruleSets\n .reduce((acc: { or: { [key: string]: string[] } }, ruleSet: Ruleset) => {\n if (!ruleSet.linkedComponents?.or || ruleSet.linkedComponents.or.length === 0) {\n return acc;\n }\n if (ruleSet.linkedComponents?.or?.length) {\n ruleSet.linkedComponents.or.forEach((linkComp) => {\n linkComponentToRuleset(linkComp.name, linkComp.library, ruleSet.id, acc.or);\n });\n return acc;\n }\n return acc;\n }, { or: {} })\n);\n","import {\n asyncStoreItemAdapter,\n Serializer,\n} from '@o3r/core';\nimport {\n rulesetsAdapter,\n rulesetsInitialState,\n} from './rulesets.reducer';\nimport {\n RulesetsModel,\n RulesetsState,\n} from './rulesets.state';\n\nexport const rulesetsStorageSerializer = (state: RulesetsState) => {\n return asyncStoreItemAdapter.clearAsyncStoreItem(state);\n};\n\nexport const rulesetsStorageDeserializer = (rawObject: any) => {\n if (!rawObject || !rawObject.ids) {\n return rulesetsInitialState;\n }\n const storeObject = rulesetsAdapter.getInitialState<RulesetsState>(rawObject);\n for (const id of rawObject.ids) {\n storeObject.entities[id] = rawObject.entities[id] as RulesetsModel;\n }\n return storeObject;\n};\n\nexport const rulesetsStorageSync: Serializer<RulesetsState> = {\n serialize: rulesetsStorageSerializer,\n deserialize: rulesetsStorageDeserializer\n};\n","import {\n EvaluationReason,\n RuleEvaluation,\n RuleEvaluationOutput,\n} from '../engine-interface';\nimport type {\n Facts,\n} from '../fact';\nimport {\n ActionBlock,\n Rule,\n} from '../structure';\n\n/**\n * Function to retrieve from 2 sequential executions only the triggers which activated the last ruleset execution\n * @param currRes Current ruleset execution object\n * @param prevRes Previous ruleset execution object\n * @returns The triggers list which activates the last ruleset execution\n */\nexport function retrieveRulesetTriggers(currRes: RuleEvaluationOutput[], prevRes: RuleEvaluationOutput[] | undefined) {\n let rulesetTriggers: Record<string, Record<string, EvaluationReason>> = {};\n\n const allCurrRulesetTriggersList = currRes.map((r) => r.evaluation).filter((e): e is RuleEvaluation => !!e).map((e) => e.triggers);\n const allCurrRulesetTriggers: Record<string, Record<string, EvaluationReason>> = {};\n\n allCurrRulesetTriggersList.forEach((rTrig) => {\n Object.keys(rTrig).forEach((ruleId) => {\n allCurrRulesetTriggers[ruleId] = rTrig[ruleId];\n });\n });\n\n if (prevRes) {\n const allPrevRulesetTriggersList = prevRes.map((r) => r.evaluation).filter((e): e is RuleEvaluation => !!e).map((e) => e.triggers);\n const allPrevRulesetTriggers: Record<string, Record<string, EvaluationReason>> = {};\n\n allPrevRulesetTriggersList.forEach((rTrig) => {\n Object.keys(rTrig).forEach((ruleId) => {\n allPrevRulesetTriggers[ruleId] = rTrig[ruleId];\n });\n });\n\n Object.entries(allCurrRulesetTriggers).forEach(([ruleId, ruleTriggers]) => {\n Object.keys(ruleTriggers).forEach((factName) => {\n if (!allPrevRulesetTriggers[ruleId]\n || !allPrevRulesetTriggers[ruleId][factName]\n || ruleTriggers[factName].newValue !== allPrevRulesetTriggers[ruleId][factName].newValue) {\n (rulesetTriggers[ruleId] ||= {})[factName] = ruleTriggers[factName];\n }\n });\n });\n } else {\n rulesetTriggers = allCurrRulesetTriggers;\n }\n return rulesetTriggers;\n}\n\n/**\n * Flag as cached the rules evaluations which are from previous ruleset executions\n * @param rulesEvaluations all rules evaluations list\n * @param triggers Ruleset triggers object\n * @returns Rules evaluation list with flagged rules evaluation from previous ruleset executions\n */\nexport function flagCachedRules(rulesEvaluations: RuleEvaluation[], triggers: Record<string, Record<string, EvaluationReason>>): (RuleEvaluation & { cached?: boolean })[] {\n const rulesWhichTriggeredExecution = Object.keys(triggers);\n\n return rulesEvaluations.map((e) => {\n if (e && !rulesWhichTriggeredExecution.includes(e.rule.id)) {\n return { ...e, cached: true };\n }\n return { ...e };\n });\n}\n\n/**\n * Create the debug rule evaluation object\n * @param rule\n * @param rulesetName\n * @param outputActions\n * @param outputError\n * @param runtimeFactValues\n * @param factValues\n * @param oldFactValues\n * @param inputFacts\n */\nexport function handleRuleEvaluationDebug(\n rule: Rule,\n rulesetName: string,\n outputActions: ActionBlock[] | undefined,\n outputError: any,\n runtimeFactValues: Record<string, Facts>,\n factValues: any[] | undefined,\n oldFactValues: any[] | undefined,\n inputFacts: string[] | undefined = []\n) {\n const executionId = `${rulesetName} - ${rule.name}`;\n\n const reasons: Record<string, Record<string, EvaluationReason>> = {};\n for (let index = 0; index < factValues!.length; index++) {\n if (!oldFactValues) {\n (reasons[rule.id] ||= {})[inputFacts[index]] = { factName: inputFacts[index], newValue: factValues![index] };\n } else if (oldFactValues[index]?.toString() !== factValues![index]?.toString()) {\n (reasons[rule.id] ||= {})[inputFacts[index]] = { factName: inputFacts[index], oldValue: oldFactValues[index], newValue: factValues![index] };\n }\n }\n\n const ruleEvaluation: RuleEvaluation = {\n timestamp: Date.now(),\n outputActions,\n id: executionId,\n triggers: reasons,\n temporaryFacts: rule.outputRuntimeFacts.concat(rule.inputRuntimeFacts).reduce<Record<string, Facts>>((acc, runtimeFactName) => {\n if (typeof runtimeFactValues[runtimeFactName] !== 'undefined') {\n acc[runtimeFactName] = runtimeFactValues[runtimeFactName];\n }\n return acc;\n }, {}\n ),\n rule: { id: rule.id, name: rule.name },\n ...(outputError ? { error: outputError } : {})\n };\n return ruleEvaluation;\n}\n","import {\n debounceTime,\n Observable,\n ReplaySubject,\n Subject,\n} from 'rxjs';\nimport {\n concatMap,\n share,\n shareReplay,\n startWith,\n switchMap,\n tap,\n withLatestFrom,\n} from 'rxjs/operators';\nimport type {\n RulesEngine,\n} from '../engine';\nimport {\n BaseRulesetExecution,\n DebugEvent,\n EvaluationReason,\n RuleEvaluation,\n RuleEvaluationOutput,\n RulesetExecutionErrorEvent,\n RulesetExecutionEvent,\n} from '../engine-interface';\nimport type {\n Facts,\n} from '../fact';\nimport {\n RulesetExecutor,\n} from '../ruleset-executor';\nimport type {\n ActionBlock,\n Ruleset,\n} from '../structure';\nimport {\n flagCachedRules,\n retrieveRulesetTriggers,\n} from './helpers';\n\nexport interface EngineDebuggerOptions {\n /**\n * Limit of events to keep in the stack before subscribing to the debugEvents$ stream.\n * @default undefined no limit\n */\n eventsStackLimit?: number;\n}\n\n/**\n * Rules engine debugger object to emit debug events\n */\nexport class EngineDebugger {\n private registeredRuleEngine?: RulesEngine;\n\n private registeredRulesets: Pick<Ruleset, 'name' | 'id'>[] = [];\n\n // Keep a small history in case the events$ stream from the engine is subscribed after rules engine initialization\n private readonly debugEventsSubject$: ReplaySubject<() => (Promise<DebugEvent> | DebugEvent)>;\n\n private performanceMeasures$!: Observable<PerformanceMeasure[]>;\n\n private readonly requestFactsSnapshot = new Subject<void>();\n\n /** Stream emitting a debug event when is fired; timeline is kept */\n public readonly debugEvents$: Observable<DebugEvent>;\n\n /** Retrieved the rules engine plugged to the debugger */\n public get rulesEngine(): RulesEngine | undefined {\n return this.registeredRuleEngine;\n }\n\n /**\n * Instantiate a rules engine debugger\n * @param options Options to configure the debugger\n */\n constructor(options?: EngineDebuggerOptions) {\n this.debugEventsSubject$ = new ReplaySubject<() => (Promise<DebugEvent> | DebugEvent)>(options?.eventsStackLimit);\n this.initializePerformanceObserver();\n this.debugEvents$ = new Observable<DebugEvent>((subscriber) => {\n const factsSnapshotSubscription = this.requestFactsSnapshot.pipe(\n debounceTime(1000),\n switchMap(async () => {\n const timestamp = Date.now();\n const facts = await this.getFactsSnapshot(this.registeredRuleEngine!.getRegisteredFactsNames());\n this.debugEventsSubject$.next(() => ({\n timestamp,\n type: 'AvailableFactsSnapshot',\n facts\n }));\n })\n ).subscribe();\n const debugEventsSubscription = this.debugEventsSubject$.pipe(\n withLatestFrom(this.performanceMeasures$),\n concatMap(async ([eventFunc, performanceMeasures]) => {\n const debugEvent: DebugEvent = await eventFunc();\n if (debugEvent.type === 'RulesetExecution' || debugEvent.type === 'RulesetExecutionError') {\n let rulesetDuration = 0;\n debugEvent.rulesEvaluations.forEach((rule) => {\n const mark = `rules-engine:${\n this.registeredRuleEngine?.rulesEngineInstanceName || ''\n }:${debugEvent.rulesetName}:${rule.rule.name}`;\n const measures = performanceMeasures.filter((m) => m.name === mark);\n const duration = measures.at(-1)?.duration || 0;\n rule.duration = duration;\n rulesetDuration += duration;\n });\n debugEvent.duration = rulesetDuration;\n }\n return debugEvent;\n }),\n tap((debugEvent) => {\n if (debugEvent.type === 'RulesetExecution') {\n this.rulesEngine?.logger?.debug?.(`${debugEvent.rulesetName} has been triggered and resulted in ${JSON.stringify(debugEvent.outputActions)}`);\n }\n })\n ).subscribe(subscriber);\n\n return () => {\n factsSnapshotSubscription.unsubscribe();\n debugEventsSubscription.unsubscribe();\n };\n }).pipe(share());\n }\n\n private initializePerformanceObserver() {\n this.performanceMeasures$ = new Observable<PerformanceMeasure[]>((subscriber) => {\n const performanceObserver = new PerformanceObserver((list) => {\n subscriber.next(list.getEntries() as PerformanceMeasure[]);\n });\n performanceObserver.observe({ entryTypes: ['measure'] });\n return () => performanceObserver.disconnect();\n }).pipe(startWith([]), shareReplay(1));\n }\n\n private async createBaseExecutionOutputObject(ruleset: Ruleset, executionCounter: number,\n rulesetInputFacts: string[], runtimeFactValues: Record<string, Facts>,\n rulesetTriggers: Record<string, Record<string, EvaluationReason>>, rulesExecutions: RuleEvaluation[]) {\n const inputFacts = await this.getFactsSnapshot(rulesetInputFacts);\n\n const baseRulesetOutputExecution: BaseRulesetExecution = {\n executionCounter,\n executionId: `${ruleset.id}-${executionCounter}`,\n rulesetId: ruleset.id,\n rulesetName: ruleset.name,\n inputFacts,\n triggers: rulesetTriggers,\n rulesEvaluations: flagCachedRules(rulesExecutions?.sort((a, b) => a.timestamp - b.timestamp) || [], rulesetTriggers),\n temporaryFacts: runtimeFactValues\n };\n return baseRulesetOutputExecution;\n }\n\n private async rulesetExecution(\n timestamp: number,\n ruleset: Ruleset,\n executionCounter: number,\n rulesetInputFacts: string[],\n allOutputActions: ActionBlock[],\n runtimeFactValues: Record<string, Facts>,\n rulesetTriggers: Record<string, Record<string, EvaluationReason>>,\n rulesExecutions: RuleEvaluation[]) {\n const baseRulesetOutputExecution = await this.createBaseExecutionOutputObject(ruleset, executionCounter, rulesetInputFacts, runtimeFactValues, rulesetTriggers, rulesExecutions);\n\n const rulesetOutputExecution: RulesetExecutionEvent = {\n timestamp,\n type: 'RulesetExecution',\n outputActions: allOutputActions,\n ...baseRulesetOutputExecution\n };\n\n return rulesetOutputExecution;\n }\n\n private async rulesetExecutionError(\n timestamp: number,\n ruleset: Ruleset,\n rulesetInputFacts: string[],\n executionCounter: number,\n runtimeFactValues: Record<string, Facts>,\n rulesetTriggers: Record<string, Record<string, EvaluationReason>>,\n rulesExecutions: RuleEvaluation[]\n ) {\n const baseRulesetOutputExecution = await this.createBaseExecutionOutputObject(ruleset, executionCounter, rulesetInputFacts, runtimeFactValues, rulesetTriggers, rulesExecutions);\n\n const rulesExecWithErrors = rulesExecutions.filter((ex) => !!ex && !!ex.error);\n const rulesetOutputExecutionSkip: RulesetExecutionErrorEvent = {\n timestamp,\n type: 'RulesetExecutionError',\n rulesCausingTheError: rulesExecWithErrors.map((e) => e.rule) || [],\n errors: rulesExecWithErrors.map((e) => e.error),\n ...baseRulesetOutputExecution\n };\n return rulesetOutputExecutionSkip;\n }\n\n /**\n * Plug the debugger to a Rule Engine\n * @param rulesEngine\n */\n public registerRuleEngine(rulesEngine: RulesEngine) {\n this.registeredRuleEngine = rulesEngine;\n }\n\n /**\n * Handle ruleset execution debug info\n * @param currRes\n * @param prevRes\n * @param allExecutionsValid\n * @param rulesetInputFacts\n * @param runtimeFactValues\n * @param executionCounter\n * @param ruleset\n */\n public handleDebugRulesetExecutionInfo(\n currRes: RuleEvaluationOutput[],\n prevRes: RuleEvaluationOutput[] | undefined,\n allExecutionsValid: boolean,\n rulesetInputFacts: string[],\n runtimeFactValues: Record<string, Facts>,\n executionCounter: number,\n ruleset: Ruleset) {\n const rulesetTriggers = retrieveRulesetTriggers(currRes, prevRes);\n const rulesetOutputExecution = currRes.map((r) => r.evaluation!);\n\n if (!allExecutionsValid) {\n this.addRulesetExecutionErrorEvent(ruleset, rulesetInputFacts, executionCounter, runtimeFactValues, rulesetTriggers, rulesetOutputExecution);\n }\n\n return {\n executionCounter,\n rulesetOutputExecution,\n allExecutionsValid,\n rulesetTriggers\n };\n }\n\n /**\n * Emits an 'AvailableRulesets' debug event when rulesets are registered to the rules engine\n * @param rulesets\n */\n public addAvailableRulesets(rulesets: Ruleset[]) {\n const timestamp = Date.now();\n this.registeredRulesets = [...this.registeredRulesets, ...rulesets.map((r) => ({ name: r.name, id: r.id }))];\n this.debugEventsSubject$.next(() => ({\n timestamp,\n type: 'AvailableRulesets',\n availableRulesets: this.registeredRulesets\n }));\n }\n\n /**\n * Computes and emits an 'ActiveRulesets' debug event when the active rulesets are changing\n * @param ruleSetExecutorMap map off all rulesets executors\n * @param restrictiveRuleSets ids of the rulesets to activate; if not provided all registered rulesets will be considered as active\n */\n public activeRulesetsChange(ruleSetExecutorMap: Record<string, RulesetExecutor>, restrictiveRuleSets?: string[]) {\n const timestamp = Date.now();\n const rulesets = Object.keys(ruleSetExecutorMap).map((rulesetId) => ruleSetExecutorMap[rulesetId].engineRuleset);\n const activeRulesets = restrictiveRuleSets\n ? Object.values(rulesets).filter((ruleSet) => restrictiveRuleSets.includes(ruleSet.id))\n : Object.values(rulesets);\n\n this.debugEventsSubject$.next(() => ({\n timestamp,\n type: 'ActiveRulesets',\n rulesets: activeRulesets.map((a) => ({ name: ruleSetExecutorMap[a.id].ruleset.name, id: ruleSetExecutorMap[a.id].ruleset.id }))\n }));\n }\n\n /**\n * Emits an 'AllActions' debug event each time the rules engine outputs the list of actions\n * @param actions list of outputted actions\n */\n public allActionsChange(actions: ActionBlock[]) {\n const timestamp = Date.now();\n this.debugEventsSubject$.next(() => ({ timestamp, type: 'AllActions', actions }));\n }\n\n /**\n * Emits a 'RulesetExecution' debug event at the output of a successful ruleset execution\n * @param ruleset\n * @param executionCounter\n * @param rulesetInputFacts\n * @param allOutputActions\n * @param runtimeFactValues\n * @param rulesetTriggers\n * @param rulesExecutions\n */\n public addRulesetExecutionEvent(ruleset: Ruleset, executionCounter: number,\n rulesetInputFacts: string[], allOutputActions: ActionBlock[], runtimeFactValues: Record<string, Facts>,\n rulesetTriggers: Record<string, Record<string, EvaluationReason>>, rulesExecutions: RuleEvaluation[]) {\n const timestamp = Date.now();\n this.debugEventsSubject$.next(() => this.rulesetExecution(timestamp, ruleset, executionCounter,\n rulesetInputFacts, allOutputActions, runtimeFactValues, rulesetTriggers, rulesExecutions));\n }\n\n /**\n * Emits a 'RulesetExecutionError' debug event at the output of a failing ruleset execution\n * @param ruleset\n * @param rulesetInputFacts\n * @param executionCounter\n * @param runtimeFactValues\n * @param rulesetTriggers\n * @param rulesExecutions\n */\n public addRulesetExecutionErrorEvent(\n ruleset: Ruleset,\n rulesetInputFacts: string[],\n executionCounter: number,\n runtimeFactValues: Record<string, Facts>,\n rulesetTriggers: Record<string, Record<string, EvaluationReason>>,\n rulesExecutions: RuleEvaluation[]\n ) {\n const timestamp = Date.now();\n this.debugEventsSubject$.next(() => this.rulesetExecutionError(timestamp, ruleset, rulesetInputFacts, executionCounter, runtimeFactValues, rulesetTriggers, rulesExecutions));\n }\n\n /**\n * Emits a 'AvailableFactsSnapshot' debug event when a fact value is updated\n * @param _id\n * @param factValue$\n */\n public addAvailableFactsSnapshotEvent(\n _id: string,\n factValue$: Observable<any>\n ) {\n factValue$.subscribe(() => this.requestFactsSnapshot.next());\n }\n\n /**\n * Returns a list of fact name and value pairs\n * @param factsNames List of facts names to get the value for\n */\n public async getFactsSnapshot(factsNames: string[]) {\n const facts: { factName: string; value: any }[] = [];\n if (!this.registeredRuleEngine) {\n throw new Error('Rule engine not plugged to the debugger');\n }\n for (const factName of factsNames) {\n facts.push({ factName, value: await this.registeredRuleEngine.retrieveFactValue(factName) });\n }\n return facts;\n }\n}\n","import {\n combineLatest,\n Observable,\n of,\n} from 'rxjs';\nimport {\n map,\n shareReplay,\n switchMap,\n} from 'rxjs/operators';\nimport {\n RulesetExecutor,\n} from '../ruleset-executor';\n\n/**\n * Filter the actions outputted by the rules engine, based on active rulesets\n * @param restrictiveRuleSets list of rules sets to get the event stream for\n */\nexport function filterRulesetsEventStream(restrictiveRuleSets?: string[]) {\n return (source$: Observable<Record<string, RulesetExecutor>>) => source$.pipe(\n switchMap((ruleSetExecutorMap) => {\n const rulesets = Object.keys(ruleSetExecutorMap).map((rulesetId) => ruleSetExecutorMap[rulesetId].engineRuleset);\n const activeRulesets = restrictiveRuleSets\n ? Object.values(rulesets).filter((ruleSet) => restrictiveRuleSets.includes(ruleSet.id))\n : Object.values(rulesets);\n\n return activeRulesets?.length > 0\n ? combineLatest(activeRulesets.map((ruleset) => ruleset.rulesResultsSubject$)).pipe(\n map((item) => item.reduce((acc, currentValue) => {\n acc.push(...currentValue);\n return acc;\n }, [])))\n : of([]);\n }),\n shareReplay(1)\n );\n}\n","import type {\n Facts,\n} from '../fact';\nimport {\n DateInput,\n Operator,\n SupportedSimpleTypes,\n} from './operator-interface';\n\n/**\n * Execute Operator\n * @param lhs Left hand side\n * @param rhs Right hand side\n * @param operator Operator to compare values\n * @param operatorFacts Facts that operator can depend on\n */\nexport function executeOperator<L = unknown, R = unknown>(lhs: L, rhs: R, operator: Operator<L, R>, operatorFacts?: Record<string, Facts | undefined>) {\n const validLhs = (!operator.validateLhs || operator.validateLhs(lhs));\n const validRhs = (!operator.validateRhs || operator.validateRhs(rhs));\n let operatorFactValues: Record<string, Facts> | undefined;\n if (operatorFacts && operator.factImplicitDependencies) {\n operatorFactValues = operator.factImplicitDependencies.reduce((acc, dep) => {\n if (operatorFacts[dep]) {\n acc[dep] = operatorFacts[dep]!;\n } else {\n throw new Error(`The fact \"${dep}\" requested by ${operator.name} cannot be found.`);\n }\n return acc;\n }, {} as Record<string, Facts>);\n }\n if (!validLhs) {\n throw new Error(`Invalid left operand: ${JSON.stringify(lhs)}`);\n }\n if (!validRhs) {\n throw new Error(`Invalid right operand: ${JSON.stringify(rhs)}`);\n }\n const obs = operator.evaluator(lhs, rhs, operatorFactValues);\n return obs;\n}\n\n/**\n * Validate a number operand\n * @param operand value of one of the operands\n */\nexport function numberValidator(operand: unknown): operand is number | string {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- needed to convert any variable in a number (or NaN)\n return operand !== '' && !Array.isArray(operand) && !Number.isNaN(+`${operand}`);\n}\n\n/**\n * Validate an operand is a range of numbers\n * @param operatorInput value of one of the operands\n */\nexport function isRangeNumber(operatorInput: unknown): operatorInput is [number | string, number | string] {\n return Array.isArray(operatorInput)\n && operatorInput.length === 2\n && numberValidator(operatorInput[0])\n && numberValidator(operatorInput[1])\n && operatorInput[0] <= operatorInput[1];\n}\n\n/**\n * Verifies if the parameter is a valid date for the operator (getTime function available returning a number)\n * @param operatorInput\n */\nexport const isValidDate = (operatorInput: any): operatorInput is Date => {\n if (!operatorInput || typeof operatorInput.getTime !== 'function') {\n return false;\n }\n const getTimeResult = operatorInput.getTime();\n return typeof getTimeResult === 'number' && !Number.isNaN(getTimeResult);\n};\n\n/**\n * Verifies if the parameter is a valid input for Date constructor (new Date returns a valid date)\n * @param operatorInput\n */\nexport const isValidDateInput = (operatorInput: any): operatorInput is DateInput => {\n return operatorInput === 0 || (!!operatorInput && isValidDate(new Date(operatorInput)));\n};\n\n/**\n * Verifies if the parameter is a valid date range\n * @param operatorInput\n */\nexport const isValidDateRange = (operatorInput: any): operatorInput is [DateInput, DateInput] => {\n return Array.isArray(operatorInput)\n && operatorInput.length === 2\n && isValidDateInput(operatorInput[0])\n && isValidDateInput(operatorInput[1])\n && new Date(operatorInput[0]) <= new Date(operatorInput[1]);\n};\n\n/**\n * Verifies if the parameter is a valid time input\n * @param operatorInput\n */\nexport const isValidTimeInput = (operatorInput: any): operatorInput is string => {\n if (!isString(operatorInput) || !/^\\d{1,2}:\\d{2}$/.test(operatorInput)) {\n return false;\n }\n const [hours, minutes] = operatorInput.split(':').map((value) => +value);\n return hours < 24 && minutes < 60;\n};\n\n/**\n * Verifies if the parameter is a valid time range\n * @param operatorInput\n */\nexport const isValidTimeRange = (operatorInput: any): operatorInput is [string, string] => {\n return Array.isArray(operatorInput)\n && operatorInput.length === 2\n && isValidTimeInput(operatorInput[0])\n && isValidTimeInput(operatorInput[1]);\n};\n\n/**\n * Validate that a value is a supported simple type\n * @param value value to validate\n */\nexport function isSupportedSimpleTypes(value: unknown): value is SupportedSimpleTypes {\n return ['string', 'boolean', 'number', 'undefined'].includes(typeof value) || value === null || isValidDate(value);\n}\n\n/**\n * Validate that a value is a string\n * @param value\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\n/**\n * Parse input to return RegExp\n * @param inputRegExp\n */\nexport function parseRegExp(inputRegExp: string) {\n if (inputRegExp.startsWith('/')) {\n const finalSlash = inputRegExp.lastIndexOf('/');\n const regexpPattern = inputRegExp.slice(1, finalSlash);\n const regexpFlags = inputRegExp.slice(finalSlash + 1);\n return new RegExp(regexpPattern, regexpFlags);\n }\n return new RegExp(inputRegExp);\n}\n","import {\n isRangeNumber,\n isString,\n isSupportedSimpleTypes,\n numberValidator,\n parseRegExp,\n} from '../operator-helpers';\nimport {\n Operator,\n SupportedSimpleTypes,\n} from '../operator-interface';\n\n/**\n * Check if any of the variable's value is equal to a specific value\n * @title contains\n */\nexport const arrayContains: Operator<SupportedSimpleTypes[], SupportedSimpleTypes> = {\n name: 'arrayContains',\n evaluator: (value, b) => value.includes(b),\n validateLhs: Array.isArray,\n validateRhs: isSupportedSimpleTypes\n};\n\n/**\n * Check if the specified text value is included in the text variable\n * @title contains\n */\nexport const stringContains: Operator<string, string> = {\n name: 'stringContains',\n evaluator: (inputString, substring) => inputString.includes(substring),\n validateLhs: isString,\n validateRhs: isString\n};\n\n/**\n * Check if every value of the variable is different from a specific value\n * @title does not contain\n */\nexport const notArrayContains: Operator<SupportedSimpleTypes[], SupportedSimpleTypes> = {\n name: 'notArrayContains',\n evaluator: (array, value) => !array.includes(value),\n validateLhs: Array.isArray,\n validateRhs: isSupportedSimpleTypes\n};\n\n/**\n * Check if the specified text value is not included in the text variable\n * @title does not contain\n */\nexport const notStringContains: Operator<string, string> = {\n name: 'notStringContains',\n evaluator: (inputString, substring: any) => !inputString.includes(substring),\n validateLhs: isString,\n validateRhs: isString\n};\n\n/**\n * Check if every value of the variable equals a specific value\n * @title all equal to\n */\nexport const allEqual: Operator<SupportedSimpleTypes[], SupportedSimpleTypes> = {\n name: 'allEqual',\n // eslint-disable-next-line eqeqeq -- possibility of comparing string and number values\n evaluator: (array, value) => array.every((elementValue) => elementValue == value),\n validateLhs: Array.isArray,\n validateRhs: isSupportedSimpleTypes\n};\n\n/**\n * Check if every numerical value of the variable is greater than a specific value\n * @title all >\n */\nexport const allGreater: Operator<SupportedSimpleTypes[], number | string> = {\n name: 'allGreater',\n evaluator: (array, value) => array.every((elementValue) => numberValidator(elementValue) && +elementValue > +value),\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if every value of the variable is in a specific list\n * @title all in\n */\nexport const allIn: Operator<SupportedSimpleTypes[], SupportedSimpleTypes[]> = {\n name: 'allIn',\n evaluator: (array, value) => array.every((elementValue) => value.includes(elementValue)),\n validateLhs: Array.isArray,\n validateRhs: Array.isArray\n};\n\n/**\n * Check if every value of the variable is not in a specific list\n * @title none in\n */\nexport const allNotIn: Operator<SupportedSimpleTypes[], SupportedSimpleTypes[]> = {\n name: 'allNotIn',\n evaluator: (array, value) => !array.some((elementValue) => value.includes(elementValue)),\n validateLhs: Array.isArray,\n validateRhs: Array.isArray\n};\n\n/**\n * Check if every numerical value of the variable is lower than a specific value\n * @title all <\n */\nexport const allLower: Operator<number[], number | string> = {\n name: 'allLower',\n evaluator: (arrayNumber, number) => arrayNumber.every((elementNumber) => elementNumber < +number),\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if every string value of the variable matches a specific pattern\n * @title all match\n */\nexport const allMatch: Operator<string[], string> = {\n name: 'allMatch',\n evaluator: (array, inputRegExp) => {\n const regExp = parseRegExp(inputRegExp);\n return array.every((elementValue) => regExp.test(elementValue));\n },\n validateLhs: Array.isArray,\n validateRhs: isString\n};\n\n/**\n * Check if every value of the variable is included in a specified range\n * @title all between\n */\nexport const allRangeNumber: Operator<number[], [number | string, number | string]> = {\n name: 'allRangeNumber',\n evaluator: (rangeArray, [from, to]) =>\n rangeArray.every((elementValue) => elementValue >= +from && elementValue <= +to),\n validateLhs: Array.isArray,\n validateRhs: isRangeNumber\n};\n\n/**\n * Check if at least one of the values of the variable equals a specific value\n * @title one equal to\n */\nexport const oneEquals: Operator<SupportedSimpleTypes[], SupportedSimpleTypes> = {\n name: 'oneEquals',\n // eslint-disable-next-line eqeqeq -- possibility of comparing string and number values\n evaluator: (array, value) => array.some((elementValue) => elementValue == value),\n validateLhs: Array.isArray,\n validateRhs: isSupportedSimpleTypes\n};\n\n/**\n * Check if one of the values of the variable is greater than a specific value\n * @title one >\n */\nexport const oneGreater: Operator<number[], number | string> = {\n name: 'oneGreater',\n evaluator: (arrayNumber, number) => arrayNumber.some((elementValue) => elementValue > +number),\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if at least one of the values of the variable is equal to one in a specified list\n * @title one in\n */\nexport const oneIn: Operator<SupportedSimpleTypes[], SupportedSimpleTypes[]> = {\n name: 'oneIn',\n evaluator: (firstArray, secondArray) =>\n firstArray.some((elementValue) => secondArray.includes(elementValue)),\n validateLhs: Array.isArray,\n validateRhs: Array.isArray\n};\n\n/**\n * Check if one of the values of the variable is lower than a specific value\n * @title one <\n */\nexport const oneLower: Operator<number[], number | string> = {\n name: 'oneLower',\n evaluator: (arrayNumber, number) => arrayNumber.some((elementValue) => elementValue < +number),\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if one of the values of the variable matches a specific pattern\n * @title one matches\n */\nexport const oneMatches: Operator<string[], string> = {\n name: 'oneMatches',\n evaluator: (arrayString, inputRegExp) => {\n const regExp = parseRegExp(inputRegExp);\n return arrayString.some((elementValue) => regExp.test(elementValue));\n },\n validateLhs: Array.isArray,\n validateRhs: isString\n};\n\n/**\n * Check if one of the values of the variable is included in a specified range\n * @title one between\n */\nexport const oneRangeNumber: Operator<number[], [number | string, number | string]> = {\n name: 'oneRangeNumber',\n evaluator: (arrayNumber, [from, to]) =>\n arrayNumber.some((elementValue) => elementValue >= +from && elementValue <= +to),\n validateLhs: Array.isArray,\n validateRhs: isRangeNumber\n};\n\n/**\n * Check if the number of values of the variable is equal to a specific value\n * @title number of =\n */\nexport const lengthEquals: Operator<any[], number | string> = {\n name: 'lengthEquals',\n evaluator: (array, length) => array.length === Number(length),\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is different from a specific value\n * @title number of ≠\n */\nexport const lengthNotEquals: Operator<any[], number | string> = {\n name: 'lengthNotEquals',\n evaluator: (array, length) => array.length !== Number(length),\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is lower or equal to a specific value\n * @title number of ≤\n */\nexport const lengthLessThanOrEquals: Operator<any[], number | string> = {\n name: 'lengthLessThanOrEquals',\n evaluator: (array, length) => array.length <= +length,\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is lower than a specific value\n * @title number of <\n */\nexport const lengthLessThan: Operator<any[], number | string> = {\n name: 'lengthLessThan',\n evaluator: (array, length) => array.length < +length,\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is greater or equal to a specific value\n * @title number of ≥\n */\nexport const lengthGreaterThanOrEquals: Operator<any[], number | string> = {\n name: 'lengthGreaterThanOrEquals',\n evaluator: (array, length) => array.length >= +length,\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is greater than a specific value\n * @title number of >\n */\nexport const lengthGreaterThan: Operator<any[], number | string> = {\n name: 'lengthGreaterThan',\n evaluator: (array, length) => array.length > +length,\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/** List of all default array operators */\nexport const arrayBasedOperators = [\n allEqual,\n allGreater,\n allIn,\n allLower,\n allMatch,\n allNotIn,\n allRangeNumber,\n arrayContains,\n lengthEquals,\n lengthNotEquals,\n lengthGreaterThan,\n lengthGreaterThanOrEquals,\n lengthLessThan,\n lengthLessThanOrEquals,\n notArrayContains,\n notStringContains,\n oneEquals,\n oneGreater,\n oneIn,\n oneLower,\n oneMatches,\n oneRangeNumber,\n stringContains\n];\n","import {\n isString,\n isSupportedSimpleTypes,\n parseRegExp,\n} from '../operator-helpers';\nimport {\n Operator,\n SupportedSimpleTypes,\n UnaryOperator,\n} from '../operator-interface';\n\n/**\n * Check if a variable is equal to a specific value\n * @title is equal to\n */\nexport const equals: Operator = {\n name: 'equals',\n // eslint-disable-next-line eqeqeq -- possibility of comparing string and number values\n evaluator: (firstValue, secondValue) => firstValue == secondValue\n};\n\n/**\n * Check if a variable is different from a specific value\n * @title is not equal to\n */\nexport const notEquals: Operator = {\n name: 'notEquals',\n // eslint-disable-next-line eqeqeq -- possibility of comparing string and number values\n evaluator: (firstValue, secondValue) => firstValue != secondValue\n};\n\n/**\n * Check if the variable's value is included in a specified list\n * @title is in\n */\nexport const inArray: Operator<SupportedSimpleTypes, SupportedSimpleTypes[]> = {\n name: 'inArray',\n evaluator: (value, array) => array.includes(value),\n validateLhs: isSupportedSimpleTypes,\n validateRhs: Array.isArray\n};\n\n/**\n * Check if the variable's value is not included in the value list\n * @title is not in\n */\nexport const notInArray: Operator<SupportedSimpleTypes, SupportedSimpleTypes[]> = {\n name: 'notInArray',\n evaluator: (value, array) => !array.includes(value),\n validateLhs: isSupportedSimpleTypes,\n validateRhs: Array.isArray\n};\n\n/**\n * Check if the text variable is part of the specified value\n * @title within\n */\nexport const inString: Operator<string, string> = {\n name: 'inString',\n evaluator: (value, inputString) => inputString.includes(value),\n validateLhs: isString,\n validateRhs: isString\n};\n\n/**\n * Check if the text variable is not part of the specified value\n * @title not within\n */\nexport const notInString: Operator<string, string> = {\n name: 'notInString',\n evaluator: (value, inputString) => !inputString.includes(value),\n validateLhs: isString,\n validateRhs: isString\n};\n\n/**\n * Check if the variable and its value are defined\n * @title is defined\n */\nexport const isDefined: UnaryOperator<any> = {\n name: 'isDefined',\n evaluator: (input) => input !== undefined && input !== null\n};\n\n/**\n * Check if the variable and its value are undefined\n * @title is not defined\n */\nexport const isUndefined: UnaryOperator<any> = {\n name: 'isUndefined',\n evaluator: (input) => input === undefined || input === null\n};\n\n/**\n * Check if the text variable matches the specified RegExp pattern\n * @title matches the pattern\n */\nexport const matchesPattern: Operator<string, string> = {\n name: 'matchesPattern',\n evaluator: (value, inputRegExp) => {\n const regExp = parseRegExp(inputRegExp);\n return regExp.test(value);\n },\n validateLhs: isString,\n validateRhs: isString\n};\n\n/** List of all default basic operators */\nexport const basicOperators = [\n equals, inArray, inString, isDefined, isUndefined, matchesPattern, notEquals, notInArray, notInString\n];\n","import {\n isValidDateInput,\n isValidDateRange,\n numberValidator,\n} from '../operator-helpers';\nimport {\n DateInput,\n Operator,\n} from '../operator-interface';\n\n/**\n * Check if a date variable is in a specified date range\n * @title is between\n */\nexport const inRangeDate: Operator<Date, [DateInput, DateInput], DateInput> = {\n name: 'inRangeDate',\n evaluator: (date, [from, to]) => {\n const dateObject = new Date(date);\n return new Date(from) <= dateObject && new Date(to) >= dateObject;\n },\n validateLhs: isValidDateInput,\n validateRhs: isValidDateRange\n};\n\n/**\n * Check if the value of the variable is in the next x minutes\n * @title is in next minutes\n * @returns false for dates before `now` and for dates after `now` + `nextMinutes`, true for dates between `now` and `now` + `nextMinutes`\n */\nexport const dateInNextMinutes: Operator<Date, number, DateInput, string | number> = {\n name: 'dateInNextMinutes',\n evaluator: (leftDateInput, minutes, operatorFactValues) => {\n if (!operatorFactValues) {\n throw new Error('No operatorFactValues. Unable to retrieve the current time.');\n }\n if (typeof operatorFactValues.o3rCurrentTime !== 'number') {\n throw new Error('o3rCurrentTime value is not a number');\n }\n const currentTimeValue = operatorFactValues.o3rCurrentTime;\n return inRangeDate.evaluator(leftDateInput, [currentTimeValue, currentTimeValue + +minutes * 60_000]);\n },\n factImplicitDependencies: ['o3rCurrentTime'],\n validateLhs: isValidDateInput,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the value of the variable is not in the next x minutes\n * @title is not in next minutes\n * @returns false for dates before `now` and for dates between `now` and `now` + `nextMinutes`, true for dates after `now` + `nextMinutes`\n */\nexport const dateNotInNextMinutes: Operator<Date, number, DateInput, string | number> = {\n name: 'dateNotInNextMinutes',\n evaluator: (leftDateInput, minutes, operatorFactValues) => {\n if (!operatorFactValues) {\n throw new Error('No operatorFactValues. Unable to retrieve the current time.');\n }\n if (typeof operatorFactValues.o3rCurrentTime !== 'number') {\n throw new Error('o3rCurrentTime value is not a number');\n }\n const currentTimeValue = operatorFactValues.o3rCurrentTime;\n const now = new Date(currentTimeValue);\n const leftDate = new Date(leftDateInput);\n const targetDate = new Date(new Date(currentTimeValue).setMinutes(now.getMinutes() + +minutes));\n return leftDate >= now && leftDate > targetDate;\n },\n factImplicitDependencies: ['o3rCurrentTime'],\n validateLhs: isValidDateInput,\n validateRhs: numberValidator\n};\n\n/**\n * Check if a date variable is prior than a specified date\n * @title is before\n */\nexport const dateBefore: Operator<Date, DateInput, DateInput> = {\n name: 'dateBefore',\n evaluator: (leftDate, rightDate) => {\n const firstDateTime = new Date(leftDate).setHours(0, 0, 0, 0);\n const secondDateTime = new Date(rightDate).setHours(0, 0, 0, 0);\n return firstDateTime < secondDateTime;\n },\n validateLhs: isValidDateInput,\n validateRhs: isValidDateInput\n};\n\n/**\n * Check if a date variable is posterior than a specified date\n * @title is after\n */\nexport const dateAfter: Operator<Date, DateInput, DateInput> = {\n name: 'dateAfter',\n evaluator: (leftDate, rightDate) => {\n const firstDateTime = new Date(leftDate).setHours(0, 0, 0, 0);\n const secondDateTime = new Date(rightDate).setHours(0, 0, 0, 0);\n return firstDateTime > secondDateTime;\n },\n validateLhs: isValidDateInput,\n validateRhs: isValidDateInput\n};\n\n/**\n * Check if a date variable is the same as a specified date\n * @title is equal to\n */\nexport const dateEquals: Operator<Date, DateInput, DateInput> = {\n name: 'dateEquals',\n evaluator: (leftDate, rightDate) => {\n const firstDateIgnoringHours = new Date(leftDate).setHours(0, 0, 0, 0);\n const secondDateIgnoringHours = new Date(rightDate).setHours(0, 0, 0, 0);\n return firstDateIgnoringHours === secondDateIgnoringHours;\n },\n validateLhs: isValidDateInput,\n validateRhs: isValidDateInput\n};\n\n/**\n * Check if a date variable is different from a specified date\n * @title is not equal\n */\nexport const dateNotEquals: Operator<Date, DateInput, DateInput> = {\n name: 'dateNotEquals',\n evaluator: (leftDate, rightDate) => {\n const firstDateIgnoringHours = new Date(leftDate).setHours(0, 0, 0, 0);\n const secondDateIgnoringHours = new Date(rightDate).setHours(0, 0, 0, 0);\n return firstDateIgnoringHours !== secondDateIgnoringHours;\n },\n validateLhs: isValidDateInput,\n validateRhs: isValidDateInput\n};\n\nexport const dateBasedOperators = [\n inRangeDate, dateInNextMinutes, dateNotInNextMinutes, dateAfter, dateBefore, dateEquals, dateNotEquals\n];\n","import {\n numberValidator,\n} from '../operator-helpers';\nimport {\n Operator,\n} from '../operator-interface';\n\n/**\n * Check if the number variable is greater or equal to a specific value\n * @title ≥\n */\nexport const greaterThanOrEqual: Operator<number, number, number | string, number | string> = {\n name: 'greaterThanOrEqual',\n evaluator: (firstNumber, secondNumber) => firstNumber >= secondNumber,\n validateLhs: numberValidator,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number variable is greater than a specific value\n * @title >\n */\nexport const greaterThan: Operator<number, number, number | string, number | string> = {\n name: 'greaterThan',\n evaluator: (firstNumber, secondNumber) => firstNumber > secondNumber,\n validateLhs: numberValidator,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number variable is lower or equal to a specific value\n * @title ≤\n */\nexport const lessOrEqual: Operator<number, number, number | string, number | string> = {\n name: 'lessOrEqual',\n evaluator: (firstNumber, secondNumber) => firstNumber <= secondNumber,\n validateLhs: numberValidator,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number variable is lower than a specific value\n * @title <\n */\nexport const lessThan: Operator<number, number, number | string, number | string> = {\n name: 'lessThan',\n evaluator: (firstNumber, secondNumber) => firstNumber < secondNumber,\n validateLhs: numberValidator,\n validateRhs: numberValidator\n};\n\n/** List of all default number based operators */\nexport const numberBasedOperators = [greaterThan, greaterThanOrEqual, lessThan, lessOrEqual];\n","import {\n arrayBasedOperators,\n} from './array-based-operators';\nimport {\n basicOperators,\n} from './basic-operators';\nimport {\n dateBasedOperators,\n} from './date-based-operators';\nimport {\n numberBasedOperators,\n} from './number-based-operators';\n\nexport * from './array-based-operators';\nexport * from './basic-operators';\nexport * from './date-based-operators';\nexport * from './number-based-operators';\n\nexport const operatorList = [...arrayBasedOperators, ...basicOperators, ...numberBasedOperators, ...dateBasedOperators];\n","import {\n AllConditions,\n AnyConditions,\n BinaryOperation,\n NotCondition,\n Operand,\n OperandFact,\n UnaryOperation,\n} from '../structure';\n\n/**\n * Determine if the condition is a properties condition\n * @param condition Condition to analyze\n */\nexport function isConditionProperties(condition: any): condition is BinaryOperation | UnaryOperation {\n return condition && typeof condition.operator !== 'undefined' && typeof condition.lhs !== 'undefined';\n}\n\n/**\n * Determine if the given operand is a Fact operand\n * @param operand Operand to analyze\n */\nexport function isOperandFact(operand: any): operand is OperandFact {\n return operand && operand.type === 'FACT';\n}\n\n/**\n * Determine if the given operand is a Inner Fact operand\n * @param operand Operand to analyze\n */\nexport function isOperandRuntimeFact(operand: any): operand is Operand<'RUNTIME_FACT', string> {\n return operand && operand.type === 'RUNTIME_FACT';\n}\n\n/**\n * Determine if the given operand is a Static Value operand\n * @param operand Operand to analyze\n */\nexport function isOperandLiteral(operand: any): operand is Operand<'LITERAL'> {\n return operand && operand.type === 'LITERAL';\n}\n\n/**\n * Determine if the given condition is All based child conditions\n * @param condition Condition node\n */\nexport function isAllConditions(condition: any): condition is AllConditions {\n return condition && typeof condition.all !== 'undefined';\n}\n\n/**\n * Determine if the given condition is Any based child conditions\n * @param condition Condition node\n */\nexport function isAnyConditions(condition: any): condition is AnyConditions {\n return condition && typeof condition.any !== 'undefined';\n}\n\n/**\n * Determine if the given condition is Not based child conditions\n * @param condition Condition node\n */\nexport function isNotCondition(condition: any): condition is NotCondition {\n return condition && typeof condition.not !== 'undefined';\n}\n","/** Ruleset executor */\nimport {\n JSONPath,\n} from 'jsonpath-plus';\nimport {\n combineLatest,\n Observable,\n of,\n} from 'rxjs';\nimport {\n distinctUntilChanged,\n map,\n pairwise,\n shareReplay,\n startWith,\n switchMap,\n tap,\n} from 'rxjs/operators';\nimport {\n handleRuleEvaluationDebug,\n} from './debug/helpers';\nimport type {\n RulesEngine,\n} from './engine';\nimport {\n EngineRuleset,\n EvaluationReason,\n RuleEvaluation,\n RuleEvaluationOutput,\n} from './engine-interface';\nimport type {\n Facts,\n} from './fact';\nimport {\n executeOperator,\n} from './operator/operator-helpers';\nimport {\n Operator,\n} from './operator/operator-interface';\nimport {\n isAllConditions,\n isConditionProperties,\n isNotCondition,\n isOperandFact,\n isOperandLiteral,\n isOperandRuntimeFact,\n} from './rule/rule-helpers';\nimport {\n ActionBlock,\n ActionSetTemporaryFactBlock,\n AllBlock,\n GenericOperand,\n IfElseBlock,\n NestedCondition,\n Rule,\n Ruleset,\n} from './structure';\n\n/** Type of the retrieve fact function */\nexport type RetrieveFactFuncType = <T = unknown> (id: string) => Observable<T | undefined>;\n\nexport class RulesetExecutor {\n /** retrieveFactFunc */\n protected readonly rulesEngine: RulesEngine;\n\n /** Map of available operators */\n protected readonly operators: Record<string, Operator<unknown, unknown>>;\n\n /** Delay before fact stream defaulting value */\n public readonly factDefaultDelay?: number;\n\n /** Ruleset associated to the current executor*/\n public readonly ruleset: Ruleset;\n\n /** Ruleset plugged to the fact stream, that contains actions stream result */\n public readonly engineRuleset: EngineRuleset;\n\n private executionCounter = 0;\n\n /**\n * Create a new ruleset executor\n * @param ruleset Ruleset to evaluate\n * @param rulesEngine Instance of the rules engine\n */\n constructor(ruleset: Ruleset, rulesEngine: RulesEngine) {\n this.ruleset = ruleset;\n this.rulesEngine = rulesEngine;\n this.operators = rulesEngine.operators;\n this.engineRuleset = this.plugRuleset();\n }\n\n /**\n * Recursively explores a rule to identify and collect input facts.\n * Input facts are identified based on the 'FACT' type and operator-specific implicit dependencies.\n * @param currentObject The current object being explored.\n * @param ruleInputFacts A set to store the identified input facts for the rule.\n */\n private collectRuleInputFacts(currentObject: AllBlock | NestedCondition | NestedCondition[], ruleInputFacts: Set<string>) {\n if (currentObject && isOperandFact(currentObject)) {\n ruleInputFacts.add(currentObject.value);\n } else if (Array.isArray(currentObject)) {\n currentObject.forEach((elem) => this.collectRuleInputFacts(elem, ruleInputFacts));\n } else {\n for (const key in currentObject) {\n if ((key === 'operator') && isConditionProperties(currentObject)) {\n const op = this.operators[currentObject[key]];\n if (op && op.factImplicitDependencies) {\n op.factImplicitDependencies.forEach((dep) => ruleInputFacts.add(dep));\n }\n } else if (typeof currentObject[key as keyof (AllBlock | NestedCondition)] === 'object') {\n this.collectRuleInputFacts(currentObject[key as keyof (AllBlock | NestedCondition)], ruleInputFacts);\n }\n }\n }\n }\n\n /**\n * Report performance mark for a rule run\n * @param rule Rule to measure\n * @param status status of the rule evaluation\n */\n protected performanceMark(rule: Rule, status: 'start' | 'end') {\n if (this.rulesEngine.performance) {\n const markName = `rules-engine:${this.rulesEngine.rulesEngineInstanceName}:${this.ruleset.name}:${rule.name}`;\n this.rulesEngine.performance.mark(`${markName}:${status}`);\n if (status === 'end') {\n this.rulesEngine.performance.measure(markName, `${markName}:start`, `${markName}:end`);\n }\n }\n }\n\n /**\n * Get operand value stream according to its type\n * @param operand operand of the condition\n * @param factsValue\n * @param runtimeFactValues\n */\n protected getOperandValue(operand: GenericOperand | undefined, factsValue: Record<string, Facts | undefined>, runtimeFactValues: Record<string, Facts>): unknown {\n if (typeof operand === 'undefined') {\n return undefined;\n } else if (isOperandFact(operand)) {\n const factValue = factsValue[operand.value];\n // eslint-disable-next-line new-cap -- convention for JSONPath\n return operand.path ? factValue && JSONPath({ wrap: false, json: factValue, path: operand.path }) : factValue;\n } else if (isOperandLiteral(operand)) {\n return operand.value;\n } else if (isOperandRuntimeFact(operand)) {\n return runtimeFactValues[operand.value];\n }\n return undefined;\n }\n\n /**\n * Process a root rule from a ruleset, and return the associated actions to be processed\n * Will also update the runtimeFactValues map that is ruleset wise\n * Note that runtimeFactValues will be mutated by all the runtime facts actions executed\n * @param rule\n * @param factsValue\n * @param runtimeFactValues\n * @protected\n */\n protected evaluateRule(rule: Rule, factsValue: Record<string, Facts | undefined>, runtimeFactValues: Record<string, Facts>) {\n return this.evaluateBlock(rule.rootElement, factsValue, runtimeFactValues);\n }\n\n /**\n * Recursively process a block to extract all the actions keeping the order\n * Note that runtimeFactValues will be mutated by all the runtime facts actions executed\n * @param element\n * @param factsValue\n * @param runtimeFactValues This runtime fact map will be mutated by all the runtime facts actions executed\n * @param actions\n * @protected\n */\n protected evaluateBlock(element: AllBlock, factsValue: Record<string, Facts | undefined>, runtimeFactValues: Record<string, Facts>, actions: ActionBlock[] = []) {\n if (this.isIfElseBlock(element)) {\n (!element.condition || this.evaluateCondition(element.condition, factsValue, runtimeFactValues) ? element.successElements : element.failureElements)\n .forEach((elementResult) => this.evaluateBlock(elementResult, factsValue, runtimeFactValues, actions));\n } else if (this.isActionBlock(element)) {\n if (this.isActionSetTemporaryFactBlock(element)) {\n runtimeFactValues[element.fact] = element.value;\n } else {\n actions.push(element);\n }\n }\n return actions;\n }\n\n /**\n * Returns true if the element is a IfElse block\n * @param element\n * @protected\n */\n protected isIfElseBlock(element: AllBlock): element is IfElseBlock {\n return element.blockType === 'IF_ELSE';\n }\n\n /**\n * Returns true if the element is an action block\n * @param element\n * @protected\n */\n protected isActionBlock(element: AllBlock): element is ActionBlock {\n return 'elementType' in element && element.elementType === 'ACTION';\n }\n\n /**\n * Returns true if the action sets a temporary fact\n * @param element\n * @protected\n */\n protected isActionSetTemporaryFactBlock(element: ActionBlock): element is ActionSetTemporaryFactBlock {\n return 'actionType' in element && element.actionType === 'SET_FACT';\n }\n\n /**\n * Evaluate a condition block\n * @param nestedCondition\n * @param factsValue\n * @param runtimeFactValues\n * @protected\n */\n protected evaluateCondition(nestedCondition: NestedCondition, factsValue: Record<string, Facts | undefined>, runtimeFactValues: Record<string, Facts>): boolean {\n if (isConditionProperties(nestedCondition)) {\n const operator = this.operators[nestedCondition.operator];\n if (operator === undefined) {\n throw new Error(`Unknown operator : ${nestedCondition.operator}, skipping the rule execution...`);\n }\n return executeOperator(this.getOperandValue(nestedCondition.lhs, factsValue, runtimeFactValues),\n this.getOperandValue('rhs' in nestedCondition ? nestedCondition.rhs : undefined, factsValue, runtimeFactValues), operator, factsValue);\n }\n\n if (isNotCondition(nestedCondition)) {\n return !this.evaluateCondition(nestedCondition.not, factsValue, runtimeFactValues);\n }\n if (nestedCondition.all || nestedCondition.any) {\n const evaluate = (condition: NestedCondition) => this.evaluateCondition(condition, factsValue, runtimeFactValues);\n return isAllConditions(nestedCondition) ? nestedCondition.all.every((element) => evaluate(element)) : nestedCondition.any.some((element) => evaluate(element));\n }\n throw new Error(`Unknown condition block met : ${JSON.stringify(nestedCondition)}`);\n }\n\n /**\n * Find rule input facts\n * @param obj\n */\n protected readonly findRuleInputFacts = (obj: AllBlock): string[] => {\n const ruleInputFacts = new Set<string>();\n this.collectRuleInputFacts(obj, ruleInputFacts);\n return Array.from(ruleInputFacts);\n };\n\n /**\n * Plug ruleset to fact streams and trigger a first evaluation\n */\n protected plugRuleset() {\n const inputFactsForRule: Record<string, string[]> = {};\n this.ruleset.rules.forEach((rule) => inputFactsForRule[rule.id] = this.findRuleInputFacts(rule.rootElement));\n const factsThatRerunEverything: string[] = [];\n this.ruleset.rules.forEach((rule) => {\n if (rule.outputRuntimeFacts.length > 0 || rule.inputRuntimeFacts.length > 0) {\n factsThatRerunEverything.push(...inputFactsForRule[rule.id]);\n } else {}\n });\n const triggerFull$: Observable<unknown[]> = factsThatRerunEverything.length === 0\n ? of([])\n : combineLatest(factsThatRerunEverything.map((fact) => this.rulesEngine.retrieveOrCreateFactStream(fact)));\n const result$ = triggerFull$.pipe(switchMap(() => {\n const runtimeFactValues: Record<string, Facts> = {};\n\n let rulesetInputFacts: string[];\n if (this.rulesEngine.debugMode) {\n rulesetInputFacts = Array.from(this.ruleset.rules.reduce((acc, rule) => {\n inputFactsForRule[rule.id].forEach((factName) => acc.add(factName));\n return acc;\n }, new Set<string>()));\n }\n\n return combineLatest(this.ruleset.rules.map((rule) => {\n const inputFacts = inputFactsForRule[rule.id];\n const values$ = inputFacts.map((fact) => this.rulesEngine.retrieveOrCreateFactStream(fact));\n return (values$.length > 0 ? combineLatest(values$) : of([[]] as (Facts | undefined)[]))\n .pipe(\n startWith(undefined),\n pairwise(),\n tap(() => this.performanceMark(rule, 'start')),\n map(([oldFactValues, factValues]) => {\n const output: RuleEvaluationOutput = { actions: undefined };\n\n try {\n output.actions = this.evaluateRule(rule, inputFacts.reduce<Record<string, Facts | undefined>>((acc, id, index) => {\n acc[id] = factValues![index];\n return acc;\n }, {}), runtimeFactValues);\n } catch (error) {\n output.actions = undefined;\n output.error = error;\n }\n\n if (this.rulesEngine.debugMode) {\n output.evaluation = handleRuleEvaluationDebug(rule, this.ruleset.name, output.actions, output.error, runtimeFactValues, factValues, oldFactValues, inputFacts);\n } else if (output.error) {\n const errorToLog = output.error instanceof Error || typeof output.error === 'string' ? output.error.toString() : JSON.stringify(output.error);\n this.rulesEngine.logger?.error(`Error while evaluating rule ID: ${rule.id}; message: ${errorToLog}`);\n this.rulesEngine.logger?.warn(`Skipping rule ${rule.name}, and the associated ruleset`);\n }\n return output;\n }),\n tap(() => this.performanceMark(rule, 'end'))\n );\n })).pipe(\n startWith(undefined),\n pairwise(),\n map(([prevRes, currRes]) => {\n const actionsLists = currRes!.map((r) => r.actions);\n const allExecutionsValid = actionsLists.every((actions) => !!actions);\n\n let execInfo: {\n executionCounter?: number;\n actionsLists: ActionBlock[][];\n rulesetOutputExecution?: RuleEvaluation[];\n allExecutionsValid?: boolean;\n rulesetTriggers?: Record<string, Record<string, EvaluationReason>>;\n } = { actionsLists: (allExecutionsValid ? actionsLists : [[]]) };\n\n if (this.rulesEngine.engineDebug) {\n execInfo = {\n ...execInfo,\n ...this.rulesEngine.engineDebug.handleDebugRulesetExecutionInfo(\n currRes!, prevRes, allExecutionsValid, rulesetInputFacts, runtimeFactValues, ++this.executionCounter, this.ruleset)\n };\n }\n return execInfo;\n }),\n map((output) => {\n const outputActions = ([] as ActionBlock[]).concat(...output.actionsLists);\n\n if (this.rulesEngine.engineDebug && output.allExecutionsValid) {\n this.rulesEngine.engineDebug.addRulesetExecutionEvent(this.ruleset, output.executionCounter!,\n rulesetInputFacts, outputActions, runtimeFactValues, output.rulesetTriggers!,\n output.rulesetOutputExecution!);\n }\n\n return outputActions;\n }),\n distinctUntilChanged((prev, curr) => prev.length === 0 && curr.length === 0)\n );\n }), shareReplay({ bufferSize: 1, refCount: true }));\n\n return {\n id: this.ruleset.id,\n validityRange: this.ruleset.validityRange,\n linkedComponents: this.ruleset.linkedComponents,\n rulesResultsSubject$: result$\n } as EngineRuleset;\n }\n}\n","import type {\n Logger,\n} from '@o3r/logger';\nimport {\n BehaviorSubject,\n firstValueFrom,\n merge,\n Observable,\n of,\n} from 'rxjs';\nimport {\n delay,\n distinctUntilChanged,\n shareReplay,\n switchMap,\n takeUntil,\n tap,\n} from 'rxjs/operators';\nimport {\n EngineDebugger,\n} from './debug/engine-debug';\nimport {\n FactObject,\n RulesEngineOptions,\n} from './engine-interface';\nimport type {\n Fact,\n Facts,\n} from './fact/index';\nimport {\n filterRulesetsEventStream,\n} from './helpers/filter-ruleset-event-operator';\nimport {\n Operator,\n operatorList,\n UnaryOperator,\n} from './operator/index';\nimport {\n RulesetExecutor,\n} from './ruleset-executor';\nimport {\n ActionBlock,\n Ruleset,\n} from './structure';\n\n/** Rules engine */\nexport class RulesEngine {\n /** Map of registered fact stream, this map is mutated by the ruleset executors */\n private readonly factMap: Record<string, FactObject<any>> = {};\n\n /** Subject containing the rulesets and the results stream*/\n private readonly rulesetMapSubject = new BehaviorSubject<Record<string, RulesetExecutor>>({});\n\n /** Map of available operators */\n public operators: Record<string, Operator<unknown, unknown>>;\n\n /** List of events for the current state of the rules engine */\n public readonly events$: Observable<ActionBlock[]>;\n\n /** Delay before fact stream defaulting value */\n public factDefaultDelay?: number;\n\n /**\n * Instance of engine debug object; Undefined if debugMode is not active\n */\n public readonly engineDebug?: EngineDebugger;\n\n /** Name of the rules engine instance */\n public readonly rulesEngineInstanceName: string;\n\n /**\n * Performance reporter to use for performance measurements.\n * @default window.performance on browser only, undefined on node\n */\n public readonly performance;\n\n /**\n * Log the engine errors\n */\n public readonly logger?: Logger;\n /**\n * Flag to check if the run is in debug mode or not\n */\n public get debugMode(): boolean {\n return !!this.engineDebug;\n }\n\n /**\n * Rules engine\n * @param options rules engine options\n */\n constructor(options?: RulesEngineOptions) {\n this.performance = options?.performance || (typeof window === 'undefined' ? undefined : window.performance);\n this.engineDebug = options?.debugger;\n this.engineDebug?.registerRuleEngine(this);\n this.logger = options?.logger;\n this.rulesEngineInstanceName = options?.rulesEngineInstanceName || 'RulesEngine';\n this.factDefaultDelay = options?.factDefaultDelay;\n // Load default operators\n this.operators = operatorList.reduce<Record<string, Operator<any, any>>>((acc, operator) => {\n acc[operator.name] = operator;\n return acc;\n }, {});\n this.events$ = this.rulesetMapSubject.pipe(\n this.prepareActionsStream(),\n this.handleActionsStreamOutput()\n );\n if (options?.facts) {\n this.upsertFacts(options.facts);\n }\n if (options?.rules) {\n this.upsertRulesets(options.rules);\n }\n if (options?.operators) {\n this.upsertOperators(options.operators);\n }\n }\n\n /**\n * Attach debug events to actions stream if debug engine is activated\n */\n private handleActionsStreamOutput<T extends ActionBlock = ActionBlock>(): (actionsStream$: Observable<T[]>) => Observable<T[]> {\n return (actionsStream$: Observable<T[]>) => this.engineDebug ? actionsStream$.pipe(tap((allActions) => this.engineDebug!.allActionsChange(allActions))) : actionsStream$;\n }\n\n /**\n * Create the actions stream event based on provided active rulesets ids; Handle debug too\n * @param ruleSets\n */\n private prepareActionsStream<T extends ActionBlock = ActionBlock>(ruleSets?: string[]): (rulesetMapSubject$: Observable<Record<string, RulesetExecutor>>) => Observable<T[]> {\n return (rulesetMapSubject$: Observable<Record<string, RulesetExecutor>>) => (this.engineDebug\n ? rulesetMapSubject$.pipe(\n tap((ruleSetExecutorMap) => this.engineDebug!.activeRulesetsChange(ruleSetExecutorMap, ruleSets)),\n filterRulesetsEventStream(ruleSets))\n : rulesetMapSubject$.pipe(filterRulesetsEventStream(ruleSets))) as Observable<T[]>;\n }\n\n /**\n * Create or retrieve a fact stream\n * The fact stream created will be registered in the engine\n * @param id ID of the fact to retrieve\n * @param factValue$ Value stream for the fact\n */\n public retrieveOrCreateFactStream<T = Facts>(id: string, factValue$?: Observable<T>): Observable<T | undefined> {\n // trick to emit undefined if the observable is not immediately emitting (to not bloc execution)\n const obs$ = factValue$\n ? merge(factValue$, of(undefined).pipe(delay(this.factDefaultDelay || 0), takeUntil(factValue$)))\n : factValue$;\n const factObj = this.factMap[id];\n if (factObj) {\n if (factValue$) {\n factObj.subject.next(obs$);\n }\n return factObj.value$;\n }\n\n const subject = new BehaviorSubject<Observable<T | undefined> | undefined>(obs$);\n const value$ = subject.pipe(\n switchMap((value) => value || of(undefined)),\n distinctUntilChanged(),\n shareReplay(1)\n );\n\n this.factMap[id] = {\n subject,\n value$\n };\n\n return value$;\n }\n\n /**\n * Retrieve the promise of the latest value of a fact.\n * Return undefined if the fact is not defined.\n * @param id ID of the fact to retrieve\n */\n public retrieveFactValue<T = unknown>(id: string): Promise<T | undefined> | undefined {\n return this.factMap[id].value$ && firstValueFrom(this.retrieveOrCreateFactStream<T>(id), { defaultValue: undefined });\n }\n\n /**\n * Update or insert fact in rules engine\n * @param facts fact list to add / update\n */\n public upsertFacts<T = unknown>(facts: Fact<T> | Fact<T>[]) {\n (Array.isArray(facts) ? facts : [facts]).forEach(({ id, value$ }) => {\n this.engineDebug?.addAvailableFactsSnapshotEvent(id, value$);\n this.retrieveOrCreateFactStream(id, value$);\n });\n }\n\n /**\n * Update or insert rule in rules engine\n * @param rulesets\n */\n public upsertRulesets(rulesets: Ruleset[]) {\n this.engineDebug?.addAvailableRulesets(rulesets);\n\n this.rulesetMapSubject.next(\n rulesets.reduce((accRuleset, ruleset) => {\n accRuleset[ruleset.id] = new RulesetExecutor(ruleset, this);\n return accRuleset;\n }, { ...this.rulesetMapSubject.value })\n );\n }\n\n /**\n * Update or insert operator in rules engine\n * @param operators operator list to add / update\n */\n public upsertOperators(operators: (Operator<any, any> | UnaryOperator<any>)[]) {\n this.operators = operators.reduce((acc, operator) => {\n acc[operator.name] = operator;\n return acc;\n }, { ...this.operators });\n }\n\n /**\n * Operator to apply on a stream of rulesets ids\n * Returns a stream of actions outputted by the rules engine, corresponding to the rulesetsIds\n */\n public getEventStream<T extends ActionBlock = ActionBlock>(): (rulesetsIds$: Observable<string[] | undefined>) => Observable<T[]> {\n return (rulesetsIds$: Observable<string[] | undefined>) =>\n rulesetsIds$.pipe(\n switchMap((ruleSets) => this.rulesetMapSubject.pipe(this.prepareActionsStream<T>(ruleSets))),\n this.handleActionsStreamOutput()\n );\n }\n\n /** Get the list of registered facts names */\n public getRegisteredFactsNames() {\n return Object.keys(this.factMap);\n }\n}\n","import {\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n takeUntilDestroyed,\n} from '@angular/core/rxjs-interop';\nimport {\n select,\n Store,\n} from '@ngrx/store';\nimport type {\n RulesEngineActionHandler,\n} from '@o3r/core';\nimport {\n LoggerService,\n} from '@o3r/logger';\nimport {\n BehaviorSubject,\n combineLatest,\n Observable,\n} from 'rxjs';\nimport {\n filter,\n map,\n shareReplay,\n switchMap,\n} from 'rxjs/operators';\nimport type {\n ActionBlock,\n Fact,\n Operator,\n Ruleset,\n UnaryOperator,\n} from '../../engine/index';\nimport {\n EngineDebugger,\n operatorList,\n RulesEngine,\n} from '../../engine/index';\nimport type {\n RulesetsStore,\n} from '../../stores';\nimport {\n selectActiveRuleSets,\n selectAllRulesets,\n selectComponentsLinkedToRuleset,\n setRulesetsEntities,\n} from '../../stores';\nimport {\n RULES_ENGINE_OPTIONS,\n RulesEngineServiceOptions,\n} from '../rules-engine-token';\n\n@Injectable()\nexport class RulesEngineRunnerService {\n private readonly store = inject<Store<RulesetsStore>>(Store);\n private readonly logger = inject(LoggerService);\n\n /** Rulesets to restrict the execution of the engine */\n protected ruleSets$: Observable<string[] | undefined>;\n\n /** List of action handlers */\n protected readonly actionHandlers = new Set<RulesEngineActionHandler>();\n\n /** Observable of component linked to the component */\n protected linkedComponents$: BehaviorSubject<{ [key: string]: number }> = new BehaviorSubject({});\n\n /** Map of engines dedicated to each rule sets */\n public readonly engine: RulesEngine;\n\n /** stream of the whole ruleset results */\n public events$: Observable<ActionBlock[]>;\n\n /** Enable action execution on new state change */\n public enabled: boolean;\n\n constructor() {\n const engineConfig = inject<RulesEngineServiceOptions>(RULES_ENGINE_OPTIONS, { optional: true });\n\n this.enabled = !engineConfig?.dryRun;\n this.engine = new RulesEngine({\n debugger: engineConfig?.debug ? new EngineDebugger({ eventsStackLimit: engineConfig?.debugEventsStackLimit }) : undefined,\n logger: this.logger\n });\n this.ruleSets$ = combineLatest([\n this.store.pipe(select(selectActiveRuleSets)),\n this.linkedComponents$.pipe(\n switchMap((linkedComponentsNamesMap) => this.store.pipe(\n select(selectComponentsLinkedToRuleset),\n map((rulesetsWithLinkedComponentsMap) =>\n Object.keys(rulesetsWithLinkedComponentsMap.or).filter((rulesetId) =>\n rulesetsWithLinkedComponentsMap.or[rulesetId].some((componentId) => linkedComponentsNamesMap[componentId] > 0)\n )\n )\n ))\n )\n ]).pipe(\n map(([activeRulesets, linkedComponentsRulesetsIds]) => ([...activeRulesets, ...linkedComponentsRulesetsIds]))\n );\n\n this.events$ = this.ruleSets$.pipe(\n this.engine.getEventStream<ActionBlock>(),\n shareReplay(1)\n );\n\n this.upsertOperators(operatorList);\n\n this.store.pipe(\n select(selectAllRulesets),\n takeUntilDestroyed()\n ).subscribe((rulesets: Ruleset[]) => this.engine.upsertRulesets(rulesets));\n this.events$.pipe(takeUntilDestroyed(), filter(() => this.enabled)).subscribe((events) => {\n void this.executeActions(events);\n });\n }\n\n /**\n * Execute the list of actions\n * @param actions\n */\n protected async executeActions(actions: ActionBlock[]) {\n const actionHandlers = [...this.actionHandlers];\n\n const supportedActions = new Set(actionHandlers.flatMap((handler) => handler.supportingActions));\n\n const actionMaps = actions\n .filter((action) => {\n const isKnown = supportedActions.has(action.actionType);\n if (!isKnown) {\n this.logger.warn(`The action ${action.actionType} does not have registered handler`);\n }\n return isKnown;\n })\n .reduce((acc, action) => {\n acc[action.actionType] ||= [];\n acc[action.actionType].push(action);\n return acc;\n }, {} as Record<string, ActionBlock[]>);\n\n const handling = actionHandlers\n .map((handler) =>\n handler.executeActions(\n handler.supportingActions\n .filter((supportedAction) => actionMaps[supportedAction])\n .reduce<ActionBlock[]>((acc, supportedAction) => acc.concat(actionMaps[supportedAction]), [])\n )\n );\n\n // eslint-disable-next-line @typescript-eslint/await-thenable -- `executeActions` can return void or Promise<void>\n await Promise.all(handling);\n }\n\n /**\n * Update or insert fact in the rules engine\n * @param facts fact list to add / update\n */\n public upsertFacts(facts: Fact<unknown> | Fact<unknown>[]) {\n this.engine.upsertFacts(facts);\n }\n\n /**\n * Update or insert operator in the rules engine\n * @param operators operator list to add / update\n */\n public upsertOperators(operators: (Operator<any, any> | UnaryOperator<any>)[]) {\n this.engine.upsertOperators(operators);\n }\n\n /**\n * Upsert a list of RuleSets to be run in the rules engine\n * @param ruleSets\n */\n public upsertRulesets(ruleSets: Ruleset[]) {\n this.store.dispatch(setRulesetsEntities({ entities: ruleSets }));\n }\n\n /**\n * Add action handlers in the rules engine\n * @param actionHandlers\n */\n public registerActionHandlers(...actionHandlers: RulesEngineActionHandler[]) {\n actionHandlers.forEach((actionHandler) => this.actionHandlers.add(actionHandler));\n }\n\n /**\n * Remove action handlers in the rules engine\n * @param actionHandlers\n */\n public unregisterActionHandlers(...actionHandlers: RulesEngineActionHandler[]) {\n actionHandlers.forEach((actionHandler) => this.actionHandlers.delete(actionHandler));\n }\n\n /**\n * Enable temporary a rule set\n * @param componentComputedName Name of the component to enable the ruleset for\n */\n public enableRuleSetFor(componentComputedName: string) {\n const newMap = this.linkedComponents$.value;\n newMap[componentComputedName] = newMap[componentComputedName] ? newMap[componentComputedName] + 1 : 1;\n this.linkedComponents$.next(newMap);\n }\n\n /**\n * Disable temporary a rule set\n * @param componentComputedName Name of the component to disable the ruleset for\n */\n public disableRuleSetFor(componentComputedName: string) {\n const newMap = this.linkedComponents$.value;\n if (newMap[componentComputedName] > 0) {\n newMap[componentComputedName]--;\n this.linkedComponents$.next(newMap);\n }\n }\n}\n","import {\n ModuleWithProviders,\n NgModule,\n} from '@angular/core';\nimport {\n StoreModule,\n} from '@ngrx/store';\nimport {\n LoggerModule,\n} from '@o3r/logger';\nimport {\n RulesetsStoreModule,\n} from '../../stores/index';\nimport {\n DEFAULT_RULES_ENGINE_OPTIONS,\n RULES_ENGINE_OPTIONS,\n RulesEngineServiceOptions,\n} from '../rules-engine-token';\nimport {\n RulesEngineRunnerService,\n} from './rules-engine-runner-service';\n\n@NgModule({\n imports: [\n StoreModule,\n RulesetsStoreModule,\n LoggerModule\n ]\n})\nexport class RulesEngineRunnerModule {\n public static forRoot(options?: Partial<RulesEngineServiceOptions>): ModuleWithProviders<RulesEngineRunnerModule> {\n const opts = options ? { ...DEFAULT_RULES_ENGINE_OPTIONS, ...options } : DEFAULT_RULES_ENGINE_OPTIONS;\n return {\n ngModule: RulesEngineRunnerModule,\n providers: [\n { provide: RULES_ENGINE_OPTIONS, useValue: opts },\n RulesEngineRunnerService\n ]\n };\n }\n}\n","import {\n InjectionToken,\n} from '@angular/core';\nimport {\n RulesEngineDevtoolsServiceOptions,\n} from './rules-engine-devkit-interface';\n\nexport const OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS: Readonly<RulesEngineDevtoolsServiceOptions> = {\n isActivatedOnBootstrap: false\n} as const;\n\nexport const OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS = new InjectionToken<RulesEngineDevtoolsServiceOptions>('Otter RulesEngine Devtools options');\n","import {\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n select,\n Store,\n} from '@ngrx/store';\nimport {\n combineLatest,\n firstValueFrom,\n Observable,\n} from 'rxjs';\nimport {\n map,\n scan,\n shareReplay,\n} from 'rxjs/operators';\nimport type {\n ActiveRulesetsEvent,\n AvailableRulesets,\n BaseRulesetExecution,\n DebugEvent,\n Ruleset,\n RulesetExecutionErrorEvent,\n RulesetExecutionEvent,\n} from '../engine';\nimport {\n RulesEngineRunnerService,\n} from '../services';\nimport {\n RulesetsModel,\n RulesetsStore,\n selectRulesetsEntities,\n} from '../stores';\nimport {\n RulesEngineDevtoolsServiceOptions,\n} from './rules-engine-devkit-interface';\nimport {\n OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS,\n} from './rules-engine-devtools-token';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class OtterRulesEngineDevtools {\n protected store = inject<Store<RulesetsStore>>(Store);\n private readonly rulesEngineService = inject(RulesEngineRunnerService);\n\n /** Stream of rules engine report */\n public readonly rulesEngineReport$?: Observable<{ events: DebugEvent[]; rulesetMap: Record<string, Ruleset> }>;\n\n /** Stream of rules engine event */\n public readonly rulesEngineEvents$?: Observable<DebugEvent[]>;\n\n /**\n * Return true if the rules engine debug option is activated\n */\n public get isRulesEngineDebugActivated(): boolean {\n return !!this.rulesEngineService.engine.debugMode;\n }\n\n constructor() {\n const options = inject<RulesEngineDevtoolsServiceOptions>(OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS, { optional: true });\n\n const eventsStackLimit = (options || OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS).rulesEngineStackLimit;\n this.rulesEngineEvents$ = this.rulesEngineService.engine.engineDebug?.debugEvents$.pipe(\n scan((previousEvents, currentEvent) => {\n const stack = eventsStackLimit && previousEvents.length === eventsStackLimit ? previousEvents.slice(1) : previousEvents;\n return [...stack, currentEvent];\n }, [] as DebugEvent[]),\n shareReplay(1)\n );\n\n this.rulesEngineReport$ = this.rulesEngineEvents$ && combineLatest([this.rulesEngineEvents$, this.store.pipe(select(selectRulesetsEntities))]).pipe(\n map(([events, rulesetEntities]) => {\n const rulesetMap: Record<string, Ruleset> = Object.entries(rulesetEntities)\n .reduce<Record<string, RulesetsModel>>((acc, [id, ruleset]) => {\n if (ruleset) {\n acc[id] = ruleset;\n }\n return acc;\n }, {});\n return { events, rulesetMap };\n }),\n shareReplay(1)\n );\n }\n\n /** Return the list of debug events emitted by rules engine */\n public async getCurrentRulesEngineEventsStack(): Promise<DebugEvent[] | undefined> {\n return this.rulesEngineEvents$ && firstValueFrom(this.rulesEngineEvents$);\n }\n\n /** Returns the list of active rulesets (name and id) at the moment when the function is called */\n public async getActiveRulesets() {\n const lastActiveRulesetsEvent = (this.rulesEngineEvents$ && await firstValueFrom(this.rulesEngineEvents$))?.filter((e) => e.type === 'ActiveRulesets').reverse()[0];\n return (lastActiveRulesetsEvent as ActiveRulesetsEvent)?.rulesets;\n }\n\n /** Returns the list of available rulesets (name and id) at the moment when the function is called */\n public async getAvailableRulesets() {\n const lastAvailableRulesetsEvent = (this.rulesEngineEvents$ && await firstValueFrom(this.rulesEngineEvents$))?.filter((e) => e.type === 'AvailableRulesets').reverse()[0];\n return (lastAvailableRulesetsEvent as AvailableRulesets)?.availableRulesets;\n }\n\n /** Returns the list of output actions emitted by the rules engine at the moment when the function is called */\n public async getAllOutputActions() {\n return (this.rulesEngineEvents$ && await firstValueFrom(this.rulesEngineEvents$))?.filter((e) => e.type === 'AllActions')?.reverse()[0];\n }\n\n /**\n * Get the list of executions for the given ruleset\n * @param rulesetId\n */\n public async getRulesetExecutions(rulesetId: string): Promise<(RulesetExecutionEvent | RulesetExecutionErrorEvent)[] | undefined> {\n return (this.rulesEngineEvents$ && await firstValueFrom(this.rulesEngineEvents$))?.filter(\n (e): e is RulesetExecutionEvent | RulesetExecutionErrorEvent =>\n (e.type === 'RulesetExecution' || e.type === 'RulesetExecutionError')\n && (e as BaseRulesetExecution).rulesetId === rulesetId);\n }\n\n /**\n * Check if the ruleset is activ in the moment when the function is called\n * @param rulesetId\n * @returns True if the ruleset is active; False if the ruleset is inactive or it does not exist\n */\n public async isRulesetActive(rulesetId: string) {\n return !!(await this.getActiveRulesets())?.find((r) => r.id === rulesetId);\n }\n\n /**\n * Get the list of rules executed for the specified ruleset\n * @param rulesetId\n */\n public async getRulesEvaluationsForRuleset(rulesetId: string) {\n const rulesetExec = await this.getRulesetExecutions(rulesetId);\n return rulesetExec?.map((e) => (e as BaseRulesetExecution)?.rulesEvaluations?.filter((re) => !re.cached)).flat();\n }\n\n /**\n * Get the list of input facts (name, current value) for the specified ruleset, at the moment when the function is called\n * @param rulesetId\n */\n public async getInputFactsForRuleset(rulesetId: string) {\n const rulesetExecutions = await this.getRulesetExecutions(rulesetId);\n return rulesetExecutions ? (rulesetExecutions.at(-1) as BaseRulesetExecution).inputFacts : undefined;\n }\n\n /**\n * Get the list of triggers for the specified ruleset\n * @param rulesetId\n */\n public async getTriggersForRuleset(rulesetId: string) {\n return (await this.getRulesEvaluationsForRuleset(rulesetId))?.map((e) => e.triggers).flat().flatMap((triggersMap) => Object.values(triggersMap));\n }\n\n /**\n * Get the list of outputed actions emitted by the given ruleset, at the moment when the function is called\n * @param rulesetId\n */\n public async getOutputActionsForRuleset(rulesetId: string) {\n const rulesetExecutions = await this.getRulesetExecutions(rulesetId);\n return rulesetExecutions ? (rulesetExecutions.at(-1) as RulesetExecutionEvent).outputActions : undefined;\n }\n\n /** Get the list of fact names and corresponding values */\n public getAllFactsSnapshot() {\n const registeredFacts = this.rulesEngineService?.engine.getRegisteredFactsNames();\n if (registeredFacts) {\n return this.rulesEngineService.engine.engineDebug?.getFactsSnapshot(registeredFacts);\n }\n }\n\n /**\n * Retrieve the ruleset information (rules, linkedComponents, validity range etc.) for a ruleset id\n * @param rulesetId\n */\n public getRulesetInformation(rulesetId: string): Promise<Ruleset | undefined> {\n return firstValueFrom(this.store.pipe(\n select(selectRulesetsEntities),\n map((entities) => entities[rulesetId] as Ruleset | undefined)\n ));\n }\n}\n","/* eslint-disable no-console -- purpose of the service is to log in the console */\nimport {\n inject,\n Injectable,\n} from '@angular/core';\nimport type {\n DevtoolsServiceInterface,\n WindowWithDevtools,\n} from '@o3r/core';\nimport {\n RulesEngineDevtoolsServiceOptions,\n} from './rules-engine-devkit-interface';\nimport {\n OtterRulesEngineDevtools,\n} from './rules-engine-devtools';\nimport {\n OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS,\n} from './rules-engine-devtools-token';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RulesEngineDevtoolsConsoleService implements DevtoolsServiceInterface {\n /** Name of the Window property to access to the devtools */\n public static readonly windowModuleName = 'rulesEngine';\n\n private readonly rulesEngineDevtools = inject(OtterRulesEngineDevtools);\n\n private readonly options: RulesEngineDevtoolsServiceOptions;\n\n constructor() {\n const options = inject<RulesEngineDevtoolsServiceOptions>(OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS, { optional: true });\n\n this.options = {\n ...OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n ...options\n };\n\n if (this.options.isActivatedOnBootstrap) {\n this.activate();\n }\n }\n\n /** @inheritDoc */\n public activate() {\n const windowWithDevtools: WindowWithDevtools = window;\n windowWithDevtools._OTTER_DEVTOOLS_ ||= {};\n windowWithDevtools._OTTER_DEVTOOLS_[RulesEngineDevtoolsConsoleService.windowModuleName] = this;\n\n console.info(`Otter rules engine Devtools is now accessible via the _OTTER_DEVTOOLS_.${RulesEngineDevtoolsConsoleService.windowModuleName} variable`);\n }\n\n /** Return the list of debug events emitted by rules engine */\n public async getCurrentRulesEngineEventsStack() {\n console.log(await this.rulesEngineDevtools.getCurrentRulesEngineEventsStack());\n }\n\n /** Returns the list of active rulesets (name and id) at the moment when the function is called */\n public async getActiveRulesets() {\n console.log(await this.rulesEngineDevtools.getActiveRulesets());\n }\n\n /** Returns the list of available rulesets (name and id) at the moment when the function is called */\n public async getAvailableRulesets() {\n console.log(await this.rulesEngineDevtools.getAvailableRulesets());\n }\n\n /** Returns the list of output actions emitted by the rules engine at the moment when the function is called */\n public async getAllOutputActions() {\n console.log(await this.rulesEngineDevtools.getAllOutputActions());\n }\n\n /**\n * Get the list of executions for the given ruleset\n * @param rulesetId\n */\n public async getRulesetExecutions(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.getRulesetExecutions(rulesetId));\n }\n\n /**\n * Check if the ruleset is activ in the moment when the function is called\n * @param rulesetId\n * @returns True if the ruleset is active; False if the ruleset is inactive or it does not exist\n */\n public async isRulesetActive(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.isRulesetActive(rulesetId));\n }\n\n /**\n * Get the list of rules executed for the specified ruleset\n * @param rulesetId\n */\n public async getRulesEvaluationsForRuleset(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.getRulesEvaluationsForRuleset(rulesetId));\n }\n\n /**\n * Get the list of input facts (name, current value) for the specified ruleset, at the moment when the function is called\n * @param rulesetId\n */\n public async getInputFactsForRuleset(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.getInputFactsForRuleset(rulesetId));\n }\n\n /**\n * Get the list of triggers for the specified ruleset\n * @param rulesetId\n */\n public async getTriggersForRuleset(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.getTriggersForRuleset(rulesetId));\n }\n\n /**\n * Get the list of outputed actions emitted by the given ruleset, at the moment when the function is called\n * @param rulesetId\n */\n public async getOutputActionsForRuleset(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.getOutputActionsForRuleset(rulesetId));\n }\n\n /** Get the list of fact names and corresponding values */\n public async getAllFactsSnapshot() {\n console.log(await this.rulesEngineDevtools.getAllFactsSnapshot());\n }\n\n /**\n * Retrieve the ruleset information (rules, linkedComponents, validity range etc.) for a ruleset id\n * @param rulesetId\n */\n public async getRulesetInformation(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.getRulesetInformation(rulesetId));\n }\n}\n","import {\n DestroyRef,\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n takeUntilDestroyed,\n} from '@angular/core/rxjs-interop';\nimport {\n DevtoolsServiceInterface,\n filterMessageContent,\n sendOtterMessage,\n} from '@o3r/core';\nimport {\n LoggerService,\n} from '@o3r/logger';\nimport {\n BehaviorSubject,\n combineLatest,\n fromEvent,\n} from 'rxjs';\nimport type {\n DebugEvent,\n} from '../engine';\nimport {\n AvailableRulesEngineMessageContents,\n isRulesEngineMessage,\n RulesEngineDevtoolsServiceOptions,\n RulesEngineMessageDataTypes,\n} from './rules-engine-devkit-interface';\nimport {\n OtterRulesEngineDevtools,\n} from './rules-engine-devtools';\nimport {\n OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS,\n} from './rules-engine-devtools-token';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RulesEngineDevtoolsMessageService implements DevtoolsServiceInterface {\n private readonly rulesEngineDevtools = inject(OtterRulesEngineDevtools);\n private readonly logger = inject(LoggerService);\n\n private readonly options: RulesEngineDevtoolsServiceOptions;\n private readonly forceEmitRulesEngineReport = new BehaviorSubject<void>(undefined);\n private readonly sendMessage = sendOtterMessage<AvailableRulesEngineMessageContents>;\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n const options = inject<RulesEngineDevtoolsServiceOptions>(OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS, { optional: true });\n\n this.options = {\n ...OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n ...options\n };\n\n if (this.options.isActivatedOnBootstrap) {\n this.activate();\n }\n }\n\n /**\n * Function to trigger a re-send a requested messages to the Otter Chrome DevTools extension\n * @param only restricted list of messages to re-send\n */\n private handleReEmitRequest(only?: RulesEngineMessageDataTypes[]) {\n if (!only || only.includes('rulesEngineEvents')) {\n this.forceEmitRulesEngineReport.next();\n }\n }\n\n /**\n * Function to handle the incoming messages from Otter Chrome DevTools extension\n * @param message\n */\n private handleEvents(message: AvailableRulesEngineMessageContents) {\n this.logger.debug('Message handling by the configuration service', message);\n\n switch (message.dataType) {\n case 'connect': {\n this.connectPlugin();\n break;\n }\n case 'requestMessages': {\n this.handleReEmitRequest(message.only);\n break;\n }\n default: {\n this.logger.warn('Message ignored by the configuration service', message);\n }\n }\n }\n\n private readonly serializeError = (error: any) => error instanceof Error ? error.toString() : error;\n\n /**\n * Serialize exceptions in a way that will display the error message after a JSON.stringify()\n * @param debugEvent\n */\n private serializeReportEvent(debugEvent: DebugEvent) {\n if (debugEvent.type !== 'RulesetExecutionError') {\n return debugEvent;\n }\n return {\n ...debugEvent,\n rulesEvaluations: debugEvent.rulesEvaluations.map((ruleEvaluation) => ({\n ...ruleEvaluation,\n error: this.serializeError(ruleEvaluation.error)\n })),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return -- type is explicitly `any`\n errors: debugEvent.errors.map((error) => this.serializeError(error))\n };\n }\n\n /**\n * Function to start the rules engine reporting to the Otter Chrome DevTools extension\n */\n private startRulesEngineReport() {\n if (this.rulesEngineDevtools.rulesEngineReport$) {\n combineLatest([\n this.forceEmitRulesEngineReport,\n this.rulesEngineDevtools.rulesEngineReport$\n ]).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(\n ([,report]) => {\n const sanitizedReport = { ...report, events: report.events.map((reportEvents) => this.serializeReportEvent(reportEvents)) };\n this.sendMessage('rulesEngineEvents', sanitizedReport);\n }\n );\n }\n }\n\n /**\n * Function to connect the plugin to the Otter DevTools extension\n */\n private connectPlugin() {\n this.logger.info('Otter DevTools is plugged to the application');\n this.forceEmitRulesEngineReport.next();\n }\n\n /** Activate the Otter DevTools */\n public activate() {\n this.startRulesEngineReport();\n\n fromEvent(window, 'message').pipe(\n takeUntilDestroyed(this.destroyRef),\n filterMessageContent(isRulesEngineMessage)\n ).subscribe((e) => this.handleEvents(e));\n }\n}\n","import {\n ModuleWithProviders,\n NgModule,\n} from '@angular/core';\nimport {\n StoreModule,\n} from '@ngrx/store';\nimport {\n RulesetsStoreModule,\n} from '../stores/index';\nimport type {\n RulesEngineDevtoolsServiceOptions,\n} from './rules-engine-devkit-interface';\nimport {\n RulesEngineDevtoolsConsoleService,\n} from './rules-engine-devtools-console-service';\nimport {\n RulesEngineDevtoolsMessageService,\n} from './rules-engine-devtools-message-service';\nimport {\n OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS,\n} from './rules-engine-devtools-token';\n\n@NgModule({\n imports: [\n StoreModule,\n RulesetsStoreModule\n ],\n providers: [\n { provide: OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS, useValue: OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS },\n RulesEngineDevtoolsMessageService,\n RulesEngineDevtoolsConsoleService\n ]\n})\nexport class RulesEngineDevtoolsModule {\n /**\n * Initialize Otter Devtools\n * @param options\n */\n public static instrument(options: Partial<RulesEngineDevtoolsServiceOptions>): ModuleWithProviders<RulesEngineDevtoolsModule> {\n return {\n ngModule: RulesEngineDevtoolsModule,\n providers: [\n { provide: OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS, useValue: { ...OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS, ...options }, multi: false },\n RulesEngineDevtoolsMessageService,\n RulesEngineDevtoolsConsoleService\n ]\n };\n }\n}\n","import {\n FactDefinitions,\n FactSet,\n} from '../engine/index';\nimport {\n RulesEngineRunnerService,\n} from '../services/runner/rules-engine-runner-service';\n\n/** Abstract fact set service */\nexport abstract class FactsService<T extends FactDefinitions> {\n /** Set of facts provided */\n public abstract facts: FactSet<T>;\n\n constructor(private readonly rulesEngine: RulesEngineRunnerService) {}\n\n /** Register the set of facts */\n public register() {\n this.rulesEngine.upsertFacts(\n Object.entries(this.facts)\n .map(([id, factValue]) => ({ id, value$: factValue }))\n );\n }\n}\n","import {\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n BehaviorSubject,\n} from 'rxjs';\nimport {\n FactsService,\n} from '../../fact';\nimport {\n RulesEngineRunnerService,\n} from '../../services';\nimport {\n CurrentTimeFacts,\n} from './current-time-facts';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CurrentTimeFactsService extends FactsService<CurrentTimeFacts> {\n private readonly currentTimeSubject$ = new BehaviorSubject(Date.now());\n /** @inheritDoc */\n public facts = {\n o3rCurrentTime: this.currentTimeSubject$.asObservable()\n };\n\n constructor() {\n const rulesEngine = inject(RulesEngineRunnerService);\n\n super(rulesEngine);\n }\n\n /** Compute the current time */\n public tick() {\n this.currentTimeSubject$.next(Date.now());\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1","actions.resetRulesets","actions.setRulesets","actions.cancelRulesetsRequest","actions.updateRulesets","actions.setRulesetsEntities","actions.upsertRulesetsEntities","actions.clearRulesetsEntities","actions.failRulesetsEntities","actions.setRulesetsEntitiesFromApi","actions.upsertRulesetsEntitiesFromApi","isValidDate"],"mappings":";;;;;;;;;;;;;;;;;;MAMa,iBAAiB,CAAA;AACrB,IAAA,SAAS,CAAI,KAAQ,EAAE,QAAQ,GAAG,WAAW,EAAA;QAClD,OAAO,KAAK,KAAK,SAAS,GAAG,QAAQ,GAAG,KAAK;IAC/C;kIAHW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;gIAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,eAAA,EAAA,CAAA,CAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,IAAI;mBAAC,EAAE,IAAI,EAAE,eAAe,EAAE;;;MCClB,mBAAmB,CAAA;AAC9B;;AAEG;AACI,IAAA,SAAS,CAAC,KAAU,EAAA;AACzB,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,OAAO,KAAK;QACd;QACA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC;kIATW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;gIAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,CAAA,CAAA;;4FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,IAAI;mBAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE;;;ACMjC;;;;;AAKG;MACU,SAAS,GAAG,CAAC,gBAAoE,EAAE,QAAiB,KAA4B;AAC3I,IAAA,IAAI,gBAAgB,CAAC,IAAI,KAAK,uBAAuB,EAAE;AACrD,QAAA,OAAO,OAAO;IAChB;SAAO,IAAI,gBAAgB,CAAC,aAAa,EAAE,MAAM,KAAK,CAAC,EAAE;AACvD,QAAA,OAAO,UAAU;IACnB;SAAO,IAAI,QAAQ,EAAE;AACnB,QAAA,OAAO,QAAQ;IACjB;AACA,IAAA,OAAO,aAAa;AACtB;AAEA;;;;AAIG;MACU,sBAAsB,GAAG,CAAC,MAAoB,EAAE,UAAmC,KAA6B;IAC3H,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;AACnD,IAAA,MAAM,kBAAkB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,EAAE;AAE3G,IAAA,OAAO;SACJ,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO;AAC7B,SAAA,MAAM,CAAyD,CAAC,GAAG,EAAE,OAAO,KAAI;QAC/E,MAAM,iBAAiB,GAAG;AACvB,aAAA,MAAM,CAAC,CAAC,CAAC,MAA+D,CAAC,CAAC,CAAC,IAAI,KAAK,uBAAuB,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAkB,KAAK,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;QAChL,IAAI,iBAAiB,EAAE;AACrB,YAAA,GAAG,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC;QAChC;AACA,QAAA,OAAO,GAAG;IACZ,CAAC,EAAE,EAAE;AACJ,SAAA,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;AACxD,SAAA,GAAG,CAAC,CAAC,gBAAgB,KAAI;QACxB,MAAM,kBAAkB,GAAG,UAAU,CAAC,gBAAgB,CAAC,SAAS,CAAC;AACjE,QAAA,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,gBAAgB,CAAC,SAAS,CAAC;QACpF,OAAO;AACL,YAAA,GAAG,gBAAgB;YACnB,MAAM,EAAE,SAAS,CAAC,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC;YAC/C,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,kBAAkB;AAClB,YAAA,gBAAgB,EAAE,CAAC,gBAAgB,CAAC,gBAAgB,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,KAC5E,CAAC,kBAAkB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;mBACtE,kBAAkB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;SAE/E;AACH,IAAA,CAAC,CAAC;AACN;;MC9Ba,sBAAsB,CAAA;AAbnC,IAAA,WAAA,GAAA;AAcE;;AAEG;AACa,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAwC;AAE9E;;AAEG;AACa,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,EAAE,kDAAC;AAEnC;;AAEG;AACa,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC5C,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;YAC1B,IAAI,MAAM,EAAE;AACV,gBAAA,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC;AACvF,gBAAA,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,KACtC,WAAW,CAAC,IAAI,CAAC,QAAQ;wBACrB,OAAO,KAAK,KAAK;0BACjB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACxC,0BAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CACrC;YACH;iBAAO;AACL,gBAAA,OAAO,KAAK;YACd;AACF,QAAA,CAAC,yDAAC;AACH,IAAA;kIA7BY,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,iNChCnC,w6BA0BA,EAAA,MAAA,EAAA,CAAA,0KAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDCI,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,mBAAmB,0BAFnB,mBAAmB,EAAA,IAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAMV,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAblC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,mBAGb,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EAAA,OAAA,EACP;wBACP,mBAAmB;wBACnB,WAAW;wBACX;qBACD,EAAA,aAAA,EACc,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,w6BAAA,EAAA,MAAA,EAAA,CAAA,0KAAA,CAAA,EAAA;;;AERvC;;AAEG;AACH,MAAM,qBAAqB,GAAG,IAAI;AAElC;;AAEG;AACH,MAAM,kCAAkC,GAAG,EAAE;MAUhC,yBAAyB,CAAA;AARtC,IAAA,WAAA,GAAA;AA2BE;;;;AAIG;QAEI,IAAA,CAAA,IAAI,GAA2B,OAAO;QAEtC,IAAA,CAAA,6BAA6B,GAAG,IAAI;QACpC,IAAA,CAAA,mCAAmC,GAAG,KAAK;QAC3C,IAAA,CAAA,oBAAoB,GAAG,KAAK;QAE5B,IAAA,CAAA,gCAAgC,GAAG,IAAI;QACvC,IAAA,CAAA,sCAAsC,GAAG,KAAK;QAC9C,IAAA,CAAA,uBAAuB,GAAG,KAAK;AAErB,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,OAAO,EAAQ;AACnD,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,CAAC,IAAI,CACrE,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAC/E;AAqBF,IAAA;AAnBS,IAAA,2BAA2B,CAAC,KAAyB,EAAA;AAC3D,QAAA,OAAO,CAAC,EAAE,SAAS,CAAC,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,kCAAkC,CAAC;IAC9F;AAEO,IAAA,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAiB,EAAA;QACnD,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC,YAAY,KAAK,IAAI,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ;AACjG,YAAA,IAAI,CAAC,mCAAmC,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1K;QACA,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,uBAAuB,GAAG,QAAQ,CAAC,YAAY,KAAK,IAAI,IAAI,OAAO,QAAQ,CAAC,YAAY,KAAK,QAAQ;AAC1G,YAAA,IAAI,CAAC,sCAAsC,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,uBAAuB,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACtL;IACF;IAEO,MAAM,eAAe,CAAC,OAAe,EAAA;QAC1C,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC;AAC5C,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;IACjC;kIA1DW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;sHAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,KAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxCtC,gwCAgCA,EAAA,MAAA,EAAA,CAAA,qlDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDMY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAEX,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBARrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,EAAA,eAAA,EAGlB,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAA,QAAA,EAAA,gwCAAA,EAAA,MAAA,EAAA,CAAA,qlDAAA,CAAA,EAAA;;sBAMhC;;sBAMA;;sBAMA;;sBAQA;;;MElCU,wBAAwB,CAAA;AARrC,IAAA,WAAA,GAAA;AASE;;AAEG;QAEI,IAAA,CAAA,OAAO,GAAe,EAAE;AAE/B;;;AAGG;QAEI,IAAA,CAAA,cAAc,GAA0B,EAAE;AAEjD;;AAEG;QAEI,IAAA,CAAA,cAAc,GAAa,EAAE;AASrC,IAAA;AAPC;;;AAGG;AACI,IAAA,aAAa,CAAC,KAAe,EAAA;AAClC,QAAA,OAAO,CAAC,CAAE,KAAqB,CAAC,UAAU;IAC5C;kIA1BW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,qLC9BrC,q2GAyFA,EAAA,MAAA,EAAA,CAAA,6lCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED7DY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAY,yBAAyB,kKAAE,iBAAiB,EAAA,IAAA,EAAA,eAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAEnE,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBARpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,mBAGhB,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B,CAAC,YAAY,EAAE,QAAQ,EAAE,yBAAyB,EAAE,iBAAiB,CAAC,EAAA,QAAA,EAAA,q2GAAA,EAAA,MAAA,EAAA,CAAA,6lCAAA,CAAA,EAAA;;sBAM9E;;sBAOA;;sBAMA;;;MEzBU,0BAA0B,CAAA;AARvC,IAAA,WAAA,GAAA;AAWE;;;AAGG;QACI,IAAA,CAAA,GAAG,GAAG,WAAW;AA0BzB,IAAA;AAlBC;;AAEG;IACH,IACW,SAAS,CAAC,SAAwC,EAAA;AAC3D,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;QAC3B,IAAI,CAAC,GAAG,GAAI,SAA8C,EAAE,GAAG,GAAG,IAAI,CAAC,cAAc,CAAE,SAA8C,CAAC,GAAG,CAAC,GAAG,WAAW;QACxJ,IAAI,CAAC,GAAG,GAAI,SAA6B,EAAE,GAAG,GAAG,IAAI,CAAC,cAAc,CAAE,SAA6B,CAAC,GAAG,CAAC,GAAG,SAAS;IACtH;AAEA,IAAA,IAAW,SAAS,GAAA;QAClB,OAAO,IAAI,CAAC,UAAU;IACxB;AAEQ,IAAA,cAAc,CAAC,OAAuB,EAAA;QAC5C,MAAM,KAAK,GAAG,CAAA,EAAG,OAAO,CAAC,KAAK,IAAI,eAAe,CAAA,CAAE;QACnD,OAAQ,OAAuB,CAAC,IAAI,GAAI,OAAuB,CAAC,IAAK,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,KAAK;IACrG;kIAhCW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;sHAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtBvC,44BA6BA,EAAA,MAAA,EAAA,CAAA,kDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDPa,0BAA0B,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBARtC,SAAS;+BACE,yBAAyB,EAAA,eAAA,EAGlB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B,EAAE,EAAA,QAAA,EAAA,44BAAA,EAAA,MAAA,EAAA,CAAA,kDAAA,CAAA,EAAA;;sBAoBV;;;MEZU,qBAAqB,CAAA;AARlC,IAAA,WAAA,GAAA;AAeE;;;;AAIG;QAEI,IAAA,CAAA,SAAS,GAAG,EAAE;AAQrB;;AAEG;QAEI,IAAA,CAAA,eAAe,GAAe,EAAE;AAEvC;;AAEG;QAEI,IAAA,CAAA,eAAe,GAAe,EAAE;AAEvC;;AAEG;QACI,IAAA,CAAA,sBAAsB,GAAG,KAAK;AAErC;;AAEG;QACI,IAAA,CAAA,sBAAsB,GAAG,KAAK;AACtC,IAAA;kIA1CY,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;sHAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5BlC,4yIAmHA,EAAA,MAAA,EAAA,CAAA,u2DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDvFa,qBAAqB,gJAFtB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,wBAAwB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,0BAA0B,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAEjE,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBARjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,eAAA,EAGb,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B,CAAC,YAAY,EAAE,wBAAwB,EAAE,0BAA0B,CAAC,EAAA,QAAA,EAAA,4yIAAA,EAAA,MAAA,EAAA,CAAA,u2DAAA,CAAA,EAAA;;sBAM5E;;sBAQA;;sBAMA;;sBAMA;;sBAMA;;;MEHU,2BAA2B,CAAA;AAfxC,IAAA,WAAA,GAAA;AAgBmB,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAE/C;;;;;;;;AAQG;QACI,IAAA,CAAA,eAAe,GAAuD,EAAE;QAGxE,IAAA,CAAA,iBAAiB,GAA4B,EAAE;QAG/C,IAAA,CAAA,uBAAuB,GAAG,OAAO;AAezC,IAAA;AAbC;;;;AAIG;IACI,eAAe,CAAC,MAAc,EAAE,QAAgB,EAAA;AACrD,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE;AAChC,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC;QAClF;aAAO;AACL,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,GAAG,IAAI,EAAE;QACrD;AACA,QAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;IACzB;kIAhCW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvDxC,2qRA4JA,EAAA,MAAA,EAAA,CAAA,m8FAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED7GI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAGZ,wBAAwB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,yBAAyB,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,qBAAqB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,IAAA,EAAA,UAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAJrB,iBAAiB,iDACjB,mBAAmB,EAAA,IAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAMV,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAfvC,SAAS;+BACE,0BAA0B,EAAA,eAAA,EAGnB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;wBACP,YAAY;wBACZ,iBAAiB;wBACjB,mBAAmB;wBACnB,wBAAwB;wBACxB,yBAAyB;wBACzB;AACD,qBAAA,EAAA,QAAA,EAAA,2qRAAA,EAAA,MAAA,EAAA,CAAA,m8FAAA,CAAA,EAAA;;sBAgBA;;sBAGA;;;AE3DH;;AAEG;MASU,wBAAwB,CAAA;kIAAxB,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAxB,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,YANjC,QAAQ;YACR,2BAA2B;AAC3B,YAAA,0BAA0B,aAElB,2BAA2B,CAAA,EAAA,CAAA,CAAA;AAE1B,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,YALjC,2BAA2B,CAAA,EAAA,CAAA,CAAA;;4FAKlB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBARpC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,QAAQ;wBACR,2BAA2B;wBAC3B;AACD,qBAAA;oBACD,OAAO,EAAE,CAAC,2BAA2B;AACtC,iBAAA;;;ACYM,MAAM,oBAAoB,GAAG,CAAC,OAAY,KAAoD;AACnG,IAAA,OAAO,OAAO,KACZ,OAAO,CAAC,QAAQ,KAAK;WAClB,OAAO,CAAC,QAAQ,KAAK;AACrB,WAAA,OAAO,CAAC,QAAQ,KAAK,SAAS,CAClC;AACH;;ACrCA;MACa,oBAAoB,GAAG,IAAI,cAAc,CAAU,sBAAsB;AAYtF;AACO,MAAM,4BAA4B,GAAwC;AAC/E,IAAA,MAAM,EAAE,KAAK;AACb,IAAA,KAAK,EAAE;;;ACFT;AACA,MAAM,UAAU,GAAG,gBAAgB;AACnC,MAAM,aAAa,GAAG,mBAAmB;AACzC,MAAM,YAAY,GAAG,kBAAkB;AACvC,MAAM,qBAAqB,GAAG,2BAA2B;AAEzD;AACA,MAAM,qBAAqB,GAAG,2BAA2B;AACzD,MAAM,sBAAsB,GAAG,4BAA4B;AAC3D,MAAM,mBAAmB,GAAG,yBAAyB;AACrD,MAAM,oBAAoB,GAAG,0BAA0B;AAEvD;AACA,MAAM,4BAA4B,GAAG,kCAAkC;AACvE,MAAM,+BAA+B,GAAG,qCAAqC;AAE7E;AACO,MAAM,WAAW,GAAG,YAAY,CAAC,UAAU,EAAE,KAAK,EAA0C;AAEnG;AACO,MAAM,cAAc,GAAG,YAAY,CAAC,aAAa,EAAE,KAAK,EAA6C;AAE5G;MACa,aAAa,GAAG,YAAY,CAAC,YAAY;AAEtD;AACO,MAAM,qBAAqB,GAAG,YAAY,CAAC,qBAAqB,EAAE,KAAK,EAAgB;AAE9F;AACO,MAAM,mBAAmB,GAAG,YAAY,CAAC,mBAAmB,EAAE,KAAK,EAAyD;AAEnI;AACO,MAAM,sBAAsB,GAAG,YAAY,CAAC,sBAAsB,EAAE,KAAK,EAAyD;AAEzI;MACa,qBAAqB,GAAG,YAAY,CAAC,qBAAqB;AAEvE;AACO,MAAM,oBAAoB,GAAG,YAAY,CAAC,oBAAoB,EAAE,KAAK,EAAgD;AAE5H;;;AAGG;AACI,MAAM,0BAA0B,GAAG,YAAY,CAAC,4BAA4B,EAAE,UAAU,EAAyC;AAExI;;;AAGG;AACI,MAAM,6BAA6B,GAAG,YAAY,CAAC,+BAA+B,EAAE,UAAU,EAAyC;;ACtC9I;;AAEG;MAEU,cAAc,CAAA;AAD3B,IAAA,WAAA,GAAA;AAEY,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;AAEpC;;AAEG;AACI,QAAA,IAAA,CAAA,mBAAmB,GAAG,YAAY,CAAC,MACxC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAChB,MAAM,CAAC,0BAA0B,CAAC,EAClC,sBAAsB,CACpB,CAAC,KAAK,EAAE,MAAM,KAAK,mBAAmB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,EACxF,CAAC,KAAK,EAAE,MAAM,KAAK,EAAE,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,EACnF,qBAAqB,CACtB,CACF,CACF;AAED;;AAEG;AACI,QAAA,IAAA,CAAA,sBAAsB,GAAG,YAAY,CAAC,MAC3C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAChB,MAAM,CAAC,6BAA6B,CAAC,EACrC,QAAQ,CAAC,CAAC,OAAO,KACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CACrB,GAAG,CAAC,CAAC,KAAK,KAAK,sBAAsB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,EACzF,UAAU,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAC5F,CACF,CACF,CACF;AACF,IAAA;kIA/BY,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;sIAAd,cAAc,EAAA,CAAA,CAAA;;4FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B;;;ACfD;;AAEG;AACI,MAAM,eAAe,GAAG,mBAAmB,CAAgB;IAChE,QAAQ,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC;AAC5B,CAAA;AAED;;AAEG;AACI,MAAM,oBAAoB,GAAG,eAAe,CAAC,eAAe,CAAgB;AACjF,IAAA,UAAU,EAAE;AACb,CAAA;AAED;;AAEG;AACI,MAAM,uBAAuB,GAAmD;IACrF,EAAE,CAACC,aAAqB,EAAE,MAAM,oBAAoB,CAAC;AAErD,IAAA,EAAE,CAACC,WAAmB,EAAE,CAAC,KAAK,EAAE,OAAO,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAEpH,EAAE,CAACC,qBAA6B,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,qBAAqB,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAEnH,EAAE,CAACC,cAAsB,EAAE,CAAC,KAAK,EAAE,OAAO,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;AAEvF,IAAA,EAAE,CAACC,mBAA2B,EAAE,CAAC,KAAK,EAAE,OAAO,KAC7C,eAAe,CAAC,OAAO,CACrB,OAAO,CAAC,QAAQ,EAChB,eAAe,CAAC,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAC7F;AAED,IAAA,EAAE,CAACC,sBAA8B,EAAE,CAAC,KAAK,EAAE,OAAO,KAChD,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,qBAAqB,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAC7G;AAED,IAAA,EAAE,CAACC,qBAA6B,EAAE,CAAC,KAAK,KAAK,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAE9E,EAAE,CAACC,oBAA4B,EAAE,CAAC,KAAK,EAAE,OAAO,KAC9C,qBAAqB,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAC5D;IAED,EAAE,CAACC,0BAAkC,EAAEC,6BAAqC,EAAE,CAAC,KAAK,EAAE,OAAO,KAC3F,qBAAqB,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC;;AAG9D;;AAEG;AACI,MAAM,eAAe,GAAG,aAAa,CAC1C,oBAAoB,EACpB,GAAG,uBAAuB;;ACzC5B;;AAEG;AACI,MAAM,mBAAmB,GAAG;;ACPnC;MACa,sBAAsB,GAAG,IAAI,cAAc,CAAuC,0BAA0B;AAEzH;SACgB,yBAAyB,GAAA;AACvC,IAAA,OAAO,eAAe;AACxB;MAUa,mBAAmB,CAAA;IACvB,OAAO,OAAO,CAA0B,cAA8C,EAAA;QAC3F,OAAO;AACL,YAAA,QAAQ,EAAE,mBAAmB;AAC7B,YAAA,SAAS,EAAE;AACT,gBAAA,EAAE,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,cAAc;AAC9D;SACF;IACH;kIARW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;mIAAnB,mBAAmB,EAAA,OAAA,EAAA,CAAAV,IAAA,CAAA,kBAAA,EAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,CAAA;AAAnB,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,SAAA,EAJnB;AACT,YAAA,EAAE,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,yBAAyB;AACzE,SAAA,EAAA,OAAA,EAAA,CAJC,WAAW,CAAC,UAAU,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,CAAC,CAAA,EAAA,CAAA,CAAA;;4FAMtG,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAR/B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;AACP,wBAAA,WAAW,CAAC,UAAU,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC;AAC/G,qBAAA;AACD,oBAAA,SAAS,EAAE;AACT,wBAAA,EAAE,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,yBAAyB;AACzE;AACF,iBAAA;;;ACrBD,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,eAAe,CAAC,YAAY,EAAE;AAE5F;MACa,mBAAmB,GAAG,qBAAqB,CAAgB,mBAAmB;AAE3F;AACO,MAAM,iBAAiB,GAAG,cAAc,CAAC,mBAAmB,EAAE,SAAS;AAE9E;AACO,MAAM,iBAAiB,GAAG,cAAc,CAAC,mBAAmB,EAAE,SAAS;AAE9E;AACO,MAAM,sBAAsB,GAAG,cAAc,CAAC,mBAAmB,EAAE,cAAc;AAExF;AACO,MAAM,mBAAmB,GAAG,cAAc,CAAC,mBAAmB,EAAE,WAAW;AAElF;AACO,MAAM,gCAAgC,GAAG,cAAc,CAAC,mBAAmB,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,SAAS,IAAI,KAAK;AAEvH;;;AAGG;AACH,MAAMW,aAAW,GAAG,CAAC,CAAM,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI;AAErE;;AAEG;MACU,qBAAqB,GAAG,cAAc,CACjD,iBAAiB,EACjB,CAAC,QAAQ,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAgB,KAAI;AACjD,IAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa;AACtC,IAAA,IAAI,CAAC,QAAQ,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;AACjD,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACrD,IAAA,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;IAE/C,IAAI,CAAC,EAAE,IAAI,CAACA,aAAW,CAAC,EAAE,CAAC,MAAM,IAAI,IAAI,CAACA,aAAW,CAAC,IAAI,CAAC,CAAC,EAAE;AAC5D,QAAA,OAAO,KAAK;IACd;AACA,IAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE;AACvB,IAAA,IAAI,EAAE,IAAI,IAAI,EAAE;AACd,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,IAAI;IACvD;IAEA,IAAI,IAAI,EAAE;AACR,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI;IAC/B;IACA,OAAO,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,IAAI;AACnC,CAAC,CAAC;AAGJ;;AAEG;AACI,MAAM,oBAAoB,GAAG,cAAc,CAChD,qBAAqB,EACrB,CAAC,QAAQ,KAAK;AACX,KAAA,MAAM,CAAC,CAAC,OAAgB,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,EAAE,MAAM,CAAC;KACpE,GAAG,CAAC,CAAC,OAAgB,KAAK,OAAO,CAAC,EAAE,CAAC;AAE1C;;;;;;AAMG;AACH,SAAS,sBAAsB,CAAC,QAAgB,EAAE,OAAe,EAAE,SAAiB,EAAE,GAAA,GAAgC,EAAE,EAAA;IACtH,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC;AAC3D,IAAA,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE;IACrB,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;AACjC;AAEA;;AAEG;AACI,MAAM,+BAA+B,GAAG,cAAc,CAC3D,qBAAqB,EACrB,CAAC,QAAQ,KACP;AACG,KAAA,MAAM,CAAC,CAAC,GAAwC,EAAE,OAAgB,KAAI;AACrE,IAAA,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,IAAI,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;AAC7E,QAAA,OAAO,GAAG;IACZ;IACA,IAAI,OAAO,CAAC,gBAAgB,EAAE,EAAE,EAAE,MAAM,EAAE;QACxC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AAC/C,YAAA,sBAAsB,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;AAC7E,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,GAAG;IACZ;AACA,IAAA,OAAO,GAAG;AACZ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;;ACpGb,MAAM,yBAAyB,GAAG,CAAC,KAAoB,KAAI;AAChE,IAAA,OAAO,qBAAqB,CAAC,mBAAmB,CAAC,KAAK,CAAC;AACzD;AAEO,MAAM,2BAA2B,GAAG,CAAC,SAAc,KAAI;IAC5D,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;AAChC,QAAA,OAAO,oBAAoB;IAC7B;IACA,MAAM,WAAW,GAAG,eAAe,CAAC,eAAe,CAAgB,SAAS,CAAC;AAC7E,IAAA,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,GAAG,EAAE;AAC9B,QAAA,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAkB;IACpE;AACA,IAAA,OAAO,WAAW;AACpB;AAEO,MAAM,mBAAmB,GAA8B;AAC5D,IAAA,SAAS,EAAE,yBAAyB;AACpC,IAAA,WAAW,EAAE;;;ACjBf;;;;;AAKG;AACG,SAAU,uBAAuB,CAAC,OAA+B,EAAE,OAA2C,EAAA;IAClH,IAAI,eAAe,GAAqD,EAAE;AAE1E,IAAA,MAAM,0BAA0B,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAA0B,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;IAClI,MAAM,sBAAsB,GAAqD,EAAE;AAEnF,IAAA,0BAA0B,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;QAC3C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;YACpC,sBAAsB,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;AAChD,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,CAAC;IAEF,IAAI,OAAO,EAAE;AACX,QAAA,MAAM,0BAA0B,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAA0B,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;QAClI,MAAM,sBAAsB,GAAqD,EAAE;AAEnF,QAAA,0BAA0B,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;YAC3C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;gBACpC,sBAAsB,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;AAChD,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,KAAI;YACxE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AAC7C,gBAAA,IAAI,CAAC,sBAAsB,CAAC,MAAM;AAC7B,uBAAA,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,QAAQ;AACxC,uBAAA,YAAY,CAAC,QAAQ,CAAC,CAAC,QAAQ,KAAK,sBAAsB,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;AAC1F,oBAAA,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC;gBACrE;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;SAAO;QACL,eAAe,GAAG,sBAAsB;IAC1C;AACA,IAAA,OAAO,eAAe;AACxB;AAEA;;;;;AAKG;AACG,SAAU,eAAe,CAAC,gBAAkC,EAAE,QAA0D,EAAA;IAC5H,MAAM,4BAA4B,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;AAE1D,IAAA,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;YAC1D,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;QAC/B;AACA,QAAA,OAAO,EAAE,GAAG,CAAC,EAAE;AACjB,IAAA,CAAC,CAAC;AACJ;AAEA;;;;;;;;;;AAUG;SACa,yBAAyB,CACvC,IAAU,EACV,WAAmB,EACnB,aAAwC,EACxC,WAAgB,EAChB,iBAAwC,EACxC,UAA6B,EAC7B,aAAgC,EAChC,aAAmC,EAAE,EAAA;IAErC,MAAM,WAAW,GAAG,CAAA,EAAG,WAAW,MAAM,IAAI,CAAC,IAAI,CAAA,CAAE;IAEnD,MAAM,OAAO,GAAqD,EAAE;AACpE,IAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAW,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACvD,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,UAAW,CAAC,KAAK,CAAC,EAAE;QAC9G;AAAO,aAAA,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,UAAW,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE;AAC9E,YAAA,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,UAAW,CAAC,KAAK,CAAC,EAAE;QAC9I;IACF;AAEA,IAAA,MAAM,cAAc,GAAmB;AACrC,QAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,aAAa;AACb,QAAA,EAAE,EAAE,WAAW;AACf,QAAA,QAAQ,EAAE,OAAO;AACjB,QAAA,cAAc,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAwB,CAAC,GAAG,EAAE,eAAe,KAAI;YAC5H,IAAI,OAAO,iBAAiB,CAAC,eAAe,CAAC,KAAK,WAAW,EAAE;gBAC7D,GAAG,CAAC,eAAe,CAAC,GAAG,iBAAiB,CAAC,eAAe,CAAC;YAC3D;AACA,YAAA,OAAO,GAAG;QACZ,CAAC,EAAE,EAAE,CACJ;AACD,QAAA,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AACtC,QAAA,IAAI,WAAW,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE;KAC9C;AACD,IAAA,OAAO,cAAc;AACvB;;ACvEA;;AAEG;MACU,cAAc,CAAA;;AAgBzB,IAAA,IAAW,WAAW,GAAA;QACpB,OAAO,IAAI,CAAC,oBAAoB;IAClC;AAEA;;;AAGG;AACH,IAAA,WAAA,CAAY,OAA+B,EAAA;QArBnC,IAAA,CAAA,kBAAkB,GAAmC,EAAE;AAO9C,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,OAAO,EAAQ;QAezD,IAAI,CAAC,mBAAmB,GAAG,IAAI,aAAa,CAA2C,OAAO,EAAE,gBAAgB,CAAC;QACjH,IAAI,CAAC,6BAA6B,EAAE;QACpC,IAAI,CAAC,YAAY,GAAG,IAAI,UAAU,CAAa,CAAC,UAAU,KAAI;AAC5D,YAAA,MAAM,yBAAyB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAC9D,YAAY,CAAC,IAAI,CAAC,EAClB,SAAS,CAAC,YAAW;AACnB,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;AAC5B,gBAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,oBAAqB,CAAC,uBAAuB,EAAE,CAAC;gBAC/F,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO;oBACnC,SAAS;AACT,oBAAA,IAAI,EAAE,wBAAwB;oBAC9B;AACD,iBAAA,CAAC,CAAC;AACL,YAAA,CAAC,CAAC,CACH,CAAC,SAAS,EAAE;YACb,MAAM,uBAAuB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAC3D,cAAc,CAAC,IAAI,CAAC,oBAAoB,CAAC,EACzC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC,KAAI;AACnD,gBAAA,MAAM,UAAU,GAAe,MAAM,SAAS,EAAE;AAChD,gBAAA,IAAI,UAAU,CAAC,IAAI,KAAK,kBAAkB,IAAI,UAAU,CAAC,IAAI,KAAK,uBAAuB,EAAE;oBACzF,IAAI,eAAe,GAAG,CAAC;oBACvB,UAAU,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;wBAC3C,MAAM,IAAI,GAAG,CAAA,aAAA,EACX,IAAI,CAAC,oBAAoB,EAAE,uBAAuB,IAAI,EACxD,IAAI,UAAU,CAAC,WAAW,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA,CAAE;AAC9C,wBAAA,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;AACnE,wBAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,CAAC;AAC/C,wBAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;wBACxB,eAAe,IAAI,QAAQ;AAC7B,oBAAA,CAAC,CAAC;AACF,oBAAA,UAAU,CAAC,QAAQ,GAAG,eAAe;gBACvC;AACA,gBAAA,OAAO,UAAU;AACnB,YAAA,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,UAAU,KAAI;AACjB,gBAAA,IAAI,UAAU,CAAC,IAAI,KAAK,kBAAkB,EAAE;oBAC1C,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAG,CAAA,EAAG,UAAU,CAAC,WAAW,CAAA,oCAAA,EAAuC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA,CAAE,CAAC;gBAC/I;AACF,YAAA,CAAC,CAAC,CACH,CAAC,SAAS,CAAC,UAAU,CAAC;AAEvB,YAAA,OAAO,MAAK;gBACV,yBAAyB,CAAC,WAAW,EAAE;gBACvC,uBAAuB,CAAC,WAAW,EAAE;AACvC,YAAA,CAAC;AACH,QAAA,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAClB;IAEQ,6BAA6B,GAAA;QACnC,IAAI,CAAC,oBAAoB,GAAG,IAAI,UAAU,CAAuB,CAAC,UAAU,KAAI;YAC9E,MAAM,mBAAmB,GAAG,IAAI,mBAAmB,CAAC,CAAC,IAAI,KAAI;gBAC3D,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAA0B,CAAC;AAC5D,YAAA,CAAC,CAAC;YACF,mBAAmB,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;AACxD,YAAA,OAAO,MAAM,mBAAmB,CAAC,UAAU,EAAE;AAC/C,QAAA,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACxC;AAEQ,IAAA,MAAM,+BAA+B,CAAC,OAAgB,EAAE,gBAAwB,EACtF,iBAA2B,EAAE,iBAAwC,EACrE,eAAiE,EAAE,eAAiC,EAAA;QACpG,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC;AAEjE,QAAA,MAAM,0BAA0B,GAAyB;YACvD,gBAAgB;AAChB,YAAA,WAAW,EAAE,CAAA,EAAG,OAAO,CAAC,EAAE,CAAA,CAAA,EAAI,gBAAgB,CAAA,CAAE;YAChD,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,UAAU;AACV,YAAA,QAAQ,EAAE,eAAe;YACzB,gBAAgB,EAAE,eAAe,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,eAAe,CAAC;AACpH,YAAA,cAAc,EAAE;SACjB;AACD,QAAA,OAAO,0BAA0B;IACnC;AAEQ,IAAA,MAAM,gBAAgB,CAC5B,SAAiB,EACjB,OAAgB,EAChB,gBAAwB,EACxB,iBAA2B,EAC3B,gBAA+B,EAC/B,iBAAwC,EACxC,eAAiE,EACjE,eAAiC,EAAA;AACjC,QAAA,MAAM,0BAA0B,GAAG,MAAM,IAAI,CAAC,+BAA+B,CAAC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,CAAC;AAEhL,QAAA,MAAM,sBAAsB,GAA0B;YACpD,SAAS;AACT,YAAA,IAAI,EAAE,kBAAkB;AACxB,YAAA,aAAa,EAAE,gBAAgB;AAC/B,YAAA,GAAG;SACJ;AAED,QAAA,OAAO,sBAAsB;IAC/B;AAEQ,IAAA,MAAM,qBAAqB,CACjC,SAAiB,EACjB,OAAgB,EAChB,iBAA2B,EAC3B,gBAAwB,EACxB,iBAAwC,EACxC,eAAiE,EACjE,eAAiC,EAAA;AAEjC,QAAA,MAAM,0BAA0B,GAAG,MAAM,IAAI,CAAC,+BAA+B,CAAC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,CAAC;QAEhL,MAAM,mBAAmB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;AAC9E,QAAA,MAAM,0BAA0B,GAA+B;YAC7D,SAAS;AACT,YAAA,IAAI,EAAE,uBAAuB;AAC7B,YAAA,oBAAoB,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;AAClE,YAAA,MAAM,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AAC/C,YAAA,GAAG;SACJ;AACD,QAAA,OAAO,0BAA0B;IACnC;AAEA;;;AAGG;AACI,IAAA,kBAAkB,CAAC,WAAwB,EAAA;AAChD,QAAA,IAAI,CAAC,oBAAoB,GAAG,WAAW;IACzC;AAEA;;;;;;;;;AASG;AACI,IAAA,+BAA+B,CACpC,OAA+B,EAC/B,OAA2C,EAC3C,kBAA2B,EAC3B,iBAA2B,EAC3B,iBAAwC,EACxC,gBAAwB,EACxB,OAAgB,EAAA;QAChB,MAAM,eAAe,GAAG,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC;AACjE,QAAA,MAAM,sBAAsB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAW,CAAC;QAEhE,IAAI,CAAC,kBAAkB,EAAE;AACvB,YAAA,IAAI,CAAC,6BAA6B,CAAC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,sBAAsB,CAAC;QAC9I;QAEA,OAAO;YACL,gBAAgB;YAChB,sBAAsB;YACtB,kBAAkB;YAClB;SACD;IACH;AAEA;;;AAGG;AACI,IAAA,oBAAoB,CAAC,QAAmB,EAAA;AAC7C,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;AAC5B,QAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5G,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO;YACnC,SAAS;AACT,YAAA,IAAI,EAAE,mBAAmB;YACzB,iBAAiB,EAAE,IAAI,CAAC;AACzB,SAAA,CAAC,CAAC;IACL;AAEA;;;;AAIG;IACI,oBAAoB,CAAC,kBAAmD,EAAE,mBAA8B,EAAA;AAC7G,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;QAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,KAAK,kBAAkB,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC;QAChH,MAAM,cAAc,GAAG;cACnB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;AACtF,cAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;QAE3B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO;YACnC,SAAS;AACT,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;AAC/H,SAAA,CAAC,CAAC;IACL;AAEA;;;AAGG;AACI,IAAA,gBAAgB,CAAC,OAAsB,EAAA;AAC5C,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;QAC5B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;IACnF;AAEA;;;;;;;;;AASG;AACI,IAAA,wBAAwB,CAAC,OAAgB,EAAE,gBAAwB,EACxE,iBAA2B,EAAE,gBAA+B,EAAE,iBAAwC,EACtG,eAAiE,EAAE,eAAiC,EAAA;AACpG,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;AAC5B,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAC5F,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;IAC9F;AAEA;;;;;;;;AAQG;IACI,6BAA6B,CAClC,OAAgB,EAChB,iBAA2B,EAC3B,gBAAwB,EACxB,iBAAwC,EACxC,eAAiE,EACjE,eAAiC,EAAA;AAEjC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;QAC5B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;IAC/K;AAEA;;;;AAIG;IACI,8BAA8B,CACnC,GAAW,EACX,UAA2B,EAAA;AAE3B,QAAA,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC;IAC9D;AAEA;;;AAGG;IACI,MAAM,gBAAgB,CAAC,UAAoB,EAAA;QAChD,MAAM,KAAK,GAAuC,EAAE;AACpD,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;AAC9B,YAAA,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC;QAC5D;AACA,QAAA,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE;AACjC,YAAA,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9F;AACA,QAAA,OAAO,KAAK;IACd;AACD;;AC3UD;;;AAGG;AACG,SAAU,yBAAyB,CAAC,mBAA8B,EAAA;AACtE,IAAA,OAAO,CAAC,OAAoD,KAAK,OAAO,CAAC,IAAI,CAC3E,SAAS,CAAC,CAAC,kBAAkB,KAAI;QAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,KAAK,kBAAkB,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC;QAChH,MAAM,cAAc,GAAG;cACnB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;AACtF,cAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;AAE3B,QAAA,OAAO,cAAc,EAAE,MAAM,GAAG;AAC9B,cAAE,aAAa,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CACjF,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,YAAY,KAAI;AAC9C,gBAAA,GAAG,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC;AACzB,gBAAA,OAAO,GAAG;AACZ,YAAA,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,cAAE,EAAE,CAAC,EAAE,CAAC;AACZ,IAAA,CAAC,CAAC,EACF,WAAW,CAAC,CAAC,CAAC,CACf;AACH;;AC3BA;;;;;;AAMG;AACG,SAAU,eAAe,CAA2B,GAAM,EAAE,GAAM,EAAE,QAAwB,EAAE,aAAiD,EAAA;AACnJ,IAAA,MAAM,QAAQ,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AACrE,IAAA,MAAM,QAAQ,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AACrE,IAAA,IAAI,kBAAqD;AACzD,IAAA,IAAI,aAAa,IAAI,QAAQ,CAAC,wBAAwB,EAAE;AACtD,QAAA,kBAAkB,GAAG,QAAQ,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,KAAI;AACzE,YAAA,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE;gBACtB,GAAG,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAE;YAChC;iBAAO;gBACL,MAAM,IAAI,KAAK,CAAC,CAAA,UAAA,EAAa,GAAG,CAAA,eAAA,EAAkB,QAAQ,CAAC,IAAI,CAAA,iBAAA,CAAmB,CAAC;YACrF;AACA,YAAA,OAAO,GAAG;QACZ,CAAC,EAAE,EAA2B,CAAC;IACjC;IACA,IAAI,CAAC,QAAQ,EAAE;AACb,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,sBAAA,EAAyB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC;IACjE;IACA,IAAI,CAAC,QAAQ,EAAE;AACb,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,uBAAA,EAA0B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC;IAClE;AACA,IAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,CAAC;AAC5D,IAAA,OAAO,GAAG;AACZ;AAEA;;;AAGG;AACG,SAAU,eAAe,CAAC,OAAgB,EAAA;;IAE9C,OAAO,OAAO,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA,EAAG,OAAO,CAAA,CAAE,CAAC;AAClF;AAEA;;;AAGG;AACG,SAAU,aAAa,CAAC,aAAsB,EAAA;AAClD,IAAA,OAAO,KAAK,CAAC,OAAO,CAAC,aAAa;WAC7B,aAAa,CAAC,MAAM,KAAK;AACzB,WAAA,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC;AAChC,WAAA,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC;WAChC,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;AAC3C;AAEA;;;AAGG;AACI,MAAM,WAAW,GAAG,CAAC,aAAkB,KAA2B;IACvE,IAAI,CAAC,aAAa,IAAI,OAAO,aAAa,CAAC,OAAO,KAAK,UAAU,EAAE;AACjE,QAAA,OAAO,KAAK;IACd;AACA,IAAA,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,EAAE;AAC7C,IAAA,OAAO,OAAO,aAAa,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;AAC1E;AAEA;;;AAGG;AACI,MAAM,gBAAgB,GAAG,CAAC,aAAkB,KAAgC;AACjF,IAAA,OAAO,aAAa,KAAK,CAAC,KAAK,CAAC,CAAC,aAAa,IAAI,WAAW,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AACzF;AAEA;;;AAGG;AACI,MAAM,gBAAgB,GAAG,CAAC,aAAkB,KAA6C;AAC9F,IAAA,OAAO,KAAK,CAAC,OAAO,CAAC,aAAa;WAC7B,aAAa,CAAC,MAAM,KAAK;AACzB,WAAA,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC;AACjC,WAAA,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC;AACjC,WAAA,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAC/D;AAEA;;;AAGG;AACI,MAAM,gBAAgB,GAAG,CAAC,aAAkB,KAA6B;AAC9E,IAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;AACtE,QAAA,OAAO,KAAK;IACd;IACA,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC;AACxE,IAAA,OAAO,KAAK,GAAG,EAAE,IAAI,OAAO,GAAG,EAAE;AACnC;AAEA;;;AAGG;AACI,MAAM,gBAAgB,GAAG,CAAC,aAAkB,KAAuC;AACxF,IAAA,OAAO,KAAK,CAAC,OAAO,CAAC,aAAa;WAC7B,aAAa,CAAC,MAAM,KAAK;AACzB,WAAA,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC;AACjC,WAAA,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AACzC;AAEA;;;AAGG;AACG,SAAU,sBAAsB,CAAC,KAAc,EAAA;IACnD,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC;AACpH;AAEA;;;AAGG;AACG,SAAU,QAAQ,CAAC,KAAc,EAAA;AACrC,IAAA,OAAO,OAAO,KAAK,KAAK,QAAQ;AAClC;AAEA;;;AAGG;AACG,SAAU,WAAW,CAAC,WAAmB,EAAA;AAC7C,IAAA,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;QAC/B,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC;QAC/C,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;QACtD,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;AACrD,QAAA,OAAO,IAAI,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC;IAC/C;AACA,IAAA,OAAO,IAAI,MAAM,CAAC,WAAW,CAAC;AAChC;;ACpIA;;;AAGG;AACI,MAAM,aAAa,GAA2D;AACnF,IAAA,IAAI,EAAE,eAAe;AACrB,IAAA,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1C,WAAW,EAAE,KAAK,CAAC,OAAO;AAC1B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,cAAc,GAA6B;AACtD,IAAA,IAAI,EAAE,gBAAgB;AACtB,IAAA,SAAS,EAAE,CAAC,WAAW,EAAE,SAAS,KAAK,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC;AACtE,IAAA,WAAW,EAAE,QAAQ;AACrB,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,gBAAgB,GAA2D;AACtF,IAAA,IAAI,EAAE,kBAAkB;AACxB,IAAA,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;IACnD,WAAW,EAAE,KAAK,CAAC,OAAO;AAC1B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,iBAAiB,GAA6B;AACzD,IAAA,IAAI,EAAE,mBAAmB;AACzB,IAAA,SAAS,EAAE,CAAC,WAAW,EAAE,SAAc,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC5E,IAAA,WAAW,EAAE,QAAQ;AACrB,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,QAAQ,GAA2D;AAC9E,IAAA,IAAI,EAAE,UAAU;;IAEhB,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,YAAY,IAAI,KAAK,CAAC;IACjF,WAAW,EAAE,KAAK,CAAC,OAAO;AAC1B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,UAAU,GAAsD;AAC3E,IAAA,IAAI,EAAE,YAAY;IAClB,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC;IACnH,WAAW,EAAE,KAAK,CAAC,OAAO;AAC1B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,KAAK,GAA6D;AAC7E,IAAA,IAAI,EAAE,OAAO;IACb,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACxF,WAAW,EAAE,KAAK,CAAC,OAAO;IAC1B,WAAW,EAAE,KAAK,CAAC;;AAGrB;;;AAGG;AACI,MAAM,QAAQ,GAA6D;AAChF,IAAA,IAAI,EAAE,UAAU;IAChB,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACxF,WAAW,EAAE,KAAK,CAAC,OAAO;IAC1B,WAAW,EAAE,KAAK,CAAC;;AAGrB;;;AAGG;AACI,MAAM,QAAQ,GAAwC;AAC3D,IAAA,IAAI,EAAE,UAAU;IAChB,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,WAAW,CAAC,KAAK,CAAC,CAAC,aAAa,KAAK,aAAa,GAAG,CAAC,MAAM,CAAC;IACjG,WAAW,EAAE,KAAK,CAAC,OAAO;AAC1B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,QAAQ,GAA+B;AAClD,IAAA,IAAI,EAAE,UAAU;AAChB,IAAA,SAAS,EAAE,CAAC,KAAK,EAAE,WAAW,KAAI;AAChC,QAAA,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC;AACvC,QAAA,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjE,CAAC;IACD,WAAW,EAAE,KAAK,CAAC,OAAO;AAC1B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,cAAc,GAA2D;AACpF,IAAA,IAAI,EAAE,gBAAgB;AACtB,IAAA,SAAS,EAAE,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAChC,UAAU,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,YAAY,IAAI,CAAC,IAAI,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;IAClF,WAAW,EAAE,KAAK,CAAC,OAAO;AAC1B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,SAAS,GAA2D;AAC/E,IAAA,IAAI,EAAE,WAAW;;IAEjB,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,YAAY,IAAI,KAAK,CAAC;IAChF,WAAW,EAAE,KAAK,CAAC,OAAO;AAC1B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,UAAU,GAAwC;AAC7D,IAAA,IAAI,EAAE,YAAY;IAClB,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,WAAW,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,YAAY,GAAG,CAAC,MAAM,CAAC;IAC9F,WAAW,EAAE,KAAK,CAAC,OAAO;AAC1B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,KAAK,GAA6D;AAC7E,IAAA,IAAI,EAAE,OAAO;IACb,SAAS,EAAE,CAAC,UAAU,EAAE,WAAW,KACjC,UAAU,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACvE,WAAW,EAAE,KAAK,CAAC,OAAO;IAC1B,WAAW,EAAE,KAAK,CAAC;;AAGrB;;;AAGG;AACI,MAAM,QAAQ,GAAwC;AAC3D,IAAA,IAAI,EAAE,UAAU;IAChB,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,WAAW,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,YAAY,GAAG,CAAC,MAAM,CAAC;IAC9F,WAAW,EAAE,KAAK,CAAC,OAAO;AAC1B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,UAAU,GAA+B;AACpD,IAAA,IAAI,EAAE,YAAY;AAClB,IAAA,SAAS,EAAE,CAAC,WAAW,EAAE,WAAW,KAAI;AACtC,QAAA,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC;AACvC,QAAA,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtE,CAAC;IACD,WAAW,EAAE,KAAK,CAAC,OAAO;AAC1B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,cAAc,GAA2D;AACpF,IAAA,IAAI,EAAE,gBAAgB;AACtB,IAAA,SAAS,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KACjC,WAAW,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,YAAY,IAAI,CAAC,IAAI,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;IAClF,WAAW,EAAE,KAAK,CAAC,OAAO;AAC1B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,YAAY,GAAqC;AAC5D,IAAA,IAAI,EAAE,cAAc;AACpB,IAAA,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC;IAC7D,WAAW,EAAE,KAAK,CAAC,OAAO;AAC1B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,eAAe,GAAqC;AAC/D,IAAA,IAAI,EAAE,iBAAiB;AACvB,IAAA,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC;IAC7D,WAAW,EAAE,KAAK,CAAC,OAAO;AAC1B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,sBAAsB,GAAqC;AACtE,IAAA,IAAI,EAAE,wBAAwB;AAC9B,IAAA,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,CAAC,MAAM;IACrD,WAAW,EAAE,KAAK,CAAC,OAAO;AAC1B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,cAAc,GAAqC;AAC9D,IAAA,IAAI,EAAE,gBAAgB;AACtB,IAAA,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,MAAM;IACpD,WAAW,EAAE,KAAK,CAAC,OAAO;AAC1B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,yBAAyB,GAAqC;AACzE,IAAA,IAAI,EAAE,2BAA2B;AACjC,IAAA,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,CAAC,MAAM;IACrD,WAAW,EAAE,KAAK,CAAC,OAAO;AAC1B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,iBAAiB,GAAqC;AACjE,IAAA,IAAI,EAAE,mBAAmB;AACzB,IAAA,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,MAAM;IACpD,WAAW,EAAE,KAAK,CAAC,OAAO;AAC1B,IAAA,WAAW,EAAE;;AAGf;AACO,MAAM,mBAAmB,GAAG;IACjC,QAAQ;IACR,UAAU;IACV,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,cAAc;IACd,aAAa;IACb,YAAY;IACZ,eAAe;IACf,iBAAiB;IACjB,yBAAyB;IACzB,cAAc;IACd,sBAAsB;IACtB,gBAAgB;IAChB,iBAAiB;IACjB,SAAS;IACT,UAAU;IACV,KAAK;IACL,QAAQ;IACR,UAAU;IACV,cAAc;IACd;;;ACjSF;;;AAGG;AACI,MAAM,MAAM,GAAa;AAC9B,IAAA,IAAI,EAAE,QAAQ;;IAEd,SAAS,EAAE,CAAC,UAAU,EAAE,WAAW,KAAK,UAAU,IAAI;;AAGxD;;;AAGG;AACI,MAAM,SAAS,GAAa;AACjC,IAAA,IAAI,EAAE,WAAW;;IAEjB,SAAS,EAAE,CAAC,UAAU,EAAE,WAAW,KAAK,UAAU,IAAI;;AAGxD;;;AAGG;AACI,MAAM,OAAO,GAA2D;AAC7E,IAAA,IAAI,EAAE,SAAS;AACf,IAAA,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;AAClD,IAAA,WAAW,EAAE,sBAAsB;IACnC,WAAW,EAAE,KAAK,CAAC;;AAGrB;;;AAGG;AACI,MAAM,UAAU,GAA2D;AAChF,IAAA,IAAI,EAAE,YAAY;AAClB,IAAA,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;AACnD,IAAA,WAAW,EAAE,sBAAsB;IACnC,WAAW,EAAE,KAAK,CAAC;;AAGrB;;;AAGG;AACI,MAAM,QAAQ,GAA6B;AAChD,IAAA,IAAI,EAAE,UAAU;AAChB,IAAA,SAAS,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC9D,IAAA,WAAW,EAAE,QAAQ;AACrB,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,WAAW,GAA6B;AACnD,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,SAAS,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC/D,IAAA,WAAW,EAAE,QAAQ;AACrB,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,SAAS,GAAuB;AAC3C,IAAA,IAAI,EAAE,WAAW;AACjB,IAAA,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK;;AAGzD;;;AAGG;AACI,MAAM,WAAW,GAAuB;AAC7C,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK;;AAGzD;;;AAGG;AACI,MAAM,cAAc,GAA6B;AACtD,IAAA,IAAI,EAAE,gBAAgB;AACtB,IAAA,SAAS,EAAE,CAAC,KAAK,EAAE,WAAW,KAAI;AAChC,QAAA,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC;AACvC,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;IAC3B,CAAC;AACD,IAAA,WAAW,EAAE,QAAQ;AACrB,IAAA,WAAW,EAAE;;AAGf;AACO,MAAM,cAAc,GAAG;AAC5B,IAAA,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE;;;ACnG5F;;;AAGG;AACI,MAAM,WAAW,GAAsD;AAC5E,IAAA,IAAI,EAAE,aAAa;IACnB,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAI;AAC9B,QAAA,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC;AACjC,QAAA,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,UAAU,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,UAAU;IACnE,CAAC;AACD,IAAA,WAAW,EAAE,gBAAgB;AAC7B,IAAA,WAAW,EAAE;;AAGf;;;;AAIG;AACI,MAAM,iBAAiB,GAAuD;AACnF,IAAA,IAAI,EAAE,mBAAmB;IACzB,SAAS,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,kBAAkB,KAAI;QACxD,IAAI,CAAC,kBAAkB,EAAE;AACvB,YAAA,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC;QAChF;AACA,QAAA,IAAI,OAAO,kBAAkB,CAAC,cAAc,KAAK,QAAQ,EAAE;AACzD,YAAA,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC;QACzD;AACA,QAAA,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,cAAc;AAC1D,QAAA,OAAO,WAAW,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;IACvG,CAAC;IACD,wBAAwB,EAAE,CAAC,gBAAgB,CAAC;AAC5C,IAAA,WAAW,EAAE,gBAAgB;AAC7B,IAAA,WAAW,EAAE;;AAGf;;;;AAIG;AACI,MAAM,oBAAoB,GAAuD;AACtF,IAAA,IAAI,EAAE,sBAAsB;IAC5B,SAAS,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,kBAAkB,KAAI;QACxD,IAAI,CAAC,kBAAkB,EAAE;AACvB,YAAA,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC;QAChF;AACA,QAAA,IAAI,OAAO,kBAAkB,CAAC,cAAc,KAAK,QAAQ,EAAE;AACzD,YAAA,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC;QACzD;AACA,QAAA,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,cAAc;AAC1D,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,gBAAgB,CAAC;AACtC,QAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;AAC/F,QAAA,OAAO,QAAQ,IAAI,GAAG,IAAI,QAAQ,GAAG,UAAU;IACjD,CAAC;IACD,wBAAwB,EAAE,CAAC,gBAAgB,CAAC;AAC5C,IAAA,WAAW,EAAE,gBAAgB;AAC7B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,UAAU,GAAyC;AAC9D,IAAA,IAAI,EAAE,YAAY;AAClB,IAAA,SAAS,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAI;AACjC,QAAA,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC7D,QAAA,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,OAAO,aAAa,GAAG,cAAc;IACvC,CAAC;AACD,IAAA,WAAW,EAAE,gBAAgB;AAC7B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,SAAS,GAAyC;AAC7D,IAAA,IAAI,EAAE,WAAW;AACjB,IAAA,SAAS,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAI;AACjC,QAAA,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC7D,QAAA,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,OAAO,aAAa,GAAG,cAAc;IACvC,CAAC;AACD,IAAA,WAAW,EAAE,gBAAgB;AAC7B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,UAAU,GAAyC;AAC9D,IAAA,IAAI,EAAE,YAAY;AAClB,IAAA,SAAS,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAI;AACjC,QAAA,MAAM,sBAAsB,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACtE,QAAA,MAAM,uBAAuB,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACxE,OAAO,sBAAsB,KAAK,uBAAuB;IAC3D,CAAC;AACD,IAAA,WAAW,EAAE,gBAAgB;AAC7B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,aAAa,GAAyC;AACjE,IAAA,IAAI,EAAE,eAAe;AACrB,IAAA,SAAS,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAI;AACjC,QAAA,MAAM,sBAAsB,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACtE,QAAA,MAAM,uBAAuB,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACxE,OAAO,sBAAsB,KAAK,uBAAuB;IAC3D,CAAC;AACD,IAAA,WAAW,EAAE,gBAAgB;AAC7B,IAAA,WAAW,EAAE;;AAGR,MAAM,kBAAkB,GAAG;IAChC,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE;;;AC7H3F;;;AAGG;AACI,MAAM,kBAAkB,GAA+D;AAC5F,IAAA,IAAI,EAAE,oBAAoB;IAC1B,SAAS,EAAE,CAAC,WAAW,EAAE,YAAY,KAAK,WAAW,IAAI,YAAY;AACrE,IAAA,WAAW,EAAE,eAAe;AAC5B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,WAAW,GAA+D;AACrF,IAAA,IAAI,EAAE,aAAa;IACnB,SAAS,EAAE,CAAC,WAAW,EAAE,YAAY,KAAK,WAAW,GAAG,YAAY;AACpE,IAAA,WAAW,EAAE,eAAe;AAC5B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,WAAW,GAA+D;AACrF,IAAA,IAAI,EAAE,aAAa;IACnB,SAAS,EAAE,CAAC,WAAW,EAAE,YAAY,KAAK,WAAW,IAAI,YAAY;AACrE,IAAA,WAAW,EAAE,eAAe;AAC5B,IAAA,WAAW,EAAE;;AAGf;;;AAGG;AACI,MAAM,QAAQ,GAA+D;AAClF,IAAA,IAAI,EAAE,UAAU;IAChB,SAAS,EAAE,CAAC,WAAW,EAAE,YAAY,KAAK,WAAW,GAAG,YAAY;AACpE,IAAA,WAAW,EAAE,eAAe;AAC5B,IAAA,WAAW,EAAE;;AAGf;AACO,MAAM,oBAAoB,GAAG,CAAC,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW;;AClCpF,MAAM,YAAY,GAAG,CAAC,GAAG,mBAAmB,EAAE,GAAG,cAAc,EAAE,GAAG,oBAAoB,EAAE,GAAG,kBAAkB;;ACRtH;;;AAGG;AACG,SAAU,qBAAqB,CAAC,SAAc,EAAA;AAClD,IAAA,OAAO,SAAS,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,WAAW,IAAI,OAAO,SAAS,CAAC,GAAG,KAAK,WAAW;AACvG;AAEA;;;AAGG;AACG,SAAU,aAAa,CAAC,OAAY,EAAA;AACxC,IAAA,OAAO,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;AAC3C;AAEA;;;AAGG;AACG,SAAU,oBAAoB,CAAC,OAAY,EAAA;AAC/C,IAAA,OAAO,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc;AACnD;AAEA;;;AAGG;AACG,SAAU,gBAAgB,CAAC,OAAY,EAAA;AAC3C,IAAA,OAAO,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;AAC9C;AAEA;;;AAGG;AACG,SAAU,eAAe,CAAC,SAAc,EAAA;IAC5C,OAAO,SAAS,IAAI,OAAO,SAAS,CAAC,GAAG,KAAK,WAAW;AAC1D;AAEA;;;AAGG;AACG,SAAU,eAAe,CAAC,SAAc,EAAA;IAC5C,OAAO,SAAS,IAAI,OAAO,SAAS,CAAC,GAAG,KAAK,WAAW;AAC1D;AAEA;;;AAGG;AACG,SAAU,cAAc,CAAC,SAAc,EAAA;IAC3C,OAAO,SAAS,IAAI,OAAO,SAAS,CAAC,GAAG,KAAK,WAAW;AAC1D;;AChEA;MA6Da,eAAe,CAAA;AAkB1B;;;;AAIG;IACH,WAAA,CAAY,OAAgB,EAAE,WAAwB,EAAA;QAP9C,IAAA,CAAA,gBAAgB,GAAG,CAAC;AAqK5B;;;AAGG;AACgB,QAAA,IAAA,CAAA,kBAAkB,GAAG,CAAC,GAAa,KAAc;AAClE,YAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU;AACxC,YAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,cAAc,CAAC;AAC/C,YAAA,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC;AACnC,QAAA,CAAC;AArKC,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,SAAS;AACtC,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE;IACzC;AAEA;;;;;AAKG;IACK,qBAAqB,CAAC,aAA6D,EAAE,cAA2B,EAAA;AACtH,QAAA,IAAI,aAAa,IAAI,aAAa,CAAC,aAAa,CAAC,EAAE;AACjD,YAAA,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC;QACzC;AAAO,aAAA,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;AACvC,YAAA,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACnF;aAAO;AACL,YAAA,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE;gBAC/B,IAAI,CAAC,GAAG,KAAK,UAAU,KAAK,qBAAqB,CAAC,aAAa,CAAC,EAAE;oBAChE,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AAC7C,oBAAA,IAAI,EAAE,IAAI,EAAE,CAAC,wBAAwB,EAAE;AACrC,wBAAA,EAAE,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACvE;gBACF;qBAAO,IAAI,OAAO,aAAa,CAAC,GAAyC,CAAC,KAAK,QAAQ,EAAE;oBACvF,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,GAAyC,CAAC,EAAE,cAAc,CAAC;gBACtG;YACF;QACF;IACF;AAEA;;;;AAIG;IACO,eAAe,CAAC,IAAU,EAAE,MAAuB,EAAA;AAC3D,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE;AAChC,YAAA,MAAM,QAAQ,GAAG,CAAA,aAAA,EAAgB,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAA,CAAA,EAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,EAAE;AAC7G,YAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAC;AAC1D,YAAA,IAAI,MAAM,KAAK,KAAK,EAAE;AACpB,gBAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAA,EAAG,QAAQ,CAAA,MAAA,CAAQ,EAAE,GAAG,QAAQ,CAAA,IAAA,CAAM,CAAC;YACxF;QACF;IACF;AAEA;;;;;AAKG;AACO,IAAA,eAAe,CAAC,OAAmC,EAAE,UAA6C,EAAE,iBAAwC,EAAA;AACpJ,QAAA,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE;AAClC,YAAA,OAAO,SAAS;QAClB;AAAO,aAAA,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE;YACjC,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC;;AAE3C,YAAA,OAAO,OAAO,CAAC,IAAI,GAAG,SAAS,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS;QAC/G;AAAO,aAAA,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE;YACpC,OAAO,OAAO,CAAC,KAAK;QACtB;AAAO,aAAA,IAAI,oBAAoB,CAAC,OAAO,CAAC,EAAE;AACxC,YAAA,OAAO,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC;QACzC;AACA,QAAA,OAAO,SAAS;IAClB;AAEA;;;;;;;;AAQG;AACO,IAAA,YAAY,CAAC,IAAU,EAAE,UAA6C,EAAE,iBAAwC,EAAA;AACxH,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,iBAAiB,CAAC;IAC5E;AAEA;;;;;;;;AAQG;IACO,aAAa,CAAC,OAAiB,EAAE,UAA6C,EAAE,iBAAwC,EAAE,UAAyB,EAAE,EAAA;AAC7J,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE;AAC/B,YAAA,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,iBAAiB,CAAC,GAAG,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe;AAChJ,iBAAA,OAAO,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;QAC1G;AAAO,aAAA,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE;AACtC,YAAA,IAAI,IAAI,CAAC,6BAA6B,CAAC,OAAO,CAAC,EAAE;gBAC/C,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK;YACjD;iBAAO;AACL,gBAAA,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YACvB;QACF;AACA,QAAA,OAAO,OAAO;IAChB;AAEA;;;;AAIG;AACO,IAAA,aAAa,CAAC,OAAiB,EAAA;AACvC,QAAA,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS;IACxC;AAEA;;;;AAIG;AACO,IAAA,aAAa,CAAC,OAAiB,EAAA;QACvC,OAAO,aAAa,IAAI,OAAO,IAAI,OAAO,CAAC,WAAW,KAAK,QAAQ;IACrE;AAEA;;;;AAIG;AACO,IAAA,6BAA6B,CAAC,OAAoB,EAAA;QAC1D,OAAO,YAAY,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,UAAU;IACrE;AAEA;;;;;;AAMG;AACO,IAAA,iBAAiB,CAAC,eAAgC,EAAE,UAA6C,EAAE,iBAAwC,EAAA;AACnJ,QAAA,IAAI,qBAAqB,CAAC,eAAe,CAAC,EAAE;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC;AACzD,YAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;gBAC1B,MAAM,IAAI,KAAK,CAAC,CAAA,mBAAA,EAAsB,eAAe,CAAC,QAAQ,CAAA,gCAAA,CAAkC,CAAC;YACnG;AACA,YAAA,OAAO,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,GAAG,EAAE,UAAU,EAAE,iBAAiB,CAAC,EAC7F,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,eAAe,GAAG,eAAe,CAAC,GAAG,GAAG,SAAS,EAAE,UAAU,EAAE,iBAAiB,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC;QAC1I;AAEA,QAAA,IAAI,cAAc,CAAC,eAAe,CAAC,EAAE;AACnC,YAAA,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,GAAG,EAAE,UAAU,EAAE,iBAAiB,CAAC;QACpF;QACA,IAAI,eAAe,CAAC,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE;AAC9C,YAAA,MAAM,QAAQ,GAAG,CAAC,SAA0B,KAAK,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,UAAU,EAAE,iBAAiB,CAAC;AACjH,YAAA,OAAO,eAAe,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChK;AACA,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,8BAAA,EAAiC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA,CAAE,CAAC;IACrF;AAYA;;AAEG;IACO,WAAW,GAAA;QACnB,MAAM,iBAAiB,GAA6B,EAAE;AACtD,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5G,MAAM,wBAAwB,GAAa,EAAE;QAC7C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAClC,YAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC3E,wBAAwB,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9D;AAAO,iBAAA,EAAC;AACV,QAAA,CAAC,CAAC;AACF,QAAA,MAAM,YAAY,GAA0B,wBAAwB,CAAC,MAAM,KAAK;AAC9E,cAAE,EAAE,CAAC,EAAE;cACL,aAAa,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5G,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,MAAK;YAC/C,MAAM,iBAAiB,GAA0B,EAAE;AAEnD,YAAA,IAAI,iBAA2B;AAC/B,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;AAC9B,gBAAA,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAI;oBACrE,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACnE,oBAAA,OAAO,GAAG;AACZ,gBAAA,CAAC,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;YACxB;AAEA,YAAA,OAAO,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;gBACnD,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC;gBAC3F,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAA0B,CAAC;AACpF,qBAAA,IAAI,CACH,SAAS,CAAC,SAAS,CAAC,EACpB,QAAQ,EAAE,EACV,GAAG,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAC9C,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,UAAU,CAAC,KAAI;AAClC,oBAAA,MAAM,MAAM,GAAyB,EAAE,OAAO,EAAE,SAAS,EAAE;AAE3D,oBAAA,IAAI;wBACF,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAoC,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,KAAI;4BAC/G,GAAG,CAAC,EAAE,CAAC,GAAG,UAAW,CAAC,KAAK,CAAC;AAC5B,4BAAA,OAAO,GAAG;AACZ,wBAAA,CAAC,EAAE,EAAE,CAAC,EAAE,iBAAiB,CAAC;oBAC5B;oBAAE,OAAO,KAAK,EAAE;AACd,wBAAA,MAAM,CAAC,OAAO,GAAG,SAAS;AAC1B,wBAAA,MAAM,CAAC,KAAK,GAAG,KAAK;oBACtB;AAEA,oBAAA,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;AAC9B,wBAAA,MAAM,CAAC,UAAU,GAAG,yBAAyB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,CAAC;oBAChK;AAAO,yBAAA,IAAI,MAAM,CAAC,KAAK,EAAE;AACvB,wBAAA,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,YAAY,KAAK,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;AAC7I,wBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA,gCAAA,EAAmC,IAAI,CAAC,EAAE,CAAA,WAAA,EAAc,UAAU,CAAA,CAAE,CAAC;AACpG,wBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA,cAAA,EAAiB,IAAI,CAAC,IAAI,CAAA,4BAAA,CAA8B,CAAC;oBACzF;AACA,oBAAA,OAAO,MAAM;AACf,gBAAA,CAAC,CAAC,EACF,GAAG,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAC7C;YACL,CAAC,CAAC,CAAC,CAAC,IAAI,CACN,SAAS,CAAC,SAAS,CAAC,EACpB,QAAQ,EAAE,EACV,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,KAAI;AACzB,gBAAA,MAAM,YAAY,GAAG,OAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AACnD,gBAAA,MAAM,kBAAkB,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC;AAErE,gBAAA,IAAI,QAAQ,GAMR,EAAE,YAAY,GAAG,kBAAkB,GAAG,YAAY,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE;AAEhE,gBAAA,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE;AAChC,oBAAA,QAAQ,GAAG;AACT,wBAAA,GAAG,QAAQ;wBACX,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,+BAA+B,CAC7D,OAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,OAAO;qBACrH;gBACH;AACA,gBAAA,OAAO,QAAQ;AACjB,YAAA,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,MAAM,KAAI;gBACb,MAAM,aAAa,GAAI,EAAoB,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC;gBAE1E,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW,IAAI,MAAM,CAAC,kBAAkB,EAAE;AAC7D,oBAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,gBAAiB,EAC1F,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,CAAC,eAAgB,EAC5E,MAAM,CAAC,sBAAuB,CAAC;gBACnC;AAEA,gBAAA,OAAO,aAAa;YACtB,CAAC,CAAC,EACF,oBAAoB,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAC7E;AACH,QAAA,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnD,OAAO;AACL,YAAA,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;AACnB,YAAA,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa;AACzC,YAAA,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB;AAC/C,YAAA,oBAAoB,EAAE;SACN;IACpB;AACD;;ACvTD;MACa,WAAW,CAAA;AAkCtB;;AAEG;AACH,IAAA,IAAW,SAAS,GAAA;AAClB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW;IAC3B;AAEA;;;AAGG;AACH,IAAA,WAAA,CAAY,OAA4B,EAAA;;QA3CvB,IAAA,CAAA,OAAO,GAAoC,EAAE;;AAG7C,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,eAAe,CAAkC,EAAE,CAAC;QAyC3F,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,KAAK,OAAO,MAAM,KAAK,WAAW,GAAG,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC;AAC3G,QAAA,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,QAAQ;AACpC,QAAA,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,IAAI,CAAC;AAC1C,QAAA,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM;QAC7B,IAAI,CAAC,uBAAuB,GAAG,OAAO,EAAE,uBAAuB,IAAI,aAAa;AAChF,QAAA,IAAI,CAAC,gBAAgB,GAAG,OAAO,EAAE,gBAAgB;;AAEjD,QAAA,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,MAAM,CAAqC,CAAC,GAAG,EAAE,QAAQ,KAAI;AACzF,YAAA,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ;AAC7B,YAAA,OAAO,GAAG;QACZ,CAAC,EAAE,EAAE,CAAC;AACN,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CACxC,IAAI,CAAC,oBAAoB,EAAE,EAC3B,IAAI,CAAC,yBAAyB,EAAE,CACjC;AACD,QAAA,IAAI,OAAO,EAAE,KAAK,EAAE;AAClB,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;QACjC;AACA,QAAA,IAAI,OAAO,EAAE,KAAK,EAAE;AAClB,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC;QACpC;AACA,QAAA,IAAI,OAAO,EAAE,SAAS,EAAE;AACtB,YAAA,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC;QACzC;IACF;AAEA;;AAEG;IACK,yBAAyB,GAAA;AAC/B,QAAA,OAAO,CAAC,cAA+B,KAAK,IAAI,CAAC,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,WAAY,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,cAAc;IAC1K;AAEA;;;AAGG;AACK,IAAA,oBAAoB,CAAsC,QAAmB,EAAA;QACnF,OAAO,CAAC,kBAA+D,MAAM,IAAI,CAAC;AAChF,cAAE,kBAAkB,CAAC,IAAI,CACvB,GAAG,CAAC,CAAC,kBAAkB,KAAK,IAAI,CAAC,WAAY,CAAC,oBAAoB,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC,EACjG,yBAAyB,CAAC,QAAQ,CAAC;cACnC,kBAAkB,CAAC,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC,CAAoB;IACtF;AAEA;;;;;AAKG;IACI,0BAA0B,CAAY,EAAU,EAAE,UAA0B,EAAA;;QAEjF,MAAM,IAAI,GAAG;cACT,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;cAC9F,UAAU;QACd,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,IAAI,OAAO,EAAE;YACX,IAAI,UAAU,EAAE;AACd,gBAAA,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5B;YACA,OAAO,OAAO,CAAC,MAAM;QACvB;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,eAAe,CAAwC,IAAI,CAAC;AAChF,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CACzB,SAAS,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,EAC5C,oBAAoB,EAAE,EACtB,WAAW,CAAC,CAAC,CAAC,CACf;AAED,QAAA,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG;YACjB,OAAO;YACP;SACD;AAED,QAAA,OAAO,MAAM;IACf;AAEA;;;;AAIG;AACI,IAAA,iBAAiB,CAAc,EAAU,EAAA;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,0BAA0B,CAAI,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;IACvH;AAEA;;;AAGG;AACI,IAAA,WAAW,CAAc,KAA0B,EAAA;QACxD,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAI;YAClE,IAAI,CAAC,WAAW,EAAE,8BAA8B,CAAC,EAAE,EAAE,MAAM,CAAC;AAC5D,YAAA,IAAI,CAAC,0BAA0B,CAAC,EAAE,EAAE,MAAM,CAAC;AAC7C,QAAA,CAAC,CAAC;IACJ;AAEA;;;AAGG;AACI,IAAA,cAAc,CAAC,QAAmB,EAAA;AACvC,QAAA,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,QAAQ,CAAC;AAEhD,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CACzB,QAAQ,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,OAAO,KAAI;AACtC,YAAA,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC;AAC3D,YAAA,OAAO,UAAU;QACnB,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,CACxC;IACH;AAEA;;;AAGG;AACI,IAAA,eAAe,CAAC,SAAsD,EAAA;AAC3E,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,QAAQ,KAAI;AAClD,YAAA,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ;AAC7B,YAAA,OAAO,GAAG;QACZ,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAC3B;AAEA;;;AAGG;IACI,cAAc,GAAA;AACnB,QAAA,OAAO,CAAC,YAA8C,KACpD,YAAY,CAAC,IAAI,CACf,SAAS,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAI,QAAQ,CAAC,CAAC,CAAC,EAC5F,IAAI,CAAC,yBAAyB,EAAE,CACjC;IACL;;IAGO,uBAAuB,GAAA;QAC5B,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAClC;AACD;;MClLY,wBAAwB,CAAA;AAsBnC,IAAA,WAAA,GAAA;AArBiB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAuB,KAAK,CAAC;AAC3C,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;;AAM5B,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,GAAG,EAA4B;;AAG7D,QAAA,IAAA,CAAA,iBAAiB,GAA+C,IAAI,eAAe,CAAC,EAAE,CAAC;AAY/F,QAAA,MAAM,YAAY,GAAG,MAAM,CAA4B,oBAAoB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEhG,QAAA,IAAI,CAAC,OAAO,GAAG,CAAC,YAAY,EAAE,MAAM;AACpC,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,CAAC;YAC5B,QAAQ,EAAE,YAAY,EAAE,KAAK,GAAG,IAAI,cAAc,CAAC,EAAE,gBAAgB,EAAE,YAAY,EAAE,qBAAqB,EAAE,CAAC,GAAG,SAAS;YACzH,MAAM,EAAE,IAAI,CAAC;AACd,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAC7C,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CACzB,SAAS,CAAC,CAAC,wBAAwB,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CACrD,MAAM,CAAC,+BAA+B,CAAC,EACvC,GAAG,CAAC,CAAC,+BAA+B,KAClC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,KAC/D,+BAA+B,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,KAAK,wBAAwB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAC/G,CACF,CACF,CAAC;SAEL,CAAC,CAAC,IAAI,CACL,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,2BAA2B,CAAC,MAAM,CAAC,GAAG,cAAc,EAAE,GAAG,2BAA2B,CAAC,CAAC,CAAC,CAC9G;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAChC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAe,EACzC,WAAW,CAAC,CAAC,CAAC,CACf;AAED,QAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;AAElC,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CACb,MAAM,CAAC,iBAAiB,CAAC,EACzB,kBAAkB,EAAE,CACrB,CAAC,SAAS,CAAC,CAAC,QAAmB,KAAK,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC1E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;AACvF,YAAA,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;AAClC,QAAA,CAAC,CAAC;IACJ;AAEA;;;AAGG;IACO,MAAM,cAAc,CAAC,OAAsB,EAAA;QACnD,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;AAE/C,QAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAEhG,MAAM,UAAU,GAAG;AAChB,aAAA,MAAM,CAAC,CAAC,MAAM,KAAI;YACjB,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC;YACvD,IAAI,CAAC,OAAO,EAAE;gBACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,WAAA,EAAc,MAAM,CAAC,UAAU,CAAA,iCAAA,CAAmC,CAAC;YACtF;AACA,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC;AACA,aAAA,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,KAAI;AACtB,YAAA,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE;YAC7B,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AACnC,YAAA,OAAO,GAAG;QACZ,CAAC,EAAE,EAAmC,CAAC;QAEzC,MAAM,QAAQ,GAAG;AACd,aAAA,GAAG,CAAC,CAAC,OAAO,KACX,OAAO,CAAC,cAAc,CACpB,OAAO,CAAC;aACL,MAAM,CAAC,CAAC,eAAe,KAAK,UAAU,CAAC,eAAe,CAAC;aACvD,MAAM,CAAgB,CAAC,GAAG,EAAE,eAAe,KAAK,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,EAAE,EAAE,CAAC,CAChG,CACF;;AAGH,QAAA,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC7B;AAEA;;;AAGG;AACI,IAAA,WAAW,CAAC,KAAsC,EAAA;AACvD,QAAA,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC;IAChC;AAEA;;;AAGG;AACI,IAAA,eAAe,CAAC,SAAsD,EAAA;AAC3E,QAAA,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC;IACxC;AAEA;;;AAGG;AACI,IAAA,cAAc,CAAC,QAAmB,EAAA;AACvC,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClE;AAEA;;;AAGG;IACI,sBAAsB,CAAC,GAAG,cAA0C,EAAA;AACzE,QAAA,cAAc,CAAC,OAAO,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACnF;AAEA;;;AAGG;IACI,wBAAwB,CAAC,GAAG,cAA0C,EAAA;AAC3E,QAAA,cAAc,CAAC,OAAO,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACtF;AAEA;;;AAGG;AACI,IAAA,gBAAgB,CAAC,qBAA6B,EAAA;AACnD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK;QAC3C,MAAM,CAAC,qBAAqB,CAAC,GAAG,MAAM,CAAC,qBAAqB,CAAC,GAAG,MAAM,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC;AACrG,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC;IACrC;AAEA;;;AAGG;AACI,IAAA,iBAAiB,CAAC,qBAA6B,EAAA;AACpD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK;AAC3C,QAAA,IAAI,MAAM,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE;AACrC,YAAA,MAAM,CAAC,qBAAqB,CAAC,EAAE;AAC/B,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC;QACrC;IACF;kIA9JW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;sIAAxB,wBAAwB,EAAA,CAAA,CAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC;;;MCzBY,uBAAuB,CAAA;IAC3B,OAAO,OAAO,CAAC,OAA4C,EAAA;AAChE,QAAA,MAAM,IAAI,GAAG,OAAO,GAAG,EAAE,GAAG,4BAA4B,EAAE,GAAG,OAAO,EAAE,GAAG,4BAA4B;QACrG,OAAO;AACL,YAAA,QAAQ,EAAE,uBAAuB;AACjC,YAAA,SAAS,EAAE;AACT,gBAAA,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACjD;AACD;SACF;IACH;kIAVW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAvB,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,YALhC,WAAW;YACX,mBAAmB;YACnB,YAAY,CAAA,EAAA,CAAA,CAAA;AAGH,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,YALhC,WAAW;YACX,mBAAmB;YACnB,YAAY,CAAA,EAAA,CAAA,CAAA;;4FAGH,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAPnC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,WAAW;wBACX,mBAAmB;wBACnB;AACD;AACF,iBAAA;;;ACrBM,MAAM,2CAA2C,GAAgD;AACtG,IAAA,sBAAsB,EAAE;;MAGb,mCAAmC,GAAG,IAAI,cAAc,CAAoC,oCAAoC;;MCmChI,wBAAwB,CAAA;AAUnC;;AAEG;AACH,IAAA,IAAW,2BAA2B,GAAA;QACpC,OAAO,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS;IACnD;AAEA,IAAA,WAAA,GAAA;AAhBU,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAuB,KAAK,CAAC;AACpC,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAgBpE,QAAA,MAAM,OAAO,GAAG,MAAM,CAAoC,mCAAmC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAElH,MAAM,gBAAgB,GAAG,CAAC,OAAO,IAAI,2CAA2C,EAAE,qBAAqB;QACvG,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,IAAI,CACrF,IAAI,CAAC,CAAC,cAAc,EAAE,YAAY,KAAI;YACpC,MAAM,KAAK,GAAG,gBAAgB,IAAI,cAAc,CAAC,MAAM,KAAK,gBAAgB,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,cAAc;AACvH,YAAA,OAAO,CAAC,GAAG,KAAK,EAAE,YAAY,CAAC;QACjC,CAAC,EAAE,EAAkB,CAAC,EACtB,WAAW,CAAC,CAAC,CAAC,CACf;AAED,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,IAAI,aAAa,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CACjJ,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,KAAI;AAChC,YAAA,MAAM,UAAU,GAA4B,MAAM,CAAC,OAAO,CAAC,eAAe;iBACvE,MAAM,CAAgC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,KAAI;gBAC5D,IAAI,OAAO,EAAE;AACX,oBAAA,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO;gBACnB;AACA,gBAAA,OAAO,GAAG;YACZ,CAAC,EAAE,EAAE,CAAC;AACR,YAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE;AAC/B,QAAA,CAAC,CAAC,EACF,WAAW,CAAC,CAAC,CAAC,CACf;IACH;;AAGO,IAAA,MAAM,gCAAgC,GAAA;QAC3C,OAAO,IAAI,CAAC,kBAAkB,IAAI,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC;IAC3E;;AAGO,IAAA,MAAM,iBAAiB,GAAA;AAC5B,QAAA,MAAM,uBAAuB,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,MAAM,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACnK,OAAQ,uBAA+C,EAAE,QAAQ;IACnE;;AAGO,IAAA,MAAM,oBAAoB,GAAA;AAC/B,QAAA,MAAM,0BAA0B,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,MAAM,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACzK,OAAQ,0BAAgD,EAAE,iBAAiB;IAC7E;;AAGO,IAAA,MAAM,mBAAmB,GAAA;AAC9B,QAAA,OAAO,CAAC,IAAI,CAAC,kBAAkB,IAAI,MAAM,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACzI;AAEA;;;AAGG;IACI,MAAM,oBAAoB,CAAC,SAAiB,EAAA;AACjD,QAAA,OAAO,CAAC,IAAI,CAAC,kBAAkB,IAAI,MAAM,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,MAAM,CACvF,CAAC,CAAC,KACA,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,IAAI,CAAC,CAAC,IAAI,KAAK,uBAAuB;AAChE,eAAA,CAA0B,CAAC,SAAS,KAAK,SAAS,CAAC;IAC7D;AAEA;;;;AAIG;IACI,MAAM,eAAe,CAAC,SAAiB,EAAA;QAC5C,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC;IAC5E;AAEA;;;AAGG;IACI,MAAM,6BAA6B,CAAC,SAAiB,EAAA;QAC1D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC;AAC9D,QAAA,OAAO,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,KAAM,CAA0B,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE;IAClH;AAEA;;;AAGG;IACI,MAAM,uBAAuB,CAAC,SAAiB,EAAA;QACpD,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC;AACpE,QAAA,OAAO,iBAAiB,GAAI,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAA0B,CAAC,UAAU,GAAG,SAAS;IACtG;AAEA;;;AAGG;IACI,MAAM,qBAAqB,CAAC,SAAiB,EAAA;AAClD,QAAA,OAAO,CAAC,MAAM,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAClJ;AAEA;;;AAGG;IACI,MAAM,0BAA0B,CAAC,SAAiB,EAAA;QACvD,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC;AACpE,QAAA,OAAO,iBAAiB,GAAI,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAA2B,CAAC,aAAa,GAAG,SAAS;IAC1G;;IAGO,mBAAmB,GAAA;QACxB,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,uBAAuB,EAAE;QACjF,IAAI,eAAe,EAAE;AACnB,YAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,WAAW,EAAE,gBAAgB,CAAC,eAAe,CAAC;QACtF;IACF;AAEA;;;AAGG;AACI,IAAA,qBAAqB,CAAC,SAAiB,EAAA;QAC5C,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CACnC,MAAM,CAAC,sBAAsB,CAAC,EAC9B,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,SAAS,CAAwB,CAAC,CAC9D,CAAC;IACJ;kIA1IW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAxB,uBAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cAFvB,MAAM,EAAA,CAAA,CAAA;;4FAEP,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAHpC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;AC7CD;MAuBa,iCAAiC,CAAA;;aAErB,IAAA,CAAA,gBAAgB,GAAG,aAAH,CAAiB;AAMxD,IAAA,WAAA,GAAA;AAJiB,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAKrE,QAAA,MAAM,OAAO,GAAG,MAAM,CAAoC,mCAAmC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAElH,IAAI,CAAC,OAAO,GAAG;AACb,YAAA,GAAG,2CAA2C;AAC9C,YAAA,GAAG;SACJ;AAED,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE;YACvC,IAAI,CAAC,QAAQ,EAAE;QACjB;IACF;;IAGO,QAAQ,GAAA;QACb,MAAM,kBAAkB,GAAuB,MAAM;AACrD,QAAA,kBAAkB,CAAC,gBAAgB,KAAK,EAAE;QAC1C,kBAAkB,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,gBAAgB,CAAC,GAAG,IAAI;QAE9F,OAAO,CAAC,IAAI,CAAC,CAAA,uEAAA,EAA0E,iCAAiC,CAAC,gBAAgB,CAAA,SAAA,CAAW,CAAC;IACvJ;;AAGO,IAAA,MAAM,gCAAgC,GAAA;QAC3C,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,gCAAgC,EAAE,CAAC;IAChF;;AAGO,IAAA,MAAM,iBAAiB,GAAA;QAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,CAAC;IACjE;;AAGO,IAAA,MAAM,oBAAoB,GAAA;QAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,EAAE,CAAC;IACpE;;AAGO,IAAA,MAAM,mBAAmB,GAAA;QAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,CAAC;IACnE;AAEA;;;AAGG;IACI,MAAM,oBAAoB,CAAC,SAAiB,EAAA;AACjD,QAAA,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC7E;AAEA;;;;AAIG;IACI,MAAM,eAAe,CAAC,SAAiB,EAAA;AAC5C,QAAA,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IACxE;AAEA;;;AAGG;IACI,MAAM,6BAA6B,CAAC,SAAiB,EAAA;AAC1D,QAAA,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,6BAA6B,CAAC,SAAS,CAAC,CAAC;IACtF;AAEA;;;AAGG;IACI,MAAM,uBAAuB,CAAC,SAAiB,EAAA;AACpD,QAAA,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;IAChF;AAEA;;;AAGG;IACI,MAAM,qBAAqB,CAAC,SAAiB,EAAA;AAClD,QAAA,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAC9E;AAEA;;;AAGG;IACI,MAAM,0BAA0B,CAAC,SAAiB,EAAA;AACvD,QAAA,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC;IACnF;;AAGO,IAAA,MAAM,mBAAmB,GAAA;QAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,CAAC;IACnE;AAEA;;;AAGG;IACI,MAAM,qBAAqB,CAAC,SAAiB,EAAA;AAClD,QAAA,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAC9E;kIA9GW,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAjC,uBAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iCAAiC,cAFhC,MAAM,EAAA,CAAA,CAAA;;4FAEP,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAH7C,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCmBY,iCAAiC,CAAA;AAS5C,IAAA,WAAA,GAAA;AARiB,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,wBAAwB,CAAC;AACtD,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;AAG9B,QAAA,IAAA,CAAA,0BAA0B,GAAG,IAAI,eAAe,CAAO,SAAS,CAAC;AACjE,QAAA,IAAA,CAAA,WAAW,IAAG,gBAAqD,CAAA;AACnE,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QA+C/B,IAAA,CAAA,cAAc,GAAG,CAAC,KAAU,KAAK,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,KAAK;AA5CjG,QAAA,MAAM,OAAO,GAAG,MAAM,CAAoC,mCAAmC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAElH,IAAI,CAAC,OAAO,GAAG;AACb,YAAA,GAAG,2CAA2C;AAC9C,YAAA,GAAG;SACJ;AAED,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE;YACvC,IAAI,CAAC,QAAQ,EAAE;QACjB;IACF;AAEA;;;AAGG;AACK,IAAA,mBAAmB,CAAC,IAAoC,EAAA;QAC9D,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE;AAC/C,YAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE;QACxC;IACF;AAEA;;;AAGG;AACK,IAAA,YAAY,CAAC,OAA4C,EAAA;QAC/D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE,OAAO,CAAC;AAE3E,QAAA,QAAQ,OAAO,CAAC,QAAQ;YACtB,KAAK,SAAS,EAAE;gBACd,IAAI,CAAC,aAAa,EAAE;gBACpB;YACF;YACA,KAAK,iBAAiB,EAAE;AACtB,gBAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC;gBACtC;YACF;YACA,SAAS;gBACP,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,EAAE,OAAO,CAAC;YAC3E;;IAEJ;AAIA;;;AAGG;AACK,IAAA,oBAAoB,CAAC,UAAsB,EAAA;AACjD,QAAA,IAAI,UAAU,CAAC,IAAI,KAAK,uBAAuB,EAAE;AAC/C,YAAA,OAAO,UAAU;QACnB;QACA,OAAO;AACL,YAAA,GAAG,UAAU;AACb,YAAA,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,cAAc,MAAM;AACrE,gBAAA,GAAG,cAAc;gBACjB,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,KAAK;AAChD,aAAA,CAAC,CAAC;;AAEH,YAAA,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;SACpE;IACH;AAEA;;AAEG;IACK,sBAAsB,GAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,EAAE;AAC/C,YAAA,aAAa,CAAC;AACZ,gBAAA,IAAI,CAAC,0BAA0B;gBAC/B,IAAI,CAAC,mBAAmB,CAAC;AAC1B,aAAA,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CACpD,CAAC,GAAE,MAAM,CAAC,KAAI;gBACZ,MAAM,eAAe,GAAG,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,KAAK,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC,EAAE;AAC3H,gBAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE,eAAe,CAAC;AACxD,YAAA,CAAC,CACF;QACH;IACF;AAEA;;AAEG;IACK,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC;AAChE,QAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE;IACxC;;IAGO,QAAQ,GAAA;QACb,IAAI,CAAC,sBAAsB,EAAE;AAE7B,QAAA,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,IAAI,CAC/B,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EACnC,oBAAoB,CAAC,oBAAoB,CAAC,CAC3C,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC1C;kIA5GW,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAjC,uBAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iCAAiC,cAFhC,MAAM,EAAA,CAAA,CAAA;;4FAEP,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAH7C,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCLY,yBAAyB,CAAA;AACpC;;;AAGG;IACI,OAAO,UAAU,CAAC,OAAmD,EAAA;QAC1E,OAAO;AACL,YAAA,QAAQ,EAAE,yBAAyB;AACnC,YAAA,SAAS,EAAE;AACT,gBAAA,EAAE,OAAO,EAAE,mCAAmC,EAAE,QAAQ,EAAE,EAAE,GAAG,2CAA2C,EAAE,GAAG,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;gBACxI,iCAAiC;gBACjC;AACD;SACF;IACH;kIAdW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAzB,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,YATlC,WAAW;YACX,mBAAmB,CAAA,EAAA,CAAA,CAAA;AAQV,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,SAAA,EANzB;AACT,YAAA,EAAE,OAAO,EAAE,mCAAmC,EAAE,QAAQ,EAAE,2CAA2C,EAAE;YACvG,iCAAiC;YACjC;AACD,SAAA,EAAA,OAAA,EAAA,CAPC,WAAW;YACX,mBAAmB,CAAA,EAAA,CAAA,CAAA;;4FAQV,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAXrC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,WAAW;wBACX;AACD,qBAAA;AACD,oBAAA,SAAS,EAAE;AACT,wBAAA,EAAE,OAAO,EAAE,mCAAmC,EAAE,QAAQ,EAAE,2CAA2C,EAAE;wBACvG,iCAAiC;wBACjC;AACD;AACF,iBAAA;;;AC1BD;MACsB,YAAY,CAAA;AAIhC,IAAA,WAAA,CAA6B,WAAqC,EAAA;QAArC,IAAA,CAAA,WAAW,GAAX,WAAW;IAA6B;;IAG9D,QAAQ,GAAA;AACb,QAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAC1B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK;aACtB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CACzD;IACH;AACD;;ACFK,MAAO,uBAAwB,SAAQ,YAA8B,CAAA;AAOzE,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,wBAAwB,CAAC;QAEpD,KAAK,CAAC,WAAW,CAAC;QATH,IAAA,CAAA,mBAAmB,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;;AAE/D,QAAA,IAAA,CAAA,KAAK,GAAG;AACb,YAAA,cAAc,EAAE,IAAI,CAAC,mBAAmB,CAAC,YAAY;SACtD;IAMD;;IAGO,IAAI,GAAA;QACT,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3C;kIAhBW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAvB,uBAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA,CAAA;;4FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACnBD;;AAEG;;;;"}
|