spiderly 19.12.2 → 19.12.3
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spiderly.mjs","sources":["../../../projects/spiderly/src/lib/errors/api-error-codes.ts","../../../projects/spiderly/src/lib/controls/base-control.ts","../../../projects/spiderly/src/lib/controls/base-dropdown-control.ts","../../../projects/spiderly/src/lib/controls/base-autocomplete-control.ts","../../../projects/spiderly/src/lib/components/required/required.component.ts","../../../projects/spiderly/src/lib/components/required/required.component.html","../../../projects/spiderly/src/lib/components/spiderly-form-control/spiderly-form-control.ts","../../../projects/spiderly/src/lib/services/validator-abstract.service.ts","../../../projects/spiderly/src/lib/controls/spiderly-autocomplete/spiderly-autocomplete.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-autocomplete/spiderly-autocomplete.component.html","../../../projects/spiderly/src/lib/services/helper-functions.ts","../../../projects/spiderly/src/lib/controls/spiderly-calendar/spiderly-calendar.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-calendar/spiderly-calendar.component.html","../../../projects/spiderly/src/lib/controls/spiderly-checkbox/spiderly-checkbox.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-checkbox/spiderly-checkbox.component.html","../../../projects/spiderly/src/lib/controls/spiderly-colorpicker/spiderly-colorpicker.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-colorpicker/spiderly-colorpicker.component.html","../../../projects/spiderly/src/lib/controls/spiderly-multiautocomplete/spiderly-multiautocomplete.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-multiautocomplete/spiderly-multiautocomplete.component.html","../../../projects/spiderly/src/lib/controls/spiderly-password/spiderly-password.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-password/spiderly-password.component.html","../../../projects/spiderly/src/lib/controls/spiderly-textbox/spiderly-textbox.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-textbox/spiderly-textbox.component.html","../../../projects/spiderly/src/lib/controls/spiderly-multiselect/spiderly-multiselect.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-multiselect/spiderly-multiselect.component.html","../../../projects/spiderly/src/lib/controls/spiderly-textarea/spiderly-textarea.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-textarea/spiderly-textarea.component.html","../../../projects/spiderly/src/lib/controls/spiderly-number/spiderly-number.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-number/spiderly-number.component.html","../../../projects/spiderly/src/lib/controls/spiderly-dropdown/spiderly-dropdown.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-dropdown/spiderly-dropdown.component.html","../../../projects/spiderly/src/lib/controls/spiderly-editor/spiderly-editor.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-editor/spiderly-editor.component.html","../../../projects/spiderly/src/lib/controls/spiderly-markdown/spiderly-markdown.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-markdown/spiderly-markdown.component.html","../../../projects/spiderly/src/lib/components/spiderly-buttons/spiderly-button-base/spiderly-button-base.ts","../../../projects/spiderly/src/lib/components/spiderly-buttons/spiderly-button/spiderly-button.component.ts","../../../projects/spiderly/src/lib/components/spiderly-buttons/spiderly-button/spiderly-button.component.html","../../../projects/spiderly/src/lib/entities/base-entity.ts","../../../projects/spiderly/src/lib/services/spiderly-message.service.ts","../../../projects/spiderly/src/lib/controls/spiderly-file/spiderly-file.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-file/spiderly-file.component.html","../../../projects/spiderly/src/lib/components/spiderly-buttons/return-button/return-button.component.ts","../../../projects/spiderly/src/lib/components/spiderly-buttons/return-button/return-button.component.html","../../../projects/spiderly/src/lib/controls/spiderly-controls.module.ts","../../../projects/spiderly/src/lib/entities/init-company-auth-dialog-details.ts","../../../projects/spiderly/src/lib/services/config.service.base.ts","../../../projects/spiderly/src/lib/services/api.service.security.ts","../../../projects/spiderly/src/lib/services/auth.service.base.ts","../../../projects/spiderly/src/lib/components/auth/auth-card/auth-card.component.ts","../../../projects/spiderly/src/lib/components/auth/auth-card/auth-card.component.html","../../../projects/spiderly/src/lib/components/auth/external-provider-icons.ts","../../../projects/spiderly/src/lib/components/auth/external-login/external-login.component.ts","../../../projects/spiderly/src/lib/components/auth/external-login/external-login.component.html","../../../projects/spiderly/src/lib/entities/security-entities.ts","../../../projects/spiderly/src/lib/errors/spiderly-error.ts","../../../projects/spiderly/src/lib/services/base-form.service.ts","../../../projects/spiderly/src/lib/components/base-form/base-form.component.ts","../../../projects/spiderly/src/lib/components/spiderly-panels/panel-body/panel-body.component.ts","../../../projects/spiderly/src/lib/components/spiderly-panels/panel-body/panel-body.component.html","../../../projects/spiderly/src/lib/components/spiderly-panels/panel-footer/panel-footer.component.ts","../../../projects/spiderly/src/lib/components/spiderly-panels/panel-footer/panel-footer.component.html","../../../projects/spiderly/src/lib/components/spiderly-panels/panel-header/panel-header.component.ts","../../../projects/spiderly/src/lib/components/spiderly-panels/panel-header/panel-header.component.html","../../../projects/spiderly/src/lib/components/spiderly-panels/spiderly-panel/spiderly-panel.component.ts","../../../projects/spiderly/src/lib/components/spiderly-panels/spiderly-panel/spiderly-panel.component.html","../../../projects/spiderly/src/lib/components/spiderly-panels/spiderly-panels.module.ts","../../../projects/spiderly/src/lib/components/auth/partials/verification-wrapper.component.ts","../../../projects/spiderly/src/lib/components/auth/partials/verification-wrapper.component.html","../../../projects/spiderly/src/lib/components/auth/partials/login-verification.component.ts","../../../projects/spiderly/src/lib/components/auth/partials/login-verification.component.html","../../../projects/spiderly/src/lib/components/auth/login/login.component.ts","../../../projects/spiderly/src/lib/components/auth/login/login.component.html","../../../projects/spiderly/src/lib/components/card-skeleton/card-skeleton.component.ts","../../../projects/spiderly/src/lib/components/card-skeleton/card-skeleton.component.html","../../../projects/spiderly/src/lib/components/index-card/index-card.component.ts","../../../projects/spiderly/src/lib/components/index-card/index-card.component.html","../../../projects/spiderly/src/lib/components/info-card/info-card.component.ts","../../../projects/spiderly/src/lib/components/info-card/info-card.component.html","../../../projects/spiderly/src/lib/entities/init-top-bar-data.ts","../../../projects/spiderly/src/lib/services/web-storage.ts","../../../projects/spiderly/src/lib/services/app-layout.service.base.ts","../../../projects/spiderly/src/lib/components/layout/sidebar/sidebar-menu.service.ts","../../../projects/spiderly/src/lib/components/layout/sidebar/menuitem.component.ts","../../../projects/spiderly/src/lib/components/layout/sidebar/menuitem.component.html","../../../projects/spiderly/src/lib/components/layout/sidebar/sidebar-menu.component.ts","../../../projects/spiderly/src/lib/components/layout/sidebar/sidebar-menu.component.html","../../../projects/spiderly/src/lib/components/layout/sidebar/sidebar.component.ts","../../../projects/spiderly/src/lib/components/layout/sidebar/sidebar.component.html","../../../projects/spiderly/src/lib/components/layout/profile-avatar/profile-avatar.component.ts","../../../projects/spiderly/src/lib/components/layout/profile-avatar/profile-avatar.component.html","../../../projects/spiderly/src/lib/components/layout/sidemenu-topbar/sidemenu-topbar.component.ts","../../../projects/spiderly/src/lib/components/layout/sidemenu-topbar/sidemenu-topbar.component.html","../../../projects/spiderly/src/lib/components/layout/topbar/topbar.component.ts","../../../projects/spiderly/src/lib/components/layout/topbar/topbar.component.html","../../../projects/spiderly/src/lib/components/layout/layout.component.ts","../../../projects/spiderly/src/lib/components/layout/layout.component.html","../../../projects/spiderly/src/lib/components/not-found/not-found.component.ts","../../../projects/spiderly/src/lib/components/not-found/not-found.component.html","../../../projects/spiderly/src/lib/components/spiderly-buttons/spiderly-split-button/spiderly-split-button.component.ts","../../../projects/spiderly/src/lib/components/spiderly-buttons/spiderly-split-button/spiderly-split-button.component.html","../../../projects/spiderly/src/lib/directives/spiderly-cell-template.directive.ts","../../../projects/spiderly/src/lib/directives/spiderly-data-table-actions.directive.ts","../../../projects/spiderly/src/lib/directives/spiderly-overflow-title.directive.ts","../../../projects/spiderly/src/lib/directives/spiderly-filter-template.directive.ts","../../../projects/spiderly/src/lib/filters/spiderly-filter-bar.component.ts","../../../projects/spiderly/src/lib/components/spiderly-delete-dialog/spiderly-delete-confirmation.component.ts","../../../projects/spiderly/src/lib/components/spiderly-delete-dialog/spiderly-delete-confirmation.component.html","../../../projects/spiderly/src/lib/components/spiderly-data-table/spiderly-data-table.component.ts","../../../projects/spiderly/src/lib/components/spiderly-data-table/spiderly-data-table.component.html","../../../projects/spiderly/src/lib/enums/match-mode-enum-codes.ts","../../../projects/spiderly/src/lib/filters/allowed-operators.ts","../../../projects/spiderly/src/lib/filters/filter-store.ts","../../../projects/spiderly/src/lib/components/spiderly-data-view/spiderly-data-view.component.ts","../../../projects/spiderly/src/lib/components/spiderly-data-view/spiderly-data-view.component.html","../../../projects/spiderly/src/lib/components/spiderly-panels/spiderly-card/spiderly-card.component.ts","../../../projects/spiderly/src/lib/components/spiderly-panels/spiderly-card/spiderly-card.component.html","../../../projects/spiderly/src/lib/entities/codebook.ts","../../../projects/spiderly/src/lib/entities/filter-sort-meta.ts","../../../projects/spiderly/src/lib/entities/filter.ts","../../../projects/spiderly/src/lib/entities/filter-rule.ts","../../../projects/spiderly/src/lib/entities/is-authorized-for-save-event.ts","../../../projects/spiderly/src/lib/entities/last-menu-icon-index-clicked.ts","../../../projects/spiderly/src/lib/entities/lazy-load-selected-ids-result.ts","../../../projects/spiderly/src/lib/entities/menuchangeevent.ts","../../../projects/spiderly/src/lib/entities/namebook.ts","../../../projects/spiderly/src/lib/entities/paginated-result.ts","../../../projects/spiderly/src/lib/entities/primeng-option.ts","../../../projects/spiderly/src/lib/entities/simple-save-result.ts","../../../projects/spiderly/src/lib/enums/security-enums.ts","../../../projects/spiderly/src/lib/enums/verification-type-codes.ts","../../../projects/spiderly/src/lib/guards/auth.guard.ts","../../../projects/spiderly/src/lib/guards/not-auth.guard.ts","../../../projects/spiderly/src/lib/handlers/spiderly-error-handler.ts","../../../projects/spiderly/src/lib/interceptors/http-loading.interceptor.ts","../../../projects/spiderly/src/lib/interceptors/json-parser.interceptor.ts","../../../projects/spiderly/src/lib/interceptors/jwt.interceptor.ts","../../../projects/spiderly/src/lib/interceptors/unauthorized.interceptor.ts","../../../projects/spiderly/src/lib/services/app-initializer.ts","../../../projects/spiderly/src/lib/services/spiderly-transloco-loader.ts","../../../projects/spiderly/src/lib/directives/template-type.directive.ts","../../../projects/spiderly/src/public-api.ts","../../../projects/spiderly/src/spiderly.ts"],"sourcesContent":["/**\n * Machine-readable error codes returned in `ApiErrorDTO.errorCode`.\n * Mirror of Spiderly.Shared.DTO.ApiErrorCodes — keep in sync.\n */\nexport const ApiErrorCodes = {\n InvalidToken: 'invalid_token',\n ValidationFailed: 'validation_failed',\n UniqueViolation: 'unique_violation',\n ForeignKeyViolation: 'foreign_key_violation',\n ConcurrencyConflict: 'concurrency_conflict',\n EmailNotVerified: 'email_not_verified',\n ExternalProviderNotConfigured: 'external_provider_not_configured',\n ExternalEmailMissing: 'external_email_missing',\n UnknownFilterField: 'unknown_filter_field',\n UnknownSortField: 'unknown_sort_field',\n InvalidMatchMode: 'invalid_match_mode',\n} as const;\n\nexport type ApiErrorCode = (typeof ApiErrorCodes)[keyof typeof ApiErrorCodes];\n","import { Component, Input } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { SpiderlyFormControl } from '../components/spiderly-form-control/spiderly-form-control';\n\n@Component({\n selector: 'base-control',\n template: '',\n styles: [],\n standalone: false,\n})\nexport class BaseControl {\n @Input() control: SpiderlyFormControl<any>; // If you name it formControl: https://stackoverflow.com/a/54755671/21209982\n @Input() disabled: boolean = false;\n /** Whether the field's label is rendered. Defaults to `true`. */\n @Input() showLabel: boolean = true;\n /** Whether the required (*) indicator is shown next to the label. Defaults to `true`. */\n @Input() showRequired: boolean = true;\n @Input() label: string = null; // NgModel/Want custom translation\n @Input() controlValid: boolean = true; // NgModel\n @Input() placeholder: string = '';\n /** Whether the info tooltip icon is shown next to the label. Defaults to `false`. */\n @Input() showTooltip: boolean = false;\n @Input() tooltipText: string = null;\n @Input() tooltipIcon: string = 'pi pi-info-circle';\n constructor(protected translocoService: TranslocoService) {}\n\n ngOnInit() {\n if (this.control != null && this.disabled == true) this.control.disable();\n }\n\n ngAfterViewInit() {}\n\n /**\n * Every control's TEMPLATE renders without a control (`*ngIf=\"control\"`, `control?.errors`,\n * spiderly-file's no-control custom uploads), and this was the one shared read that did not —\n * so an absent control took the whole page down through the label rather than rendering\n * label-less: an unhandled TypeError per change-detection pass, which the global ErrorHandler\n * turns into the generic error toast.\n *\n * That fixes the shared path only. `spiderly-autocomplete`, `spiderly-colorpicker` and\n * `spiderly-checkbox` (with `initializeToFalse`) still dereference `control` in their own\n * `ngOnInit`, so those three are not yet safe to hand an absent control.\n */\n getTranslatedLabel(): string {\n return this.label ?? this.control?.labelForDisplay;\n }\n\n getValidationErrrorMessages() {\n if (this.control?.errors && this.control?.dirty) {\n // It should always be one error message for single form control,\n // also i don't need to reassign it to null because it will be shown only when control.valid == false\n return this.control.errors['_'];\n }\n\n return null;\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { BaseControl } from './base-control';\nimport { PrimengOption } from '../entities/primeng-option';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { Namebook } from '../entities/namebook';\n\n@Component({\n selector: 'base-dropdown-control',\n template: '',\n styles: [],\n standalone: false,\n})\nexport class BaseDropdownControl extends BaseControl {\n @Input() options: Namebook[];\n /** Whether an addon button is shown next to the dropdown. Defaults to `false`. */\n @Input() showAddon: boolean = false;\n @Input() addonIcon: string = 'pi pi-ellipsis-h';\n @Input() override placeholder: string =\n this.translocoService.translate('SelectFromTheList');\n @Output() onButtonClick: EventEmitter<null> = new EventEmitter();\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n dropdownMarkAsDirty() {\n this.control.markAsDirty();\n }\n\n addonClick() {\n this.onButtonClick.next(null);\n }\n}\n","import { Component, EventEmitter, Output } from '@angular/core';\nimport { AutoCompleteCompleteEvent } from 'primeng/autocomplete';\nimport { BaseDropdownControl } from './base-dropdown-control';\n\n@Component({\n selector: 'base-autocomplete-control',\n template: '',\n styles: [],\n standalone: false,\n})\nexport class BaseAutocompleteControl extends BaseDropdownControl {\n @Output() onTextInput: EventEmitter<AutoCompleteCompleteEvent> =\n new EventEmitter();\n}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'required',\n templateUrl: './required.component.html',\n styles: [],\n standalone: true,\n})\nexport class RequiredComponent {\n constructor() {}\n}\n","<span style=\"color: red; margin-left: 4px\">*</span>\n","import {\n FormArray,\n FormControl,\n FormControlOptions,\n FormGroup,\n ValidatorFn,\n} from '@angular/forms';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { MenuItem } from 'primeng/api';\nimport { Observable } from 'rxjs';\nimport { SchemaAwareConstructor } from '../../entities/base-entity';\nimport { Namebook } from '../../entities/namebook';\nimport { BaseFormService } from '../../services/base-form.service';\nimport { BaseEntity } from './../../entities/base-entity';\n\nexport interface SpiderlyValidatorFn extends ValidatorFn {\n hasNotEmptyRule?: boolean;\n}\n\n// It's made like generic type because of <number>, <string> etc. not to put class like User.\nexport class SpiderlyFormControl<T = any> extends FormControl<T> {\n /**\n * Control name stored in label because it was easier than really accessing the FormControl's name\n */\n public label: string;\n /**\n * Translated label\n */\n public labelForDisplay: string;\n public required: boolean;\n public parentClassName: string;\n public type: string; // number, Date, string, Namebook[], number[]...\n private _spiderlyValidator: SpiderlyValidatorFn | null;\n\n constructor(\n value: any,\n opts: FormControlOptions = null,\n required: boolean = false,\n ) {\n opts = opts ?? { updateOn: 'blur' };\n super(value, opts);\n this.required = required;\n }\n\n override getRawValue(): T {\n // Doing this because .value gets only not disabled values\n return super.getRawValue() as T;\n }\n\n public override get validator(): SpiderlyValidatorFn | null {\n return this._spiderlyValidator;\n }\n\n public override set validator(validator: SpiderlyValidatorFn | null) {\n this._spiderlyValidator = validator;\n this.setValidators(validator);\n }\n}\n\ntype SpiderlyControlsOfType<TValue> = {\n [P in keyof TValue]: TValue[P] extends (infer U)[]\n ? U extends Namebook | string | number | Date | boolean\n ? SpiderlyFormControl<TValue[P]>\n : SpiderlyFormArray<U>\n : TValue[P] extends Date\n ? SpiderlyFormControl<TValue[P]>\n : TValue[P] extends object\n ? SpiderlyFormGroup<TValue[P]>\n : SpiderlyFormControl<TValue[P]>;\n};\n\nexport class SpiderlyFormGroup<TValue = any> extends FormGroup {\n declare controls: SpiderlyControlsOfType<TValue>;\n\n constructor(controls: SpiderlyControlsOfType<TValue>) {\n super(controls);\n }\n\n override getRawValue(): TValue {\n // Doing this because .value gets only not disabled values\n return super.getRawValue() as TValue;\n }\n\n public targetClass: SchemaAwareConstructor<TValue>;\n public trackingId: string = crypto.randomUUID();\n public name?: string; // Using for nested form groups\n public saveObservableMethod?: (saveBody: any) => Observable<any>;\n // TODO: Delete controlNamesFromHtml and add UIDoNotGenerate flag into ng entity generator, we shouldn't even add those into parentFormGroup\n public controlNamesFromHtml?: string[] = [];\n\n public getControl = <TKey extends Extract<keyof TValue, string>>(\n formControlName: TKey,\n ): SpiderlyControlsOfType<TValue>[TKey] => {\n if (\n this.controlNamesFromHtml.findIndex((x) => x === formControlName) === -1\n )\n this.controlNamesFromHtml.push(formControlName);\n\n let formControl = this.controls[formControlName];\n if (formControl == null) {\n console.error(\n `Spiderly: The property ${formControlName} in the form group ${this.targetClass.typeName} doesn't exist`,\n );\n return null;\n }\n\n return formControl;\n };\n}\n\nexport class SpiderlyFormArray<\n TValue extends BaseEntity = any,\n> extends FormArray {\n constructor(\n controls: SpiderlyControlsOfType<TValue>[],\n private translocoService: TranslocoService,\n private baseFormService: BaseFormService,\n ) {\n super(controls);\n }\n\n public label: string;\n public labelForDisplay: string;\n override value: TValue[]; // There is no getRawValue in FormArray\n public required: boolean;\n public formGroupInitialValues: Partial<TValue> = {};\n public targetClass: SchemaAwareConstructor<TValue>;\n public lastMenuIconIndexClicked: number;\n\n public getCrudMenuForOrderedData = () => {\n let crudMenuForOrderedData: MenuItem[] = [\n {\n label: this.translocoService.translate('Remove'),\n icon: 'pi pi-minus',\n command: () => {\n this.baseFormService.removeFormControlFromTheFormArray(\n this,\n this.lastMenuIconIndexClicked,\n );\n },\n },\n {\n label: this.translocoService.translate('AddAbove'),\n icon: 'pi pi-arrow-up',\n command: () => {\n this.baseFormService.addNewFormGroupToFormArray(\n this,\n this.targetClass,\n this.formGroupInitialValues,\n this.lastMenuIconIndexClicked,\n );\n },\n },\n {\n label: this.translocoService.translate('AddBelow'),\n icon: 'pi pi-arrow-down',\n command: () => {\n this.baseFormService.addNewFormGroupToFormArray(\n this,\n this.targetClass,\n this.formGroupInitialValues,\n this.lastMenuIconIndexClicked + 1,\n );\n },\n },\n ];\n\n return crudMenuForOrderedData;\n };\n\n public addNewFormGroup = (index: number) => {\n this.baseFormService.addNewFormGroupToFormArray(\n this,\n this.targetClass,\n this.formGroupInitialValues,\n index,\n );\n };\n\n public getFormGroups = () => {\n return this.controls as SpiderlyFormGroup<TValue>[];\n };\n\n disableAllFormControls() {\n this.controls.forEach((segmentationItemFormGroup: SpiderlyFormGroup) => {\n Object.keys(segmentationItemFormGroup.controls).forEach((key) => {\n segmentationItemFormGroup.controls[key].disable();\n });\n });\n }\n\n enableAllFormControls() {\n this.controls.forEach((segmentationItemFormGroup: SpiderlyFormGroup) => {\n Object.keys(segmentationItemFormGroup.controls).forEach((key) => {\n segmentationItemFormGroup.controls[key].enable();\n });\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ValidationErrors } from '@angular/forms';\nimport { TranslocoService } from '@jsverse/transloco';\nimport {\n SpiderlyFormArray,\n SpiderlyFormControl,\n SpiderlyValidatorFn,\n} from '../components/spiderly-form-control/spiderly-form-control';\nimport { ImageDimensionsValidationResult } from '../entities/image-dimensions-validation-result';\n\n@Injectable({\n providedIn: 'root',\n})\nexport abstract class ValidatorAbstractService {\n constructor(protected translocoService: TranslocoService) {}\n\n abstract setValidator(\n formControl: SpiderlyFormControl,\n className: string,\n ): SpiderlyValidatorFn;\n\n abstract setFormArrayValidator(\n formArray: SpiderlyFormArray,\n className: string,\n ): void;\n\n validateImageDimensions(\n file: File,\n imageWidth: number,\n imageHeight: number,\n ): Promise<ImageDimensionsValidationResult> {\n return new Promise((resolve) => {\n const img = new Image();\n const objectUrl = URL.createObjectURL(file);\n\n img.onload = () => {\n URL.revokeObjectURL(objectUrl);\n const width = img.width;\n const height = img.height;\n const errors: string[] = [];\n\n if (imageWidth > 0 && width !== imageWidth) {\n errors.push(\n this.translocoService.translate('ImageWidthMustBeExact', {\n 0: imageWidth,\n 1: width,\n }),\n );\n }\n\n if (imageHeight > 0 && height !== imageHeight) {\n errors.push(\n this.translocoService.translate('ImageHeightMustBeExact', {\n 0: imageHeight,\n 1: height,\n }),\n );\n }\n\n resolve({ isValid: errors.length === 0, errors });\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(objectUrl);\n resolve({ isValid: true, errors: [] });\n };\n\n img.src = objectUrl;\n });\n }\n\n notEmpty = (control: SpiderlyFormControl): void => {\n const validator: SpiderlyValidatorFn = (): ValidationErrors | null => {\n const value = control.value;\n\n const notEmptyRule =\n typeof value !== 'undefined' && value !== null && value !== '';\n\n const arrayValid = notEmptyRule;\n\n return arrayValid\n ? null\n : { _: this.translocoService.translate('NotEmpty') };\n };\n validator.hasNotEmptyRule = true;\n control.required = true;\n control.validator = validator;\n control.updateValueAndValidity();\n };\n\n /** Validates that a SpiderlyFormArray (collection of form controls/groups) is not empty. */\n isFormArrayEmpty = (control: SpiderlyFormArray): void => {\n const validator: SpiderlyValidatorFn = (): ValidationErrors | null => {\n const value = control;\n\n const notEmptyRule =\n typeof value !== 'undefined' && value !== null && value.length !== 0;\n\n const arrayValid = notEmptyRule;\n\n return arrayValid\n ? null\n : {\n _: this.translocoService.translate('ListCanNotBeEmpty', {\n value: control.labelForDisplay,\n }),\n };\n };\n validator.hasNotEmptyRule = true;\n control.required = true;\n control.setValidators(validator);\n control.updateValueAndValidity();\n };\n\n /** Validates that a SpiderlyFormControl holding an array value (e.g., multi-select dropdown) is not empty. */\n isArrayEmpty = (control: SpiderlyFormControl): SpiderlyValidatorFn => {\n const validator: SpiderlyValidatorFn = (): ValidationErrors | null => {\n const value = control.value;\n\n const notEmptyRule =\n typeof value !== 'undefined' && value !== null && value.length !== 0;\n\n const arrayValid = notEmptyRule;\n\n return arrayValid\n ? null\n : { _: this.translocoService.translate('NotEmpty') };\n };\n validator.hasNotEmptyRule = true;\n control.required = true;\n return validator;\n };\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport {\n AutoCompleteCompleteEvent,\n AutoCompleteModule,\n AutoCompleteSelectEvent,\n} from 'primeng/autocomplete';\nimport { InputGroupModule } from 'primeng/inputgroup';\nimport { InputGroupAddonModule } from 'primeng/inputgroupaddon';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { ValidatorAbstractService } from '../../services/validator-abstract.service';\nimport { BaseAutocompleteControl } from '../base-autocomplete-control';\nimport { SpiderlyFormControl } from '../../components/spiderly-form-control/spiderly-form-control';\nimport { Namebook } from '../../entities/namebook';\n\n@Component({\n selector: 'spiderly-autocomplete',\n templateUrl: './spiderly-autocomplete.component.html',\n imports: [\n ReactiveFormsModule,\n FormsModule,\n AutoCompleteModule,\n InputGroupAddonModule,\n InputGroupModule,\n CommonModule,\n RequiredComponent,\n TranslocoDirective,\n ],\n})\nexport class SpiderlyAutocompleteComponent\n extends BaseAutocompleteControl\n implements OnInit\n{\n @Input() appendTo: any = 'body';\n /** Whether a clear button is shown. Defaults to `true`. */\n @Input() showClear: boolean = true;\n @Input() emptyMessage: string;\n @Input() displayName: string; // Added because when we initialize the object options are null\n helperFormControl = new SpiderlyFormControl<Namebook>(null, {\n updateOn: 'change',\n });\n\n constructor(\n protected override translocoService: TranslocoService,\n private validatorService: ValidatorAbstractService,\n ) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n\n this.helperFormControl.label = this.control.label;\n this.validatorService.setValidator(\n this.helperFormControl,\n this.control.parentClassName,\n );\n\n if (this.control.value != null)\n this.helperFormControl.setValue({\n displayName: this.displayName,\n id: this.control.value,\n });\n\n if (this.emptyMessage == null) {\n this.emptyMessage = this.translocoService.translate('EmptyMessage');\n }\n }\n\n search(event: AutoCompleteCompleteEvent) {\n this.onTextInput.next(event);\n }\n\n select(event: AutoCompleteSelectEvent) {\n const selectedOption: Namebook = event.value;\n this.control.setValue(selectedOption.id);\n this.helperFormControl.setValue({\n displayName: selectedOption.displayName,\n id: selectedOption.id,\n });\n }\n\n clear() {\n this.control.setValue(null);\n this.helperFormControl.setValue(null);\n }\n\n autocompleteMarkAsDirty() {\n this.dropdownMarkAsDirty();\n this.helperFormControl.markAsDirty();\n }\n}\n","<ng-container *transloco=\"let t\">\n <div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div *ngIf=\"getTranslatedLabel() != '' && getTranslatedLabel() != null\">\n <!-- By passing an empty string we remove the label entirely -->\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n\n <!-- Don't support p-inputgroup -->\n <p-autocomplete\n *ngIf=\"control\"\n [id]=\"label\"\n [formControl]=\"helperFormControl\"\n [placeholder]=\"placeholder\"\n [suggestions]=\"options\"\n (completeMethod)=\"search($event)\"\n [forceSelection]=\"true\"\n [dropdown]=\"false\"\n [showClear]=\"showClear\"\n (onHide)=\"autocompleteMarkAsDirty()\"\n (onSelect)=\"select($event)\"\n (onClear)=\"clear()\"\n [completeOnFocus]=\"true\"\n [fluid]=\"true\"\n [style]=\"{ width: '100%' }\"\n [appendTo]=\"appendTo\"\n [emptyMessage]=\"emptyMessage\"\n [lazy]=\"true\"\n optionLabel=\"displayName\"\n ></p-autocomplete>\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n </div>\n</ng-container>\n","import { HttpResponse } from '@angular/common/http';\nimport * as FileSaver from 'file-saver';\nimport mime from 'mime';\nimport 'reflect-metadata';\nimport { map, Observable } from 'rxjs';\nimport {\n Action,\n Column,\n} from '../components/spiderly-data-table/spiderly-data-table.component';\nimport { SpiderlyTab } from '../components/spiderly-panels/panel-header/panel-header.component';\nimport { Codebook } from '../entities/codebook';\nimport { Filter } from '../entities/filter';\nimport { Namebook } from '../entities/namebook';\nimport { FilterOption } from '../filters/filter-store';\nimport { PrimengOption } from '../entities/primeng-option';\n\n// Helper function for PrecisionScale validation (to be added in the TypeScript output):\nexport function validatePrecisionScale(\n value: any,\n precision: number,\n scale: number,\n ignoreTrailingZeros: boolean,\n): boolean {\n if (typeof value !== 'number') return false;\n const [integerPart, decimalPart] = value.toString().split('.');\n if (integerPart.length > precision - scale) return false;\n if (decimalPart && decimalPart.length > scale) return false;\n if (\n !ignoreTrailingZeros &&\n decimalPart &&\n decimalPart.replace(/0+$/, '').length > scale\n )\n return false;\n return true;\n}\n\nexport function getMimeTypeForFileName(fileName: string): string {\n return mime.getType(fileName) ?? 'application/octet-stream';\n}\n\nexport function adjustColor(color: string, percent: number): string {\n if (!/^#([0-9A-F]{3}){1,2}$/i.test(color)) {\n console.error('Invalid hex color format');\n }\n\n let r: number, g: number, b: number;\n if (color.length === 7) {\n r = parseInt(color.slice(1, 3), 16);\n g = parseInt(color.slice(3, 5), 16);\n b = parseInt(color.slice(5, 7), 16);\n } else {\n r = parseInt(color[1] + color[1], 16);\n g = parseInt(color[2] + color[2], 16);\n b = parseInt(color[3] + color[3], 16);\n }\n\n const adjust = (value: number, percent: number): number => {\n const amount = (percent / 100) * 255;\n const newValue = Math.min(Math.max(value + amount, 0), 255);\n return Math.round(newValue);\n };\n\n r = adjust(r, percent);\n g = adjust(g, percent);\n b = adjust(b, percent);\n\n const toHex = (value: number): string => {\n const hex = value.toString(16).padStart(2, '0');\n return hex;\n };\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\n// new Date('yyyy-MM-dd') is parsed as UTC midnight per the JS spec, which shifts to the previous day\n// in negative-UTC locales. Construct via numeric components to anchor at local midnight instead.\nexport function parseDateOnlyLocal(s: string): Date | null {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(s);\n if (!m) return null;\n return new Date(+m[1], +m[2] - 1, +m[3]);\n}\n\nexport function getHtmlImgDisplayString64(base64String: string) {\n if (base64String == null) return null;\n\n const [header, base64Content] = base64String.split(';base64,');\n const fileName = header.split('=')[1];\n const mimeType = getMimeTypeForFileName(fileName);\n return `data:${mimeType};base64, ${base64Content}`;\n}\n\nexport function nameof<TObject>(obj: TObject, key: keyof TObject): string;\nexport function nameof<TObject>(key: keyof TObject): string;\nexport function nameof(key1: any, key2?: any): any {\n return key2 ?? key1;\n}\nexport function nameOf<TObject extends { name: S }, S extends string>(\n funcOrClass: TObject,\n): S {\n return funcOrClass.name;\n}\n\nexport function getParentUrl(currentUrl: string) {\n const urlSegments = currentUrl.split('/');\n urlSegments.pop();\n const parentUrl = urlSegments.join('/');\n return parentUrl;\n}\n\n// export function getMonth(number: number): string {\n// const months: string[] = [\n// \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n// \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n// ];\n\n// if (number < 1 || number > 12) {\n// throw new Error(\"Invalid month number. It should be between 1 and 12.\");\n// }\n\n// return months[number - 1];\n// }\n\nexport function getMonth(numberOfTheMonth: number): string {\n const meseci: string[] = [\n 'Januar',\n 'Februar',\n 'Mart',\n 'April',\n 'Maj',\n 'Jun',\n 'Jul',\n 'Avgust',\n 'Septembar',\n 'Oktobar',\n 'Novembar',\n 'Decembar',\n ];\n\n if (numberOfTheMonth < 1 || numberOfTheMonth > 12) {\n console.error('Nevažeći broj meseca. Broj treba biti između 1 i 12.');\n }\n\n return meseci[numberOfTheMonth - 1];\n}\n\nexport function singleOrDefault<T>(\n array: T[],\n predicate: (item: T) => boolean,\n): T | undefined {\n const filtered = array.filter(predicate);\n if (filtered.length > 1) {\n throw new Error('Sequence contains more than one matching element.');\n }\n return filtered[0];\n}\n\nexport function pushAction(cols: Column[], action: Action) {\n const actionsColumn = singleOrDefault(cols, (x) => x.actions != null);\n if (actionsColumn) {\n actionsColumn.actions = [...actionsColumn.actions, action];\n }\n}\n\nexport function deleteAction(cols: Column[], actionField: string): void {\n const actionsColumn = singleOrDefault(cols, (x) => x.actions != null);\n\n if (actionsColumn && actionsColumn.actions) {\n const index = actionsColumn.actions.findIndex(\n (a) => a.field === actionField,\n );\n if (index !== -1) {\n actionsColumn.actions.splice(index, 1);\n }\n }\n}\n\nexport function getFileNameFromContentDisposition(\n resp: HttpResponse<Blob>,\n defaultName: string,\n): string {\n let fileName;\n if (resp && resp.headers && resp.headers.get('Content-Disposition')) {\n let val = resp.headers.get('Content-Disposition');\n let start = val.indexOf('filename=');\n if (start != -1) {\n let end = val.indexOf(';', start);\n fileName =\n end != -1 ? val.substring(start + 9, end) : val.substring(start + 9);\n fileName = fileName.split('\"').join('');\n }\n }\n return fileName ?? defaultName;\n}\n\nexport function toCommaSeparatedString<T>(input: T[]): string {\n const stringList = input.map((item) => item?.toString() ?? '');\n\n if (stringList.length > 1) {\n return `${stringList.slice(0, -1).join(', ')} and ${stringList[stringList.length - 1]}`;\n } else {\n return stringList[0] ?? '';\n }\n}\n\nexport function isFileImageType(mimeType: string): boolean {\n if (mimeType.startsWith('image/')) {\n return true;\n }\n\n return false;\n}\n\nexport function isExcelFileType(mimeType: string): boolean {\n if (\n mimeType ===\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||\n mimeType === 'application/vnd.ms-excel'\n ) {\n return true;\n }\n\n return false;\n}\n\nexport function saveResponseAsFile(\n res: HttpResponse<Blob>,\n fallbackName: string,\n): void {\n if (res?.body == null) {\n return;\n }\n let fileName = getFileNameFromContentDisposition(res, fallbackName);\n FileSaver.saveAs(res.body, decodeURIComponent(fileName));\n}\n\nexport function exportListToExcel(\n exportListToExcelObservableMethod: (filter: Filter) => Observable<any>,\n filter: Filter,\n) {\n exportListToExcelObservableMethod(filter).subscribe((res) => {\n saveResponseAsFile(res, 'ExcelExport.xlsx');\n });\n}\n\nexport function getPrimengNamebookOptions(\n namebookList: Namebook[],\n): PrimengOption[] {\n return namebookList.map((x) => ({ label: x.displayName, code: x.id }));\n}\n\n/**\n * The filter store's twin of `getPrimengNamebookOptions` — same namebook in, the store's\n * `{ value, label }` shape out (a `FilterOption` is not a `PrimengOption`: that one's `code` is\n * deliberate, see `primeng-option.ts`). Every consumer filling a pick-list filter from a lookup\n * needs this map; without it each page re-derives the three lines.\n */\nexport function getFilterOptions(namebookList: Namebook[]): FilterOption[] {\n return namebookList.map((x) => ({ value: x.id, label: x.displayName }));\n}\n\nexport function getPrimengDropdownNamebookOptions(\n getDropdownListObservable: (\n parentEntityId?: number,\n ) => Observable<Namebook[]>,\n parentEntityId?: number,\n): Observable<PrimengOption[]> {\n return getDropdownListObservable(parentEntityId ?? 0).pipe(\n map((res) => getPrimengNamebookOptions(res)),\n );\n}\n\nexport function getPrimengDropdownCodebookOptions(\n getDropdownListObservable: () => Observable<Codebook[]>,\n): Observable<PrimengOption[]> {\n return getDropdownListObservable().pipe(\n map((res) => {\n return res.map((x) => ({ label: x.displayName, code: x.code }));\n }),\n );\n}\n\nexport function getPrimengAutocompleteNamebookOptions(\n getAutocompleteListObservable: (\n limit: number,\n query: string,\n parentEntityId?: number,\n ) => Observable<Namebook[]>,\n limit: number,\n query: string,\n parentEntityId?: number,\n): Observable<PrimengOption[]> {\n return getAutocompleteListObservable(limit, query, parentEntityId ?? 0).pipe(\n map((res) => {\n return res.map((x) => ({ label: x.displayName, code: x.id }));\n }),\n );\n}\n\nexport function getPrimengAutocompleteCodebookOptions(\n getAutocompleteListObservable: (\n limit: number,\n query: string,\n ) => Observable<Codebook[]>,\n limit: number,\n query: string,\n): Observable<PrimengOption[]> {\n return getAutocompleteListObservable(limit, query).pipe(\n map((res) => {\n return res.map((x) => ({ label: x.displayName, code: x.code }));\n }),\n );\n}\n\nexport const isNullOrEmpty = (input: string) => {\n if (input == null || input === '') {\n return true;\n }\n\n return false;\n};\n\nexport const selectedTab = (tabs: SpiderlyTab[]): number => {\n const tab = singleOrDefault(tabs, (x) => x.isSelected);\n\n if (tab) {\n return tab.id;\n } else {\n return null;\n }\n};\n\nexport function firstCharToUpper(input: string): string {\n return input.charAt(0).toUpperCase() + input.slice(1);\n}\n\nexport function splitPascalCase(input: string) {\n const regex = /($[a-z])|[A-Z][^A-Z]+/g;\n return input.match(regex).join(' ');\n}\n\nexport function capitalizeFirstChar(str: string): string {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport function kebabToTitleCase(input: string): string {\n return input\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\nexport const PROPS_KEY = Symbol('props');\n\nexport function ReflectProp(target: any, propertyKey: string) {\n const props = Reflect.getMetadata(PROPS_KEY, target) || [];\n Reflect.defineMetadata(PROPS_KEY, [...props, propertyKey], target);\n}\n\nexport function getImageDimensions(\n file: File,\n): Promise<{ width: number; height: number }> {\n return new Promise((resolve) => {\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.width, height: img.height });\n URL.revokeObjectURL(img.src);\n };\n img.src = URL.createObjectURL(file);\n });\n}\n\n/**\n * Scrolls `element` back under the top of the viewport, but only when it has already scrolled\n * above it. Set the element's `scroll-margin-top` to whatever fixed chrome must stay clear.\n * Assumes the element's nearest scroll container is the viewport itself.\n */\n// This is the one full telling of the three decisions below; paging is the caller (see\n// spiderly-data-table/CLAUDE.md → \"Scroll back to the table on page change\").\n// - The offset is READ from CSS rather than passed in, so the amount of fixed chrome to clear\n// stays declared in one place per component and no TypeScript knows the shell's dimensions.\n// That read is also why the viewport assumption above matters: getBoundingClientRect is\n// viewport-relative, so inside a consumer's own overflow container it measures the wrong box.\n// - The early return is what stops a list sitting BELOW other page content (a table inside a\n// details form) from shoving that content off-screen when it was already visible.\n// - `behavior: 'instant'` overrides the element's CSS `scroll-behavior`; `'auto'` defers to it,\n// so an app setting `html { scroll-behavior: smooth }` would animate every call.\nexport function scrollElementIntoViewIfAboveViewport(element: HTMLElement): void {\n const offset = parseFloat(getComputedStyle(element).scrollMarginTop) || 0;\n if (element.getBoundingClientRect().top >= offset) return;\n\n element.scrollIntoView({\n block: 'start',\n inline: 'nearest',\n behavior: 'instant',\n });\n}\n","import { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { BaseControl } from '../base-control';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule, FormControl } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { DatePickerModule } from 'primeng/datepicker';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { Subscription } from 'rxjs';\nimport { parseDateOnlyLocal } from '../../services/helper-functions';\n\n@Component({\n selector: 'spiderly-calendar',\n templateUrl: './spiderly-calendar.component.html',\n styles: [],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n DatePickerModule,\n TooltipModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyCalendarComponent extends BaseControl implements OnInit, OnDestroy {\n /** Whether the time picker is shown in addition to the date. Defaults to `false`. */\n @Input() showTime: boolean = false;\n @Input() dateOnly: boolean = false;\n @Input() timeOnly: boolean = false;\n\n internalControl = new FormControl<Date | null>(null);\n\n private syncing = false;\n private subscriptions: Subscription[] = [];\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n\n if (!this.usesStringProxy() || !this.control) return;\n\n this.applyFromOuter(this.control.value);\n if (this.control.disabled) this.internalControl.disable({ emitEvent: false });\n\n this.subscriptions.push(\n this.control.valueChanges.subscribe((v) => {\n if (!this.syncing) this.applyFromOuter(v);\n })\n );\n this.subscriptions.push(\n this.control.statusChanges.subscribe((status) => {\n if (status === 'DISABLED' && this.internalControl.enabled)\n this.internalControl.disable({ emitEvent: false });\n else if (status !== 'DISABLED' && this.internalControl.disabled)\n this.internalControl.enable({ emitEvent: false });\n })\n );\n this.subscriptions.push(\n this.internalControl.valueChanges.subscribe((d) => {\n if (!this.syncing) this.applyToOuter(d);\n })\n );\n }\n\n ngOnDestroy() {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n setDate(event: Date) {}\n\n usesStringProxy(): boolean {\n return this.dateOnly || this.timeOnly;\n }\n\n private applyFromOuter(v: unknown): void {\n this.syncing = true;\n try {\n if (v == null) {\n this.internalControl.setValue(null);\n } else if (this.dateOnly && typeof v === 'string') {\n this.internalControl.setValue(parseDateOnlyLocal(v));\n } else if (this.timeOnly && typeof v === 'string') {\n this.internalControl.setValue(this.parseTimeOnly(v));\n } else if (v instanceof Date) {\n this.internalControl.setValue(v);\n } else {\n this.internalControl.setValue(null);\n }\n } finally {\n this.syncing = false;\n }\n }\n\n private applyToOuter(d: Date | null): void {\n this.syncing = true;\n try {\n if (d == null) {\n this.control.setValue(null);\n } else if (this.dateOnly) {\n this.control.setValue(this.formatDateOnly(d));\n } else if (this.timeOnly) {\n this.control.setValue(this.formatTimeOnly(d));\n } else {\n this.control.setValue(d);\n }\n } finally {\n this.syncing = false;\n }\n }\n\n private parseTimeOnly(s: string): Date | null {\n const m = /^(\\d{2}):(\\d{2})(?::(\\d{2}))?/.exec(s);\n if (!m) return null;\n const d = new Date();\n d.setHours(+m[1], +m[2], +(m[3] ?? 0), 0);\n return d;\n }\n\n private formatDateOnly(d: Date): string {\n return `${d.getFullYear()}-${this.pad(d.getMonth() + 1)}-${this.pad(d.getDate())}`;\n }\n\n private formatTimeOnly(d: Date): string {\n return `${this.pad(d.getHours())}:${this.pad(d.getMinutes())}:${this.pad(d.getSeconds())}`;\n }\n\n private pad(n: number): string {\n return String(n).padStart(2, '0');\n }\n}\n","<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div\n *ngIf=\"getTranslatedLabel() != '' && getTranslatedLabel() != null\"\n style=\"display: flex; align-items: center\"\n >\n <div>\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n <!-- tabindex=\"-1\": Makes the element focusable, but removes it from the tab order. -->\n <i\n *ngIf=\"showTooltip\"\n class=\"{{ tooltipIcon }}\"\n style=\"margin-left: 8px; cursor: pointer\"\n [pTooltip]=\"tooltipText\"\n tabindex=\"-1\"\n tooltipEvent=\"focus\"\n ></i>\n </div>\n <p-datepicker\n *ngIf=\"control\"\n [formControl]=\"usesStringProxy() ? internalControl : control\"\n (onBlur)=\"control.markAsDirty()\"\n [dateFormat]=\"timeOnly ? '' : 'dd.mm.yy.'\"\n iconDisplay=\"input\"\n [showIcon]=\"true\"\n [showTime]=\"!usesStringProxy() && showTime\"\n [timeOnly]=\"timeOnly\"\n (onSelect)=\"setDate($event)\"\n appendTo=\"body\"\n [fluid]=\"true\"\n />\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { BaseControl } from '../base-control';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { CheckboxChangeEvent, CheckboxModule } from 'primeng/checkbox';\n\n@Component({\n selector: 'spiderly-checkbox',\n templateUrl: './spiderly-checkbox.component.html',\n styleUrl: './spiderly-checkbox.component.scss',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n CheckboxModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyCheckboxComponent extends BaseControl implements OnInit {\n @Input() fakeLabel = true;\n @Input() initializeToFalse = false;\n @Input() inlineLabel = false;\n @Output() onChange = new EventEmitter<CheckboxChangeEvent>();\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n if (this.initializeToFalse == true) this.control.setValue(false);\n\n super.ngOnInit();\n }\n\n change = (event: CheckboxChangeEvent) => {\n this.onChange.next(event);\n };\n}\n","<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div\n *ngIf=\"\n inlineLabel === false &&\n getTranslatedLabel() != '' &&\n getTranslatedLabel() != null\n \"\n >\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n <div style=\"margin-top: 0.5rem; position: relative\">\n <!-- The margin-top is intentional: it vertically aligns the checkbox with other input controls that have greater height. -->\n <p-checkbox\n *ngIf=\"control\"\n [formControl]=\"control\"\n [value]=\"inlineLabel ? label : null\"\n [id]=\"label\"\n [binary]=\"true\"\n (onChange)=\"change($event)\"\n />\n </div>\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { BaseControl } from '../base-control';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { CommonModule } from '@angular/common';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { ColorPickerModule } from 'primeng/colorpicker';\nimport { InputTextModule } from 'primeng/inputtext';\n\n@Component({\n selector: 'spiderly-colorpicker',\n templateUrl: './spiderly-colorpicker.component.html',\n styles: [],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n ColorPickerModule,\n InputTextModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyColorPickerComponent\n extends BaseControl\n implements OnInit\n{\n /** Whether a hex text input is shown alongside the color swatch. Defaults to `true`. */\n @Input() showInputTextField: boolean = true;\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n this.control.valueChanges.subscribe((value) => {\n this.control.setValue(value, { emitEvent: false }); // Preventing infinite loop\n });\n\n if (this.control.value == null)\n this.placeholder = this.translocoService.translate(\n 'ColorPickerPlaceholder',\n );\n\n super.ngOnInit();\n }\n}\n","<!-- Can't put (onBlur) in this control -->\n\n<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div *ngIf=\"getTranslatedLabel() != '' && getTranslatedLabel() != null\">\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n <div style=\"display: flex; gap: 10px\">\n <input\n *ngIf=\"control && showInputTextField\"\n pInputText\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [id]=\"control.label\"\n (blur)=\"control.markAsDirty()\"\n [fluid]=\"true\"\n />\n <p-colorpicker\n *ngIf=\"control\"\n [formControl]=\"control\"\n [id]=\"control.label\"\n (blur)=\"control.markAsDirty()\"\n appendTo=\"body\"\n ></p-colorpicker>\n </div>\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport {\n AutoCompleteCompleteEvent,\n AutoCompleteModule,\n} from 'primeng/autocomplete';\nimport { BaseAutocompleteControl } from '../base-autocomplete-control';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\n\n@Component({\n selector: 'spiderly-multiautocomplete',\n templateUrl: './spiderly-multiautocomplete.component.html',\n imports: [\n ReactiveFormsModule,\n FormsModule,\n AutoCompleteModule,\n CommonModule,\n RequiredComponent,\n TranslocoDirective,\n ],\n})\nexport class SpiderlyMultiAutocompleteComponent\n extends BaseAutocompleteControl\n implements OnInit\n{\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n }\n\n search(event: AutoCompleteCompleteEvent) {\n this.onTextInput.next(event);\n }\n}\n","<ng-container *transloco=\"let t\">\n <div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div>\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n\n <!-- Don't support p-inputgroup -->\n <!-- Showing label fix: https://github.com/primefaces/primeng/issues/17332#issuecomment-2922861294 -->\n <p-autocomplete\n *ngIf=\"control\"\n [id]=\"label\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [suggestions]=\"options\"\n (completeMethod)=\"search($event)\"\n [forceSelection]=\"true\"\n [multiple]=\"true\"\n [dropdown]=\"false\"\n [showClear]=\"true\"\n (onHide)=\"dropdownMarkAsDirty()\"\n [completeOnFocus]=\"true\"\n dropdownIcon=\"pi pi-plus\"\n [fluid]=\"true\"\n [style]=\"{ width: '100%' }\"\n appendTo=\"body\"\n optionLabel=\"displayName\"\n dataKey=\"id\"\n >\n </p-autocomplete>\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n </div>\n</ng-container>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { BaseControl } from '../base-control';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { CommonModule } from '@angular/common';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { PasswordModule } from 'primeng/password';\n\n@Component({\n selector: 'spiderly-password',\n templateUrl: './spiderly-password.component.html',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n PasswordModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyPasswordComponent extends BaseControl implements OnInit {\n /** Whether a password-strength meter is shown below the field. Defaults to `false`. */\n @Input() showPasswordStrength: boolean = false;\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n }\n}\n","<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div>\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n <p-password\n *ngIf=\"control\"\n [formControl]=\"control\"\n [id]=\"control?.label\"\n [toggleMask]=\"true\"\n [feedback]=\"showPasswordStrength\"\n (onBlur)=\"control?.markAsDirty()\"\n [style]=\"{ width: '100%' }\"\n [inputStyle]=\"{ width: '100%' }\"\n />\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { BaseControl } from '../base-control';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { CommonModule } from '@angular/common';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { InputTextModule } from 'primeng/inputtext';\n\n@Component({\n selector: 'spiderly-textbox',\n templateUrl: './spiderly-textbox.component.html',\n styleUrl: '../base-controls.scss',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n InputTextModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyTextboxComponent extends BaseControl implements OnInit {\n /** Whether an icon button is appended to the input. Defaults to `false`. */\n @Input() showButton: boolean = false;\n @Input() buttonIcon: string;\n @Output() onButtonClick = new EventEmitter();\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n }\n\n buttonClick() {\n this.onButtonClick.next(null);\n }\n}\n","<!-- Can't put (onBlur) in this control -->\n\n<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div *ngIf=\"getTranslatedLabel() != '' && getTranslatedLabel() != null\">\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n <div class=\"spiderly-inputgroup\">\n <input\n *ngIf=\"control\"\n pInputText\n [formControl]=\"control\"\n [id]=\"control.label\"\n (blur)=\"control.markAsDirty()\"\n [placeholder]=\"placeholder\"\n [fluid]=\"true\"\n />\n <span\n *ngIf=\"showButton\"\n (click)=\"buttonClick()\"\n class=\"spiderly-inputgroup-addon\"\n >\n <i class=\"{{ buttonIcon }}\"></i>\n </span>\n </div>\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { BaseDropdownControl } from '../base-dropdown-control';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { MultiSelectModule } from 'primeng/multiselect';\n\n@Component({\n selector: 'spiderly-multiselect',\n templateUrl: './spiderly-multiselect.component.html',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n MultiSelectModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyMultiSelectComponent\n extends BaseDropdownControl\n implements OnInit\n{\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n }\n}\n","<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div>\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n <p-multiSelect\n *ngIf=\"control\"\n [id]=\"label\"\n [formControl]=\"control\"\n [options]=\"options\"\n optionLabel=\"displayName\"\n optionValue=\"id\"\n display=\"chip\"\n [maxSelectedLabels]=\"20\"\n [placeholder]=\"placeholder\"\n [fluid]=\"true\"\n appendTo=\"body\"\n />\n <!-- [virtualScroll]=\"true\" FT: I think that this is not doing anything, check -->\n <!-- (onFilter)=\"search($event)\" FT: While they don't implement lazy load like here: https://github.com/yelhouti/primeng/blob/8.0.0-rc2/src/app/components/multiselect/multiselect.ts\n we need to use this and dropdown control only on the client -->\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { BaseControl } from '../base-control';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { CommonModule } from '@angular/common';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { TextareaModule } from 'primeng/textarea';\n\n@Component({\n selector: 'spiderly-textarea',\n templateUrl: './spiderly-textarea.component.html',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n TextareaModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyTextareaComponent extends BaseControl implements OnInit {\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n }\n}\n","<!-- Can't put (onBlur) in this control -->\n\n<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div>\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n <textarea\n *ngIf=\"control\"\n pTextarea\n [formControl]=\"control\"\n [id]=\"control.label\"\n (blur)=\"control.markAsDirty()\"\n [autoResize]=\"true\"\n [class]=\"control.disabled ? 'disabled' : ''\"\n ></textarea>\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { BaseControl } from '../base-control';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { CommonModule } from '@angular/common';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { InputNumberModule } from 'primeng/inputnumber';\n\n@Component({\n selector: 'spiderly-number',\n templateUrl: './spiderly-number.component.html',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n InputNumberModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyNumberComponent extends BaseControl implements OnInit {\n @Input() prefix: string;\n /** Whether increment/decrement spinner buttons are shown. Defaults to `true`. */\n @Input() showButtons: boolean = true;\n @Input() decimal: boolean;\n @Input() maxFractionDigits: number = 0;\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n }\n}\n","<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div *ngIf=\"showLabel\">\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n <p-inputNumber\n *ngIf=\"control\"\n [formControl]=\"control\"\n [id]=\"control.label\"\n (onBlur)=\"control.markAsDirty()\"\n [prefix]=\"prefix\"\n [style]=\"{ width: '100%' }\"\n [inputStyle]=\"{ width: '100%' }\"\n [showButtons]=\"showButtons\"\n buttonLayout=\"horizontal\"\n [maxFractionDigits]=\"maxFractionDigits\"\n />\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { BaseDropdownControl } from '../base-dropdown-control';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { DropdownChangeEvent } from 'primeng/dropdown';\nimport { SelectModule } from 'primeng/select';\nimport { TooltipModule } from 'primeng/tooltip';\n\n@Component({\n selector: 'spiderly-dropdown',\n templateUrl: './spiderly-dropdown.component.html',\n styles: [],\n imports: [\n ReactiveFormsModule,\n FormsModule,\n SelectModule,\n TooltipModule,\n CommonModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyDropdownComponent\n extends BaseDropdownControl\n implements OnInit\n{\n @Input() isBooleanPicker: boolean = false;\n @Output() onChange = new EventEmitter<DropdownChangeEvent>();\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n if (this.isBooleanPicker) {\n this.options = [\n { displayName: this.translocoService.translate('True'), id: true },\n { displayName: this.translocoService.translate('False'), id: false },\n { displayName: this.translocoService.translate('Empty'), id: null },\n ];\n }\n\n super.ngOnInit();\n }\n\n change(event: DropdownChangeEvent) {\n this.onChange.next(event);\n }\n}\n","<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div *ngIf=\"getTranslatedLabel() != '' && getTranslatedLabel() != null\">\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n <!-- tabindex=\"-1\": Makes the element focusable, but removes it from the tab order. -->\n <i\n *ngIf=\"showTooltip\"\n class=\"{{ tooltipIcon }}\"\n style=\"margin-left: 5px; cursor: pointer\"\n [pTooltip]=\"tooltipText\"\n tabindex=\"-1\"\n tooltipEvent=\"focus\"\n ></i>\n </div>\n\n <!-- Don't support p-inputgroup -->\n <p-select\n *ngIf=\"control\"\n [id]=\"label\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [options]=\"options\"\n optionLabel=\"displayName\"\n optionValue=\"id\"\n [showClear]=\"true\"\n (onHide)=\"dropdownMarkAsDirty()\"\n (onChange)=\"change($event)\"\n [fluid]=\"true\"\n appendTo=\"body\"\n />\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, Input, OnInit, ViewChild } from '@angular/core';\nimport { BaseControl } from '../base-control';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { CommonModule } from '@angular/common';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { Editor, EditorModule, EditorInitEvent } from 'primeng/editor';\nimport { Observable } from 'rxjs';\nimport { EditorImageUploadResult } from '../../entities/editor-image-upload-result';\n\n@Component({\n selector: 'spiderly-editor',\n templateUrl: './spiderly-editor.component.html',\n styles: [],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n EditorModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyEditorComponent extends BaseControl implements OnInit {\n @ViewChild(Editor) editor: Editor;\n\n @Input() uploadImageMethod: (formData: FormData) => Observable<EditorImageUploadResult>;\n @Input() objectId: number = 0;\n /** Mirrors the entity property's [AcceptedFileTypes] so the picker matches what the server validates. */\n @Input() acceptedFileTypes: string[];\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n }\n\n onEditorInit(event: EditorInitEvent) {\n const quill = event.editor;\n\n if (this.uploadImageMethod) {\n const toolbar = quill.getModule('toolbar');\n toolbar.addHandler('image', () => this.imageHandler(quill));\n }\n }\n\n private imageHandler(quill: any) {\n const input = document.createElement('input');\n input.setAttribute('type', 'file');\n input.setAttribute('accept', this.acceptedFileTypes?.join(',') ?? 'image/*');\n input.click();\n\n input.onchange = async () => {\n const file = input.files[0];\n if (file) {\n const formData = new FormData();\n formData.append('file', file, `${this.objectId}-${file.name}`);\n\n this.uploadImageMethod(formData).subscribe((result: EditorImageUploadResult) => {\n const range = quill.getSelection(true);\n quill.insertEmbed(range.index, 'image', result.url);\n // Quill 2's built-in Image blot recognizes width/height as native attributes,\n // so formatText writes them directly onto the rendered <img>. Storefront uses\n // these to size the image up-front and prevent CLS. (0, 0) means the server\n // couldn't determine an intrinsic size (e.g. an SVG without width/viewBox) —\n // omit the attributes entirely rather than render an invisible 0×0 image.\n if (result.width && result.height) {\n quill.formatText(range.index, 1, { width: result.width, height: result.height });\n }\n quill.setSelection(range.index + 1);\n });\n }\n };\n }\n\n onClick() {\n let editableArea: HTMLElement =\n this.editor.el.nativeElement.querySelector('.ql-editor');\n\n editableArea.onblur = () => {\n this.control.markAsDirty();\n };\n }\n}\n","<!-- Can't put (onBlur) in this control -->\n\n<div style=\"display: flex; flex-direction: column; gap: 0.5rem; padding: 0 1px\">\n <div *ngIf=\"getTranslatedLabel() != '' && getTranslatedLabel() != null\">\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n\n <!-- Disable doesn't work on this control -->\n <p-editor\n *ngIf=\"control\"\n [formControl]=\"control\"\n [readonly]=\"control.disabled\"\n [class]=\"control.invalid && control.dirty ? 'control-error-border' : ''\"\n [id]=\"control.label\"\n [placeholder]=\"placeholder\"\n (click)=\"onClick()\"\n (onInit)=\"onEditorInit($event)\"\n [style]=\"{ height: '320px' }\"\n ></p-editor>\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';\nimport { BaseControl } from '../base-control';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { CommonModule } from '@angular/common';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { TextareaModule } from 'primeng/textarea';\nimport { TabsModule } from 'primeng/tabs';\nimport { MarkdownComponent } from 'ngx-markdown';\nimport { Observable } from 'rxjs';\nimport { EditorImageUploadResult } from '../../entities/editor-image-upload-result';\n\n/**\n * Markdown form control: a plain textarea (Write) with a rendered live preview (Preview),\n * arranged as tabs. The stored value is raw Markdown text.\n *\n * The preview is rendered with ngx-markdown (marked) and is intentionally APPROXIMATE — a\n * consuming storefront may render the same Markdown with a different engine/flavor.\n *\n * The <textarea> DOM is the source of truth for the text (the form control mirrors it, like\n * spiderly-editor mirrors Quill). We never splice control.value, because SpiderlyFormControl\n * defaults to updateOn:'blur' and would be stale relative to the focused textarea.\n *\n * When {@link uploadImageMethod} is provided (wired by the generator for properties with an\n * S3 public-storage attribute), pasting an image uploads it and, on success, inserts a\n * standard `` link at the caret via execCommand (which preserves the native undo\n * stack). Upload progress is shown out-of-band, not as a token in the text.\n */\n@Component({\n selector: 'spiderly-markdown',\n templateUrl: './spiderly-markdown.component.html',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n TextareaModule,\n TabsModule,\n MarkdownComponent,\n RequiredComponent,\n TranslocoDirective,\n ],\n})\nexport class SpiderlyMarkdownComponent extends BaseControl implements OnInit {\n @ViewChild('textarea') textareaRef: ElementRef<HTMLTextAreaElement>;\n\n @Input() uploadImageMethod: (formData: FormData) => Observable<EditorImageUploadResult>;\n @Input() objectId: number = 0;\n\n pendingImageUploads: number = 0;\n imageUploadFailed: boolean = false;\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n }\n\n onPaste(event: ClipboardEvent) {\n // Only intercept when image upload is wired; otherwise let the default paste happen.\n if (!this.uploadImageMethod || this.control?.disabled) return;\n\n const imageFile = this.getPastedImage(event);\n if (!imageFile) return;\n\n event.preventDefault();\n\n const formData = new FormData();\n formData.append('file', imageFile, `${this.objectId}-${imageFile.name || 'pasted-image.png'}`);\n\n this.imageUploadFailed = false;\n this.pendingImageUploads++;\n\n this.uploadImageMethod(formData).subscribe({\n next: (result: EditorImageUploadResult) => {\n this.pendingImageUploads--;\n this.insertImageMarkdown(result.url);\n },\n error: () => {\n this.pendingImageUploads--;\n this.imageUploadFailed = true;\n },\n });\n }\n\n private getPastedImage(event: ClipboardEvent): File | null {\n const items = event.clipboardData?.items;\n if (!items) return null;\n\n for (let i = 0; i < items.length; i++) {\n if (items[i].type.startsWith('image/')) {\n return items[i].getAsFile();\n }\n }\n\n return null;\n }\n\n private insertImageMarkdown(url: string) {\n const snippet = ``;\n const textarea = this.textareaRef?.nativeElement;\n\n // Preferred path: the textarea is focused, so insert at the caret while preserving the\n // native undo stack. The resulting 'input' event syncs the control on blur, exactly like\n // the user typing — no manual setValue, no stale-model read.\n if (textarea && document.activeElement === textarea && document.execCommand('insertText', false, snippet)) {\n return;\n }\n\n // Fallback (textarea blurred/absent, or execCommand unsupported): read the LIVE textarea\n // value — never control.value, which is stale while focused. When blurred, the control is\n // already current, so appending can't drop uncommitted text.\n if (textarea) {\n const sep = textarea.value.length ? '\\n' : '';\n textarea.value = `${textarea.value}${sep}${snippet}`;\n this.control.setValue(textarea.value);\n } else {\n const current = this.control.value ?? '';\n this.control.setValue(current.length ? `${current}\\n${snippet}` : snippet);\n }\n this.control.markAsDirty();\n }\n}\n","<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div *ngIf=\"getTranslatedLabel() != '' && getTranslatedLabel() != null\">\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n\n <ng-container *transloco=\"let t\">\n <p-tabs *ngIf=\"control\" value=\"write\">\n <p-tablist>\n <p-tab value=\"write\">{{ t('Write') }}</p-tab>\n <p-tab value=\"preview\">{{ t('Preview') }}</p-tab>\n </p-tablist>\n <p-tabpanels>\n <p-tabpanel value=\"write\">\n <textarea\n #textarea\n pTextarea\n [formControl]=\"control\"\n [id]=\"control.label\"\n (blur)=\"control.markAsDirty()\"\n (paste)=\"onPaste($event)\"\n [autoResize]=\"true\"\n [class]=\"control.disabled ? 'disabled' : ''\"\n [style]=\"{ width: '100%', minHeight: '320px' }\"\n ></textarea>\n <small *ngIf=\"pendingImageUploads > 0\">{{ t('UploadingImage') }}</small>\n <small *ngIf=\"imageUploadFailed\" class=\"spiderly-error-message\">{{ t('ImageUploadFailed') }}</small>\n </p-tabpanel>\n <p-tabpanel value=\"preview\">\n <div class=\"spiderly-markdown-preview\" style=\"min-height: 320px\">\n <markdown [data]=\"control.value\"></markdown>\n </div>\n </p-tabpanel>\n </p-tabpanels>\n </p-tabs>\n </ng-container>\n\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ButtonModule } from 'primeng/button';\nimport { SplitButtonModule } from 'primeng/splitbutton';\nimport { Subject, Subscription, throttleTime } from 'rxjs';\nimport { Router } from '@angular/router';\n\n@Component({\n selector: 'spiderly-button-base',\n template: ``,\n styles: [],\n imports: [CommonModule, ButtonModule, SplitButtonModule],\n})\nexport class SpiderlyButtonBaseComponent {\n @Input() icon: string;\n /** Optional image icon (URL) rendered before the label — for brand logos (e.g. Google) that aren't PrimeNG font icons. */\n @Input() iconUrl: string;\n @Input() label: string;\n @Input() outlined: boolean = false;\n @Input() rounded: boolean = false;\n @Input() styleClass: string;\n @Input() routerLink: string;\n @Input() style: { [klass: string]: any };\n @Input() class: string;\n @Input() severity:\n | 'success'\n | 'info'\n | 'warn'\n | 'danger'\n | 'help'\n | 'primary'\n | 'secondary'\n | 'contrast'\n | null\n | undefined;\n @Input() size: 'small' | 'large' | undefined;\n @Input() disabled: boolean = false;\n\n @Output() onClick = new EventEmitter<Event>();\n private clickSubject = new Subject<Event>(); // Internal subject to handle click events.\n private subscription: Subscription;\n\n constructor(private router: Router) {}\n\n ngOnInit() {\n this.subscription = this.clickSubject\n .pipe(throttleTime(500))\n .subscribe((event: Event) => this.onClick.emit(event));\n }\n\n handleClick = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n if (this.routerLink !== undefined) {\n this.router.navigate([this.routerLink]);\n } else {\n this.clickSubject.next(event);\n }\n };\n\n ngOnDestroy() {\n this.subscription.unsubscribe();\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ButtonModule } from 'primeng/button';\nimport { SplitButtonModule } from 'primeng/splitbutton';\nimport { SpiderlyButtonBaseComponent } from '../spiderly-button-base/spiderly-button-base';\n\n@Component({\n selector: 'spiderly-button',\n templateUrl: './spiderly-button.component.html',\n styles: [],\n imports: [CommonModule, ButtonModule, SplitButtonModule],\n})\nexport class SpiderlyButtonComponent extends SpiderlyButtonBaseComponent {\n // constructor() {\n // super();\n\n // }\n @Input() type: 'button' | 'submit' | 'reset' = 'button';\n}\n","<p-button\n (onClick)=\"handleClick($event)\"\n [label]=\"iconUrl ? undefined : label\"\n [icon]=\"icon\"\n [outlined]=\"outlined\"\n [styleClass]=\"styleClass\"\n [severity]=\"severity\"\n [rounded]=\"rounded\"\n [style]=\"style\"\n [class]=\"class\"\n [disabled]=\"disabled\"\n [size]=\"size\"\n [type]=\"type\"\n>\n <ng-container *ngIf=\"iconUrl\">\n <img [src]=\"iconUrl\" [alt]=\"label\" style=\"height: 16px; width: 16px; margin-right: 8px\" />\n <span>{{ label }}</span>\n </ng-container>\n <ng-content></ng-content>\n</p-button>\n","interface PropertySchema {\n type: string; // Use a string or an enum to represent the type (e.g., 'string', 'number', 'Date')\n nestedConstructor?: SchemaAwareConstructor<any>;\n isSaveBodyMainDTO?: boolean;\n // Add other metadata you might need (e.g., isRequired, minLength, etc.)\n}\n\nexport interface ClassSchema {\n [propertyName: string]: PropertySchema;\n}\n\n// A type that represents a class constructor with a static 'schema' property\nexport type SchemaAwareConstructor<T> = {\n new (...args: any[]): T;\n readonly schema: ClassSchema; // The static property holding the schema\n readonly typeName: string; // 'typeName' can't be named 'name' because of the conflict with the Function.name\n};\n\nexport class BaseEntity {}\n","import { TranslocoService } from '@jsverse/transloco';\nimport { Injectable, NgZone } from '@angular/core';\nimport { MessageService } from 'primeng/api';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SpiderlyMessageService {\n // TODO FT: nece da prikaze poruku ako je neki angular error koji se dogodi tek nakon api poziva\n constructor(\n private messageService: MessageService,\n private translocoService: TranslocoService,\n private ngZone: NgZone,\n ) {}\n\n successMessage(\n detail: string,\n title: string = this.translocoService.translate('SuccessfulAction'),\n ) {\n this.messageService.add({\n severity: 'success',\n summary: title,\n detail: detail,\n life: 10000,\n });\n }\n\n warningMessage(detail: string, title?: string, sticky?: boolean) {\n this.messageService.add({\n severity: 'warn',\n summary: title ?? this.translocoService.translate('Warning'),\n detail: detail,\n life: 10000,\n sticky: sticky,\n });\n }\n\n errorMessage(\n detail: string,\n title: string = this.translocoService.translate('Error'),\n ) {\n this.messageService.add({\n severity: 'error',\n summary: title,\n detail: detail,\n life: 10000,\n });\n }\n\n infoMessage(detail: string, title?: string, sticky?: boolean) {\n this.messageService.add({\n severity: 'info',\n summary: title ?? this.translocoService.translate('Info'),\n detail: detail,\n life: 10000,\n sticky: sticky,\n });\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { FileSelectEvent, FileUploadModule } from 'primeng/fileupload';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { SpiderlyButtonComponent } from '../../components/spiderly-buttons/spiderly-button/spiderly-button.component';\nimport { BaseEntity } from '../../entities/base-entity';\nimport {\n getImageDimensions,\n getMimeTypeForFileName,\n isExcelFileType,\n isFileImageType,\n} from '../../services/helper-functions';\nimport { SpiderlyMessageService } from '../../services/spiderly-message.service';\nimport { ValidatorAbstractService } from '../../services/validator-abstract.service';\nimport { BaseControl } from '../base-control';\n\n@Component({\n selector: 'spiderly-file',\n templateUrl: './spiderly-file.component.html',\n styles: [],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n FileUploadModule,\n RequiredComponent,\n SpiderlyButtonComponent,\n TranslocoDirective,\n ],\n})\nexport class SpiderlyFileComponent extends BaseControl implements OnInit {\n @Output() onFileSelected = new EventEmitter<SpiderlyFileSelectEvent>();\n @Output() onFileRemoved = new EventEmitter<null>();\n @Input() objectId: number;\n @Input() fileData: string;\n @Input() acceptedFileTypes: Array<\n | 'image/*'\n | 'image/png'\n | 'image/jpeg'\n | 'image/webp'\n | 'image/gif'\n | 'image/avif'\n | 'image/svg+xml'\n | '.png'\n | '.jpg'\n | '.jpeg'\n | '.webp'\n | '.gif'\n | '.avif'\n | '.svg'\n | 'application/pdf'\n | '.pdf'\n | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n | 'application/vnd.ms-excel'\n | '.xlsx'\n | '.xls'\n | 'video/*'\n | 'video/mp4'\n | '.mp4'\n | 'audio/*'\n | 'audio/mpeg'\n | '.mp3'\n | 'application/zip'\n | '.zip'\n | 'text/csv'\n | '.csv'\n > = ['image/*'];\n @Input() required: boolean; // It's okay for this control, because for the custom uploads where we are not initializing the control from the backend, there is no need for formControl.\n @Input() multiple: boolean = false;\n @Input() isUrlFileData: boolean = true;\n @Input() imageWidth: number = 0;\n @Input() imageHeight: number = 0;\n @Input() maxFileSize: number = 20_000_000;\n\n acceptedFileTypesCommaSeparated: string;\n existingFileUrl: string | null = null;\n existingFileIsImage: boolean = false;\n existingFileName: string = '';\n @Input() files: File[] = [];\n\n constructor(\n protected override translocoService: TranslocoService,\n private messageService: SpiderlyMessageService,\n private validatorService: ValidatorAbstractService,\n ) {\n super(translocoService);\n }\n\n override ngOnInit() {\n if (this.control?.value != null && this.fileData != null) {\n if (this.isUrlFileData) {\n this.setExistingFileUrl(this.fileData);\n } else {\n const file = this.getFileFromBase64(this.fileData);\n this.files.push(file);\n }\n }\n\n if (!this.objectId) {\n this.objectId = 0;\n }\n\n this.acceptedFileTypesCommaSeparated = this.acceptedFileTypes.join(',');\n\n super.ngOnInit();\n }\n\n filesSelected(event: FileSelectEvent) {\n const file = event.files[0];\n this.existingFileUrl = null;\n\n if (\n this.isFileImageType(file.type) &&\n this.hasImageDimensionConstraints()\n ) {\n this.files = [];\n this.validatorService\n .validateImageDimensions(file, this.imageWidth, this.imageHeight)\n .then((result) => {\n if (result.isValid) {\n this.files = [file];\n this.emitFileSelected(file);\n } else {\n this.messageService.errorMessage(result.errors.join('\\n'));\n }\n });\n } else {\n this.emitFileSelected(file);\n }\n }\n\n private async emitFileSelected(file: File): Promise<void> {\n const formData = new FormData();\n formData.append('file', file, `${this.objectId}-${file.name}`);\n\n let width: number | undefined;\n let height: number | undefined;\n\n if (this.isFileImageType(file.type)) {\n const dimensions = await getImageDimensions(file);\n width = dimensions.width;\n height = dimensions.height;\n }\n\n this.onFileSelected.next(\n new SpiderlyFileSelectEvent({ file, formData, width, height }),\n );\n }\n\n private hasImageDimensionConstraints(): boolean {\n return this.imageWidth > 0 || this.imageHeight > 0;\n }\n\n choose(event, chooseCallback) {\n chooseCallback();\n }\n\n fileRemoved(removeFileCallback, index: number) {\n removeFileCallback(index);\n this.clearFile();\n }\n\n removeExistingFile() {\n this.existingFileUrl = null;\n this.clearFile();\n }\n\n private clearFile() {\n this.control?.setValue(null);\n this.onFileRemoved.next(null);\n }\n\n private setExistingFileUrl(url: string) {\n this.existingFileUrl = url;\n this.existingFileName = url.split('/').pop()?.split('?')[0] ?? '';\n const mimeType = getMimeTypeForFileName(this.existingFileName);\n this.existingFileIsImage = isFileImageType(mimeType);\n }\n\n getFileFromBase64(base64String: string) {\n const [header, base64Content] = base64String.split(';base64,');\n const fileName = header.split('=')[1];\n const mimeType = getMimeTypeForFileName(fileName);\n\n const byteCharacters = atob(base64Content);\n const byteNumbers = new Uint8Array(byteCharacters.length);\n\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n\n const blob = new Blob([byteNumbers], { type: mimeType });\n const file = new File([blob], fileName, { type: mimeType });\n\n return file;\n }\n\n isFileImageType(mimeType: string): boolean {\n return isFileImageType(mimeType);\n }\n\n isExcelFileType(mimeType: string): boolean {\n return isExcelFileType(mimeType);\n }\n}\n\nexport class SpiderlyFileSelectEvent extends BaseEntity {\n file?: File;\n formData?: FormData;\n width?: number;\n height?: number;\n\n constructor({\n file,\n formData,\n width,\n height,\n }: {\n file?: File;\n formData?: FormData;\n width?: number;\n height?: number;\n } = {}) {\n super();\n\n this.file = file;\n this.formData = formData;\n this.width = width;\n this.height = height;\n }\n\n static readonly typeName = 'SpiderlyFileSelectEvent' as const;\n}\n","<ng-container *transloco=\"let t\">\n <div style=\"display: flex; flex-direction: column; gap: 0.5rem; padding: 1px\">\n <div *ngIf=\"getTranslatedLabel() != '' && getTranslatedLabel() != null\">\n <label>{{ getTranslatedLabel() }}</label>\n <!-- It's okay for this control, because for the custom uploads where we are not initializing the control from the backend, there is no need for formControl. -->\n <required *ngIf=\"control?.required || required\"></required>\n </div>\n\n <p-fileUpload\n [files]=\"files\"\n [disabled]=\"disabled\"\n [name]=\"control?.label ?? label\"\n [multiple]=\"multiple\"\n [accept]=\"acceptedFileTypesCommaSeparated\"\n [maxFileSize]=\"maxFileSize\"\n (onSelect)=\"filesSelected($event)\"\n [class]=\"control?.invalid && control?.dirty ? 'control-error-border' : ''\"\n >\n <ng-template\n pTemplate=\"header\"\n let-files\n let-chooseCallback=\"chooseCallback\"\n let-clearCallback=\"clearCallback\"\n let-uploadCallback=\"uploadCallback\"\n >\n <div\n class=\"flex flex-wrap justify-between items-center flex-1 gap-2\"\n >\n <div class=\"flex gap-2\">\n <spiderly-button\n [disabled]=\"disabled\"\n (onClick)=\"choose($event, chooseCallback)\"\n icon=\"pi pi-upload\"\n [rounded]=\"true\"\n [outlined]=\"true\"\n />\n </div>\n </div>\n </ng-template>\n <ng-template\n pTemplate=\"content\"\n let-files\n let-removeFileCallback=\"removeFileCallback\"\n >\n <div *ngIf=\"existingFileUrl\">\n <div class=\"flex justify-center p-0 gap-8\">\n <div\n class=\"card m-0 px-4 py-4 flex flex-col items-center gap-4\"\n style=\"justify-content: center; overflow: hidden\"\n >\n <div *ngIf=\"existingFileIsImage\" class=\"image-container\">\n <img [src]=\"existingFileUrl\" />\n </div>\n <div *ngIf=\"!existingFileIsImage\">\n <i class=\"pi pi-file\" style=\"margin-right: 4px\"></i>\n <span>{{ existingFileName }}</span>\n </div>\n <spiderly-button\n [disabled]=\"disabled\"\n icon=\"pi pi-times\"\n (onClick)=\"removeExistingFile()\"\n [outlined]=\"true\"\n [rounded]=\"true\"\n severity=\"danger\"\n />\n </div>\n </div>\n </div>\n <div *ngIf=\"!existingFileUrl && files.length > 0\">\n <div class=\"flex justify-center p-0 gap-8\">\n <div\n *ngFor=\"let file of files; let index = index\"\n class=\"card m-0 px-4 py-4 flex flex-col items-center gap-4\"\n style=\"justify-content: center; overflow: hidden\"\n >\n <div *ngIf=\"isFileImageType(file.type)\" class=\"image-container\">\n <img role=\"presentation\" [src]=\"file.objectURL\" />\n </div>\n <div *ngIf=\"isExcelFileType(file.type)\" class=\"excel-container\">\n <div class=\"excel-details\">\n <i\n class=\"pi pi-file-excel\"\n style=\"color: green; margin-right: 4px\"\n ></i>\n <span class=\"file-name\">{{ file.name }}</span>\n </div>\n </div>\n <spiderly-button\n [disabled]=\"disabled\"\n icon=\"pi pi-times\"\n (onClick)=\"fileRemoved(removeFileCallback, index)\"\n [outlined]=\"true\"\n [rounded]=\"true\"\n severity=\"danger\"\n />\n </div>\n </div>\n </div>\n </ng-template>\n <ng-template pTemplate=\"file\"> </ng-template>\n <ng-template pTemplate=\"empty\">\n <div *ngIf=\"!existingFileUrl\" class=\"flex items-center justify-center flex-col\">\n <i\n class=\"pi pi-cloud-upload border-2 rounded-full p-8 text-8xl text-gray-400 border-gray-400 mt-4\"\n ></i>\n <p class=\"mt-6 mb-0\">{{ t(\"DragAndDropFilesHereToUpload\") }}</p>\n </div>\n </ng-template>\n </p-fileUpload>\n </div>\n</ng-container>\n","import { Component, Input } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { getParentUrl } from '../../../services/helper-functions';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { ButtonModule } from 'primeng/button';\nimport { SpiderlyButtonComponent } from '../spiderly-button/spiderly-button.component';\n\n@Component({\n selector: 'return-button',\n templateUrl: './return-button.component.html',\n styles: [],\n imports: [\n CommonModule,\n ButtonModule,\n SpiderlyButtonComponent,\n TranslocoDirective,\n ],\n})\nexport class SpiderlyReturnButtonComponent {\n @Input() navigateUrl: string;\n\n constructor(private router: Router) {}\n\n onReturn() {\n if (this.navigateUrl == undefined) {\n const currentUrl = this.router.url;\n const parentUrl: string = getParentUrl(currentUrl);\n this.router.navigateByUrl(parentUrl);\n } else {\n this.router.navigate([this.navigateUrl]);\n }\n }\n}\n","<ng-container *transloco=\"let t\">\n <spiderly-button\n (onClick)=\"onReturn()\"\n [label]=\"t('Return')\"\n icon=\"pi pi-undo\"\n [outlined]=\"true\"\n ></spiderly-button>\n</ng-container>\n","import { NgModule } from '@angular/core';\nimport { SpiderlyMultiAutocompleteComponent } from './spiderly-multiautocomplete/spiderly-multiautocomplete.component';\nimport { SpiderlyPasswordComponent } from './spiderly-password/spiderly-password.component';\nimport { SpiderlyTextboxComponent } from './spiderly-textbox/spiderly-textbox.component';\nimport { SpiderlyCheckboxComponent } from './spiderly-checkbox/spiderly-checkbox.component';\nimport { SpiderlyMultiSelectComponent } from './spiderly-multiselect/spiderly-multiselect.component';\nimport { SpiderlyTextareaComponent } from './spiderly-textarea/spiderly-textarea.component';\nimport { SpiderlyNumberComponent } from './spiderly-number/spiderly-number.component';\nimport { SpiderlyDropdownComponent } from './spiderly-dropdown/spiderly-dropdown.component';\nimport { SpiderlyEditorComponent } from './spiderly-editor/spiderly-editor.component';\nimport { SpiderlyMarkdownComponent } from './spiderly-markdown/spiderly-markdown.component';\nimport { SpiderlyColorPickerComponent } from './spiderly-colorpicker/spiderly-colorpicker.component';\nimport { SpiderlyFileComponent } from './spiderly-file/spiderly-file.component';\nimport { SpiderlyCalendarComponent } from './spiderly-calendar/spiderly-calendar.component';\nimport { SpiderlyAutocompleteComponent } from './spiderly-autocomplete/spiderly-autocomplete.component';\nimport { SpiderlyButtonComponent } from '../components/spiderly-buttons/spiderly-button/spiderly-button.component';\nimport { SpiderlyReturnButtonComponent } from '../components/spiderly-buttons/return-button/return-button.component';\n\n@NgModule({\n imports: [\n SpiderlyTextboxComponent,\n SpiderlyTextareaComponent,\n SpiderlyCheckboxComponent,\n SpiderlyCalendarComponent,\n SpiderlyReturnButtonComponent,\n SpiderlyButtonComponent,\n SpiderlyPasswordComponent,\n SpiderlyAutocompleteComponent,\n SpiderlyMultiAutocompleteComponent,\n SpiderlyMultiSelectComponent,\n SpiderlyNumberComponent,\n SpiderlyDropdownComponent,\n SpiderlyEditorComponent,\n SpiderlyMarkdownComponent,\n SpiderlyColorPickerComponent,\n SpiderlyFileComponent,\n ],\n exports: [\n SpiderlyTextboxComponent,\n SpiderlyTextareaComponent,\n SpiderlyCheckboxComponent,\n SpiderlyCalendarComponent,\n SpiderlyReturnButtonComponent,\n SpiderlyButtonComponent,\n SpiderlyPasswordComponent,\n SpiderlyAutocompleteComponent,\n SpiderlyMultiAutocompleteComponent,\n SpiderlyMultiSelectComponent,\n SpiderlyNumberComponent,\n SpiderlyDropdownComponent,\n SpiderlyEditorComponent,\n SpiderlyMarkdownComponent,\n SpiderlyColorPickerComponent,\n SpiderlyFileComponent,\n ],\n declarations: [],\n providers: [],\n})\nexport class SpiderlyControlsModule {}\n","import { BaseEntity } from './base-entity';\n\nexport class InitCompanyAuthDialogDetails extends BaseEntity {\n image?: string;\n companyName?: string;\n\n constructor({\n image,\n companyName,\n }: {\n image?: string;\n companyName?: string;\n } = {}) {\n super();\n\n this.image = image;\n this.companyName = companyName;\n }\n\n static readonly typeName = 'InitCompanyAuthDialogDetails' as const;\n}\n","import { HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ConfigServiceBase {\n /**\n * Consumer-facing only — nothing in the library reads it. The error handler and the HTTP\n * interceptor used to gate their `console.error` on it, which left a deployed app's client\n * errors with nowhere to go; both now log unconditionally. `spiderly init` still scaffolds the\n * `override`, so apps keep branching on it.\n */\n production = false;\n apiUrl: string;\n frontendUrl = 'http://localhost:4200';\n companyName = 'Company Name';\n primaryColor = '#111b2c';\n\n /* URLs */\n loginSlug = 'login';\n\n /* Local storage */\n accessTokenKey = 'access_token';\n refreshTokenKey = 'refresh_token';\n browserIdKey = 'browser_id';\n\n httpOptions = {};\n httpSkipSpinnerOptions = {\n headers: new HttpHeaders({ 'Content-Type': 'application/json' }),\n params: new HttpParams().set('X-Skip-Spinner', 'true'),\n };\n\n logoPath = 'assets/images/logo/logo.svg';\n\n /* Pagination */\n defaultPageSize = 10;\n\n constructor() {}\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport {\n AuthResult,\n AuthResultWithCookies,\n ExternalProviderPublic,\n Login,\n RefreshTokenRequest,\n SendLoginVerificationEmailResult,\n UserBase,\n VerificationTokenRequest,\n} from '../entities/security-entities';\nimport { ConfigServiceBase } from './config.service.base';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ApiSecurityService {\n constructor(\n protected http: HttpClient,\n protected config: ConfigServiceBase,\n ) {}\n\n //#region Authentication\n\n login = (request: VerificationTokenRequest): Observable<AuthResult> => {\n return this.http.post<AuthResult>(\n `${this.config.apiUrl}/Security/Login`,\n request,\n this.config.httpOptions,\n );\n };\n\n sendLoginVerificationEmail = (\n loginDTO: Login,\n ): Observable<SendLoginVerificationEmailResult> => {\n return this.http.post<SendLoginVerificationEmailResult>(\n `${this.config.apiUrl}/Security/SendLoginVerificationEmail`,\n loginDTO,\n this.config.httpOptions,\n );\n };\n\n loginWithCookies = (\n request: VerificationTokenRequest,\n ): Observable<AuthResultWithCookies> => {\n return this.http.post<AuthResultWithCookies>(\n `${this.config.apiUrl}/Security/LoginWithCookies`,\n request,\n this.config.httpOptions,\n );\n };\n\n getExternalProviders = (): Observable<ExternalProviderPublic[]> => {\n return this.http.get<ExternalProviderPublic[]>(\n `${this.config.apiUrl}/Security/GetExternalProviders`,\n this.config.httpSkipSpinnerOptions,\n );\n };\n\n logout = (browserId: string): Observable<any> => {\n return this.http.get<any>(\n `${this.config.apiUrl}/Security/Logout?browserId=${browserId}`,\n );\n };\n\n logoutWithCookies = (browserId: string): Observable<any> => {\n return this.http.get<any>(\n `${this.config.apiUrl}/Security/LogoutWithCookies?browserId=${browserId}`,\n );\n };\n\n refreshTokenWithHeaders = (request: RefreshTokenRequest): Observable<AuthResult> => {\n return this.http.post<AuthResult>(\n `${this.config.apiUrl}/Security/RefreshTokenWithHeaders`,\n request,\n this.config.httpOptions,\n );\n };\n\n refreshTokenWithCookies = (browserId: string): Observable<AuthResultWithCookies> => {\n // POST, not GET: refresh rotates the single-use token (a state mutation), and a cacheable GET let\n // browsers replay a stale logged-in response on back/forward navigation (phantom dashboard after logout).\n return this.http.post<AuthResultWithCookies>(\n `${this.config.apiUrl}/Security/RefreshTokenWithCookies?browserId=${browserId}`,\n null,\n );\n };\n\n //#endregion\n\n //#region User\n\n getCurrentUserBase = (): Observable<UserBase> => {\n return this.http.get<UserBase>(\n `${this.config.apiUrl}/Security/GetCurrentUserBase`,\n this.config.httpSkipSpinnerOptions,\n );\n };\n\n getCurrentUserPermissionCodes = (): Observable<string[]> => {\n return this.http.get<string[]>(\n `${this.config.apiUrl}/Security/GetCurrentUserPermissionCodes`,\n this.config.httpSkipSpinnerOptions,\n );\n };\n\n //#endregion\n}\n","import { Inject, Injectable, OnDestroy, PLATFORM_ID } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { HttpClient } from '@angular/common/http';\nimport { BehaviorSubject, Observable, of, Subscription } from 'rxjs';\nimport { catchError, delay, filter, finalize, map, tap } from 'rxjs/operators';\nimport {\n AuthResultWithCookies,\n Login,\n VerificationTokenRequest,\n UserBase,\n} from '../entities/security-entities';\nimport { ConfigServiceBase } from './config.service.base';\nimport { ApiSecurityService } from './api.service.security';\nimport { InitCompanyAuthDialogDetails } from '../entities/init-company-auth-dialog-details';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Cookie-based session auth. The access/refresh JWTs live in HttpOnly cookies set by the backend\n * (so JS never holds them — XSS can't exfiltrate them); requests are authenticated via\n * `withCredentials` (see jwtInterceptor). The readable result only carries userId/email/expiry.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthServiceBase implements OnDestroy {\n private readonly apiUrl: string = this.config.apiUrl;\n private timer?: Subscription;\n private accessTokenExpiresAt?: Date;\n\n // External-login error code captured from the bootstrap URL (?externalAuthError=expired|failed) set by the\n // backend's OAuth callback on failure. Captured before routing can strip it, surfaced once by the login page.\n externalAuthErrorCode: string | null = null;\n\n protected _currentUserPermissionCodes = new BehaviorSubject<string[] | null>(\n undefined,\n );\n // The subject seeds with `undefined` (not yet loaded) and emits `null` on logout. Consumers only ever care\n // about a real code list, so filter both out here — subscribers get a clean `string[]`, and `firstValueFrom`\n // waits for the first loaded value instead of grabbing the `undefined` seed in a load race.\n currentUserPermissionCodes$: Observable<string[]> =\n this._currentUserPermissionCodes\n .asObservable()\n .pipe(filter((codes): codes is string[] => codes != null));\n\n protected _user = new BehaviorSubject<UserBase | null>(undefined);\n user$ = this._user.asObservable();\n\n constructor(\n protected router: Router,\n protected http: HttpClient,\n protected apiService: ApiSecurityService,\n protected config: ConfigServiceBase,\n @Inject(PLATFORM_ID) protected platformId: Object,\n ) {\n if (isPlatformBrowser(platformId)) {\n window.addEventListener('storage', this.storageEventListener);\n }\n }\n\n // Cross-tab sync. We store only marker values here (never tokens — those are HttpOnly cookies).\n private storageEventListener = (event: StorageEvent) => {\n if (event.storageArea === localStorage) {\n if (event.key === 'logout-event') {\n this.stopTokenTimer();\n this._user.next(null);\n this._currentUserPermissionCodes.next(null);\n }\n if (event.key === 'login-event') {\n this.refreshToken().subscribe();\n }\n }\n };\n\n sendLoginVerificationEmail(body: Login): Observable<any> {\n body.browserId = this.getBrowserId();\n return this.apiService.sendLoginVerificationEmail(body);\n }\n\n login(body: VerificationTokenRequest): Observable<AuthResultWithCookies> {\n body.browserId = this.getBrowserId();\n return this.apiService.loginWithCookies(body).pipe(\n map((result: AuthResultWithCookies) => {\n this.handleAuthResult(result);\n return result;\n }),\n );\n }\n\n // Establishes the in-memory session from a cookie auth result (login or refresh). No tokens are stored\n // in JS — only the user identity + the access-token expiry the backend reports (to schedule refresh).\n handleAuthResult(result: AuthResultWithCookies) {\n this._user.next({\n id: result.userId,\n email: result.email,\n });\n this.accessTokenExpiresAt = result.accessTokenExpiresAt\n ? new Date(result.accessTokenExpiresAt)\n : undefined;\n localStorage.setItem('login-event', 'login' + Math.random());\n this.startTokenTimer();\n this.setCurrentUserPermissionCodes().subscribe();\n }\n\n logout() {\n const browserId = this.getBrowserId();\n this.apiService\n .logoutWithCookies(browserId)\n .pipe(\n finalize(() => {\n this._user.next(null);\n localStorage.setItem('logout-event', 'logout' + Math.random());\n this.onAfterLogout();\n this.stopTokenTimer();\n }),\n )\n .subscribe();\n }\n\n onAfterLogout = () => {\n this._currentUserPermissionCodes.next(null);\n this.router.navigate([this.config.loginSlug]);\n };\n\n // Clears in-memory session state without calling the backend — used when a request comes back 401\n // (the backend has already cleared the auth cookies in that case).\n clearSession() {\n this.stopTokenTimer();\n this._user.next(null);\n this._currentUserPermissionCodes.next(null);\n localStorage.setItem('logout-event', 'logout' + Math.random());\n }\n\n // Called on app init and by the proactive timer. The refresh token is an HttpOnly cookie; a 401 (\"no valid\n // session\" — not logged in / expired) propagates from the interceptor and is handled by catchError below,\n // resolving the session to anonymous (null). map runs only for a real result, so _user is never partial.\n refreshToken(): Observable<AuthResultWithCookies | null> {\n const browserId = this.getBrowserId();\n return this.apiService.refreshTokenWithCookies(browserId).pipe(\n map((result: AuthResultWithCookies) => {\n if (result) {\n // A re-established session makes any pending external-login error moot — drop it so it can't\n // surface as a stale toast on a later /login visit (e.g. after a subsequent logout).\n this.externalAuthErrorCode = null;\n this._user.next({ id: result.userId, email: result.email });\n this.accessTokenExpiresAt = result.accessTokenExpiresAt\n ? new Date(result.accessTokenExpiresAt)\n : undefined;\n this.startTokenTimer();\n this.onAfterRefreshToken();\n }\n return result;\n }),\n catchError(() => {\n this._user.next(null);\n return of(null);\n }),\n );\n }\n\n onAfterRefreshToken = () => {\n this.setCurrentUserPermissionCodes().subscribe(); // after the session is re-established\n };\n\n // Reads ?externalAuthError= from the bootstrap URL (set by the backend OAuth callback on failure) and\n // strips it so a manual refresh won't re-trigger the message. Called from the app initializer, before the\n // router runs — otherwise an unauthenticated landing on \"/\" redirects to /login and drops the param.\n captureExternalAuthError() {\n if (isPlatformBrowser(this.platformId) === false) {\n return;\n }\n const params = new URLSearchParams(window.location.search);\n const code = params.get('externalAuthError');\n if (!code) {\n return;\n }\n this.externalAuthErrorCode = code;\n params.delete('externalAuthError');\n const query = params.toString();\n history.replaceState(\n history.state,\n '',\n window.location.pathname + (query ? `?${query}` : '') + window.location.hash,\n );\n }\n\n getBrowserId(): string {\n let browserId = localStorage.getItem(this.config.browserIdKey); // not a token — a stable per-browser id\n if (!browserId) {\n browserId = crypto.randomUUID();\n localStorage.setItem(this.config.browserIdKey, browserId);\n }\n return browserId;\n }\n\n private getTokenRemainingTime(): number {\n if (!this.accessTokenExpiresAt) {\n return 0;\n }\n return this.accessTokenExpiresAt.getTime() - Date.now();\n }\n\n private startTokenTimer() {\n const timeout = this.getTokenRemainingTime();\n if (timeout <= 0) {\n return;\n }\n this.stopTokenTimer();\n this.timer = of(true)\n .pipe(\n delay(timeout),\n tap({\n next: () => this.refreshToken().subscribe(),\n }),\n )\n .subscribe();\n }\n\n private stopTokenTimer() {\n this.timer?.unsubscribe();\n }\n\n navigateToDashboard() {\n this.router.navigate(['/']);\n }\n\n initCompanyAuthDialogDetails =\n (): Observable<InitCompanyAuthDialogDetails> => {\n return of(\n new InitCompanyAuthDialogDetails({\n image: this.config.logoPath,\n companyName: this.config.companyName,\n }),\n );\n };\n\n setCurrentUserPermissionCodes(): Observable<string[]> {\n return this.apiService.getCurrentUserPermissionCodes().pipe(\n map((permissionCodes) => {\n this._currentUserPermissionCodes.next(permissionCodes);\n return permissionCodes;\n }),\n );\n }\n\n ngOnDestroy(): void {\n if (isPlatformBrowser(this.platformId)) {\n window.removeEventListener('storage', this.storageEventListener);\n }\n\n this.onAfterNgOnDestroy();\n }\n\n onAfterNgOnDestroy = () => {};\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, OnDestroy, OnInit } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { AuthServiceBase } from '../../../services/auth.service.base';\n\n@Component({\n selector: 'spiderly-auth-card',\n templateUrl: './auth-card.component.html',\n imports: [CommonModule],\n})\nexport class AuthCardComponent implements OnInit, OnDestroy {\n private companyDetailsSubscription: Subscription | null = null;\n\n companyName: string;\n image: string;\n\n constructor(private authService: AuthServiceBase) {}\n\n ngOnInit() {\n this.companyDetailsSubscription = this.authService\n .initCompanyAuthDialogDetails()\n .subscribe((details) => {\n if (details != null) {\n this.image = details.image;\n this.companyName = details.companyName;\n }\n });\n }\n\n ngOnDestroy(): void {\n this.companyDetailsSubscription?.unsubscribe();\n }\n}\n","<div class=\"flex min-h-screen overflow-hidden p-5\">\n <div class=\"flex flex-col w-full\">\n <div\n class=\"w-full sm:w-120\"\n style=\"\n margin: auto;\n border-radius: 50px;\n padding: 0.3rem;\n background: linear-gradient(\n 180deg,\n var(--p-primary-color) 10%,\n rgba(33, 150, 243, 0) 30%\n );\n \"\n >\n <div class=\"surface-card py-12 px-8 sm:px-12\" style=\"border-radius: 45px\">\n <div class=\"flex justify-center\" style=\"margin-bottom: 38px\">\n <ng-content select=\"[auth-logo]\">\n <img\n *ngIf=\"image != null\"\n [src]=\"image\"\n alt=\"{{ companyName }} Logo\"\n title=\"{{ companyName }} Logo\"\n class=\"max-h-15\"\n />\n <i\n *ngIf=\"image == null\"\n class=\"pi pi-spin pi-spinner primary-color\"\n style=\"font-size: 2rem\"\n ></i>\n </ng-content>\n </div>\n\n <ng-content></ng-content>\n\n <ng-content select=\"[auth-footer]\"></ng-content>\n </div>\n </div>\n </div>\n</div>\n","const GOOGLE_G_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\" width=\"18\" height=\"18\"><path fill=\"#EA4335\" d=\"M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z\"/><path fill=\"#4285F4\" d=\"M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z\"/><path fill=\"#FBBC05\" d=\"M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.55 10.78l7.98-6.19z\"/><path fill=\"#34A853\" d=\"M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z\"/></svg>`;\n\n/**\n * Built-in default icons for external auth providers, keyed by provider code.\n * Values are inline data URIs — no network request, CSP entry, or asset wiring,\n * and they render offline. Consumers override per code via the `providerIcons`\n * input on ExternalLoginComponent / SpiderlyLoginComponent.\n */\nexport const DEFAULT_EXTERNAL_PROVIDER_ICONS: Record<string, string> = {\n google: `data:image/svg+xml,${encodeURIComponent(GOOGLE_G_SVG)}`,\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { ApiSecurityService } from '../../../services/api.service.security';\nimport { AuthServiceBase } from '../../../services/auth.service.base';\nimport { ConfigServiceBase } from '../../../services/config.service.base';\nimport { ExternalProviderPublic } from '../../../entities/security-entities';\nimport { SpiderlyButtonComponent } from '../../spiderly-buttons/spiderly-button/spiderly-button.component';\nimport { DEFAULT_EXTERNAL_PROVIDER_ICONS } from '../external-provider-icons';\n\n@Component({\n selector: 'spiderly-external-login',\n templateUrl: './external-login.component.html',\n imports: [CommonModule, TranslocoDirective, SpiderlyButtonComponent],\n})\nexport class ExternalLoginComponent implements OnInit {\n /** Per-code icon overrides; unset codes fall back to DEFAULT_EXTERNAL_PROVIDER_ICONS. */\n @Input() providerIcons: Record<string, string> = {};\n\n // Config-driven: populated from Security/GetExternalProviders (backend is the single source of truth for which providers are enabled).\n externalProviders: ExternalProviderPublic[] = [];\n\n constructor(\n private config: ConfigServiceBase,\n private authService: AuthServiceBase,\n private apiService: ApiSecurityService,\n ) {}\n\n ngOnInit() {\n this.apiService.getExternalProviders().subscribe({\n next: (providers) => {\n this.externalProviders = providers ?? [];\n },\n // The global unauthorized interceptor already surfaces the HTTP error to the user; here we just\n // leave the provider buttons hidden instead of letting the error reach the global error handler.\n error: () => {\n this.externalProviders = [];\n },\n });\n }\n\n iconFor(code: string): string | undefined {\n return this.providerIcons[code] ?? DEFAULT_EXTERNAL_PROVIDER_ICONS[code];\n }\n\n loginWithExternalProvider(code: string) {\n // Server-side flow (B2): hand off to the backend challenge endpoint. The backend runs the OAuth\n // dance, sets the session cookies, and redirects back to returnUrl.\n const returnUrl = this.config.frontendUrl;\n const browserId = this.authService.getBrowserId();\n window.location.href =\n `${this.config.apiUrl}/Security/ExternalLoginChallenge` +\n `?provider=${encodeURIComponent(code)}` +\n `&returnUrl=${encodeURIComponent(returnUrl)}` +\n `&browserId=${encodeURIComponent(browserId)}`;\n }\n}\n","<ng-container *transloco=\"let t\">\n <div *ngIf=\"externalProviders.length > 0\">\n <div\n style=\"display: flex; align-items: center; gap: 7px; justify-content: center; margin-bottom: 16px;\"\n >\n <div class=\"separator\"></div>\n <div>{{ t(\"or\") }}</div>\n <div class=\"separator\"></div>\n </div>\n <div style=\"display: flex; flex-direction: column; gap: 10px\">\n <spiderly-button\n *ngFor=\"let provider of externalProviders\"\n (onClick)=\"loginWithExternalProvider(provider.code)\"\n [label]=\"provider.label || (provider.code | titlecase)\"\n [iconUrl]=\"iconFor(provider.code)\"\n [outlined]=\"true\"\n styleClass=\"w-full\"\n ></spiderly-button>\n </div>\n </div>\n</ng-container>\n","import { BaseEntity } from './base-entity';\n\nexport class UserBase extends BaseEntity {\n static readonly typeName = 'UserBase' as const;\n\n id?: number;\n email?: string;\n\n constructor({\n id,\n email,\n }: {\n id?: number;\n email?: string;\n } = {}) {\n super();\n\n this.id = id;\n this.email = email;\n }\n\n static readonly schema = {\n id: {\n type: 'number',\n },\n email: {\n type: 'string',\n },\n } as const;\n}\n\nexport class AuthResult extends BaseEntity {\n static readonly typeName = 'AuthResult' as const;\n\n userId?: number;\n email?: string;\n accessToken?: string;\n refreshToken?: string;\n\n constructor({\n userId,\n email,\n accessToken,\n refreshToken,\n }: {\n userId?: number;\n email?: string;\n accessToken?: string;\n refreshToken?: string;\n } = {}) {\n super();\n\n this.userId = userId;\n this.email = email;\n this.accessToken = accessToken;\n this.refreshToken = refreshToken;\n }\n\n static readonly schema = {\n userId: {\n type: 'number',\n },\n email: {\n type: 'string',\n },\n accessToken: {\n type: 'string',\n },\n refreshToken: {\n type: 'string',\n },\n } as const;\n}\n\nexport class VerificationTokenRequest extends BaseEntity {\n static readonly typeName = 'VerificationTokenRequest' as const;\n\n verificationCode?: string;\n browserId?: string;\n email?: string;\n\n constructor({\n verificationCode,\n browserId,\n email,\n }: {\n verificationCode?: string;\n browserId?: string;\n email?: string;\n } = {}) {\n super();\n\n this.verificationCode = verificationCode;\n this.browserId = browserId;\n this.email = email;\n }\n\n static readonly schema = {\n verificationCode: {\n type: 'string',\n },\n browserId: {\n type: 'string',\n },\n email: {\n type: 'string',\n },\n } as const;\n}\n\nexport class ExternalProvider extends BaseEntity {\n static readonly typeName = 'ExternalProvider' as const;\n\n provider?: string;\n idToken?: string;\n browserId?: string;\n\n constructor({\n provider,\n idToken,\n browserId,\n }: {\n provider?: string;\n idToken?: string;\n browserId?: string;\n } = {}) {\n super();\n\n this.provider = provider;\n this.idToken = idToken;\n this.browserId = browserId;\n }\n\n static readonly schema = {\n provider: {\n type: 'string',\n },\n idToken: {\n type: 'string',\n },\n browserId: {\n type: 'string',\n },\n } as const;\n}\n\nexport class ExternalProviderPublic extends BaseEntity {\n static readonly typeName = 'ExternalProviderPublic' as const;\n\n code?: string;\n authority?: string;\n clientId?: string;\n label?: string;\n\n constructor({\n code,\n authority,\n clientId,\n label,\n }: {\n code?: string;\n authority?: string;\n clientId?: string;\n label?: string;\n } = {}) {\n super();\n\n this.code = code;\n this.authority = authority;\n this.clientId = clientId;\n this.label = label;\n }\n\n static readonly schema = {\n code: {\n type: 'string',\n },\n authority: {\n type: 'string',\n },\n clientId: {\n type: 'string',\n },\n label: {\n type: 'string',\n },\n } as const;\n}\n\nexport class UserRole extends BaseEntity {\n static readonly typeName = 'UserRole' as const;\n\n roleId?: number;\n userId?: number;\n\n constructor({\n roleId,\n userId,\n }: {\n roleId?: number;\n userId?: number;\n } = {}) {\n super();\n\n this.roleId = roleId;\n this.userId = userId;\n }\n\n static readonly schema = {\n roleId: {\n type: 'number',\n },\n userId: {\n type: 'number',\n },\n } as const;\n}\n\nexport class LoginVerificationToken extends BaseEntity {\n static readonly typeName = 'LoginVerificationToken' as const;\n\n email?: string;\n userId?: number;\n browserId?: string;\n expiresAt?: Date;\n\n constructor({\n email,\n userId,\n browserId,\n expiresAt,\n }: {\n email?: string;\n userId?: number;\n browserId?: string;\n expiresAt?: Date;\n } = {}) {\n super();\n\n this.email = email;\n this.userId = userId;\n this.browserId = browserId;\n this.expiresAt = expiresAt;\n }\n\n static readonly schema = {\n email: {\n type: 'string',\n },\n userId: {\n type: 'number',\n },\n browserId: {\n type: 'string',\n },\n expiresAt: {\n type: 'Date',\n },\n } as const;\n}\n\nexport class Login extends BaseEntity {\n static readonly typeName = 'Login' as const;\n\n email?: string;\n browserId?: string;\n\n constructor({\n email,\n browserId,\n }: {\n email?: string;\n browserId?: string;\n } = {}) {\n super();\n\n this.email = email;\n this.browserId = browserId;\n }\n\n static readonly schema = {\n email: {\n type: 'string',\n },\n browserId: {\n type: 'string',\n },\n } as const;\n}\n\nexport class RefreshTokenRequest extends BaseEntity {\n static readonly typeName = 'RefreshTokenRequest' as const;\n\n refreshToken?: string;\n browserId?: string;\n\n constructor({\n refreshToken,\n browserId,\n }: {\n refreshToken?: string;\n browserId?: string;\n } = {}) {\n super();\n\n this.refreshToken = refreshToken;\n this.browserId = browserId;\n }\n\n static readonly schema = {\n refreshToken: {\n type: 'string',\n },\n browserId: {\n type: 'string',\n },\n } as const;\n}\n\nexport class AuthResultWithCookies extends BaseEntity {\n static readonly typeName = 'AuthResultWithCookies' as const;\n\n userId?: number;\n email?: string;\n accessTokenExpiresAt?: Date;\n\n constructor({\n userId,\n email,\n accessTokenExpiresAt,\n }: {\n userId?: number;\n email?: string;\n accessTokenExpiresAt?: Date;\n } = {}) {\n super();\n\n this.userId = userId;\n this.email = email;\n this.accessTokenExpiresAt = accessTokenExpiresAt;\n }\n\n static readonly schema = {\n userId: {\n type: 'number',\n },\n email: {\n type: 'string',\n },\n accessTokenExpiresAt: {\n type: 'Date',\n },\n } as const;\n}\n\nexport class SendLoginVerificationEmailResult extends BaseEntity {\n static readonly typeName = 'SendLoginVerificationEmailResult' as const;\n\n message?: string;\n\n constructor({\n message,\n }: {\n message?: string;\n } = {}) {\n super();\n\n this.message = message;\n }\n\n static readonly schema = {\n message: {\n type: 'string',\n },\n } as const;\n}\n","// When we call it, inside the console, it will show SpiderlyError: ...\nexport class SpiderlyError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport {\n SpiderlyFormArray,\n SpiderlyFormControl,\n SpiderlyFormGroup,\n} from '../components/spiderly-form-control/spiderly-form-control';\nimport { BaseEntity, SchemaAwareConstructor } from '../entities/base-entity';\nimport { SpiderlyError } from '../errors/spiderly-error';\nimport { capitalizeFirstChar, firstCharToUpper } from './helper-functions';\nimport { SpiderlyMessageService } from './spiderly-message.service';\nimport { ValidatorAbstractService } from './validator-abstract.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BaseFormService {\n constructor(\n private validatorService: ValidatorAbstractService,\n private messageService: SpiderlyMessageService,\n private translocoService: TranslocoService,\n ) {}\n\n initFormGroup = <T extends BaseEntity>(\n formGroup: SpiderlyFormGroup<T>,\n targetClass: SchemaAwareConstructor<T>,\n initialValues?: T,\n updateOnChangeControls?: (keyof T)[],\n ) => {\n if (!formGroup)\n throw new SpiderlyError('You need to instantiate the form group.');\n\n if (!targetClass) throw new SpiderlyError('You need to pass targetClass.');\n\n if (!initialValues) initialValues = {} as T;\n\n Object.keys(targetClass.schema).forEach((formControlName) => {\n const propSchema = targetClass.schema[formControlName];\n let propInitialValue = initialValues[formControlName];\n\n const existingControl = formGroup.get(formControlName);\n\n if (\n propSchema.type.endsWith('[]') &&\n propSchema.nestedConstructor &&\n propSchema.type !== 'Namebook[]'\n ) {\n if (existingControl instanceof SpiderlyFormArray) {\n this.initFormArray(\n existingControl,\n propSchema.nestedConstructor,\n propInitialValue,\n );\n this.validatorService.setFormArrayValidator(\n existingControl,\n targetClass.typeName,\n );\n } else {\n const control = new SpiderlyFormArray<T>(\n [],\n this.translocoService,\n this,\n );\n this.initFormArray(\n control,\n propSchema.nestedConstructor,\n propInitialValue,\n );\n\n control.label = formControlName;\n control.labelForDisplay = this.getTranslatedLabel(formControlName);\n this.validatorService.setFormArrayValidator(\n control,\n targetClass.typeName,\n );\n\n formGroup.setControl(formControlName, control);\n }\n } else if (\n propSchema.nestedConstructor &&\n propSchema.type !== 'Namebook[]'\n ) {\n if (existingControl instanceof SpiderlyFormGroup) {\n this.initFormGroup(\n existingControl,\n propSchema.nestedConstructor,\n propInitialValue,\n );\n } else {\n const control = new SpiderlyFormGroup({});\n this.initFormGroup(\n control,\n propSchema.nestedConstructor,\n propInitialValue,\n );\n formGroup.setControl(formControlName, control);\n }\n } else {\n const isArrayValued = propSchema.type.endsWith('[]');\n\n // HACK: Because on the backend id type is not nullable on generated DTOs, we need to do this, it's ugly hack and we should make it better.\n if (formControlName === 'id' && !propInitialValue) {\n propInitialValue = 0;\n }\n\n if (isArrayValued && propInitialValue == null) {\n propInitialValue = [];\n }\n\n if (existingControl instanceof SpiderlyFormControl) {\n existingControl.setValue(propInitialValue);\n } else {\n let control: SpiderlyFormControl;\n\n // Array-valued controls (multiselect/multiautocomplete selections) must\n // commit on change: their value mutates through overlay/chip interactions\n // that can end without the control ever having focus (PrimeNG's chip\n // remove stops propagation before the host focuses its hidden input), so\n // a blur-deferred commit leaves the deselect pending forever and the save\n // reads the OLD selection while the UI already shows the item removed.\n if (\n updateOnChangeControls?.includes(formControlName as keyof T) ||\n (formControlName.endsWith('Id') && formControlName.length > 2) ||\n propSchema.type === 'Date' ||\n isArrayValued\n ) {\n control = new SpiderlyFormControl(propInitialValue, {\n updateOn: 'change',\n });\n } else {\n control = new SpiderlyFormControl(propInitialValue, {\n updateOn: 'blur',\n });\n }\n\n control.label = formControlName;\n control.labelForDisplay = this.getTranslatedLabel(formControlName);\n control.parentClassName = targetClass.typeName;\n\n this.validatorService.setValidator(control, targetClass.typeName);\n\n formGroup.setControl(formControlName, control);\n }\n }\n });\n\n formGroup.targetClass = targetClass;\n\n return formGroup;\n };\n\n getTranslatedLabel(formControlName: string): string {\n if (formControlName.endsWith('Id') && formControlName.length > 2) {\n formControlName = formControlName.substring(\n 0,\n formControlName.length - 2,\n );\n } else if (formControlName.endsWith('DisplayName')) {\n formControlName = formControlName.replace('DisplayName', '');\n }\n\n return this.translocoService.translate(firstCharToUpper(formControlName));\n }\n\n addNewFormGroupToFormArray<T extends BaseEntity>(\n formArray: SpiderlyFormArray<T>,\n targetClass: SchemaAwareConstructor<T>,\n initialValues: T,\n index: number,\n ): SpiderlyFormGroup {\n let helperFormGroup = new SpiderlyFormGroup({});\n this.initFormGroup(helperFormGroup, targetClass, initialValues);\n\n if (index == null) {\n formArray.push(helperFormGroup);\n } else {\n formArray.insert(index, helperFormGroup);\n }\n\n return helperFormGroup;\n }\n\n removeFormControlFromTheFormArray(\n formArray: SpiderlyFormArray,\n index: number,\n ) {\n if (index == null) throw new SpiderlyError('Can not pass null index.');\n\n formArray.removeAt(index);\n }\n\n initFormArray<T extends BaseEntity>(\n formArray: SpiderlyFormArray<T>,\n targetClass: SchemaAwareConstructor<T>,\n initialValues: T[] = [],\n ) {\n if (!formArray)\n throw new SpiderlyError(\n 'You must pass a FormArray instance to be initialized or updated.',\n );\n\n if (!targetClass)\n throw new SpiderlyError('You did not initialize targetClass');\n\n formArray.formGroupInitialValues = {}; // When we need we can pass formGroupInitialValues to this method instead of assigning it to empty object\n formArray.targetClass = targetClass;\n\n initialValues.forEach((model, index) => {\n const existingControl = formArray.at(index);\n\n if (existingControl instanceof SpiderlyFormGroup) {\n this.initFormGroup(existingControl, targetClass, model);\n } else {\n let helperFormGroup: SpiderlyFormGroup = new SpiderlyFormGroup({});\n this.initFormGroup(helperFormGroup, targetClass, model);\n formArray.push(helperFormGroup);\n }\n });\n\n return formArray;\n }\n\n //#region Helpers\n\n showInvalidFieldsMessage = () => {\n this.messageService.warningMessage(\n this.translocoService.translate('YouHaveSomeInvalidFieldsDescription'),\n this.translocoService.translate('YouHaveSomeInvalidFieldsTitle'),\n );\n };\n\n generateNewNegativeId<T extends BaseEntity>(formArray: SpiderlyFormArray<T>) {\n return -formArray.getRawValue().filter((x) => x.id < 0).length - 1;\n }\n\n getSaveBodyMainDTOKey = (saveBodyClass: SchemaAwareConstructor<any>) => {\n const schema = saveBodyClass.schema;\n return Object.keys(schema).find(\n (k) => schema[k].isSaveBodyMainDTO === true,\n );\n };\n\n mapMainUIFormToSaveBody = <\n TMainUIForm extends BaseEntity,\n TSaveBody extends BaseEntity,\n >(\n mainUIFormClass: SchemaAwareConstructor<TMainUIForm>,\n mainUIFormValues: TMainUIForm,\n ): TSaveBody => {\n let saveBody = {} as TSaveBody;\n\n Object.keys(mainUIFormClass.schema).forEach((propName) => {\n const property = mainUIFormClass.schema[propName];\n const value = mainUIFormValues[propName];\n\n // Handle ordered one-to-many (e.g., \"orderedItemsMainUIFormDTO\" -> \"orderedItemsSaveBodyDTO\")\n if (\n propName.startsWith('ordered') &&\n propName.endsWith('MainUIFormDTO')\n ) {\n const newKey = propName.replace('MainUIFormDTO', 'SaveBodyDTO');\n // Recursively map nested DTOs\n const relatedEntity = property.nestedConstructor;\n saveBody[newKey] =\n value?.map((item) =>\n this.mapMainUIFormToSaveBody(relatedEntity, item),\n ) ?? [];\n }\n // Handle multi-select (e.g., \"itemsIds\" -> \"selectedItemsIds\")\n else if (propName.endsWith('Ids')) {\n saveBody[`selected${capitalizeFirstChar(propName)}`] = value ?? [];\n }\n // Handle multi-autocomplete (e.g., \"itemsNamebookDTOList\" -> \"selectedItemsIds\")\n else if (propName.endsWith('NamebookDTOList')) {\n saveBody[`selected${capitalizeFirstChar(propName)}`] = value ?? [];\n }\n // Handle the main DTO object (e.g., \"entityDTO\")\n else {\n saveBody[propName] = value;\n }\n });\n\n return saveBody;\n };\n\n isControlValid(\n control: SpiderlyFormControl | SpiderlyFormGroup | SpiderlyFormArray,\n controlNamesFromHtml?: string[],\n ): boolean {\n let invalid = false;\n\n if (control instanceof SpiderlyFormControl) {\n if (\n control.invalid &&\n (controlNamesFromHtml == null ||\n controlNamesFromHtml?.includes(control.label))\n ) {\n control.markAsDirty();\n invalid = true;\n }\n } else if (control instanceof SpiderlyFormGroup) {\n Object.keys(control.controls).forEach((key) => {\n const nestedControl = control.controls[key];\n if (!this.isControlValid(nestedControl, control.controlNamesFromHtml)) {\n invalid = true;\n }\n });\n } else if (control instanceof SpiderlyFormArray) {\n if (control.errors) {\n control.markAsDirty();\n this.messageService.warningMessage(control.errors['_']);\n invalid = true;\n }\n\n control.controls.forEach(\n (\n nestedControl:\n | SpiderlyFormControl\n | SpiderlyFormGroup\n | SpiderlyFormArray,\n ) => {\n if (!this.isControlValid(nestedControl)) {\n invalid = true;\n }\n },\n );\n }\n\n if (invalid) {\n return false;\n }\n\n return true;\n }\n\n //#endregion\n}\n","import { HttpClient } from '@angular/common/http';\nimport {\n ChangeDetectorRef,\n Component,\n KeyValueDiffer,\n KeyValueDiffers,\n OnInit,\n} from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { BaseEntity, SchemaAwareConstructor } from '../../entities/base-entity';\nimport { SpiderlyError } from '../../errors/spiderly-error';\nimport { getParentUrl } from '../../services/helper-functions';\nimport { SpiderlyMessageService } from '../../services/spiderly-message.service';\nimport {\n SpiderlyFormArray,\n SpiderlyFormControl,\n SpiderlyFormGroup,\n} from '../spiderly-form-control/spiderly-form-control';\nimport { BaseFormService } from './../../services/base-form.service';\n\n@Component({\n selector: 'base-form',\n template: '',\n styles: [],\n standalone: false,\n})\nexport class BaseFormComponent<\n TMainUIForm extends BaseEntity = any,\n TSaveBody extends BaseEntity = any,\n> implements OnInit {\n /**\n * The root form group that holds all form controls, typed to `TSaveBody`.\n * Assign `saveObservableMethod` on it to define the HTTP call used for saving.\n * The form controls are built automatically from the `TSaveBody` schema when you call\n * `baseFormService.initFormGroup(this.parentFormGroup, saveBodyClass, saveBody)`.\n *\n * @example\n * ```ts\n * this.parentFormGroup.saveObservableMethod = this.apiService.saveProduct;\n *\n * this.baseFormService.initFormGroup(\n * this.parentFormGroup,\n * ProductSaveBody,\n * saveBody,\n * );\n * ```\n */\n parentFormGroup = new SpiderlyFormGroup<TSaveBody>({} as any);\n\n /**\n * The class reference for the main UI form entity (`TMainUIForm`).\n * This represents the shape of the data **returned by the API** after a save.\n * Used internally by `mapMainUIFormToSaveBody` to transform the API response back into `TSaveBody`\n * for form re-initialization.\n *\n * @example\n * ```ts\n * this.mainUIFormClass = ProductMainUIForm;\n * ```\n */\n mainUIFormClass: SchemaAwareConstructor<TMainUIForm>;\n\n /**\n * The class reference for the save body entity (`TSaveBody`).\n * This represents the shape of the data **sent to the API** when saving.\n * Used internally to build form controls from the schema via `initFormGroup`,\n * and to locate the main DTO property (marked with `isSaveBodyMainDTO: true`) for extracting the saved entity's ID.\n *\n * @example\n * ```ts\n * this.saveBodyClass = ProductSaveBody;\n * ```\n */\n saveBodyClass: SchemaAwareConstructor<TSaveBody>;\n\n /**\n * The toast message displayed after a successful save.\n * Override this to customize the success notification text for a specific entity.\n * If you want to change the message for all entities, update the `SuccessfulSaveToastDescription` key\n * in your translation JSON file instead.\n *\n * @example\n * ```ts\n * this.successfulSaveToastDescription = 'Product saved successfully!';\n * ```\n */\n successfulSaveToastDescription: string = this.translocoService.translate(\n 'SuccessfulSaveToastDescription',\n );\n\n private modelDiffer: KeyValueDiffer<string, any>;\n\n constructor(\n protected differs: KeyValueDiffers,\n protected http: HttpClient,\n protected messageService: SpiderlyMessageService,\n protected changeDetectorRef: ChangeDetectorRef,\n protected router: Router,\n protected route: ActivatedRoute,\n protected translocoService: TranslocoService,\n protected baseFormService: BaseFormService,\n ) {}\n\n ngOnInit() {}\n\n //#region Model\n\n /**\n * Executes the save flow for the form. The execution order is:\n * 1. Builds the save body from the form's raw value.\n * 2. Calls {@link onBeforeSave} — use this to modify the save body before validation.\n * 3. Validates the form. If invalid, shows an error message and stops.\n * 4. Sends the save HTTP request via `saveObservableMethod`.\n * 5. Calls {@link onAfterSaveRequest} — fires immediately after the request is sent, before the response arrives.\n * 6. On successful response: shows a success toast, reroutes, and calls {@link onAfterSave}. The form is re-initialized only when `rerouteToParentSlugAfterSave` is `false`.\n *\n * @param rerouteToParentSlugAfterSave - When `true` (default), navigates to the parent URL after save. When `false`, re-initializes the form and navigates to the saved object's URL.\n *\n * @example\n * ```html\n * <button (click)=\"onSave()\">Save</button>\n * ```\n *\n * @example\n * ```html\n * <!-- Save and stay on the saved object's page -->\n * <button (click)=\"onSave(false)\">Save and stay</button>\n * ```\n */\n // onSave method is here only because of the hooks, we should move everything except them to the BaseFromService\n onSave = (rerouteToParentSlugAfterSave: boolean = true) => {\n if (!this.saveBodyClass)\n throw new SpiderlyError('You did not initialize saveBodyClass');\n\n if (!this.mainUIFormClass)\n throw new SpiderlyError('You did not initialize mainUIFormClass');\n\n let saveBody = this.parentFormGroup.getRawValue();\n\n this.onBeforeSave(saveBody);\n\n const isValid = this.baseFormService.isControlValid(this.parentFormGroup);\n\n if (isValid) {\n this.parentFormGroup\n .saveObservableMethod(saveBody)\n .subscribe((res: TMainUIForm) => {\n this.messageService.successMessage(\n this.successfulSaveToastDescription,\n );\n\n if (rerouteToParentSlugAfterSave) {\n this.rerouteToSavedObject(undefined);\n } else {\n saveBody = this.baseFormService.mapMainUIFormToSaveBody(\n this.mainUIFormClass,\n res,\n );\n\n this.baseFormService.initFormGroup(\n this.parentFormGroup,\n this.saveBodyClass,\n saveBody,\n );\n\n const saveBodyMainDTOKey =\n this.baseFormService.getSaveBodyMainDTOKey(this.saveBodyClass);\n const savedObjectId = saveBody[saveBodyMainDTOKey]?.id;\n this.rerouteToSavedObject(savedObjectId); // You always need to have id, because of id == 0 and version change\n }\n\n this.onAfterSave();\n });\n\n this.onAfterSaveRequest();\n } else {\n this.baseFormService.showInvalidFieldsMessage();\n }\n };\n\n /**\n * Handles navigation after a successful save.\n * Override this to customize the post-save navigation behavior.\n * By default, navigates to the parent URL when `rerouteId` is not provided, or to the saved object's URL otherwise.\n *\n * @param rerouteId - The ID of the saved object, used to build the target URL. When not provided, navigates to the parent URL.\n *\n * @example\n * ```ts\n * // Override to navigate to a custom route after save\n * override rerouteToSavedObject(rerouteId: number | string): void {\n * this.router.navigateByUrl(`/products/${rerouteId}/details`);\n * }\n * ```\n */\n rerouteToSavedObject(rerouteId: number | string): void {\n if (rerouteId == null) {\n const currentUrl = this.router.url;\n const parentUrl: string = getParentUrl(currentUrl);\n this.router.navigateByUrl(parentUrl);\n return;\n }\n\n const segments = this.router.url.split('/');\n segments[segments.length - 1] = rerouteId.toString();\n\n const newUrl = segments.join('/');\n this.router.navigateByUrl(newUrl);\n }\n\n /**\n * Hook that runs **before** form validation and the save request.\n * Use this to modify the save body or perform any pre-save logic (e.g., transforming data, setting computed fields).\n *\n * @param saveBody - The current save body built from the form's raw value. Mutate it directly to change what gets sent to the server.\n *\n * @example\n * ```ts\n * onBeforeSave = (saveBody?: ProductSaveBody) => {\n * saveBody.productDTO.fullName = saveBody.productDTO.firstName + ' ' + saveBody.productDTO.lastName;\n * };\n * ```\n */\n onBeforeSave = (saveBody?: TSaveBody) => {};\n\n /**\n * Hook that runs **after** a successful save response is received.\n * Use this for post-save side effects (e.g., refreshing related data, showing additional notifications).\n *\n * @example\n * ```ts\n * onAfterSave = () => {\n * this.loadRelatedProducts();\n * };\n * ```\n */\n onAfterSave = () => {};\n\n /**\n * Hook that runs immediately **after** the save HTTP request is sent, but **before** the response arrives.\n * Use this for side effects that should happen as soon as the request is dispatched (e.g., disabling UI elements, starting a loading indicator).\n *\n * @example\n * ```ts\n * onAfterSaveRequest = () => {\n * this.isSaving = true;\n * };\n * ```\n */\n onAfterSaveRequest = () => {};\n\n //#endregion\n\n //#region Model List\n\n getFormArrayControlByIndex<T>(\n formControlName: keyof T & string,\n formArray: SpiderlyFormArray<T>,\n index: number,\n filter?: (formGroups: SpiderlyFormGroup<T>[]) => SpiderlyFormGroup<T>[],\n ): SpiderlyFormControl {\n // if(formArray.controlNamesFromHtml.findIndex(x => x === formControlName) === -1)\n // formArray.controlNamesFromHtml.push(formControlName);\n\n let filteredFormGroups: SpiderlyFormGroup<T>[];\n\n if (filter) {\n filteredFormGroups = filter(formArray.controls as SpiderlyFormGroup<T>[]);\n } else {\n return (formArray.controls[index] as SpiderlyFormGroup<T>).controls[\n formControlName\n ] as SpiderlyFormControl;\n }\n\n return filteredFormGroups[index]?.controls[\n formControlName\n ] as SpiderlyFormControl; // FT: Don't change this. It's always possible that change detection occurs before something.\n }\n\n getFormArrayControls<T>(\n formControlName: keyof T & string,\n formArray: SpiderlyFormArray<T>,\n filter?: (formGroups: SpiderlyFormGroup<T>[]) => SpiderlyFormGroup<T>[],\n ): SpiderlyFormControl[] {\n // if(formArray.controlNamesFromHtml.findIndex(x => x === formControlName) === -1)\n // formArray.controlNamesFromHtml.push(formControlName);\n\n let filteredFormGroups: SpiderlyFormGroup<T>[];\n\n if (filter) {\n filteredFormGroups = filter(formArray.controls as SpiderlyFormGroup<T>[]);\n } else {\n return (formArray.controls as SpiderlyFormGroup<T>[]).map(\n (x) => x.controls[formControlName] as SpiderlyFormControl,\n );\n }\n\n return filteredFormGroups.map(\n (x) => x.controls[formControlName] as SpiderlyFormControl,\n );\n }\n\n removeFormControlsFromTheFormArray(\n formArray: SpiderlyFormArray,\n indexes: number[],\n ) {\n // Sort indexes in descending order to avoid index shifts when removing controls\n const sortedIndexes = indexes.sort((a, b) => b - a);\n\n sortedIndexes.forEach((index) => {\n if (index >= 0 && index < formArray.length) {\n formArray.removeAt(index);\n }\n });\n }\n\n //#endregion\n}\n","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'panel-body',\n templateUrl: './panel-body.component.html',\n styleUrl: './panel-body.component.scss',\n standalone: false,\n})\nexport class PanelBodyComponent implements OnInit {\n @Input() normalBottomPadding: boolean = false; // FT: By default we set to false, when the grid is inside the body.\n\n constructor() {}\n\n ngOnInit(): void {}\n}\n","<!-- this is selector, not the class -->\n<div\n class=\"panel-body\"\n [ngClass]=\"{\n 'non-grid-panel-bottom-padding': normalBottomPadding,\n }\"\n style=\"overflow: auto\"\n>\n <!-- 'card': true, -->\n <ng-content></ng-content>\n</div>\n","import { Component, OnInit } from '@angular/core';\n\n@Component({\n selector: 'panel-footer',\n templateUrl: './panel-footer.component.html',\n styleUrl: './panel-footer.component.scss',\n standalone: false,\n})\nexport class PanelFooterComponent implements OnInit {\n constructor() {}\n\n ngOnInit(): void {}\n}\n","<div class=\"spiderly-panel-footer\">\n <div class=\"buttons-wrapper\">\n <ng-content></ng-content>\n </div>\n <span class=\"p-text-secondary\">\n <ng-content select=\"[footerRight]\"></ng-content>\n </span>\n</div>\n","import { TranslocoService } from '@jsverse/transloco';\nimport { Component, OnInit, Input } from '@angular/core';\n\n@Component({\n selector: 'panel-header',\n templateUrl: './panel-header.component.html',\n styles: [\n `\n .p-panel-icons-end {\n font-size: 50px;\n }\n `,\n ],\n standalone: false,\n})\nexport class PanelHeaderComponent implements OnInit {\n @Input() title: string;\n /** Whether the title is rendered in the large style. */\n @Input() showBigTitle: boolean;\n /** Whether the header icon is shown. Defaults to `true`. */\n @Input() showIcon: boolean = true;\n @Input() icon: string;\n @Input() index: number;\n @Input() tabs: SpiderlyTab[];\n\n constructor(private translocoService: TranslocoService) {}\n\n ngOnInit(): void {\n if (this.title == null)\n this.title = this.translocoService.translate('Details');\n\n if (this.showIcon === true && this.icon == null)\n this.icon = 'pi pi-file-edit';\n }\n\n setTabIsSelected(tab: SpiderlyTab) {\n this.tabs.forEach((t) => {\n t.isSelected = false;\n });\n\n tab.isSelected = true;\n }\n}\n\nexport class SpiderlyTab {\n label?: string;\n id?: number;\n icon?: string;\n isSelected?: boolean;\n\n constructor({\n label,\n id,\n icon,\n isSelected,\n }: {\n label?: string;\n id?: number;\n icon?: string;\n isSelected?: boolean;\n } = {}) {\n this.label = label;\n this.id = id;\n this.icon = icon;\n this.isSelected = isSelected;\n }\n}\n","<div style=\"display: flex; align-items: center; gap: 24px; flex-wrap: wrap\">\n @if (tabs == null) {\n <div style=\"display: flex; align-items: center; gap: 8px\">\n <span *ngIf=\"index != null\" class=\"number-circle\">{{ index + 1 }}</span>\n <i\n class=\"{{ icon }} primary-color\"\n [style]=\"showBigTitle ? 'font-size: 21px' : 'font-size: 16px;'\"\n ></i>\n <div [style]=\"showBigTitle ? 'font-size: 17.5px; font-weight: 500;' : ''\">\n {{ title }}\n </div>\n </div>\n } @else {\n @for (tab of tabs; track $index) {\n <div\n (click)=\"setTabIsSelected(tab)\"\n [style]=\"{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n cursor: 'pointer',\n fontWeight: tab.isSelected ? '700' : 'normal',\n }\"\n >\n <span *ngIf=\"index != null\" class=\"number-circle\">{{ index + 1 }}</span>\n <i\n class=\"{{ tab.icon }} primary-color\"\n [style]=\"showBigTitle ? 'font-size: 21px' : 'font-size: 16px;'\"\n ></i>\n <div\n [style]=\"showBigTitle ? 'font-size: 17.5px; font-weight: 500;' : ''\"\n >\n {{ tab.label }}\n </div>\n </div>\n }\n }\n</div>\n","import {\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { MenuItem } from 'primeng/api';\nimport { Menu } from 'primeng/menu';\n\n@Component({\n selector: 'spiderly-panel',\n templateUrl: './spiderly-panel.component.html',\n styleUrl: './spiderly-panel.component.scss',\n standalone: false,\n})\nexport class SpiderlyPanelComponent implements OnInit {\n @Input() isFirstMultiplePanel: boolean = false;\n @Input() isMiddleMultiplePanel: boolean = false;\n @Input() isLastMultiplePanel: boolean = false;\n @Input() toggleable: boolean = false;\n @Input() toggler: 'header' | 'icon' | null = 'icon';\n @Input() collapsed: boolean = false;\n @Input() crudMenu: MenuItem[];\n /** Whether the CRUD context-menu icon is shown. Defaults to `true`. */\n @Input() showCrudMenu: boolean = true;\n /** Whether a remove/delete icon is shown. Defaults to `false`. */\n @Input() showRemoveIcon: boolean = false;\n @Input() index: number;\n /** Whether the panel header is rendered. Defaults to `true`. */\n @Input() showPanelHeader: boolean = true;\n\n @Output() onMenuIconClick: EventEmitter<number> = new EventEmitter();\n @Output() onRemoveIconClick: EventEmitter<null> = new EventEmitter();\n\n @ViewChild('menu') menu: Menu;\n\n constructor() {}\n\n ngOnInit(): void {}\n\n menuItemClick(index: number, event) {\n this.menu.toggle(event);\n this.onMenuIconClick.next(index);\n }\n\n removeItemClick() {\n this.onRemoveIconClick.next(null);\n }\n}\n","<p-panel\n [showHeader]=\"showPanelHeader\"\n [ngClass]=\"{\n 'multiple-panel-first-without-header':\n isFirstMultiplePanel && !showPanelHeader,\n 'multiple-panel-first': isFirstMultiplePanel,\n 'multiple-panel-middle-without-header':\n isMiddleMultiplePanel && !showPanelHeader,\n 'multiple-panel-middle': isMiddleMultiplePanel,\n 'multiple-panel-last-without-header':\n isLastMultiplePanel && !showPanelHeader,\n 'multiple-panel-last': isLastMultiplePanel,\n 'panel-border': !isFirstMultiplePanel,\n 'spiderly-panel': true,\n 'panel-header-cursor-pointer': toggler === 'header' && toggleable,\n }\"\n [toggleable]=\"toggleable\"\n [toggler]=\"toggler\"\n [collapsed]=\"toggleable && collapsed\"\n expandIcon=\"pi pi-chevron-up\"\n collapseIcon=\"pi pi-chevron-down\"\n>\n <ng-template pTemplate=\"header\">\n <div>\n <ng-content select=\"panel-header\"></ng-content>\n <ng-content select=\"[panelHeader]\"></ng-content>\n </div>\n </ng-template>\n\n <ng-template pTemplate=\"icons\">\n <div *ngIf=\"showCrudMenu && crudMenu\" class=\"mr-2\">\n <i\n class=\"pi pi-ellipsis-h icon-hover\"\n (click)=\"menuItemClick(index, $event)\"\n ></i>\n <!-- https://github.com/primefaces/primeng/issues/13934 -->\n <p-menu\n #menu\n [model]=\"crudMenu\"\n [popup]=\"true\"\n appendTo=\"body\"\n [tabindex]=\"undefined\"\n ></p-menu>\n </div>\n <div *ngIf=\"showRemoveIcon\" class=\"mr-2\">\n <i\n class=\"pi pi-minus icon-hover error-color-light\"\n (click)=\"removeItemClick()\"\n ></i>\n </div>\n </ng-template>\n\n <div class=\"panel-body-wrapper\">\n <ng-content select=\"panel-body\"></ng-content>\n </div>\n\n <ng-content select=\"panel-footer\"></ng-content>\n</p-panel>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PanelBodyComponent } from './panel-body/panel-body.component';\nimport { PanelFooterComponent } from './panel-footer/panel-footer.component';\nimport { PanelHeaderComponent } from './panel-header/panel-header.component';\nimport { SpiderlyPanelComponent } from './spiderly-panel/spiderly-panel.component';\nimport { MenuModule } from 'primeng/menu';\nimport { PanelModule } from 'primeng/panel';\n\n@NgModule({\n imports: [CommonModule, MenuModule, PanelModule],\n exports: [\n PanelHeaderComponent,\n PanelBodyComponent,\n PanelFooterComponent,\n SpiderlyPanelComponent,\n ],\n declarations: [\n PanelHeaderComponent,\n PanelBodyComponent,\n PanelFooterComponent,\n SpiderlyPanelComponent,\n ],\n providers: [],\n})\nexport class SpiderlyPanelsModule {}\n","import { CommonModule } from '@angular/common';\nimport { HttpClient } from '@angular/common/http';\nimport {\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n KeyValueDiffers,\n OnInit,\n Output,\n} from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { ButtonModule } from 'primeng/button';\nimport { InputOtp } from 'primeng/inputotp';\nimport { SpiderlyControlsModule } from '../../../controls/spiderly-controls.module';\nimport { VerificationTokenRequest } from '../../../entities/security-entities';\nimport { BaseFormService } from '../../../services/base-form.service';\nimport { SpiderlyMessageService } from '../../../services/spiderly-message.service';\nimport { BaseFormComponent } from '../../base-form/base-form.component';\nimport { SpiderlyFormGroup } from '../../spiderly-form-control/spiderly-form-control';\nimport { SpiderlyPanelsModule } from '../../spiderly-panels/spiderly-panels.module';\n\n@Component({\n selector: 'verification-wrapper',\n templateUrl: './verification-wrapper.component.html',\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n SpiderlyControlsModule,\n SpiderlyPanelsModule,\n ButtonModule,\n InputOtp,\n TranslocoDirective,\n ],\n})\nexport class VerificationWrapperComponent\n extends BaseFormComponent\n implements OnInit\n{\n verificationTokenRequestFormGroup =\n new SpiderlyFormGroup<VerificationTokenRequest>({});\n\n @Input() email: string;\n @Output() onResendVerificationToken: EventEmitter<any> = new EventEmitter();\n @Output() onCodeSubmit: EventEmitter<string> = new EventEmitter();\n\n constructor(\n protected override differs: KeyValueDiffers,\n protected override http: HttpClient,\n protected override messageService: SpiderlyMessageService,\n protected override changeDetectorRef: ChangeDetectorRef,\n protected override router: Router,\n protected override route: ActivatedRoute,\n protected override translocoService: TranslocoService,\n protected override baseFormService: BaseFormService,\n ) {\n super(\n differs,\n http,\n messageService,\n changeDetectorRef,\n router,\n route,\n translocoService,\n baseFormService,\n );\n }\n\n override ngOnInit() {\n this.initVerificationTokenRequestFormGroup(\n new VerificationTokenRequest({ email: this.email }),\n );\n }\n\n initVerificationTokenRequestFormGroup(model: VerificationTokenRequest) {\n this.baseFormService.initFormGroup(\n this.verificationTokenRequestFormGroup,\n VerificationTokenRequest,\n model,\n ['verificationCode'],\n );\n }\n\n codeSubmit() {\n let isValid: boolean = this.baseFormService.isControlValid(\n this.verificationTokenRequestFormGroup,\n );\n\n if (isValid) {\n this.onCodeSubmit.next(\n this.verificationTokenRequestFormGroup.controls.verificationCode.getRawValue(),\n );\n }\n }\n\n resendVerificationToken() {\n this.onResendVerificationToken.next(null);\n }\n}\n","<ng-container *transloco=\"let t\">\n <div\n class=\"min-h-screen\"\n style=\"display: flex; justify-content: center; align-items: center\"\n >\n <div class=\"dialog\" style=\"padding: 0px\">\n @if (verificationTokenRequestFormGroup != null) {\n <spiderly-panel>\n <panel-header\n [title]=\"t('AccountVerificationHeader')\"\n [showBigTitle]=\"true\"\n icon=\"pi pi-envelope\"\n ></panel-header>\n\n <panel-body>\n <form class=\"spiderly-grid\">\n <div class=\"col-8\">\n <div style=\"font-size: 17.5px\">\n {{ t(\"AccountVerificationTitle\") }}\n </div>\n </div>\n <div class=\"col-8\">\n {{ t(\"AccountVerificationDescription\", { email: email }) }}\n </div>\n <div class=\"col-8\">\n <!--\n PrimeNG's InputOtp calls event.preventDefault() on the Enter keydown\n (Enter is a non-digit while integerOnly is on, and once all tokens are\n filled it blocks every key but Delete), which kills the browser's\n implicit submit via the type=\"submit\" button. Wire Enter straight to\n codeSubmit() so \"paste the code + Enter\" still submits. preventDefault\n doesn't stop propagation, so this bubbled keydown listener still fires.\n -->\n <p-inputOtp\n [formControl]=\"verificationTokenRequestFormGroup.getControl('verificationCode')\"\n [length]=\"6\"\n [integerOnly]=\"true\"\n [autofocus]=\"true\"\n (keydown.enter)=\"codeSubmit()\"\n ></p-inputOtp>\n </div>\n <div class=\"col-8\">\n <spiderly-button\n (onClick)=\"codeSubmit()\"\n [label]=\"t('Submit')\"\n icon=\"pi pi-verified\"\n type=\"submit\"\n ></spiderly-button>\n </div>\n </form>\n </panel-body>\n\n <panel-footer>\n <a\n pButton\n class=\"p-button-link\"\n [label]=\"t('GoToGmail')\"\n icon=\"pi pi-external-link\"\n href=\"https://mail.google.com/mail/u/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n ></a>\n <a\n pButton\n class=\"p-button-link\"\n [label]=\"t('GoToYahoo')\"\n icon=\"pi pi-external-link\"\n href=\"https://mail.yahoo.com/d/folders/1/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n ></a>\n </panel-footer>\n <panel-footer>\n <div>\n {{ t(\"ResendVerificationCodeFirstPart\") }}\n <a class=\"link\" (click)=\"resendVerificationToken()\">{{\n t(\"ResendVerificationCodeLinkSecondPart\")\n }}</a>\n </div>\n </panel-footer>\n </spiderly-panel>\n } @else {\n <!-- TODO FT: Add skeleton -->\n }\n </div>\n </div>\n</ng-container>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { VerificationWrapperComponent } from './verification-wrapper.component';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { SpiderlyMessageService } from '../../../services/spiderly-message.service';\nimport { AuthServiceBase } from '../../../services/auth.service.base';\n\n@Component({\n selector: 'login-verification',\n templateUrl: './login-verification.component.html',\n imports: [VerificationWrapperComponent],\n})\nexport class LoginVerificationComponent implements OnInit {\n @Input() email: string;\n @Input() userId: number;\n\n constructor(\n private authService: AuthServiceBase,\n private messageService: SpiderlyMessageService,\n private translocoService: TranslocoService,\n ) {}\n\n ngOnInit() {}\n\n resendVerificationToken() {\n this.authService\n .sendLoginVerificationEmail({ email: this.email })\n .subscribe(() => {\n this.messageService.successMessage(\n this.translocoService.translate('SuccessfullySentVerificationCode'),\n );\n });\n }\n\n onCodeSubmit(event: string) {\n this.authService\n .login({ email: this.email, verificationCode: event })\n .subscribe(() => {\n this.messageService.successMessage(\n this.translocoService.translate(\n 'YouHaveSuccessfullyVerifiedYourAccount',\n ),\n );\n this.authService.navigateToDashboard();\n });\n }\n}\n","<verification-wrapper\n [email]=\"email\"\n (onResendVerificationToken)=\"resendVerificationToken()\"\n (onCodeSubmit)=\"onCodeSubmit($event)\"\n></verification-wrapper>\n","import { CommonModule } from '@angular/common';\nimport { HttpClient } from '@angular/common/http';\nimport {\n ChangeDetectorRef,\n Component,\n Input,\n KeyValueDiffers,\n OnInit,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { SpiderlyControlsModule } from '../../../controls/spiderly-controls.module';\nimport { Login } from '../../../entities/security-entities';\nimport { AuthServiceBase } from '../../../services/auth.service.base';\nimport { BaseFormService } from '../../../services/base-form.service';\nimport { SpiderlyMessageService } from '../../../services/spiderly-message.service';\nimport { BaseFormComponent } from '../../base-form/base-form.component';\nimport { SpiderlyFormGroup } from '../../spiderly-form-control/spiderly-form-control';\nimport { AuthCardComponent } from '../auth-card/auth-card.component';\nimport { ExternalLoginComponent } from '../external-login/external-login.component';\nimport { LoginVerificationComponent } from '../partials/login-verification.component';\n\n@Component({\n selector: 'spiderly-login',\n templateUrl: './login.component.html',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n AuthCardComponent,\n ExternalLoginComponent,\n SpiderlyControlsModule,\n LoginVerificationComponent,\n TranslocoDirective,\n ],\n})\nexport class SpiderlyLoginComponent extends BaseFormComponent implements OnInit {\n loginFormGroup = new SpiderlyFormGroup<Login>({});\n showEmailSentDialog: boolean = false;\n\n /** Per-code provider icon overrides, forwarded to <spiderly-external-login>. */\n @Input() providerIcons: Record<string, string> = {};\n\n constructor(\n protected override differs: KeyValueDiffers,\n protected override http: HttpClient,\n protected override messageService: SpiderlyMessageService,\n protected override changeDetectorRef: ChangeDetectorRef,\n protected override router: Router,\n protected override route: ActivatedRoute,\n protected override translocoService: TranslocoService,\n protected override baseFormService: BaseFormService,\n private authService: AuthServiceBase,\n ) {\n super(\n differs,\n http,\n messageService,\n changeDetectorRef,\n router,\n route,\n translocoService,\n baseFormService,\n );\n }\n\n override ngOnInit() {\n this.initLoginFormGroup(new Login({}));\n this.showExternalAuthErrorIfPresent();\n }\n\n // Surface a friendly message when the server-side external login bounced back with an error (captured from\n // the URL at bootstrap by AuthServiceBase). \"expired\" = the user lingered on the provider's account picker.\n private showExternalAuthErrorIfPresent() {\n const code = this.authService.externalAuthErrorCode;\n if (!code) {\n return;\n }\n this.authService.externalAuthErrorCode = null; // show once\n const messageKey =\n code === 'expired' ? 'ExternalLoginExpiredDetails' : 'ExternalLoginFailedDetails';\n this.messageService.warningMessage(this.translocoService.translate(messageKey));\n }\n\n initLoginFormGroup(model: Login) {\n this.baseFormService.initFormGroup(this.loginFormGroup, Login, model, [\n 'email',\n ]);\n }\n\n sendLoginVerificationEmail() {\n let isFormGroupValid: boolean = this.baseFormService.isControlValid(\n this.loginFormGroup,\n );\n\n if (isFormGroupValid == false) {\n this.baseFormService.showInvalidFieldsMessage();\n return;\n }\n\n this.authService\n .sendLoginVerificationEmail(this.loginFormGroup.getRawValue())\n .subscribe((result) => {\n if (result.message) {\n this.messageService.successMessage(result.message);\n }\n this.showEmailSentDialog = true;\n });\n }\n}\n","<ng-container *transloco=\"let t\">\n @if (loginFormGroup != null) {\n @if (showEmailSentDialog == false) {\n <spiderly-auth-card>\n <form [formGroup]=\"loginFormGroup\" style=\"margin-bottom: 16px\">\n <div>\n <spiderly-textbox\n [control]=\"loginFormGroup.getControl('email')\"\n ></spiderly-textbox>\n </div>\n\n <div class=\"mt-4 mb-6\">\n <div class=\"text-center\" style=\"font-size: smaller\">\n {{ t(\"AgreementsOnRegister\") }}\n <b\n routerLink=\"/user-agreement\"\n class=\"primary-color cursor-pointer\"\n >{{ t(\"UserAgreement\") }}</b\n >\n {{ t(\"and\") }}\n <b\n routerLink=\"/privacy-policy\"\n class=\"primary-color cursor-pointer\"\n >{{ t(\"PrivacyPolicy\") }}</b\n >.\n </div>\n </div>\n\n <div style=\"display: flex; flex-direction: column; gap: 16px\">\n <spiderly-button\n [label]=\"t('Login')\"\n (onClick)=\"sendLoginVerificationEmail()\"\n [outlined]=\"true\"\n [style]=\"{ width: '100%' }\"\n type=\"submit\"\n ></spiderly-button>\n </div>\n </form>\n\n <spiderly-external-login\n [providerIcons]=\"providerIcons\"\n ></spiderly-external-login>\n </spiderly-auth-card>\n } @else {\n <login-verification\n [email]=\"loginFormGroup.controls.email.getRawValue()\"\n ></login-verification>\n }\n\n <!--\n General projection slot for consumer-supplied login extras (a bot-challenge widget, a notice,\n an extra field, …). Rendered in BOTH the email-entry and code-verification states — outside the\n showEmailSentDialog toggle — so projected content survives the email → resend flow (e.g. a\n single-use challenge widget that must stay mounted to issue a fresh token on resend).\n Project with the `loginExtra` attribute: <spiderly-login><my-widget loginExtra/></spiderly-login>.\n -->\n <ng-content select=\"[loginExtra]\"></ng-content>\n }\n</ng-container>\n","import { Component, Input } from '@angular/core';\nimport { SkeletonModule } from 'primeng/skeleton';\n\n@Component({\n selector: 'card-skeleton',\n templateUrl: './card-skeleton.component.html',\n styles: [],\n imports: [SkeletonModule],\n})\nexport class CardSkeletonComponent {\n @Input() height: number = 400;\n titleHeight: number = 23;\n dataHeight: number;\n padding: number = 21;\n titleMarginBottom: number = 14;\n titleMarginTop: number = 4;\n\n ngOnInit() {\n this.dataHeight =\n this.height -\n (this.titleHeight +\n this.padding * 2 +\n this.titleMarginBottom +\n this.titleMarginTop);\n }\n}\n","<div\n class=\"rounded border surface-border p-6 surface-card\"\n [style]=\"'height: ' + height + 'px;'\"\n>\n <div\n [style]=\"\n 'margin-bottom:' +\n titleMarginBottom +\n 'px; margin-top:' +\n titleMarginTop +\n 'px;'\n \"\n >\n <p-skeleton width=\"160px\" [height]=\"titleHeight + 'px'\"></p-skeleton>\n </div>\n <div [style]=\"'height: ' + dataHeight + 'px;'\">\n <p-skeleton width=\"100%\" height=\"100%\" />\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormBuilder } from '@angular/forms';\nimport { MenuItem } from 'primeng/api';\nimport { SpiderlyPanelsModule } from '../spiderly-panels/spiderly-panels.module';\n\n@Component({\n selector: 'index-card',\n templateUrl: './index-card.component.html',\n imports: [CommonModule, SpiderlyPanelsModule],\n})\nexport class IndexCardComponent {\n @Input() last: boolean;\n @Input() index: number;\n @Input() header: string = '';\n @Input() description: string;\n /** Whether a remove/delete icon is shown. */\n @Input() showRemoveIcon: boolean;\n /** Whether the CRUD context-menu icon is shown. Defaults to `true`. */\n @Input() showCrudMenu: boolean = true;\n\n @Input() crudMenu: MenuItem[];\n\n @Output() onMenuIconClick = new EventEmitter<number>();\n @Output() onRemoveIconClick = new EventEmitter<null>();\n\n constructor(protected formBuilder: FormBuilder) {}\n\n ngOnInit() {}\n\n menuIconClick(index: number) {\n this.onMenuIconClick.next(index);\n }\n\n removeIconClick() {\n this.onRemoveIconClick.next(null);\n }\n}\n","<div\n [ngClass]=\"{\n 'last-child-zero-margin': last,\n 'card-margin-bottom': true,\n }\"\n>\n <spiderly-panel\n [crudMenu]=\"crudMenu\"\n [showCrudMenu]=\"showCrudMenu\"\n (onMenuIconClick)=\"menuIconClick($event)\"\n [showRemoveIcon]=\"showRemoveIcon\"\n (onRemoveIconClick)=\"removeIconClick()\"\n [index]=\"index\"\n >\n <panel-header\n [title]=\"header\"\n [index]=\"index\"\n [showIcon]=\"false\"\n ></panel-header>\n\n <panel-body>\n <ng-content>\n <!-- Custom things below description -->\n </ng-content>\n </panel-body>\n </spiderly-panel>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\nimport { FormBuilder } from '@angular/forms';\nimport { SpiderlyPanelsModule } from '../spiderly-panels/spiderly-panels.module';\n\n@Component({\n selector: 'info-card',\n templateUrl: './info-card.component.html',\n styleUrl: './info-card.component.scss',\n imports: [CommonModule, SpiderlyPanelsModule],\n})\nexport class InfoCardComponent {\n @Input() header = '';\n /** Whether the small icon variant is shown. Defaults to `true`. */\n @Input() showSmallIcon = true;\n @Input() icon = 'pi pi-info-circle';\n @Input() textColor = '';\n\n constructor(protected formBuilder: FormBuilder) {}\n\n ngOnInit() {}\n}\n","<div class=\"card responsive-card-padding info-card\">\n <div class=\"info-card__content\">\n <div>\n <div class=\"info-card__header\">\n <i *ngIf=\"showSmallIcon\" class=\"{{ icon }} info-card__icon\"></i>\n {{ header }}\n </div>\n <div class=\"info-card__body\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n\n <div class=\"info-card__background-icon\">\n <i class=\"{{ icon }}\"></i>\n </div>\n</div>\n","import { BaseEntity } from './base-entity';\nimport { UserBase } from './security-entities';\n\nexport class InitTopBarData extends BaseEntity {\n companyName?: string;\n userProfilePath?: string;\n showProfileIcon?: boolean;\n currentUser?: UserBase;\n\n constructor({\n companyName,\n userProfilePath,\n showProfileIcon,\n currentUser,\n }: {\n companyName?: string;\n userProfilePath?: string;\n showProfileIcon?: boolean;\n currentUser?: UserBase;\n } = {}) {\n super();\n\n this.companyName = companyName;\n this.userProfilePath = userProfilePath;\n this.showProfileIcon = showProfileIcon;\n this.currentUser = currentUser;\n }\n\n static readonly typeName = 'InitTopBarData' as const;\n}\n","/** Parses a JSON entry from web storage; missing or corrupted entries read as null. */\nexport function readStoredJson(storage: Storage, key: string): any {\n try {\n return JSON.parse(storage.getItem(key) ?? 'null');\n } catch {\n return null;\n }\n}\n\n/** Writes a value to web storage as JSON; the counterpart of readStoredJson. */\nexport function writeStoredJson(storage: Storage, key: string, value: any): void {\n storage.setItem(key, JSON.stringify(value));\n}\n","import { AuthServiceBase } from './auth.service.base';\nimport { ApiSecurityService } from './api.service.security';\nimport { Injectable, OnDestroy } from '@angular/core';\nimport {\n map,\n Observable,\n of,\n Subject,\n Subscription,\n} from 'rxjs';\nimport { InitTopBarData } from '../entities/init-top-bar-data';\nimport { ConfigServiceBase } from './config.service.base';\nimport { readStoredJson, writeStoredJson } from './web-storage';\nimport { AutoCompleteCompleteEvent } from 'primeng/autocomplete';\nimport { Namebook } from '../entities/namebook';\n\nexport interface AppConfig {\n inputStyle: string;\n colorScheme: string;\n ripple: boolean;\n menuMode: string;\n}\n\ninterface LayoutState {\n staticMenuDesktopInactive: boolean;\n overlayMenuActive: boolean;\n profileSidebarVisible: boolean;\n profileDropdownSidebarVisible: boolean;\n staticMenuMobileActive: boolean;\n menuHoverActive: boolean;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class LayoutServiceBase implements OnDestroy {\n /**\n * Only the desktop collapse persists across reloads (a durable preference,\n * like the data table's column layout); the rest of LayoutState is\n * deliberately transient.\n */\n private static readonly menuDesktopInactiveKey =\n 'spiderly-layout:menu-desktop-inactive';\n\n userSubscription: Subscription;\n\n layoutConfig: AppConfig = {\n ripple: false,\n inputStyle: 'outlined',\n menuMode: 'static',\n colorScheme: 'light',\n };\n\n state: LayoutState = {\n staticMenuDesktopInactive:\n readStoredJson(localStorage, LayoutServiceBase.menuDesktopInactiveKey) ===\n true,\n overlayMenuActive: false,\n profileSidebarVisible: false,\n profileDropdownSidebarVisible: false,\n staticMenuMobileActive: false,\n menuHoverActive: false,\n };\n\n private overlayOpen = new Subject<any>();\n\n overlayOpen$ = this.overlayOpen.asObservable();\n\n constructor(\n protected apiService: ApiSecurityService,\n protected config: ConfigServiceBase,\n protected authService: AuthServiceBase,\n ) {}\n\n onMenuToggle() {\n if (this.isOverlay()) {\n this.state.overlayMenuActive = !this.state.overlayMenuActive;\n if (this.state.overlayMenuActive) {\n this.overlayOpen.next(null);\n }\n }\n\n if (this.isDesktop()) {\n this.state.staticMenuDesktopInactive =\n !this.state.staticMenuDesktopInactive;\n writeStoredJson(\n localStorage,\n LayoutServiceBase.menuDesktopInactiveKey,\n this.state.staticMenuDesktopInactive,\n );\n } else {\n this.state.staticMenuMobileActive = !this.state.staticMenuMobileActive;\n\n if (this.state.staticMenuMobileActive) {\n this.overlayOpen.next(null);\n }\n }\n }\n\n showProfileSidebar() {\n this.state.profileSidebarVisible = !this.state.profileSidebarVisible;\n if (this.state.profileSidebarVisible) {\n this.overlayOpen.next(null);\n }\n }\n\n showProfileDropdownSidebar() {\n this.state.profileDropdownSidebarVisible =\n !this.state.profileDropdownSidebarVisible;\n if (this.state.profileDropdownSidebarVisible) {\n this.overlayOpen.next(null);\n }\n }\n\n isOverlay() {\n return this.layoutConfig.menuMode === 'overlay';\n }\n\n isDesktop() {\n return window.innerWidth > 991;\n }\n\n isMobile() {\n return !this.isDesktop();\n }\n\n //#region Top Bar\n\n initTopBarData = (): Observable<InitTopBarData> => {\n return this.authService.user$.pipe(\n map((currentUser) => {\n return new InitTopBarData({\n companyName: this.config.companyName,\n userProfilePath: `/administration/users/${currentUser?.id}`,\n showProfileIcon: true,\n currentUser: currentUser,\n });\n }),\n );\n };\n\n //#endregion\n\n //#region Side Bar\n\n searchPartners = (\n event: AutoCompleteCompleteEvent,\n ): Observable<Namebook[]> => {\n return of();\n };\n\n partnersAutocompleteButtonClick = (selectedPartner: Namebook) => {};\n\n //#endregion\n\n ngOnDestroy(): void {\n if (this.userSubscription) {\n this.userSubscription.unsubscribe();\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { MenuChangeEvent } from '../../../entities/menuchangeevent';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SidebarMenuService {\n private menuSource = new Subject<MenuChangeEvent>();\n private resetSource = new Subject();\n\n menuSource$ = this.menuSource.asObservable();\n resetSource$ = this.resetSource.asObservable();\n\n onMenuStateChange(event: MenuChangeEvent) {\n this.menuSource.next(event);\n }\n\n reset() {\n this.resetSource.next(true);\n }\n}\n","import {\n ChangeDetectorRef,\n Component,\n HostBinding,\n Input,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { NavigationEnd, Router, RouterModule } from '@angular/router';\nimport {\n animate,\n state,\n style,\n transition,\n trigger,\n} from '@angular/animations';\nimport { Subscription } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { SidebarMenuService } from './sidebar-menu.service';\nimport { SpiderlyMenuItem } from './sidebar-menu.component';\nimport { AutoCompleteCompleteEvent } from 'primeng/autocomplete';\nimport { SpiderlyFormControl } from '../../spiderly-form-control/spiderly-form-control';\nimport { LayoutServiceBase } from '../../../services/app-layout.service.base';\nimport { AuthServiceBase } from '../../../services/auth.service.base';\nimport { ApiSecurityService } from '../../../services/api.service.security';\nimport { ConfigServiceBase } from '../../../services/config.service.base';\nimport { CommonModule } from '@angular/common';\nimport { SpiderlyControlsModule } from '../../../controls/spiderly-controls.module';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { Namebook } from '../../../entities/namebook';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[menuitem]',\n templateUrl: './menuitem.component.html',\n animations: [\n trigger('children', [\n state(\n 'collapsed',\n style({\n height: '0',\n }),\n ),\n state(\n 'expanded',\n style({\n height: '*',\n }),\n ),\n transition(\n 'collapsed <=> expanded',\n animate('400ms cubic-bezier(0.86, 0, 0.07, 1)'),\n ),\n ]),\n ],\n imports: [\n CommonModule,\n RouterModule,\n TranslocoDirective,\n SpiderlyControlsModule,\n ],\n})\nexport class MenuitemComponent implements OnInit, OnDestroy {\n @Input() item: SpiderlyMenuItem;\n\n @Input() index!: number;\n\n @Input() @HostBinding('class.layout-root-menuitem') root!: boolean;\n\n @Input() parentKey!: string;\n\n active = false;\n\n private menuSourceSubscription: Subscription;\n\n private menuResetSubscription: Subscription;\n\n private permissionSubscription: Subscription | null = null;\n\n key: string = '';\n\n selectedPartner = new SpiderlyFormControl<Namebook>(null, {\n updateOn: 'change',\n });\n\n partnerOptions: Namebook[];\n\n constructor(\n public layoutService: LayoutServiceBase,\n private cd: ChangeDetectorRef,\n public router: Router,\n private menuService: SidebarMenuService,\n private authService: AuthServiceBase,\n private apiService: ApiSecurityService,\n private config: ConfigServiceBase,\n ) {\n this.menuSourceSubscription = this.menuService.menuSource$.subscribe(\n (value) => {\n Promise.resolve(null).then(() => {\n if (value.routeEvent) {\n this.active =\n value.key === this.key || value.key.startsWith(this.key + '-')\n ? true\n : false;\n } else {\n if (\n value.key !== this.key &&\n !value.key.startsWith(this.key + '-')\n ) {\n this.active = false;\n }\n }\n });\n },\n );\n\n this.menuResetSubscription = this.menuService.resetSource$.subscribe(() => {\n this.active = false;\n });\n\n this.router.events\n .pipe(filter((event) => event instanceof NavigationEnd))\n .subscribe((params) => {\n if (this.item.routerLink) {\n this.updateActiveStateFromRoute();\n }\n });\n }\n\n ngOnInit() {\n this.item.visible = this.item.visible ?? true;\n\n this.key = this.parentKey\n ? this.parentKey + '-' + this.index\n : String(this.index);\n\n if (this.item.routerLink) {\n this.updateActiveStateFromRoute();\n }\n\n this.permissionSubscription =\n this.authService.currentUserPermissionCodes$.subscribe(\n (currentUserPermissionCodes: string[]) => {\n if (this.item && typeof this.item.hasPermission === 'function') {\n this.item.visible = this.item.hasPermission(\n currentUserPermissionCodes,\n );\n }\n },\n );\n }\n\n updateActiveStateFromRoute() {\n let activeRoute = this.router.isActive(this.item.routerLink[0], {\n paths: 'exact',\n queryParams: 'ignored',\n matrixParams: 'ignored',\n fragment: 'ignored',\n });\n\n if (activeRoute) {\n this.menuService.onMenuStateChange({ key: this.key, routeEvent: true });\n }\n }\n\n itemClick(event: Event) {\n // avoid processing disabled items\n if (this.item.disabled || event === null) {\n event.preventDefault();\n return;\n }\n\n // execute command\n if (this.item.command) {\n this.item.command({ originalEvent: event, item: this.item });\n }\n\n // toggle active state\n if (this.item.items) {\n this.active = !this.active;\n }\n\n this.menuService.onMenuStateChange({ key: this.key });\n }\n\n get submenuAnimation() {\n return this.root ? 'expanded' : this.active ? 'expanded' : 'collapsed';\n }\n\n @HostBinding('class.active-menuitem')\n get activeClass() {\n return this.active && !this.root;\n }\n\n //#region HACK: Partner\n\n searchPartners(event: AutoCompleteCompleteEvent) {\n this.layoutService.searchPartners(event).subscribe((po) => {\n this.partnerOptions = po;\n });\n }\n\n partnersAutocompleteButtonClick = async () => {\n this.layoutService.partnersAutocompleteButtonClick(\n this.selectedPartner.value,\n );\n };\n\n //#endregion\n\n ngOnDestroy() {\n if (this.menuSourceSubscription) {\n this.menuSourceSubscription.unsubscribe();\n }\n\n if (this.menuResetSubscription) {\n this.menuResetSubscription.unsubscribe();\n }\n\n if (this.permissionSubscription) {\n this.permissionSubscription.unsubscribe();\n }\n }\n}\n","<ng-container *transloco=\"let t\">\n <div *ngIf=\"root && item.visible === true\" class=\"layout-menuitem-root-text\">\n {{ item.label }}\n </div>\n <a\n *ngIf=\"(!item.routerLink || item.items) && item.visible === true\"\n [attr.href]=\"item.url\"\n (click)=\"itemClick($event)\"\n [ngClass]=\"item.styleClass\"\n [attr.target]=\"item.target\"\n tabindex=\"0\"\n pRipple\n >\n <i [ngClass]=\"item.icon\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label }}</span>\n <i\n class=\"pi pi-fw pi-angle-down layout-submenu-toggler\"\n *ngIf=\"item.items\"\n ></i>\n </a>\n <a\n *ngIf=\"item.routerLink && !item.items && item.visible === true\"\n (click)=\"itemClick($event)\"\n [ngClass]=\"item.styleClass\"\n [routerLink]=\"item.routerLink\"\n routerLinkActive=\"active-route\"\n [routerLinkActiveOptions]=\"\n item.routerLinkActiveOptions || {\n paths: 'exact',\n queryParams: 'ignored',\n matrixParams: 'ignored',\n fragment: 'ignored',\n }\n \"\n [fragment]=\"item.fragment\"\n [queryParamsHandling]=\"item.queryParamsHandling\"\n [preserveFragment]=\"item.preserveFragment\"\n [skipLocationChange]=\"item.skipLocationChange\"\n [replaceUrl]=\"item.replaceUrl\"\n [state]=\"item.state\"\n [queryParams]=\"item.queryParams\"\n [attr.target]=\"item.target\"\n tabindex=\"0\"\n pRipple\n >\n <i [ngClass]=\"item.icon\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label }}</span>\n <i\n class=\"pi pi-fw pi-angle-down layout-submenu-toggler\"\n *ngIf=\"item.items\"\n ></i>\n </a>\n\n <ul\n *ngIf=\"item.items && item.visible === true\"\n [@children]=\"submenuAnimation\"\n >\n <ng-template ngFor let-child let-i=\"index\" [ngForOf]=\"item.items\">\n <li\n menuitem\n [item]=\"child\"\n [index]=\"i\"\n [parentKey]=\"key\"\n [class]=\"child.badgeStyleClass\"\n ></li>\n </ng-template>\n </ul>\n\n <!-- Delete this in the future iterations, make link to partner in /partners page -->\n <spiderly-autocomplete\n *ngIf=\"item.showPartnerDialog\"\n [control]=\"selectedPartner\"\n [options]=\"partnerOptions\"\n (onTextInput)=\"searchPartners($event)\"\n label=\"\"\n [placeholder]=\"t('SelectThePartner')\"\n [showAddon]=\"true\"\n (onButtonClick)=\"partnersAutocompleteButtonClick()\"\n addonIcon=\"pi pi-check\"\n [emptyMessage]=\"t('LeftCornerPartnersEmptyMessage')\"\n class=\"mobile-stay-open\"\n ></spiderly-autocomplete>\n</ng-container>\n","import { TranslocoService } from '@jsverse/transloco';\nimport { Input, OnInit } from '@angular/core';\nimport { Component } from '@angular/core';\nimport { MenuItem } from 'primeng/api';\nimport { LayoutServiceBase } from '../../../services/app-layout.service.base';\nimport { AuthServiceBase } from '../../../services/auth.service.base';\nimport { ConfigServiceBase } from '../../../services/config.service.base';\nimport { MenuitemComponent } from './menuitem.component';\nimport { CommonModule } from '@angular/common';\n\nexport interface SpiderlyMenuItem extends MenuItem {\n hasPermission?: (permissionCodes: string[]) => boolean;\n showPartnerDialog?: boolean;\n}\n\n@Component({\n selector: 'sidebar-menu', // FT: Don't change selector to 'menu', because other style will apply to it\n templateUrl: './sidebar-menu.component.html',\n imports: [CommonModule, MenuitemComponent],\n})\nexport class SidebarMenuComponent implements OnInit {\n @Input() menu: SpiderlyMenuItem[];\n\n constructor(\n public layoutService: LayoutServiceBase,\n private authService: AuthServiceBase,\n private translocoService: TranslocoService,\n private config: ConfigServiceBase,\n ) {}\n\n ngOnInit() {}\n\n ngOnDestroy(): void {}\n}\n","<ul class=\"layout-menu\">\n <ng-container *ngFor=\"let item of menu; let i = index\">\n <li\n menuitem\n *ngIf=\"!item.separator\"\n [item]=\"item\"\n [index]=\"i\"\n [root]=\"true\"\n ></li>\n <li\n *ngIf=\"item.separator\"\n class=\"gray-separator\"\n style=\"margin-top: 11px\"\n ></li>\n </ng-container>\n</ul>\n","import { Component, ElementRef, Input } from '@angular/core';\nimport {\n SidebarMenuComponent,\n SpiderlyMenuItem,\n} from './sidebar-menu.component';\n\n@Component({\n selector: 'sidebar',\n templateUrl: './sidebar.component.html',\n imports: [SidebarMenuComponent],\n})\nexport class AppSidebarComponent {\n @Input() menu: SpiderlyMenuItem[];\n\n constructor(public el: ElementRef) {}\n\n ngOnInit() {}\n}\n","<sidebar-menu [menu]=\"menu\"></sidebar-menu>\n","import {\n Component,\n ElementRef,\n EventEmitter,\n Input,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NavigationEnd, Router, RouterModule } from '@angular/router';\nimport { AvatarModule } from 'primeng/avatar';\nimport { LayoutServiceBase } from '../../../services/app-layout.service.base';\nimport { UserBase } from '../../../entities/security-entities';\nimport { filter, Subscription } from 'rxjs';\nimport { AuthServiceBase } from '../../../services/auth.service.base';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { SpiderlyButtonComponent } from '../../spiderly-buttons/spiderly-button/spiderly-button.component';\nimport { ConfigServiceBase } from '../../../services/config.service.base';\n\n@Component({\n selector: 'spiderly-profile-avatar',\n templateUrl: './profile-avatar.component.html',\n styleUrl: './profile-avatar.component.scss',\n imports: [\n CommonModule,\n RouterModule,\n AvatarModule,\n SpiderlyButtonComponent,\n TranslocoDirective,\n ],\n})\nexport class ProfileAvatarComponent {\n @Input() isSideMenuLayout = true;\n @Input() routeOnLargeProfileAvatarClick = true;\n /** Whether the login button is shown when no user is signed in. Defaults to `true`. */\n @Input() showLoginButton = true;\n @Input() routeToLoginPage = true;\n @Input() loginButtonOutlined = false;\n @Input() loginButtonSeverity:\n | 'success'\n | 'info'\n | 'warn'\n | 'danger'\n | 'help'\n | 'primary'\n | 'secondary'\n | 'contrast'\n | null\n | undefined = 'primary';\n @Input() loginButtonSize: 'small' | 'large' | undefined;\n @Output() onLoginButtonClick = new EventEmitter();\n @Input() menuItems: ProfileAvatarModalMenuItem[] = [];\n\n private initTopBarSubscription: Subscription | null = null;\n\n currentUser: UserBase;\n userProfilePath: string;\n avatarLabel: string;\n showProfileIcon = false;\n\n @ViewChild('topbarmenu') menu!: ElementRef;\n\n @ViewChild('topbarprofiledropdownmenubutton')\n topbarProfileDropdownMenuButton!: ElementRef;\n\n constructor(\n public layoutService: LayoutServiceBase,\n private authService: AuthServiceBase,\n protected router: Router,\n private translocoService: TranslocoService,\n public config: ConfigServiceBase,\n ) {}\n\n async ngOnInit() {\n if (this.menuItems.length === 0) {\n this.menuItems = [\n {\n label: this.translocoService.translate('YourProfile'),\n icon: 'pi-user',\n showSeparator: true,\n onClick: () => {\n this.routeToUserPage();\n },\n },\n {\n label: this.translocoService.translate('Logout'),\n icon: 'pi-sign-out',\n showSeparator: true,\n onClick: () => {\n this.authService.logout();\n },\n },\n ];\n }\n\n this.router.events\n .pipe(filter((event) => event instanceof NavigationEnd))\n .subscribe((event: NavigationEnd) => {\n this.layoutService.state.profileDropdownSidebarVisible = false;\n });\n\n this.onAfterNgOnInit();\n }\n\n onAfterNgOnInit = () => {\n this.initTopBarSubscription = this.layoutService\n .initTopBarData()\n .subscribe((initTopBarData) => {\n this.userProfilePath = initTopBarData.userProfilePath;\n this.showProfileIcon = initTopBarData.showProfileIcon;\n this.currentUser = initTopBarData.currentUser;\n this.avatarLabel = initTopBarData.currentUser?.email\n .charAt(0)\n .toLocaleUpperCase();\n });\n };\n\n onDocumentClick(event: any) {\n if (!this.menu.nativeElement.contains(event.target)) {\n if (this.layoutService.state.profileDropdownSidebarVisible == true) {\n this.layoutService.state.profileDropdownSidebarVisible = false;\n }\n }\n }\n\n routeToUserPage() {\n if (this.routeOnLargeProfileAvatarClick) {\n this.router.navigateByUrl(this.userProfilePath);\n }\n }\n\n loginButtonClick() {\n if (this.routeToLoginPage) {\n this.router.navigateByUrl(this.config.loginSlug);\n }\n\n this.onLoginButtonClick.next(null);\n }\n\n ngOnDestroy(): void {\n if (this.initTopBarSubscription) {\n this.initTopBarSubscription.unsubscribe();\n }\n }\n}\n\nexport interface ProfileAvatarModalMenuItem {\n label?: string;\n icon?: string;\n showSeparator?: boolean;\n onClick?: () => void;\n}\n","<ng-container *transloco=\"let t\">\n <div *ngIf=\"this.currentUser != null\" #topbarmenu>\n <div\n #topbarprofiledropdownmenubutton\n (click)=\"layoutService.showProfileDropdownSidebar()\"\n >\n <p-avatar\n *ngIf=\"showProfileIcon\"\n [label]=\"avatarLabel\"\n [style]=\"{\n 'background-color': 'var(--p-primary-color)',\n color: '#fff',\n cursor: 'pointer',\n width: '34px',\n height: '34px',\n 'font-size': '21px',\n }\"\n />\n </div>\n <div #topbarprofiledropdownmenu (document:click)=\"onDocumentClick($event)\">\n <div\n *ngIf=\"layoutService.state.profileDropdownSidebarVisible\"\n style=\"\n width: 280px;\n position: absolute;\n padding: 15px;\n background: var(--p-content-background);\n \"\n class=\"card\"\n [ngClass]=\"{\n 'side-menu-profile-dialog': isSideMenuLayout,\n 'top-menu-profile-dialog': !isSideMenuLayout,\n }\"\n >\n <div\n style=\"\n display: flex;\n flex-direction: column;\n justify-content: center;\n text-align: center;\n gap: 10px;\n \"\n >\n <p-avatar\n [label]=\"avatarLabel\"\n size=\"xlarge\"\n [style]=\"{\n 'background-color': 'var(--p-primary-color)',\n color: '#fff',\n margin: 'auto',\n cursor: routeOnLargeProfileAvatarClick ? 'pointer' : '',\n }\"\n (click)=\"routeToUserPage()\"\n />\n <div style=\"font-size: 15px\">{{ currentUser?.email }}</div>\n </div>\n <div style=\"margin-top: 15px\">\n <div\n *ngFor=\"let item of menuItems\"\n [style]=\"item.showSeparator ? 'margin-top: 5px;' : ''\"\n >\n <div *ngIf=\"item.showSeparator\" class=\"gray-separator\"></div>\n <div\n (click)=\"item.onClick()\"\n class=\"hover-card\"\n style=\"\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 5px;\n \"\n >\n <i\n class=\"pi pi-fw {{ item.icon }}\"\n style=\"font-size: 16px; position: relative\"\n ></i>\n <div style=\"font-size: 15px\">{{ item.label }}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"this.currentUser == null && this.showLoginButton\">\n <spiderly-button\n [label]=\"t('Login')\"\n (onClick)=\"loginButtonClick()\"\n icon=\"pi pi-sign-in\"\n [outlined]=\"loginButtonOutlined\"\n [severity]=\"loginButtonSeverity\"\n [size]=\"loginButtonSize\"\n ></spiderly-button>\n </div>\n</ng-container>\n","import { ConfigServiceBase } from '../../../services/config.service.base';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { NavigationEnd, Router, RouterModule } from '@angular/router';\nimport { Component, ElementRef, ViewChild } from '@angular/core';\nimport { filter } from 'rxjs';\nimport { LayoutServiceBase } from '../../../services/app-layout.service.base';\nimport { CommonModule } from '@angular/common';\nimport { AvatarModule } from 'primeng/avatar';\nimport { BadgeModule } from 'primeng/badge';\nimport { ProfileAvatarComponent } from '../profile-avatar/profile-avatar.component';\n\n@Component({\n selector: 'spiderly-sidemenu-topbar',\n templateUrl: './sidemenu-topbar.component.html',\n imports: [\n CommonModule,\n RouterModule,\n AvatarModule,\n BadgeModule,\n ProfileAvatarComponent,\n ],\n})\nexport class SideMenuTopBarComponent {\n companyName = this.config.companyName;\n @ViewChild('menubutton') menuButton!: ElementRef;\n\n constructor(\n public layoutService: LayoutServiceBase,\n protected router: Router,\n private config: ConfigServiceBase,\n private translocoService: TranslocoService,\n ) {}\n\n async ngOnInit() {\n this.router.events\n .pipe(filter((event) => event instanceof NavigationEnd))\n .subscribe((event: NavigationEnd) => {\n this.layoutService.state.profileDropdownSidebarVisible = false;\n });\n }\n}\n","<div class=\"layout-topbar\">\n <a class=\"layout-topbar-logo\" routerLink=\"/\">\n <span>{{ companyName?.toLocaleUpperCase() }}</span>\n </a>\n\n <button\n #menubutton\n class=\"p-link layout-menu-button layout-topbar-button\"\n (click)=\"layoutService.onMenuToggle()\"\n >\n <i class=\"pi pi-bars\"></i>\n </button>\n\n <div class=\"profile-button\">\n <spiderly-profile-avatar></spiderly-profile-avatar>\n </div>\n</div>\n","import { ConfigServiceBase } from '../../../services/config.service.base';\nimport { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule } from '@angular/router';\nimport { AvatarModule } from 'primeng/avatar';\nimport { ProfileAvatarComponent } from '../profile-avatar/profile-avatar.component';\nimport { MenubarModule } from 'primeng/menubar';\nimport { SpiderlyMenuItem } from '../sidebar/sidebar-menu.component';\nimport { AuthServiceBase } from '../../../services/auth.service.base';\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'spiderly-topbar',\n templateUrl: './topbar.component.html',\n styleUrl: './topbar.component.scss',\n imports: [\n CommonModule,\n RouterModule,\n MenubarModule,\n AvatarModule,\n ProfileAvatarComponent,\n ],\n})\nexport class TopBarComponent {\n @Input() menu: SpiderlyMenuItem[] = [];\n companyName = this.config.companyName;\n logoPath = this.config.logoPath;\n /**\n * Determines whether to show background color on hover\n * for root menu items. Defaults to `false`.\n */\n @Input() showHoverBgOnRootItems: boolean = false;\n\n private permissionSubscription: Subscription | null = null;\n\n constructor(\n private authService: AuthServiceBase,\n private config: ConfigServiceBase,\n ) {}\n\n ngOnInit() {\n this.permissionSubscription =\n this.authService.currentUserPermissionCodes$.subscribe(\n (currentUserPermissionCodes: string[]) => {\n this.hideMenuItemsBasedOnPermissions(\n this.menu,\n currentUserPermissionCodes,\n );\n },\n );\n }\n\n hideMenuItemsBasedOnPermissions = (\n menu: SpiderlyMenuItem[],\n currentUserPermissionCodes: string[],\n ) => {\n menu.forEach((menuItem) => {\n if (menuItem.items) {\n this.hideMenuItemsBasedOnPermissions(\n menuItem.items,\n currentUserPermissionCodes,\n );\n }\n if (typeof menuItem.hasPermission === 'function') {\n menuItem.visible =\n menuItem.hasPermission(currentUserPermissionCodes) ?? false;\n }\n });\n };\n\n ngOnDestroy() {\n if (this.permissionSubscription) {\n this.permissionSubscription.unsubscribe();\n }\n }\n}\n","<div class=\"topbar-wrapper\">\n <nav\n class=\"topbar {{\n showHoverBgOnRootItems ? '' : 'show-hover-bg-on-root-items'\n }}\"\n >\n <p-menubar [model]=\"menu\" [style]=\"{ border: '0' }\">\n <ng-template #start>\n <img\n style=\"margin-left: 11px; cursor: pointer\"\n width=\"45\"\n height=\"45\"\n routerLink=\"/\"\n [src]=\"logoPath\"\n alt=\"Logo\"\n />\n </ng-template>\n <ng-template #end>\n <div\n style=\"\n margin-right: 11px;\n display: flex;\n gap: 10px;\n align-items: center;\n position: relative;\n \"\n >\n <div>\n <ng-content select=\"[ACTIONS]\"></ng-content>\n </div>\n <spiderly-profile-avatar\n [isSideMenuLayout]=\"false\"\n ></spiderly-profile-avatar>\n </div>\n </ng-template>\n </p-menubar>\n </nav>\n</div>\n","import {\n Component,\n ElementRef,\n Input,\n OnDestroy,\n Renderer2,\n ViewChild,\n} from '@angular/core';\nimport { NavigationEnd, Router, RouterModule } from '@angular/router';\nimport { filter, Subscription } from 'rxjs';\nimport { AppSidebarComponent } from './sidebar/sidebar.component';\nimport { SideMenuTopBarComponent } from './sidemenu-topbar/sidemenu-topbar.component';\nimport { LayoutServiceBase } from '../../services/app-layout.service.base';\nimport { SpiderlyMenuItem } from './sidebar/sidebar-menu.component';\nimport { CommonModule } from '@angular/common';\nimport { TopBarComponent } from './topbar/topbar.component';\n\n@Component({\n selector: 'spiderly-layout',\n templateUrl: './layout.component.html',\n imports: [\n CommonModule,\n RouterModule,\n AppSidebarComponent,\n SideMenuTopBarComponent,\n TopBarComponent,\n ],\n})\nexport class SpiderlyLayoutComponent implements OnDestroy {\n @Input() menu: SpiderlyMenuItem[] = [];\n sideMenu: SpiderlyMenuItem[] = [];\n topMenu: SpiderlyMenuItem[] = [];\n @Input() isSideMenuLayout: boolean = true;\n /**\n * Determines whether to show background color on hover\n * for root top menu items. Defaults to `false`.\n */\n @Input() showHoverBgOnRootTopMenuItems: boolean = false;\n\n /**\n * default max-width for the main content area.\n */\n\n @Input() maxWidth: string = '1100px';\n\n overlayMenuOpenSubscription: Subscription;\n\n menuOutsideClickListener: any;\n\n profileMenuOutsideClickListener: any;\n\n @ViewChild(AppSidebarComponent) appSidebar!: AppSidebarComponent;\n\n @ViewChild(SideMenuTopBarComponent) sidemenuTopbar!: SideMenuTopBarComponent;\n\n @ViewChild('topbarmenu') topbarmenu!: ElementRef;\n\n constructor(\n protected layoutService: LayoutServiceBase,\n protected renderer: Renderer2,\n protected router: Router,\n ) {\n this.overlayMenuOpenSubscription =\n this.layoutService.overlayOpen$.subscribe(() => {\n if (!this.menuOutsideClickListener) {\n this.menuOutsideClickListener = this.renderer.listen(\n 'document',\n 'click',\n (event) => {\n const isOutsideClicked = !(\n this.appSidebar?.el.nativeElement.isSameNode(event.target) ||\n this.appSidebar?.el.nativeElement.contains(event.target) ||\n this.sidemenuTopbar?.menuButton?.nativeElement.isSameNode(\n event.target,\n ) ||\n this.sidemenuTopbar?.menuButton?.nativeElement.contains(\n event.target,\n ) ||\n event.target.closest('.p-autocomplete-items') ||\n event.target.closest('.p-autocomplete-clear-icon')\n );\n\n if (isOutsideClicked) {\n this.hideMenu();\n }\n },\n );\n }\n\n if (!this.profileMenuOutsideClickListener) {\n this.profileMenuOutsideClickListener = this.renderer.listen(\n 'document',\n 'click',\n (event) => {\n const isOutsideClicked = !(\n this.topbarmenu?.nativeElement.isSameNode(event.target) ||\n this.topbarmenu?.nativeElement.contains(event.target)\n );\n\n if (isOutsideClicked) {\n this.hideProfileMenu();\n }\n },\n );\n }\n\n if (this.layoutService.state.staticMenuMobileActive) {\n this.blockBodyScroll();\n }\n });\n\n this.router.events\n .pipe(filter((event) => event instanceof NavigationEnd))\n .subscribe(() => {\n this.hideMenu();\n this.hideProfileMenu();\n });\n }\n\n ngOnInit() {\n if (this.isSideMenuLayout) {\n this.sideMenu = [...this.menu];\n } else {\n this.topMenu = [...this.menu[0].items];\n }\n }\n\n hideMenu() {\n this.layoutService.state.overlayMenuActive = false;\n this.layoutService.state.staticMenuMobileActive = false;\n this.layoutService.state.menuHoverActive = false;\n if (this.menuOutsideClickListener) {\n this.menuOutsideClickListener();\n this.menuOutsideClickListener = null;\n }\n this.unblockBodyScroll();\n }\n\n hideProfileMenu() {\n this.layoutService.state.profileSidebarVisible = false;\n if (this.profileMenuOutsideClickListener) {\n this.profileMenuOutsideClickListener();\n this.profileMenuOutsideClickListener = null;\n }\n }\n\n blockBodyScroll(): void {\n if (document.body.classList) {\n document.body.classList.add('blocked-scroll');\n } else {\n document.body.className += ' blocked-scroll';\n }\n }\n\n unblockBodyScroll(): void {\n if (document.body.classList) {\n document.body.classList.remove('blocked-scroll');\n } else {\n document.body.className = document.body.className.replace(\n new RegExp(\n '(^|\\\\b)' + 'blocked-scroll'.split(' ').join('|') + '(\\\\b|$)',\n 'gi',\n ),\n ' ',\n );\n }\n }\n\n get containerClass() {\n return {\n 'layout-theme-light':\n this.layoutService.layoutConfig.colorScheme === 'light',\n 'layout-theme-dark':\n this.layoutService.layoutConfig.colorScheme === 'dark',\n 'layout-overlay': this.layoutService.layoutConfig.menuMode === 'overlay',\n 'layout-static': this.layoutService.layoutConfig.menuMode === 'static',\n 'layout-static-inactive':\n this.layoutService.state.staticMenuDesktopInactive &&\n this.layoutService.layoutConfig.menuMode === 'static',\n 'layout-overlay-active': this.layoutService.state.overlayMenuActive,\n 'layout-mobile-active': this.layoutService.state.staticMenuMobileActive,\n 'p-input-filled': this.layoutService.layoutConfig.inputStyle === 'filled',\n 'p-ripple-disabled': !this.layoutService.layoutConfig.ripple,\n };\n }\n\n ngOnDestroy() {\n if (this.overlayMenuOpenSubscription) {\n this.overlayMenuOpenSubscription.unsubscribe();\n }\n\n if (this.menuOutsideClickListener) {\n this.menuOutsideClickListener();\n }\n\n this.onAfterNgDestroy();\n }\n\n onAfterNgDestroy = () => {};\n}\n","<div *ngIf=\"isSideMenuLayout\" class=\"layout-wrapper\" [ngClass]=\"containerClass\">\n <spiderly-sidemenu-topbar></spiderly-sidemenu-topbar>\n <div class=\"layout-sidebar\">\n <sidebar [menu]=\"sideMenu\"></sidebar>\n </div>\n <div class=\"layout-main-container\">\n <div class=\"layout-main\">\n <router-outlet></router-outlet>\n </div>\n </div>\n <div class=\"layout-mask\"></div>\n</div>\n\n<div *ngIf=\"isSideMenuLayout === false\">\n <spiderly-topbar\n [menu]=\"topMenu\"\n [showHoverBgOnRootItems]=\"showHoverBgOnRootTopMenuItems\"\n >\n <ng-content ACTIONS select=\"[ACTIONS]\"></ng-content>\n </spiderly-topbar>\n <main [style.max-width]=\"maxWidth\" style=\"margin: auto; padding: 18px\">\n <router-outlet></router-outlet>\n </main>\n</div>\n","import { Component } from '@angular/core';\nimport { ConfigServiceBase } from '../../services/config.service.base';\nimport { RouterModule } from '@angular/router';\nimport { ButtonModule } from 'primeng/button';\n\n@Component({\n selector: 'not-found',\n templateUrl: './not-found.component.html',\n imports: [RouterModule, ButtonModule],\n})\nexport class NotFoundComponent {\n companyName = this.config.companyName;\n logoPath: string = this.config.logoPath;\n\n constructor(private config: ConfigServiceBase) {}\n}\n","<div class=\"flex min-h-screen overflow-hidden\" style=\"padding: 20px\">\n <div class=\"flex flex-col w-full\">\n <div\n class=\"w-full sm:w-[30rem]\"\n style=\"\n margin: auto;\n border-radius: 50px;\n padding: 0.3rem;\n background: linear-gradient(\n 180deg,\n var(--p-primary-color) 10%,\n rgba(33, 150, 243, 0) 30%\n );\n \"\n >\n <div class=\"surface-card py-12 px-8 sm:px-12\" style=\"border-radius: 45px\">\n <div class=\"text-center\">\n <img\n [src]=\"logoPath\"\n alt=\"{{ companyName }} Logo\"\n title=\"{{ companyName }} Logo\"\n height=\"60\"\n class=\"mb-6\"\n />\n </div>\n <h1 class=\"mb-6\">\n <div class=\"font-bold text-5xl lg:text-6xl spiderly-gradient-title\">\n 404\n </div>\n <div class=\"font-bold text-5xl lg:text-6xl\">Page Not Found</div>\n </h1>\n <div class=\"text-gray-600 text-lg mb-8\">\n The page you're looking for doesn't exist or has been moved. Let's get\n you back on track.\n </div>\n <div>\n <p-button [routerLink]=\"['/']\" label=\"Go to Homepage\"></p-button>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ButtonModule } from 'primeng/button';\nimport { SplitButtonModule } from 'primeng/splitbutton';\n\nimport { MenuItem } from 'primeng/api';\nimport { SpiderlyButtonBaseComponent } from '../spiderly-button-base/spiderly-button-base';\n\n@Component({\n selector: 'spiderly-split-button',\n templateUrl: './spiderly-split-button.component.html',\n styles: [],\n imports: [CommonModule, ButtonModule, SplitButtonModule],\n})\nexport class SpiderlySplitButtonComponent extends SpiderlyButtonBaseComponent {\n @Input() dropdownItems: MenuItem[];\n}\n","<p-splitButton\n (onClick)=\"handleClick($event)\"\n [label]=\"label\"\n [icon]=\"icon\"\n [outlined]=\"outlined\"\n [styleClass]=\"styleClass\"\n [severity]=\"severity\"\n [rounded]=\"rounded\"\n [style]=\"style\"\n [class]=\"class\"\n [disabled]=\"disabled\"\n [model]=\"dropdownItems\"\n>\n <ng-content></ng-content>\n</p-splitButton>\n","import { Directive, Input, TemplateRef } from '@angular/core';\n// Type-only, so it is erased at build time and the component <-> directive cycle never exists at\n// runtime.\nimport type { Column } from '../components/spiderly-data-table/spiderly-data-table.component';\n\n/**\n * Context handed to a cell template. Read the row with `let-row`, the rest by name\n * (`let-value=\"value\"`, `let-displayValue=\"displayValue\"`, `let-col=\"col\"`).\n *\n * `value` and `displayValue` mean here exactly what they mean on `CellClickEvent`, the other seam\n * this component hands a cell to — raw and formatted respectively. One column can use both\n * (a click handler and a template), so they must not disagree.\n */\nexport interface CellTemplateContext<T = any> {\n /** The full row object the cell belongs to. */\n $implicit: T;\n /** The raw cell value, `row[col.field]`. */\n value: any;\n /**\n * What the table would have rendered — the value formatted for the column's `filterType` and\n * the app's `LOCALE_ID` (dates, numbers, Yes/No). A template that only adds something around\n * the value never has to re-implement that formatting.\n */\n displayValue: string;\n /** The column being rendered. */\n col: Column<T>;\n}\n\n/**\n * Renders the cells of ONE column of a `spiderly-data-table`, replacing the plain formatted\n * value. Bind it to the column's `field`; columns with no matching template keep the built-in\n * rendering, so a table opts in one column at a time.\n *\n * Consumer guide (context, what it does and does not replace, when to prefer it over\n * `onCellClick`): the `angular-customization` doc, \"Custom Cell Content\".\n */\n@Directive({\n selector: 'ng-template[spiderlyCellTemplate]',\n})\nexport class SpiderlyCellTemplateDirective<T = any> {\n /** The `field` of the column whose cells this template renders. */\n @Input('spiderlyCellTemplate') field: string;\n\n constructor(public readonly template: TemplateRef<CellTemplateContext<T>>) {}\n\n /**\n * Without this the `let-` variables are `any` at every consumer, however well\n * {@link CellTemplateContext} is declared — a directive's injected `TemplateRef<C>` never\n * reaches the template that declares it. Same mechanism as `SpiderlyTemplateTypeDirective`.\n */\n static ngTemplateContextGuard<T>(\n dir: SpiderlyCellTemplateDirective<T>,\n ctx: unknown,\n ): ctx is CellTemplateContext<T> {\n return true;\n }\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Marks an `<ng-template>` projected into `spiderly-data-table` as custom toolbar\n * content. The template is rendered in the table's caption action area, ahead of the\n * built-in Clear Filters / Export to Excel / Reload / Delete Selected buttons, so its\n * position stays stable regardless of selection state.\n *\n * The projected template binds to the consumer component (so `(click)` handlers call\n * the consumer's methods), and inherits the action row's spacing and responsive\n * stacking. No table state is passed as context — read it via the table's outputs\n * (`onLazyLoad`, `onTotalRecordsChange`, `onRowSelect`) when needed.\n *\n * @example\n * ```html\n * <spiderly-data-table [cols]=\"cols\" [getPaginatedListObservableMethod]=\"...\">\n * <ng-template spiderlyDataTableActions>\n * <button pButton class=\"p-button-outlined\" style=\"flex: none\"\n * icon=\"pi pi-check\" [label]=\"t('ApproveAll')\" (click)=\"approveAll()\"></button>\n * </ng-template>\n * </spiderly-data-table>\n * ```\n */\n@Directive({\n selector: '[spiderlyDataTableActions]',\n})\nexport class SpiderlyDataTableActionsDirective {}\n","import { Directive, ElementRef, NgZone, OnDestroy, inject } from '@angular/core';\n\n/**\n * Puts a native `title` on an element while its text is clipped — measured when the pointer\n * arrives, which is the only moment a native title can surface.\n *\n * The data table clamps a default cell to one line (see the `.cell-text` rule), which hides the\n * value and, before this, offered nothing to read it with — the reason PACMS hand-added `[title]`\n * on four cells of one grid. Wrapping the column is a choice someone makes; this covers the\n * default nobody touched.\n *\n * Native `title`, never `pTooltip`: it needs a deliberate hover rather than firing as the cursor\n * crosses a dense list, which is what got the SKU tooltip removed.\n *\n * **Measured on hover, not watched.** The first shape ran `ngAfterViewChecked` on every instance\n * every change-detection cycle (reading `textContent`, which allocates a fresh string each call)\n * and gave each instance its OWN `ResizeObserver`. On a 100-row grid nineteen columns wide that is\n * ~1900 hooks per cycle and ~1900 observers in Chrome's per-frame loop — all to decide something\n * that can only ever be seen one cell at a time. Hover is exactly-in-time, costs nothing until it\n * happens, and needs no separate handling for a column drag or a resized window: the next hover\n * re-measures. Nothing is lost for a screen reader either — CSS clipping never hid the text from\n * the accessibility tree, so the title was only ever a sighted-hover affordance.\n */\n@Directive({\n selector: '[spiderlyOverflowTitle]',\n})\nexport class SpiderlyOverflowTitleDirective implements OnDestroy {\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly zone = inject(NgZone);\n\n private readonly onPointerEnter = () => this.sync();\n\n constructor() {\n // Outside the zone: it sets an attribute and touches no bound state, so waking change\n // detection on every cell the cursor crosses would be pure cost.\n this.zone.runOutsideAngular(() =>\n this.el.nativeElement.addEventListener(\n 'pointerenter',\n this.onPointerEnter,\n ),\n );\n }\n\n ngOnDestroy(): void {\n this.el.nativeElement.removeEventListener(\n 'pointerenter',\n this.onPointerEnter,\n );\n }\n\n private sync(): void {\n const el = this.el.nativeElement;\n\n // A one-pixel slack: sub-pixel text metrics make scrollWidth exceed clientWidth by fractions\n // on text that visibly fits, which would title half the grid.\n if (el.scrollWidth - el.clientWidth > 1) {\n el.setAttribute('title', el.textContent ?? '');\n } else {\n el.removeAttribute('title');\n }\n }\n}\n","import { Directive, Input, TemplateRef } from '@angular/core';\n// Type-only, so it is erased at build time and the component <-> directive cycle never exists at\n// runtime.\nimport type { FilterHandle } from '../filters/filter-store';\n\n/**\n * Context handed to a filter template: the filter's handle, and nothing else it does not already\n * carry. Read it with `let-f` and drive the filter through it — `f.value()` is the draft the\n * control shows, `f.set(...)` writes one, `f.commit()` applies it.\n */\nexport interface FilterTemplateContext {\n $implicit: FilterHandle;\n}\n\n/**\n * Renders the editor for ONE filter of a `spiderly-data-table`'s bar, replacing the control the\n * bar would have drawn for that filter's kind. Bind it to the filter's id; filters with no\n * matching template keep the built-in control, so a table opts in one filter at a time.\n *\n * This is the narrow job the directive has. Placing a filter ANYWHERE else — a drawer, a modal,\n * a header cell — needs no directive at all: `store.get(id)` returns the same handle and depends\n * on nothing in the component tree, which is why the store is the consumer's to own.\n */\n@Directive({\n selector: 'ng-template[spiderlyFilterTemplate]',\n})\nexport class SpiderlyFilterTemplateDirective {\n /** The id of the filter whose control this template renders. */\n @Input('spiderlyFilterTemplate') filterId: string;\n\n constructor(public readonly template: TemplateRef<FilterTemplateContext>) {}\n\n /**\n * Without this the `let-` variable is `any` at every consumer, however well the context is\n * declared — a directive's injected `TemplateRef<C>` never reaches the template that declares\n * it. Same mechanism as `SpiderlyCellTemplateDirective`.\n */\n static ngTemplateContextGuard(\n dir: SpiderlyFilterTemplateDirective,\n ctx: unknown,\n ): ctx is FilterTemplateContext {\n return true;\n }\n}\n","import { CommonModule, formatDate } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport {\n Component,\n computed,\n inject,\n input,\n LOCALE_ID,\n output,\n QueryList,\n signal,\n TemplateRef,\n} from '@angular/core';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { SortMeta } from 'primeng/api';\nimport { ButtonModule } from 'primeng/button';\nimport { CheckboxModule } from 'primeng/checkbox';\nimport { DatePickerModule } from 'primeng/datepicker';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { MultiSelectModule } from 'primeng/multiselect';\nimport { PopoverModule } from 'primeng/popover';\nimport { SelectModule } from 'primeng/select';\n\nimport { SpiderlyFilterTemplateDirective } from '../directives/spiderly-filter-template.directive';\nimport { MatchModeCodes } from '../enums/match-mode-enum-codes';\nimport { FilterValueKind } from './allowed-operators';\nimport {\n AppliedFilter,\n FilterBarSource,\n FilterHandle,\n FilterOption,\n SortKeyLabel,\n SortPickOption,\n} from './filter-store';\n\n/** One option's word for one value — the honest raw value when no option matches (failed lookup). */\nfunction spellOptionValue(\n options: FilterOption[] | undefined,\n value: unknown,\n): string {\n return String(options?.find((option) => option.value === value)?.label ?? value);\n}\n\n/**\n * Lowercased and stripped of diacritics for matching. NFD decomposition handles č/ć/š/ž, but NOT\n * đ — it is its own letter (U+0111), not a d carrying a mark, so it decomposes to nothing and has\n * to be mapped by hand.\n *\n * It maps to \"dj\", which is what the rest of this workspace already does (pa-cms's\n * `normalizePlaceQuery` and `toAscii`, the backend's `PlaceNameNormalizer`) and what someone\n * without a Serbian layout actually types. Mapping it to \"d\" — as this first shipped — folds\n * \"Đorđe\" to \"dorde\", so typing \"djordje\" finds nothing: the exact case the comment claimed to\n * fix, and one no spec covered because the test used \"drzava\", which has no đ in it.\n */\nexport function foldForSearch(value: string): string {\n return value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\u0111/g, 'dj')\n .replace(/\\u0110/g, 'Dj')\n .toLowerCase()\n .trim();\n}\n\n/**\n * The visible home of every applied constraint. This is what licenses a hidden column keeping its\n * filter: the header is no longer the only place a filter can be seen, so hiding a column stops\n * meaning \"silently drop what it was filtering by\".\n *\n * Everything drawn here comes from `applied()`, never from a draft — a chip over a half-typed\n * value would repeat the mistake the header's filter icon shipped, claiming the grid is narrowed\n * while it still shows every row.\n */\n@Component({\n selector: 'spiderly-filter-bar',\n imports: [\n CommonModule,\n FormsModule,\n TranslocoDirective,\n ButtonModule,\n CheckboxModule,\n DatePickerModule,\n InputTextModule,\n MultiSelectModule,\n PopoverModule,\n SelectModule,\n ],\n styleUrl: 'spiderly-filter-bar.component.scss',\n template: `\n <ng-container *transloco=\"let t\">\n <div class=\"filter-bar\" data-testid=\"filter-bar\">\n @for (chip of filters().applied(); track chip.id) {\n <span class=\"filter-chip\" data-testid=\"filter-chip\">\n <!-- The chip body reopens the filter. Once applied it is no longer offered under\n \"+ Filter\", so without this the only way to narrow Elektromont to Elektro is to\n delete the filter and rebuild it. -->\n <button\n type=\"button\"\n class=\"filter-chip-edit\"\n data-testid=\"filter-chip-edit\"\n (click)=\"startEditing(chip.id)\"\n >\n <!-- &ngsp; is a space the template parser keeps. Angular collapses whitespace\n between elements by default, which glued these three into\n \"FirmacontainsElektromont\" — how a screen reader reads the chip and how it\n lands when copied, not merely how the spec saw it. The flex gap only spaced\n them visually. -->\n <span class=\"filter-chip-label\">{{ chip.label }}</span>&ngsp;\n <span class=\"filter-chip-operator\">{{\n t(chip.operatorPhraseKey)\n }}</span>&ngsp;\n <span class=\"filter-chip-value\">{{\n chip.kind === 'boolean'\n ? chip.value\n ? t('Yes')\n : t('No')\n : chipValue(chip)\n }}</span>\n </button>\n <button\n type=\"button\"\n class=\"filter-chip-remove\"\n data-testid=\"filter-chip-remove\"\n [attr.aria-label]=\"t('RemoveFilter')\"\n (click)=\"filters().reset(chip.id)\"\n >\n ×\n </button>\n </span>\n }\n\n @if (sortOptions().length) {\n <!-- The chip is the PICKER's trigger (2026-09-06, grilled) — Polaris's always-present\n SortButton, in the slot the read-only chip held. Always rendered, sorted or not:\n with the trigger only on an active sort, an unsorted grid would have no way to\n sort by a hidden column, which is the capability the picker exists for. It\n replaced a read-only chip whose stated rationale (\"an x would lie — the default\n snaps back\") inverted the day a viewed table had no default: the operator was\n left with an inherited sort, no chip x, no clear button, and the one header that\n could un-sort it hidden. -->\n <button\n type=\"button\"\n class=\"sort-chip\"\n data-testid=\"sort-chip\"\n [attr.aria-expanded]=\"isSortOpen()\"\n (click)=\"sortMenu.toggle($event); isSortOpen.set(!isSortOpen())\"\n >\n <ng-container *ngTemplateOutlet=\"sortChipBody\"></ng-container>\n <i class=\"pi pi-chevron-down sort-chip-caret\" aria-hidden=\"true\"></i>\n </button>\n } @else if (sort().length) {\n <!-- No options handed over — the chip stays what it was: one read-only place naming\n the ordering and which key is primary. -->\n <span class=\"sort-chip\" data-testid=\"sort-chip\">\n <ng-container *ngTemplateOutlet=\"sortChipBody\"></ng-container>\n </span>\n }\n\n <!-- One home for the chip's sentence, whichever element renders it — the read-only\n branch never reaches the @else (it is gated on sort().length). -->\n <ng-template #sortChipBody>\n @if (sort().length) {\n <span class=\"sort-chip-label\">{{ t('SortedBy') }}</span>\n @for (key of sort(); track key.field; let last = $last) {\n <span class=\"sort-chip-key\"\n >{{ key.label }} {{ key.descending ? '↓' : '↑' }}{{\n last ? '' : ','\n }}</span\n >\n }\n } @else {\n <span class=\"sort-chip-label\">{{ t('Sort') }}</span>\n }\n </ng-template>\n\n @if (totalRecords() !== null) {\n <!-- What came back, next to the chips that say what was asked. An empty grid under a\n filter is otherwise a mystery. The CURRENT query's count only: the unfiltered total\n would cost a second request the paginator does not offer. -->\n <span class=\"filter-bar-count\" data-testid=\"filter-bar-count\">{{\n t('ResultCount', { count: totalRecords() })\n }}</span>\n }\n\n @if (addable().length) {\n <!-- A popover, not an inline list. Seven filters already fill the toolbar row inline,\n and the orders grid declares nineteen — they would wrap into three lines and shove\n the table down the page. Shopify's Filters component opens its \"more filters\" the\n same way. The teleport into document.body costs the specs a container lookup; that\n cost belongs to the tests, not to the operator. -->\n <button\n pButton\n type=\"button\"\n class=\"p-button-text p-button-sm filter-add\"\n icon=\"pi pi-plus\"\n [label]=\"t('AddFilter')\"\n data-testid=\"add-filter\"\n [attr.aria-expanded]=\"isAddOpen()\"\n (click)=\"addMenu.toggle($event); isAddOpen.set(!isAddOpen())\"\n ></button>\n }\n\n @if (filters().applied().length) {\n <!-- The bar owns clearing now: the toolbar's button sat a row away from the chips it\n cleared, which is two affordances for one job. Emits rather than clearing the store\n itself, because whoever owns the query owns the requery and the persisted snapshot\n that follow a clear. Filters only — sort is its own channel (the picker above). -->\n <button\n pButton\n type=\"button\"\n class=\"p-button-text p-button-sm filter-bar-clear\"\n icon=\"pi pi-filter-slash\"\n [label]=\"t('ClearFilters')\"\n data-testid=\"filter-bar-clear\"\n (click)=\"clearAll.emit()\"\n ></button>\n }\n\n <p-popover #sortMenu (onHide)=\"isSortOpen.set(false)\">\n <div class=\"filter-add-menu\" role=\"menu\">\n @for (option of sortRows(); track option.field) {\n <!-- Click sorts ascending; clicking the already-ascending option flips it. One\n gesture, look, one gesture back — the header's cycle without needing the\n header, so a hidden column's ordering is reachable too. -->\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"filter-add-option sort-menu-option\"\n data-testid=\"sort-menu-option\"\n (click)=\"pickSort(option); sortMenu.hide()\"\n >\n <!-- &ngsp; keeps a real space between label and arrow — same collapse the\n filter chip documents: without it the copied/read text is \"Naziv↓\". -->\n <span>{{ option.label }}</span>&ngsp;\n @if (option.arrow) {\n <span class=\"sort-menu-direction\" aria-hidden=\"true\">{{\n option.arrow\n }}</span>\n }\n </button>\n }\n\n @if (!sortIsDefault()) {\n <!-- Only while there is an override to undo: at the default there is nothing to\n reset, and a row that does nothing teaches people to stop reading the menu. -->\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"filter-add-option sort-menu-reset\"\n data-testid=\"sort-menu-reset\"\n (click)=\"sortReset.emit(); sortMenu.hide()\"\n >\n {{ t('ResetSort') }}\n </button>\n }\n </div>\n </p-popover>\n\n <p-popover #addMenu (onHide)=\"isAddOpen.set(false); addSearch.set('')\">\n <div class=\"filter-add-menu\" role=\"menu\">\n <input\n pInputText\n pSize=\"small\"\n type=\"search\"\n class=\"filter-add-search\"\n data-testid=\"add-filter-search\"\n [value]=\"addSearch()\"\n [attr.aria-label]=\"t('AddFilter')\"\n [placeholder]=\"t('Search')\"\n (input)=\"addSearch.set($any($event.target).value)\"\n />\n\n @for (option of offered(); track option.id) {\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"filter-add-option\"\n data-testid=\"add-filter-option\"\n (click)=\"startEditing(option.id); addMenu.hide()\"\n >\n {{ option.label }}\n </button>\n }\n </div>\n </p-popover>\n\n </div>\n\n <!-- Its OWN ROW, directly under the chips. It used to render at the end of the bar, where\n the clear button's auto left margin pushed everything after it to the far right, so the\n control for the second filter opened across the screen from the click (Filip, on\n /tags). A popover anchored to the click was tried first and abandoned: PrimeNG's\n ng-content slot does not re-project content once the editor's @if has destroyed it, so\n reopening gave an empty container with overlayVisible true. A fixed row is predictable,\n which is the property the complaint was actually about.\n NO BACKTICKS IN THIS TEMPLATE: it is a JS template literal and one terminates it, with\n the error landing lines away. This is the second time. -->\n @if (editing(); as handle) {\n <div class=\"filter-editor\" data-testid=\"filter-editor\">\n <span class=\"filter-editor-label\">{{ handle.label }}</span>\n\n @if (handle.operators.length > 1) {\n <p-select\n size=\"small\"\n styleClass=\"filter-editor-operator\"\n data-testid=\"filter-editor-operator\"\n [options]=\"operatorChoices()\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"handle.operator() ?? handle.defaultOperator\"\n (onChange)=\"pickOperator(handle, $event.value)\"\n ></p-select>\n }\n\n @if (controlTemplateFor(handle); as projected) {\n <!-- The consumer's own control for this filter. Read the QueryList live rather than\n indexing it into a Map: a QueryList already updates itself, and a template\n declared inside a @for or an @if would go stale in a cached index. Same\n reasoning as getCellTemplate. -->\n <ng-container\n *ngTemplateOutlet=\"projected; context: { $implicit: handle }\"\n ></ng-container>\n } @else if (handle.options) {\n <p-multiSelect\n size=\"small\"\n styleClass=\"filter-editor-value\"\n data-testid=\"filter-editor-value\"\n [options]=\"handle.options\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [placeholder]=\"t('All')\"\n [ngModel]=\"handle.value()\"\n (onChange)=\"draftValue(handle, $event.value)\"\n ></p-multiSelect>\n } @else if (handle.kind === 'boolean') {\n <p-checkbox\n styleClass=\"filter-editor-value\"\n data-testid=\"filter-editor-value\"\n [binary]=\"true\"\n [ngModel]=\"handle.value() === true\"\n (onChange)=\"draftValue(handle, $event.checked)\"\n ></p-checkbox>\n } @else if (handle.kind === 'date') {\n <p-datepicker\n size=\"small\"\n styleClass=\"filter-editor-value\"\n data-testid=\"filter-editor-value\"\n [ngModel]=\"handle.value()\"\n (onSelect)=\"draftValue(handle, $event)\"\n ></p-datepicker>\n } @else if (handle.kind === 'text' || handle.kind === 'number') {\n <!-- A DOM control's raw value is always a string. It is coerced on the way into\n the store (see coerce), which is the one place the value type can be got\n right. Backticks are forbidden in this template: it is a JS template literal\n and one terminates it, with the error landing lines away. -->\n <input\n pInputText\n pSize=\"small\"\n [type]=\"handle.kind === 'number' ? 'number' : 'text'\"\n class=\"filter-editor-value\"\n data-testid=\"filter-editor-value\"\n [value]=\"handle.value() ?? ''\"\n (input)=\"draft(handle, $event)\"\n />\n } @else {\n <!-- No control for this kind yet. A text box would write the wrong VALUE TYPE into\n the store, which nothing checks at runtime — the operator is checked, the value\n is not. Visibly missing beats silently wrong. -->\n <span data-testid=\"filter-editor-unsupported\">{{\n t('FilterControlNotAvailable')\n }}</span>\n }\n\n <button\n pButton\n type=\"button\"\n class=\"p-button-sm filter-editor-apply\"\n [label]=\"t('Apply')\"\n data-testid=\"filter-editor-apply\"\n (click)=\"apply(handle)\"\n ></button>\n </div>\n }\n </ng-container>\n `,\n})\nexport class SpiderlyFilterBarComponent {\n readonly filters = input.required<FilterBarSource>();\n\n /** The current query's row count, supplied by whoever owns the query. Null hides the counter. */\n readonly totalRecords = input<number | null>(null);\n\n /**\n * What the grid is ordered by, in priority order and already LABELLED — the bar knows nothing\n * about columns, so whoever owns the sort resolves the names.\n */\n readonly sort = input<SortKeyLabel[]>([]);\n\n /**\n * What the picker offers, labelled by the owner — every sortable column, HIDDEN ones\n * included (their ordering is otherwise unreachable, which is the trap the picker closes).\n * Empty keeps the chip read-only and the picker off.\n */\n readonly sortOptions = input<SortPickOption[]>([]);\n\n /** Whether the grid already sits on its default ordering — gates the reset row, nothing else. */\n readonly sortIsDefault = input(true);\n\n /** Asked for, never done here — see the button's comment. */\n readonly clearAll = output<void>();\n\n /** A single-sort ask. Multi-sort stays a header gesture (ctrl-click); the picker replaces. */\n readonly sortPick = output<SortMeta>();\n\n /** Back to the owner's default ordering — the owner knows what that resolves to, not the bar. */\n readonly sortReset = output<void>();\n\n private readonly transloco = inject(TranslocoService);\n\n /** For the chip's date wording — the same locale mechanism the table's cells format with. */\n private readonly locale = inject(LOCALE_ID);\n\n /**\n * Controls a consumer projected for specific filters, collected by whoever hosts this bar. A\n * filter with no template keeps the control the bar draws for its kind, so a table opts in one\n * filter at a time.\n */\n readonly controlTemplates = input<\n QueryList<SpiderlyFilterTemplateDirective> | undefined\n >(undefined);\n\n readonly isAddOpen = signal(false);\n\n readonly isSortOpen = signal(false);\n\n /** Cleared when the popover closes, so reopening never starts inside someone's old query. */\n readonly addSearch = signal('');\n\n /** The filter whose control is open. One at a time: the bar edits, it is not a form. */\n readonly editing = signal<FilterHandle | null>(null);\n\n /**\n * `addable` narrowed by the search box. Matching is unaccented and case-folded because that is\n * how the label gets typed: \"drzava\" for \"Država\" on any keyboard without a Serbian layout. The\n * backend's own product search is unaccented for the same reason.\n */\n readonly offered = computed(() => {\n const needle = foldForSearch(this.addSearch());\n if (!needle) return this.addable();\n\n return this.addable().filter((option) =>\n foldForSearch(option.label).includes(needle),\n );\n });\n\n /**\n * What \"+ Filter\" offers: every declared filter that is not already on the bar. Sourced from the\n * DEFINITIONS, so a filter reaches this list whether or not it has a column, and whether or not\n * that column is visible. That is the whole reason the bar exists.\n *\n * `offered: false` filters stay out — they have a dedicated control of their own on the page\n * (PACMS's order search box), so the generic entry point would give one question two homes.\n * Their chips still render: the applied list above reads no such flag.\n */\n readonly addable = computed(() => {\n const onBar = new Set(this.filters().applied().map((chip) => chip.id));\n\n return Object.entries(this.filters().definitions)\n .filter(([id, definition]) => !onBar.has(id) && definition.offered !== false)\n .map(([id, definition]) => ({ id, ...definition }));\n });\n\n /** Opens a filter's control. Where it renders, and why not a popover: the template comment. */\n startEditing(id: string): void {\n this.isAddOpen.set(false);\n this.editing.set(this.filters().get(id));\n }\n\n /**\n * The menu's rows: each option decorated with its ACTIVE direction's arrow (any key, not\n * just the primary), or null. A `computed`, not a per-row method call in the binding — the\n * popover's content is projected, so it change-detects even while closed, and a `find` per\n * option per pass is exactly what `operatorChoices` documents against.\n */\n readonly sortRows = computed(() => {\n const active = new Map(\n this.sort().map((key) => [key.field, key.descending] as const),\n );\n\n return this.sortOptions().map((option) => {\n const descending = active.get(option.field);\n return {\n ...option,\n arrow: descending == null ? null : descending ? '↓' : '↑',\n };\n });\n });\n\n /**\n * Ascending first; picking the already-ascending primary flips it. The direction is decided\n * HERE so the owner applies exactly what the menu showed — an owner guessing \"toggle\" from its\n * own state could disagree with a stale menu after a concurrent header click.\n */\n pickSort(option: SortPickOption): void {\n const primary = this.sort()[0];\n const order =\n primary?.field === option.field && !primary.descending ? -1 : 1;\n\n this.sortPick.emit({ field: option.field, order });\n }\n\n /** The raw-string controls only. Nothing reaches the bar or the query until `apply`. */\n draft(handle: FilterHandle, event: Event): void {\n this.draftValue(\n handle,\n this.coerce(handle.kind, (event.target as HTMLInputElement).value),\n );\n }\n\n controlTemplateFor(handle: FilterHandle): TemplateRef<unknown> | null {\n const match = this.controlTemplates()?.find(\n (candidate) => candidate.filterId === handle.id,\n );\n\n return match?.template ?? null;\n }\n\n /**\n * The open editor's operator options, already translated — p-select takes labels, not keys.\n *\n * A `computed`, not a method in the binding: both inputs are fixed for the life of an open\n * editor, and PrimeNG's `Select.options` setter deep-compares whatever it is handed — so a\n * freshly mapped array per change-detection pass paid for a recursive structural compare to\n * conclude nothing had changed.\n */\n readonly operatorChoices = computed(() => {\n const handle = this.editing();\n if (!handle) return [];\n\n return handle.operators.map((option) => ({\n label: this.transloco.translate(option.labelKey),\n value: option.value,\n }));\n });\n\n /**\n * The ONE write path, whatever the control. Every PrimeNG control here hands back a value of\n * the right type already — a Date from the datepicker, a boolean from the checkbox, the whole\n * array from the multiselect — so only the raw string ones need coercing, and only they go\n * through `draft`.\n */\n draftValue(handle: FilterHandle, value: unknown): void {\n handle.set({\n operator: handle.operator() ?? handle.defaultOperator,\n value,\n });\n }\n\n /**\n * Changing the direction re-commits nothing on its own — it rewrites the draft, so the operator\n * survives until Apply like the value does.\n */\n pickOperator(handle: FilterHandle, operator: MatchModeCodes): void {\n handle.set({ operator, value: handle.value() });\n }\n\n /**\n * A DOM control hands back a string; the store holds the value type the filter declared.\n *\n * The empty case is the trap and it is not symmetric: `Number('')` is 0, so an emptied number\n * box would apply a filter for zero and draw a chip over a control the operator had just\n * cleared. `NaN` is folded in for the same reason — the store's `isBlank` cannot recognise\n * either of them as \"nothing was entered\", because by then they are perfectly good numbers.\n */\n private coerce(kind: FilterValueKind, raw: string): unknown {\n if (kind !== 'number') return raw;\n if (raw.trim() === '') return null;\n\n const parsed = Number(raw);\n\n return Number.isNaN(parsed) ? null : parsed;\n }\n\n apply(handle: FilterHandle): void {\n handle.commit();\n this.editing.set(null);\n }\n\n /**\n * `In` is the multi-valued operator, so its chip reads as a list — in the OPTIONS' words, not\n * the wire's: \"Status is one of 2, 3\" narrates ids nobody chose by number. The lookup is live\n * off the definition rather than snapshotted at commit, because option lists can be filled\n * asynchronously (PACMS's admin/backend deploy race): a chip restored before the lookup answers\n * upgrades from ids to labels the moment the options land, and a failed lookup degrades to the\n * honest raw value.\n */\n chipValue(chip: AppliedFilter): string {\n // `String(date)` is the full JS toString — a GMT offset and a timezone name on a chip an\n // operator scans. Same formatDate + LOCALE_ID mechanism the table's cells use; mediumDate,\n // because shortDate's two-digit year reads badly on a chip claiming a boundary.\n if (chip.value instanceof Date) {\n return formatDate(chip.value, 'mediumDate', this.locale);\n }\n\n const options = this.filters().definitions[chip.id]?.options;\n\n return Array.isArray(chip.value)\n ? chip.value.map((value) => spellOptionValue(options, value)).join(', ')\n : spellOptionValue(options, chip.value);\n }\n}\n","import { ConfirmationService } from 'primeng/api';\nimport { Component } from '@angular/core';\nimport { DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { SpiderlyButtonComponent } from '../spiderly-buttons/spiderly-button/spiderly-button.component';\nimport { ConfirmDialogModule } from 'primeng/confirmdialog';\nimport { Observable } from 'rxjs';\n\nexport type DeleteConfirmationData =\n | {\n message: string;\n deleteItemFromTableObservableMethod: (id: number) => Observable<any>;\n id: number;\n }\n | {\n message: string;\n deleteListFromTableObservableMethod: (ids: number[]) => Observable<any>;\n ids: number[];\n };\n\n@Component({\n selector: 'spiderly-delete-confirmation',\n templateUrl: './spiderly-delete-confirmation.component.html',\n styles: [],\n imports: [SpiderlyButtonComponent, TranslocoDirective, ConfirmDialogModule],\n providers: [ConfirmationService],\n})\nexport class SpiderlyDeleteConfirmationComponent {\n constructor(\n public ref: DynamicDialogRef,\n public config: DynamicDialogConfig<DeleteConfirmationData>,\n ) {}\n\n accept() {\n const data = this.config.data;\n const observable =\n 'deleteListFromTableObservableMethod' in data\n ? data.deleteListFromTableObservableMethod(data.ids)\n : data.deleteItemFromTableObservableMethod(data.id);\n\n observable.subscribe({\n next: () => {\n this.ref.close(true); // deleted succesfully\n },\n error: () => {\n this.ref.close(false); // not deleted succesfully\n },\n });\n }\n\n reject() {\n this.ref.close(false);\n }\n}\n","<ng-container *transloco=\"let t\">\n <p-confirmDialog #cd></p-confirmDialog>\n <div\n class=\"border-b surface-border text-lg\"\n style=\"\n display: flex;\n align-items: center;\n padding-bottom: 10px;\n width: 100%;\n gap: 10px;\n \"\n >\n <i class=\"pi pi-exclamation-circle text-4xl\"></i>\n <p>{{ config.data.message }}</p>\n </div>\n\n <div\n style=\"display: flex; gap: 12px; justify-content: right; margin-top: 28px\"\n >\n <spiderly-button\n (onClick)=\"reject()\"\n icon=\"pi pi-times\"\n [label]=\"t('Cancel')\"\n severity=\"secondary\"\n ></spiderly-button>\n <spiderly-button\n (onClick)=\"accept()\"\n icon=\"pi pi-check\"\n [label]=\"t('Confirm')\"\n styleClass=\"p-button-danger\"\n ></spiderly-button>\n </div>\n</ng-container>\n","import { CommonModule, formatDate, formatNumber } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n ContentChild,\n ContentChildren,\n ElementRef,\n ErrorHandler,\n EventEmitter,\n effect,\n inject,\n Inject,\n Injector,\n Input,\n LOCALE_ID,\n NgZone,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n SimpleChanges,\n TemplateRef,\n viewChild,\n ViewChild,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { SortMeta } from 'primeng/api';\nimport { ButtonModule } from 'primeng/button';\nimport { CheckboxModule } from 'primeng/checkbox';\nimport { DialogService, DynamicDialogRef } from 'primeng/dynamicdialog';\nimport { Popover, PopoverModule } from 'primeng/popover';\nimport { Table, TableLazyLoadEvent, TableModule } from 'primeng/table';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { firstValueFrom, Observable, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { SpiderlyControlsModule } from '../../controls/spiderly-controls.module';\nimport {\n CellTemplateContext,\n SpiderlyCellTemplateDirective,\n} from '../../directives/spiderly-cell-template.directive';\nimport { SpiderlyDataTableActionsDirective } from '../../directives/spiderly-data-table-actions.directive';\nimport { SpiderlyOverflowTitleDirective } from '../../directives/spiderly-overflow-title.directive';\nimport { Filter } from '../../entities/filter';\nimport { LazyLoadSelectedIdsResult } from '../../entities/lazy-load-selected-ids-result';\nimport { PaginatedResult } from '../../entities/paginated-result';\nimport { PrimengOption } from '../../entities/primeng-option';\nimport {\n FilterSource,\n SortKeyLabel,\n SortPickOption,\n} from '../../filters/filter-store';\nimport { SpiderlyFilterTemplateDirective } from '../../directives/spiderly-filter-template.directive';\nimport { SpiderlyFilterBarComponent } from '../../filters/spiderly-filter-bar.component';\nimport { ConfigServiceBase } from '../../services/config.service.base';\nimport {\n exportListToExcel,\n firstCharToUpper,\n getHtmlImgDisplayString64,\n parseDateOnlyLocal,\n scrollElementIntoViewIfAboveViewport,\n} from '../../services/helper-functions';\nimport { SpiderlyMessageService } from '../../services/spiderly-message.service';\nimport { readStoredJson, writeStoredJson } from '../../services/web-storage';\nimport {\n DeleteConfirmationData,\n SpiderlyDeleteConfirmationComponent,\n} from '../spiderly-delete-dialog/spiderly-delete-confirmation.component';\nimport { SpiderlyFormControl } from '../spiderly-form-control/spiderly-form-control';\n\n/**\n * Default column width per value type, in rem — generous on purpose (these numbers date from when\n * the header carried a filter input, and nobody has re-derived them from values yet), and\n * {@link Column.width} is the per-column override.\n *\n * A table, not a switch, so the mapping is exhaustive: a new `filterType` fails the build here\n * instead of silently inheriting the actions-column reservation below.\n */\n/** One rem in pixels. Both the share arithmetic and the px-to-share conversion need it. */\nfunction rootFontSizePx(): number {\n return parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\n}\n\n/** Order matters: `[a, b]` and `[b, a]` ask the server for different orderings. */\nfunction sortMetaEquals(a: SortMeta[], b: SortMeta[]): boolean {\n return (\n a.length === b.length &&\n a.every((m, i) => m.field === b[i].field && m.order === b[i].order)\n );\n}\n\nconst DEFAULT_COLUMN_WIDTH_REM: Record<\n NonNullable<Column['filterType']>,\n number\n> = {\n text: 12,\n date: 10,\n multiselect: 12,\n boolean: 8,\n numeric: 12,\n // Fits the 45px thumbnail `#defaultCell` renders for a blob.\n blob: 5,\n};\n\n@Component({\n selector: 'spiderly-data-table',\n templateUrl: './spiderly-data-table.component.html',\n styleUrl: 'spiderly-data-table.component.scss',\n imports: [\n FormsModule,\n CommonModule,\n TranslocoDirective,\n SpiderlyControlsModule,\n TableModule,\n ButtonModule,\n PopoverModule,\n CheckboxModule,\n SpiderlyFilterBarComponent,\n SpiderlyOverflowTitleDirective,\n TooltipModule,\n ],\n})\nexport class SpiderlyDataTableComponent\n implements OnInit, OnChanges, AfterViewInit, OnDestroy\n{\n private readonly destroy$ = new Subject<void>();\n\n @ViewChild('dt') table: Table;\n\n private readonly injector = inject(Injector);\n private readonly zone = inject(NgZone);\n\n /**\n * The selection column's declared share. Under the fixed layout this is a RATIO, not a width.\n *\n * 4rem, down from 6: the original reserved room for a five-digit select-all counter sitting at\n * body text size beside the box, which is the widest thing it can ever hold and not what it\n * holds on any ordinary screen. The counter is a smaller step now (see the SCSS), so the same\n * five digits fit in two thirds of the space.\n */\n protected readonly selectionColumnWidth = '4rem';\n\n /**\n * The selection column's MEASURED width, which is what the frozen identity column offsets\n * itself by. Declaring `6rem` on both looked like the one-telling answer and is wrong: widths\n * are shares, so that column renders at whatever proportion of the table it gets — 148px for a\n * declared 6rem in one spec — and the identity column would sit 52px inside it, overlapping the\n * checkboxes the moment anyone scrolled. The spec caught it; nothing about the page would have.\n */\n protected frozenOffsetPx = 0;\n\n private selectionWidthObserver?: ResizeObserver;\n\n /** Aborts an in-flight column resize's document listeners, from `onUp` or from teardown. */\n private resizeAbort: AbortController | null = null;\n\n /**\n * Whether this column is pinned against the left edge. Only the FIRST column, and only when it\n * is `lockVisible`: a sticky column in the middle of the grid pins the wrong thing and leaves a\n * hole where it used to be. Once the grid scrolls sideways a row otherwise loses its identity\n * — \"Intesa, plaćeno, 12.400\" with no idea whose order it is — and NN/g's Data Tables is\n * explicit that the leftmost header column must lock in place. `lockVisible` already names\n * exactly that column in every table, so this needs no new API (CLAUDE.md -> decision 8).\n */\n isColumnFrozen(col: Column): boolean {\n return col.lockVisible === true && this.visibleCols[0] === col;\n }\n\n /**\n * The rightmost pinned cell, which carries the seam's shadow. It is the identity column when\n * there is one and the checkbox column otherwise — a fact only this side knows, which is why\n * the SCSS asking for it as `:last-of-type` drew nothing at all.\n */\n isLastFrozenColumn(col: Column): boolean {\n return this.isColumnFrozen(col);\n }\n\n get isSelectionColumnLastFrozen(): boolean {\n return !this.visibleCols.some((col) => this.isColumnFrozen(col));\n }\n\n /** A frozen column starts after the checkbox column, when there is one. */\n frozenColumnOffset(): string {\n return this.selectionMode === 'multiple' ? `${this.frozenOffsetPx}px` : '0';\n }\n\n /**\n * Tracks the selection column's rendered width. A ResizeObserver rather than a one-off read:\n * every column drag and every window resize re-splits the shares, so the offset moves without\n * anything about the selection column itself changing.\n */\n private observeSelectionWidth(): void {\n const cell = this.selectionHeader()?.nativeElement;\n if (!cell || this.selectionWidthObserver) return;\n\n const measure = () => {\n const width = cell.offsetWidth;\n if (width === this.frozenOffsetPx) return;\n\n this.zone.run(() => (this.frozenOffsetPx = width));\n };\n\n if (typeof ResizeObserver !== 'undefined') {\n this.zone.runOutsideAngular(() => {\n this.selectionWidthObserver = new ResizeObserver(measure);\n this.selectionWidthObserver.observe(cell);\n });\n }\n\n // Measured once immediately as well, on a microtask. The observer's first callback arrives an\n // animation frame later, and until it does the identity column sits at left:0 — on top of the\n // checkbox column it is supposed to start after. The microtask keeps the write out of the CD\n // pass that just finished, which doing it inline here would break with an NG0100.\n queueMicrotask(measure);\n }\n\n /**\n * Custom toolbar content projected via `<ng-template spiderlyDataTableActions>`.\n * Rendered in the caption action area ahead of the built-in buttons.\n */\n @ContentChild(SpiderlyDataTableActionsDirective, { read: TemplateRef })\n actionsTemplate: TemplateRef<any>;\n\n /**\n * Per-column cell templates projected via `<ng-template spiderlyCellTemplate=\"field\">`.\n * A column with no template keeps the built-in rendering.\n */\n @ContentChildren(SpiderlyCellTemplateDirective)\n cellTemplates: QueryList<SpiderlyCellTemplateDirective>;\n\n @Input() tableTitle: string;\n @Input() tableIcon: string = 'pi pi-list';\n @Input() items: any[]; // Pass only when hasLazyLoad === false\n @Input() rows: number;\n /** Paginator page-size choices; merge rules and persistence: CLAUDE.md → \"Rows-per-page\". */\n @Input() rowsPerPageOptions: number[] = [10, 25, 50, 100];\n @Input() cols: Column[];\n\n /**\n * The consumer's filter store — the table's WHOLE filter surface, rendered as the chip bar. A\n * table given none has no filtering at all (`Column.filterType` is only the value's shape; the\n * legacy header-filter fallback was deleted — CLAUDE.md -> \"Operator-owned view\").\n *\n * READ ONCE, in ngOnInit — a store assigned later is silently ignored: the requery effect\n * stays subscribed to the first store's `applied()`, and `resolvedStateKey` (which\n * `additionalFilterIdLong` feeds) is never re-derived either. A consumer that must swap\n * stores at runtime destroys and recreates the table around the swap — PACMS\n * `integration-matching-products` nulls its view model for exactly this. Teaching\n * ngOnChanges to re-arm both is the open upstream fix.\n */\n @Input() filters?: FilterSource;\n\n /** Saved questions for this table, rendered as tabs above the bar. */\n @Input() views?: TableView[];\n\n /**\n * The view currently selected. Seeded from the first view in `ngOnInit` — then overridden by\n * `restoreActiveView`, so a reload lands where the operator was — and never left null on a\n * table that has views: `viewScope` keys the layout off it, so an unseeded table writes its\n * width and order to the SAME key an unmigrated table uses — orphaned the moment the operator\n * clicks the first tab — and no tab reads as selected until they do.\n */\n activeViewId: string | null = null;\n /** Whether the paginator is shown. Pass only when `hasLazyLoad === false`. Defaults to `true`. */\n @Input() showPaginator: boolean = true;\n /** Whether the table is wrapped in a card container. Defaults to `false`. */\n @Input() showCardWrapper: boolean = false;\n @Input() readonly: boolean = false;\n @Input() idField = 'id';\n\n /**\n * Sizes the columns from their declared widths instead of from the rendered rows.\n *\n * The browser default is `table-layout: auto`, which computes every column from the content\n * of the rows currently on screen — so a column is one width on this page and another on the\n * next, and a filter (which narrows the variety of values in the column it filters) moves the\n * whole grid. PrimeNG sets no `table-layout` of its own, so without this the table inherits\n * that default. Bound to a field, never an object literal in the template: a literal is a new\n * reference on every change-detection pass.\n */\n protected readonly tableStyle = { 'table-layout': 'fixed' };\n totalRecords: number;\n @Output() onTotalRecordsChange: EventEmitter<number> = new EventEmitter();\n\n @Input() getPaginatedListObservableMethod: (\n tableFilter: Filter,\n ) => Observable<PaginatedResult>;\n @Input() exportListToExcelObservableMethod: (\n tableFilter: Filter,\n ) => Observable<any>;\n @Input() deleteItemFromTableObservableMethod: (\n rowId: number,\n ) => Observable<any>;\n @Input() deleteListFromTableObservableMethod: (\n ids: number[],\n ) => Observable<any>;\n\n lastLazyLoadEvent: TableLazyLoadEvent;\n private loading: boolean = true;\n\n @Input() newlySelectedItems: number[] = [];\n fakeSelectedItems: number[] = []; // Only for showing checkboxes, we will not send this to the backend\n currentPageSelectedItemsFromDb: number[] = []; // Made so we can add only newly selected items to the newlySelectedItems\n @Input() unselectedItems: number[] = [];\n @Input() selectionMode: 'single' | 'multiple' | undefined | null;\n @Output() onLazyLoad: EventEmitter<Filter> = new EventEmitter();\n rowsSelectedNumber: number = 0;\n isAllSelected: boolean = null;\n fakeIsAllSelected: boolean = false; // Only for showing checkboxes, we will not send this to the backend\n isFirstTimeLazyLoad: boolean = true;\n /** Shift-range selection state — model and invariants: CLAUDE.md → \"Shift-click range selection\". */\n private rangeAnchorId: number | null = null;\n private pendingShift: { shiftKey: boolean; id: number } | null = null;\n @Output() onIsAllSelectedChange: EventEmitter<AllClickEvent> =\n new EventEmitter();\n @Input() selectedLazyLoadObservableMethod: (\n tableFilter: Filter,\n ) => Observable<LazyLoadSelectedIdsResult>;\n @Input() additionalFilterIdLong: number;\n\n /** Whether the \"Add\" button is shown. Defaults to `true`. */\n @Input() showAddButton: boolean = true;\n /** Whether the \"Export to Excel\" button is shown. Defaults to `true`. */\n @Input() showExportToExcelButton: boolean = true;\n /** Whether the reload-table button is shown. Defaults to `false`. */\n @Input() showReloadTableButton: boolean = false;\n\n deleteRef: DynamicDialogRef;\n\n // Client side table\n // @Input() formArrayItems: any[]; // Pass this only if you have some additional logic for showing data\n @Input() getFormArrayItems: (additionalIndexes?: any) => any[];\n @Input() hasLazyLoad: boolean = true;\n\n /**\n * Unique key for persisting table state (filters, sort, pagination) to storage.\n * Auto-generated from the current route when not provided.\n */\n @Input() stateKey?: string;\n\n /** 'session' persists across refresh only; 'local' persists indefinitely. */\n @Input() stateStorage: 'session' | 'local' = 'session';\n\n /**\n * Column field the table sorts by while the user has no sort of their own — applied on\n * first load (persisted state, when present, wins) and re-applied whenever an action\n * would leave the table unsorted (tri-state header click, Clear filters). Shows as a\n * regular header sort arrow. Omit to keep the backend's implicit Id DESC ordering.\n */\n @Input() defaultSortField?: string;\n\n /** Direction for `defaultSortField`: 1 ascending (default), -1 descending. */\n @Input() defaultSortOrder: 1 | -1 = 1;\n\n initialMultiSortMeta: SortMeta[] | null = null;\n\n /** Columns currently rendered — `cols` minus the hidden ones. Actions columns always render. */\n visibleCols: Column[] = [];\n\n /** Cached count of visible data columns, so template bindings don't re-derive it per CD cycle. */\n private visibleDataColsCount = 0;\n\n /** Data columns offered in the column chooser (actions columns are excluded). */\n chooserCols: Column[] = [];\n\n resolvedStateKey: string | null = null;\n selectedItemIds: number[] = []; // Pass only when hasLazyLoad === false, it's enough if the M2M association hasn't additional fields\n @Input() getAlreadySelectedItemIds: (additionalIndexes?: any) => number[]; // Pass only when hasLazyLoad === false, it's enough if the M2M association hasn't additional fields\n selectedItems: any[] = []; // Pass only when hasLazyLoad === false\n @Input() getAlreadySelectedItems: (additionalIndexes?: any) => any[]; // Pass only when hasLazyLoad === false, it's enough if the M2M association hasn't additional fields\n @Input() getFormControl: (\n formControlName: string,\n index: number,\n additionalIndexes?: any,\n ) => SpiderlyFormControl;\n @Input() additionalIndexes: any;\n @Output() onRowSelect: EventEmitter<RowClickEvent> = new EventEmitter();\n @Output() onRowUnselect: EventEmitter<RowClickEvent> = new EventEmitter();\n /**\n * if true, clicking a row will navigate to the details page.\n * Set to false to disable row navigation.\n * Default is false.\n */\n @Input() navigateOnRowClick: boolean = false;\n\n /**\n * Path to navigate to when clicking a row.\n * If not provided, it will use the current route with the row ID.\n * Example: 'details' will navigate to '/details/{rowId}'.\n */\n @Input() rowNavigationPath: string;\n\n constructor(\n private router: Router,\n private dialogService: DialogService,\n private route: ActivatedRoute,\n private messageService: SpiderlyMessageService,\n private translocoService: TranslocoService,\n private configService: ConfigServiceBase,\n private errorHandler: ErrorHandler,\n @Inject(LOCALE_ID) private locale: string,\n ) {}\n\n ngAfterViewInit(): void {\n this.setupRemovableSort();\n this.observeSelectionWidth();\n }\n\n /**\n * The template that renders this column's cells, or null to use the built-in rendering.\n * Actions columns have no `field`, so they never match one.\n *\n * Read straight off the QueryList, which is live — a consumer declaring its templates inside a\n * `@for`/`@if` is served with no subscription and nothing to invalidate. The scan is over the\n * TEMPLATED columns only (typically one or two), not over `cols`.\n */\n getCellTemplate(col: Column): TemplateRef<CellTemplateContext> | null {\n if (col.field == null) return null;\n return (\n this.cellTemplates?.find((directive) => directive.field === col.field)\n ?.template ?? null\n );\n }\n\n // PrimeNG v19 removed the removableSort property. This overrides the table's\n // sort() method to add tri-state cycling: ascending → descending → unsorted\n // (or back to the declared default sort when one is set).\n private setupRemovableSort(): void {\n const originalSort = this.table.sort.bind(this.table);\n\n this.table.sort = (event: { originalEvent: Event; field: string }) => {\n const sortMeta = this.table.getSortMeta(event.field);\n\n if (sortMeta && sortMeta.order === -1) {\n const mouseEvent = event.originalEvent as MouseEvent;\n const isMultiSortClick = mouseEvent.metaKey || mouseEvent.ctrlKey;\n\n if (isMultiSortClick) {\n // Removing ONE level of a multi-sort keeps the reader's place (PrimeNG's metaKey\n // path never pages either), so this cannot ride applySort, whose page reset is\n // half the point. The substituted default keeps sortMultiple() to one emission.\n const remaining = this.table._multiSortMeta.filter(\n (m) => m.field !== event.field,\n );\n this.table._multiSortMeta = remaining.length\n ? remaining\n : (this.defaultMultiSortMeta() ?? remaining);\n\n this.table.sortMultiple();\n if (this.table.isStateful()) this.table.saveState();\n this.table.anchorRowIndex = null;\n this.persistActiveViewSort();\n } else {\n // A single-click un-sort IS \"back to the default\" — the exact gesture the bar's\n // reset row asks for, so it uses the same body.\n this.resetSortFromBar();\n }\n } else {\n originalSort(event);\n // PrimeNG's sort() pages/saves itself; the override slot is ours to record.\n this.persistActiveViewSort();\n }\n };\n }\n\n /**\n * A page size PrimeNG will actually apply but that is missing from `rowsPerPageOptions` leaves\n * the paginator dropdown blank — so both the effective `rows` and the persisted pick (which\n * `restoreState` applies after init) are merged in. Runs again on input changes because a\n * consumer may resolve `[rows]` asynchronously. Storage is user-writable, hence the shape and\n * ceiling check: a hand-edited `{\"rows\": 100000}` must not become an offered choice, since the\n * backend `.Take`s whatever it is sent.\n */\n private mergeActivePageSizesIntoOptions(): void {\n const ceiling = Math.max(...this.rowsPerPageOptions);\n const persisted = this.persistedTableState()?.rows;\n const candidates = [\n this.rows,\n Number.isInteger(persisted) && persisted > 0 && persisted <= ceiling\n ? persisted\n : null,\n ];\n\n for (const value of candidates) {\n if (value != null && !this.rowsPerPageOptions.includes(value)) {\n this.rowsPerPageOptions = [...this.rowsPerPageOptions, value].sort(\n (a, b) => a - b,\n );\n }\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // Only meaningful once ngOnInit has resolved the defaults; before that it is a no-op re-run.\n if (this.rows != null) this.mergeActivePageSizesIntoOptions();\n if (changes['views']) this.adoptStoredView();\n }\n\n ngOnInit(): void {\n // Fail loud, not half-broken: the store commits through the paginated request, and a\n // client-side (form-array) table has none — armed anyway, the first commit would call the\n // absent getPaginatedListObservableMethod inside the requery effect and strand the pending\n // overlay forever. Client-side store predicates are unbuilt (spiderly#407 territory).\n if (this.filters && !this.hasLazyLoad) {\n throw new Error(\n 'spiderly-data-table: [filters] requires a lazy table — client-side filtering through a store is not implemented. Remove [filters] or make the table lazy.',\n );\n }\n\n if (this.rows == null) this.rows = this.configService.defaultPageSize;\n\n this.activeViewId ??= this.views?.[0]?.id ?? null;\n\n\n if (this.deleteListFromTableObservableMethod && !this.selectionMode) {\n this.selectionMode = 'multiple';\n }\n\n if (this.hasLazyLoad) {\n const baseKey = this.stateKey ?? `spiderly-table:${this.router.url}`;\n this.resolvedStateKey =\n this.additionalFilterIdLong != null\n ? `${baseKey}:${this.additionalFilterIdLong}`\n : baseKey;\n } else {\n this.clientLoad();\n }\n\n this.mergeActivePageSizesIntoOptions();\n\n // AFTER `resolvedStateKey` is derived, which is what every restore below keys off — placed\n // above it they read a null key and silently restore nothing. The view restore runs FIRST,\n // because the other three read the `viewScope` it decides. And all of it before the effect\n // is armed, so the first request already carries the filters and the effect's skipped first\n // run sees the state it will be watching.\n const restoredView = this.restoreActiveView();\n\n this.restoreColumnVisibility();\n this.restoreColumnLayout();\n\n this.enterViewFilters(restoredView, 'refresh');\n if (this.filters) this.requeryOnAppliedFilters();\n\n this.chooserCols = this.cols.filter(SpiderlyDataTableComponent.isDataColumn);\n this.refreshVisibleCols();\n\n // From chooserCols, not cols: same \"every data column, hidden included\" set the chooser\n // offers — one derivation of that list, so the picker cannot drift from it.\n this.sortPickOptions = this.chooserCols\n .filter((col) => this.isColumnSortable(col))\n .map((col) => ({ field: col.field!, label: col.name }));\n\n // Bound to p-table's [multiSortMeta] so the FIRST request already carries the right\n // sort. On a viewed table the persisted table-global sort is a NON-SOURCE (2026-09-06):\n // sort is per-view state (override ?? declared ?? table default), and the blob — which\n // holds the last ordering ANY view used — would re-impose across views the exact\n // carry-over the per-view model removes, on every F5. It still carries rows/first there,\n // and stays the one sort memory of a view-less table. We read it all ourselves because\n // PrimeNG's restoreState() runs on the first [value] change — after the initial lazy emit\n // has already left — and is then told to agree (see `alignPersistedTableStateSort`).\n const tableState = this.persistedTableState();\n this.initialMultiSortMeta = this.views?.length\n ? this.resolvedViewSort()\n : (this.sanitizedSortMeta(tableState?.multiSortMeta) ??\n this.tableDefaultMultiSortMeta());\n this.alignPersistedTableStateSort(tableState);\n }\n\n //#region Column visibility\n\n /**\n * User visibility choices (field → visible), holding only fields the user explicitly\n * toggled away from their declared default — so a page changing a column's declared\n * default later flows through to every user who never touched that column.\n */\n private columnVisibilityOverrides: Record<string, boolean> = {};\n\n /** A data column shows values for a `field`; anything else (the actions column) always renders. */\n private static isDataColumn(col: Column): boolean {\n return !!col.field;\n }\n\n /**\n * Storage slot for the visibility overrides. Deliberately ALWAYS localStorage, even when\n * `stateStorage` is 'session': the column layout is a durable preference, while filters\n * are a transient working set — different natural lifetimes.\n */\n private get columnsStateKey(): string | null {\n return this.resolvedStateKey\n ? `${this.resolvedStateKey}${this.viewScope}:columns`\n : null;\n }\n\n /** Actions columns always render; data columns follow the override, then declared default. */\n isColumnVisible(col: Column): boolean {\n if (!SpiderlyDataTableComponent.isDataColumn(col)) return true;\n if (col.lockVisible) return true; // pinned — wins over any (possibly stale) override\n return this.columnVisibilityOverrides[col.field] ?? col.visible !== false;\n }\n\n /**\n * `cols` in the operator's order. A field the stored order has never seen — a column added in a\n * later release — sorts to the END rather than displacing a layout someone built by hand\n * (CLAUDE.md -> \"Operator-owned view\", decision 7); the sort is stable, so those keep their\n * declared order among themselves. Actions columns carry no field and are always last, which is\n * where every consumer already declares them.\n */\n private orderedCols(): Column[] {\n if (this.columnOrder.length === 0) return this.cols;\n\n const rank = new Map(\n this.columnOrder.map((field, index) => [field, index]),\n );\n\n return [...this.cols].sort(\n (a, b) =>\n (rank.get(a.field!) ?? Number.MAX_SAFE_INTEGER) -\n (rank.get(b.field!) ?? Number.MAX_SAFE_INTEGER),\n );\n }\n\n /**\n * Whether this column can move one place in `direction` (-1 left, 1 right). A locked column is\n * the row's anchor — and, once the left edge freezes, the thing a horizontal scroll keeps in\n * view — so it does not move and nothing moves in front of it.\n */\n canMoveColumn(col: Column, direction: -1 | 1): boolean {\n if (col.lockVisible || !col.field) return false;\n\n const order = this.dataColumnsInOrder();\n const from = order.indexOf(col);\n const to = from + direction;\n\n if (from < 0 || to < 0 || to >= order.length) return false;\n\n return !order[to].lockVisible;\n }\n\n moveMenuColumn(direction: -1 | 1): void {\n const col = this.menuColumn;\n this.columnMenu().hide();\n if (!col || !this.canMoveColumn(col, direction)) return;\n\n const order = this.dataColumnsInOrder();\n this.placeColumn(order, col, order.indexOf(col) + direction);\n }\n\n /** The move itself, shared by the menu and the drag — two entry points, one rule. */\n private placeColumn(order: Column[], col: Column, to: number): void {\n order.splice(to, 0, ...order.splice(order.indexOf(col), 1));\n\n this.columnOrder = order.map((entry) => entry.field!);\n this.persistColumnLayout();\n this.refreshVisibleCols();\n }\n\n private dataColumnsInOrder(): Column[] {\n return this.orderedCols().filter(SpiderlyDataTableComponent.isDataColumn);\n }\n\n /**\n * Header drag, ours rather than PrimeNG's `pReorderableColumn`, for two reasons: its\n * `onMouseDown` arms the th for anything that is not an INPUT, a TEXTAREA or its OWN resizer —\n * so our menu chevron and our resize grip would each start a column drag, and reaching for a\n * width would silently reorder the grid — and its `onColumnDrop` reorders blind, with no notion\n * of a locked column (CLAUDE.md -> decision 6).\n *\n * A shortcut for neighbours, never the mechanism: HTML5 dnd has no edge auto-scroll, so a column\n * scrolled off the right is unreachable this way, and there is no keyboard path at all. The menu\n * carries both.\n *\n * This half is the arming rule; the drop rule is `canDropOn` below.\n */\n onHeaderMouseDown(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n\n this.headerDragArmed = !target.closest(\n '.column-menu-button, .column-resizer',\n );\n }\n\n onHeaderDragStart(col: Column, event: DragEvent): void {\n if (col.lockVisible || !this.headerDragArmed) {\n event.preventDefault();\n return;\n }\n\n this.draggedColumn = col;\n event.dataTransfer?.setData('text/plain', col.field ?? '');\n }\n\n onHeaderDragOver(col: Column, event: DragEvent): void {\n if (this.canDropOn(col)) event.preventDefault();\n }\n\n onHeaderDrop(col: Column, event: DragEvent): void {\n event.preventDefault();\n\n const dragged = this.draggedColumn;\n this.draggedColumn = null;\n if (!dragged || dragged === col || !this.canDropOn(col)) return;\n\n const order = this.dataColumnsInOrder();\n this.placeColumn(order, dragged, order.indexOf(col));\n }\n\n /** Nothing lands on, or in front of, the locked column. Enforced here as well as in the menu:\n * a drop is a separate entry point, and the rule is about the grid rather than about a button. */\n private canDropOn(col: Column): boolean {\n return !col.lockVisible && SpiderlyDataTableComponent.isDataColumn(col);\n }\n\n private refreshVisibleCols(): void {\n this.visibleCols = this.orderedCols().filter((col) =>\n this.isColumnVisible(col),\n );\n this.visibleDataColsCount = this.visibleCols.filter(\n SpiderlyDataTableComponent.isDataColumn,\n ).length;\n }\n\n /**\n * Locked columns can't be toggled; the last visible data column can't be hidden — the\n * table must never collapse to just an actions column. Revealing is always allowed.\n */\n canToggleColumn(col: Column): boolean {\n if (col.lockVisible) return false;\n if (!this.isColumnVisible(col)) return true;\n return this.visibleDataColsCount > 1;\n }\n\n toggleColumn(col: Column, visible: boolean): void {\n if (visible === (col.visible !== false)) {\n delete this.columnVisibilityOverrides[col.field]; // back at the declared default\n } else {\n this.columnVisibilityOverrides[col.field] = visible;\n }\n\n this.persistColumnVisibility();\n this.refreshVisibleCols();\n\n if (!visible) this.dropHiddenColumnSort([col]);\n }\n\n /**\n * Restores every column to its declared default and forgets the stored overrides — visibility,\n * wrap, order and width alike. It undid visibility only until the header menu shipped three\n * more gestures beside it, and a layout with no way back is worse than one with no knobs.\n *\n * On a STORE table, hiding — here or from the menu — never touches filters or sort: the chip\n * bar names every applied filter and the sort chip names the sort, hidden column or not\n * (decision 2b). A storeless table keeps the sort half of the legacy invariant instead — see\n * `dropHiddenColumnSort`.\n */\n resetColumnLayout(): void {\n this.columnWrap = {};\n this.columnOrder = [];\n this.columnWidths = {};\n this.persistColumnLayout();\n\n const wasVisible = this.visibleCols.filter(\n SpiderlyDataTableComponent.isDataColumn,\n );\n\n this.columnVisibilityOverrides = {};\n this.persistColumnVisibility();\n this.refreshVisibleCols();\n\n // Columns the reset just hid follow the same rule as a manual hide.\n this.dropHiddenColumnSort(\n wasVisible.filter((col) => !this.isColumnVisible(col)),\n );\n }\n\n /**\n * The sort half of the legacy \"hidden contributes nothing\" invariant, kept ONLY for storeless\n * tables (the generated M2M details grids, until spiderly#407 scaffolds their stores): they\n * have no sort chip, so a hidden column's sort would order the grid with nothing on screen\n * naming it and no control left to clear it. The filter half needs no heir — `lazyLoad`\n * overwrites the outgoing filters unconditionally. On a store table this is a no-op:\n * decision 2b's chips are the visible surface, hidden column or not.\n */\n private dropHiddenColumnSort(cols: Column[]): void {\n if (!this.table || this.filters) return;\n\n const sorted = cols.filter((col) =>\n this.table._multiSortMeta?.some((m) => m.field === col.field),\n );\n if (!sorted.length) return;\n\n this.table._multiSortMeta = this.table._multiSortMeta.filter(\n (m) => !sorted.some((col) => col.field === m.field),\n );\n this.table.tableService.onSort(this.table._multiSortMeta);\n this.table._filter(); // re-emits the lazy load and saves the cleaned state\n }\n\n /**\n * Per-column wrap, by `field`. A SEPARATE key from the visibility overrides on purpose: folding\n * both into one object would invalidate every layout already in an operator's localStorage, and\n * this is the key the width and order overrides will join (decision 5).\n */\n private columnWrap: Record<string, boolean> = {};\n\n /** Data-column fields in the operator's order. Empty means \"as declared\". */\n private columnOrder: string[] = [];\n\n /**\n * Per-column width overrides, as SHARES in the same unit `getColWidth` emits — never pixels.\n * Under the fixed layout the browser splits surplus in proportion to these, so a pixel would\n * pin the column and stop it answering the window: the operator on a 1280 laptop and the one\n * on a 2560 monitor would get the same frozen column (decision 4).\n */\n private columnWidths: Record<string, number> = {};\n\n /**\n * Layout keys carry the ACTIVE VIEW, which is what makes a view more than a saved filter: a\n * picking view and a payments view want different COLUMNS, not just different rows. Global\n * layout would re-create the original complaint one level up — the operator still re-picking\n * columns every time the job changes.\n *\n * A table with no views has no segment, so the twenty-six tables that have not migrated keep\n * reading exactly the keys they already wrote.\n */\n private get viewScope(): string {\n return this.activeViewId ? `:${this.activeViewId}` : '';\n }\n\n /**\n * Where the applied filters live. Follows `stateStorage` rather than the layout's always-local\n * rule, because that is where they lived before the bar took them off the header: PrimeNG's\n * stateful table persisted them for free, and nothing replaced it — a refresh dropped every\n * filter (Filip, on /tags). A filter is a question you are in the middle of asking, not a\n * durable preference like a column's width.\n */\n private get filtersStateKey(): string | null {\n return this.resolvedStateKey\n ? `${this.resolvedStateKey}${this.viewScope}:filters`\n : null;\n }\n\n private get filterStorage(): Storage {\n return this.stateStorage === 'local' ? localStorage : sessionStorage;\n }\n\n /**\n * Where the active view id lives. Deliberately NOT view-scoped — it is the input `viewScope`\n * derives from — and it follows `stateStorage` like the filters rather than the layout's\n * always-local rule, because the id and the filters it scopes are one question: a durable id\n * over session-scoped filters would restore a tab with nothing under it.\n */\n private get viewStateKey(): string | null {\n return this.resolvedStateKey ? `${this.resolvedStateKey}:view` : null;\n }\n\n /** Only `selectView` writes; the `ngOnInit` seed does not — absence means \"the default\". */\n private persistActiveView(): void {\n if (!this.viewStateKey || !this.activeViewId) return;\n\n writeStoredJson(this.filterStorage, this.viewStateKey, this.activeViewId);\n }\n\n /**\n * Puts a reload back on the view the operator was using. Every persisted key carries the view\n * segment, so before this existed the seed decided what got restored: F5 landed on the first\n * view and read `…:all:filters` — the tab snapped to \"Sve\" and the bar came back empty while\n * the operator's filters sat intact under the old view's segment (Filip, on /porudzbine).\n *\n * An id naming no current view keeps the seed AND the stored key: \"vanished by deploy\" and\n * \"not yet arrived\" are indistinguishable here (order-list's catalog-licensed \"Za pakovanje\"\n * is literally both), so `adoptStoredView` re-reads the key on every `[views]` change and the\n * key self-heals on the next explicit click.\n */\n private restoreActiveView(): TableView | null {\n if (!this.viewStateKey || !this.views?.length) return null;\n\n const storedId = readStoredJson(this.filterStorage, this.viewStateKey);\n if (typeof storedId !== 'string') return null;\n\n const view = this.viewById(storedId) ?? null;\n if (view) this.activeViewId = view.id;\n\n return view;\n }\n\n /**\n * The second half of `restoreActiveView`: a stored view that did not exist at init is adopted\n * when a later `[views]` change brings it — through `selectView`, so it gets the same\n * stored-wins/transient/layout/requery semantics a click would have had. There is no parked\n * copy of the stored id — the key itself is re-read, and because every explicit pick\n * overwrites it, the operator's own choice wins by construction. Accepted cost of adopting\n * late instead of holding the first request: a brief flash of the seeded view's rows and a\n * second request when the late view lands.\n */\n private adoptStoredView(): void {\n if (!this.viewStateKey) return;\n\n const storedId = readStoredJson(this.filterStorage, this.viewStateKey);\n if (typeof storedId !== 'string' || storedId === this.activeViewId) return;\n\n const view = this.viewById(storedId);\n if (view) this.selectView(view);\n }\n\n private viewById(id: string): TableView | undefined {\n return this.views?.find((candidate) => candidate.id === id);\n }\n\n private persistAppliedFilters(): void {\n if (!this.filtersStateKey || !this.filters) return;\n\n const snapshot = this.filters.snapshot();\n\n if (Object.keys(snapshot).length === 0) {\n this.filterStorage.removeItem(this.filtersStateKey);\n } else {\n writeStoredJson(this.filterStorage, this.filtersStateKey, snapshot);\n }\n }\n\n /**\n * Applies the right filters for entering `view` — the transient rule's one home. A TRANSIENT\n * view's `apply` is a function of NOW, so it always re-derives; restoring would put\n * yesterday's date under a tab claiming \"today\" (`persistAppliedFilters` has no transient\n * guard, so storage holds the LAST answer). A non-transient view's own stored answer wins\n * over its `apply`. The semantics argument is the one deliberate difference between the\n * callers: a 'click' re-asks the view's question when nothing is stored, a 'refresh' returns\n * the empty state the operator left — they cleared it, and F5 must give the cleared state\n * back. On a table with no views, `view` is null and this is a plain restore of the\n * `persistAppliedFilters` snapshot.\n */\n private enterViewFilters(\n view: TableView | null,\n semantics: 'click' | 'refresh',\n ): void {\n if (!this.filters) return;\n\n const stored =\n !view?.transient && this.filtersStateKey\n ? readStoredJson(this.filterStorage, this.filtersStateKey)\n : null;\n\n if (stored) this.filters.restore(stored);\n else if (view?.transient || semantics === 'click') view?.apply?.(this.filters);\n }\n\n private get layoutStateKey(): string | null {\n return this.resolvedStateKey\n ? `${this.resolvedStateKey}${this.viewScope}:layout`\n : null;\n }\n\n /** One key for the whole layout — wrap now, widths next (decision 5). */\n private persistColumnLayout(): void {\n if (!this.layoutStateKey) return;\n\n const layout = {\n wrap: this.columnWrap,\n order: this.columnOrder,\n widths: this.columnWidths,\n };\n const isDefault =\n Object.keys(this.columnWrap).length === 0 &&\n this.columnOrder.length === 0 &&\n Object.keys(this.columnWidths).length === 0;\n\n if (isDefault) localStorage.removeItem(this.layoutStateKey);\n else writeStoredJson(localStorage, this.layoutStateKey, layout);\n }\n\n private restoreColumnLayout(): void {\n if (!this.layoutStateKey) return;\n\n const layout = readStoredJson(localStorage, this.layoutStateKey);\n this.columnWrap = layout?.wrap ?? {};\n this.columnOrder = layout?.order ?? [];\n this.columnWidths = layout?.widths ?? {};\n }\n\n private persistColumnVisibility(): void {\n if (!this.columnsStateKey) return;\n\n if (Object.keys(this.columnVisibilityOverrides).length === 0) {\n localStorage.removeItem(this.columnsStateKey);\n } else {\n writeStoredJson(\n localStorage,\n this.columnsStateKey,\n this.columnVisibilityOverrides,\n );\n }\n }\n\n private restoreColumnVisibility(): void {\n if (!this.columnsStateKey) return;\n\n this.columnVisibilityOverrides =\n readStoredJson(localStorage, this.columnsStateKey) ?? {};\n }\n\n /**\n * PrimeNG's persisted table state (filters/sort/pagination), read directly from storage\n * because we need it before PrimeNG's restoreState() runs on the first [value] change.\n */\n private persistedTableState(): any {\n if (!this.resolvedStateKey) return null;\n\n return readStoredJson(\n this.stateStorage === 'local' ? localStorage : sessionStorage,\n this.resolvedStateKey,\n );\n }\n\n private activeView(): TableView | undefined {\n return this.activeViewId ? this.viewById(this.activeViewId) : undefined;\n }\n\n /**\n * Where the operator's per-view sort override lives. Null on a table without views — those\n * keep the pure PrimeNG sort persistence they always had — and null on a STORELESS table:\n * there \"hidden contributes nothing\" retires a hidden column's sort (`dropHiddenColumnSort`)\n * with no persist call at the hide site, so an override restored blind at the next init\n * would re-impose a sort no chip can name. Store tables — where every viewed consumer\n * lives — have the chip. Follows `stateStorage` like the filters and the view id: the sort\n * is part of the same question they scope.\n */\n private get viewSortStateKey(): string | null {\n if (!this.views?.length || !this.filters) return null;\n\n return this.resolvedStateKey\n ? `${this.resolvedStateKey}${this.viewScope}:sort`\n : null;\n }\n\n /** The operator's stored sort for the active view, sanitized like any persisted sort. */\n private persistedViewSort(): SortMeta[] | null {\n if (!this.viewSortStateKey) return null;\n\n const stored = readStoredJson(this.filterStorage, this.viewSortStateKey);\n return Array.isArray(stored) ? this.sanitizedSortMeta(stored) : null;\n }\n\n /**\n * THE resolution ladder, named once: the operator's stored override, else the declared\n * default (`defaultMultiSortMeta` = view's declared sort ?? table default). Null means\n * \"unsorted\" — callers append their own `?? []` / blob terms rather than re-spelling the\n * ladder, so a future term (a per-view default refinement, decision 10's columns half)\n * lands everywhere at once.\n */\n private resolvedViewSort(): SortMeta[] | null {\n return this.persistedViewSort() ?? this.defaultMultiSortMeta();\n }\n\n /**\n * Records the current sort as the active view's override — called from the EXPLICIT sort\n * gestures only (header click, `applySort` — the menu and both bar entry points), never\n * from a load: a sort merely inherited at init must not crystallize into an override, or a\n * later change to the view's declared sort would stop flowing to operators who never\n * touched sort — the same flows-through rule `columnVisibilityOverrides` documents. A sort\n * equal to the declared default is stored as ABSENCE for the same reason.\n */\n private persistActiveViewSort(): void {\n const key = this.viewSortStateKey;\n if (!key) return;\n\n const current = this.table._multiSortMeta ?? [];\n\n if (sortMetaEquals(current, this.defaultMultiSortMeta() ?? [])) {\n this.filterStorage.removeItem(key);\n } else {\n writeStoredJson(this.filterStorage, key, current);\n }\n }\n\n /**\n * Puts the entering view's sort on the grid — stored override, else declared sort, else the\n * table default, else UNSORTED. A view is a COMPLETE state, sort included (2026-09-06,\n * grilled — supersedes the \"a view stating no preference keeps the ordering already there\"\n * this first shipped with): the carried-over ordering read as a bug in its first live week,\n * when \"Poslate\"'s statusChangedAt rode onto \"Sve\", whose sorted column ships hidden —\n * read-only chip, no header to tri-state, no way out. Polaris IndexFilters is the model:\n * sort is part of a view's saved definition. Broadcast only — the caller owns the refetch,\n * because which request carries the new sort differs between the store and storeless paths.\n */\n private applyViewSort(): boolean {\n const target = this.resolvedViewSort() ?? [];\n if (sortMetaEquals(target, this.table._multiSortMeta ?? [])) return false;\n\n this.broadcastSort(target);\n return true;\n }\n\n /**\n * Rewrites the sort inside PrimeNG's persisted state to the one `ngOnInit` resolved. The two\n * can disagree only on a viewed table — PrimeNG's state is table-global while the resolved\n * sort is the view's — and PrimeNG's restoreState() applies its copy on the first [value]\n * change, AFTER the initial request already left with ours: without this line the grid's\n * arrows and every later request silently fall back to the other view's sort. Handed the\n * already-parsed state: `ngOnInit` reads the blob once for the whole init pass.\n */\n private alignPersistedTableStateSort(state: any): void {\n if (!this.views?.length || !this.resolvedStateKey || !state) return;\n\n const resolved = this.initialMultiSortMeta ?? [];\n if (sortMetaEquals(state.multiSortMeta ?? [], resolved)) return;\n\n state.multiSortMeta = resolved.length ? resolved : undefined;\n writeStoredJson(this.filterStorage, this.resolvedStateKey, state);\n }\n\n //#endregion\n\n /**\n * The DECLARED default in the current context: the active view's own sort when it declares\n * one, else the table-level `defaultSortField`. Every \"fall back to the declared default\"\n * site — tri-state un-sort, Clear filters, the unsorted-load safety net — reads this, so\n * un-sorting inside a view lands on the view's ordering, not the table's.\n */\n private defaultMultiSortMeta(): SortMeta[] | null {\n return this.viewDeclaredMultiSortMeta() ?? this.tableDefaultMultiSortMeta();\n }\n\n /**\n * The active view's declared sort, sanitized: a non-sortable field would answer every load\n * with a 400 (`keepSortableMeta`'s rationale), so it is dropped rather than sent; a view\n * whose declaration sanitizes to nothing falls through to the table default.\n */\n private viewDeclaredMultiSortMeta(): SortMeta[] | null {\n return this.sanitizedSortMeta(this.activeView()?.sort);\n }\n\n /**\n * The table-level declared default as PrimeNG sort meta, or null when none is declared. On a\n * store table it applies even while its column is hidden — the sort chip names the ordering\n * whether or not the column is on screen (decision 2b). A STORELESS table has no chip, so a\n * hidden default would order the grid with nothing on screen naming it; there the default\n * dies with the column, exactly as the legacy invariant had it (see `dropHiddenColumnSort`).\n */\n private tableDefaultMultiSortMeta(): SortMeta[] | null {\n if (!this.defaultSortField) return null;\n\n const defaultSortCol = this.cols?.find(\n (col) => col.field === this.defaultSortField,\n );\n if (\n defaultSortCol &&\n !this.filters &&\n !this.isColumnVisible(defaultSortCol)\n )\n return null;\n // A declared default on a non-sortable column is a consumer mistake the backend answers\n // with a 400 on every load; fall back to its implicit Id DESC instead (see keepSortableMeta).\n if (defaultSortCol && !this.isColumnSortable(defaultSortCol)) return null;\n\n return [{ field: this.defaultSortField, order: this.defaultSortOrder }];\n }\n\n /**\n * `keepSortableMeta` with \"sanitized to nothing\" surfaced as null — the rule every sort\n * SOURCE shares (\"a sort that sanitizes to nothing is no sort\"), so the resolution chains\n * can `??` past an empty answer instead of stopping on an empty array.\n */\n private sanitizedSortMeta(\n multiSortMeta: SortMeta[] | null | undefined,\n ): SortMeta[] | null {\n const sortable = this.keepSortableMeta(multiSortMeta);\n return sortable.length ? sortable : null;\n }\n\n /**\n * Drops sort meta the backend has no sort case for. Persisted state outlives the rule that\n * produced it — a sort stored before a column became non-sortable (or before the library\n * started disabling `*CommaSeparated` headers) would otherwise ride every lazy load, and the\n * generated `Build` answers an unknown sort field with a 400. There would be no way out from\n * the UI either: the header that could clear it is exactly the one no longer clickable.\n * Unknown fields (no matching column) are left alone — a consumer may sort on something it\n * declares no column for.\n */\n private keepSortableMeta(\n multiSortMeta: SortMeta[] | null | undefined,\n ): SortMeta[] {\n return (multiSortMeta ?? []).filter((sortMeta) => {\n const col = this.cols?.find((c) => c.field === sortMeta?.field);\n return col == null || this.isColumnSortable(col);\n });\n }\n\n // Safety net: any lazy load still leaving unsorted (stale persisted state; a viewless\n // table with no sort memory yet) falls back to the declared default. Patching the event\n // before it becomes the backend Filter avoids a second fetch; the re-broadcast keeps the\n // header icons agreeing with what was actually sent. The tri-state un-sort path never\n // gets here — it substitutes the default at its source in setupRemovableSort().\n private applyDefaultSortIfUnsorted(event: TableLazyLoadEvent): void {\n if (event.multiSortMeta?.length) return;\n\n const defaultSort = this.defaultMultiSortMeta();\n if (defaultSort == null) return;\n\n event.multiSortMeta = defaultSort;\n\n if (this.table) this.broadcastSort(defaultSort);\n }\n\n /** Puts `meta` on the grid and tells the header icons — no fetch; the caller owns that. */\n private broadcastSort(meta: SortMeta[]): void {\n this.table._multiSortMeta = meta;\n this.table.tableService.onSort(meta);\n }\n\n onPageChange(container: HTMLElement): void {\n scrollElementIntoViewIfAboveViewport(container);\n }\n\n /**\n * The one pending predicate: PrimeNG's overlay and the container's `aria-busy` must never\n * disagree about whether a fetch is in flight.\n *\n * It used to also test `items === undefined`, for the first load. That clause is dead now\n * that `loading` initialises true and every lazyLoad raises it — except in the one state\n * where it was actively wrong: a FAILED first load lowers the flag with `items` still\n * undefined, which pinned the overlay up forever. Same stranded overlay this component was\n * fixed for once already, through the other door.\n */\n get isPending(): boolean {\n return this.loading;\n }\n\n lazyLoad(event: TableLazyLoadEvent) {\n // Every refetch is pending, not just the first load and reload(). `items` is deliberately\n // left alone: the previous page stays on screen under the overlay (stale-while-revalidate)\n // rather than blanking. Raising the flag is also what stops PrimeNG's empty message, gated\n // on `isEmpty() && !loading`, from claiming \"no records\" for the length of the request.\n this.loading = true;\n\n this.applyDefaultSortIfUnsorted(event);\n this.lastLazyLoadEvent = event;\n this.refreshSortKeys();\n this.rangeAnchorId = null;\n\n let tableFilter: Filter = event as unknown as Filter;\n tableFilter.additionalFilterIdLong = this.additionalFilterIdLong;\n\n // The store is the ONLY source of what narrows the grid, on every table. Unconditional on\n // purpose: with the header filters gone, the one remaining writer of PrimeNG's own\n // `event.filters` is a stale persisted blob from the header-filter era replayed by\n // `restoreState` — and letting that through would narrow a storeless table invisibly, with\n // no chip and no button left to clear it.\n tableFilter.filters = this.filters?.toFilterPayload() ?? {};\n\n this.onLazyLoad.next(tableFilter);\n\n // Issued NOW rather than after the list lands: it needs only `tableFilter`, so serialising\n // it behind the list response cost a second round trip on every page of every\n // selection-enabled table — and the overlay is held up for both. The `.catch` at creation\n // is mandatory, not defensive: when the list request errors, `next` never runs, and a\n // rejected promise nobody awaits is exactly the unowned rejection this handler exists to\n // prevent. The rejection is re-thrown out of `awaitSelectedIds` instead, where it has one.\n const selectedIds =\n this.selectedLazyLoadObservableMethod != null\n ? firstValueFrom(\n this.selectedLazyLoadObservableMethod(tableFilter),\n ).catch((error) => error as Error)\n : null;\n\n this.getPaginatedListObservableMethod(tableFilter).subscribe({\n next: async (res) => {\n // The await below is INSIDE an async subscriber, so a rejection there settles nothing:\n // `error:` belongs to the paginated-list observable and never runs. That used to strand\n // the overlay forever, hence the finally.\n try {\n this.items = res.data;\n this.totalRecords = res.totalRecords;\n this.onTotalRecordsChange.next(res.totalRecords);\n\n await this.reconcileSelectionForLoadedPage(selectedIds);\n } catch (error) {\n // The library's own owner: it toasts, it skips HttpErrorResponse (the interceptor\n // already reported those), and a consumer's ErrorHandler wrapper forwards to their\n // tracker. console.error here would have dropped both.\n this.errorHandler.handleError(error);\n } finally {\n this.loading = false;\n }\n },\n error: () => {\n this.loading = false;\n },\n });\n }\n\n /**\n * Repaints the checkbox column for the page that just landed. Split out of the subscriber so\n * the try/finally that guarantees the pending flag wraps an await, not fifty lines of\n * selection algebra.\n */\n private async reconcileSelectionForLoadedPage(\n selectedIds: Promise<LazyLoadSelectedIdsResult | Error> | null,\n ): Promise<void> {\n if (selectedIds == null) {\n if (this.deleteListFromTableObservableMethod) {\n this.fakeSelectedItems = this.items\n .map((x) => x[this.idField])\n .filter((id) => this.newlySelectedItems.includes(id));\n }\n return;\n }\n\n const selectedRowsMethodResult = await selectedIds;\n if (selectedRowsMethodResult instanceof Error) throw selectedRowsMethodResult;\n\n this.currentPageSelectedItemsFromDb = [\n ...selectedRowsMethodResult.selectedIds,\n ];\n\n if (this.isFirstTimeLazyLoad == true) {\n this.rowsSelectedNumber = selectedRowsMethodResult.totalRecordsSelected;\n this.setFakeIsAllSelected();\n this.isFirstTimeLazyLoad = false;\n }\n\n if (this.isAllSelected == true) {\n let idsToInsert = [...this.items.map((x) => x[this.idField])];\n idsToInsert = idsToInsert.filter(\n (x) => this.unselectedItems.includes(x) == false,\n );\n this.fakeSelectedItems = [...idsToInsert]; // Only for showing checkboxes, we will not send this to the backend\n } else if (this.isAllSelected == false) {\n this.fakeSelectedItems = [...this.newlySelectedItems]; // Only for showing checkboxes, we will not send this to the backend\n } else if (this.isAllSelected == null) {\n let idsToInsert = [\n ...selectedRowsMethodResult.selectedIds,\n ...this.newlySelectedItems,\n ];\n idsToInsert = idsToInsert.filter(\n (x) => this.unselectedItems.includes(x) == false,\n );\n this.fakeSelectedItems = [...idsToInsert];\n }\n }\n\n clientLoad() {\n this.loading = false;\n\n this.loadFormArrayItems();\n this.totalRecords = this.items.length;\n this.onTotalRecordsChange.next(this.items.length);\n\n if (this.getAlreadySelectedItemIds) {\n this.selectedItemIds = this.getAlreadySelectedItemIds(\n this.additionalIndexes,\n );\n }\n if (this.getAlreadySelectedItems) {\n this.selectedItems = this.getAlreadySelectedItems(this.additionalIndexes);\n }\n this.rowsSelectedNumber = this.selectedItemIds.length;\n this.setFakeIsAllSelected();\n }\n\n private loadFormArrayItems() {\n this.items = this.getFormArrayItems(this.additionalIndexes);\n this.rangeAnchorId = null;\n this.items.forEach((item, index) => {\n item.index = index;\n });\n }\n\n /**\n * Single source for whether a column header offers click-to-sort (drives both\n * `pSortableColumnDisabled` and the sort icon). Beyond the consumer's explicit `sortable: false`,\n * `*CommaSeparated` fields are auto-disabled: the backend's `PaginatedResultGenerator` never emits\n * a sort case for collection columns (the same naming convention decides both), and since unknown\n * sort fields are rejected with a 400, a clickable header here would be a guaranteed error toast.\n */\n isColumnSortable(col: Column): boolean {\n return (\n col.sortable !== false &&\n !!col.field &&\n !col.field.endsWith('CommaSeparated')\n );\n }\n\n /** The column the header menu is currently open for, and its header cell. */\n menuColumn: Column | null = null;\n\n private menuHeaderCell: HTMLElement | null = null;\n\n private draggedColumn: Column | null = null;\n\n /** False while a gesture that began on the menu chevron or the resize grip is in flight. */\n private headerDragArmed = true;\n\n /**\n * A ViewChild rather than a template reference passed in from the header. The popover lives in\n * the CAPTION template and the button that opens it in the HEADER one, and a reference variable\n * does not cross an ng-template boundary — it arrived as undefined, and the click did nothing\n * at all.\n */\n private readonly columnMenu = viewChild.required<Popover>('columnMenu');\n\n private readonly filterBar = viewChild(SpiderlyFilterBarComponent);\n\n /**\n * Consumer-projected filter controls, forwarded to the bar. Collected here rather than by the\n * bar itself because the bar is OURS: a consumer's template is projected at the table, and\n * content queries only see what was projected into the component that declares them.\n */\n @ContentChildren(SpiderlyFilterTemplateDirective)\n filterTemplates: QueryList<SpiderlyFilterTemplateDirective>;\n\n private readonly selectionHeader =\n viewChild<ElementRef<HTMLElement>>('selectionHeader');\n\n openColumnMenu(col: Column, event: Event): void {\n this.menuColumn = col;\n // Kept so `fitMenuColumn` can find the column's cells: it needs the header's position among\n // its siblings, which is the only thing that ties a Column to a table column in the DOM.\n this.menuHeaderCell = (event.target as HTMLElement).closest('th');\n this.columnMenu().toggle(event);\n }\n\n /**\n * Switches to a view. Clears first, always: a view is a STATE rather than an addition, and two\n * of them composed produce a question nobody asked. The clear runs through the store directly\n * rather than through `clear()`, whose requery effect would spend a fetch before the entering\n * view's filters are in place.\n */\n selectView(view: TableView): void {\n this.activeViewId = view.id;\n // Always writes — including the first view, so a deliberate \"Sve\" during a deploy race\n // sticks, and so an explicit pick beats a stored id whose view has not arrived yet\n // (`adoptStoredView` compares against this key).\n this.persistActiveView();\n\n // The keys just changed under us, so the layout has to be re-read for the view being entered\n // — otherwise the one being left keeps rendering until something else forces a reload.\n this.restoreColumnVisibility();\n this.restoreColumnLayout();\n this.refreshVisibleCols();\n\n // Sort is view state too (decision 10's sort half). Swapped BEFORE the filter transition so\n // the one request the requery effect sends carries both.\n const sortChanged = this.applyViewSort();\n\n if (!this.filters) {\n if (sortChanged) this.table.sortMultiple();\n return;\n }\n\n const appliedBefore = this.filters.applied();\n\n // The filter key moved with the view too; `enterViewFilters` holds the stored-wins and\n // transient rules.\n this.filters.clear();\n this.enterViewFilters(view, 'click');\n\n // The requery effect runs only when the applied set actually changed — `clear()` on an\n // already-empty store writes nothing (two views sharing one filter answer are exactly that)\n // — so a sort-only switch fetches here. `applied` is a computed: reference equality across\n // the transition means none of its sources moved.\n if (sortChanged && this.filters.applied() === appliedBefore) {\n this.refetchFromFirstPage();\n }\n }\n\n /**\n * The filter this column stands for. Defaults to the column's own `field`, because a store id\n * IS a backend property name — `toFilterPayload` emits it straight into `Filter.filters`. So\n * `filterId` is an escape hatch for the rare mismatch, not something every column restates:\n * all eight of the first migrated table's declarations were the field name written a second\n * time.\n */\n private filterIdFor(col: Column): string | undefined {\n return col.filterId ?? col.field;\n }\n\n /**\n * Asks the STORE, not the column. Checking only that an id was declared let a typo through to\n * `store.get(id)`, which reads `definitions[id].label` — so a mistyped id threw on click rather\n * than greying the item out. With 195 declarations to migrate, that is the failure mode worth\n * closing here rather than in each consumer.\n */\n canFilterColumn(col: Column): boolean {\n const id = this.filterIdFor(col);\n\n return id != null && this.filters?.definitions[id] != null;\n }\n\n /**\n * Opens the bar's editor for this column's filter. The bar took the filter off the header and\n * the header is still where an operator reaches for it, which is twenty-seven tables' worth of\n * habit; this is the shortcut back rather than a second filter surface — it drives the same\n * editor, on the same bar, that `+ Filter` opens.\n */\n filterMenuColumn(): void {\n const col = this.menuColumn;\n this.columnMenu().hide();\n if (!col || !this.canFilterColumn(col)) return;\n\n this.filterBar()?.startEditing(this.filterIdFor(col)!);\n }\n\n /**\n * Sorts by this column in the NAMED direction. Clicking a header cycles asc, desc and off,\n * which is fine for one column and a guess for a direction someone wants now — you click, look,\n * and click again if it went the other way. This is also the only sort path that works from a\n * keyboard.\n *\n * A column the generated paginator has no sort case for answers every load with a 400, so the\n * items are disabled by the same predicate that keeps its header from being clickable.\n */\n sortMenuColumn(order: 1 | -1): void {\n const col = this.menuColumn;\n this.columnMenu().hide();\n if (!col?.field || !this.isColumnSortable(col)) return;\n\n this.applySort([{ field: col.field, order }]);\n }\n\n /**\n * Sizes the column to the widest thing in it. The cheaper escape from a cramped column: no\n * drag, no aim. Unlike a drag it does NOT trade with the neighbour — a minimum that grew is\n * exactly the case decision 4 lets push the table past its container and start scrolling.\n *\n * Measures the CELL CONTENT, not the cell: the clamp lives on the inner span, so a `td` reports\n * a scrollWidth that fits while the text inside it does not.\n */\n fitMenuColumn(): void {\n const col = this.menuColumn;\n const th = this.menuHeaderCell;\n this.columnMenu().hide();\n if (!col?.field || !th?.parentElement) return;\n\n // Walked up from the header rather than reached through PrimeNG's own ElementRef: the th is\n // the only thing that ties a Column to a table column in the DOM, and it already knows which\n // table it is in.\n const index = Array.from(th.parentElement.children).indexOf(th) + 1;\n const cells = th\n .closest('table')\n ?.querySelectorAll<HTMLElement>(`tbody tr > td:nth-child(${index})`);\n if (!cells?.length) return;\n\n // Padding comes from one CSS rule for every cell in the column, so it is read once off the\n // first — a getComputedStyle per cell was a hundred style flushes for one number.\n const styles = getComputedStyle(cells[0]);\n const padding =\n (parseFloat(styles.paddingLeft) || 0) +\n (parseFloat(styles.paddingRight) || 0);\n\n // Cells AND their descendants in one query rather than one per cell: the clamp lives on an\n // inner span, so a td reports a scrollWidth that fits while the text inside it does not, and\n // a consumer's cell template can nest the overflowing element arbitrarily deep.\n const content = th\n .closest('table')!\n .querySelectorAll<HTMLElement>(\n `tbody tr > td:nth-child(${index}), tbody tr > td:nth-child(${index}) *`,\n );\n\n let widest = th.scrollWidth;\n for (const node of Array.from(content)) {\n widest = Math.max(widest, node.scrollWidth + padding);\n }\n this.columnWidths[col.field] = this.shareThatFits(col, th, widest);\n this.persistColumnLayout();\n }\n\n /**\n * The share that actually yields `needed` pixels — not `needed` scaled by the column's current\n * px-per-share, which is the obvious answer and the wrong one. Shares are a PROPORTION of\n * whatever width the table has, so growing this column's share also shrinks the realized width\n * of every other column, and the naive figure lands short. The spec caught it as a cell that\n * was still clipped after being told to fit.\n *\n * While the columns fit, the table keeps the container's width and the proportion has to solve\n * needed / tableWidth = newShare / (otherShares + newShare)\n * with `otherShares` recovered from what this column currently renders at. Once `needed` is the\n * whole container the proportional regime has no answer: the table is about to overrun its\n * container and scroll (decision 4), and there a share IS its own length, so the pixels convert\n * straight through the root font size.\n */\n private shareThatFits(col: Column, th: HTMLElement, needed: number): number {\n const share = this.columnShare(col);\n const thPx = Math.max(th.offsetWidth, 1);\n const tableWidth = (th.closest('table') as HTMLElement | null)?.offsetWidth ?? 0;\n\n if (needed < tableWidth) {\n const otherShares = (share * (tableWidth - thPx)) / thPx;\n\n return (needed * otherShares) / (tableWidth - needed);\n }\n\n return needed / rootFontSizePx();\n }\n\n hideMenuColumn(): void {\n if (this.menuColumn) this.toggleColumn(this.menuColumn, false);\n this.columnMenu().hide();\n }\n\n /**\n * Whether this column's cells give up the one-line clamp. The DEFAULT stays clamped\n * (CLAUDE.md -> \"Operator-owned view\", decision 9); what changes is that the operator picks\n * which column pays the row height, not whoever wrote `cols`.\n *\n * Lands on the td as `.cell-wrap`, whose inherited `--spiderly-cell-*` properties are how the\n * toggle crosses into a projected `spiderlyCellTemplate` too — the contract's one telling is\n * on that SCSS rule; a consumer clamp that hard-codes its values opts out.\n */\n isColumnWrapped(col: Column): boolean {\n return col.field != null && this.columnWrap[col.field] === true;\n }\n\n get isMenuColumnWrapped(): boolean {\n return this.menuColumn != null && this.isColumnWrapped(this.menuColumn);\n }\n\n toggleWrapForMenuColumn(): void {\n const col = this.menuColumn;\n this.columnMenu().hide();\n if (!col?.field) return;\n\n if (this.columnWrap[col.field]) delete this.columnWrap[col.field];\n else this.columnWrap[col.field] = true;\n\n this.persistColumnLayout();\n }\n\n /** Exposed for the template: actions columns carry no field and get no menu. */\n isDataColumn(col: Column): boolean {\n return SpiderlyDataTableComponent.isDataColumn(col);\n }\n\n /**\n * What the grid is ordered by, resolved to COLUMN NAMES for the bar. Read off PrimeNG's live\n * meta rather than mirrored into a field, so it cannot fall out of step with the sort the table\n * is actually applying. A field with no column left (hidden, or removed in a later release)\n * falls back to its own name rather than vanishing from the list.\n */\n /**\n * What the grid is ordered by, resolved to COLUMN NAMES for the bar.\n *\n * A field refreshed per fetch, not a getter: it is bound to the bar's `sort`, which is a SIGNAL\n * input, so a freshly mapped array failed `Object.is` on every change-detection pass and marked\n * the bar's consumers dirty forever — for a value that changes once per request. Same reason\n * `tableStyle` is a field.\n */\n sortKeys: SortKeyLabel[] = [];\n\n /**\n * Read off the last REQUEST's sort, not `table._multiSortMeta`. On a first load with a declared\n * default that field is still null: `applyDefaultSortIfUnsorted` writes the default onto the\n * lazy-load event, and PrimeNG fills its own meta only once someone clicks a header. Reading the\n * table there showed no sort on exactly the tables that always have one. A field with no column\n * left falls back to its own name rather than vanishing.\n */\n private refreshSortKeys(): void {\n const meta = this.lastLazyLoadEvent?.multiSortMeta ?? [];\n\n this.sortKeys = meta.map((key) => ({\n field: key.field,\n // A sort may name a field no column declares (keepSortableMeta allows it), and its chip\n // must still speak the operator's language: the same PascalCase-key convention the\n // scaffold seeds resolves it (Transloco falls back to the key, so worst case reads\n // \"CreatedAt\", never the raw camelCase identifier).\n label:\n this.cols.find((col) => col.field === key.field)?.name ??\n this.translocoService.translate(firstCharToUpper(key.field)),\n descending: key.order === -1,\n }));\n this.sortIsDefault = sortMetaEquals(meta, this.defaultMultiSortMeta() ?? []);\n }\n\n /**\n * Gates the picker's reset row. Refreshed with `sortKeys` — same request, same reason it is a\n * field rather than a getter. \"Default\" is view-aware (`defaultMultiSortMeta`), so inside a\n * view the row offers the view's ordering back, not the table's.\n */\n sortIsDefault = true;\n\n /**\n * What the bar's picker offers: every sortable data column, hidden ones INCLUDED — the picker\n * exists so an ordering does not need its column on screen. Built once in `ngOnInit` (columns\n * are a declaration, not state) and labelled here because the bar knows nothing about columns.\n */\n sortPickOptions: SortPickOption[] = [];\n\n /**\n * The one body of an explicit sort GESTURE — the thing `persistActiveViewSort`'s doc calls\n * \"explicit gestures only\": page one, meta on the grid, fetch, save, selection anchor\n * invalidated, override recorded. Shared by the header's single-click un-sort, the header\n * menu and both bar entry points; `broadcastSort` is its deliberate no-fetch sibling. The\n * page reset, `saveState` and anchor line mirror PrimeNG's own `sort()` (`sortMultiple()`\n * does none of the three); the \"lands on page one\" / \"survives a reload\" specs pin why.\n */\n private applySort(meta: SortMeta[]): void {\n if (this.table.resetPageOnSort) {\n this.table._first = 0;\n this.table.firstChange.emit(0);\n }\n\n this.table._multiSortMeta = meta;\n this.table.sortMultiple();\n\n if (this.table.isStateful()) this.table.saveState();\n this.table.anchorRowIndex = null;\n this.persistActiveViewSort();\n }\n\n /** The picker's ask: one sort, replacing the whole meta — the same contract as the header menu. */\n sortFromBar(pick: SortMeta): void {\n this.applySort([pick]);\n }\n\n /**\n * Back to the resolved default — the view's declared sort, else the table default, else\n * unsorted. Persisting right after is what empties the override slot: a sort equal to the\n * default is stored as absence, so the declared ordering flows through again.\n */\n resetSortFromBar(): void {\n this.applySort(this.defaultMultiSortMeta() ?? []);\n }\n\n /** This column's share, override first, then its declared width, then the per-type default. */\n columnShare(col: Column): number {\n if (col.field && this.columnWidths[col.field] != null) {\n return this.columnWidths[col.field];\n }\n\n if (col.width != null) return this.shareOfDeclaredWidth(col);\n\n return this.defaultShare(col);\n }\n\n /**\n * A declared width expressed in SHARE units. rem IS the share unit and px converts; any other\n * unit falls back to the per-type default rather than being read as a bare number.\n *\n * `parseFloat` alone shipped here first, so `width: '150px'` resolved to share 150 against\n * neighbours at 12 — one column eating the grid on the first drag or fit. Every declared width\n * in the consumer happens to be rem today, which is exactly why nothing would have caught it.\n */\n private shareOfDeclaredWidth(col: Column): number {\n const declared = col.width!.trim();\n const value = parseFloat(declared);\n\n if (Number.isNaN(value)) return this.defaultShare(col);\n if (declared.endsWith('rem')) return value;\n if (declared.endsWith('px')) return value / rootFontSizePx();\n\n return this.defaultShare(col);\n }\n\n private defaultShare(col: Column): number {\n if (col.filterType) return DEFAULT_COLUMN_WIDTH_REM[col.filterType];\n\n // What is left declares no filterType: an actions column. It cannot shrink to fit any more,\n // so the icons need a reservation — each sits in a flex row whose gap is set beside them in\n // the template, inside the cell's own padding. 2.5, not 2.2, so the arithmetic stays exact in\n // binary and the string never reads `8.6000000001rem`.\n return 2 + (col.actions?.length ?? 0) * 2.5;\n }\n\n /**\n * Trades share between the column being dragged and the one on its right, so the table keeps\n * its total: widening a column never starts a horizontal scroll by itself, which only happens\n * once the SUM of the minimums stops fitting. The px delta is converted through the column's\n * own rendered width, which is the only place the share-to-pixel scale is actually known.\n */\n startColumnResize(col: Column, event: MouseEvent, th: HTMLElement): void {\n event.preventDefault();\n event.stopPropagation();\n\n const neighbour = this.visibleCols[this.visibleCols.indexOf(col) + 1];\n if (!col.field || !neighbour?.field) return;\n\n const controller = new AbortController();\n this.resizeAbort?.abort();\n this.resizeAbort = controller;\n\n const startX = event.clientX;\n const startShare = this.columnShare(col);\n const neighbourShare = this.columnShare(neighbour);\n const sharePerPx = startShare / Math.max(th.offsetWidth, 1);\n // A column that reaches zero share disappears with no way back from the header it lost.\n const floor = 2;\n\n const neighbourCell = th.nextElementSibling as HTMLElement | null;\n let applied = 0;\n\n const onMove = (move: MouseEvent) => {\n const delta = (move.clientX - startX) * sharePerPx;\n applied = Math.max(\n Math.min(delta, neighbourShare - floor),\n floor - startShare,\n );\n\n // The preview is written straight to the two header cells. Under the fixed layout their\n // widths are what lay the grid out, so this IS the live drag — and it costs no change\n // detection, where routing it through `columnWidths` ran a full-grid pass per mouse move\n // (~60/sec) to move two cells. The bindings overwrite these on the next pass anyway.\n th.style.width = `${startShare + applied}rem`;\n if (neighbourCell) {\n neighbourCell.style.width = `${neighbourShare - applied}rem`;\n }\n };\n\n const onUp = () => {\n controller.abort();\n this.resizeAbort = null;\n\n this.zone.run(() => {\n this.columnWidths[col.field!] = startShare + applied;\n this.columnWidths[neighbour.field!] = neighbourShare - applied;\n this.persistColumnLayout();\n });\n\n // Sorting hangs off CLICK, which stopPropagation on mousedown never touched — so every\n // resize also reordered the grid. Swallowing the click on the grip is not enough either:\n // on a drag that ends away from it, the click fires on their common ancestor, the th.\n // One capturing listener, once, on the document.\n const swallow = (click: MouseEvent) => {\n click.stopPropagation();\n click.preventDefault();\n };\n document.addEventListener('click', swallow, {\n capture: true,\n once: true,\n });\n // Removed on the next tick rather than left to `once`. The click that follows a mouseup\n // fires synchronously, so this always catches it — while a drag that ends with no click at\n // all (the pointer leaves the window, the operator navigates away) would otherwise leave a\n // listener sitting on the document to eat someone's next click entirely.\n setTimeout(() =>\n document.removeEventListener('click', swallow, { capture: true }),\n );\n };\n\n // One controller for the pair, aborted by `onUp` AND by ngOnDestroy. Left to `removeEventListener`\n // inside `onUp` alone, navigating away mid-drag stranded `mousemove` on the document — patched\n // by zone.js, so it ticked the app on every mouse move for the rest of the session, with its\n // closure pinning the dead component and the page of rows it captured.\n this.zone.runOutsideAngular(() => {\n document.addEventListener('mousemove', onMove, {\n signal: controller.signal,\n });\n document.addEventListener('mouseup', onUp, { signal: controller.signal });\n });\n }\n\n /**\n * The column's declared {@link Column.width}, or the default for its filter type.\n *\n * A width, not a minimum: under the fixed layout {@link tableStyle} establishes, this is what\n * the column is sized from, and the table shares its surplus in PROPORTION to these numbers.\n * Columns declaring none would otherwise take an equal share, which throws away what the\n * per-type defaults say — a boolean holds \"Da\"/\"Ne\", a text column holds a name.\n */\n getColWidth(col: Column): string {\n const override = col.field ? this.columnWidths[col.field] : undefined;\n if (override != null) return `${override}rem`;\n\n // A declared width passes through VERBATIM so a consumer keeps % and px; every other branch is\n // a share and renders in rem. Both halves resolve through `columnShare` otherwise, because\n // this chain and that one were written twice and had already drifted apart on the px case.\n if (col.width != null) return col.width;\n\n return `${this.defaultShare(col)}rem`;\n }\n\n /*\n * Navigate to details page based on rowId and rowNavigationPath.\n * If rowNavigationPath is provided, it will navigate to that path with the rowId.\n * If not, it will navigate to the current route with the rowId.\n */\n navigateToDetails(rowId: number): void {\n if (rowId == null) return;\n\n if (this.rowNavigationPath) {\n const cleanPath = this.rowNavigationPath.replace(/^\\/|\\/$/g, ''); // Remove leading and trailing slashes\n\n this.router.navigateByUrl(`/${cleanPath}/${rowId}`);\n } else {\n this.router.navigate([rowId], { relativeTo: this.route });\n }\n }\n\n /**\n * Handle row click event. Arbitration between \"this click navigates the row\" and \"this click\n * belongs to a control inside the row\" happens HERE, once, rather than in each interactive\n * surface: anything marked `.row-interactive` (the selection cell, the actions column, editable\n * cells, opted-in `onCellClick` cells) owns its own click and never navigates. Per-surface\n * `stopPropagation` used to be the mechanism and was structurally lossy — the actions column\n * never had one, so a Delete click opened the dialog AND navigated away. Mark new interactive\n * cells with the class; don't add another stop.\n */\n onRowClick(row: any, event: MouseEvent): void {\n if (!this.navigateOnRowClick) return;\n if ((event.target as HTMLElement)?.closest?.('.row-interactive')) return;\n\n this.navigateToDetails(row?.[this.idField]);\n }\n\n /*\n * Handle a cell click. Only columns that opt in (have an `onCellClick` callback) react; for them\n * we stop propagation so the click does not also trigger row navigation, then invoke the consumer\n * callback with a fully-populated CellClickEvent. Inert cells fall through to onRowClick unchanged.\n */\n onCellClick(col: Column, rowData: any, event: MouseEvent): void {\n if (!col.onCellClick) return;\n event.stopPropagation();\n col.onCellClick({\n ...this.buildClickEvent(rowData, event),\n field: col.field,\n value: rowData[col.field],\n displayValue: this.getRowData(rowData, col),\n });\n }\n\n /*\n * Build the base click payload shared by custom action clicks and cell clicks. The clicked element\n * is captured here, not read later from `originalEvent.currentTarget` (which nulls after dispatch).\n */\n private buildClickEvent(rowData: any, event: MouseEvent): ActionClickEvent {\n return {\n id: rowData[this.idField],\n row: rowData,\n element: event.currentTarget as HTMLElement,\n originalEvent: event,\n };\n }\n\n deleteObject(rowId: number) {\n this.openDeleteConfirmation(\n {\n deleteItemFromTableObservableMethod:\n this.deleteItemFromTableObservableMethod,\n id: rowId,\n message: this.translocoService.translate('PleaseConfirmToProceed'),\n },\n 'SuccessfullyDeletedMessage',\n );\n }\n\n deleteSelectedObjects() {\n const selectedIds = [...this.newlySelectedItems];\n\n if (selectedIds.length === 0) return;\n\n this.openDeleteConfirmation(\n {\n deleteListFromTableObservableMethod:\n this.deleteListFromTableObservableMethod,\n ids: selectedIds,\n message: this.translocoService.translate('DeleteBulkConfirmation', {\n count: selectedIds.length,\n }),\n },\n 'SuccessfullyDeletedListMessage',\n () => this.resetSelection(),\n );\n }\n\n private openDeleteConfirmation(\n data: DeleteConfirmationData,\n successMessageKey: string,\n onSuccess?: () => void,\n ) {\n this.deleteRef = this.dialogService.open(\n SpiderlyDeleteConfirmationComponent,\n {\n header: this.translocoService.translate('AreYouSure'),\n width: '400px',\n data,\n },\n );\n\n this.deleteRef.onClose\n .pipe(takeUntil(this.destroy$))\n .subscribe((deletedSuccessfully: boolean) => {\n if (deletedSuccessfully === true) {\n this.messageService.successMessage(\n this.translocoService.translate(successMessageKey),\n );\n onSuccess?.();\n this.reload();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n this.selectionWidthObserver?.disconnect();\n this.resizeAbort?.abort();\n }\n\n get showSelectAllCheckbox(): boolean {\n return (\n this.selectionMode === 'multiple' &&\n this.selectedLazyLoadObservableMethod != null\n );\n }\n\n private resetSelection() {\n this.newlySelectedItems.length = 0;\n this.unselectedItems.length = 0;\n this.fakeSelectedItems = [];\n this.rowsSelectedNumber = 0;\n this.isAllSelected = null;\n this.fakeIsAllSelected = false;\n }\n\n /**\n * A COMMITTED filter re-queries; a draft does not. Re-fetching per keystroke would be the same\n * lie the chip bar exists to prevent, only paid for in requests rather than in credibility.\n *\n * Back to page one first, and off FRESH metadata rather than `reload()`: that one replays the\n * cached lazy-load event, whose `first` was copied when the event was built, so a filter applied\n * from page 3 would keep asking the server to skip 50 rows a narrower result set does not have.\n * The grid comes back empty for a value that is definitely in it.\n *\n * The first run is PrimeNG's: it fires the initial lazy load itself, and re-querying here would\n * make every table load twice.\n */\n private requeryOnAppliedFilters(): void {\n let isFirstRun = true;\n\n effect(\n () => {\n this.filters!.applied();\n\n if (isFirstRun) {\n isFirstRun = false;\n return;\n }\n\n this.persistAppliedFilters();\n this.refetchFromFirstPage();\n },\n { injector: this.injector },\n );\n }\n\n /**\n * Back to page one, state saved, one fetch off FRESH metadata — the shared tail of the\n * requery effect and `selectView`'s sort-only switch. The save is load-bearing: PrimeNG\n * saves state only from its own interactions, so without it the pre-change page offset\n * survives in storage and the NEXT visit replays it against a narrowed result set — the\n * backend answers data=[] for an offset the filtered total no longer reaches, and the grid\n * renders empty under chips claiming matches.\n */\n private refetchFromFirstPage(): void {\n this.table.first = 0;\n this.table.firstChange.emit(0);\n if (this.table.isStateful()) this.table.saveState();\n this.lazyLoad(this.table.createLazyLoadMetadata());\n }\n\n reload() {\n // Nothing to replay before the table's own initial load, which is already on its way.\n if (this.lastLazyLoadEvent == null) return;\n\n // Not special: same refetch as a page flip, so lazyLoad owns both the flag and `items`.\n this.lazyLoad(this.lastLazyLoadEvent);\n }\n\n showActions(): boolean {\n return this.cols.some((x) => x.actions?.length > 0);\n }\n\n getStyleForBodyColumn(col: Column<any>) {\n switch (col.filterType) {\n case 'numeric':\n return 'text-align: right;';\n default:\n return null;\n }\n }\n\n getClassForAction(action: Action): string {\n switch (action.field) {\n case 'Details':\n return 'pi pi-pencil';\n case 'Delete':\n return 'pi pi-trash';\n default:\n return `${action.icon} ${action.styleClass}`;\n }\n }\n\n getStyleForAction(action: Action): string {\n switch (action.field) {\n case 'Delete':\n return 'cursor: pointer; color: var(--p-button-danger-background);';\n default:\n return `cursor: pointer; ${action.style}`;\n }\n }\n\n getMethodForAction(action: Action, rowData: any, event: MouseEvent) {\n switch (action.field) {\n case 'Details':\n return this.navigateToDetails(rowData[this.idField]);\n case 'Delete':\n return this.deleteObject(rowData[this.idField]);\n default:\n return action.onClick(this.buildClickEvent(rowData, event));\n }\n }\n\n getRowData(rowData: any, col: Column): string {\n switch (col.filterType) {\n case 'text':\n return rowData[col.field];\n case 'date':\n if (rowData[col.field] == null) return null;\n\n if (col.showTime)\n return formatDate(rowData[col.field], 'short', this.locale);\n\n const raw = rowData[col.field];\n const local = typeof raw === 'string' ? parseDateOnlyLocal(raw) : null;\n return formatDate(local ?? raw, 'shortDate', this.locale);\n case 'multiselect': {\n // Translate through the column's own option list. Without this the cell shows the stored\n // value, so an enum column reads `1` instead of \"Info\", and an FK column reads the id.\n //\n // Match on `code`, not `value`: that is the property PrimengOption carries (see the note\n // on the class). The raw value is the fallback rather than an empty cell, because the\n // options are usually filled asynchronously after the first paint — blanking the column\n // until they land would be a worse regression than the number this replaces.\n const multiselectValue = rowData[col.field];\n if (multiselectValue == null) return null;\n\n const option = col.dropdownOrMultiselectValues?.find(\n (x) => x.code === multiselectValue,\n );\n return option?.label ?? multiselectValue;\n }\n case 'boolean':\n return rowData[col.field] == true\n ? this.translocoService.translate('Yes')\n : this.translocoService.translate('No');\n case 'numeric':\n if (rowData[col.field] == null) return null;\n return formatNumber(\n rowData[col.field],\n this.locale,\n col.decimalPlaces != null\n ? `1.${col.decimalPlaces}-${col.decimalPlaces}`\n : '1.0-2',\n );\n case 'blob':\n return getHtmlImgDisplayString64(rowData[col.field]);\n default:\n return null;\n }\n }\n\n colTrackByFn(index, item) {\n return item.field;\n }\n\n actionTrackByFn(index, item: Action) {\n return `${index}${item.field}`;\n }\n\n exportListToExcel() {\n let filter: Filter = this.lastLazyLoadEvent as unknown as Filter;\n filter.additionalFilterIdLong = this.additionalFilterIdLong;\n\n exportListToExcel(this.exportListToExcelObservableMethod, filter);\n }\n\n /**\n * Clears the FILTERS — and nothing else (2026-09-06, grilled). It used to also reach the\n * sort and PrimeNG's persisted state, which made \"Clear filters\" a reset the label never\n * claimed: sort is its own channel with its own affordances (the bar's picker, the header's\n * tri-state), mirroring Polaris, where onClearAll is wired to the Filters while\n * sortSelected never passes through it. The store's requery effect owns the refetch and the\n * persisted-snapshot update — the button only renders with chips on the bar, so the applied\n * set always changes — and dropping table.clear() also drops the second, unsequenced\n * request the 2026-09-05 review flagged on every Clear.\n */\n clear() {\n this.filters?.clear();\n }\n\n //#region Selection\n\n setFakeIsAllSelected() {\n if (this.rowsSelectedNumber == this.totalRecords)\n this.fakeIsAllSelected = true;\n else this.fakeIsAllSelected = false;\n }\n\n selectAll(checked: boolean) {\n this.unselectedItems.length = 0;\n this.newlySelectedItems.length = 0;\n\n if (checked == true) {\n this.isAllSelected = true;\n this.fakeIsAllSelected = true;\n this.onIsAllSelectedChange.next(\n new AllClickEvent({\n checked: true,\n additionalIndexes: this.additionalIndexes,\n }),\n );\n this.rowsSelectedNumber = this.totalRecords;\n this.fakeSelectedItems = [...this.items.map((x) => x[this.idField])];\n this.selectedItemIds = [...this.items.map((x) => x[this.idField])];\n } else {\n this.isAllSelected = false;\n this.fakeIsAllSelected = false;\n this.onIsAllSelectedChange.next(\n new AllClickEvent({\n checked: false,\n additionalIndexes: this.additionalIndexes,\n }),\n );\n this.rowsSelectedNumber = 0;\n this.fakeSelectedItems = [];\n this.selectedItemIds = [];\n }\n }\n\n /**\n * Captures the shift state for the checkbox change this press produces — id-paired so an\n * aborted press can never leak into a later toggle (see CLAUDE.md). Also stops shift+click\n * from extending the browser text selection, which starts at mousedown.\n */\n onSelectionCellMouseDown(event: MouseEvent, id: number) {\n // Arm only for a press on the checkbox itself: a press on the surrounding cell produces no\n // `change`, so arming there would strand the flag until some later toggle consumed it. The\n // text-selection preventDefault still covers the whole cell.\n if ((event.target as HTMLElement).closest('p-checkbox')) {\n this.pendingShift = { shiftKey: event.shiftKey, id };\n }\n if (event.shiftKey) event.preventDefault();\n }\n\n /**\n * The rows the user can currently see, in display order — PrimeNG's own answer, so it cannot\n * drift from what the table paints (it applies `filteredValue` and the paginator slice, and\n * caps lazy pages at `rows` even when the server overshoots). Resolving a range over raw\n * `items` would sweep filtered-out or off-page rows sitting between two visually adjacent\n * ones. An anchor outside this window misses and the shift-click degrades to a plain toggle.\n */\n private renderedRows(): any[] {\n return this.table?.dataToRender(null) ?? this.items;\n }\n\n selectRow(id: number, index: number) {\n const shiftRange =\n this.pendingShift?.id === id && this.pendingShift.shiftKey;\n this.pendingShift = null;\n\n // `null` is the no-anchor sentinel, so it must never resolve to a row: a client-side table\n // can hold unsaved rows whose idField is null, and findIndex would happily match one.\n if (shiftRange && this.rangeAnchorId != null && id != null) {\n const rendered = this.renderedRows();\n const indexOf = (rowId: number) =>\n rendered.findIndex((x) => x[this.idField] === rowId);\n const anchorIndex = indexOf(this.rangeAnchorId);\n const clickedIndex = indexOf(id);\n\n if (anchorIndex !== -1 && clickedIndex !== -1) {\n // The clicked checkbox's NEW state, applied to the whole range. Our model hasn't been\n // updated for this click yet, so the new state is the negation of what we hold.\n this.applyRange(\n rendered,\n anchorIndex,\n clickedIndex,\n !this.isRowSelected(id),\n );\n this.rangeAnchorId = id;\n return;\n }\n }\n\n this.toggleRow(id, index);\n this.rangeAnchorId = id;\n }\n\n /** Single-row toggle — the plain-click path. */\n private toggleRow(id: number, index: number) {\n if (this.isRowSelected(id)) {\n this.rowUnselect(id);\n this.onRowUnselect.next(\n new RowClickEvent({\n index: index,\n id: id,\n additionalIndexes: this.additionalIndexes,\n }),\n );\n } else {\n this.rowSelect(id);\n this.onRowSelect.next(\n new RowClickEvent({\n index: index,\n id: id,\n additionalIndexes: this.additionalIndexes,\n }),\n );\n }\n }\n\n /**\n * Applies `select` to every row between the two positions in `rows` (inclusive), skipping rows\n * already in the target state; each change goes through `toggleRow` so the delta model and\n * per-row events stay identical to manual clicks (see CLAUDE.md). The event payload keeps\n * `row.index` for parity with what the single-click template binding passes.\n */\n private applyRange(\n rows: any[],\n fromIndex: number,\n toIndex: number,\n select: boolean,\n ) {\n const start = Math.min(fromIndex, toIndex);\n const end = Math.max(fromIndex, toIndex);\n\n for (let i = start; i <= end; i++) {\n const rowId = rows[i][this.idField];\n if (this.isRowSelected(rowId) !== select) {\n this.toggleRow(rowId, rows[i].index);\n }\n }\n }\n\n isRowSelected(id: number) {\n if (this.hasLazyLoad) {\n return this.fakeSelectedItems.find((x) => x === id) != undefined;\n } else {\n return this.selectedItemIds.find((x) => x === id) != undefined;\n }\n }\n\n rowSelect(id: number) {\n if (\n this.isAllSelected == false ||\n this.currentPageSelectedItemsFromDb.includes(id) == false\n ) {\n this.newlySelectedItems.push(id);\n }\n\n if (this.hasLazyLoad) {\n this.fakeSelectedItems.push(id);\n } else {\n this.selectedItemIds.push(id);\n }\n\n this.rowsSelectedNumber++;\n\n const index = this.unselectedItems.indexOf(id);\n if (index !== -1) {\n this.unselectedItems.splice(index, 1); // Splice is mutating the array\n }\n\n this.setFakeIsAllSelected();\n }\n\n rowUnselect(id: number) {\n if (\n this.isAllSelected == true ||\n this.currentPageSelectedItemsFromDb.includes(id) == true\n ) {\n this.unselectedItems.push(id);\n }\n\n this.rowsSelectedNumber--;\n\n const index = this.newlySelectedItems.indexOf(id);\n const fakeIndex = this.fakeSelectedItems.indexOf(id);\n const nonLazyLoadIndex = this.selectedItemIds.indexOf(id);\n\n if (index !== -1) {\n this.newlySelectedItems.splice(index, 1); // Splice is mutating the array\n }\n if (fakeIndex !== -1) {\n this.fakeSelectedItems.splice(fakeIndex, 1); // Splice is mutating the array\n }\n if (nonLazyLoadIndex !== -1) {\n this.selectedItemIds.splice(nonLazyLoadIndex, 1); // Splice is mutating the array\n }\n\n this.setFakeIsAllSelected();\n }\n //#endregion\n\n //#region Client side table\n\n // Can do it with Id also, because we are never adding the new record in the table at the same page.\n getFormArrayControlByIndex(\n formControlName: string,\n index: number,\n ): SpiderlyFormControl {\n if (this.getFormControl) {\n return this.getFormControl(\n formControlName,\n index,\n this.additionalIndexes,\n );\n } else {\n return null;\n }\n }\n\n //#endregion\n}\n\nexport class Action {\n name?: string;\n field?: string;\n icon?: string;\n style?: string;\n styleClass?: string;\n /**\n * Fired when a custom action is clicked. Receives an {@link ActionClickEvent} with the\n * row id, the full row object, the clicked DOM element (use it to anchor an overlay/popover),\n * and the original `MouseEvent`.\n *\n * Only fires for custom actions — the built-in `field` values `'Details'` and `'Delete'`\n * are handled internally and never invoke `onClick`.\n */\n onClick?: (event: ActionClickEvent) => void;\n\n constructor({\n name,\n field,\n icon,\n style,\n styleClass,\n onClick,\n }: {\n name?: string;\n field?: string;\n icon?: string;\n style?: string;\n styleClass?: string;\n onClick?: (event: ActionClickEvent) => void;\n } = {}) {\n this.name = name;\n this.field = field;\n this.icon = icon;\n this.style = style;\n this.styleClass = styleClass;\n this.onClick = onClick;\n }\n}\n\n/**\n * A saved question. The bar lets an operator BUILD one; a view is the one they ask every morning,\n * asked in a click — and without them the whole column-and-filter rework is a pile of knobs\n * someone re-sets daily (CLAUDE.md -> \"Operator-owned view\", decision 10).\n *\n * Declared in consumer code, not stored per user: with a handful of operators and a handful of\n * fixed daily jobs, shared built-in views cover the work, while personal saved views would drift\n * into five variants of the same question. Personal LAYOUT choices still persist on top, per view.\n */\nexport interface TableView<TFilters = any> {\n id: string;\n label: string;\n /**\n * Sets the filters this view asks for. Receives the table's own store, so a consumer writes it\n * with the store's typing. Called on a CLEARED store: a view is a state, not an addition.\n */\n apply?: (filters: TFilters) => void;\n /**\n * A view whose `apply` is a function of NOW — \"Danas primljene\", \"this week\". Selecting it\n * always re-runs `apply` instead of restoring what an earlier visit stored: under the normal\n * stored-wins rule a relative-date view clicked yesterday would restore yesterday's date under\n * a tab claiming \"today\". Layout (columns, widths, wrap) still persists per view as usual —\n * transience is about the QUESTION, not the furniture.\n */\n transient?: boolean;\n /**\n * The view's declared ordering — for the view whose question includes one (\"oldest shipped\n * first\" IS the work list, not a reading preference). Entering the view applies it; the\n * tri-state un-sort and Clear filters return to it instead of the table default; an operator's\n * own sort overrides it, persisted per view on store tables (decision 10's sort half). A view\n * declaring none keeps whatever ordering the grid already has, exactly as before this field\n * existed.\n */\n sort?: SortMeta[];\n}\n\nexport class Column<T = any> {\n name?: string;\n field?: string & keyof T;\n /**\n * The column's VALUE SHAPE: it sizes the column (`getColWidth`), picks the cell rendering\n * (`getRowData`, the blob branch) and the numeric right-align. The name is a fossil of the\n * header-filter era — filtering lives in the store handed to `[filters]` — kept because\n * renaming it would be a 195-declaration migration for zero behavior.\n */\n filterType?: 'text' | 'date' | 'multiselect' | 'boolean' | 'numeric' | 'blob';\n /**\n * The id of the filter in the table's store that this column stands for, which is what the\n * header menu's `Filter…` opens. A LINK, not a declaration: the filter exists in the store\n * whether or not any column names it, and a column needs this only to offer the shortcut.\n *\n * Untyped against the store on purpose — a `Column<T>` knows its row type and nothing about\n * which store it will be rendered beside, so the compile-time key check lives where the store\n * is declared (`createFilterStore`), not here.\n */\n filterId?: string;\n /**\n * @deprecated Dead since the header-filter deletion: NOTHING reads it. It survives on the type\n * only so details-table cols emitted by an OLDER Spiderly.SourceGenerators (which wrote\n * `showMatchModes: true`) still compile against this library during a mixed-version window —\n * a consumer on published NuGet generators plus an npm-linked library build. Delete it once\n * every consumer regenerates with a generator from this release or later (spiderly#407).\n */\n showMatchModes?: boolean;\n /**\n * @deprecated The same version-skew bridge as {@link showMatchModes}, and nothing else: older\n * generators emit `filterField: 'xxxId'` for every dropdown-typed details-table column, so\n * deleting it breaks the mixed window the moment a consumer adds one. NOTHING reads it —\n * filter ids live in the store, linked from a column via {@link filterId}. Delete with\n * `showMatchModes` (spiderly#407).\n */\n filterField?: string & keyof T;\n dropdownOrMultiselectValues?: PrimengOption[];\n actions?: Action[];\n editable?: boolean;\n showTime?: boolean;\n decimalPlaces?: number;\n sortable?: boolean;\n /**\n * Whether the column is initially rendered. Defaults to `true`. Declare `visible: false` for\n * columns that should be available in the column chooser but hidden until the user reveals them.\n */\n visible?: boolean;\n /**\n * Pins the column: it always renders and shows in the chooser as checked and disabled.\n * Use for the row's identifying column (e.g. a product's title) so the table can never\n * lose its anchor.\n */\n lockVisible?: boolean;\n /**\n * CSS length fixing this column's width (e.g. `'8rem'`). Overrides the per-type default,\n * which is generous for a column of short values.\n *\n * Declare a width on the columns that must stay NARROW and leave the flexible one undeclared:\n * the table distributes its surplus in proportion to the declared widths, so a column carrying\n * the long values wants the larger number, not a cap.\n */\n width?: string;\n /**\n * Fired when this column's cell is clicked. Receives a {@link CellClickEvent} with the row id,\n * the column field, the full row, the raw and formatted cell value, the clicked `<td>` element\n * (use it to anchor an overlay/popover), and the original `MouseEvent`.\n *\n * Setting this makes the cell visibly clickable (cursor + hover) and the click no longer bubbles\n * up to row navigation. The mirror of {@link Action.onClick}, but for plain value cells.\n * Not applied to editable cells — those belong to their inline input.\n */\n onCellClick?: (event: CellClickEvent) => void;\n\n constructor({\n name,\n field,\n filterType,\n filterId,\n showMatchModes,\n filterField,\n dropdownOrMultiselectValues,\n actions,\n editable,\n showTime,\n decimalPlaces,\n sortable,\n visible,\n lockVisible,\n width,\n onCellClick,\n }: {\n name?: string;\n field?: string & keyof T;\n filterType?: 'text' | 'date' | 'multiselect' | 'boolean' | 'numeric' | 'blob';\n filterId?: string;\n showMatchModes?: boolean;\n filterField?: string & keyof T;\n dropdownOrMultiselectValues?: PrimengOption[];\n actions?: Action[];\n editable?: boolean;\n showTime?: boolean;\n decimalPlaces?: number;\n sortable?: boolean;\n visible?: boolean;\n lockVisible?: boolean;\n width?: string;\n onCellClick?: (event: CellClickEvent) => void;\n } = {}) {\n this.name = name;\n this.field = field;\n this.filterType = filterType;\n this.filterId = filterId;\n this.showMatchModes = showMatchModes;\n this.filterField = filterField;\n this.dropdownOrMultiselectValues = dropdownOrMultiselectValues;\n this.actions = actions;\n this.editable = editable;\n this.showTime = showTime;\n this.decimalPlaces = decimalPlaces;\n this.sortable = sortable;\n this.visible = visible;\n this.lockVisible = lockVisible;\n this.width = width;\n this.onCellClick = onCellClick;\n }\n}\n\n/**\n * Payload passed to {@link Action.onClick} when a custom row action is clicked.\n * Every field is populated by the data table, so consumers can rely on them being present.\n */\nexport interface ActionClickEvent {\n /** The clicked row's id (`row[idField]`). */\n id: number;\n /** The full row object the action belongs to. */\n row: any;\n /**\n * The clicked action element — pass it as the anchor when opening an overlay/popover.\n * Captured at click time on purpose: `originalEvent.currentTarget` is reset to null once\n * dispatch ends, so it would already be null inside an async handler.\n */\n element: HTMLElement;\n /** The original DOM click event. */\n originalEvent: MouseEvent;\n}\n\n/**\n * Payload passed to {@link Column.onCellClick} when a cell is clicked. A superset of\n * {@link ActionClickEvent} (same `id` / `row` / `element` / `originalEvent`) plus the cell's\n * column and value. Every field is populated by the data table.\n */\nexport interface CellClickEvent extends ActionClickEvent {\n /** The clicked column's `field`. */\n field: string;\n /** The cell's raw value (`row[field]`). */\n value: any;\n /** The formatted value shown in the cell (what the table renders via `getRowData`). */\n displayValue: string;\n}\n\nexport class RowClickEvent {\n index?: number;\n id?: number;\n additionalIndexes?: any;\n\n constructor({\n index,\n id,\n additionalIndexes,\n }: {\n index?: number;\n id?: number;\n additionalIndexes?: any;\n } = {}) {\n this.index = index;\n this.id = id;\n this.additionalIndexes = additionalIndexes;\n }\n}\n\nexport class AllClickEvent {\n checked?: boolean;\n additionalIndexes?: any;\n\n constructor({\n checked,\n additionalIndexes,\n }: {\n checked?: boolean;\n additionalIndexes?: any;\n } = {}) {\n this.checked = checked;\n this.additionalIndexes = additionalIndexes;\n }\n}\n","<ng-container *transloco=\"let t\">\n <div\n #tableContainer\n class=\"spiderly-table-container\"\n [attr.aria-busy]=\"isPending\"\n [ngClass]=\"{\n 'card responsive-card-padding overflow-auto': showCardWrapper\n }\"\n >\n <p-table\n #dt\n [value]=\"items\"\n [rows]=\"rows\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [rowHover]=\"true\"\n [paginator]=\"showPaginator\"\n responsiveLayout=\"scroll\"\n [lazy]=\"hasLazyLoad\"\n (onLazyLoad)=\"lazyLoad($event)\"\n (onPage)=\"onPageChange(tableContainer)\"\n [totalRecords]=\"totalRecords\"\n class=\"spiderly-table\"\n [loading]=\"isPending\"\n [selectionMode]=\"selectionMode\"\n dataKey=\"id\"\n sortMode=\"multiple\"\n [multiSortMeta]=\"initialMultiSortMeta\"\n [stateKey]=\"resolvedStateKey\"\n [stateStorage]=\"stateStorage\"\n [tableStyle]=\"tableStyle\"\n >\n <ng-template pTemplate=\"caption\">\n <div class=\"table-header overflow-auto\">\n <div style=\"display: flex; align-items: center; gap: 8px\">\n <i class=\"{{ tableIcon }}\" style=\"font-size: 20px\"></i>\n <div style=\"margin: 0px; font-size: 17.5px\">{{ tableTitle }}</div>\n </div>\n <div style=\"display: flex; gap: 8px\">\n <ng-container\n *ngIf=\"actionsTemplate\"\n [ngTemplateOutlet]=\"actionsTemplate\"\n ></ng-container>\n <button\n pButton\n *ngIf=\"hasLazyLoad\"\n data-testid=\"column-chooser-button\"\n [label]=\"t('Columns')\"\n class=\"p-button-outlined\"\n style=\"flex: none\"\n icon=\"pi pi-sliders-h\"\n (click)=\"columnChooser.toggle($event)\"\n ></button>\n <button\n pButton\n *ngIf=\"showExportToExcelButton\"\n [label]=\"t('ExportToExcel')\"\n class=\"p-button-outlined\"\n style=\"flex: none\"\n icon=\"pi pi-download\"\n (click)=\"exportListToExcel()\"\n ></button>\n <button\n pButton\n *ngIf=\"showReloadTableButton\"\n [label]=\"t('Reload')\"\n class=\"p-button-outlined\"\n style=\"flex: none\"\n icon=\"pi pi-refresh\"\n (click)=\"reload()\"\n ></button>\n <button\n pButton\n *ngIf=\"deleteListFromTableObservableMethod && rowsSelectedNumber > 0\"\n [label]=\"t('DeleteSelected') + ' (' + rowsSelectedNumber + ')'\"\n class=\"p-button-danger\"\n style=\"flex: none\"\n icon=\"pi pi-trash\"\n (click)=\"deleteSelectedObjects()\"\n ></button>\n </div>\n </div>\n <!-- ONE menu for every column, with the target held in `menuColumn`. Rendering its items\n inside an @if keyed on the column would put them inside the popover's projected\n content, and PrimeNG does not re-project content an @if has destroyed — the filter\n bar's editor lost a whole afternoon to exactly that. -->\n <p-popover #columnMenu>\n <div class=\"column-menu\" role=\"menu\">\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"column-menu-item\"\n data-testid=\"column-menu-hide\"\n [disabled]=\"!menuColumn || !canToggleColumn(menuColumn)\"\n (click)=\"hideMenuColumn()\"\n >\n <i class=\"pi pi-eye-slash\"></i>\n <span class=\"column-menu-item-label\">{{ t('HideColumn') }}</span>\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"column-menu-item\"\n data-testid=\"column-menu-filter\"\n [disabled]=\"!menuColumn || !canFilterColumn(menuColumn)\"\n (click)=\"filterMenuColumn()\"\n >\n <i class=\"pi pi-filter\"></i>\n <span class=\"column-menu-item-label\">{{ t('Filter') }}…</span>\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"column-menu-item\"\n data-testid=\"column-menu-sort-asc\"\n [disabled]=\"!menuColumn || !isColumnSortable(menuColumn)\"\n (click)=\"sortMenuColumn(1)\"\n >\n <i class=\"pi pi-sort-amount-up-alt\"></i>\n <span class=\"column-menu-item-label\">{{ t('SortAscending') }}</span>\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"column-menu-item\"\n data-testid=\"column-menu-sort-desc\"\n [disabled]=\"!menuColumn || !isColumnSortable(menuColumn)\"\n (click)=\"sortMenuColumn(-1)\"\n >\n <i class=\"pi pi-sort-amount-down\"></i>\n <span class=\"column-menu-item-label\">{{ t('SortDescending') }}</span>\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"column-menu-item\"\n data-testid=\"column-menu-left\"\n [disabled]=\"!menuColumn || !canMoveColumn(menuColumn, -1)\"\n (click)=\"moveMenuColumn(-1)\"\n >\n <i class=\"pi pi-arrow-left\"></i>\n <span class=\"column-menu-item-label\">{{ t('MoveLeft') }}</span>\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"column-menu-item\"\n data-testid=\"column-menu-right\"\n [disabled]=\"!menuColumn || !canMoveColumn(menuColumn, 1)\"\n (click)=\"moveMenuColumn(1)\"\n >\n <i class=\"pi pi-arrow-right\"></i>\n <span class=\"column-menu-item-label\">{{ t('MoveRight') }}</span>\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"column-menu-item\"\n data-testid=\"column-menu-fit\"\n (click)=\"fitMenuColumn()\"\n >\n <i class=\"pi pi-arrows-h\"></i>\n <span class=\"column-menu-item-label\">{{ t('FitWidth') }}</span>\n </button>\n <!-- menuitemcheckbox, not menuitem: this one TOGGLES, and a label reading the same\n in both states leaves the operator to find out by clicking — which on a wide\n column means re-laying the grid out to learn what it was already set to. The\n check is the state; the label stays put, which is what the role is for.\n Disabled for an editable column: its cell holds an input, not clamped text, so\n the toggle could only persist a preference that changes nothing. -->\n <button\n type=\"button\"\n role=\"menuitemcheckbox\"\n class=\"column-menu-item\"\n data-testid=\"column-menu-wrap\"\n [disabled]=\"!menuColumn || menuColumn.editable === true\"\n [attr.aria-checked]=\"isMenuColumnWrapped\"\n (click)=\"toggleWrapForMenuColumn()\"\n >\n <i class=\"pi pi-align-left\"></i>\n <span class=\"column-menu-item-label\">{{ t('WrapText') }}</span>\n <i *ngIf=\"isMenuColumnWrapped\" class=\"pi pi-check\"></i>\n </button>\n </div>\n </p-popover>\n\n <div class=\"table-views\" *ngIf=\"views?.length\" role=\"tablist\">\n <button\n *ngFor=\"let view of views\"\n type=\"button\"\n role=\"tab\"\n class=\"table-view\"\n data-testid=\"table-view\"\n [class.table-view-active]=\"activeViewId === view.id\"\n [attr.aria-selected]=\"activeViewId === view.id\"\n (click)=\"selectView(view)\"\n >\n {{ view.label }}\n </button>\n </div>\n\n <spiderly-filter-bar\n *ngIf=\"filters\"\n [filters]=\"filters\"\n [totalRecords]=\"totalRecords\"\n [sort]=\"sortKeys\"\n [sortOptions]=\"sortPickOptions\"\n [sortIsDefault]=\"sortIsDefault\"\n [controlTemplates]=\"filterTemplates\"\n (clearAll)=\"clear()\"\n (sortPick)=\"sortFromBar($event)\"\n (sortReset)=\"resetSortFromBar()\"\n ></spiderly-filter-bar>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <!-- Sized for the checkbox plus the counter beside it, which shows `totalRecords` on a\n select-all and so reaches five digits on a large table. Not `0rem` (see CLAUDE.md →\n Column widths), and not routed through getColWidth: this column has no `Column`. -->\n <th\n #selectionHeader\n class=\"frozen-column\"\n [class.frozen-column-last]=\"isSelectionColumnLastFrozen\"\n [style.width]=\"selectionColumnWidth\"\n [style.left]=\"'0'\"\n *ngIf=\"selectionMode == 'multiple'\"\n >\n <div style=\"display: flex; gap: 8px\">\n <p-checkbox\n *ngIf=\"showSelectAllCheckbox\"\n [disabled]=\"readonly\"\n (onChange)=\"selectAll($event.checked)\"\n [(ngModel)]=\"fakeIsAllSelected\"\n [binary]=\"true\"\n ></p-checkbox>\n <span class=\"selection-count\">({{ rowsSelectedNumber }})</span>\n </div>\n </th>\n <ng-container *ngFor=\"let col of visibleCols; trackBy: colTrackByFn\">\n <th\n #headerCell\n [pSortableColumn]=\"col.field\"\n [pSortableColumnDisabled]=\"!isColumnSortable(col)\"\n [style.width]=\"getColWidth(col)\"\n [class.frozen-column]=\"isColumnFrozen(col)\"\n [class.frozen-column-last]=\"isLastFrozenColumn(col)\"\n [style.left]=\"isColumnFrozen(col) ? frozenColumnOffset() : null\"\n [attr.draggable]=\"hasLazyLoad && !col.lockVisible ? true : null\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (dragstart)=\"onHeaderDragStart(col, $event)\"\n (dragover)=\"onHeaderDragOver(col, $event)\"\n (drop)=\"onHeaderDrop(col, $event)\"\n >\n <!-- Ours, not PrimeNG's: enabling [resizableColumns] makes it persist widths by\n th:nth-child INDEX into our own stateKey, which slides every stored width onto\n the wrong column the first time the chooser hides one (CLAUDE.md -> decision\n 5). We take the gesture and keep the state. -->\n <span\n *ngIf=\"hasLazyLoad && isDataColumn(col)\"\n class=\"column-resizer\"\n data-testid=\"column-resizer\"\n (mousedown)=\"startColumnResize(col, $event, headerCell)\"\n ></span>\n <div\n style=\"\n display: flex;\n justify-content: space-between;\n align-items: center;\n \"\n >\n <span style=\"display: flex; align-items: center; gap: 4px\">\n {{ col.name }}\n <p-sortIcon\n *ngIf=\"isColumnSortable(col)\"\n [field]=\"col.field!\"\n ></p-sortIcon>\n <!-- stopPropagation is load-bearing: the th carries pSortableColumn, so a click\n that reaches it sorts the grid. Opening a menu must not reorder the table on\n the way. -->\n <button\n *ngIf=\"hasLazyLoad && isDataColumn(col)\"\n type=\"button\"\n class=\"column-menu-button\"\n data-testid=\"column-menu\"\n [attr.aria-label]=\"t('Columns')\"\n (click)=\"$event.stopPropagation(); openColumnMenu(col, $event)\"\n >\n <i class=\"pi pi-chevron-down\"></i>\n </button>\n </span>\n </div>\n </th>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template\n pTemplate=\"body\"\n let-rowData\n let-index=\"rowIndex\"\n let-editing=\"editing\"\n >\n <!-- The cell rendering every column gets unless it projects a spiderlyCellTemplate. Declared\n once here rather than inside the column loop, and fed the same context the projected\n template gets, so getRowData is evaluated exactly once per cell either way. -->\n <ng-template #defaultCell let-col=\"col\" let-displayValue=\"displayValue\">\n <ng-container *ngIf=\"col.filterType === 'blob'\">\n <img width=\"45\" [src]=\"displayValue\" alt=\"\" />\n </ng-container>\n <ng-container *ngIf=\"col.filterType !== 'blob'\">\n <span spiderlyOverflowTitle class=\"cell-text\">{{\n displayValue\n }}</span>\n </ng-container>\n </ng-template>\n <tr\n [class.clickable]=\"navigateOnRowClick\"\n (click)=\"onRowClick(rowData, $event)\"\n >\n <!-- row-interactive: a selection gesture must never double as row navigation (onRowClick). -->\n <td\n *ngIf=\"selectionMode == 'multiple'\"\n class=\"selection-cell row-interactive frozen-column\"\n [class.frozen-column-last]=\"isSelectionColumnLastFrozen\"\n [style.left]=\"'0'\"\n (mousedown)=\"onSelectionCellMouseDown($event, rowData[idField])\"\n >\n <p-checkbox\n [disabled]=\"readonly\"\n (onChange)=\"selectRow(rowData[idField], rowData.index)\"\n [ngModel]=\"isRowSelected(rowData[idField])\"\n [binary]=\"true\"\n ></p-checkbox>\n </td>\n <ng-container *ngFor=\"let col of visibleCols; trackBy: colTrackByFn\">\n <td\n [style]=\"getStyleForBodyColumn(col)\"\n [class.clickable]=\"col.onCellClick\"\n [class.row-interactive]=\"col.onCellClick\"\n [class.frozen-column]=\"isColumnFrozen(col)\"\n [class.frozen-column-last]=\"isLastFrozenColumn(col)\"\n [class.cell-wrap]=\"isColumnWrapped(col)\"\n [style.left]=\"isColumnFrozen(col) ? frozenColumnOffset() : null\"\n (click)=\"onCellClick(col, rowData, $event)\"\n *ngIf=\"!col.editable\"\n >\n <!-- getColWidth reserves this column's width from `actions.length`; this gap is\n the geometry it reserves for, so changing it belongs in the same edit. -->\n <div\n style=\"\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 18px;\n \"\n >\n <ng-container\n *ngFor=\"let action of col.actions; trackBy: actionTrackByFn\"\n >\n <span\n [pTooltip]=\"action.name\"\n [class]=\"getClassForAction(action) + ' row-interactive'\"\n [style]=\"getStyleForAction(action)\"\n (click)=\"getMethodForAction(action, rowData, $event)\"\n ></span>\n </ng-container>\n </div>\n <ng-container\n [ngTemplateOutlet]=\"getCellTemplate(col) ?? defaultCell\"\n [ngTemplateOutletContext]=\"{\n $implicit: rowData,\n value: rowData[col.field],\n displayValue: getRowData(rowData, col),\n col: col\n }\"\n ></ng-container>\n </td>\n <td\n *ngIf=\"col.editable\"\n class=\"row-interactive\"\n [class.frozen-column]=\"isColumnFrozen(col)\"\n [class.frozen-column-last]=\"isLastFrozenColumn(col)\"\n [style.left]=\"isColumnFrozen(col) ? frozenColumnOffset() : null\"\n >\n <spiderly-number\n [control]=\"getFormArrayControlByIndex(col.field, rowData.index)\"\n [showLabel]=\"false\"\n ></spiderly-number>\n </td>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td\n [attr.colspan]=\"\n visibleCols.length + (selectionMode === 'multiple' ? 1 : 0)\n \"\n >\n {{ t(\"NoRecordsFound\") }}\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"paginatorleft\">\n {{ t(\"TotalRecords\") }}: {{ totalRecords }}\n </ng-template>\n <ng-template pTemplate=\"paginatorright\">\n <div style=\"display: flex; justify-content: end; gap: 10px\">\n <spiderly-button\n *ngIf=\"showAddButton\"\n [label]=\"t('AddNew')\"\n icon=\"pi pi-plus\"\n (onClick)=\"navigateToDetails(0)\"\n ></spiderly-button>\n </div>\n </ng-template>\n </p-table>\n <p-popover #columnChooser>\n <div class=\"column-chooser\">\n <label\n *ngFor=\"let col of chooserCols; trackBy: colTrackByFn\"\n data-testid=\"column-chooser-option\"\n class=\"column-chooser-option\"\n >\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"isColumnVisible(col)\"\n [disabled]=\"!canToggleColumn(col)\"\n (onChange)=\"toggleColumn(col, $event.checked)\"\n ></p-checkbox>\n <span>{{ col.name }}</span>\n </label>\n <button\n type=\"button\"\n data-testid=\"column-chooser-reset\"\n class=\"column-chooser-reset\"\n (click)=\"resetColumnLayout()\"\n >\n {{ t('ResetToDefault') }}\n </button>\n </div>\n </p-popover>\n </div>\n</ng-container>\n","export enum MatchModeCodes {\n StartsWith = \"startsWith\",\n Contains = \"contains\",\n Equals = \"equals\",\n LessThan = \"lessThan\",\n GreaterThan = \"greaterThan\",\n In = \"in\",\n}\n","import { MatchModeCodes } from '../enums/match-mode-enum-codes';\n\n/**\n * What each value type may be asked — the ONE operator table, mirroring what the generated\n * paginator implements per type (`PaginatedResultGenerator`): `In` on a string column answers\n * with InvalidMatchMode, PrimeNG's own text list adds three modes the backend 400s, and so on.\n *\n * Deliberately a LEAF module (imports nothing but the codes) so every consumer can derive from\n * it without a cycle: the store's runtime validation and offered lists (`filter-store.ts`), the\n * compile-time `FilterRule.matchMode` union (`entities/filter-rule.ts`), and the data view's\n * kind-level lists (via `operatorOptionsForKind`). These used to be hand-kept copies; edit the\n * table here and every surface follows.\n *\n * Tuple order is DISPLAY order for every operator picker (Equals, then \"less/before\", then\n * \"more/after\" — the order the header dropdowns always shipped).\n */\nexport const ALLOWED_OPERATORS = {\n text: [\n MatchModeCodes.StartsWith,\n MatchModeCodes.Contains,\n MatchModeCodes.Equals,\n ],\n number: [\n MatchModeCodes.Equals,\n MatchModeCodes.LessThan,\n MatchModeCodes.GreaterThan,\n MatchModeCodes.In,\n ],\n boolean: [MatchModeCodes.Equals],\n date: [\n MatchModeCodes.Equals,\n MatchModeCodes.LessThan,\n MatchModeCodes.GreaterThan,\n ],\n} as const satisfies Record<string, readonly MatchModeCodes[]>;\n\nexport type FilterValueKind = keyof typeof ALLOWED_OPERATORS;\n\n/** The compile-time half of one kind's row, derived so it can never drift from the runtime half. */\nexport type AllowedOperatorFor<TKind extends FilterValueKind> =\n (typeof ALLOWED_OPERATORS)[TKind][number];\n","import { computed, signal, Signal } from '@angular/core';\n\nimport { FilterRule } from '../entities/filter-rule';\nimport { MatchModeCodes } from '../enums/match-mode-enum-codes';\nimport {\n ALLOWED_OPERATORS,\n AllowedOperatorFor,\n FilterValueKind,\n} from './allowed-operators';\n\n/** One tickable choice. `value` is the filter's own value type — an id, not a display string. */\nexport interface FilterOption {\n value: unknown;\n label: string;\n}\n\n/**\n * A filter declaration. It carries its VALUE type, never a UI control name — that separation is\n * the whole point: `multiselect` is a control, and it emits `In`, which `AllowedMatchModes` allows\n * on a number and forbids on a string. Conflating the two is what shipped `paymentGatewayCode` as\n * a text filter with a hand-written comment instead of a compile error.\n */\nexport interface FilterDefinition<TKind extends FilterValueKind = FilterValueKind> {\n kind: TKind;\n label: string;\n /**\n * Declaring options turns this filter into a pick-list, which means `In` — the same rule as the\n * table's `[filters]`, where the SHAPE of what is supplied decides, not a mode flag. It is also\n * the only way \"Processing OR PreparingForShipping\" can be expressed at all.\n */\n options?: FilterOption[];\n /** Offered-operator narrowing; semantics on `FilterConfig.operators`, the factories' door. */\n operators?: MatchModeCodes[];\n /** Whether \"+ Filter\" offers it; semantics on `FilterConfig.offered`, the factories' door. */\n offered?: boolean;\n}\n\n/**\n * Transloco keys for the operator a control offers. The keys are seeded in the init template's\n * en block (`NetAndAngularFilesGenerator.cs`), so one operator cannot be worded two ways in one\n * admin. The wording is per KIND on purpose: `LessThan` reads \"Less than\" for a number and\n * \"Dates before\" for a date.\n *\n * The operator TABLE itself lives in `allowed-operators.ts`, the one telling both consumers\n * derive from (this store's runtime lists, `FilterRule`'s compile-time union).\n */\ninterface OperatorWords {\n /** The picker's option label. */\n pickerKey: string;\n /**\n * The chip's inline phrase, which cannot reuse the picker key: those are capitalised option\n * labels and one of them is a plural noun, so a chip would read \"Datum Datumi pre 1.9.\" A chip\n * is a sentence — \"Firma sadrži Elektromont\" — and needs its own words.\n */\n phraseKey: string;\n}\n\nconst OPERATOR_WORDS: Record<\n FilterValueKind,\n Partial<Record<MatchModeCodes, OperatorWords>>\n> = {\n text: {\n [MatchModeCodes.StartsWith]: {\n pickerKey: 'StartsWith',\n phraseKey: 'FilterChipStartsWith',\n },\n [MatchModeCodes.Contains]: {\n pickerKey: 'Contains',\n phraseKey: 'FilterChipContains',\n },\n [MatchModeCodes.Equals]: {\n pickerKey: 'Equals',\n phraseKey: 'FilterChipEquals',\n },\n // No `In` for text: ALLOWED_OPERATORS.text does not carry it, so the entry was unreachable —\n // and it made `textFilter({ options })` look supported when the store throws on it.\n },\n number: {\n [MatchModeCodes.Equals]: {\n pickerKey: 'Equals',\n phraseKey: 'FilterChipEquals',\n },\n [MatchModeCodes.GreaterThan]: {\n pickerKey: 'MoreThan',\n phraseKey: 'FilterChipGreaterThan',\n },\n [MatchModeCodes.LessThan]: {\n pickerKey: 'LessThan',\n phraseKey: 'FilterChipLessThan',\n },\n // The picker never renders for a pick-list (one operator), but the CHIP always does.\n [MatchModeCodes.In]: { pickerKey: 'In', phraseKey: 'FilterChipIn' },\n },\n boolean: {\n [MatchModeCodes.Equals]: {\n pickerKey: 'Equals',\n phraseKey: 'FilterChipEquals',\n },\n },\n date: {\n [MatchModeCodes.Equals]: {\n pickerKey: 'OnDate',\n phraseKey: 'FilterChipEquals',\n },\n [MatchModeCodes.LessThan]: {\n pickerKey: 'DatesBefore',\n phraseKey: 'FilterChipBefore',\n },\n [MatchModeCodes.GreaterThan]: {\n pickerKey: 'DatesAfter',\n phraseKey: 'FilterChipAfter',\n },\n },\n};\n\nexport interface OperatorOption {\n value: MatchModeCodes;\n /** Transloco key, resolved by the control — the store holds no translations. */\n labelKey: string;\n}\n\n/**\n * `In` and options are the same fact seen from two sides: `In` needs a list of values, and the\n * editor only draws one when the filter declares options. So options mean `In` and nothing else,\n * and their absence rules `In` out — offering it on a plain number filter would hand the\n * operator a mode with no control behind it.\n *\n * Widened first: the per-kind tuples are literal, so `boolean`'s `[Equals]` makes the `In`\n * comparison a \"no overlap\" error rather than an empty result.\n */\nfunction baseOperators(\n kind: FilterValueKind,\n hasOptions: boolean,\n): readonly MatchModeCodes[] {\n const accepted: readonly MatchModeCodes[] = ALLOWED_OPERATORS[kind];\n\n return accepted.filter((value) =>\n hasOptions ? value === MatchModeCodes.In : value !== MatchModeCodes.In,\n );\n}\n\nfunction toOperatorOptions(\n kind: FilterValueKind,\n operators: readonly MatchModeCodes[],\n): OperatorOption[] {\n return operators.map((value) => ({\n value,\n labelKey: OPERATOR_WORDS[kind][value]?.pickerKey ?? value,\n }));\n}\n\n/**\n * A KIND's operator picker options, for callers with no filter behind them — today that is\n * `spiderly-data-view`, whose own filter config derives its operator lists here instead of\n * hand-keeping copies (the drift `allowed-operators.ts` exists to end). Per-FILTER narrowing\n * lives in the store (`createFilterStore` resolves it once per declaration), so this cannot be\n * handed a fake definition to satisfy — that shape shipped once and interpolated an empty\n * filter name into its own error message.\n */\nexport function operatorOptionsForKind(\n kind: FilterValueKind,\n hasOptions = false,\n): OperatorOption[] {\n return toOperatorOptions(kind, baseOperators(kind, hasOptions));\n}\n\n/**\n * The operator applied when nobody picked one, which has to be what a person MEANS by filling in\n * the control. `Contains` for a fragment typed into a box; `GreaterThan` for a date, never\n * `Equals` — a date equality against a TIMESTAMP matches only the row written in that exact\n * second, and answers with an empty grid rather than an error (PACMS ran into this on all three\n * of its date columns, Filip 2026-08-28).\n */\nexport const DEFAULT_OPERATOR = {\n text: MatchModeCodes.Contains,\n number: MatchModeCodes.Equals,\n boolean: MatchModeCodes.Equals,\n date: MatchModeCodes.GreaterThan,\n} as const satisfies Record<FilterValueKind, MatchModeCodes>;\n\n/** The value each kind carries. Exhaustive over the kinds by construction. */\ninterface ValueByKind {\n text: string;\n number: number;\n boolean: boolean;\n date: Date;\n}\n\n/**\n * What every factory takes, so narrowing does not have to be re-plumbed per factory (its adjacent\n * asymmetry — `options` on `numberFilter` only — is FORCED and documented there; this one is not).\n *\n * `operators` narrows what the editor OFFERS, in display order; the first entry becomes the\n * default. Typed per kind, so declaring an operator the kind cannot answer is a build error at\n * the declaration — the store's runtime drop-and-report covers only what dodges the type system\n * (a dynamically built array). The store still accepts every wire-legal operator on restore, so\n * an old persisted constraint keeps filtering: the narrowing shapes the controls, not the\n * contract. The forcing case: date-equality against a timestamp matches one second and answers\n * with an empty grid, so PACMS's order dates offer only \"posle\"/\"pre\".\n */\ninterface FilterConfig<TKind extends FilterValueKind> {\n label: string;\n operators?: AllowedOperatorFor<TKind>[];\n /**\n * `false` keeps the filter out of the bar's \"+ Filter\" menu — for a filter with a DEDICATED\n * control somewhere on the page (PACMS's order search box is a placement of the store's\n * `mixedSearch`), where the generic entry point would give one question two homes. The chip\n * still renders when the filter is applied, so the bar's claim to list every constraint holds.\n */\n offered?: boolean;\n}\n\nexport function textFilter(config: FilterConfig<'text'>): FilterDefinition<'text'> {\n return {\n kind: 'text',\n label: config.label,\n operators: config.operators,\n offered: config.offered,\n };\n}\n\n/**\n * Only a NUMBER filter accepts options, and the asymmetry is forced rather than chosen: options\n * mean `In`, and `In` is the one operator ALLOWED_OPERATORS grants to numbers alone — because the\n * generated paginator answers it with InvalidMatchMode on a string column. A text pick-list used\n * to type-check and then throw at the first `set`.\n */\nexport function numberFilter(\n config: FilterConfig<'number'> & { options?: FilterOption[] },\n): FilterDefinition<'number'> {\n return {\n kind: 'number',\n label: config.label,\n options: config.options,\n operators: config.operators,\n offered: config.offered,\n };\n}\n\nexport function booleanFilter(\n config: FilterConfig<'boolean'>,\n): FilterDefinition<'boolean'> {\n return {\n kind: 'boolean',\n label: config.label,\n operators: config.operators,\n offered: config.offered,\n };\n}\n\nexport function dateFilter(config: FilterConfig<'date'>): FilterDefinition<'date'> {\n return {\n kind: 'date',\n label: config.label,\n operators: config.operators,\n offered: config.offered,\n };\n}\n\n/**\n * `In` is the only multi-valued operator MatchModeCodes has, so it is the only one whose value is\n * a list. Distributing over the operator union yields a discriminated union rather than a loose\n * `T | T[]`, so `{ operator: Equals, value: [2, 3] }` is a compile error rather than a query the\n * paginator answers in some way nobody predicted.\n */\ntype ConstraintFor<TKind extends FilterValueKind, TOperator> =\n TOperator extends MatchModeCodes.In\n ? { operator: TOperator; value: ValueByKind[TKind][] | null | undefined }\n : { operator: TOperator; value: ValueByKind[TKind] | null | undefined };\n\n/**\n * The kind is what carries BOTH halves — which operators are legal and what the value is. It has\n * to stay a literal all the way from the factory to here: typing the definition's `kind` as the\n * widened `FilterValueKind` silently allows every operator on every filter, which is the shape\n * this first had (the runtime guard still fired, so only a `@ts-expect-error` pin caught it).\n */\nexport type FilterConstraint<TKind extends FilterValueKind> = ConstraintFor<\n TKind,\n (typeof ALLOWED_OPERATORS)[TKind][number]\n>;\n\n/** What the maps hold. The public generic precision is for the CALLER; internally it is noise. */\ninterface StoredConstraint {\n operator: MatchModeCodes;\n value: unknown;\n}\n\n/** One filter, addressed on its own. The placement API, and what the bar's editor drives. */\nexport interface FilterHandle {\n id: string;\n label: string;\n kind: FilterValueKind;\n /** The DRAFT — what a control shows. `applied()` answers the other question. */\n value: Signal<unknown>;\n operator: Signal<MatchModeCodes | undefined>;\n /** Every operator this filter accepts, in display order. */\n operators: OperatorOption[];\n /** Applied when nobody picked an operator. */\n defaultOperator: MatchModeCodes;\n /** The tickable choices, when this filter declares any. */\n options?: FilterOption[];\n set(constraint: { operator: MatchModeCodes; value: unknown }): void;\n commit(): void;\n reset(): void;\n}\n\n/**\n * What the CHIP BAR needs from a store, and no more: it reads the applied set and removes from it.\n * Narrow on purpose — it keeps the bar free of the store's generics, so the bar renders any store\n * without the two types having to agree on filter ids.\n */\nexport interface FilterBarSource {\n /** Every DECLARED filter, which is what \"+ Filter\" offers — not every visible column. */\n definitions: Record<string, FilterDefinition<FilterValueKind>>;\n applied: Signal<AppliedFilter[]>;\n get(id: string): FilterHandle;\n reset(id: string): void;\n clear(): void;\n}\n\n/** What the TABLE needs: the bar's half, plus the payload it sends to the paginator. */\nexport interface FilterSource extends FilterBarSource {\n toFilterPayload(): Record<string, FilterRule[]>;\n /** The applied set as plain JSON, for whoever owns this table's persisted state. */\n snapshot(): FilterSnapshot;\n /** Replaces the applied set, and the drafts with it so every control agrees with its chip. */\n restore(snapshot: FilterSnapshot): void;\n}\n\n/** The applied constraints in a form that survives `JSON.stringify`. */\nexport type FilterSnapshot = Record<\n string,\n { operator: MatchModeCodes; value: unknown }\n>;\n\n/** The shape `Date.toJSON` writes, which is the only value here JSON cannot round-trip itself. */\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/;\n\nfunction reviveValue(value: unknown): unknown {\n if (typeof value === 'string' && ISO_DATE.test(value)) return new Date(value);\n if (Array.isArray(value)) return value.map(reviveValue);\n\n return value;\n}\n\n/**\n * One column the bar's sort picker offers, labelled by whoever owns the columns — the bar knows\n * nothing about them. Hidden sortable columns belong in the list: the picker exists precisely so\n * an ordering does not need its column on screen (decision 2b's sort half).\n */\nexport interface SortPickOption {\n field: string;\n label: string;\n}\n\n/**\n * One sort key as the bar draws it — a pick option WITH its direction. Sort deliberately does\n * NOT live in the filter store: `multiSortMeta` already holds it, keyed by field, and a copy\n * here would be a second source of truth for one fact. The bar is one surface reading two\n * owners. `field` is what lets the picker mark the active row and flip its direction; the\n * label alone could not say which option it names once two columns share a name.\n */\nexport interface SortKeyLabel extends SortPickOption {\n descending: boolean;\n}\n\n/** One applied constraint, in the shape the chip bar draws. */\nexport interface AppliedFilter {\n id: string;\n label: string;\n /** The bar reads this to word the chip — `String(false)` would print \"false\" at an operator. */\n kind: FilterValueKind;\n operator: MatchModeCodes;\n /**\n * Transloco key for the chip's middle word. Without it a chip reads \"Firma Elektromont\", which\n * leaves the reader to guess whether the grid is narrowed by `contains` or by `equals` — very\n * different sets for one typed value, on a surface whose only claim is that it cannot lie.\n */\n operatorPhraseKey: string;\n value: unknown;\n}\n\n/**\n * A blanked value is NOT a constraint. `contains ''` matches every row, so emitting one would\n * narrow nothing while the bar claims the grid is filtered.\n */\nfunction isBlank(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === 'string') return value.trim() === '';\n if (Array.isArray(value)) return value.length === 0;\n // A half-typed datepicker yields an Invalid Date, which JSON.stringify writes as `null`.\n if (value instanceof Date) return Number.isNaN(value.getTime());\n\n return false;\n}\n\n/**\n * Whether two constraint values are the same QUESTION. Identity is not it: every `set` builds a\n * fresh draft, a multiselect hands back a fresh array per change, and two Dates at one instant\n * are one constraint. This is what `commit` bails on, so a paste-over-itself or a double Apply\n * cannot spend a request — the rule PACMS's order list used to hand-roll as `lastCommittedTerm`.\n */\nfunction valueEquals(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((item, i) => valueEquals(item, b[i]));\n }\n\n return false;\n}\n\nfunction constraintEquals(\n a: StoredConstraint | undefined,\n b: StoredConstraint,\n): boolean {\n return a != null && a.operator === b.operator && valueEquals(a.value, b.value);\n}\n\n/**\n * The filter engine. It knows nothing about columns: a filter has an id, a value type and a\n * constraint, and that is the entire vocabulary.\n */\nexport function createFilterStore<\n TDefs extends Record<string, FilterDefinition<FilterValueKind>>,\n>(definitions: TDefs) {\n // Per-filter offered operators, resolved ONCE per declaration — so an invalid narrowing is\n // said once, not on every editor open — and re-resolved only where the inputs can actually\n // change: `setOptions`, because options' PRESENCE flips a filter between pick-list (`In`) and\n // plain operators. A per-store Map rather than the module-level WeakMap this first shipped\n // as: that memo was keyed on a definition object consumers mutate, so late-filled options\n // could freeze a filter's operators at the wrong answer.\n const resolveOffered = (id: keyof TDefs) => {\n const definition = definitions[id];\n const base = baseOperators(definition.kind, definition.options != null);\n\n let codes: readonly MatchModeCodes[] = base;\n if (definition.operators?.length) {\n const survivors = definition.operators.filter((operator) =>\n base.includes(operator),\n );\n\n // Same polarity as the column path's computeMatchModes: a bad entry is dropped and said\n // out loud, and a narrowing that leaves nothing falls back to the full list — an editor\n // with no operators would be unusable, which is worse than an unwanted one. Mostly\n // unreachable now that FilterConfig types `operators` per kind; kept for dynamically\n // built arrays.\n if (survivors.length < definition.operators.length) {\n console.error(\n `Filter '${definition.label}' narrows to operators its ${definition.kind} kind does not ` +\n `offer (${definition.operators.join(', ')}; offered: ${base.join(', ')}). ` +\n `Unsupported entries are ignored${survivors.length ? '' : '; falling back to the full list'}.`,\n );\n }\n\n codes = survivors.length ? survivors : base;\n }\n\n return { codes, options: toOperatorOptions(definition.kind, codes) };\n };\n\n const offered = new Map<\n keyof TDefs,\n { codes: readonly MatchModeCodes[]; options: OperatorOption[] }\n >();\n for (const id of Object.keys(definitions) as (keyof TDefs)[]) {\n offered.set(id, resolveOffered(id));\n }\n\n /**\n * The operator applied when nobody picked one. Options mean `In`, whatever the kind's default;\n * a narrowed filter defaults to its FIRST declared operator.\n */\n const defaultOperatorFor = (id: keyof TDefs): MatchModeCodes => {\n const definition = definitions[id];\n if (definition.options != null) return MatchModeCodes.In;\n\n return definition.operators?.length\n ? offered.get(id)!.codes[0]\n : DEFAULT_OPERATOR[definition.kind];\n };\n\n // Two stores, and the split is the whole point: `set` writes a DRAFT, `commit` publishes it.\n // A chip drawn off a draft would repeat the mistake the header's filter icon already shipped —\n // claiming the grid is narrowed on the first keystroke. Controls that apply on change\n // (multiselect, boolean, date) call both at once; a text box commits on Enter or blur.\n const drafts = signal<ReadonlyMap<keyof TDefs, StoredConstraint>>(new Map());\n\n const writeDraft = (id: keyof TDefs, constraint: StoredConstraint | null) => {\n const next = new Map(drafts());\n if (constraint === null) next.delete(id);\n else next.set(id, constraint);\n drafts.set(next);\n };\n const committed = signal<ReadonlyMap<keyof TDefs, StoredConstraint>>(\n new Map(),\n );\n\n const applied: Signal<AppliedFilter[]> = computed(() =>\n [...committed()].map(([id, constraint]) => ({\n id: id as string,\n label: definitions[id].label,\n kind: definitions[id].kind,\n operator: constraint.operator,\n operatorPhraseKey:\n OPERATOR_WORDS[definitions[id].kind][constraint.operator]?.phraseKey ??\n constraint.operator,\n value: constraint.value,\n })),\n );\n\n const store = {\n definitions,\n applied,\n\n /**\n * A handle bound to one filter. This is the PLACEMENT api: it needs nothing from the component\n * tree, so the same filter can be driven from the bar, from a header cell, or from a drawer\n * rendered at app root. `value` is the DRAFT — a control shows what was typed, not what was\n * applied; `applied()` is the other question and the bar asks that one.\n */\n get<K extends keyof TDefs>(id: K) {\n return {\n id: id as string,\n label: definitions[id].label,\n kind: definitions[id].kind,\n value: computed(() => drafts().get(id)?.value),\n operator: computed(() => drafts().get(id)?.operator),\n // Getters, not snapshots: options can land AFTER a handle is taken — the bar's editor\n // holds one for the life of the popover, and PACMS fills its lookups asynchronously —\n // and a snapshot left an already-open pick-list empty until it was reopened. The\n // operator list rides along, since setOptions can flip it to `In`.\n get operators() {\n return offered.get(id)!.options;\n },\n get defaultOperator() {\n return defaultOperatorFor(id);\n },\n get options() {\n return definitions[id].options;\n },\n set: (constraint: FilterConstraint<TDefs[K]['kind']>) =>\n store.set(id, constraint),\n commit: () => store.commit(id),\n reset: () => store.reset(id),\n };\n },\n\n /**\n * The ONE seam for choices that arrive after the store is built (PACMS fills its pick-lists\n * from lookups that race a deploy). Never write `definitions[id].options` by hand: options'\n * PRESENCE is what makes a filter a pick-list, so the setter also re-resolves the offered\n * operators — a hand write would leave a late-filled filter offering `Equals` on a control\n * that emits a list.\n */\n setOptions<K extends keyof TDefs>(id: K, options: FilterOption[]): void {\n definitions[id].options = options;\n offered.set(id, resolveOffered(id));\n },\n\n set<K extends keyof TDefs>(\n id: K,\n constraint: FilterConstraint<TDefs[K]['kind']>,\n ): void {\n const kind = definitions[id].kind;\n\n // Throws rather than logging and ignoring, which is what `computeMatchModes` does for a\n // column's OFFERED match modes. Different stakes: that one narrows a dropdown, so a bad\n // entry merely fails to show, while this one assembles a QUERY — dropping it silently would\n // leave the operator looking at unfiltered rows believing they are filtered.\n if (!ALLOWED_OPERATORS[kind].includes(constraint.operator as never)) {\n throw new Error(\n `Filter '${String(id)}' is ${kind}, which does not accept the '${constraint.operator}' ` +\n `operator (allowed: ${ALLOWED_OPERATORS[kind].join(', ')}). The generated paginator ` +\n `answers an unsupported match mode with InvalidMatchMode.`,\n );\n }\n\n writeDraft(id, constraint);\n },\n\n /**\n * `set` + `commit` in one breath — the shape every PROGRAMMATIC write takes (a view's\n * `apply`, the sheet flow). The split API stays for controls, where draft-on-type /\n * publish-on-Apply is the point; but a bare `set` whose `commit` is forgotten (or written\n * with the wrong id — the pair repeats the string twice) fails silently: the draft is\n * written, nothing is published, and a view narrows by nothing under a labelled tab.\n */\n setAndCommit<K extends keyof TDefs>(\n id: K,\n constraint: FilterConstraint<TDefs[K]['kind']>,\n ): void {\n store.set(id, constraint);\n store.commit(id);\n },\n\n /**\n * Publishes the draft. A blanked draft REMOVES the constraint rather than committing an empty\n * one, so `applied()` and the payload agree: no chip, no key, no `contains ''`.\n */\n commit<K extends keyof TDefs>(id: K): void {\n const draft = drafts().get(id);\n const current = committed();\n const shouldRemove = draft === undefined || isBlank(draft.value);\n\n // A new Map is a new identity even with identical contents, and everything downstream\n // reacts to identity — so a no-op commit would spend a request. The bail compares the\n // CONSTRAINT, not the draft object: every set() builds a fresh draft, and the case that\n // matters is an identical value re-committed (see valueEquals).\n if (shouldRemove ? !current.has(id) : constraintEquals(current.get(id), draft)) return;\n\n const next = new Map(current);\n if (shouldRemove) next.delete(id);\n else next.set(id, draft);\n\n committed.set(next);\n },\n\n /**\n * The chip's `x`. Drops the DRAFT as well as the committed constraint: a surviving draft\n * leaves the control still showing the cleared text, and the next commit would restore a\n * filter nobody re-typed.\n */\n reset<K extends keyof TDefs>(id: K): void {\n if (drafts().has(id)) writeDraft(id, null);\n if (!committed().has(id)) return;\n\n const next = new Map(committed());\n next.delete(id);\n committed.set(next);\n },\n\n /**\n * The applied set, plain enough to store. Drafts are deliberately NOT included: a half-typed\n * value is not a state anyone should come back to, and the bar's whole claim is that what it\n * shows is what narrows the grid.\n */\n snapshot(): FilterSnapshot {\n const snapshot: FilterSnapshot = {};\n\n for (const [id, constraint] of committed()) {\n snapshot[id as string] = {\n operator: constraint.operator,\n value: constraint.value,\n };\n }\n\n return snapshot;\n },\n\n /**\n * Replaces the applied set. The drafts are written too, so reopening a restored chip shows\n * the value it is filtering by rather than an empty control.\n *\n * Ids the store no longer declares are dropped rather than carried: a filter removed from the\n * declaration in a later release would otherwise ride every request from anyone whose storage\n * still held it, with no chip able to name it and no way to clear it from the UI.\n */\n restore(snapshot: FilterSnapshot): void {\n const next = new Map<keyof TDefs, StoredConstraint>();\n\n for (const [id, constraint] of Object.entries(snapshot ?? {})) {\n if (!(id in definitions)) continue;\n\n next.set(id as keyof TDefs, {\n operator: constraint.operator,\n value: reviveValue(constraint.value),\n });\n }\n\n drafts.set(new Map(next));\n committed.set(next);\n },\n\n /** The bar's \"Clear all\". `reset` for every filter, drafts included. */\n clear(): void {\n if (drafts().size > 0) drafts.set(new Map());\n if (committed().size > 0) committed.set(new Map());\n },\n\n /** The `filters` half of `Filter` — what the generated paginator reads. */\n toFilterPayload(): Record<string, FilterRule[]> {\n const payload: Record<string, FilterRule[]> = {};\n\n for (const [id, constraint] of committed()) {\n payload[id as string] = [\n { matchMode: constraint.operator, value: constraint.value } as FilterRule,\n ];\n }\n\n return payload;\n },\n };\n\n return store;\n}\n","import {\n Component,\n ContentChild,\n EventEmitter,\n Inject,\n Input,\n LOCALE_ID,\n OnInit,\n Output,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport {\n Table,\n TableFilterEvent,\n TableLazyLoadEvent,\n TableModule,\n} from 'primeng/table';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { SpiderlyControlsModule } from '../../controls/spiderly-controls.module';\nimport { PaginatedResult } from '../../entities/paginated-result';\nimport { Filter } from '../../entities/filter';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { ButtonModule } from 'primeng/button';\nimport { MultiSelectModule } from 'primeng/multiselect';\nimport { CheckboxModule } from 'primeng/checkbox';\nimport { MatchModeCodes } from '../../enums/match-mode-enum-codes';\nimport {\n FilterValueKind,\n} from '../../filters/allowed-operators';\nimport { operatorOptionsForKind } from '../../filters/filter-store';\nimport { Action } from '../spiderly-data-table/spiderly-data-table.component';\nimport { SelectItem } from 'primeng/api';\nimport { DatePickerModule } from 'primeng/datepicker';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { InputNumberModule } from 'primeng/inputnumber';\nimport { SelectModule } from 'primeng/select';\nimport { BaseEntity } from '../../entities/base-entity';\nimport { PrimengOption } from '../../entities/primeng-option';\nimport { scrollElementIntoViewIfAboveViewport } from '../../services/helper-functions';\n\n@Component({\n selector: 'spiderly-data-view',\n templateUrl: './spiderly-data-view.component.html',\n styleUrl: 'spiderly-data-view.component.scss',\n imports: [\n FormsModule,\n CommonModule,\n TranslocoDirective,\n SpiderlyControlsModule,\n TableModule,\n ButtonModule,\n MultiSelectModule,\n CheckboxModule,\n TooltipModule,\n DatePickerModule,\n InputTextModule,\n InputNumberModule,\n SelectModule,\n ],\n})\nexport class SpiderlyDataViewComponent<T> implements OnInit {\n @ViewChild('dt') table: Table;\n /**\n * List of items in the table.\n * Should be provided only when `hasLazyLoad === false`.\n */\n @Input() items: T[];\n @Input() rows: number = 10;\n @Input() filters: DataViewFilter<T>[] = [];\n totalRecords: number;\n @Output() onLazyLoad: EventEmitter<Filter> = new EventEmitter();\n\n /** Whether the data view is wrapped in a card container. Defaults to `true`. */\n @Input() showCardWrapper: boolean = true;\n /**\n * Whether to display additional data on the right side of the paginator.\n * Defaults to `false`.\n */\n @Input() showPaginatorRightData: boolean = false;\n /** Whether the total records count is shown. Defaults to `false`. */\n @Input() showTotalRecordsNumber: boolean = false;\n @Input() applyFiltersIcon: string = 'pi pi-filter';\n @Input() clearFiltersIcon: string = 'pi pi-filter-slash';\n\n @Input() getPaginatedListObservableMethod: (\n filter: Filter,\n ) => Observable<PaginatedResult>;\n\n lastLazyLoadEvent: TableLazyLoadEvent;\n private loading: boolean = true;\n\n matchModeDateOptions: SelectItem[] = [];\n matchModeNumberOptions: SelectItem[] = [];\n\n @ContentChild('cardBody', { read: TemplateRef }) cardBody!: TemplateRef<any>;\n\n constructor(\n private translocoService: TranslocoService,\n @Inject(LOCALE_ID) private locale: string,\n ) {}\n\n ngOnInit(): void {\n // Derived from the ONE operator table (`filters/allowed-operators.ts`) rather than\n // hand-kept: these were the last hand-written copies of the per-kind lists, and a backend\n // operator change edited in the shared table would silently never have reached them.\n const matchModeOptionsFor = (kind: FilterValueKind): SelectItem[] =>\n operatorOptionsForKind(kind).map((option) => ({\n label: this.translocoService.translate(option.labelKey),\n value: option.value,\n }));\n\n this.matchModeDateOptions = matchModeOptionsFor('date');\n this.matchModeNumberOptions = matchModeOptionsFor('number');\n }\n\n // Paging semantics and the scroll-margin contract are documented once, on the data table:\n // spiderly-data-table/CLAUDE.md → \"Scroll back to the table on page change\".\n onPageChange(container: HTMLElement): void {\n scrollElementIntoViewIfAboveViewport(container);\n }\n\n /**\n * The one pending predicate: PrimeNG's overlay and the container's `aria-busy` must never\n * disagree. Mirrors the data table's, including why it is not also testing `items`; the\n * rationale lives there.\n */\n get isPending(): boolean {\n return this.loading;\n }\n\n lazyLoad(event: TableLazyLoadEvent) {\n // Every refetch is pending, not just the first load. `items` is deliberately left alone so\n // the previous page stays readable under the overlay. Full reasoning: the data table's\n // CLAUDE.md → \"Pending state\".\n this.loading = true;\n\n this.lastLazyLoadEvent = event;\n\n const transformedFilter: {\n [K in keyof T]?: { value: any; matchMode: MatchModeCodes }[];\n } = {};\n\n for (const key in event.filters) {\n const filterMeta = event.filters[key];\n\n if (Array.isArray(filterMeta)) {\n transformedFilter[key] = filterMeta;\n } else {\n transformedFilter[key] = [\n {\n value: filterMeta.value,\n matchMode: filterMeta.matchMode,\n },\n ];\n }\n }\n\n let tableFilter = event as unknown as Filter<T>;\n\n tableFilter.filters = transformedFilter;\n\n this.onLazyLoad.next(tableFilter);\n\n this.getPaginatedListObservableMethod(tableFilter).subscribe({\n next: (res) => {\n this.items = res.data;\n this.totalRecords = res.totalRecords;\n\n this.loading = false;\n },\n error: () => {\n this.loading = false;\n },\n });\n }\n\n filter(event: TableFilterEvent) {}\n\n getDefaultMatchMode(filterType: string): any {\n switch (filterType) {\n case 'text':\n return MatchModeCodes.Contains;\n case 'date':\n return MatchModeCodes.Equals;\n case 'multiselect':\n return MatchModeCodes.In;\n case 'boolean':\n return MatchModeCodes.Equals;\n case 'numeric':\n return MatchModeCodes.Equals;\n default:\n return null;\n }\n }\n\n getMatchModeOptions(filterType: string) {\n switch (filterType) {\n case 'text':\n return [];\n case 'date':\n return this.matchModeDateOptions;\n case 'multiselect':\n return [];\n case 'boolean':\n return [];\n case 'numeric':\n return this.matchModeNumberOptions;\n default:\n return [];\n }\n }\n\n reload() {\n // Nothing to replay before the initial load, which is already on its way.\n if (this.lastLazyLoadEvent == null) return;\n\n // Not special: same refetch as a page flip, so lazyLoad owns both the flag and `items`.\n this.lazyLoad(this.lastLazyLoadEvent);\n }\n\n colTrackByFn(index, item) {\n return item.field;\n }\n\n actionTrackByFn(index, item: Action) {\n return `${index}${item.field}`;\n }\n\n applyFilters = () => {\n this.table._filter();\n };\n\n clearFilters() {\n this.table.clear();\n }\n}\n\nexport interface DataViewCardBody<T> {\n $implicit: T;\n item: T;\n index: number;\n}\n\nexport interface DataViewFilter<T extends BaseEntity> {\n label?: string;\n field?: string & keyof T;\n filterField?: string & keyof T; // Made specificaly for multiautocomplete, maybe for something more in the future\n type?: 'text' | 'date' | 'multiselect' | 'boolean' | 'numeric' | 'blob';\n placeholder?: string;\n showMatchModes?: boolean;\n dropdownOrMultiselectValues?: PrimengOption[];\n}\n","<ng-container *transloco=\"let t\">\n <div\n #tableContainer\n class=\"spiderly-table-container\"\n [attr.aria-busy]=\"isPending\"\n [ngClass]=\"{\n 'card responsive-card-padding overflow-auto': showCardWrapper\n }\"\n >\n <p-table\n #dt\n [value]=\"items\"\n [rows]=\"rows\"\n [rowHover]=\"false\"\n responsiveLayout=\"scroll\"\n [lazy]=\"true\"\n (onLazyLoad)=\"lazyLoad($event)\"\n (onPage)=\"onPageChange(tableContainer)\"\n [totalRecords]=\"totalRecords\"\n class=\"spiderly-table\"\n [loading]=\"isPending\"\n dataKey=\"id\"\n (onFilter)=\"filter($event)\"\n [filterDelay]=\"500\"\n [paginator]=\"true\"\n >\n <ng-template #caption>\n <div *ngIf=\"filters.length !== 0\">\n <div class=\"data-view-grid\">\n @for (filter of filters; track $index) {\n <div>\n <div\n style=\"\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n position: relative;\n \"\n >\n <div>\n <label>\n {{ filter.label }}\n </label>\n </div>\n\n <p-columnFilter\n *ngIf=\"filter.type != null\"\n [type]=\"filter.type\"\n [field]=\"filter.filterField ?? filter.field\"\n display=\"row\"\n [placeholder]=\"filter.placeholder\"\n [showOperator]=\"false\"\n [showMenu]=\"filter.showMatchModes\"\n [showMatchModes]=\"true\"\n [showClearButton]=\"false\"\n [matchMode]=\"getDefaultMatchMode(filter.type)\"\n [matchModeOptions]=\"getMatchModeOptions(filter.type)\"\n >\n <ng-container *ngIf=\"filter.type == 'multiselect'\">\n <ng-template\n pTemplate=\"filter\"\n let-value\n let-filter=\"filterCallback\"\n >\n <p-multiSelect\n [ngModel]=\"value\"\n [options]=\"filter.dropdownOrMultiselectValues\"\n [placeholder]=\"t('All')\"\n (onChange)=\"filter($event.value)\"\n optionLabel=\"label\"\n optionValue=\"code\"\n [style]=\"{ width: '100%' }\"\n >\n <ng-template let-item pTemplate=\"item\">\n <div class=\"p-multiselect-representative-option\">\n <span class=\"ml-2\">{{ item.label }}</span>\n </div>\n </ng-template>\n </p-multiSelect>\n </ng-template>\n </ng-container>\n </p-columnFilter>\n </div>\n </div>\n }\n </div>\n <div style=\"display: flex; gap: 12px\">\n <spiderly-button\n [label]=\"t('ApplyFilters')\"\n (onClick)=\"applyFilters()\"\n [icon]=\"applyFiltersIcon\"\n ></spiderly-button>\n <spiderly-button\n [label]=\"t('ClearFilters')\"\n (onClick)=\"clearFilters()\"\n [icon]=\"clearFiltersIcon\"\n ></spiderly-button>\n </div>\n </div>\n </ng-template>\n <ng-template #body let-rowData let-index=\"rowIndex\">\n <tr style=\"padding: 0; margin-bottom: 0\">\n <td style=\"display: block; border: 0; padding: 0\">\n <ng-container\n *ngTemplateOutlet=\"\n cardBody;\n context: { $implicit: rowData, item: rowData, index: index }\n \"\n >\n </ng-container>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n {{ t(\"NoRecordsFound\") }}\n </ng-template>\n <ng-template *ngIf=\"showTotalRecordsNumber\" pTemplate=\"paginatorleft\">\n {{ t(\"TotalRecords\") }}: {{ totalRecords }}\n </ng-template>\n <ng-template *ngIf=\"showPaginatorRightData\" pTemplate=\"paginatorright\">\n <ng-content select=\"[PAGINATORRIGHT]\"></ng-content>\n </ng-template>\n </p-table>\n </div>\n</ng-container>\n","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'spiderly-card',\n templateUrl: './spiderly-card.component.html',\n styles: [],\n})\nexport class SpiderlyCardComponent implements OnInit {\n @Input() icon: string = 'pi pi-file-edit';\n @Input() title: string;\n\n constructor() {}\n\n ngOnInit(): void {}\n}\n","<div class=\"card responsive-card-padding\">\n <div\n style=\"display: flex; align-items: center; margin-bottom: 14px; gap: 8px\"\n >\n <i style=\"font-size: 21px\" class=\"{{ icon }} primary-color\"></i>\n <div style=\"margin: 0; font-size: 17.5px\">{{ title }}</div>\n </div>\n <ng-content></ng-content>\n</div>\n","import { BaseEntity } from './base-entity';\n\n// FT HACK: Fake class, because of api imports\nexport class Codebook extends BaseEntity {\n code?: string;\n displayName?: string;\n\n constructor({\n code,\n displayName,\n }: {\n code?: string;\n displayName?: string;\n } = {}) {\n super();\n\n this.code = code;\n this.displayName = displayName;\n }\n\n static readonly typeName = 'Codebook' as const;\n}\n","export class FilterSortMeta {\n field: string;\n order: number;\n\n constructor({\n field,\n order,\n }: {\n field?: string;\n order?: number;\n } = {}) {\n this.field = field as string;\n this.order = order as number;\n }\n\n static schema = {\n field: {\n type: 'string',\n },\n order: {\n type: 'number',\n },\n } as const;\n\n static readonly typeName = 'FilterSortMeta' as const;\n}\n","import { BaseEntity } from './base-entity';\nimport { FilterRule } from './filter-rule';\nimport { FilterSortMeta } from './filter-sort-meta';\n\nexport class Filter<T extends BaseEntity = any> extends BaseEntity {\n filters?: { [K in keyof T]?: FilterRule[] };\n first?: number;\n rows?: number;\n multiSortMeta?: FilterSortMeta[];\n additionalFilterIdInt?: number;\n additionalFilterIdLong?: number;\n\n constructor({\n filters,\n first,\n rows,\n multiSortMeta,\n additionalFilterIdInt,\n additionalFilterIdLong,\n }: {\n filters?: { [K in keyof T]?: FilterRule[] };\n first?: number;\n rows?: number;\n multiSortMeta?: FilterSortMeta[];\n additionalFilterIdInt?: number;\n additionalFilterIdLong?: number;\n } = {}) {\n super();\n\n this.filters = filters;\n this.first = first;\n this.rows = rows;\n this.multiSortMeta = multiSortMeta;\n this.additionalFilterIdInt = additionalFilterIdInt;\n this.additionalFilterIdLong = additionalFilterIdLong;\n }\n\n static schema = {\n filters: {\n type: 'Object',\n // Note: 'filters' is a dynamic map (Dictionary), so we usually treat it as a generic Object\n // unless strict typing is required for the inner FilterRule[] values by the serializer.\n },\n first: {\n type: 'number',\n },\n rows: {\n type: 'number',\n },\n multiSortMeta: {\n type: 'FilterSortMeta[]',\n get nestedConstructor() {\n return FilterSortMeta;\n },\n },\n additionalFilterIdInt: {\n type: 'number',\n },\n additionalFilterIdLong: {\n type: 'number',\n },\n } as const;\n\n static readonly typeName = 'Filter' as const;\n}\n","import { MatchModeCodes } from '../enums/match-mode-enum-codes';\nimport { AllowedOperatorFor } from '../filters/allowed-operators';\n\n/**\n * Represents a filter rule used for querying or filtering data collections.\n *\n * The `FilterRule` class is a generic structure that defines a single filtering condition,\n * including the match mode (comparison operator), the value to compare, and an optional logical operator.\n *\n * The allowed match modes are determined by the type parameter `T`, each union derived from the\n * one operator table in `filters/allowed-operators.ts` (for other types, any `MatchModeCodes`\n * value is allowed).\n *\n * @template T The type of the value to filter by.\n */\nexport class FilterRule<T = any> {\n matchMode: AllowedMatchModes<T>;\n value: T;\n operator?: string;\n}\n\ntype AllowedMatchModes<T> = T extends string\n ? AllowedOperatorFor<'text'>\n : T extends boolean\n ? AllowedOperatorFor<'boolean'>\n : T extends Date\n ? AllowedOperatorFor<'date'>\n : T extends number\n ? AllowedOperatorFor<'number'>\n : MatchModeCodes;\n","import { BaseEntity } from './base-entity';\n\nexport class IsAuthorizedForSaveEvent extends BaseEntity {\n isAuthorizedForSave?: boolean;\n\n constructor({\n isAuthorizedForSave,\n }: {\n isAuthorizedForSave?: boolean;\n } = {}) {\n super();\n\n this.isAuthorizedForSave = isAuthorizedForSave;\n }\n\n static readonly typeName = 'IsAuthorizedForSaveEvent' as const;\n}\n","import { BaseEntity } from './base-entity';\n\nexport class LastMenuIconIndexClicked extends BaseEntity {\n index?: number;\n\n constructor({\n index,\n }: {\n index?: number;\n } = {}) {\n super();\n\n this.index = index;\n }\n\n static readonly typeName = 'LastMenuIconIndexClicked' as const;\n}\n","import { BaseEntity } from '../entities/base-entity';\n\nexport class LazyLoadSelectedIdsResult extends BaseEntity {\n selectedIds?: number[] = []; // FT: Only for showing checkboxes, we will not send this to the backend\n totalRecordsSelected?: number = 0;\n\n constructor({\n selectedIds,\n totalRecordsSelected,\n }: {\n selectedIds?: number[];\n totalRecordsSelected?: number;\n } = {}) {\n super();\n\n this.selectedIds = selectedIds;\n this.totalRecordsSelected = totalRecordsSelected;\n }\n\n static readonly typeName = 'LazyLoadSelectedIdsResult' as const;\n}\n","export class MenuChangeEvent {\n key: string;\n routeEvent?: boolean;\n}\n","import { BaseEntity } from '../entities/base-entity';\n\nexport class Namebook extends BaseEntity {\n id?: any;\n displayName?: string;\n\n constructor({\n id,\n displayName,\n }: {\n id?: any;\n displayName?: string;\n } = {}) {\n super();\n\n this.id = id;\n this.displayName = displayName;\n }\n\n static schema = {\n id: {\n type: 'any',\n },\n displayName: {\n type: 'string',\n },\n } as const;\n\n static readonly typeName = 'Namebook' as const;\n}\n","export class PaginatedResult<T = any> {\n data?: T[];\n totalRecords: number;\n}\n","import { BaseEntity } from '../entities/base-entity';\n\nexport class PrimengOption extends BaseEntity {\n label?: string;\n code?: any; // Can't be value: https://github.com/primefaces/primeng/issues/17332#issuecomment-2922861294\n\n constructor({\n label,\n code,\n }: {\n label?: string;\n code?: any;\n } = {}) {\n super();\n\n this.label = label;\n this.code = code;\n }\n\n static readonly typeName = 'PrimengOption' as const;\n}\n","import { BaseEntity } from '../entities/base-entity';\n\n// FT HACK: Fake class, because of api imports\nexport class SimpleSaveResult extends BaseEntity {\n id?: string;\n\n constructor({\n id,\n }: {\n id?: string;\n } = {}) {\n super();\n\n this.id = id;\n }\n\n static typeName = 'SimpleSaveResult' as const;\n}\n","export enum SecurityPermissionCodes {\n ReadUser = 'ReadUser',\n UpdateUser = 'UpdateUser',\n InsertUser = 'InsertUser',\n DeleteUser = 'DeleteUser',\n ReadRole = 'ReadRole',\n UpdateRole = 'UpdateRole',\n InsertRole = 'InsertRole',\n DeleteRole = 'DeleteRole',\n ReadPermission = 'ReadPermission',\n UpdatePermission = 'UpdatePermission',\n InsertPermission = 'InsertPermission',\n DeletePermission = 'DeletePermission',\n}\n","export enum VerificationTypeCodes {\n Login = 0,\n Registration = 1,\n}\n","import { Injectable } from '@angular/core';\nimport { CanActivate, Router } from '@angular/router';\nimport { Observable, filter, map, take } from 'rxjs';\nimport { AuthServiceBase } from '../services/auth.service.base';\nimport { ConfigServiceBase } from '../services/config.service.base';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthGuard implements CanActivate {\n constructor(\n private authService: AuthServiceBase,\n private router: Router,\n private config: ConfigServiceBase,\n ) {}\n\n canActivate(): Observable<boolean> {\n return this.checkAuth();\n }\n\n private checkAuth(): Observable<boolean> {\n return this.authService.user$.pipe(\n filter((user) => user !== undefined), // wait until the session is resolved (undefined = still loading)\n take(1),\n map((user) => {\n if (user) {\n return true;\n }\n this.router.navigate([this.config.loginSlug]);\n return false;\n }),\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CanActivate } from '@angular/router';\nimport { Observable, filter, map, take } from 'rxjs';\nimport { AuthServiceBase } from '../services/auth.service.base';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NotAuthGuard implements CanActivate {\n constructor(private authService: AuthServiceBase) {}\n\n canActivate(): Observable<boolean> {\n return this.checkAuth();\n }\n\n private checkAuth(): Observable<boolean> {\n return this.authService.user$.pipe(\n filter((user) => user !== undefined), // wait until the session is resolved (undefined = still loading)\n take(1),\n map((user) => {\n if (user) {\n this.authService.navigateToDashboard();\n return false;\n }\n return true;\n }),\n );\n }\n}\n","import { TranslocoService } from '@jsverse/transloco';\nimport { ErrorHandler, Injectable } from '@angular/core';\nimport { SpiderlyMessageService } from '../services/spiderly-message.service';\nimport { HttpErrorResponse } from '@angular/common/http';\n\n/**\n * The app's global {@link ErrorHandler}: logs the error and shows the generic error toast. HTTP\n * errors are skipped entirely — `unauthorizedInterceptor` owns them end to end and has already\n * logged the failed request and shown the message matched to its status.\n *\n * Logging is unconditional, production included. The toast tells the user the team was notified,\n * and unless the app wires an error tracker this line is the only place the error exists — so\n * staying quiet in production left a deployed app with a red toast and nothing to open. The\n * console is a developer surface; a user never sees it.\n *\n * An error tracker plugs in by providing an `ErrorHandler` that reports and then delegates here,\n * which keeps this class's toast copy true (see the PACMS admin's `AdminErrorHandler`).\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class SpiderlyErrorHandler implements ErrorHandler {\n constructor(\n private messageService: SpiderlyMessageService,\n private translocoService: TranslocoService,\n ) {}\n\n handleError(error: any): void {\n if (error instanceof HttpErrorResponse) return;\n\n console.error(error);\n\n this.messageService.errorMessage(\n this.translocoService.translate('UnexpectedErrorDetails'),\n this.translocoService.translate('UnexpectedErrorTitle'),\n );\n }\n}\n","import { HttpEvent, HttpInterceptorFn } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { NgxSpinnerService } from 'ngx-spinner';\nimport { Observable, finalize } from 'rxjs';\n\nexport const httpLoadingInterceptor: HttpInterceptorFn = (req, next) => {\n const spinner = inject(NgxSpinnerService);\n\n const shouldSkipSpinner = req.params.has('X-Skip-Spinner'); // Using this for multiautocomplete, autocomplete, dropdown, table etc...\n\n if (!shouldSkipSpinner) spinner.show();\n\n return next(req).pipe(\n finalize(() => {\n if (!shouldSkipSpinner) {\n spinner.hide();\n }\n }),\n ) as Observable<HttpEvent<any>>;\n};\n","import {\n HttpEvent,\n HttpResponse,\n HttpInterceptorFn,\n HttpRequest,\n HttpParams,\n} from '@angular/common/http';\nimport { tap } from 'rxjs';\n\nexport const jsonHttpInterceptor: HttpInterceptorFn = (req, next) => {\n const cleanedBody = getCleanRequestBody(req.body);\n const clonedRequest: HttpRequest<any> = req.clone({\n body: cleanedBody,\n });\n\n return next(clonedRequest).pipe(\n tap((event: HttpEvent<any>) => {\n if (event instanceof HttpResponse) {\n convertToDate(event.body);\n }\n }),\n );\n};\n\nconst getCleanRequestBody = (obj: unknown): unknown => {\n if (\n obj === null ||\n obj === undefined ||\n obj instanceof FormData ||\n obj instanceof Blob ||\n obj instanceof File ||\n obj instanceof ArrayBuffer\n ) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => getCleanRequestBody(item));\n }\n\n if (obj instanceof Date) {\n return obj.toISOString();\n }\n\n if (typeof obj === 'object') {\n const newObj: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n newObj[key] = getCleanRequestBody((obj as any)[key]);\n }\n return newObj;\n }\n\n return obj;\n};\n\n/**\n * @see https://stackoverflow.com/a/54733846/1306679\n */\nconst convertToDate = (\n object: unknown,\n parent?: Record<string, unknown> | unknown[],\n key?: number | string,\n) => {\n if (object === null) return;\n\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/;\n\n if (typeof object === 'string') {\n if (dateRegex.test(object)) {\n const date = new Date(object);\n parent[key] = date;\n }\n } else if (Array.isArray(object)) {\n for (let i = 0; i < object.length; i++) convertToDate(object[i], object, i);\n } else {\n for (const key of Object.keys(object as Record<string, unknown>)) {\n convertToDate(\n (object as Record<string, unknown>)[key],\n object as Record<string, unknown>,\n key,\n );\n }\n }\n};\n","import { inject } from '@angular/core';\nimport { HttpInterceptorFn } from '@angular/common/http';\nimport { ConfigServiceBase } from '../services/config.service.base';\n\n// Cookie-based auth: the session JWTs are HttpOnly cookies, so we just send credentials on API calls.\n// The browser attaches/refreshes the cookies; JS never holds the tokens (XSS-safe).\n//\n// CSRF: state-changing requests (POST/PUT/DELETE/PATCH) authenticated via cookie must include the\n// X-CSRF header, otherwise Spiderly.Shared/Attributes/AuthGuardAttribute.cs returns 403 Forbidden\n// (the server-side check was added in commit 92f238d but the matching client-side header was never\n// emitted, so every cookie-authed write was failing in the admin). The check is presence-only —\n// any non-empty value works — and the protection comes from the fact that a cross-origin form\n// submission cannot set custom request headers without a CORS preflight.\nconst SAFE_HTTP_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);\n\nexport const jwtInterceptor: HttpInterceptorFn = (req, next) => {\n const config = inject(ConfigServiceBase);\n\n const isApiUrl = req.url.startsWith(config.apiUrl);\n if (isApiUrl) {\n const isStateChanging = !SAFE_HTTP_METHODS.has(req.method.toUpperCase());\n req = req.clone({\n withCredentials: true,\n ...(isStateChanging && { setHeaders: { 'X-CSRF': '1' } }),\n });\n }\n\n return next(req);\n};\n","import {\n HttpErrorResponse,\n HttpInterceptorFn,\n HttpRequest,\n} from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { ApiErrorCodes } from '../errors/api-error-codes';\nimport { AuthServiceBase } from '../services/auth.service.base';\nimport { SpiderlyMessageService } from '../services/spiderly-message.service';\n\n/**\n * Owns cross-cutting HTTP-error UX: shows the right message and, on an expired session, clears auth — then\n * RETHROWS. Errors stay errors: callers run only their success path, and an unhandled HttpErrorResponse that\n * reaches the global ErrorHandler is intentionally ignored there (HTTP-error UX lives here). This interceptor\n * must never convert an error into a value — doing so makes callers treat failures as data.\n */\nexport const unauthorizedInterceptor: HttpInterceptorFn = (req, next) => {\n const messageService = inject(SpiderlyMessageService);\n const translocoService = inject(TranslocoService);\n const authService = inject(AuthServiceBase);\n\n const reactToError = (err: HttpErrorResponse, request: HttpRequest<any>): void => {\n // Unconditional, production included, and the only log for a failed request (the global\n // ErrorHandler skips HTTP errors): the toast the user gets is deliberately vague, so this is\n // where a developer reads which request failed and how. See SpiderlyErrorHandler for why\n // silence in production cost more than the console noise saves. The summary leads because an\n // HttpErrorResponse on its own stringifies to \"[object HttpErrorResponse]\" in an error\n // tracker's console breadcrumb; the object still follows, to expand in devtools.\n console.error(`HTTP ${err.status} ${request.method} ${request.url}`, err);\n\n // TODO: type this as an ApiError interface (TS mirror of ApiErrorDTO, next to errors/api-error-codes.ts)\n // so message/errorCode/traceId reads of the cross-language contract are compile-checked, not conventional.\n let errorResponse = err.error;\n if (request.responseType !== 'json' && typeof err.error === 'string') {\n try {\n errorResponse = JSON.parse(err.error);\n } catch {\n errorResponse = null;\n }\n }\n\n // ApiErrorDTO.traceId is present only on reportable errors, so this is a no-op everywhere else —\n // the server decides which responses carry a support reference, never this status-code chain.\n const withReference = (detail: string): string =>\n errorResponse?.traceId\n ? `${detail} ${translocoService.translate('ErrorReference', { traceId: errorResponse.traceId })}`\n : detail;\n\n if (err.status === 0) {\n // Server unreachable; defer so the message isn't lost during a shutdown/refresh race.\n setTimeout(() => {\n messageService.warningMessage(\n withReference(translocoService.translate('ServerLostConnectionDetails')),\n translocoService.translate('ServerLostConnectionTitle'),\n );\n }, 100);\n } else if (err.status === 400) {\n messageService.warningMessage(\n withReference(errorResponse?.message ?? translocoService.translate('BadRequestDetails')),\n translocoService.translate('Warning'),\n );\n } else if (err.status === 401) {\n if (errorResponse?.errorCode === ApiErrorCodes.InvalidToken) {\n authService.clearSession(); // expired/invalid session — drop it; guards send the user to login\n } else {\n messageService.warningMessage(\n withReference(errorResponse?.message ?? translocoService.translate('LoginRequired')),\n translocoService.translate('Warning'),\n );\n }\n } else if (err.status === 403) {\n messageService.warningMessage(\n withReference(translocoService.translate('PermissionErrorDetails')),\n translocoService.translate('PermissionErrorTitle'),\n );\n } else if (err.status === 404) {\n messageService.warningMessage(\n withReference(translocoService.translate('NotFoundDetails')),\n translocoService.translate('NotFoundTitle'),\n );\n } else {\n messageService.errorMessage(\n withReference(translocoService.translate('UnexpectedErrorDetails')),\n translocoService.translate('UnexpectedErrorTitle'),\n );\n }\n };\n\n return next(req).pipe(\n catchError((err: HttpErrorResponse) => {\n reactToError(err, req);\n return throwError(() => err);\n }),\n );\n};\n","import { Observable, of } from 'rxjs';\nimport { AuthServiceBase } from './auth.service.base';\nimport { AuthResult } from '../entities/security-entities';\nimport { isPlatformBrowser } from '@angular/common';\n\nexport function authInitializer(\n authService: AuthServiceBase,\n platformId,\n): () => Observable<AuthResult> {\n if (isPlatformBrowser(platformId)) {\n return () => {\n authService.captureExternalAuthError(); // before the router can strip ?externalAuthError on the /login redirect\n return authService.refreshToken();\n };\n }\n return () => {\n return of();\n };\n}\n","import { ConfigServiceBase } from './config.service.base';\nimport { Injectable } from '@angular/core';\nimport { TranslocoLoader } from '@jsverse/transloco';\nimport { HttpClient } from '@angular/common/http';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SpiderlyTranslocoLoader implements TranslocoLoader {\n constructor(\n private http: HttpClient,\n private config: ConfigServiceBase,\n ) {}\n\n getTranslation(lang: string) {\n return this.http.get(`${this.config.frontendUrl}/assets/i18n/${lang}.json`);\n }\n}\n","import { Directive, Input } from '@angular/core';\n\n@Directive({\n selector: '[templateType]',\n})\nexport class SpiderlyTemplateTypeDirective<T> {\n @Input() templateType?: T;\n\n static ngTemplateContextGuard<T>(\n dir: SpiderlyTemplateTypeDirective<T>,\n ctx: unknown,\n ): ctx is T {\n return true;\n }\n}\n","/*\n * Public API Surface of spiderly\n */\n\nexport * from './lib/errors/api-error-codes';\nexport * from './lib/controls/base-autocomplete-control';\nexport * from './lib/controls/base-control';\nexport * from './lib/controls/base-dropdown-control';\nexport * from './lib/controls/spiderly-autocomplete/spiderly-autocomplete.component';\nexport * from './lib/controls/spiderly-calendar/spiderly-calendar.component';\nexport * from './lib/controls/spiderly-checkbox/spiderly-checkbox.component';\nexport * from './lib/controls/spiderly-colorpicker/spiderly-colorpicker.component';\nexport * from './lib/controls/spiderly-controls.module';\nexport * from './lib/controls/spiderly-dropdown/spiderly-dropdown.component';\nexport * from './lib/controls/spiderly-editor/spiderly-editor.component';\nexport * from './lib/controls/spiderly-markdown/spiderly-markdown.component';\nexport * from './lib/controls/spiderly-file/spiderly-file.component';\nexport * from './lib/controls/spiderly-multiautocomplete/spiderly-multiautocomplete.component';\nexport * from './lib/controls/spiderly-multiselect/spiderly-multiselect.component';\nexport * from './lib/controls/spiderly-number/spiderly-number.component';\nexport * from './lib/controls/spiderly-password/spiderly-password.component';\nexport * from './lib/controls/spiderly-textarea/spiderly-textarea.component';\nexport * from './lib/controls/spiderly-textbox/spiderly-textbox.component';\n\nexport * from './lib/components/auth/auth-card/auth-card.component';\nexport * from './lib/components/auth/external-provider-icons';\nexport * from './lib/components/auth/external-login/external-login.component';\nexport * from './lib/components/auth/login/login.component';\nexport * from './lib/components/auth/partials/login-verification.component';\nexport * from './lib/components/auth/partials/verification-wrapper.component';\nexport * from './lib/components/base-form/base-form.component';\nexport * from './lib/components/card-skeleton/card-skeleton.component';\nexport * from './lib/components/index-card/index-card.component';\nexport * from './lib/components/info-card/info-card.component';\nexport * from './lib/components/layout/layout.component';\nexport * from './lib/components/layout/profile-avatar/profile-avatar.component';\nexport * from './lib/components/layout/sidebar/menuitem.component';\nexport * from './lib/components/layout/sidebar/sidebar-menu.component';\nexport * from './lib/components/layout/sidebar/sidebar.component';\nexport * from './lib/components/layout/sidemenu-topbar/sidemenu-topbar.component';\nexport * from './lib/components/layout/topbar/topbar.component';\nexport * from './lib/components/not-found/not-found.component';\nexport * from './lib/components/required/required.component';\nexport * from './lib/components/spiderly-buttons/return-button/return-button.component';\nexport * from './lib/components/spiderly-buttons/spiderly-button-base/spiderly-button-base';\nexport * from './lib/components/spiderly-buttons/spiderly-button/spiderly-button.component';\nexport * from './lib/components/spiderly-buttons/spiderly-split-button/spiderly-split-button.component';\nexport * from './lib/components/spiderly-data-table/spiderly-data-table.component';\nexport * from './lib/directives/spiderly-filter-template.directive';\nexport * from './lib/directives/spiderly-overflow-title.directive';\nexport * from './lib/filters/allowed-operators';\nexport * from './lib/filters/filter-store';\nexport * from './lib/filters/spiderly-filter-bar.component';\nexport * from './lib/components/spiderly-data-view/spiderly-data-view.component';\nexport * from './lib/components/spiderly-delete-dialog/spiderly-delete-confirmation.component';\nexport * from './lib/components/spiderly-form-control/spiderly-form-control';\nexport * from './lib/components/spiderly-panels/panel-body/panel-body.component';\nexport * from './lib/components/spiderly-panels/panel-footer/panel-footer.component';\nexport * from './lib/components/spiderly-panels/panel-header/panel-header.component';\nexport * from './lib/components/spiderly-panels/spiderly-card/spiderly-card.component';\nexport * from './lib/components/spiderly-panels/spiderly-panel/spiderly-panel.component';\nexport * from './lib/components/spiderly-panels/spiderly-panels.module';\n\nexport * from './lib/entities/base-entity';\nexport * from './lib/entities/codebook';\nexport * from './lib/entities/editor-image-upload-result';\nexport * from './lib/entities/filter';\nexport * from './lib/entities/filter-rule';\nexport * from './lib/entities/filter-sort-meta';\nexport * from './lib/entities/image-dimensions-validation-result';\nexport * from './lib/entities/init-company-auth-dialog-details';\nexport * from './lib/entities/init-top-bar-data';\nexport * from './lib/entities/is-authorized-for-save-event';\nexport * from './lib/entities/last-menu-icon-index-clicked';\nexport * from './lib/entities/lazy-load-selected-ids-result';\nexport * from './lib/entities/menuchangeevent';\nexport * from './lib/entities/namebook';\nexport * from './lib/entities/paginated-result';\nexport * from './lib/entities/primeng-option';\nexport * from './lib/entities/security-entities';\nexport * from './lib/entities/simple-save-result';\nexport * from './lib/entities/spiderly-button';\n\nexport * from './lib/enums/match-mode-enum-codes';\nexport * from './lib/enums/security-enums';\nexport * from './lib/enums/verification-type-codes';\n\nexport * from './lib/guards/auth.guard';\nexport * from './lib/guards/not-auth.guard';\n\nexport * from './lib/handlers/spiderly-error-handler';\n\nexport * from './lib/interceptors/http-loading.interceptor';\nexport * from './lib/interceptors/json-parser.interceptor';\nexport * from './lib/interceptors/jwt.interceptor';\nexport * from './lib/interceptors/unauthorized.interceptor';\n\nexport * from './lib/services/api.service.security';\nexport * from './lib/services/app-initializer';\nexport * from './lib/services/app-layout.service.base';\nexport * from './lib/services/auth.service.base';\nexport * from './lib/services/base-form.service';\nexport * from './lib/services/config.service.base';\nexport * from './lib/services/helper-functions';\nexport * from './lib/services/spiderly-message.service';\nexport * from './lib/services/spiderly-transloco-loader';\nexport * from './lib/services/validator-abstract.service';\n\nexport * from './lib/directives/spiderly-cell-template.directive';\nexport * from './lib/directives/spiderly-data-table-actions.directive';\nexport * from './lib/directives/template-type.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.ValidatorAbstractService","i5","i4","i2","i3","i1","i2.SpiderlyMessageService","i3.ValidatorAbstractService","i6","i2.ConfigServiceBase","map","i1.AuthServiceBase","i1.ConfigServiceBase","i2.AuthServiceBase","i3.ApiSecurityService","i1.ValidatorAbstractService","i5.BaseFormService","i8.PanelHeaderComponent","i9.PanelBodyComponent","i10.PanelFooterComponent","i11.SpiderlyPanelComponent","i12","i6.AuthServiceBase","i7","i8.SpiderlyTextboxComponent","i9.SpiderlyButtonComponent","i3.PanelHeaderComponent","i4.PanelBodyComponent","i5.SpiderlyPanelComponent","i1.ApiSecurityService","i3.AuthServiceBase","i1.LayoutServiceBase","i3.SidebarMenuService","i4.AuthServiceBase","i5.ApiSecurityService","i6.ConfigServiceBase","i8.SpiderlyAutocompleteComponent","i4.ConfigServiceBase","filter","i5.ConfigServiceBase","i3.ConfigServiceBase","i9","i8.SpiderlyButtonComponent","i9.SpiderlyNumberComponent","i13","i14","i15","i4.SpiderlyButtonComponent","i1.SpiderlyMessageService","finalize","tap"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAGG;AACU,MAAA,aAAa,GAAG;AAC3B,IAAA,YAAY,EAAE,eAAe;AAC7B,IAAA,gBAAgB,EAAE,mBAAmB;AACrC,IAAA,eAAe,EAAE,kBAAkB;AACnC,IAAA,mBAAmB,EAAE,uBAAuB;AAC5C,IAAA,mBAAmB,EAAE,sBAAsB;AAC3C,IAAA,gBAAgB,EAAE,oBAAoB;AACtC,IAAA,6BAA6B,EAAE,kCAAkC;AACjE,IAAA,oBAAoB,EAAE,wBAAwB;AAC9C,IAAA,kBAAkB,EAAE,sBAAsB;AAC1C,IAAA,gBAAgB,EAAE,oBAAoB;AACtC,IAAA,gBAAgB,EAAE,oBAAoB;;;MCL3B,WAAW,CAAA;AActB,IAAA,WAAA,CAAsB,gBAAkC,EAAA;QAAlC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAZ7B,IAAQ,CAAA,QAAA,GAAY,KAAK;;QAEzB,IAAS,CAAA,SAAA,GAAY,IAAI;;QAEzB,IAAY,CAAA,YAAA,GAAY,IAAI;AAC5B,QAAA,IAAA,CAAA,KAAK,GAAW,IAAI,CAAC;AACrB,QAAA,IAAA,CAAA,YAAY,GAAY,IAAI,CAAC;QAC7B,IAAW,CAAA,WAAA,GAAW,EAAE;;QAExB,IAAW,CAAA,WAAA,GAAY,KAAK;QAC5B,IAAW,CAAA,WAAA,GAAW,IAAI;QAC1B,IAAW,CAAA,WAAA,GAAW,mBAAmB;;IAGlD,QAAQ,GAAA;QACN,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;;AAG3E,IAAA,eAAe;AAEf;;;;;;;;;;AAUG;IACH,kBAAkB,GAAA;QAChB,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,eAAe;;IAGpD,2BAA2B,GAAA;AACzB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE;;;YAG/C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;;AAGjC,QAAA,OAAO,IAAI;;+GA5CF,WAAW,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAX,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,WAAW,mVAJZ,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,CAAA;;4FAID,WAAW,EAAA,UAAA,EAAA,CAAA;kBANvB,SAAS;+BACE,cAAc,EAAA,QAAA,EACd,EAAE,EAAA,UAAA,EAEA,KAAK,EAAA;qFAGR,OAAO,EAAA,CAAA;sBAAf;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBAEQ,SAAS,EAAA,CAAA;sBAAjB;gBAEQ,YAAY,EAAA,CAAA;sBAApB;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,YAAY,EAAA,CAAA;sBAApB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBAEQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;;;ACXG,MAAO,mBAAoB,SAAQ,WAAW,CAAA;AASlD,IAAA,WAAA,CAA+B,gBAAkC,EAAA;QAC/D,KAAK,CAAC,gBAAgB,CAAC;QADM,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;;QANtC,IAAS,CAAA,SAAA,GAAY,KAAK;QAC1B,IAAS,CAAA,SAAA,GAAW,kBAAkB;QAC7B,IAAW,CAAA,WAAA,GAC3B,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,mBAAmB,CAAC;AAC5C,QAAA,IAAA,CAAA,aAAa,GAAuB,IAAI,YAAY,EAAE;;IAMhE,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;;IAG5B,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;;+GAlBpB,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,kQAJpB,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,CAAA;;4FAID,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;+BACE,uBAAuB,EAAA,QAAA,EACvB,EAAE,EAAA,UAAA,EAEA,KAAK,EAAA;qFAGR,OAAO,EAAA,CAAA;sBAAf;gBAEQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBACiB,WAAW,EAAA,CAAA;sBAA5B;gBAES,aAAa,EAAA,CAAA;sBAAtB;;;ACTG,MAAO,uBAAwB,SAAQ,mBAAmB,CAAA;AANhE,IAAA,WAAA,GAAA;;AAOY,QAAA,IAAA,CAAA,WAAW,GACnB,IAAI,YAAY,EAAE;AACrB;+GAHY,uBAAuB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,sJAJxB,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,CAAA;;4FAID,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBANnC,SAAS;+BACE,2BAA2B,EAAA,QAAA,EAC3B,EAAE,EAAA,UAAA,EAEA,KAAK,EAAA;8BAGP,WAAW,EAAA,CAAA;sBAApB;;;MCHU,iBAAiB,CAAA;AAC5B,IAAA,WAAA,GAAA;+GADW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,oECR9B,yDACA,EAAA,CAAA,CAAA;;4FDOa,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,cAGR,IAAI,EAAA,QAAA,EAAA,yDAAA,EAAA;;;AEalB;AACM,MAAO,mBAA6B,SAAQ,WAAc,CAAA;AAc9D,IAAA,WAAA,CACE,KAAU,EACV,IAAA,GAA2B,IAAI,EAC/B,WAAoB,KAAK,EAAA;QAEzB,IAAI,GAAG,IAAI,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE;AACnC,QAAA,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC;AAClB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;;IAGjB,WAAW,GAAA;;AAElB,QAAA,OAAO,KAAK,CAAC,WAAW,EAAO;;AAGjC,IAAA,IAAoB,SAAS,GAAA;QAC3B,OAAO,IAAI,CAAC,kBAAkB;;IAGhC,IAAoB,SAAS,CAAC,SAAqC,EAAA;AACjE,QAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS;AACnC,QAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;;AAEhC;AAcK,MAAO,iBAAgC,SAAQ,SAAS,CAAA;AAG5D,IAAA,WAAA,CAAY,QAAwC,EAAA;QAClD,KAAK,CAAC,QAAQ,CAAC;AASV,QAAA,IAAA,CAAA,UAAU,GAAW,MAAM,CAAC,UAAU,EAAE;;QAIxC,IAAoB,CAAA,oBAAA,GAAc,EAAE;AAEpC,QAAA,IAAA,CAAA,UAAU,GAAG,CAClB,eAAqB,KACmB;AACxC,YAAA,IACE,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,eAAe,CAAC,KAAK,CAAC,CAAC;AAExE,gBAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC;YAEjD,IAAI,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;AAChD,YAAA,IAAI,WAAW,IAAI,IAAI,EAAE;AACvB,gBAAA,OAAO,CAAC,KAAK,CACX,CAAA,uBAAA,EAA0B,eAAe,CAAA,mBAAA,EAAsB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAA,cAAA,CAAgB,CACzG;AACD,gBAAA,OAAO,IAAI;;AAGb,YAAA,OAAO,WAAW;AACpB,SAAC;;IA7BQ,WAAW,GAAA;;AAElB,QAAA,OAAO,KAAK,CAAC,WAAW,EAAY;;AA4BvC;AAEK,MAAO,iBAEX,SAAQ,SAAS,CAAA;AACjB,IAAA,WAAA,CACE,QAA0C,EAClC,gBAAkC,EAClC,eAAgC,EAAA;QAExC,KAAK,CAAC,QAAQ,CAAC;QAHP,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAChB,IAAe,CAAA,eAAA,GAAf,eAAe;QASlB,IAAsB,CAAA,sBAAA,GAAoB,EAAE;QAI5C,IAAyB,CAAA,yBAAA,GAAG,MAAK;AACtC,YAAA,IAAI,sBAAsB,GAAe;AACvC,gBAAA;oBACE,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC;AAChD,oBAAA,IAAI,EAAE,aAAa;oBACnB,OAAO,EAAE,MAAK;wBACZ,IAAI,CAAC,eAAe,CAAC,iCAAiC,CACpD,IAAI,EACJ,IAAI,CAAC,wBAAwB,CAC9B;qBACF;AACF,iBAAA;AACD,gBAAA;oBACE,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC;AAClD,oBAAA,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,MAAK;AACZ,wBAAA,IAAI,CAAC,eAAe,CAAC,0BAA0B,CAC7C,IAAI,EACJ,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,sBAAsB,EAC3B,IAAI,CAAC,wBAAwB,CAC9B;qBACF;AACF,iBAAA;AACD,gBAAA;oBACE,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC;AAClD,oBAAA,IAAI,EAAE,kBAAkB;oBACxB,OAAO,EAAE,MAAK;wBACZ,IAAI,CAAC,eAAe,CAAC,0BAA0B,CAC7C,IAAI,EACJ,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,sBAAsB,EAC3B,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAClC;qBACF;AACF,iBAAA;aACF;AAED,YAAA,OAAO,sBAAsB;AAC/B,SAAC;AAEM,QAAA,IAAA,CAAA,eAAe,GAAG,CAAC,KAAa,KAAI;AACzC,YAAA,IAAI,CAAC,eAAe,CAAC,0BAA0B,CAC7C,IAAI,EACJ,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,sBAAsB,EAC3B,KAAK,CACN;AACH,SAAC;QAEM,IAAa,CAAA,aAAA,GAAG,MAAK;YAC1B,OAAO,IAAI,CAAC,QAAuC;AACrD,SAAC;;IAED,sBAAsB,GAAA;QACpB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,yBAA4C,KAAI;AACrE,YAAA,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;gBAC9D,yBAAyB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE;AACnD,aAAC,CAAC;AACJ,SAAC,CAAC;;IAGJ,qBAAqB,GAAA;QACnB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,yBAA4C,KAAI;AACrE,YAAA,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;gBAC9D,yBAAyB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;AAClD,aAAC,CAAC;AACJ,SAAC,CAAC;;AAEL;;MCzLqB,wBAAwB,CAAA;AAC5C,IAAA,WAAA,CAAsB,gBAAkC,EAAA;QAAlC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;AAyDtC,QAAA,IAAA,CAAA,QAAQ,GAAG,CAAC,OAA4B,KAAU;YAChD,MAAM,SAAS,GAAwB,MAA8B;AACnE,gBAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK;AAE3B,gBAAA,MAAM,YAAY,GAChB,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;gBAEhE,MAAM,UAAU,GAAG,YAAY;AAE/B,gBAAA,OAAO;AACL,sBAAE;AACF,sBAAE,EAAE,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;AACxD,aAAC;AACD,YAAA,SAAS,CAAC,eAAe,GAAG,IAAI;AAChC,YAAA,OAAO,CAAC,QAAQ,GAAG,IAAI;AACvB,YAAA,OAAO,CAAC,SAAS,GAAG,SAAS;YAC7B,OAAO,CAAC,sBAAsB,EAAE;AAClC,SAAC;;AAGD,QAAA,IAAA,CAAA,gBAAgB,GAAG,CAAC,OAA0B,KAAU;YACtD,MAAM,SAAS,GAAwB,MAA8B;gBACnE,MAAM,KAAK,GAAG,OAAO;AAErB,gBAAA,MAAM,YAAY,GAChB,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAEtE,MAAM,UAAU,GAAG,YAAY;AAE/B,gBAAA,OAAO;AACL,sBAAE;AACF,sBAAE;wBACE,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,mBAAmB,EAAE;4BACtD,KAAK,EAAE,OAAO,CAAC,eAAe;yBAC/B,CAAC;qBACH;AACP,aAAC;AACD,YAAA,SAAS,CAAC,eAAe,GAAG,IAAI;AAChC,YAAA,OAAO,CAAC,QAAQ,GAAG,IAAI;AACvB,YAAA,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC;YAChC,OAAO,CAAC,sBAAsB,EAAE;AAClC,SAAC;;AAGD,QAAA,IAAA,CAAA,YAAY,GAAG,CAAC,OAA4B,KAAyB;YACnE,MAAM,SAAS,GAAwB,MAA8B;AACnE,gBAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK;AAE3B,gBAAA,MAAM,YAAY,GAChB,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAEtE,MAAM,UAAU,GAAG,YAAY;AAE/B,gBAAA,OAAO;AACL,sBAAE;AACF,sBAAE,EAAE,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;AACxD,aAAC;AACD,YAAA,SAAS,CAAC,eAAe,GAAG,IAAI;AAChC,YAAA,OAAO,CAAC,QAAQ,GAAG,IAAI;AACvB,YAAA,OAAO,SAAS;AAClB,SAAC;;AAzGD,IAAA,uBAAuB,CACrB,IAAU,EACV,UAAkB,EAClB,WAAmB,EAAA;AAEnB,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC7B,YAAA,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;YACvB,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AAE3C,YAAA,GAAG,CAAC,MAAM,GAAG,MAAK;AAChB,gBAAA,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC;AAC9B,gBAAA,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK;AACvB,gBAAA,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM;gBACzB,MAAM,MAAM,GAAa,EAAE;gBAE3B,IAAI,UAAU,GAAG,CAAC,IAAI,KAAK,KAAK,UAAU,EAAE;oBAC1C,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,uBAAuB,EAAE;AACvD,wBAAA,CAAC,EAAE,UAAU;AACb,wBAAA,CAAC,EAAE,KAAK;AACT,qBAAA,CAAC,CACH;;gBAGH,IAAI,WAAW,GAAG,CAAC,IAAI,MAAM,KAAK,WAAW,EAAE;oBAC7C,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,wBAAwB,EAAE;AACxD,wBAAA,CAAC,EAAE,WAAW;AACd,wBAAA,CAAC,EAAE,MAAM;AACV,qBAAA,CAAC,CACH;;AAGH,gBAAA,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AACnD,aAAC;AAED,YAAA,GAAG,CAAC,OAAO,GAAG,MAAK;AACjB,gBAAA,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC;gBAC9B,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACxC,aAAC;AAED,YAAA,GAAG,CAAC,GAAG,GAAG,SAAS;AACrB,SAAC,CAAC;;+GAvDgB,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,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,cAFhC,MAAM,EAAA,CAAA,CAAA;;4FAEE,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAH7C,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACmBK,MAAO,6BACX,SAAQ,uBAAuB,CAAA;IAY/B,WACqB,CAAA,gBAAkC,EAC7C,gBAA0C,EAAA;QAElD,KAAK,CAAC,gBAAgB,CAAC;QAHJ,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAC3B,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAXjB,IAAQ,CAAA,QAAA,GAAQ,MAAM;;QAEtB,IAAS,CAAA,SAAA,GAAY,IAAI;AAGlC,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,mBAAmB,CAAW,IAAI,EAAE;AAC1D,YAAA,QAAQ,EAAE,QAAQ;AACnB,SAAA,CAAC;;IASO,QAAQ,GAAA;QACf,KAAK,CAAC,QAAQ,EAAE;QAEhB,IAAI,CAAC,iBAAiB,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK;AACjD,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAChC,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,OAAO,CAAC,eAAe,CAC7B;AAED,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI;AAC5B,YAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;gBAC9B,WAAW,EAAE,IAAI,CAAC,WAAW;AAC7B,gBAAA,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;AACvB,aAAA,CAAC;AAEJ,QAAA,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE;YAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,cAAc,CAAC;;;AAIvE,IAAA,MAAM,CAAC,KAAgC,EAAA;AACrC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;;AAG9B,IAAA,MAAM,CAAC,KAA8B,EAAA;AACnC,QAAA,MAAM,cAAc,GAAa,KAAK,CAAC,KAAK;QAC5C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;AACxC,QAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;YAC9B,WAAW,EAAE,cAAc,CAAC,WAAW;YACvC,EAAE,EAAE,cAAc,CAAC,EAAE;AACtB,SAAA,CAAC;;IAGJ,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC;;IAGvC,uBAAuB,GAAA;QACrB,IAAI,CAAC,mBAAmB,EAAE;AAC1B,QAAA,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE;;+GA5D3B,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,wBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,4NC/B1C,ywCAmCA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDdI,mBAAmB,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,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,iDAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,OAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,cAAA,EAAA,MAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,WAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,YAAA,EAAA,YAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,QAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,OAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,IAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,SAAA,EAAA,QAAA,EAAA,QAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,qBAAqB,8BACrB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,iBAAiB,qDACjB,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGT,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAdzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAExB,OAAA,EAAA;wBACP,mBAAmB;wBACnB,WAAW;wBACX,kBAAkB;wBAClB,qBAAqB;wBACrB,gBAAgB;wBAChB,YAAY;wBACZ,iBAAiB;wBACjB,kBAAkB;AACnB,qBAAA,EAAA,QAAA,EAAA,ywCAAA,EAAA;yHAMQ,QAAQ,EAAA,CAAA;sBAAhB;gBAEQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,YAAY,EAAA,CAAA;sBAApB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;;;AEvBH;AACM,SAAU,sBAAsB,CACpC,KAAU,EACV,SAAiB,EACjB,KAAa,EACb,mBAA4B,EAAA;IAE5B,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK;AAC3C,IAAA,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9D,IAAA,IAAI,WAAW,CAAC,MAAM,GAAG,SAAS,GAAG,KAAK;AAAE,QAAA,OAAO,KAAK;AACxD,IAAA,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,KAAK;AAAE,QAAA,OAAO,KAAK;AAC3D,IAAA,IACE,CAAC,mBAAmB;QACpB,WAAW;QACX,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,KAAK;AAE7C,QAAA,OAAO,KAAK;AACd,IAAA,OAAO,IAAI;AACb;AAEM,SAAU,sBAAsB,CAAC,QAAgB,EAAA;IACrD,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,0BAA0B;AAC7D;AAEgB,SAAA,WAAW,CAAC,KAAa,EAAE,OAAe,EAAA;IACxD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACzC,QAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC;;AAG3C,IAAA,IAAI,CAAS,EAAE,CAAS,EAAE,CAAS;AACnC,IAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,QAAA,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AACnC,QAAA,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AACnC,QAAA,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;;SAC9B;AACL,QAAA,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACrC,QAAA,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACrC,QAAA,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;;AAGvC,IAAA,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,OAAe,KAAY;QACxD,MAAM,MAAM,GAAG,CAAC,OAAO,GAAG,GAAG,IAAI,GAAG;AACpC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC;AAC3D,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;AAC7B,KAAC;AAED,IAAA,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC;AACtB,IAAA,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC;AACtB,IAAA,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC;AAEtB,IAAA,MAAM,KAAK,GAAG,CAAC,KAAa,KAAY;AACtC,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAC/C,QAAA,OAAO,GAAG;AACZ,KAAC;AAED,IAAA,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE;AAC7C;AAEA;AACA;AACM,SAAU,kBAAkB,CAAC,CAAS,EAAA;IAC1C,MAAM,CAAC,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,IAAA,IAAI,CAAC,CAAC;AAAE,QAAA,OAAO,IAAI;IACnB,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C;AAEM,SAAU,yBAAyB,CAAC,YAAoB,EAAA;IAC5D,IAAI,YAAY,IAAI,IAAI;AAAE,QAAA,OAAO,IAAI;AAErC,IAAA,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC;IAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrC,IAAA,MAAM,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,CAAC;AACjD,IAAA,OAAO,CAAQ,KAAA,EAAA,QAAQ,CAAY,SAAA,EAAA,aAAa,EAAE;AACpD;AAIgB,SAAA,MAAM,CAAC,IAAS,EAAE,IAAU,EAAA;IAC1C,OAAO,IAAI,IAAI,IAAI;AACrB;AACM,SAAU,MAAM,CACpB,WAAoB,EAAA;IAEpB,OAAO,WAAW,CAAC,IAAI;AACzB;AAEM,SAAU,YAAY,CAAC,UAAkB,EAAA;IAC7C,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC;IACzC,WAAW,CAAC,GAAG,EAAE;IACjB,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;AACvC,IAAA,OAAO,SAAS;AAClB;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEM,SAAU,QAAQ,CAAC,gBAAwB,EAAA;AAC/C,IAAA,MAAM,MAAM,GAAa;QACvB,QAAQ;QACR,SAAS;QACT,MAAM;QACN,OAAO;QACP,KAAK;QACL,KAAK;QACL,KAAK;QACL,QAAQ;QACR,WAAW;QACX,SAAS;QACT,UAAU;QACV,UAAU;KACX;IAED,IAAI,gBAAgB,GAAG,CAAC,IAAI,gBAAgB,GAAG,EAAE,EAAE;AACjD,QAAA,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC;;AAGvE,IAAA,OAAO,MAAM,CAAC,gBAAgB,GAAG,CAAC,CAAC;AACrC;AAEgB,SAAA,eAAe,CAC7B,KAAU,EACV,SAA+B,EAAA;IAE/B,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC;AACxC,IAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACvB,QAAA,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC;;AAEtE,IAAA,OAAO,QAAQ,CAAC,CAAC,CAAC;AACpB;AAEgB,SAAA,UAAU,CAAC,IAAc,EAAE,MAAc,EAAA;AACvD,IAAA,MAAM,aAAa,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC;IACrE,IAAI,aAAa,EAAE;QACjB,aAAa,CAAC,OAAO,GAAG,CAAC,GAAG,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC;;AAE9D;AAEgB,SAAA,YAAY,CAAC,IAAc,EAAE,WAAmB,EAAA;AAC9D,IAAA,MAAM,aAAa,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC;AAErE,IAAA,IAAI,aAAa,IAAI,aAAa,CAAC,OAAO,EAAE;AAC1C,QAAA,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,SAAS,CAC3C,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,WAAW,CAC/B;AACD,QAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YAChB,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;;;AAG5C;AAEgB,SAAA,iCAAiC,CAC/C,IAAwB,EACxB,WAAmB,EAAA;AAEnB,IAAA,IAAI,QAAQ;AACZ,IAAA,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE;QACnE,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;QACjD,IAAI,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;AACpC,QAAA,IAAI,KAAK,IAAI,CAAC,CAAC,EAAE;YACf,IAAI,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;YACjC,QAAQ;gBACN,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;AACtE,YAAA,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;;IAG3C,OAAO,QAAQ,IAAI,WAAW;AAChC;AAEM,SAAU,sBAAsB,CAAI,KAAU,EAAA;AAClD,IAAA,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAE9D,IAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;QACzB,OAAO,CAAA,EAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAQ,KAAA,EAAA,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA,CAAE;;SAClF;AACL,QAAA,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE;;AAE9B;AAEM,SAAU,eAAe,CAAC,QAAgB,EAAA;AAC9C,IAAA,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AACjC,QAAA,OAAO,IAAI;;AAGb,IAAA,OAAO,KAAK;AACd;AAEM,SAAU,eAAe,CAAC,QAAgB,EAAA;AAC9C,IAAA,IACE,QAAQ;QACN,mEAAmE;QACrE,QAAQ,KAAK,0BAA0B,EACvC;AACA,QAAA,OAAO,IAAI;;AAGb,IAAA,OAAO,KAAK;AACd;AAEgB,SAAA,kBAAkB,CAChC,GAAuB,EACvB,YAAoB,EAAA;AAEpB,IAAA,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,EAAE;QACrB;;IAEF,IAAI,QAAQ,GAAG,iCAAiC,CAAC,GAAG,EAAE,YAAY,CAAC;AACnE,IAAA,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AAC1D;AAEgB,SAAA,iBAAiB,CAC/B,iCAAsE,EACtE,MAAc,EAAA;IAEd,iCAAiC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,KAAI;AAC1D,QAAA,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,CAAC;AAC7C,KAAC,CAAC;AACJ;AAEM,SAAU,yBAAyB,CACvC,YAAwB,EAAA;IAExB,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACxE;AAEA;;;;;AAKG;AACG,SAAU,gBAAgB,CAAC,YAAwB,EAAA;IACvD,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACzE;AAEgB,SAAA,iCAAiC,CAC/C,yBAE2B,EAC3B,cAAuB,EAAA;IAEvB,OAAO,yBAAyB,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,IAAI,CACxD,GAAG,CAAC,CAAC,GAAG,KAAK,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAC7C;AACH;AAEM,SAAU,iCAAiC,CAC/C,yBAAuD,EAAA;IAEvD,OAAO,yBAAyB,EAAE,CAAC,IAAI,CACrC,GAAG,CAAC,CAAC,GAAG,KAAI;QACV,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;KAChE,CAAC,CACH;AACH;AAEM,SAAU,qCAAqC,CACnD,6BAI2B,EAC3B,KAAa,EACb,KAAa,EACb,cAAuB,EAAA;AAEvB,IAAA,OAAO,6BAA6B,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,IAAI,CAAC,CAAC,CAAC,IAAI,CAC1E,GAAG,CAAC,CAAC,GAAG,KAAI;QACV,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;KAC9D,CAAC,CACH;AACH;SAEgB,qCAAqC,CACnD,6BAG2B,EAC3B,KAAa,EACb,KAAa,EAAA;AAEb,IAAA,OAAO,6BAA6B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,CACrD,GAAG,CAAC,CAAC,GAAG,KAAI;QACV,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;KAChE,CAAC,CACH;AACH;AAEa,MAAA,aAAa,GAAG,CAAC,KAAa,KAAI;IAC7C,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE;AACjC,QAAA,OAAO,IAAI;;AAGb,IAAA,OAAO,KAAK;AACd;AAEa,MAAA,WAAW,GAAG,CAAC,IAAmB,KAAY;AACzD,IAAA,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;IAEtD,IAAI,GAAG,EAAE;QACP,OAAO,GAAG,CAAC,EAAE;;SACR;AACL,QAAA,OAAO,IAAI;;AAEf;AAEM,SAAU,gBAAgB,CAAC,KAAa,EAAA;AAC5C,IAAA,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACvD;AAEM,SAAU,eAAe,CAAC,KAAa,EAAA;IAC3C,MAAM,KAAK,GAAG,wBAAwB;IACtC,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACrC;AAEM,SAAU,mBAAmB,CAAC,GAAW,EAAA;AAC7C,IAAA,IAAI,CAAC,GAAG;AAAE,QAAA,OAAO,GAAG;AACpB,IAAA,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD;AAEM,SAAU,gBAAgB,CAAC,KAAa,EAAA;AAC5C,IAAA,OAAO;SACJ,KAAK,CAAC,GAAG;SACT,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;SAC1D,IAAI,CAAC,GAAG,CAAC;AACd;MAEa,SAAS,GAAG,MAAM,CAAC,OAAO;AAEvB,SAAA,WAAW,CAAC,MAAW,EAAE,WAAmB,EAAA;AAC1D,IAAA,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE;AAC1D,IAAA,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,GAAG,KAAK,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC;AACpE;AAEM,SAAU,kBAAkB,CAChC,IAAU,EAAA;AAEV,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AACvB,QAAA,GAAG,CAAC,MAAM,GAAG,MAAK;AAChB,YAAA,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;AACjD,YAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;AAC9B,SAAC;QACD,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AACrC,KAAC,CAAC;AACJ;AAEA;;;;AAIG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACM,SAAU,oCAAoC,CAAC,OAAoB,EAAA;AACvE,IAAA,MAAM,MAAM,GAAG,UAAU,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC;AACzE,IAAA,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC,GAAG,IAAI,MAAM;QAAE;IAEnD,OAAO,CAAC,cAAc,CAAC;AACrB,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,QAAQ,EAAE,SAAS;AACpB,KAAA,CAAC;AACJ;;ACpXM,MAAO,yBAA0B,SAAQ,WAAW,CAAA;AAWxD,IAAA,WAAA,CAA+B,gBAAkC,EAAA;QAC/D,KAAK,CAAC,gBAAgB,CAAC;QADM,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;;QATtC,IAAQ,CAAA,QAAA,GAAY,KAAK;QACzB,IAAQ,CAAA,QAAA,GAAY,KAAK;QACzB,IAAQ,CAAA,QAAA,GAAY,KAAK;AAElC,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,WAAW,CAAc,IAAI,CAAC;QAE5C,IAAO,CAAA,OAAA,GAAG,KAAK;QACf,IAAa,CAAA,aAAA,GAAmB,EAAE;;IAMjC,QAAQ,GAAA;QACf,KAAK,CAAC,QAAQ,EAAE;QAEhB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QAE9C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;AACvC,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAE7E,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;YACxC,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,gBAAA,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;SAC1C,CAAC,CACH;AACD,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;YAC9C,IAAI,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO;gBACvD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;iBAC/C,IAAI,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ;gBAC7D,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;SACpD,CAAC,CACH;AACD,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;YAChD,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,gBAAA,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;SACxC,CAAC,CACH;;IAGH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;;IAGpD,OAAO,CAAC,KAAW,EAAA;IAEnB,eAAe,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;;AAG/B,IAAA,cAAc,CAAC,CAAU,EAAA;AAC/B,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,IAAI,IAAI,EAAE;AACb,gBAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC;;iBAC9B,IAAI,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBACjD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;;iBAC/C,IAAI,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AACjD,gBAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;;AAC/C,iBAAA,IAAI,CAAC,YAAY,IAAI,EAAE;AAC5B,gBAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;;iBAC3B;AACL,gBAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC;;;gBAE7B;AACR,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;;;AAIhB,IAAA,YAAY,CAAC,CAAc,EAAA;AACjC,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,IAAI,IAAI,EAAE;AACb,gBAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;;AACtB,iBAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACxB,gBAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;;AACxC,iBAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACxB,gBAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;;iBACxC;AACL,gBAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;;;gBAElB;AACR,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;;;AAIhB,IAAA,aAAa,CAAC,CAAS,EAAA;QAC7B,MAAM,CAAC,GAAG,+BAA+B,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD,QAAA,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI;AACnB,QAAA,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE;QACpB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACzC,QAAA,OAAO,CAAC;;AAGF,IAAA,cAAc,CAAC,CAAO,EAAA;AAC5B,QAAA,OAAO,CAAG,EAAA,CAAC,CAAC,WAAW,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA,CAAE;;AAG5E,IAAA,cAAc,CAAC,CAAO,EAAA;AAC5B,QAAA,OAAO,CAAG,EAAA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAI,CAAA,EAAA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE;;AAGpF,IAAA,GAAG,CAAC,CAAS,EAAA;QACnB,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;;+GA1GxB,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,ECxBtC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,6tCAoCA,EDpBI,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,EACnB,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,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,gBAAgB,EAChB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,eAAA,EAAA,UAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,UAAA,EAAA,6BAAA,EAAA,WAAA,EAAA,UAAA,EAAA,eAAA,EAAA,cAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,sBAAA,EAAA,SAAA,EAAA,eAAA,EAAA,WAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,eAAA,EAAA,cAAA,EAAA,WAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,EAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,sXACb,iBAAiB,EAAA,QAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGR,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAbrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAGpB,OAAA,EAAA;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,WAAW;wBACX,gBAAgB;wBAChB,aAAa;wBACb,iBAAiB;AAClB,qBAAA,EAAA,QAAA,EAAA,6tCAAA,EAAA;qFAIQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;;;AERG,MAAO,yBAA0B,SAAQ,WAAW,CAAA;AAMxD,IAAA,WAAA,CAA+B,gBAAkC,EAAA;QAC/D,KAAK,CAAC,gBAAgB,CAAC;QADM,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QALtC,IAAS,CAAA,SAAA,GAAG,IAAI;QAChB,IAAiB,CAAA,iBAAA,GAAG,KAAK;QACzB,IAAW,CAAA,WAAA,GAAG,KAAK;AAClB,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,YAAY,EAAuB;AAY5D,QAAA,IAAA,CAAA,MAAM,GAAG,CAAC,KAA0B,KAAI;AACtC,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,SAAC;;IARQ,QAAQ,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QAEhE,KAAK,CAAC,QAAQ,EAAE;;+GAbP,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBtC,m4BA0BA,EAAA,MAAA,EAAA,CAAA,gnBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDbI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,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,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,MAAA,EAAA,aAAA,EAAA,cAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,iBAAiB,EAAA,QAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGR,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAZrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAGpB,OAAA,EAAA;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,WAAW;wBACX,cAAc;wBACd,iBAAiB;AAClB,qBAAA,EAAA,QAAA,EAAA,m4BAAA,EAAA,MAAA,EAAA,CAAA,gnBAAA,CAAA,EAAA;qFAGQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,iBAAiB,EAAA,CAAA;sBAAzB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACS,QAAQ,EAAA,CAAA;sBAAjB;;;AEFG,MAAO,4BACX,SAAQ,WAAW,CAAA;AAMnB,IAAA,WAAA,CAA+B,gBAAkC,EAAA;QAC/D,KAAK,CAAC,gBAAgB,CAAC;QADM,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;;QAFtC,IAAkB,CAAA,kBAAA,GAAY,IAAI;;IAMlC,QAAQ,GAAA;QACf,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AAC5C,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AACrD,SAAC,CAAC;AAEF,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI;YAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAChD,wBAAwB,CACzB;QAEH,KAAK,CAAC,QAAQ,EAAE;;+GArBP,4BAA4B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,ECtBzC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,28BA6BA,EDfI,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,EACnB,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,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAiB,EACjB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,YAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,6IACf,iBAAiB,EAAA,QAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGR,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAbxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAGvB,OAAA,EAAA;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,WAAW;wBACX,iBAAiB;wBACjB,eAAe;wBACf,iBAAiB;AAClB,qBAAA,EAAA,QAAA,EAAA,28BAAA,EAAA;qFAOQ,kBAAkB,EAAA,CAAA;sBAA1B;;;AEJG,MAAO,kCACX,SAAQ,uBAAuB,CAAA;AAG/B,IAAA,WAAA,CAA+B,gBAAkC,EAAA;QAC/D,KAAK,CAAC,gBAAgB,CAAC;QADM,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;;IAItC,QAAQ,GAAA;QACf,KAAK,CAAC,QAAQ,EAAE;;AAGlB,IAAA,MAAM,CAAC,KAAgC,EAAA;AACrC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;;+GAbnB,kCAAkC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kCAAkC,ECvB/C,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,yqCAmCA,EDpBI,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,EACnB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,iDAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,OAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,cAAA,EAAA,MAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,WAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,YAAA,EAAA,YAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,QAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,OAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,IAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,SAAA,EAAA,QAAA,EAAA,QAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,iBAAiB,qDACjB,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGT,kCAAkC,EAAA,UAAA,EAAA,CAAA;kBAZ9C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,EAE7B,OAAA,EAAA;wBACP,mBAAmB;wBACnB,WAAW;wBACX,kBAAkB;wBAClB,YAAY;wBACZ,iBAAiB;wBACjB,kBAAkB;AACnB,qBAAA,EAAA,QAAA,EAAA,yqCAAA,EAAA;;;AEFG,MAAO,yBAA0B,SAAQ,WAAW,CAAA;AAIxD,IAAA,WAAA,CAA+B,gBAAkC,EAAA;QAC/D,KAAK,CAAC,gBAAgB,CAAC;QADM,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;;QAFtC,IAAoB,CAAA,oBAAA,GAAY,KAAK;;IAMrC,QAAQ,GAAA;QACf,KAAK,CAAC,QAAQ,EAAE;;+GATP,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnBtC,ooBAmBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDPI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,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,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,OAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,SAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,OAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,iBAAiB,EAAA,QAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGR,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAXrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAEpB,OAAA,EAAA;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,WAAW;wBACX,cAAc;wBACd,iBAAiB;AAClB,qBAAA,EAAA,QAAA,EAAA,ooBAAA,EAAA;qFAIQ,oBAAoB,EAAA,CAAA;sBAA5B;;;AEDG,MAAO,wBAAyB,SAAQ,WAAW,CAAA;AAMvD,IAAA,WAAA,CAA+B,gBAAkC,EAAA;QAC/D,KAAK,CAAC,gBAAgB,CAAC;QADM,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;;QAJtC,IAAU,CAAA,UAAA,GAAY,KAAK;AAE1B,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAE;;IAMnC,QAAQ,GAAA;QACf,KAAK,CAAC,QAAQ,EAAE;;IAGlB,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;;+GAfpB,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBrC,65BA6BA,EAAA,MAAA,EAAA,CAAA,kRAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDhBI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,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,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,iBAAiB,EAAA,QAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGR,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAZpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAGnB,OAAA,EAAA;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,WAAW;wBACX,eAAe;wBACf,iBAAiB;AAClB,qBAAA,EAAA,QAAA,EAAA,65BAAA,EAAA,MAAA,EAAA,CAAA,kRAAA,CAAA,EAAA;qFAIQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACS,aAAa,EAAA,CAAA;sBAAtB;;;AELG,MAAO,4BACX,SAAQ,mBAAmB,CAAA;AAG3B,IAAA,WAAA,CAA+B,gBAAkC,EAAA;QAC/D,KAAK,CAAC,gBAAgB,CAAC;QADM,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;;IAItC,QAAQ,GAAA;QACf,KAAK,CAAC,QAAQ,EAAE;;+GATP,4BAA4B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnBzC,w/BAyBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDbI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,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,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,WAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,cAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,cAAA,EAAA,MAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,YAAA,EAAA,UAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,iBAAiB,EAAA,QAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGR,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAXxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAEvB,OAAA,EAAA;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,WAAW;wBACX,iBAAiB;wBACjB,iBAAiB;AAClB,qBAAA,EAAA,QAAA,EAAA,w/BAAA,EAAA;;;AEEG,MAAO,yBAA0B,SAAQ,WAAW,CAAA;AACxD,IAAA,WAAA,CAA+B,gBAAkC,EAAA;QAC/D,KAAK,CAAC,gBAAgB,CAAC;QADM,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;;IAItC,QAAQ,GAAA;QACf,KAAK,CAAC,QAAQ,EAAE;;+GANP,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnBtC,soBAoBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDRI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,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,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,SAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,iBAAiB,EAAA,QAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGR,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAXrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAEpB,OAAA,EAAA;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,WAAW;wBACX,cAAc;wBACd,iBAAiB;AAClB,qBAAA,EAAA,QAAA,EAAA,soBAAA,EAAA;;;AEEG,MAAO,uBAAwB,SAAQ,WAAW,CAAA;AAOtD,IAAA,WAAA,CAA+B,gBAAkC,EAAA;QAC/D,KAAK,CAAC,gBAAgB,CAAC;QADM,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;;QAJtC,IAAW,CAAA,WAAA,GAAY,IAAI;QAE3B,IAAiB,CAAA,iBAAA,GAAW,CAAC;;IAM7B,QAAQ,GAAA;QACf,KAAK,CAAC,QAAQ,EAAE;;+GAZP,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnBpC,iuBAqBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDTI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,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,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,cAAA,EAAA,SAAA,EAAA,YAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,EAAA,WAAA,EAAA,UAAA,EAAA,OAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,MAAA,EAAA,UAAA,EAAA,cAAA,EAAA,KAAA,EAAA,KAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,MAAA,EAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,UAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,EAAA,WAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,iBAAiB,EAAA,QAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGR,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAXnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAElB,OAAA,EAAA;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,WAAW;wBACX,iBAAiB;wBACjB,iBAAiB;AAClB,qBAAA,EAAA,QAAA,EAAA,iuBAAA,EAAA;qFAGQ,MAAM,EAAA,CAAA;sBAAd;gBAEQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,iBAAiB,EAAA,CAAA;sBAAzB;;;AEDG,MAAO,yBACX,SAAQ,mBAAmB,CAAA;AAM3B,IAAA,WAAA,CAA+B,gBAAkC,EAAA;QAC/D,KAAK,CAAC,gBAAgB,CAAC;QADM,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAHtC,IAAe,CAAA,eAAA,GAAY,KAAK;AAC/B,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,YAAY,EAAuB;;IAMnD,QAAQ,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,IAAI,CAAC,OAAO,GAAG;AACb,gBAAA,EAAE,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE;AAClE,gBAAA,EAAE,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE;AACpE,gBAAA,EAAE,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE;aACpE;;QAGH,KAAK,CAAC,QAAQ,EAAE;;AAGlB,IAAA,MAAM,CAAC,KAA0B,EAAA;AAC/B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;;+GAxBhB,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,ECvBtC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,onCAkCA,EDnBI,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,EACnB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,cAAA,EAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,MAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,aAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,mIACZ,iBAAiB,EAAA,QAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGR,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAbrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAGpB,OAAA,EAAA;wBACP,mBAAmB;wBACnB,WAAW;wBACX,YAAY;wBACZ,aAAa;wBACb,YAAY;wBACZ,iBAAiB;AAClB,qBAAA,EAAA,QAAA,EAAA,onCAAA,EAAA;qFAMQ,eAAe,EAAA,CAAA;sBAAvB;gBACS,QAAQ,EAAA,CAAA;sBAAjB;;;AENG,MAAO,uBAAwB,SAAQ,WAAW,CAAA;AAQtD,IAAA,WAAA,CAA+B,gBAAkC,EAAA;QAC/D,KAAK,CAAC,gBAAgB,CAAC;QADM,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAJtC,IAAQ,CAAA,QAAA,GAAW,CAAC;;IAQpB,QAAQ,GAAA;QACf,KAAK,CAAC,QAAQ,EAAE;;AAGlB,IAAA,YAAY,CAAC,KAAsB,EAAA;AACjC,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM;AAE1B,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC;AAC1C,YAAA,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;;;AAIvD,IAAA,YAAY,CAAC,KAAU,EAAA;QAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,QAAA,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC;AAClC,QAAA,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;QAC5E,KAAK,CAAC,KAAK,EAAE;AAEb,QAAA,KAAK,CAAC,QAAQ,GAAG,YAAW;YAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3B,IAAI,IAAI,EAAE;AACR,gBAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE;AAC/B,gBAAA,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAA,EAAG,IAAI,CAAC,QAAQ,CAAI,CAAA,EAAA,IAAI,CAAC,IAAI,CAAA,CAAE,CAAC;gBAE9D,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,MAA+B,KAAI;oBAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC;AACtC,oBAAA,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;;;;;;oBAMnD,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE;wBACjC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;;oBAElF,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;AACrC,iBAAC,CAAC;;AAEN,SAAC;;IAGH,OAAO,GAAA;AACL,QAAA,IAAI,YAAY,GACd,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,YAAY,CAAC;AAE1D,QAAA,YAAY,CAAC,MAAM,GAAG,MAAK;AACzB,YAAA,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;AAC5B,SAAC;;+GA5DQ,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EACvB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,MAAM,ECvBnB,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,y4BAwBA,EDTI,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,EACnB,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,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,oRACZ,iBAAiB,EAAA,QAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGR,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAZnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAGlB,OAAA,EAAA;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,WAAW;wBACX,YAAY;wBACZ,iBAAiB;AAClB,qBAAA,EAAA,QAAA,EAAA,y4BAAA,EAAA;qFAGkB,MAAM,EAAA,CAAA;sBAAxB,SAAS;uBAAC,MAAM;gBAER,iBAAiB,EAAA,CAAA;sBAAzB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBAEQ,iBAAiB,EAAA,CAAA;sBAAzB;;;AEhBH;;;;;;;;;;;;;;;AAeG;AAeG,MAAO,yBAA0B,SAAQ,WAAW,CAAA;AASxD,IAAA,WAAA,CAA+B,gBAAkC,EAAA;QAC/D,KAAK,CAAC,gBAAgB,CAAC;QADM,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QALtC,IAAQ,CAAA,QAAA,GAAW,CAAC;QAE7B,IAAmB,CAAA,mBAAA,GAAW,CAAC;QAC/B,IAAiB,CAAA,iBAAA,GAAY,KAAK;;IAMzB,QAAQ,GAAA;QACf,KAAK,CAAC,QAAQ,EAAE;;AAGlB,IAAA,OAAO,CAAC,KAAqB,EAAA;;QAE3B,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ;YAAE;QAEvD,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAC5C,QAAA,IAAI,CAAC,SAAS;YAAE;QAEhB,KAAK,CAAC,cAAc,EAAE;AAEtB,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE;AAC/B,QAAA,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAG,EAAA,IAAI,CAAC,QAAQ,CAAA,CAAA,EAAI,SAAS,CAAC,IAAI,IAAI,kBAAkB,CAAA,CAAE,CAAC;AAE9F,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;QAC9B,IAAI,CAAC,mBAAmB,EAAE;AAE1B,QAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC;AACzC,YAAA,IAAI,EAAE,CAAC,MAA+B,KAAI;gBACxC,IAAI,CAAC,mBAAmB,EAAE;AAC1B,gBAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC;aACrC;YACD,KAAK,EAAE,MAAK;gBACV,IAAI,CAAC,mBAAmB,EAAE;AAC1B,gBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;aAC9B;AACF,SAAA,CAAC;;AAGI,IAAA,cAAc,CAAC,KAAqB,EAAA;AAC1C,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,KAAK;AACxC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;AAEvB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AACtC,gBAAA,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE;;;AAI/B,QAAA,OAAO,IAAI;;AAGL,IAAA,mBAAmB,CAAC,GAAW,EAAA;AACrC,QAAA,MAAM,OAAO,GAAG,CAAO,IAAA,EAAA,GAAG,GAAG;AAC7B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa;;;;AAKhD,QAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,aAAa,KAAK,QAAQ,IAAI,QAAQ,CAAC,WAAW,CAAC,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE;YACzG;;;;;QAMF,IAAI,QAAQ,EAAE;AACZ,YAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE;AAC7C,YAAA,QAAQ,CAAC,KAAK,GAAG,CAAA,EAAG,QAAQ,CAAC,KAAK,CAAA,EAAG,GAAG,CAAA,EAAG,OAAO,CAAA,CAAE;YACpD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;;aAChC;YACL,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YACxC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAG,EAAA,OAAO,KAAK,OAAO,CAAA,CAAE,GAAG,OAAO,CAAC;;AAE5E,QAAA,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;;+GA/EjB,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,uRC1CtC,8mDAyCA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDTI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,EACnB,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,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,iMACd,UAAU,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,MAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,GAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,iBAAiB,EACjB,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,0BAAA,EAAA,yBAAA,EAAA,OAAA,EAAA,OAAA,EAAA,cAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,MAAA,EAAA,YAAA,EAAA,aAAA,EAAA,OAAA,EAAA,aAAA,EAAA,cAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,iBAAiB,qDACjB,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGT,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAdrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAEpB,OAAA,EAAA;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,WAAW;wBACX,cAAc;wBACd,UAAU;wBACV,iBAAiB;wBACjB,iBAAiB;wBACjB,kBAAkB;AACnB,qBAAA,EAAA,QAAA,EAAA,8mDAAA,EAAA;qFAGsB,WAAW,EAAA,CAAA;sBAAjC,SAAS;uBAAC,UAAU;gBAEZ,iBAAiB,EAAA,CAAA;sBAAzB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;;;MEjCU,2BAA2B,CAAA;AA6BtC,IAAA,WAAA,CAAoB,MAAc,EAAA;QAAd,IAAM,CAAA,MAAA,GAAN,MAAM;QAxBjB,IAAQ,CAAA,QAAA,GAAY,KAAK;QACzB,IAAO,CAAA,OAAA,GAAY,KAAK;QAiBxB,IAAQ,CAAA,QAAA,GAAY,KAAK;AAExB,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAS;AACrC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,OAAO,EAAS,CAAC;AAW5C,QAAA,IAAA,CAAA,WAAW,GAAG,CAAC,KAAY,KAAI;YAC7B,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,eAAe,EAAE;AACvB,YAAA,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE;gBACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;iBAClC;AACL,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;;AAEjC,SAAC;;IAdD,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACtB,aAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AACtB,aAAA,SAAS,CAAC,CAAC,KAAY,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;IAa1D,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;;+GAhDtB,2BAA2B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAI,IAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,uWAJ5B,CAAE,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAEF,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,8BAAE,iBAAiB,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAE5C,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBANvC,SAAS;+BACE,sBAAsB,EAAA,QAAA,EACtB,EAAE,EAEH,OAAA,EAAA,CAAC,YAAY,EAAE,YAAY,EAAE,iBAAiB,CAAC,EAAA;6EAG/C,IAAI,EAAA,CAAA;sBAAZ;gBAEQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBAWQ,IAAI,EAAA,CAAA;sBAAZ;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBAES,OAAO,EAAA,CAAA;sBAAhB;;;AC1BG,MAAO,uBAAwB,SAAQ,2BAA2B,CAAA;AANxE,IAAA,WAAA,GAAA;;;;;QAWW,IAAI,CAAA,IAAA,GAAkC,QAAQ;AACxD;+GANY,uBAAuB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,4HCZpC,ijBAoBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDVY,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,mbAAE,iBAAiB,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAE5C,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBANnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,WAGlB,CAAC,YAAY,EAAE,YAAY,EAAE,iBAAiB,CAAC,EAAA,QAAA,EAAA,ijBAAA,EAAA;8BAO/C,IAAI,EAAA,CAAA;sBAAZ;;;MECU,UAAU,CAAA;AAAG;;MCXb,sBAAsB,CAAA;;AAEjC,IAAA,WAAA,CACU,cAA8B,EAC9B,gBAAkC,EAClC,MAAc,EAAA;QAFd,IAAc,CAAA,cAAA,GAAd,cAAc;QACd,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAChB,IAAM,CAAA,MAAA,GAAN,MAAM;;IAGhB,cAAc,CACZ,MAAc,EACd,KAAgB,GAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,kBAAkB,CAAC,EAAA;AAEnE,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,YAAA,QAAQ,EAAE,SAAS;AACnB,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,IAAI,EAAE,KAAK;AACZ,SAAA,CAAC;;AAGJ,IAAA,cAAc,CAAC,MAAc,EAAE,KAAc,EAAE,MAAgB,EAAA;AAC7D,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,YAAA,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,SAAS,CAAC;AAC5D,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,IAAI,EAAE,KAAK;AACX,YAAA,MAAM,EAAE,MAAM;AACf,SAAA,CAAC;;IAGJ,YAAY,CACV,MAAc,EACd,KAAgB,GAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,EAAA;AAExD,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,IAAI,EAAE,KAAK;AACZ,SAAA,CAAC;;AAGJ,IAAA,WAAW,CAAC,MAAc,EAAE,KAAc,EAAE,MAAgB,EAAA;AAC1D,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,YAAA,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC;AACzD,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,IAAI,EAAE,KAAK;AACX,YAAA,MAAM,EAAE,MAAM;AACf,SAAA,CAAC;;+GAjDO,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAAF,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cAFrB,MAAM,EAAA,CAAA,CAAA;;4FAEP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;AC0BK,MAAO,qBAAsB,SAAQ,WAAW,CAAA;AAkDpD,IAAA,WAAA,CACqB,gBAAkC,EAC7C,cAAsC,EACtC,gBAA0C,EAAA;QAElD,KAAK,CAAC,gBAAgB,CAAC;QAJJ,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAC3B,IAAc,CAAA,cAAA,GAAd,cAAc;QACd,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;AApDhB,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,YAAY,EAA2B;AAC5D,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAQ;AAGzC,QAAA,IAAA,CAAA,iBAAiB,GA+BtB,CAAC,SAAS,CAAC;QAEN,IAAQ,CAAA,QAAA,GAAY,KAAK;QACzB,IAAa,CAAA,aAAA,GAAY,IAAI;QAC7B,IAAU,CAAA,UAAA,GAAW,CAAC;QACtB,IAAW,CAAA,WAAA,GAAW,CAAC;QACvB,IAAW,CAAA,WAAA,GAAW,UAAU;QAGzC,IAAe,CAAA,eAAA,GAAkB,IAAI;QACrC,IAAmB,CAAA,mBAAA,GAAY,KAAK;QACpC,IAAgB,CAAA,gBAAA,GAAW,EAAE;QACpB,IAAK,CAAA,KAAA,GAAW,EAAE;;IAUlB,QAAQ,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE;AACxD,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,gBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC;;iBACjC;gBACL,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC;AAClD,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;;;AAIzB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;;QAGnB,IAAI,CAAC,+BAA+B,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC;QAEvE,KAAK,CAAC,QAAQ,EAAE;;AAGlB,IAAA,aAAa,CAAC,KAAsB,EAAA;QAClC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAE3B,QAAA,IACE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/B,YAAA,IAAI,CAAC,4BAA4B,EAAE,EACnC;AACA,YAAA,IAAI,CAAC,KAAK,GAAG,EAAE;AACf,YAAA,IAAI,CAAC;iBACF,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW;AAC/D,iBAAA,IAAI,CAAC,CAAC,MAAM,KAAI;AACf,gBAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,oBAAA,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC;AACnB,oBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;;qBACtB;AACL,oBAAA,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;AAE9D,aAAC,CAAC;;aACC;AACL,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;;;IAIvB,MAAM,gBAAgB,CAAC,IAAU,EAAA;AACvC,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE;AAC/B,QAAA,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAA,EAAG,IAAI,CAAC,QAAQ,CAAI,CAAA,EAAA,IAAI,CAAC,IAAI,CAAA,CAAE,CAAC;AAE9D,QAAA,IAAI,KAAyB;AAC7B,QAAA,IAAI,MAA0B;QAE9B,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACnC,YAAA,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC;AACjD,YAAA,KAAK,GAAG,UAAU,CAAC,KAAK;AACxB,YAAA,MAAM,GAAG,UAAU,CAAC,MAAM;;AAG5B,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CACtB,IAAI,uBAAuB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAC/D;;IAGK,4BAA4B,GAAA;QAClC,OAAO,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC;;IAGpD,MAAM,CAAC,KAAK,EAAE,cAAc,EAAA;AAC1B,QAAA,cAAc,EAAE;;IAGlB,WAAW,CAAC,kBAAkB,EAAE,KAAa,EAAA;QAC3C,kBAAkB,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,SAAS,EAAE;;IAGlB,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;QAC3B,IAAI,CAAC,SAAS,EAAE;;IAGV,SAAS,GAAA;AACf,QAAA,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;;AAGvB,IAAA,kBAAkB,CAAC,GAAW,EAAA;AACpC,QAAA,IAAI,CAAC,eAAe,GAAG,GAAG;QAC1B,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QACjE,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAC9D,QAAA,IAAI,CAAC,mBAAmB,GAAG,eAAe,CAAC,QAAQ,CAAC;;AAGtD,IAAA,iBAAiB,CAAC,YAAoB,EAAA;AACpC,QAAA,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC;QAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrC,QAAA,MAAM,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,CAAC;AAEjD,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;QAC1C,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC;AAEzD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC9C,WAAW,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;;AAG/C,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACxD,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAE3D,QAAA,OAAO,IAAI;;AAGb,IAAA,eAAe,CAAC,QAAgB,EAAA;AAC9B,QAAA,OAAO,eAAe,CAAC,QAAQ,CAAC;;AAGlC,IAAA,eAAe,CAAC,QAAgB,EAAA;AAC9B,QAAA,OAAO,eAAe,CAAC,QAAQ,CAAC;;+GA5KvB,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAG,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,wBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EChClC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,aAAA,EAAA,eAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,s3IA+GA,EDxFI,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,+PACZ,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,gBAAgB,EAChB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,KAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,+BAAA,EAAA,8BAAA,EAAA,+BAAA,EAAA,8BAAA,EAAA,+BAAA,EAAA,gCAAA,EAAA,OAAA,EAAA,YAAA,EAAA,cAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,SAAA,EAAA,cAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,eAAA,EAAA,cAAA,EAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,iBAAiB,EACjB,QAAA,EAAA,UAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,uBAAuB,8EACvB,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGT,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAdjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAGhB,OAAA,EAAA;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,WAAW;wBACX,gBAAgB;wBAChB,iBAAiB;wBACjB,uBAAuB;wBACvB,kBAAkB;AACnB,qBAAA,EAAA,QAAA,EAAA,s3IAAA,EAAA;2JAGS,cAAc,EAAA,CAAA;sBAAvB;gBACS,aAAa,EAAA,CAAA;sBAAtB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,iBAAiB,EAAA,CAAA;sBAAzB;gBAgCQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBAMQ,KAAK,EAAA,CAAA;sBAAb;;AAgIG,MAAO,uBAAwB,SAAQ,UAAU,CAAA;IAMrD,WAAY,CAAA,EACV,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,MAAM,GAAA,GAMJ,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;;aAGN,IAAQ,CAAA,QAAA,GAAG,yBAAkC,CAAC;;;MEtNnD,6BAA6B,CAAA;AAGxC,IAAA,WAAA,CAAoB,MAAc,EAAA;QAAd,IAAM,CAAA,MAAA,GAAN,MAAM;;IAE1B,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,WAAW,IAAI,SAAS,EAAE;AACjC,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG;AAClC,YAAA,MAAM,SAAS,GAAW,YAAY,CAAC,UAAU,CAAC;AAClD,YAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC;;aAC/B;YACL,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;;;+GAXjC,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAH,IAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnB1C,gNAQA,EDKI,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,8BACZ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,uBAAuB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGT,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAXzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAGhB,OAAA,EAAA;wBACP,YAAY;wBACZ,YAAY;wBACZ,uBAAuB;wBACvB,kBAAkB;AACnB,qBAAA,EAAA,QAAA,EAAA,gNAAA,EAAA;6EAGQ,WAAW,EAAA,CAAA;sBAAnB;;;MEsCU,sBAAsB,CAAA;+GAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,YAtC/B,wBAAwB;YACxB,yBAAyB;YACzB,yBAAyB;YACzB,yBAAyB;YACzB,6BAA6B;YAC7B,uBAAuB;YACvB,yBAAyB;YACzB,6BAA6B;YAC7B,kCAAkC;YAClC,4BAA4B;YAC5B,uBAAuB;YACvB,yBAAyB;YACzB,uBAAuB;YACvB,yBAAyB;YACzB,4BAA4B;AAC5B,YAAA,qBAAqB,aAGrB,wBAAwB;YACxB,yBAAyB;YACzB,yBAAyB;YACzB,yBAAyB;YACzB,6BAA6B;YAC7B,uBAAuB;YACvB,yBAAyB;YACzB,6BAA6B;YAC7B,kCAAkC;YAClC,4BAA4B;YAC5B,uBAAuB;YACvB,yBAAyB;YACzB,uBAAuB;YACvB,yBAAyB;YACzB,4BAA4B;YAC5B,qBAAqB,CAAA,EAAA,CAAA,CAAA;AAKZ,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,YAtC/B,wBAAwB;YACxB,yBAAyB;YACzB,yBAAyB;YACzB,yBAAyB;YACzB,6BAA6B;YAC7B,uBAAuB;YACvB,yBAAyB;YACzB,6BAA6B;YAC7B,kCAAkC;YAClC,4BAA4B;YAC5B,uBAAuB;YACvB,yBAAyB;YACzB,uBAAuB;YACvB,yBAAyB;YACzB,4BAA4B;YAC5B,qBAAqB,CAAA,EAAA,CAAA,CAAA;;4FAuBZ,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAxClC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,wBAAwB;wBACxB,yBAAyB;wBACzB,yBAAyB;wBACzB,yBAAyB;wBACzB,6BAA6B;wBAC7B,uBAAuB;wBACvB,yBAAyB;wBACzB,6BAA6B;wBAC7B,kCAAkC;wBAClC,4BAA4B;wBAC5B,uBAAuB;wBACvB,yBAAyB;wBACzB,uBAAuB;wBACvB,yBAAyB;wBACzB,4BAA4B;wBAC5B,qBAAqB;AACtB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,wBAAwB;wBACxB,yBAAyB;wBACzB,yBAAyB;wBACzB,yBAAyB;wBACzB,6BAA6B;wBAC7B,uBAAuB;wBACvB,yBAAyB;wBACzB,6BAA6B;wBAC7B,kCAAkC;wBAClC,4BAA4B;wBAC5B,uBAAuB;wBACvB,yBAAyB;wBACzB,uBAAuB;wBACvB,yBAAyB;wBACzB,4BAA4B;wBAC5B,qBAAqB;AACtB,qBAAA;AACD,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,SAAS,EAAE,EAAE;AACd,iBAAA;;;ACvDK,MAAO,4BAA6B,SAAQ,UAAU,CAAA;AAI1D,IAAA,WAAA,CAAY,EACV,KAAK,EACL,WAAW,MAIT,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW;;aAGhB,IAAQ,CAAA,QAAA,GAAG,8BAAuC,CAAC;;;MCbxD,iBAAiB,CAAA;AAgC5B,IAAA,WAAA,GAAA;AA/BA;;;;;AAKG;QACH,IAAU,CAAA,UAAA,GAAG,KAAK;QAElB,IAAW,CAAA,WAAA,GAAG,uBAAuB;QACrC,IAAW,CAAA,WAAA,GAAG,cAAc;QAC5B,IAAY,CAAA,YAAA,GAAG,SAAS;;QAGxB,IAAS,CAAA,SAAA,GAAG,OAAO;;QAGnB,IAAc,CAAA,cAAA,GAAG,cAAc;QAC/B,IAAe,CAAA,eAAA,GAAG,eAAe;QACjC,IAAY,CAAA,YAAA,GAAG,YAAY;QAE3B,IAAW,CAAA,WAAA,GAAG,EAAE;AAChB,QAAA,IAAA,CAAA,sBAAsB,GAAG;YACvB,OAAO,EAAE,IAAI,WAAW,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;YAChE,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC;SACvD;QAED,IAAQ,CAAA,QAAA,GAAG,6BAA6B;;QAGxC,IAAe,CAAA,eAAA,GAAG,EAAE;;+GA9BT,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA,CAAA;;4FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCaY,kBAAkB,CAAA;IAC7B,WACY,CAAA,IAAgB,EAChB,MAAyB,EAAA;QADzB,IAAI,CAAA,IAAA,GAAJ,IAAI;QACJ,IAAM,CAAA,MAAA,GAAN,MAAM;;AAKlB,QAAA,IAAA,CAAA,KAAK,GAAG,CAAC,OAAiC,KAA4B;YACpE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAiB,eAAA,CAAA,EACtC,OAAO,EACP,IAAI,CAAC,MAAM,CAAC,WAAW,CACxB;AACH,SAAC;AAED,QAAA,IAAA,CAAA,0BAA0B,GAAG,CAC3B,QAAe,KACiC;YAChD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAsC,oCAAA,CAAA,EAC3D,QAAQ,EACR,IAAI,CAAC,MAAM,CAAC,WAAW,CACxB;AACH,SAAC;AAED,QAAA,IAAA,CAAA,gBAAgB,GAAG,CACjB,OAAiC,KACI;YACrC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAA4B,0BAAA,CAAA,EACjD,OAAO,EACP,IAAI,CAAC,MAAM,CAAC,WAAW,CACxB;AACH,SAAC;QAED,IAAoB,CAAA,oBAAA,GAAG,MAA2C;YAChE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,8BAAA,CAAgC,EACrD,IAAI,CAAC,MAAM,CAAC,sBAAsB,CACnC;AACH,SAAC;AAED,QAAA,IAAA,CAAA,MAAM,GAAG,CAAC,SAAiB,KAAqB;AAC9C,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAG,EAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,2BAAA,EAA8B,SAAS,CAAA,CAAE,CAC/D;AACH,SAAC;AAED,QAAA,IAAA,CAAA,iBAAiB,GAAG,CAAC,SAAiB,KAAqB;AACzD,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAG,EAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,sCAAA,EAAyC,SAAS,CAAA,CAAE,CAC1E;AACH,SAAC;AAED,QAAA,IAAA,CAAA,uBAAuB,GAAG,CAAC,OAA4B,KAA4B;YACjF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAmC,iCAAA,CAAA,EACxD,OAAO,EACP,IAAI,CAAC,MAAM,CAAC,WAAW,CACxB;AACH,SAAC;AAED,QAAA,IAAA,CAAA,uBAAuB,GAAG,CAAC,SAAiB,KAAuC;;;AAGjF,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAA+C,4CAAA,EAAA,SAAS,EAAE,EAC/E,IAAI,CACL;AACH,SAAC;;;QAMD,IAAkB,CAAA,kBAAA,GAAG,MAA2B;YAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,4BAAA,CAA8B,EACnD,IAAI,CAAC,MAAM,CAAC,sBAAsB,CACnC;AACH,SAAC;QAED,IAA6B,CAAA,6BAAA,GAAG,MAA2B;YACzD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,uCAAA,CAAyC,EAC9D,IAAI,CAAC,MAAM,CAAC,sBAAsB,CACnC;AACH,SAAC;;+GAxFU,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAI,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA,CAAA;;4FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACDD;;;;AAIG;MAIU,eAAe,CAAA;IAuB1B,WACY,CAAA,MAAc,EACd,IAAgB,EAChB,UAA8B,EAC9B,MAAyB,EACJ,UAAkB,EAAA;QAJvC,IAAM,CAAA,MAAA,GAAN,MAAM;QACN,IAAI,CAAA,IAAA,GAAJ,IAAI;QACJ,IAAU,CAAA,UAAA,GAAV,UAAU;QACV,IAAM,CAAA,MAAA,GAAN,MAAM;QACe,IAAU,CAAA,UAAA,GAAV,UAAU;AA3B1B,QAAA,IAAA,CAAA,MAAM,GAAW,IAAI,CAAC,MAAM,CAAC,MAAM;;;QAMpD,IAAqB,CAAA,qBAAA,GAAkB,IAAI;AAEjC,QAAA,IAAA,CAAA,2BAA2B,GAAG,IAAI,eAAe,CACzD,SAAS,CACV;;;;QAID,IAA2B,CAAA,2BAAA,GACzB,IAAI,CAAC;AACF,aAAA,YAAY;AACZ,aAAA,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAwB,KAAK,IAAI,IAAI,CAAC,CAAC;AAEpD,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,eAAe,CAAkB,SAAS,CAAC;AACjE,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;;AAezB,QAAA,IAAA,CAAA,oBAAoB,GAAG,CAAC,KAAmB,KAAI;AACrD,YAAA,IAAI,KAAK,CAAC,WAAW,KAAK,YAAY,EAAE;AACtC,gBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,cAAc,EAAE;oBAChC,IAAI,CAAC,cAAc,EAAE;AACrB,oBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AACrB,oBAAA,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC;;AAE7C,gBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,aAAa,EAAE;AAC/B,oBAAA,IAAI,CAAC,YAAY,EAAE,CAAC,SAAS,EAAE;;;AAGrC,SAAC;QA+CD,IAAa,CAAA,aAAA,GAAG,MAAK;AACnB,YAAA,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC;AAC3C,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC/C,SAAC;QAsCD,IAAmB,CAAA,mBAAA,GAAG,MAAK;YACzB,IAAI,CAAC,6BAA6B,EAAE,CAAC,SAAS,EAAE,CAAC;AACnD,SAAC;QAgED,IAA4B,CAAA,4BAAA,GAC1B,MAA+C;AAC7C,YAAA,OAAO,EAAE,CACP,IAAI,4BAA4B,CAAC;AAC/B,gBAAA,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;AAC3B,gBAAA,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;AACrC,aAAA,CAAC,CACH;AACH,SAAC;AAmBH,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAK,GAAG;AAtM3B,QAAA,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE;YACjC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,oBAAoB,CAAC;;;AAkBjE,IAAA,0BAA0B,CAAC,IAAW,EAAA;AACpC,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;QACpC,OAAO,IAAI,CAAC,UAAU,CAAC,0BAA0B,CAAC,IAAI,CAAC;;AAGzD,IAAA,KAAK,CAAC,IAA8B,EAAA;AAClC,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;AACpC,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,CAChDC,KAAG,CAAC,CAAC,MAA6B,KAAI;AACpC,YAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;AAC7B,YAAA,OAAO,MAAM;SACd,CAAC,CACH;;;;AAKH,IAAA,gBAAgB,CAAC,MAA6B,EAAA;AAC5C,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACd,EAAE,EAAE,MAAM,CAAC,MAAM;YACjB,KAAK,EAAE,MAAM,CAAC,KAAK;AACpB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC;AACjC,cAAE,IAAI,IAAI,CAAC,MAAM,CAAC,oBAAoB;cACpC,SAAS;AACb,QAAA,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5D,IAAI,CAAC,eAAe,EAAE;AACtB,QAAA,IAAI,CAAC,6BAA6B,EAAE,CAAC,SAAS,EAAE;;IAGlD,MAAM,GAAA;AACJ,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;AACrC,QAAA,IAAI,CAAC;aACF,iBAAiB,CAAC,SAAS;AAC3B,aAAA,IAAI,CACH,QAAQ,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AACrB,YAAA,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9D,IAAI,CAAC,aAAa,EAAE;YACpB,IAAI,CAAC,cAAc,EAAE;AACvB,SAAC,CAAC;AAEH,aAAA,SAAS,EAAE;;;;IAUhB,YAAY,GAAA;QACV,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC;AAC3C,QAAA,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;;;;;IAMhE,YAAY,GAAA;AACV,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;AACrC,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,IAAI,CAC5DA,KAAG,CAAC,CAAC,MAA6B,KAAI;YACpC,IAAI,MAAM,EAAE;;;AAGV,gBAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;AACjC,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;AAC3D,gBAAA,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC;AACjC,sBAAE,IAAI,IAAI,CAAC,MAAM,CAAC,oBAAoB;sBACpC,SAAS;gBACb,IAAI,CAAC,eAAe,EAAE;gBACtB,IAAI,CAAC,mBAAmB,EAAE;;AAE5B,YAAA,OAAO,MAAM;AACf,SAAC,CAAC,EACF,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AACrB,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC;SAChB,CAAC,CACH;;;;;IAUH,wBAAwB,GAAA;QACtB,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,EAAE;YAChD;;QAEF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAC5C,IAAI,CAAC,IAAI,EAAE;YACT;;AAEF,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;AACjC,QAAA,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC;AAClC,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE;AAC/B,QAAA,OAAO,CAAC,YAAY,CAClB,OAAO,CAAC,KAAK,EACb,EAAE,EACF,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,KAAK,GAAG,CAAI,CAAA,EAAA,KAAK,CAAE,CAAA,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAC7E;;IAGH,YAAY,GAAA;AACV,QAAA,IAAI,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC/D,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE;YAC/B,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC;;AAE3D,QAAA,OAAO,SAAS;;IAGV,qBAAqB,GAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;AAC9B,YAAA,OAAO,CAAC;;QAEV,OAAO,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;;IAGjD,eAAe,GAAA;AACrB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,EAAE;AAC5C,QAAA,IAAI,OAAO,IAAI,CAAC,EAAE;YAChB;;QAEF,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI;AACjB,aAAA,IAAI,CACH,KAAK,CAAC,OAAO,CAAC,EACd,GAAG,CAAC;YACF,IAAI,EAAE,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,SAAS,EAAE;AAC5C,SAAA,CAAC;AAEH,aAAA,SAAS,EAAE;;IAGR,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE;;IAG3B,mBAAmB,GAAA;QACjB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;;IAa7B,6BAA6B,GAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,6BAA6B,EAAE,CAAC,IAAI,CACzDA,KAAG,CAAC,CAAC,eAAe,KAAI;AACtB,YAAA,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,eAAe,CAAC;AACtD,YAAA,OAAO,eAAe;SACvB,CAAC,CACH;;IAGH,WAAW,GAAA;AACT,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACtC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,oBAAoB,CAAC;;QAGlE,IAAI,CAAC,kBAAkB,EAAE;;AAjOhB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,mIA4BhB,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AA5BV,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA,CAAA;;4FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;0BA6BI,MAAM;2BAAC,WAAW;;;MC1CV,iBAAiB,CAAA;AAM5B,IAAA,WAAA,CAAoB,WAA4B,EAAA;QAA5B,IAAW,CAAA,WAAA,GAAX,WAAW;QALvB,IAA0B,CAAA,0BAAA,GAAwB,IAAI;;IAO9D,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC;AACpC,aAAA,4BAA4B;AAC5B,aAAA,SAAS,CAAC,CAAC,OAAO,KAAI;AACrB,YAAA,IAAI,OAAO,IAAI,IAAI,EAAE;AACnB,gBAAA,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK;AAC1B,gBAAA,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW;;AAE1C,SAAC,CAAC;;IAGN,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,0BAA0B,EAAE,WAAW,EAAE;;+GApBrC,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECV9B,6qCAwCA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDhCY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAEX,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAL7B,SAAS;+BACE,oBAAoB,EAAA,OAAA,EAErB,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,6qCAAA,EAAA;;;AERzB,MAAM,YAAY,GAAG,CAAA,gtBAAA,CAAktB;AAEvuB;;;;;AAKG;AACU,MAAA,+BAA+B,GAA2B;AACrE,IAAA,MAAM,EAAE,CAAsB,mBAAA,EAAA,kBAAkB,CAAC,YAAY,CAAC,CAAE,CAAA;;;MCMrD,sBAAsB,CAAA;AAOjC,IAAA,WAAA,CACU,MAAyB,EACzB,WAA4B,EAC5B,UAA8B,EAAA;QAF9B,IAAM,CAAA,MAAA,GAAN,MAAM;QACN,IAAW,CAAA,WAAA,GAAX,WAAW;QACX,IAAU,CAAA,UAAA,GAAV,UAAU;;QARX,IAAa,CAAA,aAAA,GAA2B,EAAE;;QAGnD,IAAiB,CAAA,iBAAA,GAA6B,EAAE;;IAQhD,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,SAAS,CAAC;AAC/C,YAAA,IAAI,EAAE,CAAC,SAAS,KAAI;AAClB,gBAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS,IAAI,EAAE;aACzC;;;YAGD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;aAC5B;AACF,SAAA,CAAC;;AAGJ,IAAA,OAAO,CAAC,IAAY,EAAA;QAClB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,+BAA+B,CAAC,IAAI,CAAC;;AAG1E,IAAA,yBAAyB,CAAC,IAAY,EAAA;;;AAGpC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;QACjD,MAAM,CAAC,QAAQ,CAAC,IAAI;AAClB,YAAA,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAkC,gCAAA,CAAA;AACvD,gBAAA,CAAA,UAAA,EAAa,kBAAkB,CAAC,IAAI,CAAC,CAAE,CAAA;AACvC,gBAAA,CAAA,WAAA,EAAc,kBAAkB,CAAC,SAAS,CAAC,CAAE,CAAA;AAC7C,gBAAA,CAAA,WAAA,EAAc,kBAAkB,CAAC,SAAS,CAAC,EAAE;;+GAvCtC,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,kBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,+HCfnC,oxBAqBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDRY,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAZ,EAAA,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,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,kBAAkB,gMAAE,uBAAuB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAExD,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBALlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,WAE1B,CAAC,YAAY,EAAE,kBAAkB,EAAE,uBAAuB,CAAC,EAAA,QAAA,EAAA,oxBAAA,EAAA;4IAI3D,aAAa,EAAA,CAAA;sBAArB;;;AEfG,MAAO,QAAS,SAAQ,UAAU,CAAA;aACtB,IAAQ,CAAA,QAAA,GAAG,UAAmB,CAAC;AAK/C,IAAA,WAAA,CAAY,EACV,EAAE,EACF,KAAK,MAIH,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,EAAE,GAAG,EAAE;AACZ,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;;AAGJ,IAAA,SAAA,IAAA,CAAA,MAAM,GAAG;AACvB,QAAA,EAAE,EAAE;AACF,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;KACO,CAAC;;AAGP,MAAO,UAAW,SAAQ,UAAU,CAAA;aACxB,IAAQ,CAAA,QAAA,GAAG,YAAqB,CAAC;IAOjD,WAAY,CAAA,EACV,MAAM,EACN,KAAK,EACL,WAAW,EACX,YAAY,GAAA,GAMV,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW;AAC9B,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY;;AAGlB,IAAA,SAAA,IAAA,CAAA,MAAM,GAAG;AACvB,QAAA,MAAM,EAAE;AACN,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,WAAW,EAAE;AACX,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,YAAY,EAAE;AACZ,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;KACO,CAAC;;AAGP,MAAO,wBAAyB,SAAQ,UAAU,CAAA;aACtC,IAAQ,CAAA,QAAA,GAAG,0BAAmC,CAAC;AAM/D,IAAA,WAAA,CAAY,EACV,gBAAgB,EAChB,SAAS,EACT,KAAK,MAKH,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,gBAAgB,GAAG,gBAAgB;AACxC,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AAC1B,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;;AAGJ,IAAA,SAAA,IAAA,CAAA,MAAM,GAAG;AACvB,QAAA,gBAAgB,EAAE;AAChB,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;KACO,CAAC;;AAGP,MAAO,gBAAiB,SAAQ,UAAU,CAAA;aAC9B,IAAQ,CAAA,QAAA,GAAG,kBAA2B,CAAC;AAMvD,IAAA,WAAA,CAAY,EACV,QAAQ,EACR,OAAO,EACP,SAAS,MAKP,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;;AAGZ,IAAA,SAAA,IAAA,CAAA,MAAM,GAAG;AACvB,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,OAAO,EAAE;AACP,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;KACO,CAAC;;AAGP,MAAO,sBAAuB,SAAQ,UAAU,CAAA;aACpC,IAAQ,CAAA,QAAA,GAAG,wBAAiC,CAAC;IAO7D,WAAY,CAAA,EACV,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,KAAK,GAAA,GAMH,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AAC1B,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;;AAGJ,IAAA,SAAA,IAAA,CAAA,MAAM,GAAG;AACvB,QAAA,IAAI,EAAE;AACJ,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;KACO,CAAC;;AAGP,MAAO,QAAS,SAAQ,UAAU,CAAA;aACtB,IAAQ,CAAA,QAAA,GAAG,UAAmB,CAAC;AAK/C,IAAA,WAAA,CAAY,EACV,MAAM,EACN,MAAM,MAIJ,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;;AAGN,IAAA,SAAA,IAAA,CAAA,MAAM,GAAG;AACvB,QAAA,MAAM,EAAE;AACN,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,MAAM,EAAE;AACN,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;KACO,CAAC;;AAGP,MAAO,sBAAuB,SAAQ,UAAU,CAAA;aACpC,IAAQ,CAAA,QAAA,GAAG,wBAAiC,CAAC;IAO7D,WAAY,CAAA,EACV,KAAK,EACL,MAAM,EACN,SAAS,EACT,SAAS,GAAA,GAMP,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AAC1B,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;;AAGZ,IAAA,SAAA,IAAA,CAAA,MAAM,GAAG;AACvB,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,MAAM,EAAE;AACN,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,IAAI,EAAE,MAAM;AACb,SAAA;KACO,CAAC;;AAGP,MAAO,KAAM,SAAQ,UAAU,CAAA;aACnB,IAAQ,CAAA,QAAA,GAAG,OAAgB,CAAC;AAK5C,IAAA,WAAA,CAAY,EACV,KAAK,EACL,SAAS,MAIP,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;;AAGZ,IAAA,SAAA,IAAA,CAAA,MAAM,GAAG;AACvB,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;KACO,CAAC;;AAGP,MAAO,mBAAoB,SAAQ,UAAU,CAAA;aACjC,IAAQ,CAAA,QAAA,GAAG,qBAA8B,CAAC;AAK1D,IAAA,WAAA,CAAY,EACV,YAAY,EACZ,SAAS,MAIP,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY;AAChC,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;;AAGZ,IAAA,SAAA,IAAA,CAAA,MAAM,GAAG;AACvB,QAAA,YAAY,EAAE;AACZ,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;KACO,CAAC;;AAGP,MAAO,qBAAsB,SAAQ,UAAU,CAAA;aACnC,IAAQ,CAAA,QAAA,GAAG,uBAAgC,CAAC;AAM5D,IAAA,WAAA,CAAY,EACV,MAAM,EACN,KAAK,EACL,oBAAoB,MAKlB,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,oBAAoB,GAAG,oBAAoB;;AAGlC,IAAA,SAAA,IAAA,CAAA,MAAM,GAAG;AACvB,QAAA,MAAM,EAAE;AACN,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,oBAAoB,EAAE;AACpB,YAAA,IAAI,EAAE,MAAM;AACb,SAAA;KACO,CAAC;;AAGP,MAAO,gCAAiC,SAAQ,UAAU,CAAA;aAC9C,IAAQ,CAAA,QAAA,GAAG,kCAA2C,CAAC;IAIvE,WAAY,CAAA,EACV,OAAO,GAAA,GAGL,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;;AAGR,IAAA,SAAA,IAAA,CAAA,MAAM,GAAG;AACvB,QAAA,OAAO,EAAE;AACP,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;KACO,CAAC;;;ACtXb;AACM,MAAO,aAAc,SAAQ,KAAK,CAAA;AACtC,IAAA,WAAA,CAAY,OAAe,EAAA;QACzB,KAAK,CAAC,OAAO,CAAC;;AAEjB;;MCWY,eAAe,CAAA;AAC1B,IAAA,WAAA,CACU,gBAA0C,EAC1C,cAAsC,EACtC,gBAAkC,EAAA;QAFlC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAChB,IAAc,CAAA,cAAA,GAAd,cAAc;QACd,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAG1B,IAAa,CAAA,aAAA,GAAG,CACd,SAA+B,EAC/B,WAAsC,EACtC,aAAiB,EACjB,sBAAoC,KAClC;AACF,YAAA,IAAI,CAAC,SAAS;AACZ,gBAAA,MAAM,IAAI,aAAa,CAAC,yCAAyC,CAAC;AAEpE,YAAA,IAAI,CAAC,WAAW;AAAE,gBAAA,MAAM,IAAI,aAAa,CAAC,+BAA+B,CAAC;AAE1E,YAAA,IAAI,CAAC,aAAa;gBAAE,aAAa,GAAG,EAAO;AAE3C,YAAA,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,eAAe,KAAI;gBAC1D,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,eAAe,CAAC;AACtD,gBAAA,IAAI,gBAAgB,GAAG,aAAa,CAAC,eAAe,CAAC;gBAErD,MAAM,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC;AAEtD,gBAAA,IACE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC9B,oBAAA,UAAU,CAAC,iBAAiB;AAC5B,oBAAA,UAAU,CAAC,IAAI,KAAK,YAAY,EAChC;AACA,oBAAA,IAAI,eAAe,YAAY,iBAAiB,EAAE;wBAChD,IAAI,CAAC,aAAa,CAChB,eAAe,EACf,UAAU,CAAC,iBAAiB,EAC5B,gBAAgB,CACjB;wBACD,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CACzC,eAAe,EACf,WAAW,CAAC,QAAQ,CACrB;;yBACI;AACL,wBAAA,MAAM,OAAO,GAAG,IAAI,iBAAiB,CACnC,EAAE,EACF,IAAI,CAAC,gBAAgB,EACrB,IAAI,CACL;wBACD,IAAI,CAAC,aAAa,CAChB,OAAO,EACP,UAAU,CAAC,iBAAiB,EAC5B,gBAAgB,CACjB;AAED,wBAAA,OAAO,CAAC,KAAK,GAAG,eAAe;wBAC/B,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC;wBAClE,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CACzC,OAAO,EACP,WAAW,CAAC,QAAQ,CACrB;AAED,wBAAA,SAAS,CAAC,UAAU,CAAC,eAAe,EAAE,OAAO,CAAC;;;qBAE3C,IACL,UAAU,CAAC,iBAAiB;AAC5B,oBAAA,UAAU,CAAC,IAAI,KAAK,YAAY,EAChC;AACA,oBAAA,IAAI,eAAe,YAAY,iBAAiB,EAAE;wBAChD,IAAI,CAAC,aAAa,CAChB,eAAe,EACf,UAAU,CAAC,iBAAiB,EAC5B,gBAAgB,CACjB;;yBACI;AACL,wBAAA,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,EAAE,CAAC;wBACzC,IAAI,CAAC,aAAa,CAChB,OAAO,EACP,UAAU,CAAC,iBAAiB,EAC5B,gBAAgB,CACjB;AACD,wBAAA,SAAS,CAAC,UAAU,CAAC,eAAe,EAAE,OAAO,CAAC;;;qBAE3C;oBACL,MAAM,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;;AAGpD,oBAAA,IAAI,eAAe,KAAK,IAAI,IAAI,CAAC,gBAAgB,EAAE;wBACjD,gBAAgB,GAAG,CAAC;;AAGtB,oBAAA,IAAI,aAAa,IAAI,gBAAgB,IAAI,IAAI,EAAE;wBAC7C,gBAAgB,GAAG,EAAE;;AAGvB,oBAAA,IAAI,eAAe,YAAY,mBAAmB,EAAE;AAClD,wBAAA,eAAe,CAAC,QAAQ,CAAC,gBAAgB,CAAC;;yBACrC;AACL,wBAAA,IAAI,OAA4B;;;;;;;AAQhC,wBAAA,IACE,sBAAsB,EAAE,QAAQ,CAAC,eAA0B,CAAC;AAC5D,6BAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;4BAC9D,UAAU,CAAC,IAAI,KAAK,MAAM;AAC1B,4BAAA,aAAa,EACb;AACA,4BAAA,OAAO,GAAG,IAAI,mBAAmB,CAAC,gBAAgB,EAAE;AAClD,gCAAA,QAAQ,EAAE,QAAQ;AACnB,6BAAA,CAAC;;6BACG;AACL,4BAAA,OAAO,GAAG,IAAI,mBAAmB,CAAC,gBAAgB,EAAE;AAClD,gCAAA,QAAQ,EAAE,MAAM;AACjB,6BAAA,CAAC;;AAGJ,wBAAA,OAAO,CAAC,KAAK,GAAG,eAAe;wBAC/B,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC;AAClE,wBAAA,OAAO,CAAC,eAAe,GAAG,WAAW,CAAC,QAAQ;wBAE9C,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC;AAEjE,wBAAA,SAAS,CAAC,UAAU,CAAC,eAAe,EAAE,OAAO,CAAC;;;AAGpD,aAAC,CAAC;AAEF,YAAA,SAAS,CAAC,WAAW,GAAG,WAAW;AAEnC,YAAA,OAAO,SAAS;AAClB,SAAC;;QA2ED,IAAwB,CAAA,wBAAA,GAAG,MAAK;YAC9B,IAAI,CAAC,cAAc,CAAC,cAAc,CAChC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,qCAAqC,CAAC,EACtE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,+BAA+B,CAAC,CACjE;AACH,SAAC;AAMD,QAAA,IAAA,CAAA,qBAAqB,GAAG,CAAC,aAA0C,KAAI;AACrE,YAAA,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM;YACnC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAC7B,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,iBAAiB,KAAK,IAAI,CAC5C;AACH,SAAC;AAED,QAAA,IAAA,CAAA,uBAAuB,GAAG,CAIxB,eAAoD,EACpD,gBAA6B,KAChB;YACb,IAAI,QAAQ,GAAG,EAAe;AAE9B,YAAA,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;gBACvD,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC;AACjD,gBAAA,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC;;AAGxC,gBAAA,IACE,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;AAC9B,oBAAA,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,EAClC;oBACA,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,aAAa,CAAC;;AAE/D,oBAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,iBAAiB;oBAChD,QAAQ,CAAC,MAAM,CAAC;AACd,wBAAA,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,KACd,IAAI,CAAC,uBAAuB,CAAC,aAAa,EAAE,IAAI,CAAC,CAClD,IAAI,EAAE;;;AAGN,qBAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACjC,oBAAA,QAAQ,CAAC,CAAA,QAAA,EAAW,mBAAmB,CAAC,QAAQ,CAAC,CAAE,CAAA,CAAC,GAAG,KAAK,IAAI,EAAE;;;AAG/D,qBAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;AAC7C,oBAAA,QAAQ,CAAC,CAAA,QAAA,EAAW,mBAAmB,CAAC,QAAQ,CAAC,CAAE,CAAA,CAAC,GAAG,KAAK,IAAI,EAAE;;;qBAG/D;AACH,oBAAA,QAAQ,CAAC,QAAQ,CAAC,GAAG,KAAK;;AAE9B,aAAC,CAAC;AAEF,YAAA,OAAO,QAAQ;AACjB,SAAC;;AApID,IAAA,kBAAkB,CAAC,eAAuB,EAAA;AACxC,QAAA,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;AAChE,YAAA,eAAe,GAAG,eAAe,CAAC,SAAS,CACzC,CAAC,EACD,eAAe,CAAC,MAAM,GAAG,CAAC,CAC3B;;AACI,aAAA,IAAI,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;YAClD,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;;QAG9D,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;;AAG3E,IAAA,0BAA0B,CACxB,SAA+B,EAC/B,WAAsC,EACtC,aAAgB,EAChB,KAAa,EAAA;AAEb,QAAA,IAAI,eAAe,GAAG,IAAI,iBAAiB,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,WAAW,EAAE,aAAa,CAAC;AAE/D,QAAA,IAAI,KAAK,IAAI,IAAI,EAAE;AACjB,YAAA,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC;;aAC1B;AACL,YAAA,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,CAAC;;AAG1C,QAAA,OAAO,eAAe;;IAGxB,iCAAiC,CAC/B,SAA4B,EAC5B,KAAa,EAAA;QAEb,IAAI,KAAK,IAAI,IAAI;AAAE,YAAA,MAAM,IAAI,aAAa,CAAC,0BAA0B,CAAC;AAEtE,QAAA,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;;AAG3B,IAAA,aAAa,CACX,SAA+B,EAC/B,WAAsC,EACtC,gBAAqB,EAAE,EAAA;AAEvB,QAAA,IAAI,CAAC,SAAS;AACZ,YAAA,MAAM,IAAI,aAAa,CACrB,kEAAkE,CACnE;AAEH,QAAA,IAAI,CAAC,WAAW;AACd,YAAA,MAAM,IAAI,aAAa,CAAC,oCAAoC,CAAC;AAE/D,QAAA,SAAS,CAAC,sBAAsB,GAAG,EAAE,CAAC;AACtC,QAAA,SAAS,CAAC,WAAW,GAAG,WAAW;QAEnC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;YACrC,MAAM,eAAe,GAAG,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC;AAE3C,YAAA,IAAI,eAAe,YAAY,iBAAiB,EAAE;gBAChD,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,WAAW,EAAE,KAAK,CAAC;;iBAClD;AACL,gBAAA,IAAI,eAAe,GAAsB,IAAI,iBAAiB,CAAC,EAAE,CAAC;gBAClE,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,WAAW,EAAE,KAAK,CAAC;AACvD,gBAAA,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC;;AAEnC,SAAC,CAAC;AAEF,QAAA,OAAO,SAAS;;AAYlB,IAAA,qBAAqB,CAAuB,SAA+B,EAAA;QACzE,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;;IAqDpE,cAAc,CACZ,OAAoE,EACpE,oBAA+B,EAAA;QAE/B,IAAI,OAAO,GAAG,KAAK;AAEnB,QAAA,IAAI,OAAO,YAAY,mBAAmB,EAAE;YAC1C,IACE,OAAO,CAAC,OAAO;iBACd,oBAAoB,IAAI,IAAI;oBAC3B,oBAAoB,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAChD;gBACA,OAAO,CAAC,WAAW,EAAE;gBACrB,OAAO,GAAG,IAAI;;;AAEX,aAAA,IAAI,OAAO,YAAY,iBAAiB,EAAE;AAC/C,YAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;gBAC5C,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC3C,gBAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC,oBAAoB,CAAC,EAAE;oBACrE,OAAO,GAAG,IAAI;;AAElB,aAAC,CAAC;;AACG,aAAA,IAAI,OAAO,YAAY,iBAAiB,EAAE;AAC/C,YAAA,IAAI,OAAO,CAAC,MAAM,EAAE;gBAClB,OAAO,CAAC,WAAW,EAAE;AACrB,gBAAA,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACvD,OAAO,GAAG,IAAI;;YAGhB,OAAO,CAAC,QAAQ,CAAC,OAAO,CACtB,CACE,aAGqB,KACnB;gBACF,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE;oBACvC,OAAO,GAAG,IAAI;;AAElB,aAAC,CACF;;QAGH,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,KAAK;;AAGd,QAAA,OAAO,IAAI;;+GA5TF,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAa,wBAAA,EAAA,EAAA,EAAA,KAAA,EAAAT,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAAF,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA,CAAA;;4FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCYY,iBAAiB,CAAA;AAkE5B,IAAA,WAAA,CACY,OAAwB,EACxB,IAAgB,EAChB,cAAsC,EACtC,iBAAoC,EACpC,MAAc,EACd,KAAqB,EACrB,gBAAkC,EAClC,eAAgC,EAAA;QAPhC,IAAO,CAAA,OAAA,GAAP,OAAO;QACP,IAAI,CAAA,IAAA,GAAJ,IAAI;QACJ,IAAc,CAAA,cAAA,GAAd,cAAc;QACd,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB;QACjB,IAAM,CAAA,MAAA,GAAN,MAAM;QACN,IAAK,CAAA,KAAA,GAAL,KAAK;QACL,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAChB,IAAe,CAAA,eAAA,GAAf,eAAe;AAtE3B;;;;;;;;;;;;;;;;AAgBG;AACH,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,iBAAiB,CAAY,EAAS,CAAC;AA4B7D;;;;;;;;;;AAUG;QACH,IAA8B,CAAA,8BAAA,GAAW,IAAI,CAAC,gBAAgB,CAAC,SAAS,CACtE,gCAAgC,CACjC;;AAmBD;;;;;;;;;;;;;;;;;;;;;AAqBG;;AAEH,QAAA,IAAA,CAAA,MAAM,GAAG,CAAC,4BAAwC,GAAA,IAAI,KAAI;YACxD,IAAI,CAAC,IAAI,CAAC,aAAa;AACrB,gBAAA,MAAM,IAAI,aAAa,CAAC,sCAAsC,CAAC;YAEjE,IAAI,CAAC,IAAI,CAAC,eAAe;AACvB,gBAAA,MAAM,IAAI,aAAa,CAAC,wCAAwC,CAAC;YAEnE,IAAI,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE;AAEjD,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;AAE3B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC;YAEzE,IAAI,OAAO,EAAE;AACX,gBAAA,IAAI,CAAC;qBACF,oBAAoB,CAAC,QAAQ;AAC7B,qBAAA,SAAS,CAAC,CAAC,GAAgB,KAAI;oBAC9B,IAAI,CAAC,cAAc,CAAC,cAAc,CAChC,IAAI,CAAC,8BAA8B,CACpC;oBAED,IAAI,4BAA4B,EAAE;AAChC,wBAAA,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC;;yBAC/B;AACL,wBAAA,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,uBAAuB,CACrD,IAAI,CAAC,eAAe,EACpB,GAAG,CACJ;AAED,wBAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAChC,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,aAAa,EAClB,QAAQ,CACT;AAED,wBAAA,MAAM,kBAAkB,GACtB,IAAI,CAAC,eAAe,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC;wBAChE,MAAM,aAAa,GAAG,QAAQ,CAAC,kBAAkB,CAAC,EAAE,EAAE;AACtD,wBAAA,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;;oBAG3C,IAAI,CAAC,WAAW,EAAE;AACpB,iBAAC,CAAC;gBAEJ,IAAI,CAAC,kBAAkB,EAAE;;iBACpB;AACL,gBAAA,IAAI,CAAC,eAAe,CAAC,wBAAwB,EAAE;;AAEnD,SAAC;AAgCD;;;;;;;;;;;;AAYG;AACH,QAAA,IAAA,CAAA,YAAY,GAAG,CAAC,QAAoB,KAAI,GAAG;AAE3C;;;;;;;;;;AAUG;AACH,QAAA,IAAA,CAAA,WAAW,GAAG,MAAK,GAAG;AAEtB;;;;;;;;;;AAUG;AACH,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAK,GAAG;;AAlJ7B,IAAA,QAAQ;AA6ER;;;;;;;;;;;;;;AAcG;AACH,IAAA,oBAAoB,CAAC,SAA0B,EAAA;AAC7C,QAAA,IAAI,SAAS,IAAI,IAAI,EAAE;AACrB,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG;AAClC,YAAA,MAAM,SAAS,GAAW,YAAY,CAAC,UAAU,CAAC;AAClD,YAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC;YACpC;;AAGF,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;AAC3C,QAAA,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,QAAQ,EAAE;QAEpD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;AACjC,QAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC;;;;AAgDnC,IAAA,0BAA0B,CACxB,eAAiC,EACjC,SAA+B,EAC/B,KAAa,EACb,MAAuE,EAAA;;;AAKvE,QAAA,IAAI,kBAA0C;QAE9C,IAAI,MAAM,EAAE;AACV,YAAA,kBAAkB,GAAG,MAAM,CAAC,SAAS,CAAC,QAAkC,CAAC;;aACpE;YACL,OAAQ,SAAS,CAAC,QAAQ,CAAC,KAAK,CAA0B,CAAC,QAAQ,CACjE,eAAe,CACO;;QAG1B,OAAO,kBAAkB,CAAC,KAAK,CAAC,EAAE,QAAQ,CACxC,eAAe,CACO,CAAC;;AAG3B,IAAA,oBAAoB,CAClB,eAAiC,EACjC,SAA+B,EAC/B,MAAuE,EAAA;;;AAKvE,QAAA,IAAI,kBAA0C;QAE9C,IAAI,MAAM,EAAE;AACV,YAAA,kBAAkB,GAAG,MAAM,CAAC,SAAS,CAAC,QAAkC,CAAC;;aACpE;AACL,YAAA,OAAQ,SAAS,CAAC,QAAmC,CAAC,GAAG,CACvD,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAwB,CAC1D;;AAGH,QAAA,OAAO,kBAAkB,CAAC,GAAG,CAC3B,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAwB,CAC1D;;IAGH,kCAAkC,CAChC,SAA4B,EAC5B,OAAiB,EAAA;;AAGjB,QAAA,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAEnD,QAAA,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;YAC9B,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE;AAC1C,gBAAA,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;;AAE7B,SAAC,CAAC;;+GA/RO,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAF,IAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAAF,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAc,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,sEAJlB,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,CAAA;;4FAID,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;+BACE,WAAW,EAAA,QAAA,EACX,EAAE,EAAA,UAAA,EAEA,KAAK,EAAA;;;MCjBN,kBAAkB,CAAA;AAG7B,IAAA,WAAA,GAAA;AAFS,QAAA,IAAA,CAAA,mBAAmB,GAAY,KAAK,CAAC;;AAI9C,IAAA,QAAQ;+GALG,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,+HCR/B,2PAWA,EAAA,MAAA,EAAA,CAAA,kIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAX,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDHa,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAN9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,cAGV,KAAK,EAAA,QAAA,EAAA,2PAAA,EAAA,MAAA,EAAA,CAAA,kIAAA,CAAA,EAAA;wDAGR,mBAAmB,EAAA,CAAA;sBAA3B;;;MEDU,oBAAoB,CAAA;AAC/B,IAAA,WAAA,GAAA;AAEA,IAAA,QAAQ;+GAHG,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,yECRjC,qOAQA,EAAA,MAAA,EAAA,CAAA,+VAAA,CAAA,EAAA,CAAA,CAAA;;4FDAa,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,cAGZ,KAAK,EAAA,QAAA,EAAA,qOAAA,EAAA,MAAA,EAAA,CAAA,+VAAA,CAAA,EAAA;;;MESN,oBAAoB,CAAA;AAU/B,IAAA,WAAA,CAAoB,gBAAkC,EAAA;QAAlC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;;QAL3B,IAAQ,CAAA,QAAA,GAAY,IAAI;;IAOjC,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI;YACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,SAAS,CAAC;QAEzD,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI;AAC7C,YAAA,IAAI,CAAC,IAAI,GAAG,iBAAiB;;AAGjC,IAAA,gBAAgB,CAAC,GAAgB,EAAA;QAC/B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AACtB,YAAA,CAAC,CAAC,UAAU,GAAG,KAAK;AACtB,SAAC,CAAC;AAEF,QAAA,GAAG,CAAC,UAAU,GAAG,IAAI;;+GAzBZ,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,qMCfjC,4vCAsCA,EAAA,MAAA,EAAA,CAAA,sCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDvBa,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAZhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,cASZ,KAAK,EAAA,QAAA,EAAA,4vCAAA,EAAA,MAAA,EAAA,CAAA,sCAAA,CAAA,EAAA;qFAGR,KAAK,EAAA,CAAA;sBAAb;gBAEQ,YAAY,EAAA,CAAA;sBAApB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,IAAI,EAAA,CAAA;sBAAZ;;MAqBU,WAAW,CAAA;IAMtB,WAAY,CAAA,EACV,KAAK,EACL,EAAE,EACF,IAAI,EACJ,UAAU,GAAA,GAMR,EAAE,EAAA;AACJ,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,EAAE,GAAG,EAAE;AACZ,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;;AAE/B;;MEjDY,sBAAsB,CAAA;AAqBjC,IAAA,WAAA,GAAA;QApBS,IAAoB,CAAA,oBAAA,GAAY,KAAK;QACrC,IAAqB,CAAA,qBAAA,GAAY,KAAK;QACtC,IAAmB,CAAA,mBAAA,GAAY,KAAK;QACpC,IAAU,CAAA,UAAA,GAAY,KAAK;QAC3B,IAAO,CAAA,OAAA,GAA6B,MAAM;QAC1C,IAAS,CAAA,SAAA,GAAY,KAAK;;QAG1B,IAAY,CAAA,YAAA,GAAY,IAAI;;QAE5B,IAAc,CAAA,cAAA,GAAY,KAAK;;QAG/B,IAAe,CAAA,eAAA,GAAY,IAAI;AAE9B,QAAA,IAAA,CAAA,eAAe,GAAyB,IAAI,YAAY,EAAE;AAC1D,QAAA,IAAA,CAAA,iBAAiB,GAAuB,IAAI,YAAY,EAAE;;AAMpE,IAAA,QAAQ;IAER,aAAa,CAAC,KAAa,EAAE,KAAK,EAAA;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;;IAGlC,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;;+GA/BxB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,wmBCjBnC,g0DA0DA,EAAA,MAAA,EAAA,CAAA,s2CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,OAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,KAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,WAAA,EAAA,OAAA,EAAA,YAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDzCa,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBANlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,cAGd,KAAK,EAAA,QAAA,EAAA,g0DAAA,EAAA,MAAA,EAAA,CAAA,s2CAAA,CAAA,EAAA;wDAGR,oBAAoB,EAAA,CAAA;sBAA5B;gBACQ,qBAAqB,EAAA,CAAA;sBAA7B;gBACQ,mBAAmB,EAAA,CAAA;sBAA3B;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBAEQ,YAAY,EAAA,CAAA;sBAApB;gBAEQ,cAAc,EAAA,CAAA;sBAAtB;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBAEQ,eAAe,EAAA,CAAA;sBAAvB;gBAES,eAAe,EAAA,CAAA;sBAAxB;gBACS,iBAAiB,EAAA,CAAA;sBAA1B;gBAEkB,IAAI,EAAA,CAAA;sBAAtB,SAAS;uBAAC,MAAM;;;MEXN,oBAAoB,CAAA;+GAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,iBAP7B,oBAAoB;YACpB,kBAAkB;YAClB,oBAAoB;AACpB,YAAA,sBAAsB,aAXd,YAAY,EAAE,UAAU,EAAE,WAAW,aAE7C,oBAAoB;YACpB,kBAAkB;YAClB,oBAAoB;YACpB,sBAAsB,CAAA,EAAA,CAAA,CAAA;AAUb,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,EAfrB,OAAA,EAAA,CAAA,YAAY,EAAE,UAAU,EAAE,WAAW,CAAA,EAAA,CAAA,CAAA;;4FAepC,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAhBhC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,WAAW,CAAC;AAChD,oBAAA,OAAO,EAAE;wBACP,oBAAoB;wBACpB,kBAAkB;wBAClB,oBAAoB;wBACpB,sBAAsB;AACvB,qBAAA;AACD,oBAAA,YAAY,EAAE;wBACZ,oBAAoB;wBACpB,kBAAkB;wBAClB,oBAAoB;wBACpB,sBAAsB;AACvB,qBAAA;AACD,oBAAA,SAAS,EAAE,EAAE;AACd,iBAAA;;;ACcK,MAAO,4BACX,SAAQ,iBAAiB,CAAA;AAUzB,IAAA,WAAA,CACqB,OAAwB,EACxB,IAAgB,EAChB,cAAsC,EACtC,iBAAoC,EACpC,MAAc,EACd,KAAqB,EACrB,gBAAkC,EAClC,eAAgC,EAAA;AAEnD,QAAA,KAAK,CACH,OAAO,EACP,IAAI,EACJ,cAAc,EACd,iBAAiB,EACjB,MAAM,EACN,KAAK,EACL,gBAAgB,EAChB,eAAe,CAChB;QAlBkB,IAAO,CAAA,OAAA,GAAP,OAAO;QACP,IAAI,CAAA,IAAA,GAAJ,IAAI;QACJ,IAAc,CAAA,cAAA,GAAd,cAAc;QACd,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB;QACjB,IAAM,CAAA,MAAA,GAAN,MAAM;QACN,IAAK,CAAA,KAAA,GAAL,KAAK;QACL,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAChB,IAAe,CAAA,eAAA,GAAf,eAAe;AAfpC,QAAA,IAAA,CAAA,iCAAiC,GAC/B,IAAI,iBAAiB,CAA2B,EAAE,CAAC;AAG3C,QAAA,IAAA,CAAA,yBAAyB,GAAsB,IAAI,YAAY,EAAE;AACjE,QAAA,IAAA,CAAA,YAAY,GAAyB,IAAI,YAAY,EAAE;;IAwBxD,QAAQ,GAAA;AACf,QAAA,IAAI,CAAC,qCAAqC,CACxC,IAAI,wBAAwB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CACpD;;AAGH,IAAA,qCAAqC,CAAC,KAA+B,EAAA;AACnE,QAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAChC,IAAI,CAAC,iCAAiC,EACtC,wBAAwB,EACxB,KAAK,EACL,CAAC,kBAAkB,CAAC,CACrB;;IAGH,UAAU,GAAA;AACR,QAAA,IAAI,OAAO,GAAY,IAAI,CAAC,eAAe,CAAC,cAAc,CACxD,IAAI,CAAC,iCAAiC,CACvC;QAED,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CACpB,IAAI,CAAC,iCAAiC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAC/E;;;IAIL,uBAAuB,GAAA;AACrB,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;;+GA7DhC,4BAA4B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAG,IAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAF,IAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAAF,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAc,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,sOCtCzC,ivGAuFA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED3DI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAR,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,EACnB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,sBAAsB,mIACtB,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAS,oBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,cAAA,EAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,oBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,sBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAQ,oQACR,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGT,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAdxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAEvB,OAAA,EAAA;wBACP,YAAY;wBACZ,WAAW;wBACX,mBAAmB;wBACnB,sBAAsB;wBACtB,oBAAoB;wBACpB,YAAY;wBACZ,QAAQ;wBACR,kBAAkB;AACnB,qBAAA,EAAA,QAAA,EAAA,ivGAAA,EAAA;iSASQ,KAAK,EAAA,CAAA;sBAAb;gBACS,yBAAyB,EAAA,CAAA;sBAAlC;gBACS,YAAY,EAAA,CAAA;sBAArB;;;MEpCU,0BAA0B,CAAA;AAIrC,IAAA,WAAA,CACU,WAA4B,EAC5B,cAAsC,EACtC,gBAAkC,EAAA;QAFlC,IAAW,CAAA,WAAA,GAAX,WAAW;QACX,IAAc,CAAA,cAAA,GAAd,cAAc;QACd,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;;AAG1B,IAAA,QAAQ;IAER,uBAAuB,GAAA;AACrB,QAAA,IAAI,CAAC;aACF,0BAA0B,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;aAChD,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,cAAc,CAAC,cAAc,CAChC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,kCAAkC,CAAC,CACpE;AACH,SAAC,CAAC;;AAGN,IAAA,YAAY,CAAC,KAAa,EAAA;AACxB,QAAA,IAAI,CAAC;AACF,aAAA,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE;aACpD,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,cAAc,CAAC,cAAc,CAChC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAC7B,wCAAwC,CACzC,CACF;AACD,YAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE;AACxC,SAAC,CAAC;;+GAhCK,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAV,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAL,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAAF,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXvC,gLAKA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDIY,4BAA4B,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,2BAAA,EAAA,cAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAE3B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBALtC,SAAS;+BACE,oBAAoB,EAAA,OAAA,EAErB,CAAC,4BAA4B,CAAC,EAAA,QAAA,EAAA,gLAAA,EAAA;kJAG9B,KAAK,EAAA,CAAA;sBAAb;gBACQ,MAAM,EAAA,CAAA;sBAAd;;;AEuBG,MAAO,sBAAuB,SAAQ,iBAAiB,CAAA;AAO3D,IAAA,WAAA,CACqB,OAAwB,EACxB,IAAgB,EAChB,cAAsC,EACtC,iBAAoC,EACpC,MAAc,EACd,KAAqB,EACrB,gBAAkC,EAClC,eAAgC,EAC3C,WAA4B,EAAA;AAEpC,QAAA,KAAK,CACH,OAAO,EACP,IAAI,EACJ,cAAc,EACd,iBAAiB,EACjB,MAAM,EACN,KAAK,EACL,gBAAgB,EAChB,eAAe,CAChB;QAnBkB,IAAO,CAAA,OAAA,GAAP,OAAO;QACP,IAAI,CAAA,IAAA,GAAJ,IAAI;QACJ,IAAc,CAAA,cAAA,GAAd,cAAc;QACd,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB;QACjB,IAAM,CAAA,MAAA,GAAN,MAAM;QACN,IAAK,CAAA,KAAA,GAAL,KAAK;QACL,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAChB,IAAe,CAAA,eAAA,GAAf,eAAe;QAC1B,IAAW,CAAA,WAAA,GAAX,WAAW;AAfrB,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,iBAAiB,CAAQ,EAAE,CAAC;QACjD,IAAmB,CAAA,mBAAA,GAAY,KAAK;;QAG3B,IAAa,CAAA,aAAA,GAA2B,EAAE;;IAyB1C,QAAQ,GAAA;QACf,IAAI,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,8BAA8B,EAAE;;;;IAK/B,8BAA8B,GAAA;AACpC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,qBAAqB;QACnD,IAAI,CAAC,IAAI,EAAE;YACT;;QAEF,IAAI,CAAC,WAAW,CAAC,qBAAqB,GAAG,IAAI,CAAC;AAC9C,QAAA,MAAM,UAAU,GACd,IAAI,KAAK,SAAS,GAAG,6BAA6B,GAAG,4BAA4B;AACnF,QAAA,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;;AAGjF,IAAA,kBAAkB,CAAC,KAAY,EAAA;AAC7B,QAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE;YACpE,OAAO;AACR,SAAA,CAAC;;IAGJ,0BAA0B,GAAA;AACxB,QAAA,IAAI,gBAAgB,GAAY,IAAI,CAAC,eAAe,CAAC,cAAc,CACjE,IAAI,CAAC,cAAc,CACpB;AAED,QAAA,IAAI,gBAAgB,IAAI,KAAK,EAAE;AAC7B,YAAA,IAAI,CAAC,eAAe,CAAC,wBAAwB,EAAE;YAC/C;;AAGF,QAAA,IAAI,CAAC;AACF,aAAA,0BAA0B,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE;AAC5D,aAAA,SAAS,CAAC,CAAC,MAAM,KAAI;AACpB,YAAA,IAAI,MAAM,CAAC,OAAO,EAAE;gBAClB,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC;;AAEpD,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;AACjC,SAAC,CAAC;;+GAvEK,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAF,IAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAAF,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAc,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAM,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,ECpCnC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,wuEA2DA,EDhCI,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,8BACZ,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,iBAAiB,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,sBAAsB,EACtB,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,sBAAsB,EACtB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,wBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,uBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,0BAA0B,4FAC1B,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGT,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAblC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAEjB,OAAA,EAAA;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,iBAAiB;wBACjB,sBAAsB;wBACtB,sBAAsB;wBACtB,0BAA0B;wBAC1B,kBAAkB;AACnB,qBAAA,EAAA,QAAA,EAAA,wuEAAA,EAAA;4TAOQ,aAAa,EAAA,CAAA;sBAArB;;;MEhCU,qBAAqB,CAAA;AANlC,IAAA,WAAA,GAAA;QAOW,IAAM,CAAA,MAAA,GAAW,GAAG;QAC7B,IAAW,CAAA,WAAA,GAAW,EAAE;QAExB,IAAO,CAAA,OAAA,GAAW,EAAE;QACpB,IAAiB,CAAA,iBAAA,GAAW,EAAE;QAC9B,IAAc,CAAA,cAAA,GAAW,CAAC;AAU3B;IARC,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,UAAU;AACb,YAAA,IAAI,CAAC,MAAM;iBACV,IAAI,CAAC,WAAW;oBACf,IAAI,CAAC,OAAO,GAAG,CAAC;AAChB,oBAAA,IAAI,CAAC,iBAAiB;oBACtB,IAAI,CAAC,cAAc,CAAC;;+GAdf,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECTlC,+dAmBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDZY,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAApB,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,OAAA,EAAA,OAAA,EAAA,WAAA,EAAA,cAAA,EAAA,MAAA,EAAA,OAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAEb,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;+BACE,eAAe,EAAA,OAAA,EAGhB,CAAC,cAAc,CAAC,EAAA,QAAA,EAAA,+dAAA,EAAA;8BAGhB,MAAM,EAAA,CAAA;sBAAd;;;MECU,kBAAkB,CAAA;AAe7B,IAAA,WAAA,CAAsB,WAAwB,EAAA;QAAxB,IAAW,CAAA,WAAA,GAAX,WAAW;QAZxB,IAAM,CAAA,MAAA,GAAW,EAAE;;QAKnB,IAAY,CAAA,YAAA,GAAY,IAAI;AAI3B,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAU;AAC5C,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,YAAY,EAAQ;;AAItD,IAAA,QAAQ;AAER,IAAA,aAAa,CAAC,KAAa,EAAA;AACzB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;;IAGlC,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;;+GAxBxB,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,ECX/B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,0nBA2BA,EDlBY,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,4HAAE,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAqB,oBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,cAAA,EAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,sBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAEjC,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAL9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAEb,OAAA,EAAA,CAAC,YAAY,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAAA,0nBAAA,EAAA;gFAGpC,IAAI,EAAA,CAAA;sBAAZ;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,MAAM,EAAA,CAAA;sBAAd;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBAEQ,cAAc,EAAA,CAAA;sBAAtB;gBAEQ,YAAY,EAAA,CAAA;sBAApB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBAES,eAAe,EAAA,CAAA;sBAAxB;gBACS,iBAAiB,EAAA,CAAA;sBAA1B;;;MEbU,iBAAiB,CAAA;AAO5B,IAAA,WAAA,CAAsB,WAAwB,EAAA;QAAxB,IAAW,CAAA,WAAA,GAAX,WAAW;QANxB,IAAM,CAAA,MAAA,GAAG,EAAE;;QAEX,IAAa,CAAA,aAAA,GAAG,IAAI;QACpB,IAAI,CAAA,IAAA,GAAG,mBAAmB;QAC1B,IAAS,CAAA,SAAA,GAAG,EAAE;;AAIvB,IAAA,QAAQ;+GATG,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAvB,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,ECX9B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,aAAA,EAAA,eAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,wdAiBA,EDRY,MAAA,EAAA,CAAA,szBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,kIAAE,oBAAoB,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAEjC,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAGZ,OAAA,EAAA,CAAC,YAAY,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAAA,wdAAA,EAAA,MAAA,EAAA,CAAA,szBAAA,CAAA,EAAA;gFAGpC,MAAM,EAAA,CAAA;sBAAd;gBAEQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBACQ,SAAS,EAAA,CAAA;sBAAjB;;;AEbG,MAAO,cAAe,SAAQ,UAAU,CAAA;IAM5C,WAAY,CAAA,EACV,WAAW,EACX,eAAe,EACf,eAAe,EACf,WAAW,GAAA,GAMT,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW;AAC9B,QAAA,IAAI,CAAC,eAAe,GAAG,eAAe;AACtC,QAAA,IAAI,CAAC,eAAe,GAAG,eAAe;AACtC,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW;;aAGhB,IAAQ,CAAA,QAAA,GAAG,gBAAyB,CAAC;;;AC5BvD;AACgB,SAAA,cAAc,CAAC,OAAgB,EAAE,GAAW,EAAA;AAC1D,IAAA,IAAI;AACF,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC;;AACjD,IAAA,MAAM;AACN,QAAA,OAAO,IAAI;;AAEf;AAEA;SACgB,eAAe,CAAC,OAAgB,EAAE,GAAW,EAAE,KAAU,EAAA;AACvE,IAAA,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC7C;;MCuBa,iBAAiB,CAAA;AAC5B;;;;AAIG;aACqB,IAAsB,CAAA,sBAAA,GAC5C,uCAD4C,CACJ;AA0B1C,IAAA,WAAA,CACY,UAA8B,EAC9B,MAAyB,EACzB,WAA4B,EAAA;QAF5B,IAAU,CAAA,UAAA,GAAV,UAAU;QACV,IAAM,CAAA,MAAA,GAAN,MAAM;QACN,IAAW,CAAA,WAAA,GAAX,WAAW;AAzBvB,QAAA,IAAA,CAAA,YAAY,GAAc;AACxB,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,UAAU,EAAE,UAAU;AACtB,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,WAAW,EAAE,OAAO;SACrB;AAED,QAAA,IAAA,CAAA,KAAK,GAAgB;YACnB,yBAAyB,EACvB,cAAc,CAAC,YAAY,EAAE,iBAAiB,CAAC,sBAAsB,CAAC;gBACtE,IAAI;AACN,YAAA,iBAAiB,EAAE,KAAK;AACxB,YAAA,qBAAqB,EAAE,KAAK;AAC5B,YAAA,6BAA6B,EAAE,KAAK;AACpC,YAAA,sBAAsB,EAAE,KAAK;AAC7B,YAAA,eAAe,EAAE,KAAK;SACvB;AAEO,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,OAAO,EAAO;AAExC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;;QA8D9C,IAAc,CAAA,cAAA,GAAG,MAAiC;AAChD,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAChC,GAAG,CAAC,CAAC,WAAW,KAAI;gBAClB,OAAO,IAAI,cAAc,CAAC;AACxB,oBAAA,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;AACpC,oBAAA,eAAe,EAAE,CAAA,sBAAA,EAAyB,WAAW,EAAE,EAAE,CAAE,CAAA;AAC3D,oBAAA,eAAe,EAAE,IAAI;AACrB,oBAAA,WAAW,EAAE,WAAW;AACzB,iBAAA,CAAC;aACH,CAAC,CACH;AACH,SAAC;;;AAMD,QAAA,IAAA,CAAA,cAAc,GAAG,CACf,KAAgC,KACN;YAC1B,OAAO,EAAE,EAAE;AACb,SAAC;AAED,QAAA,IAAA,CAAA,+BAA+B,GAAG,CAAC,eAAyB,KAAI,GAAG;;IA7EnE,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACpB,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB;AAC5D,YAAA,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE;AAChC,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;;;AAI/B,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACpB,IAAI,CAAC,KAAK,CAAC,yBAAyB;AAClC,gBAAA,CAAC,IAAI,CAAC,KAAK,CAAC,yBAAyB;AACvC,YAAA,eAAe,CACb,YAAY,EACZ,iBAAiB,CAAC,sBAAsB,EACxC,IAAI,CAAC,KAAK,CAAC,yBAAyB,CACrC;;aACI;YACL,IAAI,CAAC,KAAK,CAAC,sBAAsB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB;AAEtE,YAAA,IAAI,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE;AACrC,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;;;;IAKjC,kBAAkB,GAAA;QAChB,IAAI,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB;AACpE,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE;AACpC,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;;;IAI/B,0BAA0B,GAAA;QACxB,IAAI,CAAC,KAAK,CAAC,6BAA6B;AACtC,YAAA,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B;AAC3C,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,6BAA6B,EAAE;AAC5C,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;;;IAI/B,SAAS,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,KAAK,SAAS;;IAGjD,SAAS,GAAA;AACP,QAAA,OAAO,MAAM,CAAC,UAAU,GAAG,GAAG;;IAGhC,QAAQ,GAAA;AACN,QAAA,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE;;;IAgC1B,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE;;;+GA1H5B,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAwB,kBAAA,EAAA,EAAA,EAAA,KAAA,EAAApB,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAqB,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA,CAAA;;4FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MC3BY,kBAAkB,CAAA;AAH/B,IAAA,WAAA,GAAA;AAIU,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,OAAO,EAAmB;AAC3C,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,OAAO,EAAE;AAEnC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE;AAC5C,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;AAS/C;AAPC,IAAA,iBAAiB,CAAC,KAAsB,EAAA;AACtC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;;IAG7B,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;;+GAZlB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA,CAAA;;4FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCwDY,iBAAiB,CAAA;AAyB5B,IAAA,WAAA,CACS,aAAgC,EAC/B,EAAqB,EACtB,MAAc,EACb,WAA+B,EAC/B,WAA4B,EAC5B,UAA8B,EAC9B,MAAyB,EAAA;QAN1B,IAAa,CAAA,aAAA,GAAb,aAAa;QACZ,IAAE,CAAA,EAAA,GAAF,EAAE;QACH,IAAM,CAAA,MAAA,GAAN,MAAM;QACL,IAAW,CAAA,WAAA,GAAX,WAAW;QACX,IAAW,CAAA,WAAA,GAAX,WAAW;QACX,IAAU,CAAA,UAAA,GAAV,UAAU;QACV,IAAM,CAAA,MAAA,GAAN,MAAM;QAvBhB,IAAM,CAAA,MAAA,GAAG,KAAK;QAMN,IAAsB,CAAA,sBAAA,GAAwB,IAAI;QAE1D,IAAG,CAAA,GAAA,GAAW,EAAE;AAEhB,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,mBAAmB,CAAW,IAAI,EAAE;AACxD,YAAA,QAAQ,EAAE,QAAQ;AACnB,SAAA,CAAC;QAuHF,IAA+B,CAAA,+BAAA,GAAG,YAAW;YAC3C,IAAI,CAAC,aAAa,CAAC,+BAA+B,CAChD,IAAI,CAAC,eAAe,CAAC,KAAK,CAC3B;AACH,SAAC;AA9GC,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,SAAS,CAClE,CAAC,KAAK,KAAI;YACR,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAK;AAC9B,gBAAA,IAAI,KAAK,CAAC,UAAU,EAAE;AACpB,oBAAA,IAAI,CAAC,MAAM;AACT,wBAAA,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG;AAC3D,8BAAE;8BACA,KAAK;;qBACN;AACL,oBAAA,IACE,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG;AACtB,wBAAA,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EACrC;AACA,wBAAA,IAAI,CAAC,MAAM,GAAG,KAAK;;;AAGzB,aAAC,CAAC;AACJ,SAAC,CACF;AAED,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,MAAK;AACxE,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACrB,SAAC,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC;AACT,aAAA,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,YAAY,aAAa,CAAC;AACtD,aAAA,SAAS,CAAC,CAAC,MAAM,KAAI;AACpB,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;gBACxB,IAAI,CAAC,0BAA0B,EAAE;;AAErC,SAAC,CAAC;;IAGN,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI;AAE7C,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;cACZ,IAAI,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC;AAC9B,cAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AAEtB,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACxB,IAAI,CAAC,0BAA0B,EAAE;;AAGnC,QAAA,IAAI,CAAC,sBAAsB;YACzB,IAAI,CAAC,WAAW,CAAC,2BAA2B,CAAC,SAAS,CACpD,CAAC,0BAAoC,KAAI;AACvC,gBAAA,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,KAAK,UAAU,EAAE;AAC9D,oBAAA,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CACzC,0BAA0B,CAC3B;;AAEL,aAAC,CACF;;IAGL,0BAA0B,GAAA;AACxB,QAAA,IAAI,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;AAC9D,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,WAAW,EAAE,SAAS;AACtB,YAAA,YAAY,EAAE,SAAS;AACvB,YAAA,QAAQ,EAAE,SAAS;AACpB,SAAA,CAAC;QAEF,IAAI,WAAW,EAAE;AACf,YAAA,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;;;AAI3E,IAAA,SAAS,CAAC,KAAY,EAAA;;QAEpB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;YACxC,KAAK,CAAC,cAAc,EAAE;YACtB;;;AAIF,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACrB,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;;AAI9D,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACnB,YAAA,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM;;AAG5B,QAAA,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;AAGvD,IAAA,IAAI,gBAAgB,GAAA;QAClB,OAAO,IAAI,CAAC,IAAI,GAAG,UAAU,GAAG,IAAI,CAAC,MAAM,GAAG,UAAU,GAAG,WAAW;;AAGxE,IAAA,IACI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI;;;AAKlC,IAAA,cAAc,CAAC,KAAgC,EAAA;AAC7C,QAAA,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,KAAI;AACxD,YAAA,IAAI,CAAC,cAAc,GAAG,EAAE;AAC1B,SAAC,CAAC;;;IAWJ,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE;AAC/B,YAAA,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE;;AAG3C,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC9B,YAAA,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE;;AAG1C,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE;AAC/B,YAAA,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE;;;+GA9JlC,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA5B,IAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA6B,kBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,kBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EC9D9B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,4BAAA,EAAA,WAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,wnFAmFA,EDrBa,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,iBAAiB,EAN1B,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAZ,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,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,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAApB,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,uBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,sBAAsB,EAxBZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAiC,6BAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,WAAA,EAAA,cAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA;YACV,OAAO,CAAC,UAAU,EAAE;AAClB,gBAAA,KAAK,CACH,WAAW,EACX,KAAK,CAAC;AACJ,oBAAA,MAAM,EAAE,GAAG;AACZ,iBAAA,CAAC,CACH;AACD,gBAAA,KAAK,CACH,UAAU,EACV,KAAK,CAAC;AACJ,oBAAA,MAAM,EAAE,GAAG;AACZ,iBAAA,CAAC,CACH;AACD,gBAAA,UAAU,CACR,wBAAwB,EACxB,OAAO,CAAC,sCAAsC,CAAC,CAChD;aACF,CAAC;AACH,SAAA,EAAA,CAAA,CAAA;;4FAQU,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBA/B7B,SAAS;AAEE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAEV,UAAA,EAAA;wBACV,OAAO,CAAC,UAAU,EAAE;AAClB,4BAAA,KAAK,CACH,WAAW,EACX,KAAK,CAAC;AACJ,gCAAA,MAAM,EAAE,GAAG;AACZ,6BAAA,CAAC,CACH;AACD,4BAAA,KAAK,CACH,UAAU,EACV,KAAK,CAAC;AACJ,gCAAA,MAAM,EAAE,GAAG;AACZ,6BAAA,CAAC,CACH;AACD,4BAAA,UAAU,CACR,wBAAwB,EACxB,OAAO,CAAC,sCAAsC,CAAC,CAChD;yBACF,CAAC;qBACH,EACQ,OAAA,EAAA;wBACP,YAAY;wBACZ,YAAY;wBACZ,kBAAkB;wBAClB,sBAAsB;AACvB,qBAAA,EAAA,QAAA,EAAA,wnFAAA,EAAA;8PAGQ,IAAI,EAAA,CAAA;sBAAZ;gBAEQ,KAAK,EAAA,CAAA;sBAAb;gBAEmD,IAAI,EAAA,CAAA;sBAAvD;;sBAAS,WAAW;uBAAC,4BAA4B;gBAEzC,SAAS,EAAA,CAAA;sBAAjB;gBAyHG,WAAW,EAAA,CAAA;sBADd,WAAW;uBAAC,uBAAuB;;;MEzKzB,oBAAoB,CAAA;AAG/B,IAAA,WAAA,CACS,aAAgC,EAC/B,WAA4B,EAC5B,gBAAkC,EAClC,MAAyB,EAAA;QAH1B,IAAa,CAAA,aAAA,GAAb,aAAa;QACZ,IAAW,CAAA,WAAA,GAAX,WAAW;QACX,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAChB,IAAM,CAAA,MAAA,GAAN,MAAM;;AAGhB,IAAA,QAAQ;AAER,IAAA,WAAW;+GAZA,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAL,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAlB,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAT,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAiC,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,ECpBjC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,qXAgBA,EDEY,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,gQAAE,iBAAiB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAE9B,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBALhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAEf,OAAA,EAAA,CAAC,YAAY,EAAE,iBAAiB,CAAC,EAAA,QAAA,EAAA,qXAAA,EAAA;0KAGjC,IAAI,EAAA,CAAA;sBAAZ;;;MEVU,mBAAmB,CAAA;AAG9B,IAAA,WAAA,CAAmB,EAAc,EAAA;QAAd,IAAE,CAAA,EAAA,GAAF,EAAE;;AAErB,IAAA,QAAQ;+GALG,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXhC,iDACA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDQY,oBAAoB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAEnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAL/B,SAAS;+BACE,SAAS,EAAA,OAAA,EAEV,CAAC,oBAAoB,CAAC,EAAA,QAAA,EAAA,iDAAA,EAAA;+EAGtB,IAAI,EAAA,CAAA;sBAAZ;;;MEmBU,sBAAsB,CAAA;IAkCjC,WACS,CAAA,aAAgC,EAC/B,WAA4B,EAC1B,MAAc,EAChB,gBAAkC,EACnC,MAAyB,EAAA;QAJzB,IAAa,CAAA,aAAA,GAAb,aAAa;QACZ,IAAW,CAAA,WAAA,GAAX,WAAW;QACT,IAAM,CAAA,MAAA,GAAN,MAAM;QACR,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QACjB,IAAM,CAAA,MAAA,GAAN,MAAM;QAtCN,IAAgB,CAAA,gBAAA,GAAG,IAAI;QACvB,IAA8B,CAAA,8BAAA,GAAG,IAAI;;QAErC,IAAe,CAAA,eAAA,GAAG,IAAI;QACtB,IAAgB,CAAA,gBAAA,GAAG,IAAI;QACvB,IAAmB,CAAA,mBAAA,GAAG,KAAK;QAC3B,IAAmB,CAAA,mBAAA,GAUZ,SAAS;AAEf,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,YAAY,EAAE;QACxC,IAAS,CAAA,SAAA,GAAiC,EAAE;QAE7C,IAAsB,CAAA,sBAAA,GAAwB,IAAI;QAK1D,IAAe,CAAA,eAAA,GAAG,KAAK;QA8CvB,IAAe,CAAA,eAAA,GAAG,MAAK;AACrB,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;AAChC,iBAAA,cAAc;AACd,iBAAA,SAAS,CAAC,CAAC,cAAc,KAAI;AAC5B,gBAAA,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC,eAAe;AACrD,gBAAA,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC,eAAe;AACrD,gBAAA,IAAI,CAAC,WAAW,GAAG,cAAc,CAAC,WAAW;AAC7C,gBAAA,IAAI,CAAC,WAAW,GAAG,cAAc,CAAC,WAAW,EAAE;qBAC5C,MAAM,CAAC,CAAC;AACR,qBAAA,iBAAiB,EAAE;AACxB,aAAC,CAAC;AACN,SAAC;;AA1CD,IAAA,MAAM,QAAQ,GAAA;QACZ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YAC/B,IAAI,CAAC,SAAS,GAAG;AACf,gBAAA;oBACE,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,aAAa,CAAC;AACrD,oBAAA,IAAI,EAAE,SAAS;AACf,oBAAA,aAAa,EAAE,IAAI;oBACnB,OAAO,EAAE,MAAK;wBACZ,IAAI,CAAC,eAAe,EAAE;qBACvB;AACF,iBAAA;AACD,gBAAA;oBACE,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC;AAChD,oBAAA,IAAI,EAAE,aAAa;AACnB,oBAAA,aAAa,EAAE,IAAI;oBACnB,OAAO,EAAE,MAAK;AACZ,wBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;qBAC1B;AACF,iBAAA;aACF;;QAGH,IAAI,CAAC,MAAM,CAAC;AACT,aAAA,IAAI,CAACC,QAAM,CAAC,CAAC,KAAK,KAAK,KAAK,YAAY,aAAa,CAAC;AACtD,aAAA,SAAS,CAAC,CAAC,KAAoB,KAAI;YAClC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,6BAA6B,GAAG,KAAK;AAChE,SAAC,CAAC;QAEJ,IAAI,CAAC,eAAe,EAAE;;AAgBxB,IAAA,eAAe,CAAC,KAAU,EAAA;AACxB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;YACnD,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,6BAA6B,IAAI,IAAI,EAAE;gBAClE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,6BAA6B,GAAG,KAAK;;;;IAKpE,eAAe,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,8BAA8B,EAAE;YACvC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC;;;IAInD,gBAAgB,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;;AAGlD,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;;IAGpC,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE;AAC/B,YAAA,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE;;;+GA9GlC,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAP,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAlB,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAT,IAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAF,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAqC,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,8BAAA,EAAA,gCAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,OAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,MAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,iCAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iCAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/BnC,i6FA+FA,EAAA,MAAA,EAAA,CAAA,4FAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvEI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA/B,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,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,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAe,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,uBAAuB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGT,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAZlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,EAG1B,OAAA,EAAA;wBACP,YAAY;wBACZ,YAAY;wBACZ,YAAY;wBACZ,uBAAuB;wBACvB,kBAAkB;AACnB,qBAAA,EAAA,QAAA,EAAA,i6FAAA,EAAA,MAAA,EAAA,CAAA,4FAAA,CAAA,EAAA;iMAGQ,gBAAgB,EAAA,CAAA;sBAAxB;gBACQ,8BAA8B,EAAA,CAAA;sBAAtC;gBAEQ,eAAe,EAAA,CAAA;sBAAvB;gBACQ,gBAAgB,EAAA,CAAA;sBAAxB;gBACQ,mBAAmB,EAAA,CAAA;sBAA3B;gBACQ,mBAAmB,EAAA,CAAA;sBAA3B;gBAWQ,eAAe,EAAA,CAAA;sBAAvB;gBACS,kBAAkB,EAAA,CAAA;sBAA3B;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBASwB,IAAI,EAAA,CAAA;sBAA5B,SAAS;uBAAC,YAAY;gBAGvB,+BAA+B,EAAA,CAAA;sBAD9B,SAAS;uBAAC,iCAAiC;;;MExCjC,uBAAuB,CAAA;AAIlC,IAAA,WAAA,CACS,aAAgC,EAC7B,MAAc,EAChB,MAAyB,EACzB,gBAAkC,EAAA;QAHnC,IAAa,CAAA,aAAA,GAAb,aAAa;QACV,IAAM,CAAA,MAAA,GAAN,MAAM;QACR,IAAM,CAAA,MAAA,GAAN,MAAM;QACN,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;AAP1B,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW;;AAUrC,IAAA,MAAM,QAAQ,GAAA;QACZ,IAAI,CAAC,MAAM,CAAC;AACT,aAAA,IAAI,CAACe,QAAM,CAAC,CAAC,KAAK,KAAK,KAAK,YAAY,aAAa,CAAC;AACtD,aAAA,SAAS,CAAC,CAAC,KAAoB,KAAI;YAClC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,6BAA6B,GAAG,KAAK;AAChE,SAAC,CAAC;;+GAhBK,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAP,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA5B,IAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAqC,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAtC,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtBpC,ocAiBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDFI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,sBAAsB,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,gCAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGb,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAXnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EAE3B,OAAA,EAAA;wBACP,YAAY;wBACZ,YAAY;wBACZ,YAAY;wBACZ,WAAW;wBACX,sBAAsB;AACvB,qBAAA,EAAA,QAAA,EAAA,ocAAA,EAAA;sKAIwB,UAAU,EAAA,CAAA;sBAAlC,SAAS;uBAAC,YAAY;;;MEDZ,eAAe,CAAA;IAY1B,WACU,CAAA,WAA4B,EAC5B,MAAyB,EAAA;QADzB,IAAW,CAAA,WAAA,GAAX,WAAW;QACX,IAAM,CAAA,MAAA,GAAN,MAAM;QAbP,IAAI,CAAA,IAAA,GAAuB,EAAE;AACtC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW;AACrC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ;AAC/B;;;AAGG;QACM,IAAsB,CAAA,sBAAA,GAAY,KAAK;QAExC,IAAsB,CAAA,sBAAA,GAAwB,IAAI;AAmB1D,QAAA,IAAA,CAAA,+BAA+B,GAAG,CAChC,IAAwB,EACxB,0BAAoC,KAClC;AACF,YAAA,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AACxB,gBAAA,IAAI,QAAQ,CAAC,KAAK,EAAE;oBAClB,IAAI,CAAC,+BAA+B,CAClC,QAAQ,CAAC,KAAK,EACd,0BAA0B,CAC3B;;AAEH,gBAAA,IAAI,OAAO,QAAQ,CAAC,aAAa,KAAK,UAAU,EAAE;AAChD,oBAAA,QAAQ,CAAC,OAAO;AACd,wBAAA,QAAQ,CAAC,aAAa,CAAC,0BAA0B,CAAC,IAAI,KAAK;;AAEjE,aAAC,CAAC;AACJ,SAAC;;IA5BD,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,sBAAsB;YACzB,IAAI,CAAC,WAAW,CAAC,2BAA2B,CAAC,SAAS,CACpD,CAAC,0BAAoC,KAAI;gBACvC,IAAI,CAAC,+BAA+B,CAClC,IAAI,CAAC,IAAI,EACT,0BAA0B,CAC3B;AACH,aAAC,CACF;;IAqBL,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE;AAC/B,YAAA,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE;;;+GAjDlC,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAQ,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAF,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvB5B,m+BAsCA,EAAA,MAAA,EAAA,CAAA,qqBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDtBI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,eAAA,EAAA,IAAA,EAAA,WAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,sBAAsB,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,gCAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGb,eAAe,EAAA,UAAA,EAAA,CAAA;kBAZ3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAGlB,OAAA,EAAA;wBACP,YAAY;wBACZ,YAAY;wBACZ,aAAa;wBACb,YAAY;wBACZ,sBAAsB;AACvB,qBAAA,EAAA,QAAA,EAAA,m+BAAA,EAAA,MAAA,EAAA,CAAA,qqBAAA,CAAA,EAAA;8GAGQ,IAAI,EAAA,CAAA;sBAAZ;gBAOQ,sBAAsB,EAAA,CAAA;sBAA9B;;;MEHU,uBAAuB,CAAA;AA6BlC,IAAA,WAAA,CACY,aAAgC,EAChC,QAAmB,EACnB,MAAc,EAAA;QAFd,IAAa,CAAA,aAAA,GAAb,aAAa;QACb,IAAQ,CAAA,QAAA,GAAR,QAAQ;QACR,IAAM,CAAA,MAAA,GAAN,MAAM;QA/BT,IAAI,CAAA,IAAA,GAAuB,EAAE;QACtC,IAAQ,CAAA,QAAA,GAAuB,EAAE;QACjC,IAAO,CAAA,OAAA,GAAuB,EAAE;QACvB,IAAgB,CAAA,gBAAA,GAAY,IAAI;AACzC;;;AAGG;QACM,IAA6B,CAAA,6BAAA,GAAY,KAAK;AAEvD;;AAEG;QAEM,IAAQ,CAAA,QAAA,GAAW,QAAQ;AA2JpC,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAK,GAAG;AAxIzB,QAAA,IAAI,CAAC,2BAA2B;YAC9B,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,MAAK;AAC7C,gBAAA,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;AAClC,oBAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAClD,UAAU,EACV,OAAO,EACP,CAAC,KAAK,KAAI;AACR,wBAAA,MAAM,gBAAgB,GAAG,EACvB,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;AAC1D,4BAAA,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;AACxD,4BAAA,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE,aAAa,CAAC,UAAU,CACvD,KAAK,CAAC,MAAM,CACb;AACD,4BAAA,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE,aAAa,CAAC,QAAQ,CACrD,KAAK,CAAC,MAAM,CACb;AACD,4BAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC;4BAC7C,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CACnD;wBAED,IAAI,gBAAgB,EAAE;4BACpB,IAAI,CAAC,QAAQ,EAAE;;AAEnB,qBAAC,CACF;;AAGH,gBAAA,IAAI,CAAC,IAAI,CAAC,+BAA+B,EAAE;AACzC,oBAAA,IAAI,CAAC,+BAA+B,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CACzD,UAAU,EACV,OAAO,EACP,CAAC,KAAK,KAAI;AACR,wBAAA,MAAM,gBAAgB,GAAG,EACvB,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;AACvD,4BAAA,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CACtD;wBAED,IAAI,gBAAgB,EAAE;4BACpB,IAAI,CAAC,eAAe,EAAE;;AAE1B,qBAAC,CACF;;gBAGH,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,sBAAsB,EAAE;oBACnD,IAAI,CAAC,eAAe,EAAE;;AAE1B,aAAC,CAAC;QAEJ,IAAI,CAAC,MAAM,CAAC;AACT,aAAA,IAAI,CAACoC,QAAM,CAAC,CAAC,KAAK,KAAK,KAAK,YAAY,aAAa,CAAC;aACtD,SAAS,CAAC,MAAK;YACd,IAAI,CAAC,QAAQ,EAAE;YACf,IAAI,CAAC,eAAe,EAAE;AACxB,SAAC,CAAC;;IAGN,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;;aACzB;AACL,YAAA,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;;;IAI1C,QAAQ,GAAA;QACN,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,iBAAiB,GAAG,KAAK;QAClD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,sBAAsB,GAAG,KAAK;QACvD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,eAAe,GAAG,KAAK;AAChD,QAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE;YACjC,IAAI,CAAC,wBAAwB,EAAE;AAC/B,YAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI;;QAEtC,IAAI,CAAC,iBAAiB,EAAE;;IAG1B,eAAe,GAAA;QACb,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,qBAAqB,GAAG,KAAK;AACtD,QAAA,IAAI,IAAI,CAAC,+BAA+B,EAAE;YACxC,IAAI,CAAC,+BAA+B,EAAE;AACtC,YAAA,IAAI,CAAC,+BAA+B,GAAG,IAAI;;;IAI/C,eAAe,GAAA;AACb,QAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE;YAC3B,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC;;aACxC;AACL,YAAA,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,iBAAiB;;;IAIhD,iBAAiB,GAAA;AACf,QAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE;YAC3B,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC;;aAC3C;AACL,YAAA,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CACvD,IAAI,MAAM,CACR,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,EAC7D,IAAI,CACL,EACD,GAAG,CACJ;;;AAIL,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO;YACL,oBAAoB,EAClB,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,KAAK,OAAO;YACzD,mBAAmB,EACjB,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,KAAK,MAAM;YACxD,gBAAgB,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,QAAQ,KAAK,SAAS;YACxE,eAAe,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,QAAQ,KAAK,QAAQ;AACtE,YAAA,wBAAwB,EACtB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,yBAAyB;AAClD,gBAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,QAAQ,KAAK,QAAQ;AACvD,YAAA,uBAAuB,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,iBAAiB;AACnE,YAAA,sBAAsB,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,sBAAsB;YACvE,gBAAgB,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,UAAU,KAAK,QAAQ;YACzE,mBAAmB,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM;SAC7D;;IAGH,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,2BAA2B,EAAE;AACpC,YAAA,IAAI,CAAC,2BAA2B,CAAC,WAAW,EAAE;;AAGhD,QAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE;YACjC,IAAI,CAAC,wBAAwB,EAAE;;QAGjC,IAAI,CAAC,gBAAgB,EAAE;;+GAvKd,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAP,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAA5B,IAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAuBvB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,6BAAA,EAAA,+BAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,mBAAmB,EAEnB,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,uBAAuB,2ICrDpC,wxBAwBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDHI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,mBAAmB,EACnB,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,uBAAuB,qEACvB,eAAe,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,wBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGN,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAXnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAElB,OAAA,EAAA;wBACP,YAAY;wBACZ,YAAY;wBACZ,mBAAmB;wBACnB,uBAAuB;wBACvB,eAAe;AAChB,qBAAA,EAAA,QAAA,EAAA,wxBAAA,EAAA;kIAGQ,IAAI,EAAA,CAAA;sBAAZ;gBAGQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAKQ,6BAA6B,EAAA,CAAA;sBAArC;gBAMQ,QAAQ,EAAA,CAAA;sBAAhB;gBAQ+B,UAAU,EAAA,CAAA;sBAAzC,SAAS;uBAAC,mBAAmB;gBAEM,cAAc,EAAA,CAAA;sBAAjD,SAAS;uBAAC,uBAAuB;gBAET,UAAU,EAAA,CAAA;sBAAlC,SAAS;uBAAC,YAAY;;;ME7CZ,iBAAiB,CAAA;AAI5B,IAAA,WAAA,CAAoB,MAAyB,EAAA;QAAzB,IAAM,CAAA,MAAA,GAAN,MAAM;AAH1B,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW;AACrC,QAAA,IAAA,CAAA,QAAQ,GAAW,IAAI,CAAC,MAAM,CAAC,QAAQ;;+GAF5B,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAS,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,ECV9B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,8zCA0CA,EDlCY,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,iRAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAR,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,UAAA,EAAA,SAAA,EAAA,aAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAEzB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAL7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAEZ,OAAA,EAAA,CAAC,YAAY,EAAE,YAAY,CAAC,EAAA,QAAA,EAAA,8zCAAA,EAAA;;;AEMjC,MAAO,4BAA6B,SAAQ,2BAA2B,CAAA;+GAAhE,4BAA4B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,oJCdzC,iWAeA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDHY,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,8BAAE,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAE5C,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBANxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,WAGxB,CAAC,YAAY,EAAE,YAAY,EAAE,iBAAiB,CAAC,EAAA,QAAA,EAAA,iWAAA,EAAA;8BAG/C,aAAa,EAAA,CAAA;sBAArB;;;AEaH;;;;;;;AAOG;MAIU,6BAA6B,CAAA;AAIxC,IAAA,WAAA,CAA4B,QAA6C,EAAA;QAA7C,IAAQ,CAAA,QAAA,GAAR,QAAQ;;AAEpC;;;;AAIG;AACH,IAAA,OAAO,sBAAsB,CAC3B,GAAqC,EACrC,GAAY,EAAA;AAEZ,QAAA,OAAO,IAAI;;+GAfF,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,CAAA,sBAAA,EAAA,OAAA,CAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAA7B,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAHzC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mCAAmC;AAC9C,iBAAA;gFAGgC,KAAK,EAAA,CAAA;sBAAnC,KAAK;uBAAC,sBAAsB;;;ACvC/B;;;;;;;;;;;;;;;;;;;;AAoBG;MAIU,iCAAiC,CAAA;+GAAjC,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAjC,iCAAiC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAjC,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAH7C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,4BAA4B;AACvC,iBAAA;;;ACvBD;;;;;;;;;;;;;;;;;;;;AAoBG;MAIU,8BAA8B,CAAA;AAMzC,IAAA,WAAA,GAAA;AALiB,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,CAA0B,UAAU,CAAC;AAChD,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;QAErB,IAAc,CAAA,cAAA,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;;;QAKjD,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAC1B,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,gBAAgB,CACpC,cAAc,EACd,IAAI,CAAC,cAAc,CACpB,CACF;;IAGH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,mBAAmB,CACvC,cAAc,EACd,IAAI,CAAC,cAAc,CACpB;;IAGK,IAAI,GAAA;AACV,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;;;QAIhC,IAAI,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,WAAW,GAAG,CAAC,EAAE;YACvC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC;;aACzC;AACL,YAAA,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC;;;+GAhCpB,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA9B,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAA9B,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAH1C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,yBAAyB;AACpC,iBAAA;;;ACXD;;;;;;;;AAQG;MAIU,+BAA+B,CAAA;AAI1C,IAAA,WAAA,CAA4B,QAA4C,EAAA;QAA5C,IAAQ,CAAA,QAAA,GAAR,QAAQ;;AAEpC;;;;AAIG;AACH,IAAA,OAAO,sBAAsB,CAC3B,GAAoC,EACpC,GAAY,EAAA;AAEZ,QAAA,OAAO,IAAI;;+GAfF,+BAA+B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA/B,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAA,wBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAA/B,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAH3C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qCAAqC;AAChD,iBAAA;gFAGkC,QAAQ,EAAA,CAAA;sBAAxC,KAAK;uBAAC,wBAAwB;;;ACOjC;AACA,SAAS,gBAAgB,CACvB,OAAmC,EACnC,KAAc,EAAA;IAEd,OAAO,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC;AAClF;AAEA;;;;;;;;;;AAUG;AACG,SAAU,aAAa,CAAC,KAAa,EAAA;AACzC,IAAA,OAAO;SACJ,SAAS,CAAC,KAAK;AACf,SAAA,OAAO,CAAC,kBAAkB,EAAE,EAAE;AAC9B,SAAA,OAAO,CAAC,SAAS,EAAE,IAAI;AACvB,SAAA,OAAO,CAAC,SAAS,EAAE,IAAI;AACvB,SAAA,WAAW;AACX,SAAA,IAAI,EAAE;AACX;AAEA;;;;;;;;AAQG;MA0TU,0BAA0B,CAAA;AAzTvC,IAAA,WAAA,GAAA;AA0TW,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAmB;;AAG3C,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAgB,IAAI,CAAC;AAElD;;;AAGG;AACM,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAiB,EAAE,CAAC;AAEzC;;;;AAIG;AACM,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAmB,EAAE,CAAC;;AAGzC,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC;;QAG3B,IAAQ,CAAA,QAAA,GAAG,MAAM,EAAQ;;QAGzB,IAAQ,CAAA,QAAA,GAAG,MAAM,EAAY;;QAG7B,IAAS,CAAA,SAAA,GAAG,MAAM,EAAQ;AAElB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;;AAGpC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;AAE3C;;;;AAIG;AACM,QAAA,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAE/B,SAAS,CAAC;AAEH,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;AAEzB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC;;AAG1B,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC;;AAGtB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAsB,IAAI,CAAC;AAEpD;;;;AAIG;AACM,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;YAC/B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;AAC9C,YAAA,IAAI,CAAC,MAAM;AAAE,gBAAA,OAAO,IAAI,CAAC,OAAO,EAAE;YAElC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,KAClC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC7C;AACH,SAAC,CAAC;AAEF;;;;;;;;AAQG;AACM,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;YAC/B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;YAEtE,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,WAAW;iBAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,OAAO,KAAK,KAAK;AAC3E,iBAAA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;AACvD,SAAC,CAAC;AAQF;;;;;AAKG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAChC,YAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CACpB,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,UAAU,CAAU,CAAC,CAC/D;YAED,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;gBACvC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC3C,OAAO;AACL,oBAAA,GAAG,MAAM;AACT,oBAAA,KAAK,EAAE,UAAU,IAAI,IAAI,GAAG,IAAI,GAAG,UAAU,GAAG,GAAG,GAAG,GAAG;iBAC1D;AACH,aAAC,CAAC;AACJ,SAAC,CAAC;AA+BF;;;;;;;AAOG;AACM,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACvC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE;AAC7B,YAAA,IAAI,CAAC,MAAM;AAAE,gBAAA,OAAO,EAAE;YAEtB,OAAO,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,MAAM;gBACvC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAChD,KAAK,EAAE,MAAM,CAAC,KAAK;AACpB,aAAA,CAAC,CAAC;AACL,SAAC,CAAC;AAmEH;;AAzIC,IAAA,YAAY,CAAC,EAAU,EAAA;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;AAuB1C;;;;AAIG;AACH,IAAA,QAAQ,CAAC,MAAsB,EAAA;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9B,MAAM,KAAK,GACT,OAAO,EAAE,KAAK,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC;AAEjE,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;;;IAIpD,KAAK,CAAC,MAAoB,EAAE,KAAY,EAAA;QACtC,IAAI,CAAC,UAAU,CACb,MAAM,EACN,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAG,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC,CACnE;;AAGH,IAAA,kBAAkB,CAAC,MAAoB,EAAA;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,CACzC,CAAC,SAAS,KAAK,SAAS,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,CAChD;AAED,QAAA,OAAO,KAAK,EAAE,QAAQ,IAAI,IAAI;;AAqBhC;;;;;AAKG;IACH,UAAU,CAAC,MAAoB,EAAE,KAAc,EAAA;QAC7C,MAAM,CAAC,GAAG,CAAC;YACT,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,MAAM,CAAC,eAAe;YACrD,KAAK;AACN,SAAA,CAAC;;AAGJ;;;AAGG;IACH,YAAY,CAAC,MAAoB,EAAE,QAAwB,EAAA;AACzD,QAAA,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;;AAGjD;;;;;;;AAOG;IACK,MAAM,CAAC,IAAqB,EAAE,GAAW,EAAA;QAC/C,IAAI,IAAI,KAAK,QAAQ;AAAE,YAAA,OAAO,GAAG;AACjC,QAAA,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;AAAE,YAAA,OAAO,IAAI;AAElC,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC;AAE1B,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,MAAM;;AAG7C,IAAA,KAAK,CAAC,MAAoB,EAAA;QACxB,MAAM,CAAC,MAAM,EAAE;AACf,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;;AAGxB;;;;;;;AAOG;AACH,IAAA,SAAS,CAAC,IAAmB,EAAA;;;;AAI3B,QAAA,IAAI,IAAI,CAAC,KAAK,YAAY,IAAI,EAAE;AAC9B,YAAA,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC;;AAG1D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO;AAE5D,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK;cAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;cACrE,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;;+GA9NhC,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA1B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,0BAA0B,EA1S3B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwST,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,u7EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EApTC,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,+VACX,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,MAAA,EAAA,aAAA,EAAA,cAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,gBAAgB,41CAChB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,iBAAiB,EACjB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,WAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,cAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,cAAA,EAAA,MAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,YAAA,EAAA,UAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,uUACb,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAiC,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,cAAA,EAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,MAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FA6SH,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAzTtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EACtB,OAAA,EAAA;wBACP,YAAY;wBACZ,WAAW;wBACX,kBAAkB;wBAClB,YAAY;wBACZ,cAAc;wBACd,gBAAgB;wBAChB,eAAe;wBACf,iBAAiB;wBACjB,aAAa;wBACb,YAAY;qBACb,EAES,QAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwST,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,u7EAAA,CAAA,EAAA;;;MCrWU,mCAAmC,CAAA;IAC9C,WACS,CAAA,GAAqB,EACrB,MAAmD,EAAA;QADnD,IAAG,CAAA,GAAA,GAAH,GAAG;QACH,IAAM,CAAA,MAAA,GAAN,MAAM;;IAGf,MAAM,GAAA;AACJ,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI;AAC7B,QAAA,MAAM,UAAU,GACd,qCAAqC,IAAI;cACrC,IAAI,CAAC,mCAAmC,CAAC,IAAI,CAAC,GAAG;cACjD,IAAI,CAAC,mCAAmC,CAAC,IAAI,CAAC,EAAE,CAAC;QAEvD,UAAU,CAAC,SAAS,CAAC;YACnB,IAAI,EAAE,MAAK;gBACT,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;aACtB;YACD,KAAK,EAAE,MAAK;gBACV,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;aACvB;AACF,SAAA,CAAC;;IAGJ,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;;+GAxBZ,mCAAmC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAApC,IAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAnC,mCAAmC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,SAAA,EAFnC,CAAC,mBAAmB,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzBlC,m1BAiCA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDTY,uBAAuB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,oDAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,wBAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,KAAA,EAAA,UAAA,EAAA,UAAA,EAAA,KAAA,EAAA,YAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,aAAA,EAAA,SAAA,EAAA,UAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAG/D,mCAAmC,EAAA,UAAA,EAAA,CAAA;kBAP/C,SAAS;+BACE,8BAA8B,EAAA,OAAA,EAG/B,CAAC,uBAAuB,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,EAAA,SAAA,EAChE,CAAC,mBAAmB,CAAC,EAAA,QAAA,EAAA,m1BAAA,EAAA;;;AE+ClC;;;;;;;AAOG;AACH;AACA,SAAS,cAAc,GAAA;AACrB,IAAA,OAAO,UAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE;AAC9E;AAEA;AACA,SAAS,cAAc,CAAC,CAAa,EAAE,CAAa,EAAA;AAClD,IAAA,QACE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;AACrB,QAAA,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAEvE;AAEA,MAAM,wBAAwB,GAG1B;AACF,IAAA,IAAI,EAAE,EAAE;AACR,IAAA,IAAI,EAAE,EAAE;AACR,IAAA,WAAW,EAAE,EAAE;AACf,IAAA,OAAO,EAAE,CAAC;AACV,IAAA,OAAO,EAAE,EAAE;;AAEX,IAAA,IAAI,EAAE,CAAC;CACR;MAoBY,0BAA0B,CAAA;AAkCrC;;;;;;;AAOG;AACH,IAAA,cAAc,CAAC,GAAW,EAAA;AACxB,QAAA,OAAO,GAAG,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,GAAG;;AAGhE;;;;AAIG;AACH,IAAA,kBAAkB,CAAC,GAAW,EAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;;AAGjC,IAAA,IAAI,2BAA2B,GAAA;AAC7B,QAAA,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;;;IAIlE,kBAAkB,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,aAAa,KAAK,UAAU,GAAG,CAAG,EAAA,IAAI,CAAC,cAAc,CAAA,EAAA,CAAI,GAAG,GAAG;;AAG7E;;;;AAIG;IACK,qBAAqB,GAAA;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,EAAE,aAAa;AAClD,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,sBAAsB;YAAE;QAE1C,MAAM,OAAO,GAAG,MAAK;AACnB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW;AAC9B,YAAA,IAAI,KAAK,KAAK,IAAI,CAAC,cAAc;gBAAE;AAEnC,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,CAAC;AACpD,SAAC;AAED,QAAA,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE;AACzC,YAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;gBAC/B,IAAI,CAAC,sBAAsB,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC;AACzD,gBAAA,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC;AAC3C,aAAC,CAAC;;;;;;QAOJ,cAAc,CAAC,OAAO,CAAC;;AAmLzB,IAAA,WAAA,CACU,MAAc,EACd,aAA4B,EAC5B,KAAqB,EACrB,cAAsC,EACtC,gBAAkC,EAClC,aAAgC,EAChC,YAA0B,EACP,MAAc,EAAA;QAPjC,IAAM,CAAA,MAAA,GAAN,MAAM;QACN,IAAa,CAAA,aAAA,GAAb,aAAa;QACb,IAAK,CAAA,KAAA,GAAL,KAAK;QACL,IAAc,CAAA,cAAA,GAAd,cAAc;QACd,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAChB,IAAa,CAAA,aAAA,GAAb,aAAa;QACb,IAAY,CAAA,YAAA,GAAZ,YAAY;QACO,IAAM,CAAA,MAAA,GAAN,MAAM;AAnRlB,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAI9B,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;AAEtC;;;;;;;AAOG;QACgB,IAAoB,CAAA,oBAAA,GAAG,MAAM;AAEhD;;;;;;AAMG;QACO,IAAc,CAAA,cAAA,GAAG,CAAC;;QAKpB,IAAW,CAAA,WAAA,GAA2B,IAAI;QA6EzC,IAAS,CAAA,SAAA,GAAW,YAAY;;QAIhC,IAAkB,CAAA,kBAAA,GAAa,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;AAoBzD;;;;;;AAMG;QACH,IAAY,CAAA,YAAA,GAAkB,IAAI;;QAEzB,IAAa,CAAA,aAAA,GAAY,IAAI;;QAE7B,IAAe,CAAA,eAAA,GAAY,KAAK;QAChC,IAAQ,CAAA,QAAA,GAAY,KAAK;QACzB,IAAO,CAAA,OAAA,GAAG,IAAI;AAEvB;;;;;;;;;AASG;AACgB,QAAA,IAAA,CAAA,UAAU,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE;AAEjD,QAAA,IAAA,CAAA,oBAAoB,GAAyB,IAAI,YAAY,EAAE;QAgBjE,IAAO,CAAA,OAAA,GAAY,IAAI;QAEtB,IAAkB,CAAA,kBAAA,GAAa,EAAE;AAC1C,QAAA,IAAA,CAAA,iBAAiB,GAAa,EAAE,CAAC;AACjC,QAAA,IAAA,CAAA,8BAA8B,GAAa,EAAE,CAAC;QACrC,IAAe,CAAA,eAAA,GAAa,EAAE;AAE7B,QAAA,IAAA,CAAA,UAAU,GAAyB,IAAI,YAAY,EAAE;QAC/D,IAAkB,CAAA,kBAAA,GAAW,CAAC;QAC9B,IAAa,CAAA,aAAA,GAAY,IAAI;AAC7B,QAAA,IAAA,CAAA,iBAAiB,GAAY,KAAK,CAAC;QACnC,IAAmB,CAAA,mBAAA,GAAY,IAAI;;QAE3B,IAAa,CAAA,aAAA,GAAkB,IAAI;QACnC,IAAY,CAAA,YAAA,GAA6C,IAAI;AAC3D,QAAA,IAAA,CAAA,qBAAqB,GAC7B,IAAI,YAAY,EAAE;;QAOX,IAAa,CAAA,aAAA,GAAY,IAAI;;QAE7B,IAAuB,CAAA,uBAAA,GAAY,IAAI;;QAEvC,IAAqB,CAAA,qBAAA,GAAY,KAAK;QAOtC,IAAW,CAAA,WAAA,GAAY,IAAI;;QAS3B,IAAY,CAAA,YAAA,GAAwB,SAAS;;QAW7C,IAAgB,CAAA,gBAAA,GAAW,CAAC;QAErC,IAAoB,CAAA,oBAAA,GAAsB,IAAI;;QAG9C,IAAW,CAAA,WAAA,GAAa,EAAE;;QAGlB,IAAoB,CAAA,oBAAA,GAAG,CAAC;;QAGhC,IAAW,CAAA,WAAA,GAAa,EAAE;QAE1B,IAAgB,CAAA,gBAAA,GAAkB,IAAI;AACtC,QAAA,IAAA,CAAA,eAAe,GAAa,EAAE,CAAC;AAE/B,QAAA,IAAA,CAAA,aAAa,GAAU,EAAE,CAAC;AAQhB,QAAA,IAAA,CAAA,WAAW,GAAgC,IAAI,YAAY,EAAE;AAC7D,QAAA,IAAA,CAAA,aAAa,GAAgC,IAAI,YAAY,EAAE;AACzE;;;;AAIG;QACM,IAAkB,CAAA,kBAAA,GAAY,KAAK;;AA2L5C;;;;AAIG;QACK,IAAyB,CAAA,yBAAA,GAA4B,EAAE;AA8N/D;;;;AAIG;QACK,IAAU,CAAA,UAAA,GAA4B,EAAE;;QAGxC,IAAW,CAAA,WAAA,GAAa,EAAE;AAElC;;;;;AAKG;QACK,IAAY,CAAA,YAAA,GAA2B,EAAE;;QA0jBjD,IAAU,CAAA,UAAA,GAAkB,IAAI;QAExB,IAAc,CAAA,cAAA,GAAuB,IAAI;QAEzC,IAAa,CAAA,aAAA,GAAkB,IAAI;;QAGnC,IAAe,CAAA,eAAA,GAAG,IAAI;AAE9B;;;;;AAKG;AACc,QAAA,IAAA,CAAA,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAU,YAAY,CAAC;AAEtD,QAAA,IAAA,CAAA,SAAS,GAAG,SAAS,CAAC,0BAA0B,CAAC;AAUjD,QAAA,IAAA,CAAA,eAAe,GAC9B,SAAS,CAA0B,iBAAiB,CAAC;AA6NvD;;;;;AAKG;AACH;;;;;;;AAOG;QACH,IAAQ,CAAA,QAAA,GAAmB,EAAE;AA0B7B;;;;AAIG;QACH,IAAa,CAAA,aAAA,GAAG,IAAI;AAEpB;;;;AAIG;QACH,IAAe,CAAA,eAAA,GAAqB,EAAE;;IAjwCtC,eAAe,GAAA;QACb,IAAI,CAAC,kBAAkB,EAAE;QACzB,IAAI,CAAC,qBAAqB,EAAE;;AAG9B;;;;;;;AAOG;AACH,IAAA,eAAe,CAAC,GAAW,EAAA;AACzB,QAAA,IAAI,GAAG,CAAC,KAAK,IAAI,IAAI;AAAE,YAAA,OAAO,IAAI;AAClC,QAAA,QACE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK;AACnE,cAAE,QAAQ,IAAI,IAAI;;;;;IAOhB,kBAAkB,GAAA;AACxB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAErD,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAA8C,KAAI;AACnE,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC;YAEpD,IAAI,QAAQ,IAAI,QAAQ,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE;AACrC,gBAAA,MAAM,UAAU,GAAG,KAAK,CAAC,aAA2B;gBACpD,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO;gBAEjE,IAAI,gBAAgB,EAAE;;;;oBAIpB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAChD,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAC/B;AACD,oBAAA,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CAAC;AACpC,0BAAE;2BACC,IAAI,CAAC,oBAAoB,EAAE,IAAI,SAAS,CAAC;AAE9C,oBAAA,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AACzB,oBAAA,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AAAE,wBAAA,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AACnD,oBAAA,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI;oBAChC,IAAI,CAAC,qBAAqB,EAAE;;qBACvB;;;oBAGL,IAAI,CAAC,gBAAgB,EAAE;;;iBAEpB;gBACL,YAAY,CAAC,KAAK,CAAC;;gBAEnB,IAAI,CAAC,qBAAqB,EAAE;;AAEhC,SAAC;;AAGH;;;;;;;AAOG;IACK,+BAA+B,GAAA;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,EAAE,EAAE,IAAI;AAClD,QAAA,MAAM,UAAU,GAAG;AACjB,YAAA,IAAI,CAAC,IAAI;AACT,YAAA,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI;AAC3D,kBAAE;AACF,kBAAE,IAAI;SACT;AAED,QAAA,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE;AAC9B,YAAA,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;gBAC7D,IAAI,CAAC,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC,IAAI,CAChE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAChB;;;;AAKP,IAAA,WAAW,CAAC,OAAsB,EAAA;;AAEhC,QAAA,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI;YAAE,IAAI,CAAC,+BAA+B,EAAE;QAC7D,IAAI,OAAO,CAAC,OAAO,CAAC;YAAE,IAAI,CAAC,eAAe,EAAE;;IAG9C,QAAQ,GAAA;;;;;QAKN,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACrC,YAAA,MAAM,IAAI,KAAK,CACb,2JAA2J,CAC5J;;AAGH,QAAA,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe;AAErE,QAAA,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI;QAGjD,IAAI,IAAI,CAAC,mCAAmC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACnE,YAAA,IAAI,CAAC,aAAa,GAAG,UAAU;;AAGjC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAkB,eAAA,EAAA,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;AACpE,YAAA,IAAI,CAAC,gBAAgB;gBACnB,IAAI,CAAC,sBAAsB,IAAI;AAC7B,sBAAE,CAAG,EAAA,OAAO,IAAI,IAAI,CAAC,sBAAsB,CAAE;sBAC3C,OAAO;;aACR;YACL,IAAI,CAAC,UAAU,EAAE;;QAGnB,IAAI,CAAC,+BAA+B,EAAE;;;;;;AAOtC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,EAAE;QAE7C,IAAI,CAAC,uBAAuB,EAAE;QAC9B,IAAI,CAAC,mBAAmB,EAAE;AAE1B,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC;QAC9C,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,uBAAuB,EAAE;AAEhD,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,0BAA0B,CAAC,YAAY,CAAC;QAC5E,IAAI,CAAC,kBAAkB,EAAE;;;AAIzB,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;AACzB,aAAA,MAAM,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;aAC1C,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAM,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;;;;;;;;;AAUzD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,EAAE;AAC7C,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,KAAK,EAAE;AACtC,cAAE,IAAI,CAAC,gBAAgB;eACpB,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,aAAa,CAAC;AAClD,gBAAA,IAAI,CAAC,yBAAyB,EAAE,CAAC;AACrC,QAAA,IAAI,CAAC,4BAA4B,CAAC,UAAU,CAAC;;;IAavC,OAAO,YAAY,CAAC,GAAW,EAAA;AACrC,QAAA,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK;;AAGpB;;;;AAIG;AACH,IAAA,IAAY,eAAe,GAAA;QACzB,OAAO,IAAI,CAAC;cACR,GAAG,IAAI,CAAC,gBAAgB,CAAG,EAAA,IAAI,CAAC,SAAS,CAAU,QAAA;cACnD,IAAI;;;AAIV,IAAA,eAAe,CAAC,GAAW,EAAA;AACzB,QAAA,IAAI,CAAC,0BAA0B,CAAC,YAAY,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI;QAC9D,IAAI,GAAG,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;AACjC,QAAA,OAAO,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK;;AAG3E;;;;;;AAMG;IACK,WAAW,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI;QAEnD,MAAM,IAAI,GAAG,IAAI,GAAG,CAClB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CACvD;AAED,QAAA,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CACxB,CAAC,CAAC,EAAE,CAAC,KACH,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAM,CAAC,IAAI,MAAM,CAAC,gBAAgB;AAC9C,aAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAM,CAAC,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAClD;;AAGH;;;;AAIG;IACH,aAAa,CAAC,GAAW,EAAE,SAAiB,EAAA;AAC1C,QAAA,IAAI,GAAG,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK;AAE/C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,EAAE;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AAC/B,QAAA,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS;AAE3B,QAAA,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;AAE1D,QAAA,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,WAAW;;AAG/B,IAAA,cAAc,CAAC,SAAiB,EAAA;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU;AAC3B,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;QACxB,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC;YAAE;AAEjD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACvC,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;;;AAItD,IAAA,WAAW,CAAC,KAAe,EAAE,GAAW,EAAE,EAAU,EAAA;QAC1D,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAE3D,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAM,CAAC;QACrD,IAAI,CAAC,mBAAmB,EAAE;QAC1B,IAAI,CAAC,kBAAkB,EAAE;;IAGnB,kBAAkB,GAAA;QACxB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,0BAA0B,CAAC,YAAY,CAAC;;AAG3E;;;;;;;;;;;;AAYG;AACH,IAAA,iBAAiB,CAAC,KAAiB,EAAA;AACjC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;QAE1C,IAAI,CAAC,eAAe,GAAG,CAAC,MAAM,CAAC,OAAO,CACpC,sCAAsC,CACvC;;IAGH,iBAAiB,CAAC,GAAW,EAAE,KAAgB,EAAA;QAC7C,IAAI,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YAC5C,KAAK,CAAC,cAAc,EAAE;YACtB;;AAGF,QAAA,IAAI,CAAC,aAAa,GAAG,GAAG;AACxB,QAAA,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;;IAG5D,gBAAgB,CAAC,GAAW,EAAE,KAAgB,EAAA;AAC5C,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,cAAc,EAAE;;IAGjD,YAAY,CAAC,GAAW,EAAE,KAAgB,EAAA;QACxC,KAAK,CAAC,cAAc,EAAE;AAEtB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa;AAClC,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;YAAE;AAEzD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACvC,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;;AAGtD;AACkG;AAC1F,IAAA,SAAS,CAAC,GAAW,EAAA;QAC3B,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,0BAA0B,CAAC,YAAY,CAAC,GAAG,CAAC;;IAGjE,kBAAkB,GAAA;QACxB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,KAC/C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAC1B;AACD,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CACjD,0BAA0B,CAAC,YAAY,CACxC,CAAC,MAAM;;AAGV;;;AAGG;AACH,IAAA,eAAe,CAAC,GAAW,EAAA;QACzB,IAAI,GAAG,CAAC,WAAW;AAAE,YAAA,OAAO,KAAK;AACjC,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI;AAC3C,QAAA,OAAO,IAAI,CAAC,oBAAoB,GAAG,CAAC;;IAGtC,YAAY,CAAC,GAAW,EAAE,OAAgB,EAAA;QACxC,IAAI,OAAO,MAAM,GAAG,CAAC,OAAO,KAAK,KAAK,CAAC,EAAE;YACvC,OAAO,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;;aAC5C;YACL,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO;;QAGrD,IAAI,CAAC,uBAAuB,EAAE;QAC9B,IAAI,CAAC,kBAAkB,EAAE;AAEzB,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,IAAI,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC;;AAGhD;;;;;;;;;AASG;IACH,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AACpB,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AACrB,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;QACtB,IAAI,CAAC,mBAAmB,EAAE;AAE1B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CACxC,0BAA0B,CAAC,YAAY,CACxC;AAED,QAAA,IAAI,CAAC,yBAAyB,GAAG,EAAE;QACnC,IAAI,CAAC,uBAAuB,EAAE;QAC9B,IAAI,CAAC,kBAAkB,EAAE;;QAGzB,IAAI,CAAC,oBAAoB,CACvB,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CACvD;;AAGH;;;;;;;AAOG;AACK,IAAA,oBAAoB,CAAC,IAAc,EAAA;AACzC,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO;YAAE;AAEjC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAC7B,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC,CAC9D;QACD,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE;AAEpB,QAAA,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAC1D,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,CACpD;AACD,QAAA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;AACzD,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;;AAqBvB;;;;;;;;AAQG;AACH,IAAA,IAAY,SAAS,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,YAAY,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,YAAY,CAAE,CAAA,GAAG,EAAE;;AAGzD;;;;;;AAMG;AACH,IAAA,IAAY,eAAe,GAAA;QACzB,OAAO,IAAI,CAAC;cACR,GAAG,IAAI,CAAC,gBAAgB,CAAG,EAAA,IAAI,CAAC,SAAS,CAAU,QAAA;cACnD,IAAI;;AAGV,IAAA,IAAY,aAAa,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,YAAY,KAAK,OAAO,GAAG,YAAY,GAAG,cAAc;;AAGtE;;;;;AAKG;AACH,IAAA,IAAY,YAAY,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,gBAAgB,GAAG,CAAA,EAAG,IAAI,CAAC,gBAAgB,CAAO,KAAA,CAAA,GAAG,IAAI;;;IAI/D,iBAAiB,GAAA;QACvB,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;AAE9C,QAAA,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC;;AAG3E;;;;;;;;;;AAUG;IACK,iBAAiB,GAAA;QACvB,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM;AAAE,YAAA,OAAO,IAAI;AAE1D,QAAA,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC;QACtE,IAAI,OAAO,QAAQ,KAAK,QAAQ;AAAE,YAAA,OAAO,IAAI;QAE7C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI;AAC5C,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE;AAErC,QAAA,OAAO,IAAI;;AAGb;;;;;;;;AAQG;IACK,eAAe,GAAA;QACrB,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;AAExB,QAAA,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC;QACtE,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC,YAAY;YAAE;QAEpE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACpC,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;;AAGzB,IAAA,QAAQ,CAAC,EAAU,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;;IAGrD,qBAAqB,GAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QAE5C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;QAExC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;YACtC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC;;aAC9C;YACL,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC;;;AAIvE;;;;;;;;;;AAUG;IACK,gBAAgB,CACtB,IAAsB,EACtB,SAA8B,EAAA;QAE9B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QAEnB,MAAM,MAAM,GACV,CAAC,IAAI,EAAE,SAAS,IAAI,IAAI,CAAC;cACrB,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,eAAe;cACvD,IAAI;AAEV,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;AACnC,aAAA,IAAI,IAAI,EAAE,SAAS,IAAI,SAAS,KAAK,OAAO;YAAE,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;;AAGhF,IAAA,IAAY,cAAc,GAAA;QACxB,OAAO,IAAI,CAAC;cACR,GAAG,IAAI,CAAC,gBAAgB,CAAG,EAAA,IAAI,CAAC,SAAS,CAAS,OAAA;cAClD,IAAI;;;IAIF,mBAAmB,GAAA;QACzB,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE;AAE1B,QAAA,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,UAAU;YACrB,KAAK,EAAE,IAAI,CAAC,WAAW;YACvB,MAAM,EAAE,IAAI,CAAC,YAAY;SAC1B;AACD,QAAA,MAAM,SAAS,GACb,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC;AACzC,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC;AAE7C,QAAA,IAAI,SAAS;AAAE,YAAA,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC;;YACtD,eAAe,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC;;IAGzD,mBAAmB,GAAA;QACzB,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE;QAE1B,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC;QAChE,IAAI,CAAC,UAAU,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE;QACpC,IAAI,CAAC,WAAW,GAAG,MAAM,EAAE,KAAK,IAAI,EAAE;QACtC,IAAI,CAAC,YAAY,GAAG,MAAM,EAAE,MAAM,IAAI,EAAE;;IAGlC,uBAAuB,GAAA;QAC7B,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE;AAE3B,QAAA,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;AAC5D,YAAA,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC;;aACxC;YACL,eAAe,CACb,YAAY,EACZ,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,yBAAyB,CAC/B;;;IAIG,uBAAuB,GAAA;QAC7B,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE;AAE3B,QAAA,IAAI,CAAC,yBAAyB;YAC5B,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;;AAG5D;;;AAGG;IACK,mBAAmB,GAAA;QACzB,IAAI,CAAC,IAAI,CAAC,gBAAgB;AAAE,YAAA,OAAO,IAAI;QAEvC,OAAO,cAAc,CACnB,IAAI,CAAC,YAAY,KAAK,OAAO,GAAG,YAAY,GAAG,cAAc,EAC7D,IAAI,CAAC,gBAAgB,CACtB;;IAGK,UAAU,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,SAAS;;AAGzE;;;;;;;;AAQG;AACH,IAAA,IAAY,gBAAgB,GAAA;QAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI;QAErD,OAAO,IAAI,CAAC;cACR,GAAG,IAAI,CAAC,gBAAgB,CAAG,EAAA,IAAI,CAAC,SAAS,CAAO,KAAA;cAChD,IAAI;;;IAIF,iBAAiB,GAAA;QACvB,IAAI,CAAC,IAAI,CAAC,gBAAgB;AAAE,YAAA,OAAO,IAAI;AAEvC,QAAA,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC;AACxE,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,IAAI;;AAGtE;;;;;;AAMG;IACK,gBAAgB,GAAA;QACtB,OAAO,IAAI,CAAC,iBAAiB,EAAE,IAAI,IAAI,CAAC,oBAAoB,EAAE;;AAGhE;;;;;;;AAOG;IACK,qBAAqB,GAAA;AAC3B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB;AACjC,QAAA,IAAI,CAAC,GAAG;YAAE;QAEV,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE;AAE/C,QAAA,IAAI,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC,EAAE;AAC9D,YAAA,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC;;aAC7B;YACL,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,OAAO,CAAC;;;AAIrD;;;;;;;;;AASG;IACK,aAAa,GAAA;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE;QAC5C,IAAI,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC;AAAE,YAAA,OAAO,KAAK;AAEzE,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AAC1B,QAAA,OAAO,IAAI;;AAGb;;;;;;;AAOG;AACK,IAAA,4BAA4B,CAAC,KAAU,EAAA;AAC7C,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,KAAK;YAAE;AAE7D,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,IAAI,EAAE;QAChD,IAAI,cAAc,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,EAAE,QAAQ,CAAC;YAAE;AAEzD,QAAA,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,GAAG,SAAS;QAC5D,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC;;;AAKnE;;;;;AAKG;IACK,oBAAoB,GAAA;QAC1B,OAAO,IAAI,CAAC,yBAAyB,EAAE,IAAI,IAAI,CAAC,yBAAyB,EAAE;;AAG7E;;;;AAIG;IACK,yBAAyB,GAAA;QAC/B,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC;;AAGxD;;;;;;AAMG;IACK,yBAAyB,GAAA;QAC/B,IAAI,CAAC,IAAI,CAAC,gBAAgB;AAAE,YAAA,OAAO,IAAI;QAEvC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CACpC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,gBAAgB,CAC7C;AACD,QAAA,IACE,cAAc;YACd,CAAC,IAAI,CAAC,OAAO;AACb,YAAA,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;AAErC,YAAA,OAAO,IAAI;;;QAGb,IAAI,cAAc,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC;AAAE,YAAA,OAAO,IAAI;AAEzE,QAAA,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;;AAGzE;;;;AAIG;AACK,IAAA,iBAAiB,CACvB,aAA4C,EAAA;QAE5C,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;QACrD,OAAO,QAAQ,CAAC,MAAM,GAAG,QAAQ,GAAG,IAAI;;AAG1C;;;;;;;;AAQG;AACK,IAAA,gBAAgB,CACtB,aAA4C,EAAA;QAE5C,OAAO,CAAC,aAAa,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,QAAQ,KAAI;YAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,KAAK,CAAC;YAC/D,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;AAClD,SAAC,CAAC;;;;;;;AAQI,IAAA,0BAA0B,CAAC,KAAyB,EAAA;AAC1D,QAAA,IAAI,KAAK,CAAC,aAAa,EAAE,MAAM;YAAE;AAEjC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,EAAE;QAC/C,IAAI,WAAW,IAAI,IAAI;YAAE;AAEzB,QAAA,KAAK,CAAC,aAAa,GAAG,WAAW;QAEjC,IAAI,IAAI,CAAC,KAAK;AAAE,YAAA,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;;;AAIzC,IAAA,aAAa,CAAC,IAAgB,EAAA;AACpC,QAAA,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI;QAChC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC;;AAGtC,IAAA,YAAY,CAAC,SAAsB,EAAA;QACjC,oCAAoC,CAAC,SAAS,CAAC;;AAGjD;;;;;;;;;AASG;AACH,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,OAAO;;AAGrB,IAAA,QAAQ,CAAC,KAAyB,EAAA;;;;;AAKhC,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AAEnB,QAAA,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC;AACtC,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;QAC9B,IAAI,CAAC,eAAe,EAAE;AACtB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QAEzB,IAAI,WAAW,GAAW,KAA0B;AACpD,QAAA,WAAW,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB;;;;;;QAOhE,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE;AAE3D,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;;;;;;;AAQjC,QAAA,MAAM,WAAW,GACf,IAAI,CAAC,gCAAgC,IAAI;AACvC,cAAE,cAAc,CACZ,IAAI,CAAC,gCAAgC,CAAC,WAAW,CAAC,CACnD,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAc;cACjC,IAAI;AAEV,QAAA,IAAI,CAAC,gCAAgC,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC;AAC3D,YAAA,IAAI,EAAE,OAAO,GAAG,KAAI;;;;AAIlB,gBAAA,IAAI;AACF,oBAAA,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI;AACrB,oBAAA,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY;oBACpC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC;AAEhD,oBAAA,MAAM,IAAI,CAAC,+BAA+B,CAAC,WAAW,CAAC;;gBACvD,OAAO,KAAK,EAAE;;;;AAId,oBAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC;;wBAC5B;AACR,oBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;;aAEvB;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;aACrB;AACF,SAAA,CAAC;;AAGJ;;;;AAIG;IACK,MAAM,+BAA+B,CAC3C,WAA8D,EAAA;AAE9D,QAAA,IAAI,WAAW,IAAI,IAAI,EAAE;AACvB,YAAA,IAAI,IAAI,CAAC,mCAAmC,EAAE;AAC5C,gBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAC3B,qBAAA,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;AAC1B,qBAAA,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;;YAEzD;;AAGF,QAAA,MAAM,wBAAwB,GAAG,MAAM,WAAW;QAClD,IAAI,wBAAwB,YAAY,KAAK;AAAE,YAAA,MAAM,wBAAwB;QAE7E,IAAI,CAAC,8BAA8B,GAAG;YACpC,GAAG,wBAAwB,CAAC,WAAW;SACxC;AAED,QAAA,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,EAAE;AACpC,YAAA,IAAI,CAAC,kBAAkB,GAAG,wBAAwB,CAAC,oBAAoB;YACvE,IAAI,CAAC,oBAAoB,EAAE;AAC3B,YAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;;AAGlC,QAAA,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;YAC9B,IAAI,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7D,WAAW,GAAG,WAAW,CAAC,MAAM,CAC9B,CAAC,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CACjD;YACD,IAAI,CAAC,iBAAiB,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC;;AACrC,aAAA,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK,EAAE;YACtC,IAAI,CAAC,iBAAiB,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;;AACjD,aAAA,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;AACrC,YAAA,IAAI,WAAW,GAAG;gBAChB,GAAG,wBAAwB,CAAC,WAAW;gBACvC,GAAG,IAAI,CAAC,kBAAkB;aAC3B;YACD,WAAW,GAAG,WAAW,CAAC,MAAM,CAC9B,CAAC,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CACjD;AACD,YAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC,GAAG,WAAW,CAAC;;;IAI7C,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;QAEpB,IAAI,CAAC,kBAAkB,EAAE;QACzB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;QACrC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;AAEjD,QAAA,IAAI,IAAI,CAAC,yBAAyB,EAAE;YAClC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,yBAAyB,CACnD,IAAI,CAAC,iBAAiB,CACvB;;AAEH,QAAA,IAAI,IAAI,CAAC,uBAAuB,EAAE;YAChC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,iBAAiB,CAAC;;QAE3E,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM;QACrD,IAAI,CAAC,oBAAoB,EAAE;;IAGrB,kBAAkB,GAAA;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAC3D,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AACjC,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AACpB,SAAC,CAAC;;AAGJ;;;;;;AAMG;AACH,IAAA,gBAAgB,CAAC,GAAW,EAAA;AAC1B,QAAA,QACE,GAAG,CAAC,QAAQ,KAAK,KAAK;YACtB,CAAC,CAAC,GAAG,CAAC,KAAK;YACX,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC;;IAmCzC,cAAc,CAAC,GAAW,EAAE,KAAY,EAAA;AACtC,QAAA,IAAI,CAAC,UAAU,GAAG,GAAG;;;QAGrB,IAAI,CAAC,cAAc,GAAI,KAAK,CAAC,MAAsB,CAAC,OAAO,CAAC,IAAI,CAAC;QACjE,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;;AAGjC;;;;;AAKG;AACH,IAAA,UAAU,CAAC,IAAe,EAAA;AACxB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE;;;;QAI3B,IAAI,CAAC,iBAAiB,EAAE;;;QAIxB,IAAI,CAAC,uBAAuB,EAAE;QAC9B,IAAI,CAAC,mBAAmB,EAAE;QAC1B,IAAI,CAAC,kBAAkB,EAAE;;;AAIzB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE;AAExC,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACjB,YAAA,IAAI,WAAW;AAAE,gBAAA,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;YAC1C;;QAGF,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;;;AAI5C,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACpB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC;;;;;QAMpC,IAAI,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,aAAa,EAAE;YAC3D,IAAI,CAAC,oBAAoB,EAAE;;;AAI/B;;;;;;AAMG;AACK,IAAA,WAAW,CAAC,GAAW,EAAA;AAC7B,QAAA,OAAO,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK;;AAGlC;;;;;AAKG;AACH,IAAA,eAAe,CAAC,GAAW,EAAA;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AAEhC,QAAA,OAAO,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC,IAAI,IAAI;;AAG5D;;;;;AAKG;IACH,gBAAgB,GAAA;AACd,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU;AAC3B,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;QACxB,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;YAAE;AAExC,QAAA,IAAI,CAAC,SAAS,EAAE,EAAE,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAE,CAAC;;AAGxD;;;;;;;;AAQG;AACH,IAAA,cAAc,CAAC,KAAa,EAAA;AAC1B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU;AAC3B,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;QACxB,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;YAAE;AAEhD,QAAA,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;;AAG/C;;;;;;;AAOG;IACH,aAAa,GAAA;AACX,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU;AAC3B,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc;AAC9B,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;QACxB,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,aAAa;YAAE;;;;AAKvC,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC;QACnE,MAAM,KAAK,GAAG;aACX,OAAO,CAAC,OAAO;AAChB,cAAE,gBAAgB,CAAc,CAAA,wBAAA,EAA2B,KAAK,CAAA,CAAA,CAAG,CAAC;QACtE,IAAI,CAAC,KAAK,EAAE,MAAM;YAAE;;;QAIpB,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,OAAO,GACX,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;aACnC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;;;;QAKxC,MAAM,OAAO,GAAG;aACb,OAAO,CAAC,OAAO;AACf,aAAA,gBAAgB,CACf,CAA2B,wBAAA,EAAA,KAAK,8BAA8B,KAAK,CAAA,GAAA,CAAK,CACzE;AAEH,QAAA,IAAI,MAAM,GAAG,EAAE,CAAC,WAAW;QAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AACtC,YAAA,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;;AAEvD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC;QAClE,IAAI,CAAC,mBAAmB,EAAE;;AAG5B;;;;;;;;;;;;;AAaG;AACK,IAAA,aAAa,CAAC,GAAW,EAAE,EAAe,EAAE,MAAc,EAAA;QAChE,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AACnC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACxC,QAAA,MAAM,UAAU,GAAI,EAAE,CAAC,OAAO,CAAC,OAAO,CAAwB,EAAE,WAAW,IAAI,CAAC;AAEhF,QAAA,IAAI,MAAM,GAAG,UAAU,EAAE;AACvB,YAAA,MAAM,WAAW,GAAG,CAAC,KAAK,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,IAAI;YAExD,OAAO,CAAC,MAAM,GAAG,WAAW,KAAK,UAAU,GAAG,MAAM,CAAC;;AAGvD,QAAA,OAAO,MAAM,GAAG,cAAc,EAAE;;IAGlC,cAAc,GAAA;QACZ,IAAI,IAAI,CAAC,UAAU;YAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC;AAC9D,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;;AAG1B;;;;;;;;AAQG;AACH,IAAA,eAAe,CAAC,GAAW,EAAA;AACzB,QAAA,OAAO,GAAG,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI;;AAGjE,IAAA,IAAI,mBAAmB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC;;IAGzE,uBAAuB,GAAA;AACrB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU;AAC3B,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;QACxB,IAAI,CAAC,GAAG,EAAE,KAAK;YAAE;AAEjB,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;;YAC5D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI;QAEtC,IAAI,CAAC,mBAAmB,EAAE;;;AAI5B,IAAA,YAAY,CAAC,GAAW,EAAA;AACtB,QAAA,OAAO,0BAA0B,CAAC,YAAY,CAAC,GAAG,CAAC;;AAmBrD;;;;;;AAMG;IACK,eAAe,GAAA;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE,aAAa,IAAI,EAAE;AAExD,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;YACjC,KAAK,EAAE,GAAG,CAAC,KAAK;;;;;YAKhB,KAAK,EACH,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI;gBACtD,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC9D,YAAA,UAAU,EAAE,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC;AAC7B,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC;;AAiB9E;;;;;;;AAOG;AACK,IAAA,SAAS,CAAC,IAAgB,EAAA;AAChC,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE;AAC9B,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YACrB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;;AAGhC,QAAA,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI;AAChC,QAAA,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAEzB,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AACnD,QAAA,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI;QAChC,IAAI,CAAC,qBAAqB,EAAE;;;AAI9B,IAAA,WAAW,CAAC,IAAc,EAAA;AACxB,QAAA,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC;;AAGxB;;;;AAIG;IACH,gBAAgB,GAAA;QACd,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC;;;AAInD,IAAA,WAAW,CAAC,GAAW,EAAA;AACrB,QAAA,IAAI,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE;YACrD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;;AAGrC,QAAA,IAAI,GAAG,CAAC,KAAK,IAAI,IAAI;AAAE,YAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;AAE5D,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;;AAG/B;;;;;;;AAOG;AACK,IAAA,oBAAoB,CAAC,GAAW,EAAA;QACtC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAM,CAAC,IAAI,EAAE;AAClC,QAAA,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC;AAElC,QAAA,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AACtD,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AAC1C,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,KAAK,GAAG,cAAc,EAAE;AAE5D,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;;AAGvB,IAAA,YAAY,CAAC,GAAW,EAAA;QAC9B,IAAI,GAAG,CAAC,UAAU;AAAE,YAAA,OAAO,wBAAwB,CAAC,GAAG,CAAC,UAAU,CAAC;;;;;AAMnE,QAAA,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,GAAG;;AAG7C;;;;;AAKG;AACH,IAAA,iBAAiB,CAAC,GAAW,EAAE,KAAiB,EAAE,EAAe,EAAA;QAC/D,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,SAAS,EAAE,KAAK;YAAE;AAErC,QAAA,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE;AACxC,QAAA,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE;AACzB,QAAA,IAAI,CAAC,WAAW,GAAG,UAAU;AAE7B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;QACxC,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;AAClD,QAAA,MAAM,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;;QAE3D,MAAM,KAAK,GAAG,CAAC;AAEf,QAAA,MAAM,aAAa,GAAG,EAAE,CAAC,kBAAwC;QACjE,IAAI,OAAO,GAAG,CAAC;AAEf,QAAA,MAAM,MAAM,GAAG,CAAC,IAAgB,KAAI;YAClC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,UAAU;YAClD,OAAO,GAAG,IAAI,CAAC,GAAG,CAChB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,GAAG,KAAK,CAAC,EACvC,KAAK,GAAG,UAAU,CACnB;;;;;YAMD,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,UAAU,GAAG,OAAO,CAAA,GAAA,CAAK;YAC7C,IAAI,aAAa,EAAE;gBACjB,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,cAAc,GAAG,OAAO,CAAA,GAAA,CAAK;;AAEhE,SAAC;QAED,MAAM,IAAI,GAAG,MAAK;YAChB,UAAU,CAAC,KAAK,EAAE;AAClB,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AAEvB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;gBACjB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAM,CAAC,GAAG,UAAU,GAAG,OAAO;gBACpD,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,KAAM,CAAC,GAAG,cAAc,GAAG,OAAO;gBAC9D,IAAI,CAAC,mBAAmB,EAAE;AAC5B,aAAC,CAAC;;;;;AAMF,YAAA,MAAM,OAAO,GAAG,CAAC,KAAiB,KAAI;gBACpC,KAAK,CAAC,eAAe,EAAE;gBACvB,KAAK,CAAC,cAAc,EAAE;AACxB,aAAC;AACD,YAAA,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE;AAC1C,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,IAAI,EAAE,IAAI;AACX,aAAA,CAAC;;;;;AAKF,YAAA,UAAU,CAAC,MACT,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAClE;AACH,SAAC;;;;;AAMD,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;AAC/B,YAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE;gBAC7C,MAAM,EAAE,UAAU,CAAC,MAAM;AAC1B,aAAA,CAAC;AACF,YAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;AAC3E,SAAC,CAAC;;AAGJ;;;;;;;AAOG;AACH,IAAA,WAAW,CAAC,GAAW,EAAA;QACrB,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS;QACrE,IAAI,QAAQ,IAAI,IAAI;YAAE,OAAO,CAAA,EAAG,QAAQ,CAAA,GAAA,CAAK;;;;AAK7C,QAAA,IAAI,GAAG,CAAC,KAAK,IAAI,IAAI;YAAE,OAAO,GAAG,CAAC,KAAK;QAEvC,OAAO,CAAA,EAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK;;AAGvC;;;;AAIG;AACH,IAAA,iBAAiB,CAAC,KAAa,EAAA;QAC7B,IAAI,KAAK,IAAI,IAAI;YAAE;AAEnB,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAEjE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAI,CAAA,EAAA,SAAS,CAAI,CAAA,EAAA,KAAK,CAAE,CAAA,CAAC;;aAC9C;AACL,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;;AAI7D;;;;;;;;AAQG;IACH,UAAU,CAAC,GAAQ,EAAE,KAAiB,EAAA;QACpC,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE;QAC9B,IAAK,KAAK,CAAC,MAAsB,EAAE,OAAO,GAAG,kBAAkB,CAAC;YAAE;QAElE,IAAI,CAAC,iBAAiB,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;;AAG7C;;;;AAIG;AACH,IAAA,WAAW,CAAC,GAAW,EAAE,OAAY,EAAE,KAAiB,EAAA;QACtD,IAAI,CAAC,GAAG,CAAC,WAAW;YAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,GAAG,CAAC,WAAW,CAAC;AACd,YAAA,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC;YACvC,KAAK,EAAE,GAAG,CAAC,KAAK;AAChB,YAAA,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC;AAC5C,SAAA,CAAC;;AAGJ;;;AAGG;IACK,eAAe,CAAC,OAAY,EAAE,KAAiB,EAAA;QACrD,OAAO;AACL,YAAA,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;AACzB,YAAA,GAAG,EAAE,OAAO;YACZ,OAAO,EAAE,KAAK,CAAC,aAA4B;AAC3C,YAAA,aAAa,EAAE,KAAK;SACrB;;AAGH,IAAA,YAAY,CAAC,KAAa,EAAA;QACxB,IAAI,CAAC,sBAAsB,CACzB;YACE,mCAAmC,EACjC,IAAI,CAAC,mCAAmC;AAC1C,YAAA,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,wBAAwB,CAAC;SACnE,EACD,4BAA4B,CAC7B;;IAGH,qBAAqB,GAAA;QACnB,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC;AAEhD,QAAA,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE;QAE9B,IAAI,CAAC,sBAAsB,CACzB;YACE,mCAAmC,EACjC,IAAI,CAAC,mCAAmC;AAC1C,YAAA,GAAG,EAAE,WAAW;YAChB,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,wBAAwB,EAAE;gBACjE,KAAK,EAAE,WAAW,CAAC,MAAM;aAC1B,CAAC;SACH,EACD,gCAAgC,EAChC,MAAM,IAAI,CAAC,cAAc,EAAE,CAC5B;;AAGK,IAAA,sBAAsB,CAC5B,IAA4B,EAC5B,iBAAyB,EACzB,SAAsB,EAAA;QAEtB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CACtC,mCAAmC,EACnC;YACE,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,YAAY,CAAC;AACrD,YAAA,KAAK,EAAE,OAAO;YACd,IAAI;AACL,SAAA,CACF;QAED,IAAI,CAAC,SAAS,CAAC;AACZ,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC7B,aAAA,SAAS,CAAC,CAAC,mBAA4B,KAAI;AAC1C,YAAA,IAAI,mBAAmB,KAAK,IAAI,EAAE;AAChC,gBAAA,IAAI,CAAC,cAAc,CAAC,cAAc,CAChC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,iBAAiB,CAAC,CACnD;gBACD,SAAS,IAAI;gBACb,IAAI,CAAC,MAAM,EAAE;;AAEjB,SAAC,CAAC;;IAGN,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;AACxB,QAAA,IAAI,CAAC,sBAAsB,EAAE,UAAU,EAAE;AACzC,QAAA,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE;;AAG3B,IAAA,IAAI,qBAAqB,GAAA;AACvB,QAAA,QACE,IAAI,CAAC,aAAa,KAAK,UAAU;AACjC,YAAA,IAAI,CAAC,gCAAgC,IAAI,IAAI;;IAIzC,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;AAClC,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC;AAC/B,QAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;AAC3B,QAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC;AAC3B,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;;AAGhC;;;;;;;;;;;AAWG;IACK,uBAAuB,GAAA;QAC7B,IAAI,UAAU,GAAG,IAAI;QAErB,MAAM,CACJ,MAAK;AACH,YAAA,IAAI,CAAC,OAAQ,CAAC,OAAO,EAAE;YAEvB,IAAI,UAAU,EAAE;gBACd,UAAU,GAAG,KAAK;gBAClB;;YAGF,IAAI,CAAC,qBAAqB,EAAE;YAC5B,IAAI,CAAC,oBAAoB,EAAE;SAC5B,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B;;AAGH;;;;;;;AAOG;IACK,oBAAoB,GAAA;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9B,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;QACnD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC;;IAGpD,MAAM,GAAA;;AAEJ,QAAA,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI;YAAE;;AAGpC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC;;IAGvC,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;;AAGrD,IAAA,qBAAqB,CAAC,GAAgB,EAAA;AACpC,QAAA,QAAQ,GAAG,CAAC,UAAU;AACpB,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,oBAAoB;AAC7B,YAAA;AACE,gBAAA,OAAO,IAAI;;;AAIjB,IAAA,iBAAiB,CAAC,MAAc,EAAA;AAC9B,QAAA,QAAQ,MAAM,CAAC,KAAK;AAClB,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,cAAc;AACvB,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,aAAa;AACtB,YAAA;gBACE,OAAO,CAAA,EAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,UAAU,CAAA,CAAE;;;AAIlD,IAAA,iBAAiB,CAAC,MAAc,EAAA;AAC9B,QAAA,QAAQ,MAAM,CAAC,KAAK;AAClB,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,4DAA4D;AACrE,YAAA;AACE,gBAAA,OAAO,CAAoB,iBAAA,EAAA,MAAM,CAAC,KAAK,EAAE;;;AAI/C,IAAA,kBAAkB,CAAC,MAAc,EAAE,OAAY,EAAE,KAAiB,EAAA;AAChE,QAAA,QAAQ,MAAM,CAAC,KAAK;AAClB,YAAA,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtD,YAAA,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACjD,YAAA;AACE,gBAAA,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;;;IAIjE,UAAU,CAAC,OAAY,EAAE,GAAW,EAAA;AAClC,QAAA,QAAQ,GAAG,CAAC,UAAU;AACpB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,YAAA,KAAK,MAAM;AACT,gBAAA,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI;AAAE,oBAAA,OAAO,IAAI;gBAE3C,IAAI,GAAG,CAAC,QAAQ;AACd,oBAAA,OAAO,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;gBAE7D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,gBAAA,MAAM,KAAK,GAAG,OAAO,GAAG,KAAK,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,IAAI;AACtE,gBAAA,OAAO,UAAU,CAAC,KAAK,IAAI,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC;YAC3D,KAAK,aAAa,EAAE;;;;;;;;gBAQlB,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC3C,IAAI,gBAAgB,IAAI,IAAI;AAAE,oBAAA,OAAO,IAAI;AAEzC,gBAAA,MAAM,MAAM,GAAG,GAAG,CAAC,2BAA2B,EAAE,IAAI,CAClD,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,gBAAgB,CACnC;AACD,gBAAA,OAAO,MAAM,EAAE,KAAK,IAAI,gBAAgB;;AAE1C,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI;sBACzB,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK;sBACrC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC;AAC3C,YAAA,KAAK,SAAS;AACZ,gBAAA,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI;AAAE,oBAAA,OAAO,IAAI;AAC3C,gBAAA,OAAO,YAAY,CACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAClB,IAAI,CAAC,MAAM,EACX,GAAG,CAAC,aAAa,IAAI;sBACjB,KAAK,GAAG,CAAC,aAAa,CAAI,CAAA,EAAA,GAAG,CAAC,aAAa,CAAE;sBAC7C,OAAO,CACZ;AACH,YAAA,KAAK,MAAM;gBACT,OAAO,yBAAyB,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACtD,YAAA;AACE,gBAAA,OAAO,IAAI;;;IAIjB,YAAY,CAAC,KAAK,EAAE,IAAI,EAAA;QACtB,OAAO,IAAI,CAAC,KAAK;;IAGnB,eAAe,CAAC,KAAK,EAAE,IAAY,EAAA;AACjC,QAAA,OAAO,GAAG,KAAK,CAAA,EAAG,IAAI,CAAC,KAAK,EAAE;;IAGhC,iBAAiB,GAAA;AACf,QAAA,IAAI,MAAM,GAAW,IAAI,CAAC,iBAAsC;AAChE,QAAA,MAAM,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB;AAE3D,QAAA,iBAAiB,CAAC,IAAI,CAAC,iCAAiC,EAAE,MAAM,CAAC;;AAGnE;;;;;;;;;AASG;IACH,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE;;;IAKvB,oBAAoB,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,YAAY;AAC9C,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;;AAC1B,YAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;;AAGrC,IAAA,SAAS,CAAC,OAAgB,EAAA;AACxB,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC;AAC/B,QAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;AAElC,QAAA,IAAI,OAAO,IAAI,IAAI,EAAE;AACnB,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;AAC7B,YAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAC7B,IAAI,aAAa,CAAC;AAChB,gBAAA,OAAO,EAAE,IAAI;gBACb,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;AAC1C,aAAA,CAAC,CACH;AACD,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,YAAY;YAC3C,IAAI,CAAC,iBAAiB,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YACpE,IAAI,CAAC,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;;aAC7D;AACL,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,YAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;AAC9B,YAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAC7B,IAAI,aAAa,CAAC;AAChB,gBAAA,OAAO,EAAE,KAAK;gBACd,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;AAC1C,aAAA,CAAC,CACH;AACD,YAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC;AAC3B,YAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;AAC3B,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE;;;AAI7B;;;;AAIG;IACH,wBAAwB,CAAC,KAAiB,EAAE,EAAU,EAAA;;;;QAIpD,IAAK,KAAK,CAAC,MAAsB,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;AACvD,YAAA,IAAI,CAAC,YAAY,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE;;QAEtD,IAAI,KAAK,CAAC,QAAQ;YAAE,KAAK,CAAC,cAAc,EAAE;;AAG5C;;;;;;AAMG;IACK,YAAY,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;;IAGrD,SAAS,CAAC,EAAU,EAAE,KAAa,EAAA;AACjC,QAAA,MAAM,UAAU,GACd,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ;AAC5D,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;;;AAIxB,QAAA,IAAI,UAAU,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE;AAC1D,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE;YACpC,MAAM,OAAO,GAAG,CAAC,KAAa,KAC5B,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC;YACtD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;AAC/C,YAAA,MAAM,YAAY,GAAG,OAAO,CAAC,EAAE,CAAC;YAEhC,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE;;;AAG7C,gBAAA,IAAI,CAAC,UAAU,CACb,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CACxB;AACD,gBAAA,IAAI,CAAC,aAAa,GAAG,EAAE;gBACvB;;;AAIJ,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;;;IAIjB,SAAS,CAAC,EAAU,EAAE,KAAa,EAAA;AACzC,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE;AAC1B,YAAA,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;AACpB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,aAAa,CAAC;AAChB,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,EAAE,EAAE,EAAE;gBACN,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;AAC1C,aAAA,CAAC,CACH;;aACI;AACL,YAAA,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;AAClB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CACnB,IAAI,aAAa,CAAC;AAChB,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,EAAE,EAAE,EAAE;gBACN,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;AAC1C,aAAA,CAAC,CACH;;;AAIL;;;;;AAKG;AACK,IAAA,UAAU,CAChB,IAAW,EACX,SAAiB,EACjB,OAAe,EACf,MAAe,EAAA;QAEf,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC;AAExC,QAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YACnC,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,MAAM,EAAE;AACxC,gBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;;;;AAK1C,IAAA,aAAa,CAAC,EAAU,EAAA;AACtB,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,SAAS;;aAC3D;AACL,YAAA,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,SAAS;;;AAIlE,IAAA,SAAS,CAAC,EAAU,EAAA;AAClB,QAAA,IACE,IAAI,CAAC,aAAa,IAAI,KAAK;YAC3B,IAAI,CAAC,8BAA8B,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,KAAK,EACzD;AACA,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;;AAGlC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;;aAC1B;AACL,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;;QAG/B,IAAI,CAAC,kBAAkB,EAAE;QAEzB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;AAC9C,QAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YAChB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;;QAGxC,IAAI,CAAC,oBAAoB,EAAE;;AAG7B,IAAA,WAAW,CAAC,EAAU,EAAA;AACpB,QAAA,IACE,IAAI,CAAC,aAAa,IAAI,IAAI;YAC1B,IAAI,CAAC,8BAA8B,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,EACxD;AACA,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;;QAG/B,IAAI,CAAC,kBAAkB,EAAE;QAEzB,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;AAEzD,QAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YAChB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;;AAE3C,QAAA,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE;YACpB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;;AAE9C,QAAA,IAAI,gBAAgB,KAAK,CAAC,CAAC,EAAE;YAC3B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;;QAGnD,IAAI,CAAC,oBAAoB,EAAE;;;;;IAO7B,0BAA0B,CACxB,eAAuB,EACvB,KAAa,EAAA;AAEb,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,OAAO,IAAI,CAAC,cAAc,CACxB,eAAe,EACf,KAAK,EACL,IAAI,CAAC,iBAAiB,CACvB;;aACI;AACL,YAAA,OAAO,IAAI;;;AA3uEJ,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,0BAA0B,sOAsR3B,SAAS,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAtRR,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,0BAA0B,EAkGvB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,KAAA,EAAA,OAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,gCAAA,EAAA,kCAAA,EAAA,iCAAA,EAAA,mCAAA,EAAA,mCAAA,EAAA,qCAAA,EAAA,mCAAA,EAAA,qCAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,gCAAA,EAAA,kCAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,iCAAiC,EAAU,WAAA,EAAA,IAAA,EAAA,IAAA,EAAA,WAAW,gDAOnD,6BAA6B,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EA4pC7B,+BAA+B,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAPT,0BAA0B,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,OAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,IAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC13CnE,8zkBA0bA,EAAA,MAAA,EAAA,CAAA,k9GAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED3UI,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,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,EAAA,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAe,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,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,EAAA,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,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,sBAAsB,EACtB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAmB,uBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,uBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,SAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,mzEACX,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAtB,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAuB,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,uBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,MAAA,EAAA,aAAA,EAAA,cAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,0BAA0B,EAC1B,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,MAAA,EAAA,aAAA,EAAA,eAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,8BAA8B,mEAC9B,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,aAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGJ,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAlBtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAGtB,OAAA,EAAA;wBACP,WAAW;wBACX,YAAY;wBACZ,kBAAkB;wBAClB,sBAAsB;wBACtB,WAAW;wBACX,YAAY;wBACZ,aAAa;wBACb,cAAc;wBACd,0BAA0B;wBAC1B,8BAA8B;wBAC9B,aAAa;AACd,qBAAA,EAAA,QAAA,EAAA,8zkBAAA,EAAA,MAAA,EAAA,CAAA,k9GAAA,CAAA,EAAA;;0BAwRE,MAAM;2BAAC,SAAS;yCAjRF,KAAK,EAAA,CAAA;sBAArB,SAAS;uBAAC,IAAI;gBA8Ff,eAAe,EAAA,CAAA;sBADd,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,iCAAiC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;gBAQtE,aAAa,EAAA,CAAA;sBADZ,eAAe;uBAAC,6BAA6B;gBAGrC,UAAU,EAAA,CAAA;sBAAlB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBAEQ,kBAAkB,EAAA,CAAA;sBAA1B;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBAcQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,KAAK,EAAA,CAAA;sBAAb;gBAWQ,aAAa,EAAA,CAAA;sBAArB;gBAEQ,eAAe,EAAA,CAAA;sBAAvB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBAcS,oBAAoB,EAAA,CAAA;sBAA7B;gBAEQ,gCAAgC,EAAA,CAAA;sBAAxC;gBAGQ,iCAAiC,EAAA,CAAA;sBAAzC;gBAGQ,mCAAmC,EAAA,CAAA;sBAA3C;gBAGQ,mCAAmC,EAAA,CAAA;sBAA3C;gBAOQ,kBAAkB,EAAA,CAAA;sBAA1B;gBAGQ,eAAe,EAAA,CAAA;sBAAvB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACS,UAAU,EAAA,CAAA;sBAAnB;gBAQS,qBAAqB,EAAA,CAAA;sBAA9B;gBAEQ,gCAAgC,EAAA,CAAA;sBAAxC;gBAGQ,sBAAsB,EAAA,CAAA;sBAA9B;gBAGQ,aAAa,EAAA,CAAA;sBAArB;gBAEQ,uBAAuB,EAAA,CAAA;sBAA/B;gBAEQ,qBAAqB,EAAA,CAAA;sBAA7B;gBAMQ,iBAAiB,EAAA,CAAA;sBAAzB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBAMQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,YAAY,EAAA,CAAA;sBAApB;gBAQQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAGQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAeQ,yBAAyB,EAAA,CAAA;sBAAjC;gBAEQ,uBAAuB,EAAA,CAAA;sBAA/B;gBACQ,cAAc,EAAA,CAAA;sBAAtB;gBAKQ,iBAAiB,EAAA,CAAA;sBAAzB;gBACS,WAAW,EAAA,CAAA;sBAApB;gBACS,aAAa,EAAA,CAAA;sBAAtB;gBAMQ,kBAAkB,EAAA,CAAA;sBAA1B;gBAOQ,iBAAiB,EAAA,CAAA;sBAAzB;gBA0/BD,eAAe,EAAA,CAAA;sBADd,eAAe;uBAAC,+BAA+B;;MA6+BrC,MAAM,CAAA;AAgBjB,IAAA,WAAA,CAAY,EACV,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,KAAK,EACL,UAAU,EACV,OAAO,MAQL,EAAE,EAAA;AACJ,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;AAC5B,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;;AAEzB;MAsCY,MAAM,CAAA;AAyEjB,IAAA,WAAA,CAAY,EACV,IAAI,EACJ,KAAK,EACL,UAAU,EACV,QAAQ,EACR,cAAc,EACd,WAAW,EACX,2BAA2B,EAC3B,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,OAAO,EACP,WAAW,EACX,KAAK,EACL,WAAW,MAkBT,EAAE,EAAA;AACJ,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;AAC5B,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,cAAc,GAAG,cAAc;AACpC,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW;AAC9B,QAAA,IAAI,CAAC,2BAA2B,GAAG,2BAA2B;AAC9D,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,aAAa,GAAG,aAAa;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW;AAC9B,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW;;AAEjC;MAmCY,aAAa,CAAA;AAKxB,IAAA,WAAA,CAAY,EACV,KAAK,EACL,EAAE,EACF,iBAAiB,MAKf,EAAE,EAAA;AACJ,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,EAAE,GAAG,EAAE;AACZ,QAAA,IAAI,CAAC,iBAAiB,GAAG,iBAAiB;;AAE7C;MAEY,aAAa,CAAA;AAIxB,IAAA,WAAA,CAAY,EACV,OAAO,EACP,iBAAiB,MAIf,EAAE,EAAA;AACJ,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,QAAA,IAAI,CAAC,iBAAiB,GAAG,iBAAiB;;AAE7C;;IE5nFW;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,cAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,cAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,cAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,cAAA,CAAA,aAAA,CAAA,GAAA,aAA2B;AAC3B,IAAA,cAAA,CAAA,IAAA,CAAA,GAAA,IAAS;AACX,CAAC,EAPW,cAAc,KAAd,cAAc,GAOzB,EAAA,CAAA,CAAA;;ACLD;;;;;;;;;;;;;AAaG;AACU,MAAA,iBAAiB,GAAG;AAC/B,IAAA,IAAI,EAAE;AACJ,QAAA,cAAc,CAAC,UAAU;AACzB,QAAA,cAAc,CAAC,QAAQ;AACvB,QAAA,cAAc,CAAC,MAAM;AACtB,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,cAAc,CAAC,MAAM;AACrB,QAAA,cAAc,CAAC,QAAQ;AACvB,QAAA,cAAc,CAAC,WAAW;AAC1B,QAAA,cAAc,CAAC,EAAE;AAClB,KAAA;AACD,IAAA,OAAO,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC;AAChC,IAAA,IAAI,EAAE;AACJ,QAAA,cAAc,CAAC,MAAM;AACrB,QAAA,cAAc,CAAC,QAAQ;AACvB,QAAA,cAAc,CAAC,WAAW;AAC3B,KAAA;;;ACwBH,MAAM,cAAc,GAGhB;AACF,IAAA,IAAI,EAAE;AACJ,QAAA,CAAC,cAAc,CAAC,UAAU,GAAG;AAC3B,YAAA,SAAS,EAAE,YAAY;AACvB,YAAA,SAAS,EAAE,sBAAsB;AAClC,SAAA;AACD,QAAA,CAAC,cAAc,CAAC,QAAQ,GAAG;AACzB,YAAA,SAAS,EAAE,UAAU;AACrB,YAAA,SAAS,EAAE,oBAAoB;AAChC,SAAA;AACD,QAAA,CAAC,cAAc,CAAC,MAAM,GAAG;AACvB,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,SAAS,EAAE,kBAAkB;AAC9B,SAAA;;;AAGF,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,CAAC,cAAc,CAAC,MAAM,GAAG;AACvB,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,SAAS,EAAE,kBAAkB;AAC9B,SAAA;AACD,QAAA,CAAC,cAAc,CAAC,WAAW,GAAG;AAC5B,YAAA,SAAS,EAAE,UAAU;AACrB,YAAA,SAAS,EAAE,uBAAuB;AACnC,SAAA;AACD,QAAA,CAAC,cAAc,CAAC,QAAQ,GAAG;AACzB,YAAA,SAAS,EAAE,UAAU;AACrB,YAAA,SAAS,EAAE,oBAAoB;AAChC,SAAA;;AAED,QAAA,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE;AACpE,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,CAAC,cAAc,CAAC,MAAM,GAAG;AACvB,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,SAAS,EAAE,kBAAkB;AAC9B,SAAA;AACF,KAAA;AACD,IAAA,IAAI,EAAE;AACJ,QAAA,CAAC,cAAc,CAAC,MAAM,GAAG;AACvB,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,SAAS,EAAE,kBAAkB;AAC9B,SAAA;AACD,QAAA,CAAC,cAAc,CAAC,QAAQ,GAAG;AACzB,YAAA,SAAS,EAAE,aAAa;AACxB,YAAA,SAAS,EAAE,kBAAkB;AAC9B,SAAA;AACD,QAAA,CAAC,cAAc,CAAC,WAAW,GAAG;AAC5B,YAAA,SAAS,EAAE,YAAY;AACvB,YAAA,SAAS,EAAE,iBAAiB;AAC7B,SAAA;AACF,KAAA;CACF;AAQD;;;;;;;;AAQG;AACH,SAAS,aAAa,CACpB,IAAqB,EACrB,UAAmB,EAAA;AAEnB,IAAA,MAAM,QAAQ,GAA8B,iBAAiB,CAAC,IAAI,CAAC;IAEnE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,KAC3B,UAAU,GAAG,KAAK,KAAK,cAAc,CAAC,EAAE,GAAG,KAAK,KAAK,cAAc,CAAC,EAAE,CACvE;AACH;AAEA,SAAS,iBAAiB,CACxB,IAAqB,EACrB,SAAoC,EAAA;IAEpC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM;QAC/B,KAAK;QACL,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,SAAS,IAAI,KAAK;AAC1D,KAAA,CAAC,CAAC;AACL;AAEA;;;;;;;AAOG;SACa,sBAAsB,CACpC,IAAqB,EACrB,UAAU,GAAG,KAAK,EAAA;IAElB,OAAO,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACjE;AAEA;;;;;;AAMG;AACU,MAAA,gBAAgB,GAAG;IAC9B,IAAI,EAAE,cAAc,CAAC,QAAQ;IAC7B,MAAM,EAAE,cAAc,CAAC,MAAM;IAC7B,OAAO,EAAE,cAAc,CAAC,MAAM;IAC9B,IAAI,EAAE,cAAc,CAAC,WAAW;;AAmC5B,SAAU,UAAU,CAAC,MAA4B,EAAA;IACrD,OAAO;AACL,QAAA,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB;AACH;AAEA;;;;;AAKG;AACG,SAAU,YAAY,CAC1B,MAA6D,EAAA;IAE7D,OAAO;AACL,QAAA,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB;AACH;AAEM,SAAU,aAAa,CAC3B,MAA+B,EAAA;IAE/B,OAAO;AACL,QAAA,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB;AACH;AAEM,SAAU,UAAU,CAAC,MAA4B,EAAA;IACrD,OAAO;AACL,QAAA,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB;AACH;AA8EA;AACA,MAAM,QAAQ,GAAG,+CAA+C;AAEhE,SAAS,WAAW,CAAC,KAAc,EAAA;IACjC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC;AAC7E,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;AAEvD,IAAA,OAAO,KAAK;AACd;AAuCA;;;AAGG;AACH,SAAS,OAAO,CAAC,KAAc,EAAA;AAC7B,IAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;AAAE,QAAA,OAAO,IAAI;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;AACzD,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;;IAEnD,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;AAE/D,IAAA,OAAO,KAAK;AACd;AAEA;;;;;AAKG;AACH,SAAS,WAAW,CAAC,CAAU,EAAE,CAAU,EAAA;IACzC,IAAI,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI;AACxB,IAAA,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,IAAI;QAAE,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE;AAC9E,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;AACxC,QAAA,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;AAG/E,IAAA,OAAO,KAAK;AACd;AAEA,SAAS,gBAAgB,CACvB,CAA+B,EAC/B,CAAmB,EAAA;IAEnB,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC;AAChF;AAEA;;;AAGG;AACG,SAAU,iBAAiB,CAE/B,WAAkB,EAAA;;;;;;;AAOlB,IAAA,MAAM,cAAc,GAAG,CAAC,EAAe,KAAI;AACzC,QAAA,MAAM,UAAU,GAAG,WAAW,CAAC,EAAE,CAAC;AAClC,QAAA,MAAM,IAAI,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,IAAI,IAAI,CAAC;QAEvE,IAAI,KAAK,GAA8B,IAAI;AAC3C,QAAA,IAAI,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE;YAChC,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,KACrD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACxB;;;;;;YAOD,IAAI,SAAS,CAAC,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,EAAE;gBAClD,OAAO,CAAC,KAAK,CACX,CAAW,QAAA,EAAA,UAAU,CAAC,KAAK,CAA8B,2BAAA,EAAA,UAAU,CAAC,IAAI,CAAiB,eAAA,CAAA;AACvF,oBAAA,CAAA,OAAA,EAAU,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,WAAA,EAAc,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAK,GAAA,CAAA;AAC3E,oBAAA,CAAA,+BAAA,EAAkC,SAAS,CAAC,MAAM,GAAG,EAAE,GAAG,iCAAiC,CAAA,CAAA,CAAG,CACjG;;AAGH,YAAA,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI;;AAG7C,QAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;AACtE,KAAC;AAED,IAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAGpB;IACH,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAoB,EAAE;QAC5D,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;;AAGrC;;;AAGG;AACH,IAAA,MAAM,kBAAkB,GAAG,CAAC,EAAe,KAAoB;AAC7D,QAAA,MAAM,UAAU,GAAG,WAAW,CAAC,EAAE,CAAC;AAClC,QAAA,IAAI,UAAU,CAAC,OAAO,IAAI,IAAI;YAAE,OAAO,cAAc,CAAC,EAAE;AAExD,QAAA,OAAO,UAAU,CAAC,SAAS,EAAE;cACzB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,KAAK,CAAC,CAAC;AAC1B,cAAE,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC;AACvC,KAAC;;;;;IAMD,MAAM,MAAM,GAAG,MAAM,CAA6C,IAAI,GAAG,EAAE,CAAC;AAE5E,IAAA,MAAM,UAAU,GAAG,CAAC,EAAe,EAAE,UAAmC,KAAI;QAC1E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,UAAU,KAAK,IAAI;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;;AACnC,YAAA,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC;AAC7B,QAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AAClB,KAAC;IACD,MAAM,SAAS,GAAG,MAAM,CACtB,IAAI,GAAG,EAAE,CACV;IAED,MAAM,OAAO,GAA4B,QAAQ,CAAC,MAChD,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,MAAM;AAC1C,QAAA,EAAE,EAAE,EAAY;AAChB,QAAA,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK;AAC5B,QAAA,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI;QAC1B,QAAQ,EAAE,UAAU,CAAC,QAAQ;AAC7B,QAAA,iBAAiB,EACf,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,SAAS;AACpE,YAAA,UAAU,CAAC,QAAQ;QACrB,KAAK,EAAE,UAAU,CAAC,KAAK;KACxB,CAAC,CAAC,CACJ;AAED,IAAA,MAAM,KAAK,GAAG;QACZ,WAAW;QACX,OAAO;AAEP;;;;;AAKG;AACH,QAAA,GAAG,CAAwB,EAAK,EAAA;YAC9B,OAAO;AACL,gBAAA,EAAE,EAAE,EAAY;AAChB,gBAAA,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK;AAC5B,gBAAA,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI;AAC1B,gBAAA,KAAK,EAAE,QAAQ,CAAC,MAAM,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;AAC9C,gBAAA,QAAQ,EAAE,QAAQ,CAAC,MAAM,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC;;;;;AAKpD,gBAAA,IAAI,SAAS,GAAA;oBACX,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,OAAO;iBAChC;AACD,gBAAA,IAAI,eAAe,GAAA;AACjB,oBAAA,OAAO,kBAAkB,CAAC,EAAE,CAAC;iBAC9B;AACD,gBAAA,IAAI,OAAO,GAAA;AACT,oBAAA,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,OAAO;iBAC/B;AACD,gBAAA,GAAG,EAAE,CAAC,UAA8C,KAClD,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC;gBAC3B,MAAM,EAAE,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9B,KAAK,EAAE,MAAM,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;aAC7B;SACF;AAED;;;;;;AAMG;QACH,UAAU,CAAwB,EAAK,EAAE,OAAuB,EAAA;AAC9D,YAAA,WAAW,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,OAAO;YACjC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;SACpC;QAED,GAAG,CACD,EAAK,EACL,UAA8C,EAAA;YAE9C,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI;;;;;AAMjC,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAiB,CAAC,EAAE;AACnE,gBAAA,MAAM,IAAI,KAAK,CACb,CAAA,QAAA,EAAW,MAAM,CAAC,EAAE,CAAC,CAAA,KAAA,EAAQ,IAAI,CAAA,6BAAA,EAAgC,UAAU,CAAC,QAAQ,CAAI,EAAA,CAAA;oBACtF,CAAsB,mBAAA,EAAA,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAA6B,2BAAA,CAAA;AACrF,oBAAA,CAAA,wDAAA,CAA0D,CAC7D;;AAGH,YAAA,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC;SAC3B;AAED;;;;;;AAMG;QACH,YAAY,CACV,EAAK,EACL,UAA8C,EAAA;AAE9C,YAAA,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC;AACzB,YAAA,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;SACjB;AAED;;;AAGG;AACH,QAAA,MAAM,CAAwB,EAAK,EAAA;YACjC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AAC9B,YAAA,MAAM,OAAO,GAAG,SAAS,EAAE;AAC3B,YAAA,MAAM,YAAY,GAAG,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;;;;;YAMhE,IAAI,YAAY,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;gBAAE;AAEhF,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;AAC7B,YAAA,IAAI,YAAY;AAAE,gBAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;;AAC5B,gBAAA,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC;AAExB,YAAA,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;SACpB;AAED;;;;AAIG;AACH,QAAA,KAAK,CAAwB,EAAK,EAAA;AAChC,YAAA,IAAI,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AAAE,gBAAA,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC;AAC1C,YAAA,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE;YAE1B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;AACjC,YAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACf,YAAA,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;SACpB;AAED;;;;AAIG;QACH,QAAQ,GAAA;YACN,MAAM,QAAQ,GAAmB,EAAE;YAEnC,KAAK,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,SAAS,EAAE,EAAE;gBAC1C,QAAQ,CAAC,EAAY,CAAC,GAAG;oBACvB,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,KAAK,EAAE,UAAU,CAAC,KAAK;iBACxB;;AAGH,YAAA,OAAO,QAAQ;SAChB;AAED;;;;;;;AAOG;AACH,QAAA,OAAO,CAAC,QAAwB,EAAA;AAC9B,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAiC;AAErD,YAAA,KAAK,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE;AAC7D,gBAAA,IAAI,EAAE,EAAE,IAAI,WAAW,CAAC;oBAAE;AAE1B,gBAAA,IAAI,CAAC,GAAG,CAAC,EAAiB,EAAE;oBAC1B,QAAQ,EAAE,UAAU,CAAC,QAAQ;AAC7B,oBAAA,KAAK,EAAE,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC;AACrC,iBAAA,CAAC;;YAGJ,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;AACzB,YAAA,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;SACpB;;QAGD,KAAK,GAAA;AACH,YAAA,IAAI,MAAM,EAAE,CAAC,IAAI,GAAG,CAAC;AAAE,gBAAA,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AAC5C,YAAA,IAAI,SAAS,EAAE,CAAC,IAAI,GAAG,CAAC;AAAE,gBAAA,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;SACnD;;QAGD,eAAe,GAAA;YACb,MAAM,OAAO,GAAiC,EAAE;YAEhD,KAAK,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,SAAS,EAAE,EAAE;gBAC1C,OAAO,CAAC,EAAY,CAAC,GAAG;oBACtB,EAAE,SAAS,EAAE,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAgB;iBAC1E;;AAGH,YAAA,OAAO,OAAO;SACf;KACF;AAED,IAAA,OAAO,KAAK;AACd;;MCvnBa,yBAAyB,CAAA;IAoCpC,WACU,CAAA,gBAAkC,EACf,MAAc,EAAA;QADjC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QACG,IAAM,CAAA,MAAA,GAAN,MAAM;QA/B1B,IAAI,CAAA,IAAA,GAAW,EAAE;QACjB,IAAO,CAAA,OAAA,GAAwB,EAAE;AAEhC,QAAA,IAAA,CAAA,UAAU,GAAyB,IAAI,YAAY,EAAE;;QAGtD,IAAe,CAAA,eAAA,GAAY,IAAI;AACxC;;;AAGG;QACM,IAAsB,CAAA,sBAAA,GAAY,KAAK;;QAEvC,IAAsB,CAAA,sBAAA,GAAY,KAAK;QACvC,IAAgB,CAAA,gBAAA,GAAW,cAAc;QACzC,IAAgB,CAAA,gBAAA,GAAW,oBAAoB;QAOhD,IAAO,CAAA,OAAA,GAAY,IAAI;QAE/B,IAAoB,CAAA,oBAAA,GAAiB,EAAE;QACvC,IAAsB,CAAA,sBAAA,GAAiB,EAAE;QAwIzC,IAAY,CAAA,YAAA,GAAG,MAAK;AAClB,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;AACtB,SAAC;;IAjID,QAAQ,GAAA;;;;AAIN,QAAA,MAAM,mBAAmB,GAAG,CAAC,IAAqB,KAChD,sBAAsB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,MAAM;YAC5C,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;YACvD,KAAK,EAAE,MAAM,CAAC,KAAK;AACpB,SAAA,CAAC,CAAC;AAEL,QAAA,IAAI,CAAC,oBAAoB,GAAG,mBAAmB,CAAC,MAAM,CAAC;AACvD,QAAA,IAAI,CAAC,sBAAsB,GAAG,mBAAmB,CAAC,QAAQ,CAAC;;;;AAK7D,IAAA,YAAY,CAAC,SAAsB,EAAA;QACjC,oCAAoC,CAAC,SAAS,CAAC;;AAGjD;;;;AAIG;AACH,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,OAAO;;AAGrB,IAAA,QAAQ,CAAC,KAAyB,EAAA;;;;AAIhC,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AAEnB,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;QAE9B,MAAM,iBAAiB,GAEnB,EAAE;AAEN,QAAA,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE;YAC/B,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AAErC,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;AAC7B,gBAAA,iBAAiB,CAAC,GAAG,CAAC,GAAG,UAAU;;iBAC9B;gBACL,iBAAiB,CAAC,GAAG,CAAC,GAAG;AACvB,oBAAA;wBACE,KAAK,EAAE,UAAU,CAAC,KAAK;wBACvB,SAAS,EAAE,UAAU,CAAC,SAAS;AAChC,qBAAA;iBACF;;;QAIL,IAAI,WAAW,GAAG,KAA6B;AAE/C,QAAA,WAAW,CAAC,OAAO,GAAG,iBAAiB;AAEvC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;AAEjC,QAAA,IAAI,CAAC,gCAAgC,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC;AAC3D,YAAA,IAAI,EAAE,CAAC,GAAG,KAAI;AACZ,gBAAA,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI;AACrB,gBAAA,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY;AAEpC,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;aACrB;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;aACrB;AACF,SAAA,CAAC;;IAGJ,MAAM,CAAC,KAAuB,EAAA;AAE9B,IAAA,mBAAmB,CAAC,UAAkB,EAAA;QACpC,QAAQ,UAAU;AAChB,YAAA,KAAK,MAAM;gBACT,OAAO,cAAc,CAAC,QAAQ;AAChC,YAAA,KAAK,MAAM;gBACT,OAAO,cAAc,CAAC,MAAM;AAC9B,YAAA,KAAK,aAAa;gBAChB,OAAO,cAAc,CAAC,EAAE;AAC1B,YAAA,KAAK,SAAS;gBACZ,OAAO,cAAc,CAAC,MAAM;AAC9B,YAAA,KAAK,SAAS;gBACZ,OAAO,cAAc,CAAC,MAAM;AAC9B,YAAA;AACE,gBAAA,OAAO,IAAI;;;AAIjB,IAAA,mBAAmB,CAAC,UAAkB,EAAA;QACpC,QAAQ,UAAU;AAChB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,EAAE;AACX,YAAA,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,oBAAoB;AAClC,YAAA,KAAK,aAAa;AAChB,gBAAA,OAAO,EAAE;AACX,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,EAAE;AACX,YAAA,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,sBAAsB;AACpC,YAAA;AACE,gBAAA,OAAO,EAAE;;;IAIf,MAAM,GAAA;;AAEJ,QAAA,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI;YAAE;;AAGpC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC;;IAGvC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAA;QACtB,OAAO,IAAI,CAAC,KAAK;;IAGnB,eAAe,CAAC,KAAK,EAAE,IAAY,EAAA;AACjC,QAAA,OAAO,GAAG,KAAK,CAAA,EAAG,IAAI,CAAC,KAAK,EAAE;;IAOhC,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;;AA7KT,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,kDAsC1B,SAAS,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAtCR,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAkCF,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,gCAAA,EAAA,kCAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAAA,WAAW,EClG/C,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,OAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,IAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,2kJA6HA,ED5EI,MAAA,EAAA,CAAA,48BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA3C,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,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,EAAA,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,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,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,sBAAsB,EACtB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA2C,uBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA9C,GAAA,CAAA,KAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,2BAAA,EAAA,+BAAA,EAAA,2BAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,0BAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,YAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,aAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,UAAA,EAAA,aAAA,EAAA,MAAA,EAAA,eAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,eAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,4BAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAP,GAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,aAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,QAAA,EAAA,eAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,aAAA,EAAA,WAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAiB,EACjB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,WAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,cAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,cAAA,EAAA,MAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,YAAA,EAAA,UAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,gBAAgB,EAChB,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAiB,8BACjB,YAAY,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGH,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBApBrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAGrB,OAAA,EAAA;wBACP,WAAW;wBACX,YAAY;wBACZ,kBAAkB;wBAClB,sBAAsB;wBACtB,WAAW;wBACX,YAAY;wBACZ,iBAAiB;wBACjB,cAAc;wBACd,aAAa;wBACb,gBAAgB;wBAChB,eAAe;wBACf,iBAAiB;wBACjB,YAAY;AACb,qBAAA,EAAA,QAAA,EAAA,2kJAAA,EAAA,MAAA,EAAA,CAAA,48BAAA,CAAA,EAAA;;0BAwCE,MAAM;2BAAC,SAAS;yCArCF,KAAK,EAAA,CAAA;sBAArB,SAAS;uBAAC,IAAI;gBAKN,KAAK,EAAA,CAAA;sBAAb;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBAES,UAAU,EAAA,CAAA;sBAAnB;gBAGQ,eAAe,EAAA,CAAA;sBAAvB;gBAKQ,sBAAsB,EAAA,CAAA;sBAA9B;gBAEQ,sBAAsB,EAAA,CAAA;sBAA9B;gBACQ,gBAAgB,EAAA,CAAA;sBAAxB;gBACQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAEQ,gCAAgC,EAAA,CAAA;sBAAxC;gBAUgD,QAAQ,EAAA,CAAA;sBAAxD,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,UAAU,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;;;ME3FpC,qBAAqB,CAAA;AAIhC,IAAA,WAAA,GAAA;QAHS,IAAI,CAAA,IAAA,GAAW,iBAAiB;;AAKzC,IAAA,QAAQ;+GANG,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,mHCPlC,0UASA,EAAA,CAAA,CAAA;;4FDFa,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBALjC,SAAS;+BACE,eAAe,EAAA,QAAA,EAAA,0UAAA,EAAA;wDAKhB,IAAI,EAAA,CAAA;sBAAZ;gBACQ,KAAK,EAAA,CAAA;sBAAb;;;AEPH;AACM,MAAO,QAAS,SAAQ,UAAU,CAAA;AAItC,IAAA,WAAA,CAAY,EACV,IAAI,EACJ,WAAW,MAIT,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW;;aAGhB,IAAQ,CAAA,QAAA,GAAG,UAAmB,CAAC;;;MCpBpC,cAAc,CAAA;AAIzB,IAAA,WAAA,CAAY,EACV,KAAK,EACL,KAAK,MAIH,EAAE,EAAA;AACJ,QAAA,IAAI,CAAC,KAAK,GAAG,KAAe;AAC5B,QAAA,IAAI,CAAC,KAAK,GAAG,KAAe;;AAGvB,IAAA,SAAA,IAAA,CAAA,MAAM,GAAG;AACd,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;KACO,CAAC;aAEK,IAAQ,CAAA,QAAA,GAAG,gBAAyB,CAAC;;;ACpBjD,MAAO,MAAmC,SAAQ,UAAU,CAAA;AAQhE,IAAA,WAAA,CAAY,EACV,OAAO,EACP,KAAK,EACL,IAAI,EACJ,aAAa,EACb,qBAAqB,EACrB,sBAAsB,MAQpB,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,aAAa,GAAG,aAAa;AAClC,QAAA,IAAI,CAAC,qBAAqB,GAAG,qBAAqB;AAClD,QAAA,IAAI,CAAC,sBAAsB,GAAG,sBAAsB;;AAG/C,IAAA,SAAA,IAAA,CAAA,MAAM,GAAG;AACd,QAAA,OAAO,EAAE;AACP,YAAA,IAAI,EAAE,QAAQ;;;AAGf,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,aAAa,EAAE;AACb,YAAA,IAAI,EAAE,kBAAkB;AACxB,YAAA,IAAI,iBAAiB,GAAA;AACnB,gBAAA,OAAO,cAAc;aACtB;AACF,SAAA;AACD,QAAA,qBAAqB,EAAE;AACrB,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,sBAAsB,EAAE;AACtB,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;KACO,CAAC;aAEK,IAAQ,CAAA,QAAA,GAAG,QAAiB,CAAC;;;AC5D/C;;;;;;;;;;;AAWG;MACU,UAAU,CAAA;AAItB;;ACjBK,MAAO,wBAAyB,SAAQ,UAAU,CAAA;IAGtD,WAAY,CAAA,EACV,mBAAmB,GAAA,GAGjB,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,mBAAmB,GAAG,mBAAmB;;aAGhC,IAAQ,CAAA,QAAA,GAAG,0BAAmC,CAAC;;;ACb3D,MAAO,wBAAyB,SAAQ,UAAU,CAAA;IAGtD,WAAY,CAAA,EACV,KAAK,GAAA,GAGH,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;;aAGJ,IAAQ,CAAA,QAAA,GAAG,0BAAmC,CAAC;;;ACb3D,MAAO,yBAA0B,SAAQ,UAAU,CAAA;AAIvD,IAAA,WAAA,CAAY,EACV,WAAW,EACX,oBAAoB,MAIlB,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAVT,QAAA,IAAA,CAAA,WAAW,GAAc,EAAE,CAAC;QAC5B,IAAoB,CAAA,oBAAA,GAAY,CAAC;AAW/B,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW;AAC9B,QAAA,IAAI,CAAC,oBAAoB,GAAG,oBAAoB;;aAGlC,IAAQ,CAAA,QAAA,GAAG,2BAAH,CAAwC;;;MCnBrD,eAAe,CAAA;AAG3B;;ACDK,MAAO,QAAS,SAAQ,UAAU,CAAA;AAItC,IAAA,WAAA,CAAY,EACV,EAAE,EACF,WAAW,MAIT,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,EAAE,GAAG,EAAE;AACZ,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW;;AAGzB,IAAA,SAAA,IAAA,CAAA,MAAM,GAAG;AACd,QAAA,EAAE,EAAE;AACF,YAAA,IAAI,EAAE,KAAK;AACZ,SAAA;AACD,QAAA,WAAW,EAAE;AACX,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;KACO,CAAC;aAEK,IAAQ,CAAA,QAAA,GAAG,UAAmB,CAAC;;;MC5BpC,eAAe,CAAA;AAG3B;;ACDK,MAAO,aAAc,SAAQ,UAAU,CAAA;AAI3C,IAAA,WAAA,CAAY,EACV,KAAK,EACL,IAAI,MAIF,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;;aAGF,IAAQ,CAAA,QAAA,GAAG,eAAwB,CAAC;;;ACjBtD;AACM,MAAO,gBAAiB,SAAQ,UAAU,CAAA;IAG9C,WAAY,CAAA,EACV,EAAE,GAAA,GAGA,EAAE,EAAA;AACJ,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,EAAE,GAAG,EAAE;;aAGP,IAAQ,CAAA,QAAA,GAAG,kBAA2B,CAAC;;;IChBpC;AAAZ,CAAA,UAAY,uBAAuB,EAAA;AACjC,IAAA,uBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,uBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,uBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,uBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,uBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,uBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,uBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,uBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,uBAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC;AACjC,IAAA,uBAAA,CAAA,kBAAA,CAAA,GAAA,kBAAqC;AACrC,IAAA,uBAAA,CAAA,kBAAA,CAAA,GAAA,kBAAqC;AACrC,IAAA,uBAAA,CAAA,kBAAA,CAAA,GAAA,kBAAqC;AACvC,CAAC,EAbW,uBAAuB,KAAvB,uBAAuB,GAalC,EAAA,CAAA,CAAA;;ICbW;AAAZ,CAAA,UAAY,qBAAqB,EAAA;AAC/B,IAAA,qBAAA,CAAA,qBAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAS;AACT,IAAA,qBAAA,CAAA,qBAAA,CAAA,cAAA,CAAA,GAAA,CAAA,CAAA,GAAA,cAAgB;AAClB,CAAC,EAHW,qBAAqB,KAArB,qBAAqB,GAGhC,EAAA,CAAA,CAAA;;MCMY,SAAS,CAAA;AACpB,IAAA,WAAA,CACU,WAA4B,EAC5B,MAAc,EACd,MAAyB,EAAA;QAFzB,IAAW,CAAA,WAAA,GAAX,WAAW;QACX,IAAM,CAAA,MAAA,GAAN,MAAM;QACN,IAAM,CAAA,MAAA,GAAN,MAAM;;IAGhB,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE;;IAGjB,SAAS,GAAA;QACf,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAChCqC,QAAM,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,SAAS,CAAC;QACpC,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,CAAC,IAAI,KAAI;YACX,IAAI,IAAI,EAAE;AACR,gBAAA,OAAO,IAAI;;AAEb,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7C,YAAA,OAAO,KAAK;SACb,CAAC,CACH;;+GAtBQ,SAAS,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA3B,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAR,IAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAqC,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAT,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,SAAS,cAFR,MAAM,EAAA,CAAA,CAAA;;4FAEP,SAAS,EAAA,UAAA,EAAA,CAAA;kBAHrB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCAY,YAAY,CAAA;AACvB,IAAA,WAAA,CAAoB,WAA4B,EAAA;QAA5B,IAAW,CAAA,WAAA,GAAX,WAAW;;IAE/B,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE;;IAGjB,SAAS,GAAA;QACf,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAChCF,QAAM,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,SAAS,CAAC;QACpC,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,CAAC,IAAI,KAAI;YACX,IAAI,IAAI,EAAE;AACR,gBAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE;AACtC,gBAAA,OAAO,KAAK;;AAEd,YAAA,OAAO,IAAI;SACZ,CAAC,CACH;;+GAlBQ,YAAY,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA3B,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAZ,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cAFX,MAAM,EAAA,CAAA,CAAA;;4FAEP,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACFD;;;;;;;;;;;;AAYG;MAIU,oBAAoB,CAAA;IAC/B,WACU,CAAA,cAAsC,EACtC,gBAAkC,EAAA;QADlC,IAAc,CAAA,cAAA,GAAd,cAAc;QACd,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;;AAG1B,IAAA,WAAW,CAAC,KAAU,EAAA;QACpB,IAAI,KAAK,YAAY,iBAAiB;YAAE;AAExC,QAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAEpB,IAAI,CAAC,cAAc,CAAC,YAAY,CAC9B,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,wBAAwB,CAAC,EACzD,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,sBAAsB,CAAC,CACxD;;+GAdQ,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAqC,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAA7C,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFnB,MAAM,EAAA,CAAA,CAAA;;4FAEP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCfY,sBAAsB,GAAsB,CAAC,GAAG,EAAE,IAAI,KAAI;AACrE,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAEzC,IAAA,MAAM,iBAAiB,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAE3D,IAAA,IAAI,CAAC,iBAAiB;QAAE,OAAO,CAAC,IAAI,EAAE;IAEtC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CACnB8C,UAAQ,CAAC,MAAK;QACZ,IAAI,CAAC,iBAAiB,EAAE;YACtB,OAAO,CAAC,IAAI,EAAE;;KAEjB,CAAC,CAC2B;AACjC;;MCVa,mBAAmB,GAAsB,CAAC,GAAG,EAAE,IAAI,KAAI;IAClE,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjD,IAAA,MAAM,aAAa,GAAqB,GAAG,CAAC,KAAK,CAAC;AAChD,QAAA,IAAI,EAAE,WAAW;AAClB,KAAA,CAAC;AAEF,IAAA,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAC7BC,KAAG,CAAC,CAAC,KAAqB,KAAI;AAC5B,QAAA,IAAI,KAAK,YAAY,YAAY,EAAE;AACjC,YAAA,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;;KAE5B,CAAC,CACH;AACH;AAEA,MAAM,mBAAmB,GAAG,CAAC,GAAY,KAAa;IACpD,IACE,GAAG,KAAK,IAAI;AACZ,QAAA,GAAG,KAAK,SAAS;AACjB,QAAA,GAAG,YAAY,QAAQ;AACvB,QAAA,GAAG,YAAY,IAAI;AACnB,QAAA,GAAG,YAAY,IAAI;QACnB,GAAG,YAAY,WAAW,EAC1B;AACA,QAAA,OAAO,GAAG;;AAGZ,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AACtB,QAAA,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC,IAAI,CAAC,CAAC;;AAGrD,IAAA,IAAI,GAAG,YAAY,IAAI,EAAE;AACvB,QAAA,OAAO,GAAG,CAAC,WAAW,EAAE;;AAG1B,IAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QAC3B,MAAM,MAAM,GAA4B,EAAE;QAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAClC,MAAM,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAE,GAAW,CAAC,GAAG,CAAC,CAAC;;AAEtD,QAAA,OAAO,MAAM;;AAGf,IAAA,OAAO,GAAG;AACZ,CAAC;AAED;;AAEG;AACH,MAAM,aAAa,GAAG,CACpB,MAAe,EACf,MAA4C,EAC5C,GAAqB,KACnB;IACF,IAAI,MAAM,KAAK,IAAI;QAAE;IAErB,MAAM,SAAS,GAAG,sCAAsC;AAExD,IAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC9B,QAAA,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AAC1B,YAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC;AAC7B,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI;;;AAEf,SAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAChC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;;SACtE;QACL,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAiC,CAAC,EAAE;YAChE,aAAa,CACV,MAAkC,CAAC,GAAG,CAAC,EACxC,MAAiC,EACjC,GAAG,CACJ;;;AAGP,CAAC;;AC/ED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;MAEhD,cAAc,GAAsB,CAAC,GAAG,EAAE,IAAI,KAAI;AAC7D,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAExC,IAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;IAClD,IAAI,QAAQ,EAAE;AACZ,QAAA,MAAM,eAAe,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;AACxE,QAAA,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;AACd,YAAA,eAAe,EAAE,IAAI;AACrB,YAAA,IAAI,eAAe,IAAI,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC;AAC1D,SAAA,CAAC;;AAGJ,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC;AAClB;;ACfA;;;;;AAKG;MACU,uBAAuB,GAAsB,CAAC,GAAG,EAAE,IAAI,KAAI;AACtE,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,sBAAsB,CAAC;AACrD,IAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACjD,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC;AAE3C,IAAA,MAAM,YAAY,GAAG,CAAC,GAAsB,EAAE,OAAyB,KAAU;;;;;;;AAO/E,QAAA,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,CAAI,CAAA,EAAA,OAAO,CAAC,MAAM,CAAA,CAAA,EAAI,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC;;;AAIzE,QAAA,IAAI,aAAa,GAAG,GAAG,CAAC,KAAK;AAC7B,QAAA,IAAI,OAAO,CAAC,YAAY,KAAK,MAAM,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE;AACpE,YAAA,IAAI;gBACF,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;;AACrC,YAAA,MAAM;gBACN,aAAa,GAAG,IAAI;;;;;QAMxB,MAAM,aAAa,GAAG,CAAC,MAAc,KACnC,aAAa,EAAE;AACb,cAAE,CAAG,EAAA,MAAM,IAAI,gBAAgB,CAAC,SAAS,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,CAAC,CAAE;cAC/F,MAAM;AAEZ,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;;YAEpB,UAAU,CAAC,MAAK;gBACd,cAAc,CAAC,cAAc,CAC3B,aAAa,CAAC,gBAAgB,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC,EACxE,gBAAgB,CAAC,SAAS,CAAC,2BAA2B,CAAC,CACxD;aACF,EAAE,GAAG,CAAC;;AACF,aAAA,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE;YAC7B,cAAc,CAAC,cAAc,CAC3B,aAAa,CAAC,aAAa,EAAE,OAAO,IAAI,gBAAgB,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,EACxF,gBAAgB,CAAC,SAAS,CAAC,SAAS,CAAC,CACtC;;AACI,aAAA,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE;YAC7B,IAAI,aAAa,EAAE,SAAS,KAAK,aAAa,CAAC,YAAY,EAAE;AAC3D,gBAAA,WAAW,CAAC,YAAY,EAAE,CAAC;;iBACtB;gBACL,cAAc,CAAC,cAAc,CAC3B,aAAa,CAAC,aAAa,EAAE,OAAO,IAAI,gBAAgB,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,EACpF,gBAAgB,CAAC,SAAS,CAAC,SAAS,CAAC,CACtC;;;AAEE,aAAA,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE;YAC7B,cAAc,CAAC,cAAc,CAC3B,aAAa,CAAC,gBAAgB,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC,EACnE,gBAAgB,CAAC,SAAS,CAAC,sBAAsB,CAAC,CACnD;;AACI,aAAA,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE;YAC7B,cAAc,CAAC,cAAc,CAC3B,aAAa,CAAC,gBAAgB,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,EAC5D,gBAAgB,CAAC,SAAS,CAAC,eAAe,CAAC,CAC5C;;aACI;YACL,cAAc,CAAC,YAAY,CACzB,aAAa,CAAC,gBAAgB,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC,EACnE,gBAAgB,CAAC,SAAS,CAAC,sBAAsB,CAAC,CACnD;;AAEL,KAAC;AAED,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CACnB,UAAU,CAAC,CAAC,GAAsB,KAAI;AACpC,QAAA,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC;AACtB,QAAA,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC;KAC7B,CAAC,CACH;AACH;;AC5FgB,SAAA,eAAe,CAC7B,WAA4B,EAC5B,UAAU,EAAA;AAEV,IAAA,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE;AACjC,QAAA,OAAO,MAAK;AACV,YAAA,WAAW,CAAC,wBAAwB,EAAE,CAAC;AACvC,YAAA,OAAO,WAAW,CAAC,YAAY,EAAE;AACnC,SAAC;;AAEH,IAAA,OAAO,MAAK;QACV,OAAO,EAAE,EAAE;AACb,KAAC;AACH;;MCVa,uBAAuB,CAAA;IAClC,WACU,CAAA,IAAgB,EAChB,MAAyB,EAAA;QADzB,IAAI,CAAA,IAAA,GAAJ,IAAI;QACJ,IAAM,CAAA,MAAA,GAAN,MAAM;;AAGhB,IAAA,cAAc,CAAC,IAAY,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAG,EAAA,IAAI,CAAC,MAAM,CAAC,WAAW,CAAA,aAAA,EAAgB,IAAI,CAAA,KAAA,CAAO,CAAC;;+GAPlE,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA7C,IAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAI,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,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,MAAM;AACnB,iBAAA;;;MCFY,6BAA6B,CAAA;AAGxC,IAAA,OAAO,sBAAsB,CAC3B,GAAqC,EACrC,GAAY,EAAA;AAEZ,QAAA,OAAO,IAAI;;+GAPF,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAA7B,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAHzC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC3B,iBAAA;8BAEU,YAAY,EAAA,CAAA;sBAApB;;;ACNH;;AAEG;;ACFH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"spiderly.mjs","sources":["../../../projects/spiderly/src/lib/errors/api-error-codes.ts","../../../projects/spiderly/src/lib/controls/base-control.ts","../../../projects/spiderly/src/lib/controls/base-dropdown-control.ts","../../../projects/spiderly/src/lib/controls/base-autocomplete-control.ts","../../../projects/spiderly/src/lib/components/required/required.component.ts","../../../projects/spiderly/src/lib/components/required/required.component.html","../../../projects/spiderly/src/lib/components/spiderly-form-control/spiderly-form-control.ts","../../../projects/spiderly/src/lib/services/validator-abstract.service.ts","../../../projects/spiderly/src/lib/controls/spiderly-autocomplete/spiderly-autocomplete.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-autocomplete/spiderly-autocomplete.component.html","../../../projects/spiderly/src/lib/services/helper-functions.ts","../../../projects/spiderly/src/lib/controls/spiderly-calendar/spiderly-calendar.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-calendar/spiderly-calendar.component.html","../../../projects/spiderly/src/lib/controls/spiderly-checkbox/spiderly-checkbox.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-checkbox/spiderly-checkbox.component.html","../../../projects/spiderly/src/lib/controls/spiderly-colorpicker/spiderly-colorpicker.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-colorpicker/spiderly-colorpicker.component.html","../../../projects/spiderly/src/lib/controls/spiderly-multiautocomplete/spiderly-multiautocomplete.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-multiautocomplete/spiderly-multiautocomplete.component.html","../../../projects/spiderly/src/lib/controls/spiderly-password/spiderly-password.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-password/spiderly-password.component.html","../../../projects/spiderly/src/lib/controls/spiderly-textbox/spiderly-textbox.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-textbox/spiderly-textbox.component.html","../../../projects/spiderly/src/lib/controls/spiderly-multiselect/spiderly-multiselect.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-multiselect/spiderly-multiselect.component.html","../../../projects/spiderly/src/lib/controls/spiderly-textarea/spiderly-textarea.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-textarea/spiderly-textarea.component.html","../../../projects/spiderly/src/lib/controls/spiderly-number/spiderly-number.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-number/spiderly-number.component.html","../../../projects/spiderly/src/lib/controls/spiderly-dropdown/spiderly-dropdown.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-dropdown/spiderly-dropdown.component.html","../../../projects/spiderly/src/lib/controls/spiderly-editor/spiderly-editor.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-editor/spiderly-editor.component.html","../../../projects/spiderly/src/lib/controls/spiderly-markdown/spiderly-markdown.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-markdown/spiderly-markdown.component.html","../../../projects/spiderly/src/lib/components/spiderly-buttons/spiderly-button-base/spiderly-button-base.ts","../../../projects/spiderly/src/lib/components/spiderly-buttons/spiderly-button/spiderly-button.component.ts","../../../projects/spiderly/src/lib/components/spiderly-buttons/spiderly-button/spiderly-button.component.html","../../../projects/spiderly/src/lib/entities/base-entity.ts","../../../projects/spiderly/src/lib/services/spiderly-message.service.ts","../../../projects/spiderly/src/lib/controls/spiderly-file/spiderly-file.component.ts","../../../projects/spiderly/src/lib/controls/spiderly-file/spiderly-file.component.html","../../../projects/spiderly/src/lib/components/spiderly-buttons/return-button/return-button.component.ts","../../../projects/spiderly/src/lib/components/spiderly-buttons/return-button/return-button.component.html","../../../projects/spiderly/src/lib/controls/spiderly-controls.module.ts","../../../projects/spiderly/src/lib/entities/init-company-auth-dialog-details.ts","../../../projects/spiderly/src/lib/services/config.service.base.ts","../../../projects/spiderly/src/lib/services/api.service.security.ts","../../../projects/spiderly/src/lib/services/auth.service.base.ts","../../../projects/spiderly/src/lib/components/auth/auth-card/auth-card.component.ts","../../../projects/spiderly/src/lib/components/auth/auth-card/auth-card.component.html","../../../projects/spiderly/src/lib/components/auth/external-provider-icons.ts","../../../projects/spiderly/src/lib/components/auth/external-login/external-login.component.ts","../../../projects/spiderly/src/lib/components/auth/external-login/external-login.component.html","../../../projects/spiderly/src/lib/entities/security-entities.ts","../../../projects/spiderly/src/lib/errors/spiderly-error.ts","../../../projects/spiderly/src/lib/services/base-form.service.ts","../../../projects/spiderly/src/lib/components/base-form/base-form.component.ts","../../../projects/spiderly/src/lib/components/spiderly-panels/panel-body/panel-body.component.ts","../../../projects/spiderly/src/lib/components/spiderly-panels/panel-body/panel-body.component.html","../../../projects/spiderly/src/lib/components/spiderly-panels/panel-footer/panel-footer.component.ts","../../../projects/spiderly/src/lib/components/spiderly-panels/panel-footer/panel-footer.component.html","../../../projects/spiderly/src/lib/components/spiderly-panels/panel-header/panel-header.component.ts","../../../projects/spiderly/src/lib/components/spiderly-panels/panel-header/panel-header.component.html","../../../projects/spiderly/src/lib/components/spiderly-panels/spiderly-panel/spiderly-panel.component.ts","../../../projects/spiderly/src/lib/components/spiderly-panels/spiderly-panel/spiderly-panel.component.html","../../../projects/spiderly/src/lib/components/spiderly-panels/spiderly-panels.module.ts","../../../projects/spiderly/src/lib/components/auth/partials/verification-wrapper.component.ts","../../../projects/spiderly/src/lib/components/auth/partials/verification-wrapper.component.html","../../../projects/spiderly/src/lib/components/auth/partials/login-verification.component.ts","../../../projects/spiderly/src/lib/components/auth/partials/login-verification.component.html","../../../projects/spiderly/src/lib/components/auth/login/login.component.ts","../../../projects/spiderly/src/lib/components/auth/login/login.component.html","../../../projects/spiderly/src/lib/components/card-skeleton/card-skeleton.component.ts","../../../projects/spiderly/src/lib/components/card-skeleton/card-skeleton.component.html","../../../projects/spiderly/src/lib/components/index-card/index-card.component.ts","../../../projects/spiderly/src/lib/components/index-card/index-card.component.html","../../../projects/spiderly/src/lib/components/info-card/info-card.component.ts","../../../projects/spiderly/src/lib/components/info-card/info-card.component.html","../../../projects/spiderly/src/lib/entities/init-top-bar-data.ts","../../../projects/spiderly/src/lib/services/web-storage.ts","../../../projects/spiderly/src/lib/services/app-layout.service.base.ts","../../../projects/spiderly/src/lib/components/layout/sidebar/sidebar-menu.service.ts","../../../projects/spiderly/src/lib/components/layout/sidebar/menuitem.component.ts","../../../projects/spiderly/src/lib/components/layout/sidebar/menuitem.component.html","../../../projects/spiderly/src/lib/components/layout/sidebar/sidebar-menu.component.ts","../../../projects/spiderly/src/lib/components/layout/sidebar/sidebar-menu.component.html","../../../projects/spiderly/src/lib/components/layout/sidebar/sidebar.component.ts","../../../projects/spiderly/src/lib/components/layout/sidebar/sidebar.component.html","../../../projects/spiderly/src/lib/components/layout/profile-avatar/profile-avatar.component.ts","../../../projects/spiderly/src/lib/components/layout/profile-avatar/profile-avatar.component.html","../../../projects/spiderly/src/lib/components/layout/sidemenu-topbar/sidemenu-topbar.component.ts","../../../projects/spiderly/src/lib/components/layout/sidemenu-topbar/sidemenu-topbar.component.html","../../../projects/spiderly/src/lib/components/layout/topbar/topbar.component.ts","../../../projects/spiderly/src/lib/components/layout/topbar/topbar.component.html","../../../projects/spiderly/src/lib/components/layout/layout.component.ts","../../../projects/spiderly/src/lib/components/layout/layout.component.html","../../../projects/spiderly/src/lib/components/not-found/not-found.component.ts","../../../projects/spiderly/src/lib/components/not-found/not-found.component.html","../../../projects/spiderly/src/lib/components/spiderly-buttons/spiderly-split-button/spiderly-split-button.component.ts","../../../projects/spiderly/src/lib/components/spiderly-buttons/spiderly-split-button/spiderly-split-button.component.html","../../../projects/spiderly/src/lib/directives/spiderly-cell-template.directive.ts","../../../projects/spiderly/src/lib/directives/spiderly-data-table-actions.directive.ts","../../../projects/spiderly/src/lib/directives/spiderly-overflow-title.directive.ts","../../../projects/spiderly/src/lib/directives/spiderly-filter-template.directive.ts","../../../projects/spiderly/src/lib/filters/spiderly-filter-bar.component.ts","../../../projects/spiderly/src/lib/components/spiderly-delete-dialog/spiderly-delete-confirmation.component.ts","../../../projects/spiderly/src/lib/components/spiderly-delete-dialog/spiderly-delete-confirmation.component.html","../../../projects/spiderly/src/lib/components/spiderly-data-table/spiderly-data-table.component.ts","../../../projects/spiderly/src/lib/components/spiderly-data-table/spiderly-data-table.component.html","../../../projects/spiderly/src/lib/enums/match-mode-enum-codes.ts","../../../projects/spiderly/src/lib/filters/allowed-operators.ts","../../../projects/spiderly/src/lib/filters/filter-store.ts","../../../projects/spiderly/src/lib/components/spiderly-data-view/spiderly-data-view.component.ts","../../../projects/spiderly/src/lib/components/spiderly-data-view/spiderly-data-view.component.html","../../../projects/spiderly/src/lib/components/spiderly-panels/spiderly-card/spiderly-card.component.ts","../../../projects/spiderly/src/lib/components/spiderly-panels/spiderly-card/spiderly-card.component.html","../../../projects/spiderly/src/lib/entities/codebook.ts","../../../projects/spiderly/src/lib/entities/filter-sort-meta.ts","../../../projects/spiderly/src/lib/entities/filter.ts","../../../projects/spiderly/src/lib/entities/filter-rule.ts","../../../projects/spiderly/src/lib/entities/is-authorized-for-save-event.ts","../../../projects/spiderly/src/lib/entities/last-menu-icon-index-clicked.ts","../../../projects/spiderly/src/lib/entities/lazy-load-selected-ids-result.ts","../../../projects/spiderly/src/lib/entities/menuchangeevent.ts","../../../projects/spiderly/src/lib/entities/namebook.ts","../../../projects/spiderly/src/lib/entities/paginated-result.ts","../../../projects/spiderly/src/lib/entities/primeng-option.ts","../../../projects/spiderly/src/lib/entities/simple-save-result.ts","../../../projects/spiderly/src/lib/enums/security-enums.ts","../../../projects/spiderly/src/lib/enums/verification-type-codes.ts","../../../projects/spiderly/src/lib/guards/auth.guard.ts","../../../projects/spiderly/src/lib/guards/not-auth.guard.ts","../../../projects/spiderly/src/lib/handlers/spiderly-error-handler.ts","../../../projects/spiderly/src/lib/interceptors/http-loading.interceptor.ts","../../../projects/spiderly/src/lib/interceptors/json-parser.interceptor.ts","../../../projects/spiderly/src/lib/interceptors/jwt.interceptor.ts","../../../projects/spiderly/src/lib/interceptors/unauthorized.interceptor.ts","../../../projects/spiderly/src/lib/services/app-initializer.ts","../../../projects/spiderly/src/lib/services/spiderly-transloco-loader.ts","../../../projects/spiderly/src/lib/directives/template-type.directive.ts","../../../projects/spiderly/src/public-api.ts","../../../projects/spiderly/src/spiderly.ts"],"sourcesContent":["/**\n * Machine-readable error codes returned in `ApiErrorDTO.errorCode`.\n * Mirror of Spiderly.Shared.DTO.ApiErrorCodes — keep in sync.\n */\nexport const ApiErrorCodes = {\n InvalidToken: 'invalid_token',\n ValidationFailed: 'validation_failed',\n UniqueViolation: 'unique_violation',\n ForeignKeyViolation: 'foreign_key_violation',\n ConcurrencyConflict: 'concurrency_conflict',\n EmailNotVerified: 'email_not_verified',\n ExternalProviderNotConfigured: 'external_provider_not_configured',\n ExternalEmailMissing: 'external_email_missing',\n UnknownFilterField: 'unknown_filter_field',\n UnknownSortField: 'unknown_sort_field',\n InvalidMatchMode: 'invalid_match_mode',\n} as const;\n\nexport type ApiErrorCode = (typeof ApiErrorCodes)[keyof typeof ApiErrorCodes];\n","import { Component, Input } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { SpiderlyFormControl } from '../components/spiderly-form-control/spiderly-form-control';\n\n@Component({\n selector: 'base-control',\n template: '',\n styles: [],\n standalone: false,\n})\nexport class BaseControl {\n @Input() control: SpiderlyFormControl<any>; // If you name it formControl: https://stackoverflow.com/a/54755671/21209982\n @Input() disabled: boolean = false;\n /** Whether the field's label is rendered. Defaults to `true`. */\n @Input() showLabel: boolean = true;\n /** Whether the required (*) indicator is shown next to the label. Defaults to `true`. */\n @Input() showRequired: boolean = true;\n @Input() label: string = null; // NgModel/Want custom translation\n @Input() controlValid: boolean = true; // NgModel\n @Input() placeholder: string = '';\n /** Whether the info tooltip icon is shown next to the label. Defaults to `false`. */\n @Input() showTooltip: boolean = false;\n @Input() tooltipText: string = null;\n @Input() tooltipIcon: string = 'pi pi-info-circle';\n constructor(protected translocoService: TranslocoService) {}\n\n ngOnInit() {\n if (this.control != null && this.disabled == true) this.control.disable();\n }\n\n ngAfterViewInit() {}\n\n /**\n * Every control's TEMPLATE renders without a control (`*ngIf=\"control\"`, `control?.errors`,\n * spiderly-file's no-control custom uploads), and this was the one shared read that did not —\n * so an absent control took the whole page down through the label rather than rendering\n * label-less: an unhandled TypeError per change-detection pass, which the global ErrorHandler\n * turns into the generic error toast.\n *\n * That fixes the shared path only. `spiderly-autocomplete`, `spiderly-colorpicker` and\n * `spiderly-checkbox` (with `initializeToFalse`) still dereference `control` in their own\n * `ngOnInit`, so those three are not yet safe to hand an absent control.\n */\n getTranslatedLabel(): string {\n return this.label ?? this.control?.labelForDisplay;\n }\n\n getValidationErrrorMessages() {\n if (this.control?.errors && this.control?.dirty) {\n // It should always be one error message for single form control,\n // also i don't need to reassign it to null because it will be shown only when control.valid == false\n return this.control.errors['_'];\n }\n\n return null;\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { BaseControl } from './base-control';\nimport { PrimengOption } from '../entities/primeng-option';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { Namebook } from '../entities/namebook';\n\n@Component({\n selector: 'base-dropdown-control',\n template: '',\n styles: [],\n standalone: false,\n})\nexport class BaseDropdownControl extends BaseControl {\n @Input() options: Namebook[];\n /** Whether an addon button is shown next to the dropdown. Defaults to `false`. */\n @Input() showAddon: boolean = false;\n @Input() addonIcon: string = 'pi pi-ellipsis-h';\n @Input() override placeholder: string =\n this.translocoService.translate('SelectFromTheList');\n @Output() onButtonClick: EventEmitter<null> = new EventEmitter();\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n dropdownMarkAsDirty() {\n this.control.markAsDirty();\n }\n\n addonClick() {\n this.onButtonClick.next(null);\n }\n}\n","import { Component, EventEmitter, Output } from '@angular/core';\nimport { AutoCompleteCompleteEvent } from 'primeng/autocomplete';\nimport { BaseDropdownControl } from './base-dropdown-control';\n\n@Component({\n selector: 'base-autocomplete-control',\n template: '',\n styles: [],\n standalone: false,\n})\nexport class BaseAutocompleteControl extends BaseDropdownControl {\n @Output() onTextInput: EventEmitter<AutoCompleteCompleteEvent> =\n new EventEmitter();\n}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'required',\n templateUrl: './required.component.html',\n styles: [],\n standalone: true,\n})\nexport class RequiredComponent {\n constructor() {}\n}\n","<span style=\"color: red; margin-left: 4px\">*</span>\n","import {\n FormArray,\n FormControl,\n FormControlOptions,\n FormGroup,\n ValidatorFn,\n} from '@angular/forms';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { MenuItem } from 'primeng/api';\nimport { Observable } from 'rxjs';\nimport { SchemaAwareConstructor } from '../../entities/base-entity';\nimport { Namebook } from '../../entities/namebook';\nimport { BaseFormService } from '../../services/base-form.service';\nimport { BaseEntity } from './../../entities/base-entity';\n\nexport interface SpiderlyValidatorFn extends ValidatorFn {\n hasNotEmptyRule?: boolean;\n}\n\n// It's made like generic type because of <number>, <string> etc. not to put class like User.\nexport class SpiderlyFormControl<T = any> extends FormControl<T> {\n /**\n * Control name stored in label because it was easier than really accessing the FormControl's name\n */\n public label: string;\n /**\n * Translated label\n */\n public labelForDisplay: string;\n public required: boolean;\n public parentClassName: string;\n public type: string; // number, Date, string, Namebook[], number[]...\n private _spiderlyValidator: SpiderlyValidatorFn | null;\n\n constructor(\n value: any,\n opts: FormControlOptions = null,\n required: boolean = false,\n ) {\n opts = opts ?? { updateOn: 'blur' };\n super(value, opts);\n this.required = required;\n }\n\n override getRawValue(): T {\n // Doing this because .value gets only not disabled values\n return super.getRawValue() as T;\n }\n\n public override get validator(): SpiderlyValidatorFn | null {\n return this._spiderlyValidator;\n }\n\n public override set validator(validator: SpiderlyValidatorFn | null) {\n this._spiderlyValidator = validator;\n this.setValidators(validator);\n }\n}\n\ntype SpiderlyControlsOfType<TValue> = {\n [P in keyof TValue]: TValue[P] extends (infer U)[]\n ? U extends Namebook | string | number | Date | boolean\n ? SpiderlyFormControl<TValue[P]>\n : SpiderlyFormArray<U>\n : TValue[P] extends Date\n ? SpiderlyFormControl<TValue[P]>\n : TValue[P] extends object\n ? SpiderlyFormGroup<TValue[P]>\n : SpiderlyFormControl<TValue[P]>;\n};\n\nexport class SpiderlyFormGroup<TValue = any> extends FormGroup {\n declare controls: SpiderlyControlsOfType<TValue>;\n\n constructor(controls: SpiderlyControlsOfType<TValue>) {\n super(controls);\n }\n\n override getRawValue(): TValue {\n // Doing this because .value gets only not disabled values\n return super.getRawValue() as TValue;\n }\n\n public targetClass: SchemaAwareConstructor<TValue>;\n public trackingId: string = crypto.randomUUID();\n public name?: string; // Using for nested form groups\n public saveObservableMethod?: (saveBody: any) => Observable<any>;\n // TODO: Delete controlNamesFromHtml and add UIDoNotGenerate flag into ng entity generator, we shouldn't even add those into parentFormGroup\n public controlNamesFromHtml?: string[] = [];\n\n public getControl = <TKey extends Extract<keyof TValue, string>>(\n formControlName: TKey,\n ): SpiderlyControlsOfType<TValue>[TKey] => {\n if (\n this.controlNamesFromHtml.findIndex((x) => x === formControlName) === -1\n )\n this.controlNamesFromHtml.push(formControlName);\n\n let formControl = this.controls[formControlName];\n if (formControl == null) {\n console.error(\n `Spiderly: The property ${formControlName} in the form group ${this.targetClass.typeName} doesn't exist`,\n );\n return null;\n }\n\n return formControl;\n };\n}\n\nexport class SpiderlyFormArray<\n TValue extends BaseEntity = any,\n> extends FormArray {\n constructor(\n controls: SpiderlyControlsOfType<TValue>[],\n private translocoService: TranslocoService,\n private baseFormService: BaseFormService,\n ) {\n super(controls);\n }\n\n public label: string;\n public labelForDisplay: string;\n override value: TValue[]; // There is no getRawValue in FormArray\n public required: boolean;\n public formGroupInitialValues: Partial<TValue> = {};\n public targetClass: SchemaAwareConstructor<TValue>;\n public lastMenuIconIndexClicked: number;\n\n public getCrudMenuForOrderedData = () => {\n let crudMenuForOrderedData: MenuItem[] = [\n {\n label: this.translocoService.translate('Remove'),\n icon: 'pi pi-minus',\n command: () => {\n this.baseFormService.removeFormControlFromTheFormArray(\n this,\n this.lastMenuIconIndexClicked,\n );\n },\n },\n {\n label: this.translocoService.translate('AddAbove'),\n icon: 'pi pi-arrow-up',\n command: () => {\n this.baseFormService.addNewFormGroupToFormArray(\n this,\n this.targetClass,\n this.formGroupInitialValues,\n this.lastMenuIconIndexClicked,\n );\n },\n },\n {\n label: this.translocoService.translate('AddBelow'),\n icon: 'pi pi-arrow-down',\n command: () => {\n this.baseFormService.addNewFormGroupToFormArray(\n this,\n this.targetClass,\n this.formGroupInitialValues,\n this.lastMenuIconIndexClicked + 1,\n );\n },\n },\n ];\n\n return crudMenuForOrderedData;\n };\n\n public addNewFormGroup = (index: number) => {\n this.baseFormService.addNewFormGroupToFormArray(\n this,\n this.targetClass,\n this.formGroupInitialValues,\n index,\n );\n };\n\n public getFormGroups = () => {\n return this.controls as SpiderlyFormGroup<TValue>[];\n };\n\n disableAllFormControls() {\n this.controls.forEach((segmentationItemFormGroup: SpiderlyFormGroup) => {\n Object.keys(segmentationItemFormGroup.controls).forEach((key) => {\n segmentationItemFormGroup.controls[key].disable();\n });\n });\n }\n\n enableAllFormControls() {\n this.controls.forEach((segmentationItemFormGroup: SpiderlyFormGroup) => {\n Object.keys(segmentationItemFormGroup.controls).forEach((key) => {\n segmentationItemFormGroup.controls[key].enable();\n });\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ValidationErrors } from '@angular/forms';\nimport { TranslocoService } from '@jsverse/transloco';\nimport {\n SpiderlyFormArray,\n SpiderlyFormControl,\n SpiderlyValidatorFn,\n} from '../components/spiderly-form-control/spiderly-form-control';\nimport { ImageDimensionsValidationResult } from '../entities/image-dimensions-validation-result';\n\n@Injectable({\n providedIn: 'root',\n})\nexport abstract class ValidatorAbstractService {\n constructor(protected translocoService: TranslocoService) {}\n\n abstract setValidator(\n formControl: SpiderlyFormControl,\n className: string,\n ): SpiderlyValidatorFn;\n\n abstract setFormArrayValidator(\n formArray: SpiderlyFormArray,\n className: string,\n ): void;\n\n validateImageDimensions(\n file: File,\n imageWidth: number,\n imageHeight: number,\n ): Promise<ImageDimensionsValidationResult> {\n return new Promise((resolve) => {\n const img = new Image();\n const objectUrl = URL.createObjectURL(file);\n\n img.onload = () => {\n URL.revokeObjectURL(objectUrl);\n const width = img.width;\n const height = img.height;\n const errors: string[] = [];\n\n if (imageWidth > 0 && width !== imageWidth) {\n errors.push(\n this.translocoService.translate('ImageWidthMustBeExact', {\n 0: imageWidth,\n 1: width,\n }),\n );\n }\n\n if (imageHeight > 0 && height !== imageHeight) {\n errors.push(\n this.translocoService.translate('ImageHeightMustBeExact', {\n 0: imageHeight,\n 1: height,\n }),\n );\n }\n\n resolve({ isValid: errors.length === 0, errors });\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(objectUrl);\n resolve({ isValid: true, errors: [] });\n };\n\n img.src = objectUrl;\n });\n }\n\n notEmpty = (control: SpiderlyFormControl): void => {\n const validator: SpiderlyValidatorFn = (): ValidationErrors | null => {\n const value = control.value;\n\n const notEmptyRule =\n typeof value !== 'undefined' && value !== null && value !== '';\n\n const arrayValid = notEmptyRule;\n\n return arrayValid\n ? null\n : { _: this.translocoService.translate('NotEmpty') };\n };\n validator.hasNotEmptyRule = true;\n control.required = true;\n control.validator = validator;\n control.updateValueAndValidity();\n };\n\n /** Validates that a SpiderlyFormArray (collection of form controls/groups) is not empty. */\n isFormArrayEmpty = (control: SpiderlyFormArray): void => {\n const validator: SpiderlyValidatorFn = (): ValidationErrors | null => {\n const value = control;\n\n const notEmptyRule =\n typeof value !== 'undefined' && value !== null && value.length !== 0;\n\n const arrayValid = notEmptyRule;\n\n return arrayValid\n ? null\n : {\n _: this.translocoService.translate('ListCanNotBeEmpty', {\n value: control.labelForDisplay,\n }),\n };\n };\n validator.hasNotEmptyRule = true;\n control.required = true;\n control.setValidators(validator);\n control.updateValueAndValidity();\n };\n\n /** Validates that a SpiderlyFormControl holding an array value (e.g., multi-select dropdown) is not empty. */\n isArrayEmpty = (control: SpiderlyFormControl): SpiderlyValidatorFn => {\n const validator: SpiderlyValidatorFn = (): ValidationErrors | null => {\n const value = control.value;\n\n const notEmptyRule =\n typeof value !== 'undefined' && value !== null && value.length !== 0;\n\n const arrayValid = notEmptyRule;\n\n return arrayValid\n ? null\n : { _: this.translocoService.translate('NotEmpty') };\n };\n validator.hasNotEmptyRule = true;\n control.required = true;\n return validator;\n };\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport {\n AutoCompleteCompleteEvent,\n AutoCompleteModule,\n AutoCompleteSelectEvent,\n} from 'primeng/autocomplete';\nimport { InputGroupModule } from 'primeng/inputgroup';\nimport { InputGroupAddonModule } from 'primeng/inputgroupaddon';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { ValidatorAbstractService } from '../../services/validator-abstract.service';\nimport { BaseAutocompleteControl } from '../base-autocomplete-control';\nimport { SpiderlyFormControl } from '../../components/spiderly-form-control/spiderly-form-control';\nimport { Namebook } from '../../entities/namebook';\n\n@Component({\n selector: 'spiderly-autocomplete',\n templateUrl: './spiderly-autocomplete.component.html',\n imports: [\n ReactiveFormsModule,\n FormsModule,\n AutoCompleteModule,\n InputGroupAddonModule,\n InputGroupModule,\n CommonModule,\n RequiredComponent,\n TranslocoDirective,\n ],\n})\nexport class SpiderlyAutocompleteComponent\n extends BaseAutocompleteControl\n implements OnInit\n{\n @Input() appendTo: any = 'body';\n /** Whether a clear button is shown. Defaults to `true`. */\n @Input() showClear: boolean = true;\n @Input() emptyMessage: string;\n @Input() displayName: string; // Added because when we initialize the object options are null\n helperFormControl = new SpiderlyFormControl<Namebook>(null, {\n updateOn: 'change',\n });\n\n constructor(\n protected override translocoService: TranslocoService,\n private validatorService: ValidatorAbstractService,\n ) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n\n this.helperFormControl.label = this.control.label;\n this.validatorService.setValidator(\n this.helperFormControl,\n this.control.parentClassName,\n );\n\n if (this.control.value != null)\n this.helperFormControl.setValue({\n displayName: this.displayName,\n id: this.control.value,\n });\n\n if (this.emptyMessage == null) {\n this.emptyMessage = this.translocoService.translate('EmptyMessage');\n }\n }\n\n search(event: AutoCompleteCompleteEvent) {\n this.onTextInput.next(event);\n }\n\n select(event: AutoCompleteSelectEvent) {\n const selectedOption: Namebook = event.value;\n this.control.setValue(selectedOption.id);\n this.helperFormControl.setValue({\n displayName: selectedOption.displayName,\n id: selectedOption.id,\n });\n }\n\n clear() {\n this.control.setValue(null);\n this.helperFormControl.setValue(null);\n }\n\n autocompleteMarkAsDirty() {\n this.dropdownMarkAsDirty();\n this.helperFormControl.markAsDirty();\n }\n}\n","<ng-container *transloco=\"let t\">\n <div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div *ngIf=\"getTranslatedLabel() != '' && getTranslatedLabel() != null\">\n <!-- By passing an empty string we remove the label entirely -->\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n\n <!-- Don't support p-inputgroup -->\n <p-autocomplete\n *ngIf=\"control\"\n [id]=\"label\"\n [formControl]=\"helperFormControl\"\n [placeholder]=\"placeholder\"\n [suggestions]=\"options\"\n (completeMethod)=\"search($event)\"\n [forceSelection]=\"true\"\n [dropdown]=\"false\"\n [showClear]=\"showClear\"\n (onHide)=\"autocompleteMarkAsDirty()\"\n (onSelect)=\"select($event)\"\n (onClear)=\"clear()\"\n [completeOnFocus]=\"true\"\n [fluid]=\"true\"\n [style]=\"{ width: '100%' }\"\n [appendTo]=\"appendTo\"\n [emptyMessage]=\"emptyMessage\"\n [lazy]=\"true\"\n optionLabel=\"displayName\"\n ></p-autocomplete>\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n </div>\n</ng-container>\n","import { HttpResponse } from '@angular/common/http';\nimport * as FileSaver from 'file-saver';\nimport mime from 'mime';\nimport 'reflect-metadata';\nimport { map, Observable } from 'rxjs';\nimport {\n Action,\n Column,\n} from '../components/spiderly-data-table/spiderly-data-table.component';\nimport { SpiderlyTab } from '../components/spiderly-panels/panel-header/panel-header.component';\nimport { Codebook } from '../entities/codebook';\nimport { Filter } from '../entities/filter';\nimport { Namebook } from '../entities/namebook';\nimport { FilterOption } from '../filters/filter-store';\nimport { PrimengOption } from '../entities/primeng-option';\n\n// Helper function for PrecisionScale validation (to be added in the TypeScript output):\nexport function validatePrecisionScale(\n value: any,\n precision: number,\n scale: number,\n ignoreTrailingZeros: boolean,\n): boolean {\n if (typeof value !== 'number') return false;\n const [integerPart, decimalPart] = value.toString().split('.');\n if (integerPart.length > precision - scale) return false;\n if (decimalPart && decimalPart.length > scale) return false;\n if (\n !ignoreTrailingZeros &&\n decimalPart &&\n decimalPart.replace(/0+$/, '').length > scale\n )\n return false;\n return true;\n}\n\nexport function getMimeTypeForFileName(fileName: string): string {\n return mime.getType(fileName) ?? 'application/octet-stream';\n}\n\nexport function adjustColor(color: string, percent: number): string {\n if (!/^#([0-9A-F]{3}){1,2}$/i.test(color)) {\n console.error('Invalid hex color format');\n }\n\n let r: number, g: number, b: number;\n if (color.length === 7) {\n r = parseInt(color.slice(1, 3), 16);\n g = parseInt(color.slice(3, 5), 16);\n b = parseInt(color.slice(5, 7), 16);\n } else {\n r = parseInt(color[1] + color[1], 16);\n g = parseInt(color[2] + color[2], 16);\n b = parseInt(color[3] + color[3], 16);\n }\n\n const adjust = (value: number, percent: number): number => {\n const amount = (percent / 100) * 255;\n const newValue = Math.min(Math.max(value + amount, 0), 255);\n return Math.round(newValue);\n };\n\n r = adjust(r, percent);\n g = adjust(g, percent);\n b = adjust(b, percent);\n\n const toHex = (value: number): string => {\n const hex = value.toString(16).padStart(2, '0');\n return hex;\n };\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\n// new Date('yyyy-MM-dd') is parsed as UTC midnight per the JS spec, which shifts to the previous day\n// in negative-UTC locales. Construct via numeric components to anchor at local midnight instead.\nexport function parseDateOnlyLocal(s: string): Date | null {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(s);\n if (!m) return null;\n return new Date(+m[1], +m[2] - 1, +m[3]);\n}\n\nexport function getHtmlImgDisplayString64(base64String: string) {\n if (base64String == null) return null;\n\n const [header, base64Content] = base64String.split(';base64,');\n const fileName = header.split('=')[1];\n const mimeType = getMimeTypeForFileName(fileName);\n return `data:${mimeType};base64, ${base64Content}`;\n}\n\nexport function nameof<TObject>(obj: TObject, key: keyof TObject): string;\nexport function nameof<TObject>(key: keyof TObject): string;\nexport function nameof(key1: any, key2?: any): any {\n return key2 ?? key1;\n}\nexport function nameOf<TObject extends { name: S }, S extends string>(\n funcOrClass: TObject,\n): S {\n return funcOrClass.name;\n}\n\nexport function getParentUrl(currentUrl: string) {\n const urlSegments = currentUrl.split('/');\n urlSegments.pop();\n const parentUrl = urlSegments.join('/');\n return parentUrl;\n}\n\n// export function getMonth(number: number): string {\n// const months: string[] = [\n// \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n// \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n// ];\n\n// if (number < 1 || number > 12) {\n// throw new Error(\"Invalid month number. It should be between 1 and 12.\");\n// }\n\n// return months[number - 1];\n// }\n\nexport function getMonth(numberOfTheMonth: number): string {\n const meseci: string[] = [\n 'Januar',\n 'Februar',\n 'Mart',\n 'April',\n 'Maj',\n 'Jun',\n 'Jul',\n 'Avgust',\n 'Septembar',\n 'Oktobar',\n 'Novembar',\n 'Decembar',\n ];\n\n if (numberOfTheMonth < 1 || numberOfTheMonth > 12) {\n console.error('Nevažeći broj meseca. Broj treba biti između 1 i 12.');\n }\n\n return meseci[numberOfTheMonth - 1];\n}\n\nexport function singleOrDefault<T>(\n array: T[],\n predicate: (item: T) => boolean,\n): T | undefined {\n const filtered = array.filter(predicate);\n if (filtered.length > 1) {\n throw new Error('Sequence contains more than one matching element.');\n }\n return filtered[0];\n}\n\nexport function pushAction(cols: Column[], action: Action) {\n const actionsColumn = singleOrDefault(cols, (x) => x.actions != null);\n if (actionsColumn) {\n actionsColumn.actions = [...actionsColumn.actions, action];\n }\n}\n\nexport function deleteAction(cols: Column[], actionField: string): void {\n const actionsColumn = singleOrDefault(cols, (x) => x.actions != null);\n\n if (actionsColumn && actionsColumn.actions) {\n const index = actionsColumn.actions.findIndex(\n (a) => a.field === actionField,\n );\n if (index !== -1) {\n actionsColumn.actions.splice(index, 1);\n }\n }\n}\n\nexport function getFileNameFromContentDisposition(\n resp: HttpResponse<Blob>,\n defaultName: string,\n): string {\n let fileName;\n if (resp && resp.headers && resp.headers.get('Content-Disposition')) {\n let val = resp.headers.get('Content-Disposition');\n let start = val.indexOf('filename=');\n if (start != -1) {\n let end = val.indexOf(';', start);\n fileName =\n end != -1 ? val.substring(start + 9, end) : val.substring(start + 9);\n fileName = fileName.split('\"').join('');\n }\n }\n return fileName ?? defaultName;\n}\n\nexport function toCommaSeparatedString<T>(input: T[]): string {\n const stringList = input.map((item) => item?.toString() ?? '');\n\n if (stringList.length > 1) {\n return `${stringList.slice(0, -1).join(', ')} and ${stringList[stringList.length - 1]}`;\n } else {\n return stringList[0] ?? '';\n }\n}\n\nexport function isFileImageType(mimeType: string): boolean {\n if (mimeType.startsWith('image/')) {\n return true;\n }\n\n return false;\n}\n\nexport function isExcelFileType(mimeType: string): boolean {\n if (\n mimeType ===\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||\n mimeType === 'application/vnd.ms-excel'\n ) {\n return true;\n }\n\n return false;\n}\n\nexport function saveResponseAsFile(\n res: HttpResponse<Blob>,\n fallbackName: string,\n): void {\n if (res?.body == null) {\n return;\n }\n let fileName = getFileNameFromContentDisposition(res, fallbackName);\n FileSaver.saveAs(res.body, decodeURIComponent(fileName));\n}\n\nexport function exportListToExcel(\n exportListToExcelObservableMethod: (filter: Filter) => Observable<any>,\n filter: Filter,\n) {\n exportListToExcelObservableMethod(filter).subscribe((res) => {\n saveResponseAsFile(res, 'ExcelExport.xlsx');\n });\n}\n\nexport function getPrimengNamebookOptions(\n namebookList: Namebook[],\n): PrimengOption[] {\n return namebookList.map((x) => ({ label: x.displayName, code: x.id }));\n}\n\n/**\n * The filter store's twin of `getPrimengNamebookOptions` — same namebook in, the store's\n * `{ value, label }` shape out (a `FilterOption` is not a `PrimengOption`: that one's `code` is\n * deliberate, see `primeng-option.ts`). Every consumer filling a pick-list filter from a lookup\n * needs this map; without it each page re-derives the three lines.\n */\nexport function getFilterOptions(namebookList: Namebook[]): FilterOption[] {\n return namebookList.map((x) => ({ value: x.id, label: x.displayName }));\n}\n\nexport function getPrimengDropdownNamebookOptions(\n getDropdownListObservable: (\n parentEntityId?: number,\n ) => Observable<Namebook[]>,\n parentEntityId?: number,\n): Observable<PrimengOption[]> {\n return getDropdownListObservable(parentEntityId ?? 0).pipe(\n map((res) => getPrimengNamebookOptions(res)),\n );\n}\n\nexport function getPrimengDropdownCodebookOptions(\n getDropdownListObservable: () => Observable<Codebook[]>,\n): Observable<PrimengOption[]> {\n return getDropdownListObservable().pipe(\n map((res) => {\n return res.map((x) => ({ label: x.displayName, code: x.code }));\n }),\n );\n}\n\nexport function getPrimengAutocompleteNamebookOptions(\n getAutocompleteListObservable: (\n limit: number,\n query: string,\n parentEntityId?: number,\n ) => Observable<Namebook[]>,\n limit: number,\n query: string,\n parentEntityId?: number,\n): Observable<PrimengOption[]> {\n return getAutocompleteListObservable(limit, query, parentEntityId ?? 0).pipe(\n map((res) => {\n return res.map((x) => ({ label: x.displayName, code: x.id }));\n }),\n );\n}\n\nexport function getPrimengAutocompleteCodebookOptions(\n getAutocompleteListObservable: (\n limit: number,\n query: string,\n ) => Observable<Codebook[]>,\n limit: number,\n query: string,\n): Observable<PrimengOption[]> {\n return getAutocompleteListObservable(limit, query).pipe(\n map((res) => {\n return res.map((x) => ({ label: x.displayName, code: x.code }));\n }),\n );\n}\n\nexport const isNullOrEmpty = (input: string) => {\n if (input == null || input === '') {\n return true;\n }\n\n return false;\n};\n\nexport const selectedTab = (tabs: SpiderlyTab[]): number => {\n const tab = singleOrDefault(tabs, (x) => x.isSelected);\n\n if (tab) {\n return tab.id;\n } else {\n return null;\n }\n};\n\nexport function firstCharToUpper(input: string): string {\n return input.charAt(0).toUpperCase() + input.slice(1);\n}\n\nexport function splitPascalCase(input: string) {\n const regex = /($[a-z])|[A-Z][^A-Z]+/g;\n return input.match(regex).join(' ');\n}\n\nexport function capitalizeFirstChar(str: string): string {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport function kebabToTitleCase(input: string): string {\n return input\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\nexport const PROPS_KEY = Symbol('props');\n\nexport function ReflectProp(target: any, propertyKey: string) {\n const props = Reflect.getMetadata(PROPS_KEY, target) || [];\n Reflect.defineMetadata(PROPS_KEY, [...props, propertyKey], target);\n}\n\nexport function getImageDimensions(\n file: File,\n): Promise<{ width: number; height: number }> {\n return new Promise((resolve) => {\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.width, height: img.height });\n URL.revokeObjectURL(img.src);\n };\n img.src = URL.createObjectURL(file);\n });\n}\n\n/**\n * Scrolls `element` back under the top of the viewport, but only when it has already scrolled\n * above it. Set the element's `scroll-margin-top` to whatever fixed chrome must stay clear.\n * Assumes the element's nearest scroll container is the viewport itself.\n */\n// This is the one full telling of the three decisions below; paging is the caller (see\n// spiderly-data-table/CLAUDE.md → \"Scroll back to the table on page change\").\n// - The offset is READ from CSS rather than passed in, so the amount of fixed chrome to clear\n// stays declared in one place per component and no TypeScript knows the shell's dimensions.\n// That read is also why the viewport assumption above matters: getBoundingClientRect is\n// viewport-relative, so inside a consumer's own overflow container it measures the wrong box.\n// - The early return is what stops a list sitting BELOW other page content (a table inside a\n// details form) from shoving that content off-screen when it was already visible.\n// - `behavior: 'instant'` overrides the element's CSS `scroll-behavior`; `'auto'` defers to it,\n// so an app setting `html { scroll-behavior: smooth }` would animate every call.\nexport function scrollElementIntoViewIfAboveViewport(element: HTMLElement): void {\n const offset = parseFloat(getComputedStyle(element).scrollMarginTop) || 0;\n if (element.getBoundingClientRect().top >= offset) return;\n\n element.scrollIntoView({\n block: 'start',\n inline: 'nearest',\n behavior: 'instant',\n });\n}\n","import { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { BaseControl } from '../base-control';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule, FormControl } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { DatePickerModule } from 'primeng/datepicker';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { Subscription } from 'rxjs';\nimport { parseDateOnlyLocal } from '../../services/helper-functions';\n\n@Component({\n selector: 'spiderly-calendar',\n templateUrl: './spiderly-calendar.component.html',\n styles: [],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n DatePickerModule,\n TooltipModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyCalendarComponent extends BaseControl implements OnInit, OnDestroy {\n /** Whether the time picker is shown in addition to the date. Defaults to `false`. */\n @Input() showTime: boolean = false;\n @Input() dateOnly: boolean = false;\n @Input() timeOnly: boolean = false;\n\n internalControl = new FormControl<Date | null>(null);\n\n private syncing = false;\n private subscriptions: Subscription[] = [];\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n\n if (!this.usesStringProxy() || !this.control) return;\n\n this.applyFromOuter(this.control.value);\n if (this.control.disabled) this.internalControl.disable({ emitEvent: false });\n\n this.subscriptions.push(\n this.control.valueChanges.subscribe((v) => {\n if (!this.syncing) this.applyFromOuter(v);\n })\n );\n this.subscriptions.push(\n this.control.statusChanges.subscribe((status) => {\n if (status === 'DISABLED' && this.internalControl.enabled)\n this.internalControl.disable({ emitEvent: false });\n else if (status !== 'DISABLED' && this.internalControl.disabled)\n this.internalControl.enable({ emitEvent: false });\n })\n );\n this.subscriptions.push(\n this.internalControl.valueChanges.subscribe((d) => {\n if (!this.syncing) this.applyToOuter(d);\n })\n );\n }\n\n ngOnDestroy() {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n setDate(event: Date) {}\n\n usesStringProxy(): boolean {\n return this.dateOnly || this.timeOnly;\n }\n\n private applyFromOuter(v: unknown): void {\n this.syncing = true;\n try {\n if (v == null) {\n this.internalControl.setValue(null);\n } else if (this.dateOnly && typeof v === 'string') {\n this.internalControl.setValue(parseDateOnlyLocal(v));\n } else if (this.timeOnly && typeof v === 'string') {\n this.internalControl.setValue(this.parseTimeOnly(v));\n } else if (v instanceof Date) {\n this.internalControl.setValue(v);\n } else {\n this.internalControl.setValue(null);\n }\n } finally {\n this.syncing = false;\n }\n }\n\n private applyToOuter(d: Date | null): void {\n this.syncing = true;\n try {\n if (d == null) {\n this.control.setValue(null);\n } else if (this.dateOnly) {\n this.control.setValue(this.formatDateOnly(d));\n } else if (this.timeOnly) {\n this.control.setValue(this.formatTimeOnly(d));\n } else {\n this.control.setValue(d);\n }\n } finally {\n this.syncing = false;\n }\n }\n\n private parseTimeOnly(s: string): Date | null {\n const m = /^(\\d{2}):(\\d{2})(?::(\\d{2}))?/.exec(s);\n if (!m) return null;\n const d = new Date();\n d.setHours(+m[1], +m[2], +(m[3] ?? 0), 0);\n return d;\n }\n\n private formatDateOnly(d: Date): string {\n return `${d.getFullYear()}-${this.pad(d.getMonth() + 1)}-${this.pad(d.getDate())}`;\n }\n\n private formatTimeOnly(d: Date): string {\n return `${this.pad(d.getHours())}:${this.pad(d.getMinutes())}:${this.pad(d.getSeconds())}`;\n }\n\n private pad(n: number): string {\n return String(n).padStart(2, '0');\n }\n}\n","<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div\n *ngIf=\"getTranslatedLabel() != '' && getTranslatedLabel() != null\"\n style=\"display: flex; align-items: center\"\n >\n <div>\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n <!-- tabindex=\"-1\": Makes the element focusable, but removes it from the tab order. -->\n <i\n *ngIf=\"showTooltip\"\n class=\"{{ tooltipIcon }}\"\n style=\"margin-left: 8px; cursor: pointer\"\n [pTooltip]=\"tooltipText\"\n tabindex=\"-1\"\n tooltipEvent=\"focus\"\n ></i>\n </div>\n <p-datepicker\n *ngIf=\"control\"\n [formControl]=\"usesStringProxy() ? internalControl : control\"\n (onBlur)=\"control.markAsDirty()\"\n [dateFormat]=\"timeOnly ? '' : 'dd.mm.yy.'\"\n iconDisplay=\"input\"\n [showIcon]=\"true\"\n [showTime]=\"!usesStringProxy() && showTime\"\n [timeOnly]=\"timeOnly\"\n (onSelect)=\"setDate($event)\"\n appendTo=\"body\"\n [fluid]=\"true\"\n />\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { BaseControl } from '../base-control';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { CheckboxChangeEvent, CheckboxModule } from 'primeng/checkbox';\n\n@Component({\n selector: 'spiderly-checkbox',\n templateUrl: './spiderly-checkbox.component.html',\n styleUrl: './spiderly-checkbox.component.scss',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n CheckboxModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyCheckboxComponent extends BaseControl implements OnInit {\n @Input() fakeLabel = true;\n @Input() initializeToFalse = false;\n @Input() inlineLabel = false;\n @Output() onChange = new EventEmitter<CheckboxChangeEvent>();\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n if (this.initializeToFalse == true) this.control.setValue(false);\n\n super.ngOnInit();\n }\n\n change = (event: CheckboxChangeEvent) => {\n this.onChange.next(event);\n };\n}\n","<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div\n *ngIf=\"\n inlineLabel === false &&\n getTranslatedLabel() != '' &&\n getTranslatedLabel() != null\n \"\n >\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n <div style=\"margin-top: 0.5rem; position: relative\">\n <!-- The margin-top is intentional: it vertically aligns the checkbox with other input controls that have greater height. -->\n <p-checkbox\n *ngIf=\"control\"\n [formControl]=\"control\"\n [value]=\"inlineLabel ? label : null\"\n [id]=\"label\"\n [binary]=\"true\"\n (onChange)=\"change($event)\"\n />\n </div>\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { BaseControl } from '../base-control';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { CommonModule } from '@angular/common';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { ColorPickerModule } from 'primeng/colorpicker';\nimport { InputTextModule } from 'primeng/inputtext';\n\n@Component({\n selector: 'spiderly-colorpicker',\n templateUrl: './spiderly-colorpicker.component.html',\n styles: [],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n ColorPickerModule,\n InputTextModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyColorPickerComponent\n extends BaseControl\n implements OnInit\n{\n /** Whether a hex text input is shown alongside the color swatch. Defaults to `true`. */\n @Input() showInputTextField: boolean = true;\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n this.control.valueChanges.subscribe((value) => {\n this.control.setValue(value, { emitEvent: false }); // Preventing infinite loop\n });\n\n if (this.control.value == null)\n this.placeholder = this.translocoService.translate(\n 'ColorPickerPlaceholder',\n );\n\n super.ngOnInit();\n }\n}\n","<!-- Can't put (onBlur) in this control -->\n\n<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div *ngIf=\"getTranslatedLabel() != '' && getTranslatedLabel() != null\">\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n <div style=\"display: flex; gap: 10px\">\n <input\n *ngIf=\"control && showInputTextField\"\n pInputText\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [id]=\"control.label\"\n (blur)=\"control.markAsDirty()\"\n [fluid]=\"true\"\n />\n <p-colorpicker\n *ngIf=\"control\"\n [formControl]=\"control\"\n [id]=\"control.label\"\n (blur)=\"control.markAsDirty()\"\n appendTo=\"body\"\n ></p-colorpicker>\n </div>\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport {\n AutoCompleteCompleteEvent,\n AutoCompleteModule,\n} from 'primeng/autocomplete';\nimport { BaseAutocompleteControl } from '../base-autocomplete-control';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\n\n@Component({\n selector: 'spiderly-multiautocomplete',\n templateUrl: './spiderly-multiautocomplete.component.html',\n imports: [\n ReactiveFormsModule,\n FormsModule,\n AutoCompleteModule,\n CommonModule,\n RequiredComponent,\n TranslocoDirective,\n ],\n})\nexport class SpiderlyMultiAutocompleteComponent\n extends BaseAutocompleteControl\n implements OnInit\n{\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n }\n\n search(event: AutoCompleteCompleteEvent) {\n this.onTextInput.next(event);\n }\n}\n","<ng-container *transloco=\"let t\">\n <div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div>\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n\n <!-- Don't support p-inputgroup -->\n <!-- Showing label fix: https://github.com/primefaces/primeng/issues/17332#issuecomment-2922861294 -->\n <p-autocomplete\n *ngIf=\"control\"\n [id]=\"label\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [suggestions]=\"options\"\n (completeMethod)=\"search($event)\"\n [forceSelection]=\"true\"\n [multiple]=\"true\"\n [dropdown]=\"false\"\n [showClear]=\"true\"\n (onHide)=\"dropdownMarkAsDirty()\"\n [completeOnFocus]=\"true\"\n dropdownIcon=\"pi pi-plus\"\n [fluid]=\"true\"\n [style]=\"{ width: '100%' }\"\n appendTo=\"body\"\n optionLabel=\"displayName\"\n dataKey=\"id\"\n >\n </p-autocomplete>\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n </div>\n</ng-container>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { BaseControl } from '../base-control';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { CommonModule } from '@angular/common';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { PasswordModule } from 'primeng/password';\n\n@Component({\n selector: 'spiderly-password',\n templateUrl: './spiderly-password.component.html',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n PasswordModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyPasswordComponent extends BaseControl implements OnInit {\n /** Whether a password-strength meter is shown below the field. Defaults to `false`. */\n @Input() showPasswordStrength: boolean = false;\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n }\n}\n","<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div>\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n <p-password\n *ngIf=\"control\"\n [formControl]=\"control\"\n [id]=\"control?.label\"\n [toggleMask]=\"true\"\n [feedback]=\"showPasswordStrength\"\n (onBlur)=\"control?.markAsDirty()\"\n [style]=\"{ width: '100%' }\"\n [inputStyle]=\"{ width: '100%' }\"\n />\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { BaseControl } from '../base-control';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { CommonModule } from '@angular/common';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { InputTextModule } from 'primeng/inputtext';\n\n@Component({\n selector: 'spiderly-textbox',\n templateUrl: './spiderly-textbox.component.html',\n styleUrl: '../base-controls.scss',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n InputTextModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyTextboxComponent extends BaseControl implements OnInit {\n /** Whether an icon button is appended to the input. Defaults to `false`. */\n @Input() showButton: boolean = false;\n @Input() buttonIcon: string;\n @Output() onButtonClick = new EventEmitter();\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n }\n\n buttonClick() {\n this.onButtonClick.next(null);\n }\n}\n","<!-- Can't put (onBlur) in this control -->\n\n<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div *ngIf=\"getTranslatedLabel() != '' && getTranslatedLabel() != null\">\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n <div class=\"spiderly-inputgroup\">\n <input\n *ngIf=\"control\"\n pInputText\n [formControl]=\"control\"\n [id]=\"control.label\"\n (blur)=\"control.markAsDirty()\"\n [placeholder]=\"placeholder\"\n [fluid]=\"true\"\n />\n <span\n *ngIf=\"showButton\"\n (click)=\"buttonClick()\"\n class=\"spiderly-inputgroup-addon\"\n >\n <i class=\"{{ buttonIcon }}\"></i>\n </span>\n </div>\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { BaseDropdownControl } from '../base-dropdown-control';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { MultiSelectModule } from 'primeng/multiselect';\n\n@Component({\n selector: 'spiderly-multiselect',\n templateUrl: './spiderly-multiselect.component.html',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n MultiSelectModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyMultiSelectComponent\n extends BaseDropdownControl\n implements OnInit\n{\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n }\n}\n","<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div>\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n <p-multiSelect\n *ngIf=\"control\"\n [id]=\"label\"\n [formControl]=\"control\"\n [options]=\"options\"\n optionLabel=\"displayName\"\n optionValue=\"id\"\n display=\"chip\"\n [maxSelectedLabels]=\"20\"\n [placeholder]=\"placeholder\"\n [fluid]=\"true\"\n appendTo=\"body\"\n />\n <!-- [virtualScroll]=\"true\" FT: I think that this is not doing anything, check -->\n <!-- (onFilter)=\"search($event)\" FT: While they don't implement lazy load like here: https://github.com/yelhouti/primeng/blob/8.0.0-rc2/src/app/components/multiselect/multiselect.ts\n we need to use this and dropdown control only on the client -->\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { BaseControl } from '../base-control';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { CommonModule } from '@angular/common';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { TextareaModule } from 'primeng/textarea';\n\n@Component({\n selector: 'spiderly-textarea',\n templateUrl: './spiderly-textarea.component.html',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n TextareaModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyTextareaComponent extends BaseControl implements OnInit {\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n }\n}\n","<!-- Can't put (onBlur) in this control -->\n\n<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div>\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n <textarea\n *ngIf=\"control\"\n pTextarea\n [formControl]=\"control\"\n [id]=\"control.label\"\n (blur)=\"control.markAsDirty()\"\n [autoResize]=\"true\"\n [class]=\"control.disabled ? 'disabled' : ''\"\n ></textarea>\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { BaseControl } from '../base-control';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { CommonModule } from '@angular/common';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { InputNumberModule } from 'primeng/inputnumber';\n\n@Component({\n selector: 'spiderly-number',\n templateUrl: './spiderly-number.component.html',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n InputNumberModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyNumberComponent extends BaseControl implements OnInit {\n @Input() prefix: string;\n /** Whether increment/decrement spinner buttons are shown. Defaults to `true`. */\n @Input() showButtons: boolean = true;\n @Input() decimal: boolean;\n @Input() maxFractionDigits: number = 0;\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n }\n}\n","<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div *ngIf=\"showLabel\">\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n <p-inputNumber\n *ngIf=\"control\"\n [formControl]=\"control\"\n [id]=\"control.label\"\n (onBlur)=\"control.markAsDirty()\"\n [prefix]=\"prefix\"\n [style]=\"{ width: '100%' }\"\n [inputStyle]=\"{ width: '100%' }\"\n [showButtons]=\"showButtons\"\n buttonLayout=\"horizontal\"\n [maxFractionDigits]=\"maxFractionDigits\"\n />\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { BaseDropdownControl } from '../base-dropdown-control';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { DropdownChangeEvent } from 'primeng/dropdown';\nimport { SelectModule } from 'primeng/select';\nimport { TooltipModule } from 'primeng/tooltip';\n\n@Component({\n selector: 'spiderly-dropdown',\n templateUrl: './spiderly-dropdown.component.html',\n styles: [],\n imports: [\n ReactiveFormsModule,\n FormsModule,\n SelectModule,\n TooltipModule,\n CommonModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyDropdownComponent\n extends BaseDropdownControl\n implements OnInit\n{\n @Input() isBooleanPicker: boolean = false;\n @Output() onChange = new EventEmitter<DropdownChangeEvent>();\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n if (this.isBooleanPicker) {\n this.options = [\n { displayName: this.translocoService.translate('True'), id: true },\n { displayName: this.translocoService.translate('False'), id: false },\n { displayName: this.translocoService.translate('Empty'), id: null },\n ];\n }\n\n super.ngOnInit();\n }\n\n change(event: DropdownChangeEvent) {\n this.onChange.next(event);\n }\n}\n","<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div *ngIf=\"getTranslatedLabel() != '' && getTranslatedLabel() != null\">\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n <!-- tabindex=\"-1\": Makes the element focusable, but removes it from the tab order. -->\n <i\n *ngIf=\"showTooltip\"\n class=\"{{ tooltipIcon }}\"\n style=\"margin-left: 5px; cursor: pointer\"\n [pTooltip]=\"tooltipText\"\n tabindex=\"-1\"\n tooltipEvent=\"focus\"\n ></i>\n </div>\n\n <!-- Don't support p-inputgroup -->\n <p-select\n *ngIf=\"control\"\n [id]=\"label\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [options]=\"options\"\n optionLabel=\"displayName\"\n optionValue=\"id\"\n [showClear]=\"true\"\n (onHide)=\"dropdownMarkAsDirty()\"\n (onChange)=\"change($event)\"\n [fluid]=\"true\"\n appendTo=\"body\"\n />\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, Input, OnInit, ViewChild } from '@angular/core';\nimport { BaseControl } from '../base-control';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { CommonModule } from '@angular/common';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { Editor, EditorModule, EditorInitEvent } from 'primeng/editor';\nimport { Observable } from 'rxjs';\nimport { EditorImageUploadResult } from '../../entities/editor-image-upload-result';\n\n@Component({\n selector: 'spiderly-editor',\n templateUrl: './spiderly-editor.component.html',\n styles: [],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n EditorModule,\n RequiredComponent,\n ],\n})\nexport class SpiderlyEditorComponent extends BaseControl implements OnInit {\n @ViewChild(Editor) editor: Editor;\n\n @Input() uploadImageMethod: (formData: FormData) => Observable<EditorImageUploadResult>;\n @Input() objectId: number = 0;\n /** Mirrors the entity property's [AcceptedFileTypes] so the picker matches what the server validates. */\n @Input() acceptedFileTypes: string[];\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n }\n\n onEditorInit(event: EditorInitEvent) {\n const quill = event.editor;\n\n if (this.uploadImageMethod) {\n const toolbar = quill.getModule('toolbar');\n toolbar.addHandler('image', () => this.imageHandler(quill));\n }\n }\n\n private imageHandler(quill: any) {\n const input = document.createElement('input');\n input.setAttribute('type', 'file');\n input.setAttribute('accept', this.acceptedFileTypes?.join(',') ?? 'image/*');\n input.click();\n\n input.onchange = async () => {\n const file = input.files[0];\n if (file) {\n const formData = new FormData();\n formData.append('file', file, `${this.objectId}-${file.name}`);\n\n this.uploadImageMethod(formData).subscribe((result: EditorImageUploadResult) => {\n const range = quill.getSelection(true);\n quill.insertEmbed(range.index, 'image', result.url);\n // Quill 2's built-in Image blot recognizes width/height as native attributes,\n // so formatText writes them directly onto the rendered <img>. Storefront uses\n // these to size the image up-front and prevent CLS. (0, 0) means the server\n // couldn't determine an intrinsic size (e.g. an SVG without width/viewBox) —\n // omit the attributes entirely rather than render an invisible 0×0 image.\n if (result.width && result.height) {\n quill.formatText(range.index, 1, { width: result.width, height: result.height });\n }\n quill.setSelection(range.index + 1);\n });\n }\n };\n }\n\n onClick() {\n let editableArea: HTMLElement =\n this.editor.el.nativeElement.querySelector('.ql-editor');\n\n editableArea.onblur = () => {\n this.control.markAsDirty();\n };\n }\n}\n","<!-- Can't put (onBlur) in this control -->\n\n<div style=\"display: flex; flex-direction: column; gap: 0.5rem; padding: 0 1px\">\n <div *ngIf=\"getTranslatedLabel() != '' && getTranslatedLabel() != null\">\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n\n <!-- Disable doesn't work on this control -->\n <p-editor\n *ngIf=\"control\"\n [formControl]=\"control\"\n [readonly]=\"control.disabled\"\n [class]=\"control.invalid && control.dirty ? 'control-error-border' : ''\"\n [id]=\"control.label\"\n [placeholder]=\"placeholder\"\n (click)=\"onClick()\"\n (onInit)=\"onEditorInit($event)\"\n [style]=\"{ height: '320px' }\"\n ></p-editor>\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';\nimport { BaseControl } from '../base-control';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { CommonModule } from '@angular/common';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { TextareaModule } from 'primeng/textarea';\nimport { TabsModule } from 'primeng/tabs';\nimport { MarkdownComponent } from 'ngx-markdown';\nimport { Observable } from 'rxjs';\nimport { EditorImageUploadResult } from '../../entities/editor-image-upload-result';\n\n/**\n * Markdown form control: a plain textarea (Write) with a rendered live preview (Preview),\n * arranged as tabs. The stored value is raw Markdown text.\n *\n * The preview is rendered with ngx-markdown (marked) and is intentionally APPROXIMATE — a\n * consuming storefront may render the same Markdown with a different engine/flavor.\n *\n * The <textarea> DOM is the source of truth for the text (the form control mirrors it, like\n * spiderly-editor mirrors Quill). We never splice control.value, because SpiderlyFormControl\n * defaults to updateOn:'blur' and would be stale relative to the focused textarea.\n *\n * When {@link uploadImageMethod} is provided (wired by the generator for properties with an\n * S3 public-storage attribute), pasting an image uploads it and, on success, inserts a\n * standard `` link at the caret via execCommand (which preserves the native undo\n * stack). Upload progress is shown out-of-band, not as a token in the text.\n */\n@Component({\n selector: 'spiderly-markdown',\n templateUrl: './spiderly-markdown.component.html',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n TextareaModule,\n TabsModule,\n MarkdownComponent,\n RequiredComponent,\n TranslocoDirective,\n ],\n})\nexport class SpiderlyMarkdownComponent extends BaseControl implements OnInit {\n @ViewChild('textarea') textareaRef: ElementRef<HTMLTextAreaElement>;\n\n @Input() uploadImageMethod: (formData: FormData) => Observable<EditorImageUploadResult>;\n @Input() objectId: number = 0;\n\n pendingImageUploads: number = 0;\n imageUploadFailed: boolean = false;\n\n constructor(protected override translocoService: TranslocoService) {\n super(translocoService);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n }\n\n onPaste(event: ClipboardEvent) {\n // Only intercept when image upload is wired; otherwise let the default paste happen.\n if (!this.uploadImageMethod || this.control?.disabled) return;\n\n const imageFile = this.getPastedImage(event);\n if (!imageFile) return;\n\n event.preventDefault();\n\n const formData = new FormData();\n formData.append('file', imageFile, `${this.objectId}-${imageFile.name || 'pasted-image.png'}`);\n\n this.imageUploadFailed = false;\n this.pendingImageUploads++;\n\n this.uploadImageMethod(formData).subscribe({\n next: (result: EditorImageUploadResult) => {\n this.pendingImageUploads--;\n this.insertImageMarkdown(result.url);\n },\n error: () => {\n this.pendingImageUploads--;\n this.imageUploadFailed = true;\n },\n });\n }\n\n private getPastedImage(event: ClipboardEvent): File | null {\n const items = event.clipboardData?.items;\n if (!items) return null;\n\n for (let i = 0; i < items.length; i++) {\n if (items[i].type.startsWith('image/')) {\n return items[i].getAsFile();\n }\n }\n\n return null;\n }\n\n private insertImageMarkdown(url: string) {\n const snippet = ``;\n const textarea = this.textareaRef?.nativeElement;\n\n // Preferred path: the textarea is focused, so insert at the caret while preserving the\n // native undo stack. The resulting 'input' event syncs the control on blur, exactly like\n // the user typing — no manual setValue, no stale-model read.\n if (textarea && document.activeElement === textarea && document.execCommand('insertText', false, snippet)) {\n return;\n }\n\n // Fallback (textarea blurred/absent, or execCommand unsupported): read the LIVE textarea\n // value — never control.value, which is stale while focused. When blurred, the control is\n // already current, so appending can't drop uncommitted text.\n if (textarea) {\n const sep = textarea.value.length ? '\\n' : '';\n textarea.value = `${textarea.value}${sep}${snippet}`;\n this.control.setValue(textarea.value);\n } else {\n const current = this.control.value ?? '';\n this.control.setValue(current.length ? `${current}\\n${snippet}` : snippet);\n }\n this.control.markAsDirty();\n }\n}\n","<div style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div *ngIf=\"getTranslatedLabel() != '' && getTranslatedLabel() != null\">\n <label>{{ getTranslatedLabel() }}</label>\n <required *ngIf=\"control?.required && showRequired\"></required>\n </div>\n\n <ng-container *transloco=\"let t\">\n <p-tabs *ngIf=\"control\" value=\"write\">\n <p-tablist>\n <p-tab value=\"write\">{{ t('Write') }}</p-tab>\n <p-tab value=\"preview\">{{ t('Preview') }}</p-tab>\n </p-tablist>\n <p-tabpanels>\n <p-tabpanel value=\"write\">\n <textarea\n #textarea\n pTextarea\n [formControl]=\"control\"\n [id]=\"control.label\"\n (blur)=\"control.markAsDirty()\"\n (paste)=\"onPaste($event)\"\n [autoResize]=\"true\"\n [class]=\"control.disabled ? 'disabled' : ''\"\n [style]=\"{ width: '100%', minHeight: '320px' }\"\n ></textarea>\n <small *ngIf=\"pendingImageUploads > 0\">{{ t('UploadingImage') }}</small>\n <small *ngIf=\"imageUploadFailed\" class=\"spiderly-error-message\">{{ t('ImageUploadFailed') }}</small>\n </p-tabpanel>\n <p-tabpanel value=\"preview\">\n <div class=\"spiderly-markdown-preview\" style=\"min-height: 320px\">\n <markdown [data]=\"control.value\"></markdown>\n </div>\n </p-tabpanel>\n </p-tabpanels>\n </p-tabs>\n </ng-container>\n\n <small *ngIf=\"control?.errors && control?.dirty\" class=\"spiderly-error-message\">\n {{ getValidationErrrorMessages() }}\n </small>\n</div>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ButtonModule } from 'primeng/button';\nimport { SplitButtonModule } from 'primeng/splitbutton';\nimport { Subject, Subscription, throttleTime } from 'rxjs';\nimport { Router } from '@angular/router';\n\n@Component({\n selector: 'spiderly-button-base',\n template: ``,\n styles: [],\n imports: [CommonModule, ButtonModule, SplitButtonModule],\n})\nexport class SpiderlyButtonBaseComponent {\n @Input() icon: string;\n /** Optional image icon (URL) rendered before the label — for brand logos (e.g. Google) that aren't PrimeNG font icons. */\n @Input() iconUrl: string;\n @Input() label: string;\n @Input() outlined: boolean = false;\n @Input() rounded: boolean = false;\n @Input() styleClass: string;\n @Input() routerLink: string;\n @Input() style: { [klass: string]: any };\n @Input() class: string;\n @Input() severity:\n | 'success'\n | 'info'\n | 'warn'\n | 'danger'\n | 'help'\n | 'primary'\n | 'secondary'\n | 'contrast'\n | null\n | undefined;\n @Input() size: 'small' | 'large' | undefined;\n @Input() disabled: boolean = false;\n\n @Output() onClick = new EventEmitter<Event>();\n private clickSubject = new Subject<Event>(); // Internal subject to handle click events.\n private subscription: Subscription;\n\n constructor(private router: Router) {}\n\n ngOnInit() {\n this.subscription = this.clickSubject\n .pipe(throttleTime(500))\n .subscribe((event: Event) => this.onClick.emit(event));\n }\n\n handleClick = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n if (this.routerLink !== undefined) {\n this.router.navigate([this.routerLink]);\n } else {\n this.clickSubject.next(event);\n }\n };\n\n ngOnDestroy() {\n this.subscription.unsubscribe();\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ButtonModule } from 'primeng/button';\nimport { SplitButtonModule } from 'primeng/splitbutton';\nimport { SpiderlyButtonBaseComponent } from '../spiderly-button-base/spiderly-button-base';\n\n@Component({\n selector: 'spiderly-button',\n templateUrl: './spiderly-button.component.html',\n styles: [],\n imports: [CommonModule, ButtonModule, SplitButtonModule],\n})\nexport class SpiderlyButtonComponent extends SpiderlyButtonBaseComponent {\n // constructor() {\n // super();\n\n // }\n @Input() type: 'button' | 'submit' | 'reset' = 'button';\n}\n","<p-button\n (onClick)=\"handleClick($event)\"\n [label]=\"iconUrl ? undefined : label\"\n [icon]=\"icon\"\n [outlined]=\"outlined\"\n [styleClass]=\"styleClass\"\n [severity]=\"severity\"\n [rounded]=\"rounded\"\n [style]=\"style\"\n [class]=\"class\"\n [disabled]=\"disabled\"\n [size]=\"size\"\n [type]=\"type\"\n>\n <ng-container *ngIf=\"iconUrl\">\n <img [src]=\"iconUrl\" [alt]=\"label\" style=\"height: 16px; width: 16px; margin-right: 8px\" />\n <span>{{ label }}</span>\n </ng-container>\n <ng-content></ng-content>\n</p-button>\n","interface PropertySchema {\n type: string; // Use a string or an enum to represent the type (e.g., 'string', 'number', 'Date')\n nestedConstructor?: SchemaAwareConstructor<any>;\n isSaveBodyMainDTO?: boolean;\n // Add other metadata you might need (e.g., isRequired, minLength, etc.)\n}\n\nexport interface ClassSchema {\n [propertyName: string]: PropertySchema;\n}\n\n// A type that represents a class constructor with a static 'schema' property\nexport type SchemaAwareConstructor<T> = {\n new (...args: any[]): T;\n readonly schema: ClassSchema; // The static property holding the schema\n readonly typeName: string; // 'typeName' can't be named 'name' because of the conflict with the Function.name\n};\n\nexport class BaseEntity {}\n","import { TranslocoService } from '@jsverse/transloco';\nimport { Injectable, NgZone } from '@angular/core';\nimport { MessageService } from 'primeng/api';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SpiderlyMessageService {\n // TODO FT: nece da prikaze poruku ako je neki angular error koji se dogodi tek nakon api poziva\n constructor(\n private messageService: MessageService,\n private translocoService: TranslocoService,\n private ngZone: NgZone,\n ) {}\n\n successMessage(\n detail: string,\n title: string = this.translocoService.translate('SuccessfulAction'),\n ) {\n this.messageService.add({\n severity: 'success',\n summary: title,\n detail: detail,\n life: 10000,\n });\n }\n\n warningMessage(detail: string, title?: string, sticky?: boolean) {\n this.messageService.add({\n severity: 'warn',\n summary: title ?? this.translocoService.translate('Warning'),\n detail: detail,\n life: 10000,\n sticky: sticky,\n });\n }\n\n errorMessage(\n detail: string,\n title: string = this.translocoService.translate('Error'),\n ) {\n this.messageService.add({\n severity: 'error',\n summary: title,\n detail: detail,\n life: 10000,\n });\n }\n\n infoMessage(detail: string, title?: string, sticky?: boolean) {\n this.messageService.add({\n severity: 'info',\n summary: title ?? this.translocoService.translate('Info'),\n detail: detail,\n life: 10000,\n sticky: sticky,\n });\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { FileSelectEvent, FileUploadModule } from 'primeng/fileupload';\nimport { RequiredComponent } from '../../components/required/required.component';\nimport { SpiderlyButtonComponent } from '../../components/spiderly-buttons/spiderly-button/spiderly-button.component';\nimport { BaseEntity } from '../../entities/base-entity';\nimport {\n getImageDimensions,\n getMimeTypeForFileName,\n isExcelFileType,\n isFileImageType,\n} from '../../services/helper-functions';\nimport { SpiderlyMessageService } from '../../services/spiderly-message.service';\nimport { ValidatorAbstractService } from '../../services/validator-abstract.service';\nimport { BaseControl } from '../base-control';\n\n@Component({\n selector: 'spiderly-file',\n templateUrl: './spiderly-file.component.html',\n styles: [],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n FileUploadModule,\n RequiredComponent,\n SpiderlyButtonComponent,\n TranslocoDirective,\n ],\n})\nexport class SpiderlyFileComponent extends BaseControl implements OnInit {\n @Output() onFileSelected = new EventEmitter<SpiderlyFileSelectEvent>();\n @Output() onFileRemoved = new EventEmitter<null>();\n @Input() objectId: number;\n @Input() fileData: string;\n @Input() acceptedFileTypes: Array<\n | 'image/*'\n | 'image/png'\n | 'image/jpeg'\n | 'image/webp'\n | 'image/gif'\n | 'image/avif'\n | 'image/svg+xml'\n | '.png'\n | '.jpg'\n | '.jpeg'\n | '.webp'\n | '.gif'\n | '.avif'\n | '.svg'\n | 'application/pdf'\n | '.pdf'\n | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n | 'application/vnd.ms-excel'\n | '.xlsx'\n | '.xls'\n | 'video/*'\n | 'video/mp4'\n | '.mp4'\n | 'audio/*'\n | 'audio/mpeg'\n | '.mp3'\n | 'application/zip'\n | '.zip'\n | 'text/csv'\n | '.csv'\n > = ['image/*'];\n @Input() required: boolean; // It's okay for this control, because for the custom uploads where we are not initializing the control from the backend, there is no need for formControl.\n @Input() multiple: boolean = false;\n @Input() isUrlFileData: boolean = true;\n @Input() imageWidth: number = 0;\n @Input() imageHeight: number = 0;\n @Input() maxFileSize: number = 20_000_000;\n\n acceptedFileTypesCommaSeparated: string;\n existingFileUrl: string | null = null;\n existingFileIsImage: boolean = false;\n existingFileName: string = '';\n @Input() files: File[] = [];\n\n constructor(\n protected override translocoService: TranslocoService,\n private messageService: SpiderlyMessageService,\n private validatorService: ValidatorAbstractService,\n ) {\n super(translocoService);\n }\n\n override ngOnInit() {\n if (this.control?.value != null && this.fileData != null) {\n if (this.isUrlFileData) {\n this.setExistingFileUrl(this.fileData);\n } else {\n const file = this.getFileFromBase64(this.fileData);\n this.files.push(file);\n }\n }\n\n if (!this.objectId) {\n this.objectId = 0;\n }\n\n this.acceptedFileTypesCommaSeparated = this.acceptedFileTypes.join(',');\n\n super.ngOnInit();\n }\n\n filesSelected(event: FileSelectEvent) {\n const file = event.files[0];\n this.existingFileUrl = null;\n\n if (\n this.isFileImageType(file.type) &&\n this.hasImageDimensionConstraints()\n ) {\n this.files = [];\n this.validatorService\n .validateImageDimensions(file, this.imageWidth, this.imageHeight)\n .then((result) => {\n if (result.isValid) {\n this.files = [file];\n this.emitFileSelected(file);\n } else {\n this.messageService.errorMessage(result.errors.join('\\n'));\n }\n });\n } else {\n this.emitFileSelected(file);\n }\n }\n\n private async emitFileSelected(file: File): Promise<void> {\n const formData = new FormData();\n formData.append('file', file, `${this.objectId}-${file.name}`);\n\n let width: number | undefined;\n let height: number | undefined;\n\n if (this.isFileImageType(file.type)) {\n const dimensions = await getImageDimensions(file);\n width = dimensions.width;\n height = dimensions.height;\n }\n\n this.onFileSelected.next(\n new SpiderlyFileSelectEvent({ file, formData, width, height }),\n );\n }\n\n private hasImageDimensionConstraints(): boolean {\n return this.imageWidth > 0 || this.imageHeight > 0;\n }\n\n choose(event, chooseCallback) {\n chooseCallback();\n }\n\n fileRemoved(removeFileCallback, index: number) {\n removeFileCallback(index);\n this.clearFile();\n }\n\n removeExistingFile() {\n this.existingFileUrl = null;\n this.clearFile();\n }\n\n private clearFile() {\n this.control?.setValue(null);\n this.onFileRemoved.next(null);\n }\n\n private setExistingFileUrl(url: string) {\n this.existingFileUrl = url;\n this.existingFileName = url.split('/').pop()?.split('?')[0] ?? '';\n const mimeType = getMimeTypeForFileName(this.existingFileName);\n this.existingFileIsImage = isFileImageType(mimeType);\n }\n\n getFileFromBase64(base64String: string) {\n const [header, base64Content] = base64String.split(';base64,');\n const fileName = header.split('=')[1];\n const mimeType = getMimeTypeForFileName(fileName);\n\n const byteCharacters = atob(base64Content);\n const byteNumbers = new Uint8Array(byteCharacters.length);\n\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n\n const blob = new Blob([byteNumbers], { type: mimeType });\n const file = new File([blob], fileName, { type: mimeType });\n\n return file;\n }\n\n isFileImageType(mimeType: string): boolean {\n return isFileImageType(mimeType);\n }\n\n isExcelFileType(mimeType: string): boolean {\n return isExcelFileType(mimeType);\n }\n}\n\nexport class SpiderlyFileSelectEvent extends BaseEntity {\n file?: File;\n formData?: FormData;\n width?: number;\n height?: number;\n\n constructor({\n file,\n formData,\n width,\n height,\n }: {\n file?: File;\n formData?: FormData;\n width?: number;\n height?: number;\n } = {}) {\n super();\n\n this.file = file;\n this.formData = formData;\n this.width = width;\n this.height = height;\n }\n\n static readonly typeName = 'SpiderlyFileSelectEvent' as const;\n}\n","<ng-container *transloco=\"let t\">\n <div style=\"display: flex; flex-direction: column; gap: 0.5rem; padding: 1px\">\n <div *ngIf=\"getTranslatedLabel() != '' && getTranslatedLabel() != null\">\n <label>{{ getTranslatedLabel() }}</label>\n <!-- It's okay for this control, because for the custom uploads where we are not initializing the control from the backend, there is no need for formControl. -->\n <required *ngIf=\"control?.required || required\"></required>\n </div>\n\n <p-fileUpload\n [files]=\"files\"\n [disabled]=\"disabled\"\n [name]=\"control?.label ?? label\"\n [multiple]=\"multiple\"\n [accept]=\"acceptedFileTypesCommaSeparated\"\n [maxFileSize]=\"maxFileSize\"\n (onSelect)=\"filesSelected($event)\"\n [class]=\"control?.invalid && control?.dirty ? 'control-error-border' : ''\"\n >\n <ng-template\n pTemplate=\"header\"\n let-files\n let-chooseCallback=\"chooseCallback\"\n let-clearCallback=\"clearCallback\"\n let-uploadCallback=\"uploadCallback\"\n >\n <div\n class=\"flex flex-wrap justify-between items-center flex-1 gap-2\"\n >\n <div class=\"flex gap-2\">\n <spiderly-button\n [disabled]=\"disabled\"\n (onClick)=\"choose($event, chooseCallback)\"\n icon=\"pi pi-upload\"\n [rounded]=\"true\"\n [outlined]=\"true\"\n />\n </div>\n </div>\n </ng-template>\n <ng-template\n pTemplate=\"content\"\n let-files\n let-removeFileCallback=\"removeFileCallback\"\n >\n <div *ngIf=\"existingFileUrl\">\n <div class=\"flex justify-center p-0 gap-8\">\n <div\n class=\"card m-0 px-4 py-4 flex flex-col items-center gap-4\"\n style=\"justify-content: center; overflow: hidden\"\n >\n <div *ngIf=\"existingFileIsImage\" class=\"image-container\">\n <img [src]=\"existingFileUrl\" />\n </div>\n <div *ngIf=\"!existingFileIsImage\">\n <i class=\"pi pi-file\" style=\"margin-right: 4px\"></i>\n <span>{{ existingFileName }}</span>\n </div>\n <spiderly-button\n [disabled]=\"disabled\"\n icon=\"pi pi-times\"\n (onClick)=\"removeExistingFile()\"\n [outlined]=\"true\"\n [rounded]=\"true\"\n severity=\"danger\"\n />\n </div>\n </div>\n </div>\n <div *ngIf=\"!existingFileUrl && files.length > 0\">\n <div class=\"flex justify-center p-0 gap-8\">\n <div\n *ngFor=\"let file of files; let index = index\"\n class=\"card m-0 px-4 py-4 flex flex-col items-center gap-4\"\n style=\"justify-content: center; overflow: hidden\"\n >\n <div *ngIf=\"isFileImageType(file.type)\" class=\"image-container\">\n <img role=\"presentation\" [src]=\"file.objectURL\" />\n </div>\n <div *ngIf=\"isExcelFileType(file.type)\" class=\"excel-container\">\n <div class=\"excel-details\">\n <i\n class=\"pi pi-file-excel\"\n style=\"color: green; margin-right: 4px\"\n ></i>\n <span class=\"file-name\">{{ file.name }}</span>\n </div>\n </div>\n <spiderly-button\n [disabled]=\"disabled\"\n icon=\"pi pi-times\"\n (onClick)=\"fileRemoved(removeFileCallback, index)\"\n [outlined]=\"true\"\n [rounded]=\"true\"\n severity=\"danger\"\n />\n </div>\n </div>\n </div>\n </ng-template>\n <ng-template pTemplate=\"file\"> </ng-template>\n <ng-template pTemplate=\"empty\">\n <div *ngIf=\"!existingFileUrl\" class=\"flex items-center justify-center flex-col\">\n <i\n class=\"pi pi-cloud-upload border-2 rounded-full p-8 text-8xl text-gray-400 border-gray-400 mt-4\"\n ></i>\n <p class=\"mt-6 mb-0\">{{ t(\"DragAndDropFilesHereToUpload\") }}</p>\n </div>\n </ng-template>\n </p-fileUpload>\n </div>\n</ng-container>\n","import { Component, Input } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { getParentUrl } from '../../../services/helper-functions';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { ButtonModule } from 'primeng/button';\nimport { SpiderlyButtonComponent } from '../spiderly-button/spiderly-button.component';\n\n@Component({\n selector: 'return-button',\n templateUrl: './return-button.component.html',\n styles: [],\n imports: [\n CommonModule,\n ButtonModule,\n SpiderlyButtonComponent,\n TranslocoDirective,\n ],\n})\nexport class SpiderlyReturnButtonComponent {\n @Input() navigateUrl: string;\n\n constructor(private router: Router) {}\n\n onReturn() {\n if (this.navigateUrl == undefined) {\n const currentUrl = this.router.url;\n const parentUrl: string = getParentUrl(currentUrl);\n this.router.navigateByUrl(parentUrl);\n } else {\n this.router.navigate([this.navigateUrl]);\n }\n }\n}\n","<ng-container *transloco=\"let t\">\n <spiderly-button\n (onClick)=\"onReturn()\"\n [label]=\"t('Return')\"\n icon=\"pi pi-undo\"\n [outlined]=\"true\"\n ></spiderly-button>\n</ng-container>\n","import { NgModule } from '@angular/core';\nimport { SpiderlyMultiAutocompleteComponent } from './spiderly-multiautocomplete/spiderly-multiautocomplete.component';\nimport { SpiderlyPasswordComponent } from './spiderly-password/spiderly-password.component';\nimport { SpiderlyTextboxComponent } from './spiderly-textbox/spiderly-textbox.component';\nimport { SpiderlyCheckboxComponent } from './spiderly-checkbox/spiderly-checkbox.component';\nimport { SpiderlyMultiSelectComponent } from './spiderly-multiselect/spiderly-multiselect.component';\nimport { SpiderlyTextareaComponent } from './spiderly-textarea/spiderly-textarea.component';\nimport { SpiderlyNumberComponent } from './spiderly-number/spiderly-number.component';\nimport { SpiderlyDropdownComponent } from './spiderly-dropdown/spiderly-dropdown.component';\nimport { SpiderlyEditorComponent } from './spiderly-editor/spiderly-editor.component';\nimport { SpiderlyMarkdownComponent } from './spiderly-markdown/spiderly-markdown.component';\nimport { SpiderlyColorPickerComponent } from './spiderly-colorpicker/spiderly-colorpicker.component';\nimport { SpiderlyFileComponent } from './spiderly-file/spiderly-file.component';\nimport { SpiderlyCalendarComponent } from './spiderly-calendar/spiderly-calendar.component';\nimport { SpiderlyAutocompleteComponent } from './spiderly-autocomplete/spiderly-autocomplete.component';\nimport { SpiderlyButtonComponent } from '../components/spiderly-buttons/spiderly-button/spiderly-button.component';\nimport { SpiderlyReturnButtonComponent } from '../components/spiderly-buttons/return-button/return-button.component';\n\n@NgModule({\n imports: [\n SpiderlyTextboxComponent,\n SpiderlyTextareaComponent,\n SpiderlyCheckboxComponent,\n SpiderlyCalendarComponent,\n SpiderlyReturnButtonComponent,\n SpiderlyButtonComponent,\n SpiderlyPasswordComponent,\n SpiderlyAutocompleteComponent,\n SpiderlyMultiAutocompleteComponent,\n SpiderlyMultiSelectComponent,\n SpiderlyNumberComponent,\n SpiderlyDropdownComponent,\n SpiderlyEditorComponent,\n SpiderlyMarkdownComponent,\n SpiderlyColorPickerComponent,\n SpiderlyFileComponent,\n ],\n exports: [\n SpiderlyTextboxComponent,\n SpiderlyTextareaComponent,\n SpiderlyCheckboxComponent,\n SpiderlyCalendarComponent,\n SpiderlyReturnButtonComponent,\n SpiderlyButtonComponent,\n SpiderlyPasswordComponent,\n SpiderlyAutocompleteComponent,\n SpiderlyMultiAutocompleteComponent,\n SpiderlyMultiSelectComponent,\n SpiderlyNumberComponent,\n SpiderlyDropdownComponent,\n SpiderlyEditorComponent,\n SpiderlyMarkdownComponent,\n SpiderlyColorPickerComponent,\n SpiderlyFileComponent,\n ],\n declarations: [],\n providers: [],\n})\nexport class SpiderlyControlsModule {}\n","import { BaseEntity } from './base-entity';\n\nexport class InitCompanyAuthDialogDetails extends BaseEntity {\n image?: string;\n companyName?: string;\n\n constructor({\n image,\n companyName,\n }: {\n image?: string;\n companyName?: string;\n } = {}) {\n super();\n\n this.image = image;\n this.companyName = companyName;\n }\n\n static readonly typeName = 'InitCompanyAuthDialogDetails' as const;\n}\n","import { HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ConfigServiceBase {\n /**\n * Consumer-facing only — nothing in the library reads it. The error handler and the HTTP\n * interceptor used to gate their `console.error` on it, which left a deployed app's client\n * errors with nowhere to go; both now log unconditionally. `spiderly init` still scaffolds the\n * `override`, so apps keep branching on it.\n */\n production = false;\n apiUrl: string;\n frontendUrl = 'http://localhost:4200';\n companyName = 'Company Name';\n primaryColor = '#111b2c';\n\n /* URLs */\n loginSlug = 'login';\n\n /* Local storage */\n accessTokenKey = 'access_token';\n refreshTokenKey = 'refresh_token';\n browserIdKey = 'browser_id';\n\n httpOptions = {};\n httpSkipSpinnerOptions = {\n headers: new HttpHeaders({ 'Content-Type': 'application/json' }),\n params: new HttpParams().set('X-Skip-Spinner', 'true'),\n };\n\n logoPath = 'assets/images/logo/logo.svg';\n\n /* Pagination */\n defaultPageSize = 10;\n\n constructor() {}\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport {\n AuthResult,\n AuthResultWithCookies,\n ExternalProviderPublic,\n Login,\n RefreshTokenRequest,\n SendLoginVerificationEmailResult,\n UserBase,\n VerificationTokenRequest,\n} from '../entities/security-entities';\nimport { ConfigServiceBase } from './config.service.base';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ApiSecurityService {\n constructor(\n protected http: HttpClient,\n protected config: ConfigServiceBase,\n ) {}\n\n //#region Authentication\n\n login = (request: VerificationTokenRequest): Observable<AuthResult> => {\n return this.http.post<AuthResult>(\n `${this.config.apiUrl}/Security/Login`,\n request,\n this.config.httpOptions,\n );\n };\n\n sendLoginVerificationEmail = (\n loginDTO: Login,\n ): Observable<SendLoginVerificationEmailResult> => {\n return this.http.post<SendLoginVerificationEmailResult>(\n `${this.config.apiUrl}/Security/SendLoginVerificationEmail`,\n loginDTO,\n this.config.httpOptions,\n );\n };\n\n loginWithCookies = (\n request: VerificationTokenRequest,\n ): Observable<AuthResultWithCookies> => {\n return this.http.post<AuthResultWithCookies>(\n `${this.config.apiUrl}/Security/LoginWithCookies`,\n request,\n this.config.httpOptions,\n );\n };\n\n getExternalProviders = (): Observable<ExternalProviderPublic[]> => {\n return this.http.get<ExternalProviderPublic[]>(\n `${this.config.apiUrl}/Security/GetExternalProviders`,\n this.config.httpSkipSpinnerOptions,\n );\n };\n\n logout = (browserId: string): Observable<any> => {\n return this.http.get<any>(\n `${this.config.apiUrl}/Security/Logout?browserId=${browserId}`,\n );\n };\n\n logoutWithCookies = (browserId: string): Observable<any> => {\n return this.http.get<any>(\n `${this.config.apiUrl}/Security/LogoutWithCookies?browserId=${browserId}`,\n );\n };\n\n refreshTokenWithHeaders = (request: RefreshTokenRequest): Observable<AuthResult> => {\n return this.http.post<AuthResult>(\n `${this.config.apiUrl}/Security/RefreshTokenWithHeaders`,\n request,\n this.config.httpOptions,\n );\n };\n\n refreshTokenWithCookies = (browserId: string): Observable<AuthResultWithCookies> => {\n // POST, not GET: refresh rotates the single-use token (a state mutation), and a cacheable GET let\n // browsers replay a stale logged-in response on back/forward navigation (phantom dashboard after logout).\n return this.http.post<AuthResultWithCookies>(\n `${this.config.apiUrl}/Security/RefreshTokenWithCookies?browserId=${browserId}`,\n null,\n );\n };\n\n //#endregion\n\n //#region User\n\n getCurrentUserBase = (): Observable<UserBase> => {\n return this.http.get<UserBase>(\n `${this.config.apiUrl}/Security/GetCurrentUserBase`,\n this.config.httpSkipSpinnerOptions,\n );\n };\n\n getCurrentUserPermissionCodes = (): Observable<string[]> => {\n return this.http.get<string[]>(\n `${this.config.apiUrl}/Security/GetCurrentUserPermissionCodes`,\n this.config.httpSkipSpinnerOptions,\n );\n };\n\n //#endregion\n}\n","import { Inject, Injectable, OnDestroy, PLATFORM_ID } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { HttpClient } from '@angular/common/http';\nimport { BehaviorSubject, Observable, of, Subscription } from 'rxjs';\nimport { catchError, delay, filter, finalize, map, tap } from 'rxjs/operators';\nimport {\n AuthResultWithCookies,\n Login,\n VerificationTokenRequest,\n UserBase,\n} from '../entities/security-entities';\nimport { ConfigServiceBase } from './config.service.base';\nimport { ApiSecurityService } from './api.service.security';\nimport { InitCompanyAuthDialogDetails } from '../entities/init-company-auth-dialog-details';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Cookie-based session auth. The access/refresh JWTs live in HttpOnly cookies set by the backend\n * (so JS never holds them — XSS can't exfiltrate them); requests are authenticated via\n * `withCredentials` (see jwtInterceptor). The readable result only carries userId/email/expiry.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthServiceBase implements OnDestroy {\n private readonly apiUrl: string = this.config.apiUrl;\n private timer?: Subscription;\n private accessTokenExpiresAt?: Date;\n\n // External-login error code captured from the bootstrap URL (?externalAuthError=expired|failed) set by the\n // backend's OAuth callback on failure. Captured before routing can strip it, surfaced once by the login page.\n externalAuthErrorCode: string | null = null;\n\n protected _currentUserPermissionCodes = new BehaviorSubject<string[] | null>(\n undefined,\n );\n // The subject seeds with `undefined` (not yet loaded) and emits `null` on logout. Consumers only ever care\n // about a real code list, so filter both out here — subscribers get a clean `string[]`, and `firstValueFrom`\n // waits for the first loaded value instead of grabbing the `undefined` seed in a load race.\n currentUserPermissionCodes$: Observable<string[]> =\n this._currentUserPermissionCodes\n .asObservable()\n .pipe(filter((codes): codes is string[] => codes != null));\n\n protected _user = new BehaviorSubject<UserBase | null>(undefined);\n user$ = this._user.asObservable();\n\n constructor(\n protected router: Router,\n protected http: HttpClient,\n protected apiService: ApiSecurityService,\n protected config: ConfigServiceBase,\n @Inject(PLATFORM_ID) protected platformId: Object,\n ) {\n if (isPlatformBrowser(platformId)) {\n window.addEventListener('storage', this.storageEventListener);\n }\n }\n\n // Cross-tab sync. We store only marker values here (never tokens — those are HttpOnly cookies).\n private storageEventListener = (event: StorageEvent) => {\n if (event.storageArea === localStorage) {\n if (event.key === 'logout-event') {\n this.stopTokenTimer();\n this._user.next(null);\n this._currentUserPermissionCodes.next(null);\n }\n if (event.key === 'login-event') {\n this.refreshToken().subscribe();\n }\n }\n };\n\n sendLoginVerificationEmail(body: Login): Observable<any> {\n body.browserId = this.getBrowserId();\n return this.apiService.sendLoginVerificationEmail(body);\n }\n\n login(body: VerificationTokenRequest): Observable<AuthResultWithCookies> {\n body.browserId = this.getBrowserId();\n return this.apiService.loginWithCookies(body).pipe(\n map((result: AuthResultWithCookies) => {\n this.handleAuthResult(result);\n return result;\n }),\n );\n }\n\n // Establishes the in-memory session from a cookie auth result (login or refresh). No tokens are stored\n // in JS — only the user identity + the access-token expiry the backend reports (to schedule refresh).\n handleAuthResult(result: AuthResultWithCookies) {\n this._user.next({\n id: result.userId,\n email: result.email,\n });\n this.accessTokenExpiresAt = result.accessTokenExpiresAt\n ? new Date(result.accessTokenExpiresAt)\n : undefined;\n localStorage.setItem('login-event', 'login' + Math.random());\n this.startTokenTimer();\n this.setCurrentUserPermissionCodes().subscribe();\n }\n\n logout() {\n const browserId = this.getBrowserId();\n this.apiService\n .logoutWithCookies(browserId)\n .pipe(\n finalize(() => {\n this._user.next(null);\n localStorage.setItem('logout-event', 'logout' + Math.random());\n this.onAfterLogout();\n this.stopTokenTimer();\n }),\n )\n .subscribe();\n }\n\n onAfterLogout = () => {\n this._currentUserPermissionCodes.next(null);\n this.router.navigate([this.config.loginSlug]);\n };\n\n // Clears in-memory session state without calling the backend — used when a request comes back 401\n // (the backend has already cleared the auth cookies in that case).\n clearSession() {\n this.stopTokenTimer();\n this._user.next(null);\n this._currentUserPermissionCodes.next(null);\n localStorage.setItem('logout-event', 'logout' + Math.random());\n }\n\n // Called on app init and by the proactive timer. The refresh token is an HttpOnly cookie; a 401 (\"no valid\n // session\" — not logged in / expired) propagates from the interceptor and is handled by catchError below,\n // resolving the session to anonymous (null). map runs only for a real result, so _user is never partial.\n refreshToken(): Observable<AuthResultWithCookies | null> {\n const browserId = this.getBrowserId();\n return this.apiService.refreshTokenWithCookies(browserId).pipe(\n map((result: AuthResultWithCookies) => {\n if (result) {\n // A re-established session makes any pending external-login error moot — drop it so it can't\n // surface as a stale toast on a later /login visit (e.g. after a subsequent logout).\n this.externalAuthErrorCode = null;\n this._user.next({ id: result.userId, email: result.email });\n this.accessTokenExpiresAt = result.accessTokenExpiresAt\n ? new Date(result.accessTokenExpiresAt)\n : undefined;\n this.startTokenTimer();\n this.onAfterRefreshToken();\n }\n return result;\n }),\n catchError(() => {\n this._user.next(null);\n return of(null);\n }),\n );\n }\n\n onAfterRefreshToken = () => {\n this.setCurrentUserPermissionCodes().subscribe(); // after the session is re-established\n };\n\n // Reads ?externalAuthError= from the bootstrap URL (set by the backend OAuth callback on failure) and\n // strips it so a manual refresh won't re-trigger the message. Called from the app initializer, before the\n // router runs — otherwise an unauthenticated landing on \"/\" redirects to /login and drops the param.\n captureExternalAuthError() {\n if (isPlatformBrowser(this.platformId) === false) {\n return;\n }\n const params = new URLSearchParams(window.location.search);\n const code = params.get('externalAuthError');\n if (!code) {\n return;\n }\n this.externalAuthErrorCode = code;\n params.delete('externalAuthError');\n const query = params.toString();\n history.replaceState(\n history.state,\n '',\n window.location.pathname + (query ? `?${query}` : '') + window.location.hash,\n );\n }\n\n getBrowserId(): string {\n let browserId = localStorage.getItem(this.config.browserIdKey); // not a token — a stable per-browser id\n if (!browserId) {\n browserId = crypto.randomUUID();\n localStorage.setItem(this.config.browserIdKey, browserId);\n }\n return browserId;\n }\n\n private getTokenRemainingTime(): number {\n if (!this.accessTokenExpiresAt) {\n return 0;\n }\n return this.accessTokenExpiresAt.getTime() - Date.now();\n }\n\n private startTokenTimer() {\n const timeout = this.getTokenRemainingTime();\n if (timeout <= 0) {\n return;\n }\n this.stopTokenTimer();\n this.timer = of(true)\n .pipe(\n delay(timeout),\n tap({\n next: () => this.refreshToken().subscribe(),\n }),\n )\n .subscribe();\n }\n\n private stopTokenTimer() {\n this.timer?.unsubscribe();\n }\n\n navigateToDashboard() {\n this.router.navigate(['/']);\n }\n\n initCompanyAuthDialogDetails =\n (): Observable<InitCompanyAuthDialogDetails> => {\n return of(\n new InitCompanyAuthDialogDetails({\n image: this.config.logoPath,\n companyName: this.config.companyName,\n }),\n );\n };\n\n setCurrentUserPermissionCodes(): Observable<string[]> {\n return this.apiService.getCurrentUserPermissionCodes().pipe(\n map((permissionCodes) => {\n this._currentUserPermissionCodes.next(permissionCodes);\n return permissionCodes;\n }),\n );\n }\n\n ngOnDestroy(): void {\n if (isPlatformBrowser(this.platformId)) {\n window.removeEventListener('storage', this.storageEventListener);\n }\n\n this.onAfterNgOnDestroy();\n }\n\n onAfterNgOnDestroy = () => {};\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, OnDestroy, OnInit } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { AuthServiceBase } from '../../../services/auth.service.base';\n\n@Component({\n selector: 'spiderly-auth-card',\n templateUrl: './auth-card.component.html',\n imports: [CommonModule],\n})\nexport class AuthCardComponent implements OnInit, OnDestroy {\n private companyDetailsSubscription: Subscription | null = null;\n\n companyName: string;\n image: string;\n\n constructor(private authService: AuthServiceBase) {}\n\n ngOnInit() {\n this.companyDetailsSubscription = this.authService\n .initCompanyAuthDialogDetails()\n .subscribe((details) => {\n if (details != null) {\n this.image = details.image;\n this.companyName = details.companyName;\n }\n });\n }\n\n ngOnDestroy(): void {\n this.companyDetailsSubscription?.unsubscribe();\n }\n}\n","<div class=\"flex min-h-screen overflow-hidden p-5\">\n <div class=\"flex flex-col w-full\">\n <div\n class=\"w-full sm:w-120\"\n style=\"\n margin: auto;\n border-radius: 50px;\n padding: 0.3rem;\n background: linear-gradient(\n 180deg,\n var(--p-primary-color) 10%,\n rgba(33, 150, 243, 0) 30%\n );\n \"\n >\n <div class=\"surface-card py-12 px-8 sm:px-12\" style=\"border-radius: 45px\">\n <div class=\"flex justify-center\" style=\"margin-bottom: 38px\">\n <ng-content select=\"[auth-logo]\">\n <img\n *ngIf=\"image != null\"\n [src]=\"image\"\n alt=\"{{ companyName }} Logo\"\n title=\"{{ companyName }} Logo\"\n class=\"max-h-15\"\n />\n <i\n *ngIf=\"image == null\"\n class=\"pi pi-spin pi-spinner primary-color\"\n style=\"font-size: 2rem\"\n ></i>\n </ng-content>\n </div>\n\n <ng-content></ng-content>\n\n <ng-content select=\"[auth-footer]\"></ng-content>\n </div>\n </div>\n </div>\n</div>\n","const GOOGLE_G_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\" width=\"18\" height=\"18\"><path fill=\"#EA4335\" d=\"M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z\"/><path fill=\"#4285F4\" d=\"M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z\"/><path fill=\"#FBBC05\" d=\"M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.55 10.78l7.98-6.19z\"/><path fill=\"#34A853\" d=\"M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z\"/></svg>`;\n\n/**\n * Built-in default icons for external auth providers, keyed by provider code.\n * Values are inline data URIs — no network request, CSP entry, or asset wiring,\n * and they render offline. Consumers override per code via the `providerIcons`\n * input on ExternalLoginComponent / SpiderlyLoginComponent.\n */\nexport const DEFAULT_EXTERNAL_PROVIDER_ICONS: Record<string, string> = {\n google: `data:image/svg+xml,${encodeURIComponent(GOOGLE_G_SVG)}`,\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { ApiSecurityService } from '../../../services/api.service.security';\nimport { AuthServiceBase } from '../../../services/auth.service.base';\nimport { ConfigServiceBase } from '../../../services/config.service.base';\nimport { ExternalProviderPublic } from '../../../entities/security-entities';\nimport { SpiderlyButtonComponent } from '../../spiderly-buttons/spiderly-button/spiderly-button.component';\nimport { DEFAULT_EXTERNAL_PROVIDER_ICONS } from '../external-provider-icons';\n\n@Component({\n selector: 'spiderly-external-login',\n templateUrl: './external-login.component.html',\n imports: [CommonModule, TranslocoDirective, SpiderlyButtonComponent],\n})\nexport class ExternalLoginComponent implements OnInit {\n /** Per-code icon overrides; unset codes fall back to DEFAULT_EXTERNAL_PROVIDER_ICONS. */\n @Input() providerIcons: Record<string, string> = {};\n\n // Config-driven: populated from Security/GetExternalProviders (backend is the single source of truth for which providers are enabled).\n externalProviders: ExternalProviderPublic[] = [];\n\n constructor(\n private config: ConfigServiceBase,\n private authService: AuthServiceBase,\n private apiService: ApiSecurityService,\n ) {}\n\n ngOnInit() {\n this.apiService.getExternalProviders().subscribe({\n next: (providers) => {\n this.externalProviders = providers ?? [];\n },\n // The global unauthorized interceptor already surfaces the HTTP error to the user; here we just\n // leave the provider buttons hidden instead of letting the error reach the global error handler.\n error: () => {\n this.externalProviders = [];\n },\n });\n }\n\n iconFor(code: string): string | undefined {\n return this.providerIcons[code] ?? DEFAULT_EXTERNAL_PROVIDER_ICONS[code];\n }\n\n loginWithExternalProvider(code: string) {\n // Server-side flow (B2): hand off to the backend challenge endpoint. The backend runs the OAuth\n // dance, sets the session cookies, and redirects back to returnUrl.\n const returnUrl = this.config.frontendUrl;\n const browserId = this.authService.getBrowserId();\n window.location.href =\n `${this.config.apiUrl}/Security/ExternalLoginChallenge` +\n `?provider=${encodeURIComponent(code)}` +\n `&returnUrl=${encodeURIComponent(returnUrl)}` +\n `&browserId=${encodeURIComponent(browserId)}`;\n }\n}\n","<ng-container *transloco=\"let t\">\n <div *ngIf=\"externalProviders.length > 0\">\n <div\n style=\"display: flex; align-items: center; gap: 7px; justify-content: center; margin-bottom: 16px;\"\n >\n <div class=\"separator\"></div>\n <div>{{ t(\"or\") }}</div>\n <div class=\"separator\"></div>\n </div>\n <div style=\"display: flex; flex-direction: column; gap: 10px\">\n <spiderly-button\n *ngFor=\"let provider of externalProviders\"\n (onClick)=\"loginWithExternalProvider(provider.code)\"\n [label]=\"provider.label || (provider.code | titlecase)\"\n [iconUrl]=\"iconFor(provider.code)\"\n [outlined]=\"true\"\n styleClass=\"w-full\"\n ></spiderly-button>\n </div>\n </div>\n</ng-container>\n","import { BaseEntity } from './base-entity';\n\nexport class UserBase extends BaseEntity {\n static readonly typeName = 'UserBase' as const;\n\n id?: number;\n email?: string;\n\n constructor({\n id,\n email,\n }: {\n id?: number;\n email?: string;\n } = {}) {\n super();\n\n this.id = id;\n this.email = email;\n }\n\n static readonly schema = {\n id: {\n type: 'number',\n },\n email: {\n type: 'string',\n },\n } as const;\n}\n\nexport class AuthResult extends BaseEntity {\n static readonly typeName = 'AuthResult' as const;\n\n userId?: number;\n email?: string;\n accessToken?: string;\n refreshToken?: string;\n\n constructor({\n userId,\n email,\n accessToken,\n refreshToken,\n }: {\n userId?: number;\n email?: string;\n accessToken?: string;\n refreshToken?: string;\n } = {}) {\n super();\n\n this.userId = userId;\n this.email = email;\n this.accessToken = accessToken;\n this.refreshToken = refreshToken;\n }\n\n static readonly schema = {\n userId: {\n type: 'number',\n },\n email: {\n type: 'string',\n },\n accessToken: {\n type: 'string',\n },\n refreshToken: {\n type: 'string',\n },\n } as const;\n}\n\nexport class VerificationTokenRequest extends BaseEntity {\n static readonly typeName = 'VerificationTokenRequest' as const;\n\n verificationCode?: string;\n browserId?: string;\n email?: string;\n\n constructor({\n verificationCode,\n browserId,\n email,\n }: {\n verificationCode?: string;\n browserId?: string;\n email?: string;\n } = {}) {\n super();\n\n this.verificationCode = verificationCode;\n this.browserId = browserId;\n this.email = email;\n }\n\n static readonly schema = {\n verificationCode: {\n type: 'string',\n },\n browserId: {\n type: 'string',\n },\n email: {\n type: 'string',\n },\n } as const;\n}\n\nexport class ExternalProvider extends BaseEntity {\n static readonly typeName = 'ExternalProvider' as const;\n\n provider?: string;\n idToken?: string;\n browserId?: string;\n\n constructor({\n provider,\n idToken,\n browserId,\n }: {\n provider?: string;\n idToken?: string;\n browserId?: string;\n } = {}) {\n super();\n\n this.provider = provider;\n this.idToken = idToken;\n this.browserId = browserId;\n }\n\n static readonly schema = {\n provider: {\n type: 'string',\n },\n idToken: {\n type: 'string',\n },\n browserId: {\n type: 'string',\n },\n } as const;\n}\n\nexport class ExternalProviderPublic extends BaseEntity {\n static readonly typeName = 'ExternalProviderPublic' as const;\n\n code?: string;\n authority?: string;\n clientId?: string;\n label?: string;\n\n constructor({\n code,\n authority,\n clientId,\n label,\n }: {\n code?: string;\n authority?: string;\n clientId?: string;\n label?: string;\n } = {}) {\n super();\n\n this.code = code;\n this.authority = authority;\n this.clientId = clientId;\n this.label = label;\n }\n\n static readonly schema = {\n code: {\n type: 'string',\n },\n authority: {\n type: 'string',\n },\n clientId: {\n type: 'string',\n },\n label: {\n type: 'string',\n },\n } as const;\n}\n\nexport class UserRole extends BaseEntity {\n static readonly typeName = 'UserRole' as const;\n\n roleId?: number;\n userId?: number;\n\n constructor({\n roleId,\n userId,\n }: {\n roleId?: number;\n userId?: number;\n } = {}) {\n super();\n\n this.roleId = roleId;\n this.userId = userId;\n }\n\n static readonly schema = {\n roleId: {\n type: 'number',\n },\n userId: {\n type: 'number',\n },\n } as const;\n}\n\nexport class LoginVerificationToken extends BaseEntity {\n static readonly typeName = 'LoginVerificationToken' as const;\n\n email?: string;\n userId?: number;\n browserId?: string;\n expiresAt?: Date;\n\n constructor({\n email,\n userId,\n browserId,\n expiresAt,\n }: {\n email?: string;\n userId?: number;\n browserId?: string;\n expiresAt?: Date;\n } = {}) {\n super();\n\n this.email = email;\n this.userId = userId;\n this.browserId = browserId;\n this.expiresAt = expiresAt;\n }\n\n static readonly schema = {\n email: {\n type: 'string',\n },\n userId: {\n type: 'number',\n },\n browserId: {\n type: 'string',\n },\n expiresAt: {\n type: 'Date',\n },\n } as const;\n}\n\nexport class Login extends BaseEntity {\n static readonly typeName = 'Login' as const;\n\n email?: string;\n browserId?: string;\n\n constructor({\n email,\n browserId,\n }: {\n email?: string;\n browserId?: string;\n } = {}) {\n super();\n\n this.email = email;\n this.browserId = browserId;\n }\n\n static readonly schema = {\n email: {\n type: 'string',\n },\n browserId: {\n type: 'string',\n },\n } as const;\n}\n\nexport class RefreshTokenRequest extends BaseEntity {\n static readonly typeName = 'RefreshTokenRequest' as const;\n\n refreshToken?: string;\n browserId?: string;\n\n constructor({\n refreshToken,\n browserId,\n }: {\n refreshToken?: string;\n browserId?: string;\n } = {}) {\n super();\n\n this.refreshToken = refreshToken;\n this.browserId = browserId;\n }\n\n static readonly schema = {\n refreshToken: {\n type: 'string',\n },\n browserId: {\n type: 'string',\n },\n } as const;\n}\n\nexport class AuthResultWithCookies extends BaseEntity {\n static readonly typeName = 'AuthResultWithCookies' as const;\n\n userId?: number;\n email?: string;\n accessTokenExpiresAt?: Date;\n\n constructor({\n userId,\n email,\n accessTokenExpiresAt,\n }: {\n userId?: number;\n email?: string;\n accessTokenExpiresAt?: Date;\n } = {}) {\n super();\n\n this.userId = userId;\n this.email = email;\n this.accessTokenExpiresAt = accessTokenExpiresAt;\n }\n\n static readonly schema = {\n userId: {\n type: 'number',\n },\n email: {\n type: 'string',\n },\n accessTokenExpiresAt: {\n type: 'Date',\n },\n } as const;\n}\n\nexport class SendLoginVerificationEmailResult extends BaseEntity {\n static readonly typeName = 'SendLoginVerificationEmailResult' as const;\n\n message?: string;\n\n constructor({\n message,\n }: {\n message?: string;\n } = {}) {\n super();\n\n this.message = message;\n }\n\n static readonly schema = {\n message: {\n type: 'string',\n },\n } as const;\n}\n","// When we call it, inside the console, it will show SpiderlyError: ...\nexport class SpiderlyError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport {\n SpiderlyFormArray,\n SpiderlyFormControl,\n SpiderlyFormGroup,\n} from '../components/spiderly-form-control/spiderly-form-control';\nimport { BaseEntity, SchemaAwareConstructor } from '../entities/base-entity';\nimport { SpiderlyError } from '../errors/spiderly-error';\nimport { capitalizeFirstChar, firstCharToUpper } from './helper-functions';\nimport { SpiderlyMessageService } from './spiderly-message.service';\nimport { ValidatorAbstractService } from './validator-abstract.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BaseFormService {\n constructor(\n private validatorService: ValidatorAbstractService,\n private messageService: SpiderlyMessageService,\n private translocoService: TranslocoService,\n ) {}\n\n initFormGroup = <T extends BaseEntity>(\n formGroup: SpiderlyFormGroup<T>,\n targetClass: SchemaAwareConstructor<T>,\n initialValues?: T,\n updateOnChangeControls?: (keyof T)[],\n ) => {\n if (!formGroup)\n throw new SpiderlyError('You need to instantiate the form group.');\n\n if (!targetClass) throw new SpiderlyError('You need to pass targetClass.');\n\n if (!initialValues) initialValues = {} as T;\n\n Object.keys(targetClass.schema).forEach((formControlName) => {\n const propSchema = targetClass.schema[formControlName];\n let propInitialValue = initialValues[formControlName];\n\n const existingControl = formGroup.get(formControlName);\n\n if (\n propSchema.type.endsWith('[]') &&\n propSchema.nestedConstructor &&\n propSchema.type !== 'Namebook[]'\n ) {\n if (existingControl instanceof SpiderlyFormArray) {\n this.initFormArray(\n existingControl,\n propSchema.nestedConstructor,\n propInitialValue,\n );\n this.validatorService.setFormArrayValidator(\n existingControl,\n targetClass.typeName,\n );\n } else {\n const control = new SpiderlyFormArray<T>(\n [],\n this.translocoService,\n this,\n );\n this.initFormArray(\n control,\n propSchema.nestedConstructor,\n propInitialValue,\n );\n\n control.label = formControlName;\n control.labelForDisplay = this.getTranslatedLabel(formControlName);\n this.validatorService.setFormArrayValidator(\n control,\n targetClass.typeName,\n );\n\n formGroup.setControl(formControlName, control);\n }\n } else if (\n propSchema.nestedConstructor &&\n propSchema.type !== 'Namebook[]'\n ) {\n if (existingControl instanceof SpiderlyFormGroup) {\n this.initFormGroup(\n existingControl,\n propSchema.nestedConstructor,\n propInitialValue,\n );\n } else {\n const control = new SpiderlyFormGroup({});\n this.initFormGroup(\n control,\n propSchema.nestedConstructor,\n propInitialValue,\n );\n formGroup.setControl(formControlName, control);\n }\n } else {\n const isArrayValued = propSchema.type.endsWith('[]');\n\n // HACK: Because on the backend id type is not nullable on generated DTOs, we need to do this, it's ugly hack and we should make it better.\n if (formControlName === 'id' && !propInitialValue) {\n propInitialValue = 0;\n }\n\n if (isArrayValued && propInitialValue == null) {\n propInitialValue = [];\n }\n\n if (existingControl instanceof SpiderlyFormControl) {\n existingControl.setValue(propInitialValue);\n } else {\n let control: SpiderlyFormControl;\n\n // Array-valued controls (multiselect/multiautocomplete selections) must\n // commit on change: their value mutates through overlay/chip interactions\n // that can end without the control ever having focus (PrimeNG's chip\n // remove stops propagation before the host focuses its hidden input), so\n // a blur-deferred commit leaves the deselect pending forever and the save\n // reads the OLD selection while the UI already shows the item removed.\n if (\n updateOnChangeControls?.includes(formControlName as keyof T) ||\n (formControlName.endsWith('Id') && formControlName.length > 2) ||\n propSchema.type === 'Date' ||\n isArrayValued\n ) {\n control = new SpiderlyFormControl(propInitialValue, {\n updateOn: 'change',\n });\n } else {\n control = new SpiderlyFormControl(propInitialValue, {\n updateOn: 'blur',\n });\n }\n\n control.label = formControlName;\n control.labelForDisplay = this.getTranslatedLabel(formControlName);\n control.parentClassName = targetClass.typeName;\n\n this.validatorService.setValidator(control, targetClass.typeName);\n\n formGroup.setControl(formControlName, control);\n }\n }\n });\n\n formGroup.targetClass = targetClass;\n\n return formGroup;\n };\n\n getTranslatedLabel(formControlName: string): string {\n if (formControlName.endsWith('Id') && formControlName.length > 2) {\n formControlName = formControlName.substring(\n 0,\n formControlName.length - 2,\n );\n } else if (formControlName.endsWith('DisplayName')) {\n formControlName = formControlName.replace('DisplayName', '');\n }\n\n return this.translocoService.translate(firstCharToUpper(formControlName));\n }\n\n addNewFormGroupToFormArray<T extends BaseEntity>(\n formArray: SpiderlyFormArray<T>,\n targetClass: SchemaAwareConstructor<T>,\n initialValues: T,\n index: number,\n ): SpiderlyFormGroup {\n let helperFormGroup = new SpiderlyFormGroup({});\n this.initFormGroup(helperFormGroup, targetClass, initialValues);\n\n if (index == null) {\n formArray.push(helperFormGroup);\n } else {\n formArray.insert(index, helperFormGroup);\n }\n\n return helperFormGroup;\n }\n\n removeFormControlFromTheFormArray(\n formArray: SpiderlyFormArray,\n index: number,\n ) {\n if (index == null) throw new SpiderlyError('Can not pass null index.');\n\n formArray.removeAt(index);\n }\n\n initFormArray<T extends BaseEntity>(\n formArray: SpiderlyFormArray<T>,\n targetClass: SchemaAwareConstructor<T>,\n initialValues: T[] = [],\n ) {\n if (!formArray)\n throw new SpiderlyError(\n 'You must pass a FormArray instance to be initialized or updated.',\n );\n\n if (!targetClass)\n throw new SpiderlyError('You did not initialize targetClass');\n\n formArray.formGroupInitialValues = {}; // When we need we can pass formGroupInitialValues to this method instead of assigning it to empty object\n formArray.targetClass = targetClass;\n\n initialValues.forEach((model, index) => {\n const existingControl = formArray.at(index);\n\n if (existingControl instanceof SpiderlyFormGroup) {\n this.initFormGroup(existingControl, targetClass, model);\n } else {\n let helperFormGroup: SpiderlyFormGroup = new SpiderlyFormGroup({});\n this.initFormGroup(helperFormGroup, targetClass, model);\n formArray.push(helperFormGroup);\n }\n });\n\n return formArray;\n }\n\n //#region Helpers\n\n showInvalidFieldsMessage = () => {\n this.messageService.warningMessage(\n this.translocoService.translate('YouHaveSomeInvalidFieldsDescription'),\n this.translocoService.translate('YouHaveSomeInvalidFieldsTitle'),\n );\n };\n\n generateNewNegativeId<T extends BaseEntity>(formArray: SpiderlyFormArray<T>) {\n return -formArray.getRawValue().filter((x) => x.id < 0).length - 1;\n }\n\n getSaveBodyMainDTOKey = (saveBodyClass: SchemaAwareConstructor<any>) => {\n const schema = saveBodyClass.schema;\n return Object.keys(schema).find(\n (k) => schema[k].isSaveBodyMainDTO === true,\n );\n };\n\n mapMainUIFormToSaveBody = <\n TMainUIForm extends BaseEntity,\n TSaveBody extends BaseEntity,\n >(\n mainUIFormClass: SchemaAwareConstructor<TMainUIForm>,\n mainUIFormValues: TMainUIForm,\n ): TSaveBody => {\n let saveBody = {} as TSaveBody;\n\n Object.keys(mainUIFormClass.schema).forEach((propName) => {\n const property = mainUIFormClass.schema[propName];\n const value = mainUIFormValues[propName];\n\n // Handle ordered one-to-many (e.g., \"orderedItemsMainUIFormDTO\" -> \"orderedItemsSaveBodyDTO\")\n if (\n propName.startsWith('ordered') &&\n propName.endsWith('MainUIFormDTO')\n ) {\n const newKey = propName.replace('MainUIFormDTO', 'SaveBodyDTO');\n // Recursively map nested DTOs\n const relatedEntity = property.nestedConstructor;\n saveBody[newKey] =\n value?.map((item) =>\n this.mapMainUIFormToSaveBody(relatedEntity, item),\n ) ?? [];\n }\n // Handle multi-select (e.g., \"itemsIds\" -> \"selectedItemsIds\")\n else if (propName.endsWith('Ids')) {\n saveBody[`selected${capitalizeFirstChar(propName)}`] = value ?? [];\n }\n // Handle multi-autocomplete (e.g., \"itemsNamebookDTOList\" -> \"selectedItemsIds\")\n else if (propName.endsWith('NamebookDTOList')) {\n saveBody[`selected${capitalizeFirstChar(propName)}`] = value ?? [];\n }\n // Handle the main DTO object (e.g., \"entityDTO\")\n else {\n saveBody[propName] = value;\n }\n });\n\n return saveBody;\n };\n\n isControlValid(\n control: SpiderlyFormControl | SpiderlyFormGroup | SpiderlyFormArray,\n controlNamesFromHtml?: string[],\n ): boolean {\n let invalid = false;\n\n if (control instanceof SpiderlyFormControl) {\n if (\n control.invalid &&\n (controlNamesFromHtml == null ||\n controlNamesFromHtml?.includes(control.label))\n ) {\n control.markAsDirty();\n invalid = true;\n }\n } else if (control instanceof SpiderlyFormGroup) {\n Object.keys(control.controls).forEach((key) => {\n const nestedControl = control.controls[key];\n if (!this.isControlValid(nestedControl, control.controlNamesFromHtml)) {\n invalid = true;\n }\n });\n } else if (control instanceof SpiderlyFormArray) {\n if (control.errors) {\n control.markAsDirty();\n this.messageService.warningMessage(control.errors['_']);\n invalid = true;\n }\n\n control.controls.forEach(\n (\n nestedControl:\n | SpiderlyFormControl\n | SpiderlyFormGroup\n | SpiderlyFormArray,\n ) => {\n if (!this.isControlValid(nestedControl)) {\n invalid = true;\n }\n },\n );\n }\n\n if (invalid) {\n return false;\n }\n\n return true;\n }\n\n //#endregion\n}\n","import { HttpClient } from '@angular/common/http';\nimport {\n ChangeDetectorRef,\n Component,\n KeyValueDiffer,\n KeyValueDiffers,\n OnInit,\n} from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { BaseEntity, SchemaAwareConstructor } from '../../entities/base-entity';\nimport { SpiderlyError } from '../../errors/spiderly-error';\nimport { getParentUrl } from '../../services/helper-functions';\nimport { SpiderlyMessageService } from '../../services/spiderly-message.service';\nimport {\n SpiderlyFormArray,\n SpiderlyFormControl,\n SpiderlyFormGroup,\n} from '../spiderly-form-control/spiderly-form-control';\nimport { BaseFormService } from './../../services/base-form.service';\n\n@Component({\n selector: 'base-form',\n template: '',\n styles: [],\n standalone: false,\n})\nexport class BaseFormComponent<\n TMainUIForm extends BaseEntity = any,\n TSaveBody extends BaseEntity = any,\n> implements OnInit {\n /**\n * The root form group that holds all form controls, typed to `TSaveBody`.\n * Assign `saveObservableMethod` on it to define the HTTP call used for saving.\n * The form controls are built automatically from the `TSaveBody` schema when you call\n * `baseFormService.initFormGroup(this.parentFormGroup, saveBodyClass, saveBody)`.\n *\n * @example\n * ```ts\n * this.parentFormGroup.saveObservableMethod = this.apiService.saveProduct;\n *\n * this.baseFormService.initFormGroup(\n * this.parentFormGroup,\n * ProductSaveBody,\n * saveBody,\n * );\n * ```\n */\n parentFormGroup = new SpiderlyFormGroup<TSaveBody>({} as any);\n\n /**\n * The class reference for the main UI form entity (`TMainUIForm`).\n * This represents the shape of the data **returned by the API** after a save.\n * Used internally by `mapMainUIFormToSaveBody` to transform the API response back into `TSaveBody`\n * for form re-initialization.\n *\n * @example\n * ```ts\n * this.mainUIFormClass = ProductMainUIForm;\n * ```\n */\n mainUIFormClass: SchemaAwareConstructor<TMainUIForm>;\n\n /**\n * The class reference for the save body entity (`TSaveBody`).\n * This represents the shape of the data **sent to the API** when saving.\n * Used internally to build form controls from the schema via `initFormGroup`,\n * and to locate the main DTO property (marked with `isSaveBodyMainDTO: true`) for extracting the saved entity's ID.\n *\n * @example\n * ```ts\n * this.saveBodyClass = ProductSaveBody;\n * ```\n */\n saveBodyClass: SchemaAwareConstructor<TSaveBody>;\n\n /**\n * The toast message displayed after a successful save.\n * Override this to customize the success notification text for a specific entity.\n * If you want to change the message for all entities, update the `SuccessfulSaveToastDescription` key\n * in your translation JSON file instead.\n *\n * @example\n * ```ts\n * this.successfulSaveToastDescription = 'Product saved successfully!';\n * ```\n */\n successfulSaveToastDescription: string = this.translocoService.translate(\n 'SuccessfulSaveToastDescription',\n );\n\n private modelDiffer: KeyValueDiffer<string, any>;\n\n constructor(\n protected differs: KeyValueDiffers,\n protected http: HttpClient,\n protected messageService: SpiderlyMessageService,\n protected changeDetectorRef: ChangeDetectorRef,\n protected router: Router,\n protected route: ActivatedRoute,\n protected translocoService: TranslocoService,\n protected baseFormService: BaseFormService,\n ) {}\n\n ngOnInit() {}\n\n //#region Model\n\n /**\n * Executes the save flow for the form. The execution order is:\n * 1. Builds the save body from the form's raw value.\n * 2. Calls {@link onBeforeSave} — use this to modify the save body before validation.\n * 3. Validates the form. If invalid, shows an error message and stops.\n * 4. Sends the save HTTP request via `saveObservableMethod`.\n * 5. Calls {@link onAfterSaveRequest} — fires immediately after the request is sent, before the response arrives.\n * 6. On successful response: shows a success toast, reroutes, and calls {@link onAfterSave}. The form is re-initialized only when `rerouteToParentSlugAfterSave` is `false`.\n *\n * @param rerouteToParentSlugAfterSave - When `true` (default), navigates to the parent URL after save. When `false`, re-initializes the form and navigates to the saved object's URL.\n *\n * @example\n * ```html\n * <button (click)=\"onSave()\">Save</button>\n * ```\n *\n * @example\n * ```html\n * <!-- Save and stay on the saved object's page -->\n * <button (click)=\"onSave(false)\">Save and stay</button>\n * ```\n */\n // onSave method is here only because of the hooks, we should move everything except them to the BaseFromService\n onSave = (rerouteToParentSlugAfterSave: boolean = true) => {\n if (!this.saveBodyClass)\n throw new SpiderlyError('You did not initialize saveBodyClass');\n\n if (!this.mainUIFormClass)\n throw new SpiderlyError('You did not initialize mainUIFormClass');\n\n let saveBody = this.parentFormGroup.getRawValue();\n\n this.onBeforeSave(saveBody);\n\n const isValid = this.baseFormService.isControlValid(this.parentFormGroup);\n\n if (isValid) {\n this.parentFormGroup\n .saveObservableMethod(saveBody)\n .subscribe((res: TMainUIForm) => {\n this.messageService.successMessage(\n this.successfulSaveToastDescription,\n );\n\n if (rerouteToParentSlugAfterSave) {\n this.rerouteToSavedObject(undefined);\n } else {\n saveBody = this.baseFormService.mapMainUIFormToSaveBody(\n this.mainUIFormClass,\n res,\n );\n\n this.baseFormService.initFormGroup(\n this.parentFormGroup,\n this.saveBodyClass,\n saveBody,\n );\n\n const saveBodyMainDTOKey =\n this.baseFormService.getSaveBodyMainDTOKey(this.saveBodyClass);\n const savedObjectId = saveBody[saveBodyMainDTOKey]?.id;\n this.rerouteToSavedObject(savedObjectId); // You always need to have id, because of id == 0 and version change\n }\n\n this.onAfterSave();\n });\n\n this.onAfterSaveRequest();\n } else {\n this.baseFormService.showInvalidFieldsMessage();\n }\n };\n\n /**\n * Handles navigation after a successful save.\n * Override this to customize the post-save navigation behavior.\n * By default, navigates to the parent URL when `rerouteId` is not provided, or to the saved object's URL otherwise.\n *\n * @param rerouteId - The ID of the saved object, used to build the target URL. When not provided, navigates to the parent URL.\n *\n * @example\n * ```ts\n * // Override to navigate to a custom route after save\n * override rerouteToSavedObject(rerouteId: number | string): void {\n * this.router.navigateByUrl(`/products/${rerouteId}/details`);\n * }\n * ```\n */\n rerouteToSavedObject(rerouteId: number | string): void {\n if (rerouteId == null) {\n const currentUrl = this.router.url;\n const parentUrl: string = getParentUrl(currentUrl);\n this.router.navigateByUrl(parentUrl);\n return;\n }\n\n const segments = this.router.url.split('/');\n segments[segments.length - 1] = rerouteId.toString();\n\n const newUrl = segments.join('/');\n this.router.navigateByUrl(newUrl);\n }\n\n /**\n * Hook that runs **before** form validation and the save request.\n * Use this to modify the save body or perform any pre-save logic (e.g., transforming data, setting computed fields).\n *\n * @param saveBody - The current save body built from the form's raw value. Mutate it directly to change what gets sent to the server.\n *\n * @example\n * ```ts\n * onBeforeSave = (saveBody?: ProductSaveBody) => {\n * saveBody.productDTO.fullName = saveBody.productDTO.firstName + ' ' + saveBody.productDTO.lastName;\n * };\n * ```\n */\n onBeforeSave = (saveBody?: TSaveBody) => {};\n\n /**\n * Hook that runs **after** a successful save response is received.\n * Use this for post-save side effects (e.g., refreshing related data, showing additional notifications).\n *\n * @example\n * ```ts\n * onAfterSave = () => {\n * this.loadRelatedProducts();\n * };\n * ```\n */\n onAfterSave = () => {};\n\n /**\n * Hook that runs immediately **after** the save HTTP request is sent, but **before** the response arrives.\n * Use this for side effects that should happen as soon as the request is dispatched (e.g., disabling UI elements, starting a loading indicator).\n *\n * @example\n * ```ts\n * onAfterSaveRequest = () => {\n * this.isSaving = true;\n * };\n * ```\n */\n onAfterSaveRequest = () => {};\n\n //#endregion\n\n //#region Model List\n\n getFormArrayControlByIndex<T>(\n formControlName: keyof T & string,\n formArray: SpiderlyFormArray<T>,\n index: number,\n filter?: (formGroups: SpiderlyFormGroup<T>[]) => SpiderlyFormGroup<T>[],\n ): SpiderlyFormControl {\n // if(formArray.controlNamesFromHtml.findIndex(x => x === formControlName) === -1)\n // formArray.controlNamesFromHtml.push(formControlName);\n\n let filteredFormGroups: SpiderlyFormGroup<T>[];\n\n if (filter) {\n filteredFormGroups = filter(formArray.controls as SpiderlyFormGroup<T>[]);\n } else {\n return (formArray.controls[index] as SpiderlyFormGroup<T>).controls[\n formControlName\n ] as SpiderlyFormControl;\n }\n\n return filteredFormGroups[index]?.controls[\n formControlName\n ] as SpiderlyFormControl; // FT: Don't change this. It's always possible that change detection occurs before something.\n }\n\n getFormArrayControls<T>(\n formControlName: keyof T & string,\n formArray: SpiderlyFormArray<T>,\n filter?: (formGroups: SpiderlyFormGroup<T>[]) => SpiderlyFormGroup<T>[],\n ): SpiderlyFormControl[] {\n // if(formArray.controlNamesFromHtml.findIndex(x => x === formControlName) === -1)\n // formArray.controlNamesFromHtml.push(formControlName);\n\n let filteredFormGroups: SpiderlyFormGroup<T>[];\n\n if (filter) {\n filteredFormGroups = filter(formArray.controls as SpiderlyFormGroup<T>[]);\n } else {\n return (formArray.controls as SpiderlyFormGroup<T>[]).map(\n (x) => x.controls[formControlName] as SpiderlyFormControl,\n );\n }\n\n return filteredFormGroups.map(\n (x) => x.controls[formControlName] as SpiderlyFormControl,\n );\n }\n\n removeFormControlsFromTheFormArray(\n formArray: SpiderlyFormArray,\n indexes: number[],\n ) {\n // Sort indexes in descending order to avoid index shifts when removing controls\n const sortedIndexes = indexes.sort((a, b) => b - a);\n\n sortedIndexes.forEach((index) => {\n if (index >= 0 && index < formArray.length) {\n formArray.removeAt(index);\n }\n });\n }\n\n //#endregion\n}\n","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'panel-body',\n templateUrl: './panel-body.component.html',\n styleUrl: './panel-body.component.scss',\n standalone: false,\n})\nexport class PanelBodyComponent implements OnInit {\n @Input() normalBottomPadding: boolean = false; // FT: By default we set to false, when the grid is inside the body.\n\n constructor() {}\n\n ngOnInit(): void {}\n}\n","<!-- this is selector, not the class -->\n<div\n class=\"panel-body\"\n [ngClass]=\"{\n 'non-grid-panel-bottom-padding': normalBottomPadding,\n }\"\n style=\"overflow: auto\"\n>\n <!-- 'card': true, -->\n <ng-content></ng-content>\n</div>\n","import { Component, OnInit } from '@angular/core';\n\n@Component({\n selector: 'panel-footer',\n templateUrl: './panel-footer.component.html',\n styleUrl: './panel-footer.component.scss',\n standalone: false,\n})\nexport class PanelFooterComponent implements OnInit {\n constructor() {}\n\n ngOnInit(): void {}\n}\n","<div class=\"spiderly-panel-footer\">\n <div class=\"buttons-wrapper\">\n <ng-content></ng-content>\n </div>\n <span class=\"p-text-secondary\">\n <ng-content select=\"[footerRight]\"></ng-content>\n </span>\n</div>\n","import { TranslocoService } from '@jsverse/transloco';\nimport { Component, OnInit, Input } from '@angular/core';\n\n@Component({\n selector: 'panel-header',\n templateUrl: './panel-header.component.html',\n styles: [\n `\n .p-panel-icons-end {\n font-size: 50px;\n }\n `,\n ],\n standalone: false,\n})\nexport class PanelHeaderComponent implements OnInit {\n @Input() title: string;\n /** Whether the title is rendered in the large style. */\n @Input() showBigTitle: boolean;\n /** Whether the header icon is shown. Defaults to `true`. */\n @Input() showIcon: boolean = true;\n @Input() icon: string;\n @Input() index: number;\n @Input() tabs: SpiderlyTab[];\n\n constructor(private translocoService: TranslocoService) {}\n\n ngOnInit(): void {\n if (this.title == null)\n this.title = this.translocoService.translate('Details');\n\n if (this.showIcon === true && this.icon == null)\n this.icon = 'pi pi-file-edit';\n }\n\n setTabIsSelected(tab: SpiderlyTab) {\n this.tabs.forEach((t) => {\n t.isSelected = false;\n });\n\n tab.isSelected = true;\n }\n}\n\nexport class SpiderlyTab {\n label?: string;\n id?: number;\n icon?: string;\n isSelected?: boolean;\n\n constructor({\n label,\n id,\n icon,\n isSelected,\n }: {\n label?: string;\n id?: number;\n icon?: string;\n isSelected?: boolean;\n } = {}) {\n this.label = label;\n this.id = id;\n this.icon = icon;\n this.isSelected = isSelected;\n }\n}\n","<div style=\"display: flex; align-items: center; gap: 24px; flex-wrap: wrap\">\n @if (tabs == null) {\n <div style=\"display: flex; align-items: center; gap: 8px\">\n <span *ngIf=\"index != null\" class=\"number-circle\">{{ index + 1 }}</span>\n <i\n class=\"{{ icon }} primary-color\"\n [style]=\"showBigTitle ? 'font-size: 21px' : 'font-size: 16px;'\"\n ></i>\n <div [style]=\"showBigTitle ? 'font-size: 17.5px; font-weight: 500;' : ''\">\n {{ title }}\n </div>\n </div>\n } @else {\n @for (tab of tabs; track $index) {\n <div\n (click)=\"setTabIsSelected(tab)\"\n [style]=\"{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n cursor: 'pointer',\n fontWeight: tab.isSelected ? '700' : 'normal',\n }\"\n >\n <span *ngIf=\"index != null\" class=\"number-circle\">{{ index + 1 }}</span>\n <i\n class=\"{{ tab.icon }} primary-color\"\n [style]=\"showBigTitle ? 'font-size: 21px' : 'font-size: 16px;'\"\n ></i>\n <div\n [style]=\"showBigTitle ? 'font-size: 17.5px; font-weight: 500;' : ''\"\n >\n {{ tab.label }}\n </div>\n </div>\n }\n }\n</div>\n","import {\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { MenuItem } from 'primeng/api';\nimport { Menu } from 'primeng/menu';\n\n@Component({\n selector: 'spiderly-panel',\n templateUrl: './spiderly-panel.component.html',\n styleUrl: './spiderly-panel.component.scss',\n standalone: false,\n})\nexport class SpiderlyPanelComponent implements OnInit {\n @Input() isFirstMultiplePanel: boolean = false;\n @Input() isMiddleMultiplePanel: boolean = false;\n @Input() isLastMultiplePanel: boolean = false;\n @Input() toggleable: boolean = false;\n @Input() toggler: 'header' | 'icon' | null = 'icon';\n @Input() collapsed: boolean = false;\n @Input() crudMenu: MenuItem[];\n /** Whether the CRUD context-menu icon is shown. Defaults to `true`. */\n @Input() showCrudMenu: boolean = true;\n /** Whether a remove/delete icon is shown. Defaults to `false`. */\n @Input() showRemoveIcon: boolean = false;\n @Input() index: number;\n /** Whether the panel header is rendered. Defaults to `true`. */\n @Input() showPanelHeader: boolean = true;\n\n @Output() onMenuIconClick: EventEmitter<number> = new EventEmitter();\n @Output() onRemoveIconClick: EventEmitter<null> = new EventEmitter();\n\n @ViewChild('menu') menu: Menu;\n\n constructor() {}\n\n ngOnInit(): void {}\n\n menuItemClick(index: number, event) {\n this.menu.toggle(event);\n this.onMenuIconClick.next(index);\n }\n\n removeItemClick() {\n this.onRemoveIconClick.next(null);\n }\n}\n","<p-panel\n [showHeader]=\"showPanelHeader\"\n [ngClass]=\"{\n 'multiple-panel-first-without-header':\n isFirstMultiplePanel && !showPanelHeader,\n 'multiple-panel-first': isFirstMultiplePanel,\n 'multiple-panel-middle-without-header':\n isMiddleMultiplePanel && !showPanelHeader,\n 'multiple-panel-middle': isMiddleMultiplePanel,\n 'multiple-panel-last-without-header':\n isLastMultiplePanel && !showPanelHeader,\n 'multiple-panel-last': isLastMultiplePanel,\n 'panel-border': !isFirstMultiplePanel,\n 'spiderly-panel': true,\n 'panel-header-cursor-pointer': toggler === 'header' && toggleable,\n }\"\n [toggleable]=\"toggleable\"\n [toggler]=\"toggler\"\n [collapsed]=\"toggleable && collapsed\"\n expandIcon=\"pi pi-chevron-up\"\n collapseIcon=\"pi pi-chevron-down\"\n>\n <ng-template pTemplate=\"header\">\n <div>\n <ng-content select=\"panel-header\"></ng-content>\n <ng-content select=\"[panelHeader]\"></ng-content>\n </div>\n </ng-template>\n\n <ng-template pTemplate=\"icons\">\n <div *ngIf=\"showCrudMenu && crudMenu\" class=\"mr-2\">\n <i\n class=\"pi pi-ellipsis-h icon-hover\"\n (click)=\"menuItemClick(index, $event)\"\n ></i>\n <!-- https://github.com/primefaces/primeng/issues/13934 -->\n <p-menu\n #menu\n [model]=\"crudMenu\"\n [popup]=\"true\"\n appendTo=\"body\"\n [tabindex]=\"undefined\"\n ></p-menu>\n </div>\n <div *ngIf=\"showRemoveIcon\" class=\"mr-2\">\n <i\n class=\"pi pi-minus icon-hover error-color-light\"\n (click)=\"removeItemClick()\"\n ></i>\n </div>\n </ng-template>\n\n <div class=\"panel-body-wrapper\">\n <ng-content select=\"panel-body\"></ng-content>\n </div>\n\n <ng-content select=\"panel-footer\"></ng-content>\n</p-panel>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PanelBodyComponent } from './panel-body/panel-body.component';\nimport { PanelFooterComponent } from './panel-footer/panel-footer.component';\nimport { PanelHeaderComponent } from './panel-header/panel-header.component';\nimport { SpiderlyPanelComponent } from './spiderly-panel/spiderly-panel.component';\nimport { MenuModule } from 'primeng/menu';\nimport { PanelModule } from 'primeng/panel';\n\n@NgModule({\n imports: [CommonModule, MenuModule, PanelModule],\n exports: [\n PanelHeaderComponent,\n PanelBodyComponent,\n PanelFooterComponent,\n SpiderlyPanelComponent,\n ],\n declarations: [\n PanelHeaderComponent,\n PanelBodyComponent,\n PanelFooterComponent,\n SpiderlyPanelComponent,\n ],\n providers: [],\n})\nexport class SpiderlyPanelsModule {}\n","import { CommonModule } from '@angular/common';\nimport { HttpClient } from '@angular/common/http';\nimport {\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n KeyValueDiffers,\n OnInit,\n Output,\n} from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { ButtonModule } from 'primeng/button';\nimport { InputOtp } from 'primeng/inputotp';\nimport { SpiderlyControlsModule } from '../../../controls/spiderly-controls.module';\nimport { VerificationTokenRequest } from '../../../entities/security-entities';\nimport { BaseFormService } from '../../../services/base-form.service';\nimport { SpiderlyMessageService } from '../../../services/spiderly-message.service';\nimport { BaseFormComponent } from '../../base-form/base-form.component';\nimport { SpiderlyFormGroup } from '../../spiderly-form-control/spiderly-form-control';\nimport { SpiderlyPanelsModule } from '../../spiderly-panels/spiderly-panels.module';\n\n@Component({\n selector: 'verification-wrapper',\n templateUrl: './verification-wrapper.component.html',\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n SpiderlyControlsModule,\n SpiderlyPanelsModule,\n ButtonModule,\n InputOtp,\n TranslocoDirective,\n ],\n})\nexport class VerificationWrapperComponent\n extends BaseFormComponent\n implements OnInit\n{\n verificationTokenRequestFormGroup =\n new SpiderlyFormGroup<VerificationTokenRequest>({});\n\n @Input() email: string;\n @Output() onResendVerificationToken: EventEmitter<any> = new EventEmitter();\n @Output() onCodeSubmit: EventEmitter<string> = new EventEmitter();\n\n constructor(\n protected override differs: KeyValueDiffers,\n protected override http: HttpClient,\n protected override messageService: SpiderlyMessageService,\n protected override changeDetectorRef: ChangeDetectorRef,\n protected override router: Router,\n protected override route: ActivatedRoute,\n protected override translocoService: TranslocoService,\n protected override baseFormService: BaseFormService,\n ) {\n super(\n differs,\n http,\n messageService,\n changeDetectorRef,\n router,\n route,\n translocoService,\n baseFormService,\n );\n }\n\n override ngOnInit() {\n this.initVerificationTokenRequestFormGroup(\n new VerificationTokenRequest({ email: this.email }),\n );\n }\n\n initVerificationTokenRequestFormGroup(model: VerificationTokenRequest) {\n this.baseFormService.initFormGroup(\n this.verificationTokenRequestFormGroup,\n VerificationTokenRequest,\n model,\n ['verificationCode'],\n );\n }\n\n codeSubmit() {\n let isValid: boolean = this.baseFormService.isControlValid(\n this.verificationTokenRequestFormGroup,\n );\n\n if (isValid) {\n this.onCodeSubmit.next(\n this.verificationTokenRequestFormGroup.controls.verificationCode.getRawValue(),\n );\n }\n }\n\n resendVerificationToken() {\n this.onResendVerificationToken.next(null);\n }\n}\n","<ng-container *transloco=\"let t\">\n <div\n class=\"min-h-screen\"\n style=\"display: flex; justify-content: center; align-items: center\"\n >\n <div class=\"dialog\" style=\"padding: 0px\">\n @if (verificationTokenRequestFormGroup != null) {\n <spiderly-panel>\n <panel-header\n [title]=\"t('AccountVerificationHeader')\"\n [showBigTitle]=\"true\"\n icon=\"pi pi-envelope\"\n ></panel-header>\n\n <panel-body>\n <form class=\"spiderly-grid\">\n <div class=\"col-8\">\n <div style=\"font-size: 17.5px\">\n {{ t(\"AccountVerificationTitle\") }}\n </div>\n </div>\n <div class=\"col-8\">\n {{ t(\"AccountVerificationDescription\", { email: email }) }}\n </div>\n <div class=\"col-8\">\n <!--\n PrimeNG's InputOtp calls event.preventDefault() on the Enter keydown\n (Enter is a non-digit while integerOnly is on, and once all tokens are\n filled it blocks every key but Delete), which kills the browser's\n implicit submit via the type=\"submit\" button. Wire Enter straight to\n codeSubmit() so \"paste the code + Enter\" still submits. preventDefault\n doesn't stop propagation, so this bubbled keydown listener still fires.\n -->\n <p-inputOtp\n [formControl]=\"verificationTokenRequestFormGroup.getControl('verificationCode')\"\n [length]=\"6\"\n [integerOnly]=\"true\"\n [autofocus]=\"true\"\n (keydown.enter)=\"codeSubmit()\"\n ></p-inputOtp>\n </div>\n <div class=\"col-8\">\n <spiderly-button\n (onClick)=\"codeSubmit()\"\n [label]=\"t('Submit')\"\n icon=\"pi pi-verified\"\n type=\"submit\"\n ></spiderly-button>\n </div>\n </form>\n </panel-body>\n\n <panel-footer>\n <a\n pButton\n class=\"p-button-link\"\n [label]=\"t('GoToGmail')\"\n icon=\"pi pi-external-link\"\n href=\"https://mail.google.com/mail/u/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n ></a>\n <a\n pButton\n class=\"p-button-link\"\n [label]=\"t('GoToYahoo')\"\n icon=\"pi pi-external-link\"\n href=\"https://mail.yahoo.com/d/folders/1/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n ></a>\n </panel-footer>\n <panel-footer>\n <div>\n {{ t(\"ResendVerificationCodeFirstPart\") }}\n <a class=\"link\" (click)=\"resendVerificationToken()\">{{\n t(\"ResendVerificationCodeLinkSecondPart\")\n }}</a>\n </div>\n </panel-footer>\n </spiderly-panel>\n } @else {\n <!-- TODO FT: Add skeleton -->\n }\n </div>\n </div>\n</ng-container>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { VerificationWrapperComponent } from './verification-wrapper.component';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { SpiderlyMessageService } from '../../../services/spiderly-message.service';\nimport { AuthServiceBase } from '../../../services/auth.service.base';\n\n@Component({\n selector: 'login-verification',\n templateUrl: './login-verification.component.html',\n imports: [VerificationWrapperComponent],\n})\nexport class LoginVerificationComponent implements OnInit {\n @Input() email: string;\n @Input() userId: number;\n\n constructor(\n private authService: AuthServiceBase,\n private messageService: SpiderlyMessageService,\n private translocoService: TranslocoService,\n ) {}\n\n ngOnInit() {}\n\n resendVerificationToken() {\n this.authService\n .sendLoginVerificationEmail({ email: this.email })\n .subscribe(() => {\n this.messageService.successMessage(\n this.translocoService.translate('SuccessfullySentVerificationCode'),\n );\n });\n }\n\n onCodeSubmit(event: string) {\n this.authService\n .login({ email: this.email, verificationCode: event })\n .subscribe(() => {\n this.messageService.successMessage(\n this.translocoService.translate(\n 'YouHaveSuccessfullyVerifiedYourAccount',\n ),\n );\n this.authService.navigateToDashboard();\n });\n }\n}\n","<verification-wrapper\n [email]=\"email\"\n (onResendVerificationToken)=\"resendVerificationToken()\"\n (onCodeSubmit)=\"onCodeSubmit($event)\"\n></verification-wrapper>\n","import { CommonModule } from '@angular/common';\nimport { HttpClient } from '@angular/common/http';\nimport {\n ChangeDetectorRef,\n Component,\n Input,\n KeyValueDiffers,\n OnInit,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { SpiderlyControlsModule } from '../../../controls/spiderly-controls.module';\nimport { Login } from '../../../entities/security-entities';\nimport { AuthServiceBase } from '../../../services/auth.service.base';\nimport { BaseFormService } from '../../../services/base-form.service';\nimport { SpiderlyMessageService } from '../../../services/spiderly-message.service';\nimport { BaseFormComponent } from '../../base-form/base-form.component';\nimport { SpiderlyFormGroup } from '../../spiderly-form-control/spiderly-form-control';\nimport { AuthCardComponent } from '../auth-card/auth-card.component';\nimport { ExternalLoginComponent } from '../external-login/external-login.component';\nimport { LoginVerificationComponent } from '../partials/login-verification.component';\n\n@Component({\n selector: 'spiderly-login',\n templateUrl: './login.component.html',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n AuthCardComponent,\n ExternalLoginComponent,\n SpiderlyControlsModule,\n LoginVerificationComponent,\n TranslocoDirective,\n ],\n})\nexport class SpiderlyLoginComponent extends BaseFormComponent implements OnInit {\n loginFormGroup = new SpiderlyFormGroup<Login>({});\n showEmailSentDialog: boolean = false;\n\n /** Per-code provider icon overrides, forwarded to <spiderly-external-login>. */\n @Input() providerIcons: Record<string, string> = {};\n\n constructor(\n protected override differs: KeyValueDiffers,\n protected override http: HttpClient,\n protected override messageService: SpiderlyMessageService,\n protected override changeDetectorRef: ChangeDetectorRef,\n protected override router: Router,\n protected override route: ActivatedRoute,\n protected override translocoService: TranslocoService,\n protected override baseFormService: BaseFormService,\n private authService: AuthServiceBase,\n ) {\n super(\n differs,\n http,\n messageService,\n changeDetectorRef,\n router,\n route,\n translocoService,\n baseFormService,\n );\n }\n\n override ngOnInit() {\n this.initLoginFormGroup(new Login({}));\n this.showExternalAuthErrorIfPresent();\n }\n\n // Surface a friendly message when the server-side external login bounced back with an error (captured from\n // the URL at bootstrap by AuthServiceBase). \"expired\" = the user lingered on the provider's account picker.\n private showExternalAuthErrorIfPresent() {\n const code = this.authService.externalAuthErrorCode;\n if (!code) {\n return;\n }\n this.authService.externalAuthErrorCode = null; // show once\n const messageKey =\n code === 'expired' ? 'ExternalLoginExpiredDetails' : 'ExternalLoginFailedDetails';\n this.messageService.warningMessage(this.translocoService.translate(messageKey));\n }\n\n initLoginFormGroup(model: Login) {\n this.baseFormService.initFormGroup(this.loginFormGroup, Login, model, [\n 'email',\n ]);\n }\n\n sendLoginVerificationEmail() {\n let isFormGroupValid: boolean = this.baseFormService.isControlValid(\n this.loginFormGroup,\n );\n\n if (isFormGroupValid == false) {\n this.baseFormService.showInvalidFieldsMessage();\n return;\n }\n\n this.authService\n .sendLoginVerificationEmail(this.loginFormGroup.getRawValue())\n .subscribe((result) => {\n if (result.message) {\n this.messageService.successMessage(result.message);\n }\n this.showEmailSentDialog = true;\n });\n }\n}\n","<ng-container *transloco=\"let t\">\n @if (loginFormGroup != null) {\n @if (showEmailSentDialog == false) {\n <spiderly-auth-card>\n <form [formGroup]=\"loginFormGroup\" style=\"margin-bottom: 16px\">\n <div>\n <spiderly-textbox\n [control]=\"loginFormGroup.getControl('email')\"\n ></spiderly-textbox>\n </div>\n\n <div class=\"mt-4 mb-6\">\n <div class=\"text-center\" style=\"font-size: smaller\">\n {{ t(\"AgreementsOnRegister\") }}\n <b\n routerLink=\"/user-agreement\"\n class=\"primary-color cursor-pointer\"\n >{{ t(\"UserAgreement\") }}</b\n >\n {{ t(\"and\") }}\n <b\n routerLink=\"/privacy-policy\"\n class=\"primary-color cursor-pointer\"\n >{{ t(\"PrivacyPolicy\") }}</b\n >.\n </div>\n </div>\n\n <div style=\"display: flex; flex-direction: column; gap: 16px\">\n <spiderly-button\n [label]=\"t('Login')\"\n (onClick)=\"sendLoginVerificationEmail()\"\n [outlined]=\"true\"\n [style]=\"{ width: '100%' }\"\n type=\"submit\"\n ></spiderly-button>\n </div>\n </form>\n\n <spiderly-external-login\n [providerIcons]=\"providerIcons\"\n ></spiderly-external-login>\n </spiderly-auth-card>\n } @else {\n <login-verification\n [email]=\"loginFormGroup.controls.email.getRawValue()\"\n ></login-verification>\n }\n\n <!--\n General projection slot for consumer-supplied login extras (a bot-challenge widget, a notice,\n an extra field, …). Rendered in BOTH the email-entry and code-verification states — outside the\n showEmailSentDialog toggle — so projected content survives the email → resend flow (e.g. a\n single-use challenge widget that must stay mounted to issue a fresh token on resend).\n Project with the `loginExtra` attribute: <spiderly-login><my-widget loginExtra/></spiderly-login>.\n -->\n <ng-content select=\"[loginExtra]\"></ng-content>\n }\n</ng-container>\n","import { Component, Input } from '@angular/core';\nimport { SkeletonModule } from 'primeng/skeleton';\n\n@Component({\n selector: 'card-skeleton',\n templateUrl: './card-skeleton.component.html',\n styles: [],\n imports: [SkeletonModule],\n})\nexport class CardSkeletonComponent {\n @Input() height: number = 400;\n titleHeight: number = 23;\n dataHeight: number;\n padding: number = 21;\n titleMarginBottom: number = 14;\n titleMarginTop: number = 4;\n\n ngOnInit() {\n this.dataHeight =\n this.height -\n (this.titleHeight +\n this.padding * 2 +\n this.titleMarginBottom +\n this.titleMarginTop);\n }\n}\n","<div\n class=\"rounded border surface-border p-6 surface-card\"\n [style]=\"'height: ' + height + 'px;'\"\n>\n <div\n [style]=\"\n 'margin-bottom:' +\n titleMarginBottom +\n 'px; margin-top:' +\n titleMarginTop +\n 'px;'\n \"\n >\n <p-skeleton width=\"160px\" [height]=\"titleHeight + 'px'\"></p-skeleton>\n </div>\n <div [style]=\"'height: ' + dataHeight + 'px;'\">\n <p-skeleton width=\"100%\" height=\"100%\" />\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormBuilder } from '@angular/forms';\nimport { MenuItem } from 'primeng/api';\nimport { SpiderlyPanelsModule } from '../spiderly-panels/spiderly-panels.module';\n\n@Component({\n selector: 'index-card',\n templateUrl: './index-card.component.html',\n imports: [CommonModule, SpiderlyPanelsModule],\n})\nexport class IndexCardComponent {\n @Input() last: boolean;\n @Input() index: number;\n @Input() header: string = '';\n @Input() description: string;\n /** Whether a remove/delete icon is shown. */\n @Input() showRemoveIcon: boolean;\n /** Whether the CRUD context-menu icon is shown. Defaults to `true`. */\n @Input() showCrudMenu: boolean = true;\n\n @Input() crudMenu: MenuItem[];\n\n @Output() onMenuIconClick = new EventEmitter<number>();\n @Output() onRemoveIconClick = new EventEmitter<null>();\n\n constructor(protected formBuilder: FormBuilder) {}\n\n ngOnInit() {}\n\n menuIconClick(index: number) {\n this.onMenuIconClick.next(index);\n }\n\n removeIconClick() {\n this.onRemoveIconClick.next(null);\n }\n}\n","<div\n [ngClass]=\"{\n 'last-child-zero-margin': last,\n 'card-margin-bottom': true,\n }\"\n>\n <spiderly-panel\n [crudMenu]=\"crudMenu\"\n [showCrudMenu]=\"showCrudMenu\"\n (onMenuIconClick)=\"menuIconClick($event)\"\n [showRemoveIcon]=\"showRemoveIcon\"\n (onRemoveIconClick)=\"removeIconClick()\"\n [index]=\"index\"\n >\n <panel-header\n [title]=\"header\"\n [index]=\"index\"\n [showIcon]=\"false\"\n ></panel-header>\n\n <panel-body>\n <ng-content>\n <!-- Custom things below description -->\n </ng-content>\n </panel-body>\n </spiderly-panel>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\nimport { FormBuilder } from '@angular/forms';\nimport { SpiderlyPanelsModule } from '../spiderly-panels/spiderly-panels.module';\n\n@Component({\n selector: 'info-card',\n templateUrl: './info-card.component.html',\n styleUrl: './info-card.component.scss',\n imports: [CommonModule, SpiderlyPanelsModule],\n})\nexport class InfoCardComponent {\n @Input() header = '';\n /** Whether the small icon variant is shown. Defaults to `true`. */\n @Input() showSmallIcon = true;\n @Input() icon = 'pi pi-info-circle';\n @Input() textColor = '';\n\n constructor(protected formBuilder: FormBuilder) {}\n\n ngOnInit() {}\n}\n","<div class=\"card responsive-card-padding info-card\">\n <div class=\"info-card__content\">\n <div>\n <div class=\"info-card__header\">\n <i *ngIf=\"showSmallIcon\" class=\"{{ icon }} info-card__icon\"></i>\n {{ header }}\n </div>\n <div class=\"info-card__body\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n\n <div class=\"info-card__background-icon\">\n <i class=\"{{ icon }}\"></i>\n </div>\n</div>\n","import { BaseEntity } from './base-entity';\nimport { UserBase } from './security-entities';\n\nexport class InitTopBarData extends BaseEntity {\n companyName?: string;\n userProfilePath?: string;\n showProfileIcon?: boolean;\n currentUser?: UserBase;\n\n constructor({\n companyName,\n userProfilePath,\n showProfileIcon,\n currentUser,\n }: {\n companyName?: string;\n userProfilePath?: string;\n showProfileIcon?: boolean;\n currentUser?: UserBase;\n } = {}) {\n super();\n\n this.companyName = companyName;\n this.userProfilePath = userProfilePath;\n this.showProfileIcon = showProfileIcon;\n this.currentUser = currentUser;\n }\n\n static readonly typeName = 'InitTopBarData' as const;\n}\n","/** Parses a JSON entry from web storage; missing or corrupted entries read as null. */\nexport function readStoredJson(storage: Storage, key: string): any {\n try {\n return JSON.parse(storage.getItem(key) ?? 'null');\n } catch {\n return null;\n }\n}\n\n/** Writes a value to web storage as JSON; the counterpart of readStoredJson. */\nexport function writeStoredJson(storage: Storage, key: string, value: any): void {\n storage.setItem(key, JSON.stringify(value));\n}\n","import { AuthServiceBase } from './auth.service.base';\nimport { ApiSecurityService } from './api.service.security';\nimport { Injectable, OnDestroy } from '@angular/core';\nimport {\n map,\n Observable,\n of,\n Subject,\n Subscription,\n} from 'rxjs';\nimport { InitTopBarData } from '../entities/init-top-bar-data';\nimport { ConfigServiceBase } from './config.service.base';\nimport { readStoredJson, writeStoredJson } from './web-storage';\nimport { AutoCompleteCompleteEvent } from 'primeng/autocomplete';\nimport { Namebook } from '../entities/namebook';\n\nexport interface AppConfig {\n inputStyle: string;\n colorScheme: string;\n ripple: boolean;\n menuMode: string;\n}\n\ninterface LayoutState {\n staticMenuDesktopInactive: boolean;\n overlayMenuActive: boolean;\n profileSidebarVisible: boolean;\n profileDropdownSidebarVisible: boolean;\n staticMenuMobileActive: boolean;\n menuHoverActive: boolean;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class LayoutServiceBase implements OnDestroy {\n /**\n * Only the desktop collapse persists across reloads (a durable preference,\n * like the data table's column layout); the rest of LayoutState is\n * deliberately transient.\n */\n private static readonly menuDesktopInactiveKey =\n 'spiderly-layout:menu-desktop-inactive';\n\n userSubscription: Subscription;\n\n layoutConfig: AppConfig = {\n ripple: false,\n inputStyle: 'outlined',\n menuMode: 'static',\n colorScheme: 'light',\n };\n\n state: LayoutState = {\n staticMenuDesktopInactive:\n readStoredJson(localStorage, LayoutServiceBase.menuDesktopInactiveKey) ===\n true,\n overlayMenuActive: false,\n profileSidebarVisible: false,\n profileDropdownSidebarVisible: false,\n staticMenuMobileActive: false,\n menuHoverActive: false,\n };\n\n private overlayOpen = new Subject<any>();\n\n overlayOpen$ = this.overlayOpen.asObservable();\n\n constructor(\n protected apiService: ApiSecurityService,\n protected config: ConfigServiceBase,\n protected authService: AuthServiceBase,\n ) {}\n\n onMenuToggle() {\n if (this.isOverlay()) {\n this.state.overlayMenuActive = !this.state.overlayMenuActive;\n if (this.state.overlayMenuActive) {\n this.overlayOpen.next(null);\n }\n }\n\n if (this.isDesktop()) {\n this.state.staticMenuDesktopInactive =\n !this.state.staticMenuDesktopInactive;\n writeStoredJson(\n localStorage,\n LayoutServiceBase.menuDesktopInactiveKey,\n this.state.staticMenuDesktopInactive,\n );\n } else {\n this.state.staticMenuMobileActive = !this.state.staticMenuMobileActive;\n\n if (this.state.staticMenuMobileActive) {\n this.overlayOpen.next(null);\n }\n }\n }\n\n showProfileSidebar() {\n this.state.profileSidebarVisible = !this.state.profileSidebarVisible;\n if (this.state.profileSidebarVisible) {\n this.overlayOpen.next(null);\n }\n }\n\n showProfileDropdownSidebar() {\n this.state.profileDropdownSidebarVisible =\n !this.state.profileDropdownSidebarVisible;\n if (this.state.profileDropdownSidebarVisible) {\n this.overlayOpen.next(null);\n }\n }\n\n isOverlay() {\n return this.layoutConfig.menuMode === 'overlay';\n }\n\n isDesktop() {\n return window.innerWidth > 991;\n }\n\n isMobile() {\n return !this.isDesktop();\n }\n\n //#region Top Bar\n\n initTopBarData = (): Observable<InitTopBarData> => {\n return this.authService.user$.pipe(\n map((currentUser) => {\n return new InitTopBarData({\n companyName: this.config.companyName,\n userProfilePath: `/administration/users/${currentUser?.id}`,\n showProfileIcon: true,\n currentUser: currentUser,\n });\n }),\n );\n };\n\n //#endregion\n\n //#region Side Bar\n\n searchPartners = (\n event: AutoCompleteCompleteEvent,\n ): Observable<Namebook[]> => {\n return of();\n };\n\n partnersAutocompleteButtonClick = (selectedPartner: Namebook) => {};\n\n //#endregion\n\n ngOnDestroy(): void {\n if (this.userSubscription) {\n this.userSubscription.unsubscribe();\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { MenuChangeEvent } from '../../../entities/menuchangeevent';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SidebarMenuService {\n private menuSource = new Subject<MenuChangeEvent>();\n private resetSource = new Subject();\n\n menuSource$ = this.menuSource.asObservable();\n resetSource$ = this.resetSource.asObservable();\n\n onMenuStateChange(event: MenuChangeEvent) {\n this.menuSource.next(event);\n }\n\n reset() {\n this.resetSource.next(true);\n }\n}\n","import {\n ChangeDetectorRef,\n Component,\n HostBinding,\n Input,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { NavigationEnd, Router, RouterModule } from '@angular/router';\nimport {\n animate,\n state,\n style,\n transition,\n trigger,\n} from '@angular/animations';\nimport { Subscription } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { SidebarMenuService } from './sidebar-menu.service';\nimport { SpiderlyMenuItem } from './sidebar-menu.component';\nimport { AutoCompleteCompleteEvent } from 'primeng/autocomplete';\nimport { SpiderlyFormControl } from '../../spiderly-form-control/spiderly-form-control';\nimport { LayoutServiceBase } from '../../../services/app-layout.service.base';\nimport { AuthServiceBase } from '../../../services/auth.service.base';\nimport { ApiSecurityService } from '../../../services/api.service.security';\nimport { ConfigServiceBase } from '../../../services/config.service.base';\nimport { CommonModule } from '@angular/common';\nimport { SpiderlyControlsModule } from '../../../controls/spiderly-controls.module';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { Namebook } from '../../../entities/namebook';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[menuitem]',\n templateUrl: './menuitem.component.html',\n animations: [\n trigger('children', [\n state(\n 'collapsed',\n style({\n height: '0',\n }),\n ),\n state(\n 'expanded',\n style({\n height: '*',\n }),\n ),\n transition(\n 'collapsed <=> expanded',\n animate('400ms cubic-bezier(0.86, 0, 0.07, 1)'),\n ),\n ]),\n ],\n imports: [\n CommonModule,\n RouterModule,\n TranslocoDirective,\n SpiderlyControlsModule,\n ],\n})\nexport class MenuitemComponent implements OnInit, OnDestroy {\n @Input() item: SpiderlyMenuItem;\n\n @Input() index!: number;\n\n @Input() @HostBinding('class.layout-root-menuitem') root!: boolean;\n\n @Input() parentKey!: string;\n\n active = false;\n\n private menuSourceSubscription: Subscription;\n\n private menuResetSubscription: Subscription;\n\n private permissionSubscription: Subscription | null = null;\n\n key: string = '';\n\n selectedPartner = new SpiderlyFormControl<Namebook>(null, {\n updateOn: 'change',\n });\n\n partnerOptions: Namebook[];\n\n constructor(\n public layoutService: LayoutServiceBase,\n private cd: ChangeDetectorRef,\n public router: Router,\n private menuService: SidebarMenuService,\n private authService: AuthServiceBase,\n private apiService: ApiSecurityService,\n private config: ConfigServiceBase,\n ) {\n this.menuSourceSubscription = this.menuService.menuSource$.subscribe(\n (value) => {\n Promise.resolve(null).then(() => {\n if (value.routeEvent) {\n this.active =\n value.key === this.key || value.key.startsWith(this.key + '-')\n ? true\n : false;\n } else {\n if (\n value.key !== this.key &&\n !value.key.startsWith(this.key + '-')\n ) {\n this.active = false;\n }\n }\n });\n },\n );\n\n this.menuResetSubscription = this.menuService.resetSource$.subscribe(() => {\n this.active = false;\n });\n\n this.router.events\n .pipe(filter((event) => event instanceof NavigationEnd))\n .subscribe((params) => {\n if (this.item.routerLink) {\n this.updateActiveStateFromRoute();\n }\n });\n }\n\n ngOnInit() {\n this.item.visible = this.item.visible ?? true;\n\n this.key = this.parentKey\n ? this.parentKey + '-' + this.index\n : String(this.index);\n\n if (this.item.routerLink) {\n this.updateActiveStateFromRoute();\n }\n\n this.permissionSubscription =\n this.authService.currentUserPermissionCodes$.subscribe(\n (currentUserPermissionCodes: string[]) => {\n if (this.item && typeof this.item.hasPermission === 'function') {\n this.item.visible = this.item.hasPermission(\n currentUserPermissionCodes,\n );\n }\n },\n );\n }\n\n updateActiveStateFromRoute() {\n let activeRoute = this.router.isActive(this.item.routerLink[0], {\n paths: 'exact',\n queryParams: 'ignored',\n matrixParams: 'ignored',\n fragment: 'ignored',\n });\n\n if (activeRoute) {\n this.menuService.onMenuStateChange({ key: this.key, routeEvent: true });\n }\n }\n\n itemClick(event: Event) {\n // avoid processing disabled items\n if (this.item.disabled || event === null) {\n event.preventDefault();\n return;\n }\n\n // execute command\n if (this.item.command) {\n this.item.command({ originalEvent: event, item: this.item });\n }\n\n // toggle active state\n if (this.item.items) {\n this.active = !this.active;\n }\n\n this.menuService.onMenuStateChange({ key: this.key });\n }\n\n get submenuAnimation() {\n return this.root ? 'expanded' : this.active ? 'expanded' : 'collapsed';\n }\n\n @HostBinding('class.active-menuitem')\n get activeClass() {\n return this.active && !this.root;\n }\n\n //#region HACK: Partner\n\n searchPartners(event: AutoCompleteCompleteEvent) {\n this.layoutService.searchPartners(event).subscribe((po) => {\n this.partnerOptions = po;\n });\n }\n\n partnersAutocompleteButtonClick = async () => {\n this.layoutService.partnersAutocompleteButtonClick(\n this.selectedPartner.value,\n );\n };\n\n //#endregion\n\n ngOnDestroy() {\n if (this.menuSourceSubscription) {\n this.menuSourceSubscription.unsubscribe();\n }\n\n if (this.menuResetSubscription) {\n this.menuResetSubscription.unsubscribe();\n }\n\n if (this.permissionSubscription) {\n this.permissionSubscription.unsubscribe();\n }\n }\n}\n","<ng-container *transloco=\"let t\">\n <div *ngIf=\"root && item.visible === true\" class=\"layout-menuitem-root-text\">\n {{ item.label }}\n </div>\n <a\n *ngIf=\"(!item.routerLink || item.items) && item.visible === true\"\n [attr.href]=\"item.url\"\n (click)=\"itemClick($event)\"\n [ngClass]=\"item.styleClass\"\n [attr.target]=\"item.target\"\n tabindex=\"0\"\n pRipple\n >\n <i [ngClass]=\"item.icon\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label }}</span>\n <i\n class=\"pi pi-fw pi-angle-down layout-submenu-toggler\"\n *ngIf=\"item.items\"\n ></i>\n </a>\n <a\n *ngIf=\"item.routerLink && !item.items && item.visible === true\"\n (click)=\"itemClick($event)\"\n [ngClass]=\"item.styleClass\"\n [routerLink]=\"item.routerLink\"\n routerLinkActive=\"active-route\"\n [routerLinkActiveOptions]=\"\n item.routerLinkActiveOptions || {\n paths: 'exact',\n queryParams: 'ignored',\n matrixParams: 'ignored',\n fragment: 'ignored',\n }\n \"\n [fragment]=\"item.fragment\"\n [queryParamsHandling]=\"item.queryParamsHandling\"\n [preserveFragment]=\"item.preserveFragment\"\n [skipLocationChange]=\"item.skipLocationChange\"\n [replaceUrl]=\"item.replaceUrl\"\n [state]=\"item.state\"\n [queryParams]=\"item.queryParams\"\n [attr.target]=\"item.target\"\n tabindex=\"0\"\n pRipple\n >\n <i [ngClass]=\"item.icon\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label }}</span>\n <i\n class=\"pi pi-fw pi-angle-down layout-submenu-toggler\"\n *ngIf=\"item.items\"\n ></i>\n </a>\n\n <ul\n *ngIf=\"item.items && item.visible === true\"\n [@children]=\"submenuAnimation\"\n >\n <ng-template ngFor let-child let-i=\"index\" [ngForOf]=\"item.items\">\n <li\n menuitem\n [item]=\"child\"\n [index]=\"i\"\n [parentKey]=\"key\"\n [class]=\"child.badgeStyleClass\"\n ></li>\n </ng-template>\n </ul>\n\n <!-- Delete this in the future iterations, make link to partner in /partners page -->\n <spiderly-autocomplete\n *ngIf=\"item.showPartnerDialog\"\n [control]=\"selectedPartner\"\n [options]=\"partnerOptions\"\n (onTextInput)=\"searchPartners($event)\"\n label=\"\"\n [placeholder]=\"t('SelectThePartner')\"\n [showAddon]=\"true\"\n (onButtonClick)=\"partnersAutocompleteButtonClick()\"\n addonIcon=\"pi pi-check\"\n [emptyMessage]=\"t('LeftCornerPartnersEmptyMessage')\"\n class=\"mobile-stay-open\"\n ></spiderly-autocomplete>\n</ng-container>\n","import { TranslocoService } from '@jsverse/transloco';\nimport { Input, OnInit } from '@angular/core';\nimport { Component } from '@angular/core';\nimport { MenuItem } from 'primeng/api';\nimport { LayoutServiceBase } from '../../../services/app-layout.service.base';\nimport { AuthServiceBase } from '../../../services/auth.service.base';\nimport { ConfigServiceBase } from '../../../services/config.service.base';\nimport { MenuitemComponent } from './menuitem.component';\nimport { CommonModule } from '@angular/common';\n\nexport interface SpiderlyMenuItem extends MenuItem {\n hasPermission?: (permissionCodes: string[]) => boolean;\n showPartnerDialog?: boolean;\n}\n\n@Component({\n selector: 'sidebar-menu', // FT: Don't change selector to 'menu', because other style will apply to it\n templateUrl: './sidebar-menu.component.html',\n imports: [CommonModule, MenuitemComponent],\n})\nexport class SidebarMenuComponent implements OnInit {\n @Input() menu: SpiderlyMenuItem[];\n\n constructor(\n public layoutService: LayoutServiceBase,\n private authService: AuthServiceBase,\n private translocoService: TranslocoService,\n private config: ConfigServiceBase,\n ) {}\n\n ngOnInit() {}\n\n ngOnDestroy(): void {}\n}\n","<ul class=\"layout-menu\">\n <ng-container *ngFor=\"let item of menu; let i = index\">\n <li\n menuitem\n *ngIf=\"!item.separator\"\n [item]=\"item\"\n [index]=\"i\"\n [root]=\"true\"\n ></li>\n <li\n *ngIf=\"item.separator\"\n class=\"gray-separator\"\n style=\"margin-top: 11px\"\n ></li>\n </ng-container>\n</ul>\n","import { Component, ElementRef, Input } from '@angular/core';\nimport {\n SidebarMenuComponent,\n SpiderlyMenuItem,\n} from './sidebar-menu.component';\n\n@Component({\n selector: 'sidebar',\n templateUrl: './sidebar.component.html',\n imports: [SidebarMenuComponent],\n})\nexport class AppSidebarComponent {\n @Input() menu: SpiderlyMenuItem[];\n\n constructor(public el: ElementRef) {}\n\n ngOnInit() {}\n}\n","<sidebar-menu [menu]=\"menu\"></sidebar-menu>\n","import {\n Component,\n ElementRef,\n EventEmitter,\n Input,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NavigationEnd, Router, RouterModule } from '@angular/router';\nimport { AvatarModule } from 'primeng/avatar';\nimport { LayoutServiceBase } from '../../../services/app-layout.service.base';\nimport { UserBase } from '../../../entities/security-entities';\nimport { filter, Subscription } from 'rxjs';\nimport { AuthServiceBase } from '../../../services/auth.service.base';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { SpiderlyButtonComponent } from '../../spiderly-buttons/spiderly-button/spiderly-button.component';\nimport { ConfigServiceBase } from '../../../services/config.service.base';\n\n@Component({\n selector: 'spiderly-profile-avatar',\n templateUrl: './profile-avatar.component.html',\n styleUrl: './profile-avatar.component.scss',\n imports: [\n CommonModule,\n RouterModule,\n AvatarModule,\n SpiderlyButtonComponent,\n TranslocoDirective,\n ],\n})\nexport class ProfileAvatarComponent {\n @Input() isSideMenuLayout = true;\n @Input() routeOnLargeProfileAvatarClick = true;\n /** Whether the login button is shown when no user is signed in. Defaults to `true`. */\n @Input() showLoginButton = true;\n @Input() routeToLoginPage = true;\n @Input() loginButtonOutlined = false;\n @Input() loginButtonSeverity:\n | 'success'\n | 'info'\n | 'warn'\n | 'danger'\n | 'help'\n | 'primary'\n | 'secondary'\n | 'contrast'\n | null\n | undefined = 'primary';\n @Input() loginButtonSize: 'small' | 'large' | undefined;\n @Output() onLoginButtonClick = new EventEmitter();\n @Input() menuItems: ProfileAvatarModalMenuItem[] = [];\n\n private initTopBarSubscription: Subscription | null = null;\n\n currentUser: UserBase;\n userProfilePath: string;\n avatarLabel: string;\n showProfileIcon = false;\n\n @ViewChild('topbarmenu') menu!: ElementRef;\n\n @ViewChild('topbarprofiledropdownmenubutton')\n topbarProfileDropdownMenuButton!: ElementRef;\n\n constructor(\n public layoutService: LayoutServiceBase,\n private authService: AuthServiceBase,\n protected router: Router,\n private translocoService: TranslocoService,\n public config: ConfigServiceBase,\n ) {}\n\n async ngOnInit() {\n if (this.menuItems.length === 0) {\n this.menuItems = [\n {\n label: this.translocoService.translate('YourProfile'),\n icon: 'pi-user',\n showSeparator: true,\n onClick: () => {\n this.routeToUserPage();\n },\n },\n {\n label: this.translocoService.translate('Logout'),\n icon: 'pi-sign-out',\n showSeparator: true,\n onClick: () => {\n this.authService.logout();\n },\n },\n ];\n }\n\n this.router.events\n .pipe(filter((event) => event instanceof NavigationEnd))\n .subscribe((event: NavigationEnd) => {\n this.layoutService.state.profileDropdownSidebarVisible = false;\n });\n\n this.onAfterNgOnInit();\n }\n\n onAfterNgOnInit = () => {\n this.initTopBarSubscription = this.layoutService\n .initTopBarData()\n .subscribe((initTopBarData) => {\n this.userProfilePath = initTopBarData.userProfilePath;\n this.showProfileIcon = initTopBarData.showProfileIcon;\n this.currentUser = initTopBarData.currentUser;\n this.avatarLabel = initTopBarData.currentUser?.email\n .charAt(0)\n .toLocaleUpperCase();\n });\n };\n\n onDocumentClick(event: any) {\n if (!this.menu.nativeElement.contains(event.target)) {\n if (this.layoutService.state.profileDropdownSidebarVisible == true) {\n this.layoutService.state.profileDropdownSidebarVisible = false;\n }\n }\n }\n\n routeToUserPage() {\n if (this.routeOnLargeProfileAvatarClick) {\n this.router.navigateByUrl(this.userProfilePath);\n }\n }\n\n loginButtonClick() {\n if (this.routeToLoginPage) {\n this.router.navigateByUrl(this.config.loginSlug);\n }\n\n this.onLoginButtonClick.next(null);\n }\n\n ngOnDestroy(): void {\n if (this.initTopBarSubscription) {\n this.initTopBarSubscription.unsubscribe();\n }\n }\n}\n\nexport interface ProfileAvatarModalMenuItem {\n label?: string;\n icon?: string;\n showSeparator?: boolean;\n onClick?: () => void;\n}\n","<ng-container *transloco=\"let t\">\n <div *ngIf=\"this.currentUser != null\" #topbarmenu>\n <div\n #topbarprofiledropdownmenubutton\n (click)=\"layoutService.showProfileDropdownSidebar()\"\n >\n <p-avatar\n *ngIf=\"showProfileIcon\"\n [label]=\"avatarLabel\"\n [style]=\"{\n 'background-color': 'var(--p-primary-color)',\n color: '#fff',\n cursor: 'pointer',\n width: '34px',\n height: '34px',\n 'font-size': '21px',\n }\"\n />\n </div>\n <div #topbarprofiledropdownmenu (document:click)=\"onDocumentClick($event)\">\n <div\n *ngIf=\"layoutService.state.profileDropdownSidebarVisible\"\n style=\"\n width: 280px;\n position: absolute;\n padding: 15px;\n background: var(--p-content-background);\n \"\n class=\"card\"\n [ngClass]=\"{\n 'side-menu-profile-dialog': isSideMenuLayout,\n 'top-menu-profile-dialog': !isSideMenuLayout,\n }\"\n >\n <div\n style=\"\n display: flex;\n flex-direction: column;\n justify-content: center;\n text-align: center;\n gap: 10px;\n \"\n >\n <p-avatar\n [label]=\"avatarLabel\"\n size=\"xlarge\"\n [style]=\"{\n 'background-color': 'var(--p-primary-color)',\n color: '#fff',\n margin: 'auto',\n cursor: routeOnLargeProfileAvatarClick ? 'pointer' : '',\n }\"\n (click)=\"routeToUserPage()\"\n />\n <div style=\"font-size: 15px\">{{ currentUser?.email }}</div>\n </div>\n <div style=\"margin-top: 15px\">\n <div\n *ngFor=\"let item of menuItems\"\n [style]=\"item.showSeparator ? 'margin-top: 5px;' : ''\"\n >\n <div *ngIf=\"item.showSeparator\" class=\"gray-separator\"></div>\n <div\n (click)=\"item.onClick()\"\n class=\"hover-card\"\n style=\"\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 5px;\n \"\n >\n <i\n class=\"pi pi-fw {{ item.icon }}\"\n style=\"font-size: 16px; position: relative\"\n ></i>\n <div style=\"font-size: 15px\">{{ item.label }}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"this.currentUser == null && this.showLoginButton\">\n <spiderly-button\n [label]=\"t('Login')\"\n (onClick)=\"loginButtonClick()\"\n icon=\"pi pi-sign-in\"\n [outlined]=\"loginButtonOutlined\"\n [severity]=\"loginButtonSeverity\"\n [size]=\"loginButtonSize\"\n ></spiderly-button>\n </div>\n</ng-container>\n","import { ConfigServiceBase } from '../../../services/config.service.base';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { NavigationEnd, Router, RouterModule } from '@angular/router';\nimport { Component, ElementRef, ViewChild } from '@angular/core';\nimport { filter } from 'rxjs';\nimport { LayoutServiceBase } from '../../../services/app-layout.service.base';\nimport { CommonModule } from '@angular/common';\nimport { AvatarModule } from 'primeng/avatar';\nimport { BadgeModule } from 'primeng/badge';\nimport { ProfileAvatarComponent } from '../profile-avatar/profile-avatar.component';\n\n@Component({\n selector: 'spiderly-sidemenu-topbar',\n templateUrl: './sidemenu-topbar.component.html',\n imports: [\n CommonModule,\n RouterModule,\n AvatarModule,\n BadgeModule,\n ProfileAvatarComponent,\n ],\n})\nexport class SideMenuTopBarComponent {\n companyName = this.config.companyName;\n @ViewChild('menubutton') menuButton!: ElementRef;\n\n constructor(\n public layoutService: LayoutServiceBase,\n protected router: Router,\n private config: ConfigServiceBase,\n private translocoService: TranslocoService,\n ) {}\n\n async ngOnInit() {\n this.router.events\n .pipe(filter((event) => event instanceof NavigationEnd))\n .subscribe((event: NavigationEnd) => {\n this.layoutService.state.profileDropdownSidebarVisible = false;\n });\n }\n}\n","<div class=\"layout-topbar\">\n <a class=\"layout-topbar-logo\" routerLink=\"/\">\n <span>{{ companyName?.toLocaleUpperCase() }}</span>\n </a>\n\n <button\n #menubutton\n class=\"p-link layout-menu-button layout-topbar-button\"\n (click)=\"layoutService.onMenuToggle()\"\n >\n <i class=\"pi pi-bars\"></i>\n </button>\n\n <div class=\"profile-button\">\n <spiderly-profile-avatar></spiderly-profile-avatar>\n </div>\n</div>\n","import { ConfigServiceBase } from '../../../services/config.service.base';\nimport { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule } from '@angular/router';\nimport { AvatarModule } from 'primeng/avatar';\nimport { ProfileAvatarComponent } from '../profile-avatar/profile-avatar.component';\nimport { MenubarModule } from 'primeng/menubar';\nimport { SpiderlyMenuItem } from '../sidebar/sidebar-menu.component';\nimport { AuthServiceBase } from '../../../services/auth.service.base';\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'spiderly-topbar',\n templateUrl: './topbar.component.html',\n styleUrl: './topbar.component.scss',\n imports: [\n CommonModule,\n RouterModule,\n MenubarModule,\n AvatarModule,\n ProfileAvatarComponent,\n ],\n})\nexport class TopBarComponent {\n @Input() menu: SpiderlyMenuItem[] = [];\n companyName = this.config.companyName;\n logoPath = this.config.logoPath;\n /**\n * Determines whether to show background color on hover\n * for root menu items. Defaults to `false`.\n */\n @Input() showHoverBgOnRootItems: boolean = false;\n\n private permissionSubscription: Subscription | null = null;\n\n constructor(\n private authService: AuthServiceBase,\n private config: ConfigServiceBase,\n ) {}\n\n ngOnInit() {\n this.permissionSubscription =\n this.authService.currentUserPermissionCodes$.subscribe(\n (currentUserPermissionCodes: string[]) => {\n this.hideMenuItemsBasedOnPermissions(\n this.menu,\n currentUserPermissionCodes,\n );\n },\n );\n }\n\n hideMenuItemsBasedOnPermissions = (\n menu: SpiderlyMenuItem[],\n currentUserPermissionCodes: string[],\n ) => {\n menu.forEach((menuItem) => {\n if (menuItem.items) {\n this.hideMenuItemsBasedOnPermissions(\n menuItem.items,\n currentUserPermissionCodes,\n );\n }\n if (typeof menuItem.hasPermission === 'function') {\n menuItem.visible =\n menuItem.hasPermission(currentUserPermissionCodes) ?? false;\n }\n });\n };\n\n ngOnDestroy() {\n if (this.permissionSubscription) {\n this.permissionSubscription.unsubscribe();\n }\n }\n}\n","<div class=\"topbar-wrapper\">\n <nav\n class=\"topbar {{\n showHoverBgOnRootItems ? '' : 'show-hover-bg-on-root-items'\n }}\"\n >\n <p-menubar [model]=\"menu\" [style]=\"{ border: '0' }\">\n <ng-template #start>\n <img\n style=\"margin-left: 11px; cursor: pointer\"\n width=\"45\"\n height=\"45\"\n routerLink=\"/\"\n [src]=\"logoPath\"\n alt=\"Logo\"\n />\n </ng-template>\n <ng-template #end>\n <div\n style=\"\n margin-right: 11px;\n display: flex;\n gap: 10px;\n align-items: center;\n position: relative;\n \"\n >\n <div>\n <ng-content select=\"[ACTIONS]\"></ng-content>\n </div>\n <spiderly-profile-avatar\n [isSideMenuLayout]=\"false\"\n ></spiderly-profile-avatar>\n </div>\n </ng-template>\n </p-menubar>\n </nav>\n</div>\n","import {\n Component,\n ElementRef,\n Input,\n OnDestroy,\n Renderer2,\n ViewChild,\n} from '@angular/core';\nimport { NavigationEnd, Router, RouterModule } from '@angular/router';\nimport { filter, Subscription } from 'rxjs';\nimport { AppSidebarComponent } from './sidebar/sidebar.component';\nimport { SideMenuTopBarComponent } from './sidemenu-topbar/sidemenu-topbar.component';\nimport { LayoutServiceBase } from '../../services/app-layout.service.base';\nimport { SpiderlyMenuItem } from './sidebar/sidebar-menu.component';\nimport { CommonModule } from '@angular/common';\nimport { TopBarComponent } from './topbar/topbar.component';\n\n@Component({\n selector: 'spiderly-layout',\n templateUrl: './layout.component.html',\n imports: [\n CommonModule,\n RouterModule,\n AppSidebarComponent,\n SideMenuTopBarComponent,\n TopBarComponent,\n ],\n})\nexport class SpiderlyLayoutComponent implements OnDestroy {\n @Input() menu: SpiderlyMenuItem[] = [];\n sideMenu: SpiderlyMenuItem[] = [];\n topMenu: SpiderlyMenuItem[] = [];\n @Input() isSideMenuLayout: boolean = true;\n /**\n * Determines whether to show background color on hover\n * for root top menu items. Defaults to `false`.\n */\n @Input() showHoverBgOnRootTopMenuItems: boolean = false;\n\n /**\n * default max-width for the main content area.\n */\n\n @Input() maxWidth: string = '1100px';\n\n overlayMenuOpenSubscription: Subscription;\n\n menuOutsideClickListener: any;\n\n profileMenuOutsideClickListener: any;\n\n @ViewChild(AppSidebarComponent) appSidebar!: AppSidebarComponent;\n\n @ViewChild(SideMenuTopBarComponent) sidemenuTopbar!: SideMenuTopBarComponent;\n\n @ViewChild('topbarmenu') topbarmenu!: ElementRef;\n\n constructor(\n protected layoutService: LayoutServiceBase,\n protected renderer: Renderer2,\n protected router: Router,\n ) {\n this.overlayMenuOpenSubscription =\n this.layoutService.overlayOpen$.subscribe(() => {\n if (!this.menuOutsideClickListener) {\n this.menuOutsideClickListener = this.renderer.listen(\n 'document',\n 'click',\n (event) => {\n const isOutsideClicked = !(\n this.appSidebar?.el.nativeElement.isSameNode(event.target) ||\n this.appSidebar?.el.nativeElement.contains(event.target) ||\n this.sidemenuTopbar?.menuButton?.nativeElement.isSameNode(\n event.target,\n ) ||\n this.sidemenuTopbar?.menuButton?.nativeElement.contains(\n event.target,\n ) ||\n event.target.closest('.p-autocomplete-items') ||\n event.target.closest('.p-autocomplete-clear-icon')\n );\n\n if (isOutsideClicked) {\n this.hideMenu();\n }\n },\n );\n }\n\n if (!this.profileMenuOutsideClickListener) {\n this.profileMenuOutsideClickListener = this.renderer.listen(\n 'document',\n 'click',\n (event) => {\n const isOutsideClicked = !(\n this.topbarmenu?.nativeElement.isSameNode(event.target) ||\n this.topbarmenu?.nativeElement.contains(event.target)\n );\n\n if (isOutsideClicked) {\n this.hideProfileMenu();\n }\n },\n );\n }\n\n if (this.layoutService.state.staticMenuMobileActive) {\n this.blockBodyScroll();\n }\n });\n\n this.router.events\n .pipe(filter((event) => event instanceof NavigationEnd))\n .subscribe(() => {\n this.hideMenu();\n this.hideProfileMenu();\n });\n }\n\n ngOnInit() {\n if (this.isSideMenuLayout) {\n this.sideMenu = [...this.menu];\n } else {\n this.topMenu = [...this.menu[0].items];\n }\n }\n\n hideMenu() {\n this.layoutService.state.overlayMenuActive = false;\n this.layoutService.state.staticMenuMobileActive = false;\n this.layoutService.state.menuHoverActive = false;\n if (this.menuOutsideClickListener) {\n this.menuOutsideClickListener();\n this.menuOutsideClickListener = null;\n }\n this.unblockBodyScroll();\n }\n\n hideProfileMenu() {\n this.layoutService.state.profileSidebarVisible = false;\n if (this.profileMenuOutsideClickListener) {\n this.profileMenuOutsideClickListener();\n this.profileMenuOutsideClickListener = null;\n }\n }\n\n blockBodyScroll(): void {\n if (document.body.classList) {\n document.body.classList.add('blocked-scroll');\n } else {\n document.body.className += ' blocked-scroll';\n }\n }\n\n unblockBodyScroll(): void {\n if (document.body.classList) {\n document.body.classList.remove('blocked-scroll');\n } else {\n document.body.className = document.body.className.replace(\n new RegExp(\n '(^|\\\\b)' + 'blocked-scroll'.split(' ').join('|') + '(\\\\b|$)',\n 'gi',\n ),\n ' ',\n );\n }\n }\n\n get containerClass() {\n return {\n 'layout-theme-light':\n this.layoutService.layoutConfig.colorScheme === 'light',\n 'layout-theme-dark':\n this.layoutService.layoutConfig.colorScheme === 'dark',\n 'layout-overlay': this.layoutService.layoutConfig.menuMode === 'overlay',\n 'layout-static': this.layoutService.layoutConfig.menuMode === 'static',\n 'layout-static-inactive':\n this.layoutService.state.staticMenuDesktopInactive &&\n this.layoutService.layoutConfig.menuMode === 'static',\n 'layout-overlay-active': this.layoutService.state.overlayMenuActive,\n 'layout-mobile-active': this.layoutService.state.staticMenuMobileActive,\n 'p-input-filled': this.layoutService.layoutConfig.inputStyle === 'filled',\n 'p-ripple-disabled': !this.layoutService.layoutConfig.ripple,\n };\n }\n\n ngOnDestroy() {\n if (this.overlayMenuOpenSubscription) {\n this.overlayMenuOpenSubscription.unsubscribe();\n }\n\n if (this.menuOutsideClickListener) {\n this.menuOutsideClickListener();\n }\n\n this.onAfterNgDestroy();\n }\n\n onAfterNgDestroy = () => {};\n}\n","<div *ngIf=\"isSideMenuLayout\" class=\"layout-wrapper\" [ngClass]=\"containerClass\">\n <spiderly-sidemenu-topbar></spiderly-sidemenu-topbar>\n <div class=\"layout-sidebar\">\n <sidebar [menu]=\"sideMenu\"></sidebar>\n </div>\n <div class=\"layout-main-container\">\n <div class=\"layout-main\">\n <router-outlet></router-outlet>\n </div>\n </div>\n <div class=\"layout-mask\"></div>\n</div>\n\n<div *ngIf=\"isSideMenuLayout === false\">\n <spiderly-topbar\n [menu]=\"topMenu\"\n [showHoverBgOnRootItems]=\"showHoverBgOnRootTopMenuItems\"\n >\n <ng-content ACTIONS select=\"[ACTIONS]\"></ng-content>\n </spiderly-topbar>\n <main [style.max-width]=\"maxWidth\" style=\"margin: auto; padding: 18px\">\n <router-outlet></router-outlet>\n </main>\n</div>\n","import { Component } from '@angular/core';\nimport { ConfigServiceBase } from '../../services/config.service.base';\nimport { RouterModule } from '@angular/router';\nimport { ButtonModule } from 'primeng/button';\n\n@Component({\n selector: 'not-found',\n templateUrl: './not-found.component.html',\n imports: [RouterModule, ButtonModule],\n})\nexport class NotFoundComponent {\n companyName = this.config.companyName;\n logoPath: string = this.config.logoPath;\n\n constructor(private config: ConfigServiceBase) {}\n}\n","<div class=\"flex min-h-screen overflow-hidden\" style=\"padding: 20px\">\n <div class=\"flex flex-col w-full\">\n <div\n class=\"w-full sm:w-[30rem]\"\n style=\"\n margin: auto;\n border-radius: 50px;\n padding: 0.3rem;\n background: linear-gradient(\n 180deg,\n var(--p-primary-color) 10%,\n rgba(33, 150, 243, 0) 30%\n );\n \"\n >\n <div class=\"surface-card py-12 px-8 sm:px-12\" style=\"border-radius: 45px\">\n <div class=\"text-center\">\n <img\n [src]=\"logoPath\"\n alt=\"{{ companyName }} Logo\"\n title=\"{{ companyName }} Logo\"\n height=\"60\"\n class=\"mb-6\"\n />\n </div>\n <h1 class=\"mb-6\">\n <div class=\"font-bold text-5xl lg:text-6xl spiderly-gradient-title\">\n 404\n </div>\n <div class=\"font-bold text-5xl lg:text-6xl\">Page Not Found</div>\n </h1>\n <div class=\"text-gray-600 text-lg mb-8\">\n The page you're looking for doesn't exist or has been moved. Let's get\n you back on track.\n </div>\n <div>\n <p-button [routerLink]=\"['/']\" label=\"Go to Homepage\"></p-button>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ButtonModule } from 'primeng/button';\nimport { SplitButtonModule } from 'primeng/splitbutton';\n\nimport { MenuItem } from 'primeng/api';\nimport { SpiderlyButtonBaseComponent } from '../spiderly-button-base/spiderly-button-base';\n\n@Component({\n selector: 'spiderly-split-button',\n templateUrl: './spiderly-split-button.component.html',\n styles: [],\n imports: [CommonModule, ButtonModule, SplitButtonModule],\n})\nexport class SpiderlySplitButtonComponent extends SpiderlyButtonBaseComponent {\n @Input() dropdownItems: MenuItem[];\n}\n","<p-splitButton\n (onClick)=\"handleClick($event)\"\n [label]=\"label\"\n [icon]=\"icon\"\n [outlined]=\"outlined\"\n [styleClass]=\"styleClass\"\n [severity]=\"severity\"\n [rounded]=\"rounded\"\n [style]=\"style\"\n [class]=\"class\"\n [disabled]=\"disabled\"\n [model]=\"dropdownItems\"\n>\n <ng-content></ng-content>\n</p-splitButton>\n","import { Directive, Input, TemplateRef } from '@angular/core';\n// Type-only, so it is erased at build time and the component <-> directive cycle never exists at\n// runtime.\nimport type { Column } from '../components/spiderly-data-table/spiderly-data-table.component';\n\n/**\n * Context handed to a cell template. Read the row with `let-row`, the rest by name\n * (`let-value=\"value\"`, `let-displayValue=\"displayValue\"`, `let-col=\"col\"`).\n *\n * `value` and `displayValue` mean here exactly what they mean on `CellClickEvent`, the other seam\n * this component hands a cell to — raw and formatted respectively. One column can use both\n * (a click handler and a template), so they must not disagree.\n */\nexport interface CellTemplateContext<T = any> {\n /** The full row object the cell belongs to. */\n $implicit: T;\n /** The raw cell value, `row[col.field]`. */\n value: any;\n /**\n * What the table would have rendered — the value formatted for the column's `filterType` and\n * the app's `LOCALE_ID` (dates, numbers, Yes/No). A template that only adds something around\n * the value never has to re-implement that formatting.\n */\n displayValue: string;\n /** The column being rendered. */\n col: Column<T>;\n}\n\n/**\n * Renders the cells of ONE column of a `spiderly-data-table`, replacing the plain formatted\n * value. Bind it to the column's `field`; columns with no matching template keep the built-in\n * rendering, so a table opts in one column at a time.\n *\n * Consumer guide (context, what it does and does not replace, when to prefer it over\n * `onCellClick`): the `angular-customization` doc, \"Custom Cell Content\".\n */\n@Directive({\n selector: 'ng-template[spiderlyCellTemplate]',\n})\nexport class SpiderlyCellTemplateDirective<T = any> {\n /** The `field` of the column whose cells this template renders. */\n @Input('spiderlyCellTemplate') field: string;\n\n constructor(public readonly template: TemplateRef<CellTemplateContext<T>>) {}\n\n /**\n * Without this the `let-` variables are `any` at every consumer, however well\n * {@link CellTemplateContext} is declared — a directive's injected `TemplateRef<C>` never\n * reaches the template that declares it. Same mechanism as `SpiderlyTemplateTypeDirective`.\n */\n static ngTemplateContextGuard<T>(\n dir: SpiderlyCellTemplateDirective<T>,\n ctx: unknown,\n ): ctx is CellTemplateContext<T> {\n return true;\n }\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Marks an `<ng-template>` projected into `spiderly-data-table` as custom toolbar\n * content. The template is rendered in the table's caption action area, ahead of the\n * built-in Clear Filters / Export to Excel / Reload / Delete Selected buttons, so its\n * position stays stable regardless of selection state.\n *\n * The projected template binds to the consumer component (so `(click)` handlers call\n * the consumer's methods), and inherits the action row's spacing and responsive\n * stacking. No table state is passed as context — read it via the table's outputs\n * (`onLazyLoad`, `onTotalRecordsChange`, `onRowSelect`) when needed.\n *\n * @example\n * ```html\n * <spiderly-data-table [cols]=\"cols\" [getPaginatedListObservableMethod]=\"...\">\n * <ng-template spiderlyDataTableActions>\n * <button pButton class=\"p-button-outlined\" style=\"flex: none\"\n * icon=\"pi pi-check\" [label]=\"t('ApproveAll')\" (click)=\"approveAll()\"></button>\n * </ng-template>\n * </spiderly-data-table>\n * ```\n */\n@Directive({\n selector: '[spiderlyDataTableActions]',\n})\nexport class SpiderlyDataTableActionsDirective {}\n","import { Directive, ElementRef, NgZone, OnDestroy, inject } from '@angular/core';\n\n/**\n * Puts a native `title` on an element while its text is clipped — measured when the pointer\n * arrives, which is the only moment a native title can surface.\n *\n * The data table clamps a default cell to one line (see the `.cell-text` rule), which hides the\n * value and, before this, offered nothing to read it with — the reason PACMS hand-added `[title]`\n * on four cells of one grid. Wrapping the column is a choice someone makes; this covers the\n * default nobody touched.\n *\n * Native `title`, never `pTooltip`: it needs a deliberate hover rather than firing as the cursor\n * crosses a dense list, which is what got the SKU tooltip removed.\n *\n * **Measured on hover, not watched.** The first shape ran `ngAfterViewChecked` on every instance\n * every change-detection cycle (reading `textContent`, which allocates a fresh string each call)\n * and gave each instance its OWN `ResizeObserver`. On a 100-row grid nineteen columns wide that is\n * ~1900 hooks per cycle and ~1900 observers in Chrome's per-frame loop — all to decide something\n * that can only ever be seen one cell at a time. Hover is exactly-in-time, costs nothing until it\n * happens, and needs no separate handling for a column drag or a resized window: the next hover\n * re-measures. Nothing is lost for a screen reader either — CSS clipping never hid the text from\n * the accessibility tree, so the title was only ever a sighted-hover affordance.\n */\n@Directive({\n selector: '[spiderlyOverflowTitle]',\n})\nexport class SpiderlyOverflowTitleDirective implements OnDestroy {\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly zone = inject(NgZone);\n\n private readonly onPointerEnter = () => this.sync();\n\n constructor() {\n // Outside the zone: it sets an attribute and touches no bound state, so waking change\n // detection on every cell the cursor crosses would be pure cost.\n this.zone.runOutsideAngular(() =>\n this.el.nativeElement.addEventListener(\n 'pointerenter',\n this.onPointerEnter,\n ),\n );\n }\n\n ngOnDestroy(): void {\n this.el.nativeElement.removeEventListener(\n 'pointerenter',\n this.onPointerEnter,\n );\n }\n\n private sync(): void {\n const el = this.el.nativeElement;\n\n // A one-pixel slack: sub-pixel text metrics make scrollWidth exceed clientWidth by fractions\n // on text that visibly fits, which would title half the grid.\n if (el.scrollWidth - el.clientWidth > 1) {\n el.setAttribute('title', el.textContent ?? '');\n } else {\n el.removeAttribute('title');\n }\n }\n}\n","import { Directive, Input, TemplateRef } from '@angular/core';\n// Type-only, so it is erased at build time and the component <-> directive cycle never exists at\n// runtime.\nimport type { FilterHandle } from '../filters/filter-store';\n\n/**\n * Context handed to a filter template: the filter's handle, and nothing else it does not already\n * carry. Read it with `let-f` and drive the filter through it — `f.value()` is the draft the\n * control shows, `f.set(...)` writes one, `f.commit()` applies it.\n */\nexport interface FilterTemplateContext {\n $implicit: FilterHandle;\n}\n\n/**\n * Renders the editor for ONE filter of a `spiderly-data-table`'s bar, replacing the control the\n * bar would have drawn for that filter's kind. Bind it to the filter's id; filters with no\n * matching template keep the built-in control, so a table opts in one filter at a time.\n *\n * This is the narrow job the directive has. Placing a filter ANYWHERE else — a drawer, a modal,\n * a header cell — needs no directive at all: `store.get(id)` returns the same handle and depends\n * on nothing in the component tree, which is why the store is the consumer's to own.\n */\n@Directive({\n selector: 'ng-template[spiderlyFilterTemplate]',\n})\nexport class SpiderlyFilterTemplateDirective {\n /** The id of the filter whose control this template renders. */\n @Input('spiderlyFilterTemplate') filterId: string;\n\n constructor(public readonly template: TemplateRef<FilterTemplateContext>) {}\n\n /**\n * Without this the `let-` variable is `any` at every consumer, however well the context is\n * declared — a directive's injected `TemplateRef<C>` never reaches the template that declares\n * it. Same mechanism as `SpiderlyCellTemplateDirective`.\n */\n static ngTemplateContextGuard(\n dir: SpiderlyFilterTemplateDirective,\n ctx: unknown,\n ): ctx is FilterTemplateContext {\n return true;\n }\n}\n","import { CommonModule, formatDate } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport {\n Component,\n computed,\n inject,\n input,\n LOCALE_ID,\n output,\n QueryList,\n signal,\n TemplateRef,\n} from '@angular/core';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { SortMeta } from 'primeng/api';\nimport { ButtonModule } from 'primeng/button';\nimport { CheckboxModule } from 'primeng/checkbox';\nimport { DatePickerModule } from 'primeng/datepicker';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { MultiSelectModule } from 'primeng/multiselect';\nimport { PopoverModule } from 'primeng/popover';\nimport { SelectModule } from 'primeng/select';\n\nimport { SpiderlyFilterTemplateDirective } from '../directives/spiderly-filter-template.directive';\nimport { MatchModeCodes } from '../enums/match-mode-enum-codes';\nimport { FilterValueKind } from './allowed-operators';\nimport {\n AppliedFilter,\n FilterBarSource,\n FilterHandle,\n FilterOption,\n SortKeyLabel,\n SortPickOption,\n} from './filter-store';\n\n/** One option's word for one value — the honest raw value when no option matches (failed lookup). */\nfunction spellOptionValue(\n options: FilterOption[] | undefined,\n value: unknown,\n): string {\n return String(options?.find((option) => option.value === value)?.label ?? value);\n}\n\n/**\n * Lowercased and stripped of diacritics for matching. NFD decomposition handles č/ć/š/ž, but NOT\n * đ — it is its own letter (U+0111), not a d carrying a mark, so it decomposes to nothing and has\n * to be mapped by hand.\n *\n * It maps to \"dj\", which is what the rest of this workspace already does (pa-cms's\n * `normalizePlaceQuery` and `toAscii`, the backend's `PlaceNameNormalizer`) and what someone\n * without a Serbian layout actually types. Mapping it to \"d\" — as this first shipped — folds\n * \"Đorđe\" to \"dorde\", so typing \"djordje\" finds nothing: the exact case the comment claimed to\n * fix, and one no spec covered because the test used \"drzava\", which has no đ in it.\n */\nexport function foldForSearch(value: string): string {\n return value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\u0111/g, 'dj')\n .replace(/\\u0110/g, 'Dj')\n .toLowerCase()\n .trim();\n}\n\n/**\n * The visible home of every applied constraint. This is what licenses a hidden column keeping its\n * filter: the header is no longer the only place a filter can be seen, so hiding a column stops\n * meaning \"silently drop what it was filtering by\".\n *\n * Everything drawn here comes from `applied()`, never from a draft — a chip over a half-typed\n * value would repeat the mistake the header's filter icon shipped, claiming the grid is narrowed\n * while it still shows every row.\n */\n@Component({\n selector: 'spiderly-filter-bar',\n imports: [\n CommonModule,\n FormsModule,\n TranslocoDirective,\n ButtonModule,\n CheckboxModule,\n DatePickerModule,\n InputTextModule,\n MultiSelectModule,\n PopoverModule,\n SelectModule,\n ],\n styleUrl: 'spiderly-filter-bar.component.scss',\n template: `\n <ng-container *transloco=\"let t\">\n <div class=\"filter-bar\" data-testid=\"filter-bar\">\n @for (chip of filters().applied(); track chip.id) {\n <span class=\"filter-chip\" data-testid=\"filter-chip\">\n <!-- The chip body reopens the filter. Once applied it is no longer offered under\n \"+ Filter\", so without this the only way to narrow Elektromont to Elektro is to\n delete the filter and rebuild it. -->\n <button\n type=\"button\"\n class=\"filter-chip-edit\"\n data-testid=\"filter-chip-edit\"\n (click)=\"startEditing(chip.id)\"\n >\n <!-- &ngsp; is a space the template parser keeps. Angular collapses whitespace\n between elements by default, which glued these three into\n \"FirmacontainsElektromont\" — how a screen reader reads the chip and how it\n lands when copied, not merely how the spec saw it. The flex gap only spaced\n them visually. -->\n <span class=\"filter-chip-label\">{{ chip.label }}</span>&ngsp;\n <span class=\"filter-chip-operator\">{{\n t(chip.operatorPhraseKey)\n }}</span>&ngsp;\n <span class=\"filter-chip-value\">{{\n chip.kind === 'boolean'\n ? chip.value\n ? t('Yes')\n : t('No')\n : chipValue(chip)\n }}</span>\n </button>\n <button\n type=\"button\"\n class=\"filter-chip-remove\"\n data-testid=\"filter-chip-remove\"\n [attr.aria-label]=\"t('RemoveFilter')\"\n (click)=\"filters().reset(chip.id)\"\n >\n ×\n </button>\n </span>\n }\n\n @if (sortOptions().length) {\n <!-- The chip is the PICKER's trigger (2026-09-06, grilled) — Polaris's always-present\n SortButton, in the slot the read-only chip held. Always rendered, sorted or not:\n with the trigger only on an active sort, an unsorted grid would have no way to\n sort by a hidden column, which is the capability the picker exists for. It\n replaced a read-only chip whose stated rationale (\"an x would lie — the default\n snaps back\") inverted the day a viewed table had no default: the operator was\n left with an inherited sort, no chip x, no clear button, and the one header that\n could un-sort it hidden. -->\n <button\n type=\"button\"\n class=\"sort-chip\"\n data-testid=\"sort-chip\"\n [attr.aria-expanded]=\"isSortOpen()\"\n (click)=\"sortMenu.toggle($event); isSortOpen.set(!isSortOpen())\"\n >\n <ng-container *ngTemplateOutlet=\"sortChipBody\"></ng-container>\n <i class=\"pi pi-chevron-down sort-chip-caret\" aria-hidden=\"true\"></i>\n </button>\n } @else if (sort().length) {\n <!-- No options handed over — the chip stays what it was: one read-only place naming\n the ordering and which key is primary. -->\n <span class=\"sort-chip\" data-testid=\"sort-chip\">\n <ng-container *ngTemplateOutlet=\"sortChipBody\"></ng-container>\n </span>\n }\n\n <!-- One home for the chip's sentence, whichever element renders it — the read-only\n branch never reaches the @else (it is gated on sort().length). -->\n <ng-template #sortChipBody>\n @if (sort().length) {\n <span class=\"sort-chip-label\">{{ t('SortedBy') }}</span>\n @for (key of sort(); track key.field; let last = $last) {\n <span class=\"sort-chip-key\"\n >{{ key.label }} {{ key.descending ? '↓' : '↑' }}{{\n last ? '' : ','\n }}</span\n >\n }\n } @else {\n <span class=\"sort-chip-label\">{{ t('Sort') }}</span>\n }\n </ng-template>\n\n @if (totalRecords() !== null) {\n <!-- What came back, next to the chips that say what was asked. An empty grid under a\n filter is otherwise a mystery. The CURRENT query's count only: the unfiltered total\n would cost a second request the paginator does not offer. -->\n <span class=\"filter-bar-count\" data-testid=\"filter-bar-count\">{{\n t('ResultCount', { count: totalRecords() })\n }}</span>\n }\n\n @if (addable().length) {\n <!-- A popover, not an inline list. Seven filters already fill the toolbar row inline,\n and the orders grid declares nineteen — they would wrap into three lines and shove\n the table down the page. Shopify's Filters component opens its \"more filters\" the\n same way. The teleport into document.body costs the specs a container lookup; that\n cost belongs to the tests, not to the operator. -->\n <button\n pButton\n type=\"button\"\n class=\"p-button-text p-button-sm filter-add\"\n icon=\"pi pi-plus\"\n [label]=\"t('AddFilter')\"\n data-testid=\"add-filter\"\n [attr.aria-expanded]=\"isAddOpen()\"\n (click)=\"addMenu.toggle($event); isAddOpen.set(!isAddOpen())\"\n ></button>\n }\n\n @if (filters().applied().length) {\n <!-- The bar owns clearing now: the toolbar's button sat a row away from the chips it\n cleared, which is two affordances for one job. Emits rather than clearing the store\n itself, because whoever owns the query owns the requery and the persisted snapshot\n that follow a clear. Filters only — sort is its own channel (the picker above). -->\n <button\n pButton\n type=\"button\"\n class=\"p-button-text p-button-sm filter-bar-clear\"\n icon=\"pi pi-filter-slash\"\n [label]=\"t('ClearFilters')\"\n data-testid=\"filter-bar-clear\"\n (click)=\"clearAll.emit()\"\n ></button>\n }\n\n <p-popover #sortMenu (onHide)=\"isSortOpen.set(false)\">\n <div class=\"filter-add-menu\" role=\"menu\">\n @for (option of sortRows(); track option.field) {\n <!-- Click sorts ascending; clicking the already-ascending option flips it. One\n gesture, look, one gesture back — the header's cycle without needing the\n header, so a hidden column's ordering is reachable too. -->\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"filter-add-option sort-menu-option\"\n data-testid=\"sort-menu-option\"\n (click)=\"pickSort(option); sortMenu.hide()\"\n >\n <!-- &ngsp; keeps a real space between label and arrow — same collapse the\n filter chip documents: without it the copied/read text is \"Naziv↓\". -->\n <span>{{ option.label }}</span>&ngsp;\n @if (option.arrow) {\n <span class=\"sort-menu-direction\" aria-hidden=\"true\">{{\n option.arrow\n }}</span>\n }\n </button>\n }\n\n @if (!sortIsDefault()) {\n <!-- Only while there is an override to undo: at the default there is nothing to\n reset, and a row that does nothing teaches people to stop reading the menu. -->\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"filter-add-option sort-menu-reset\"\n data-testid=\"sort-menu-reset\"\n (click)=\"sortReset.emit(); sortMenu.hide()\"\n >\n {{ t('ResetSort') }}\n </button>\n }\n </div>\n </p-popover>\n\n <p-popover #addMenu (onHide)=\"isAddOpen.set(false); addSearch.set('')\">\n <div class=\"filter-add-menu\" role=\"menu\">\n <input\n pInputText\n pSize=\"small\"\n type=\"search\"\n class=\"filter-add-search\"\n data-testid=\"add-filter-search\"\n [value]=\"addSearch()\"\n [attr.aria-label]=\"t('AddFilter')\"\n [placeholder]=\"t('Search')\"\n (input)=\"addSearch.set($any($event.target).value)\"\n />\n\n @for (option of offered(); track option.id) {\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"filter-add-option\"\n data-testid=\"add-filter-option\"\n (click)=\"startEditing(option.id); addMenu.hide()\"\n >\n {{ option.label }}\n </button>\n }\n </div>\n </p-popover>\n\n </div>\n\n <!-- Its OWN ROW, directly under the chips. It used to render at the end of the bar, where\n the clear button's auto left margin pushed everything after it to the far right, so the\n control for the second filter opened across the screen from the click (Filip, on\n /tags). A popover anchored to the click was tried first and abandoned: PrimeNG's\n ng-content slot does not re-project content once the editor's @if has destroyed it, so\n reopening gave an empty container with overlayVisible true. A fixed row is predictable,\n which is the property the complaint was actually about.\n NO BACKTICKS IN THIS TEMPLATE: it is a JS template literal and one terminates it, with\n the error landing lines away. This is the second time. -->\n @if (editing(); as handle) {\n <div class=\"filter-editor\" data-testid=\"filter-editor\">\n <span class=\"filter-editor-label\">{{ handle.label }}</span>\n\n @if (handle.operators.length > 1) {\n <p-select\n size=\"small\"\n styleClass=\"filter-editor-operator\"\n data-testid=\"filter-editor-operator\"\n [options]=\"operatorChoices()\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"handle.operator() ?? handle.defaultOperator\"\n (onChange)=\"pickOperator(handle, $event.value)\"\n ></p-select>\n }\n\n @if (controlTemplateFor(handle); as projected) {\n <!-- The consumer's own control for this filter. Read the QueryList live rather than\n indexing it into a Map: a QueryList already updates itself, and a template\n declared inside a @for or an @if would go stale in a cached index. Same\n reasoning as getCellTemplate. -->\n <ng-container\n *ngTemplateOutlet=\"projected; context: { $implicit: handle }\"\n ></ng-container>\n } @else if (handle.options) {\n <p-multiSelect\n size=\"small\"\n styleClass=\"filter-editor-value\"\n data-testid=\"filter-editor-value\"\n [options]=\"handle.options\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [placeholder]=\"t('All')\"\n [ngModel]=\"handle.value()\"\n (onChange)=\"draftValue(handle, $event.value)\"\n ></p-multiSelect>\n } @else if (handle.kind === 'boolean') {\n <p-checkbox\n styleClass=\"filter-editor-value\"\n data-testid=\"filter-editor-value\"\n [binary]=\"true\"\n [ngModel]=\"handle.value() === true\"\n (onChange)=\"draftValue(handle, $event.checked)\"\n ></p-checkbox>\n } @else if (handle.kind === 'date') {\n <p-datepicker\n size=\"small\"\n styleClass=\"filter-editor-value\"\n data-testid=\"filter-editor-value\"\n [ngModel]=\"handle.value()\"\n (onSelect)=\"draftValue(handle, $event)\"\n ></p-datepicker>\n } @else if (handle.kind === 'text' || handle.kind === 'number') {\n <!-- A DOM control's raw value is always a string. It is coerced on the way into\n the store (see coerce), which is the one place the value type can be got\n right. Backticks are forbidden in this template: it is a JS template literal\n and one terminates it, with the error landing lines away. -->\n <input\n pInputText\n pSize=\"small\"\n [type]=\"handle.kind === 'number' ? 'number' : 'text'\"\n class=\"filter-editor-value\"\n data-testid=\"filter-editor-value\"\n [value]=\"handle.value() ?? ''\"\n (input)=\"draft(handle, $event)\"\n />\n } @else {\n <!-- No control for this kind yet. A text box would write the wrong VALUE TYPE into\n the store, which nothing checks at runtime — the operator is checked, the value\n is not. Visibly missing beats silently wrong. -->\n <span data-testid=\"filter-editor-unsupported\">{{\n t('FilterControlNotAvailable')\n }}</span>\n }\n\n <button\n pButton\n type=\"button\"\n class=\"p-button-sm filter-editor-apply\"\n [label]=\"t('Apply')\"\n data-testid=\"filter-editor-apply\"\n (click)=\"apply(handle)\"\n ></button>\n </div>\n }\n </ng-container>\n `,\n})\nexport class SpiderlyFilterBarComponent {\n readonly filters = input.required<FilterBarSource>();\n\n /** The current query's row count, supplied by whoever owns the query. Null hides the counter. */\n readonly totalRecords = input<number | null>(null);\n\n /**\n * What the grid is ordered by, in priority order and already LABELLED — the bar knows nothing\n * about columns, so whoever owns the sort resolves the names.\n */\n readonly sort = input<SortKeyLabel[]>([]);\n\n /**\n * What the picker offers, labelled by the owner — every sortable column, HIDDEN ones\n * included (their ordering is otherwise unreachable, which is the trap the picker closes).\n * Empty keeps the chip read-only and the picker off.\n */\n readonly sortOptions = input<SortPickOption[]>([]);\n\n /** Whether the grid already sits on its default ordering — gates the reset row, nothing else. */\n readonly sortIsDefault = input(true);\n\n /** Asked for, never done here — see the button's comment. */\n readonly clearAll = output<void>();\n\n /** A single-sort ask. Multi-sort stays a header gesture (ctrl-click); the picker replaces. */\n readonly sortPick = output<SortMeta>();\n\n /** Back to the owner's default ordering — the owner knows what that resolves to, not the bar. */\n readonly sortReset = output<void>();\n\n private readonly transloco = inject(TranslocoService);\n\n /** For the chip's date wording — the same locale mechanism the table's cells format with. */\n private readonly locale = inject(LOCALE_ID);\n\n /**\n * Controls a consumer projected for specific filters, collected by whoever hosts this bar. A\n * filter with no template keeps the control the bar draws for its kind, so a table opts in one\n * filter at a time.\n */\n readonly controlTemplates = input<\n QueryList<SpiderlyFilterTemplateDirective> | undefined\n >(undefined);\n\n readonly isAddOpen = signal(false);\n\n readonly isSortOpen = signal(false);\n\n /** Cleared when the popover closes, so reopening never starts inside someone's old query. */\n readonly addSearch = signal('');\n\n /** The filter whose control is open. One at a time: the bar edits, it is not a form. */\n readonly editing = signal<FilterHandle | null>(null);\n\n /**\n * `addable` narrowed by the search box. Matching is unaccented and case-folded because that is\n * how the label gets typed: \"drzava\" for \"Država\" on any keyboard without a Serbian layout. The\n * backend's own product search is unaccented for the same reason.\n */\n readonly offered = computed(() => {\n const needle = foldForSearch(this.addSearch());\n if (!needle) return this.addable();\n\n return this.addable().filter((option) =>\n foldForSearch(option.label).includes(needle),\n );\n });\n\n /**\n * What \"+ Filter\" offers: every declared filter that is not already on the bar. Sourced from the\n * DEFINITIONS, so a filter reaches this list whether or not it has a column, and whether or not\n * that column is visible. That is the whole reason the bar exists.\n *\n * `offered: false` filters stay out — they have a dedicated control of their own on the page\n * (PACMS's order search box), so the generic entry point would give one question two homes.\n * Their chips still render: the applied list above reads no such flag.\n */\n readonly addable = computed(() => {\n const onBar = new Set(this.filters().applied().map((chip) => chip.id));\n\n return Object.entries(this.filters().definitions)\n .filter(([id, definition]) => !onBar.has(id) && definition.offered !== false)\n .map(([id, definition]) => ({ id, ...definition }));\n });\n\n /** Opens a filter's control. Where it renders, and why not a popover: the template comment. */\n startEditing(id: string): void {\n this.isAddOpen.set(false);\n this.editing.set(this.filters().get(id));\n }\n\n /**\n * The menu's rows: each option decorated with its ACTIVE direction's arrow (any key, not\n * just the primary), or null. A `computed`, not a per-row method call in the binding — the\n * popover's content is projected, so it change-detects even while closed, and a `find` per\n * option per pass is exactly what `operatorChoices` documents against.\n */\n readonly sortRows = computed(() => {\n const active = new Map(\n this.sort().map((key) => [key.field, key.descending] as const),\n );\n\n return this.sortOptions().map((option) => {\n const descending = active.get(option.field);\n return {\n ...option,\n arrow: descending == null ? null : descending ? '↓' : '↑',\n };\n });\n });\n\n /**\n * Ascending first; picking the already-ascending primary flips it. The direction is decided\n * HERE so the owner applies exactly what the menu showed — an owner guessing \"toggle\" from its\n * own state could disagree with a stale menu after a concurrent header click.\n */\n pickSort(option: SortPickOption): void {\n const primary = this.sort()[0];\n const order =\n primary?.field === option.field && !primary.descending ? -1 : 1;\n\n this.sortPick.emit({ field: option.field, order });\n }\n\n /** The raw-string controls only. Nothing reaches the bar or the query until `apply`. */\n draft(handle: FilterHandle, event: Event): void {\n this.draftValue(\n handle,\n this.coerce(handle.kind, (event.target as HTMLInputElement).value),\n );\n }\n\n controlTemplateFor(handle: FilterHandle): TemplateRef<unknown> | null {\n const match = this.controlTemplates()?.find(\n (candidate) => candidate.filterId === handle.id,\n );\n\n return match?.template ?? null;\n }\n\n /**\n * The open editor's operator options, already translated — p-select takes labels, not keys.\n *\n * A `computed`, not a method in the binding: both inputs are fixed for the life of an open\n * editor, and PrimeNG's `Select.options` setter deep-compares whatever it is handed — so a\n * freshly mapped array per change-detection pass paid for a recursive structural compare to\n * conclude nothing had changed.\n */\n readonly operatorChoices = computed(() => {\n const handle = this.editing();\n if (!handle) return [];\n\n return handle.operators.map((option) => ({\n label: this.transloco.translate(option.labelKey),\n value: option.value,\n }));\n });\n\n /**\n * The ONE write path, whatever the control. Every PrimeNG control here hands back a value of\n * the right type already — a Date from the datepicker, a boolean from the checkbox, the whole\n * array from the multiselect — so only the raw string ones need coercing, and only they go\n * through `draft`.\n */\n draftValue(handle: FilterHandle, value: unknown): void {\n handle.set({\n operator: handle.operator() ?? handle.defaultOperator,\n value,\n });\n }\n\n /**\n * Changing the direction re-commits nothing on its own — it rewrites the draft, so the operator\n * survives until Apply like the value does.\n */\n pickOperator(handle: FilterHandle, operator: MatchModeCodes): void {\n handle.set({ operator, value: handle.value() });\n }\n\n /**\n * A DOM control hands back a string; the store holds the value type the filter declared.\n *\n * The empty case is the trap and it is not symmetric: `Number('')` is 0, so an emptied number\n * box would apply a filter for zero and draw a chip over a control the operator had just\n * cleared. `NaN` is folded in for the same reason — the store's `isBlank` cannot recognise\n * either of them as \"nothing was entered\", because by then they are perfectly good numbers.\n */\n private coerce(kind: FilterValueKind, raw: string): unknown {\n if (kind !== 'number') return raw;\n if (raw.trim() === '') return null;\n\n const parsed = Number(raw);\n\n return Number.isNaN(parsed) ? null : parsed;\n }\n\n apply(handle: FilterHandle): void {\n handle.commit();\n this.editing.set(null);\n }\n\n /**\n * `In` is the multi-valued operator, so its chip reads as a list — in the OPTIONS' words, not\n * the wire's: \"Status is one of 2, 3\" narrates ids nobody chose by number. The lookup is live\n * off the definition rather than snapshotted at commit, because option lists can be filled\n * asynchronously (PACMS's admin/backend deploy race): a chip restored before the lookup answers\n * upgrades from ids to labels the moment the options land, and a failed lookup degrades to the\n * honest raw value.\n */\n chipValue(chip: AppliedFilter): string {\n // `String(date)` is the full JS toString — a GMT offset and a timezone name on a chip an\n // operator scans. Same formatDate + LOCALE_ID mechanism the table's cells use; mediumDate,\n // because shortDate's two-digit year reads badly on a chip claiming a boundary.\n if (chip.value instanceof Date) {\n return formatDate(chip.value, 'mediumDate', this.locale);\n }\n\n const options = this.filters().definitions[chip.id]?.options;\n\n return Array.isArray(chip.value)\n ? chip.value.map((value) => spellOptionValue(options, value)).join(', ')\n : spellOptionValue(options, chip.value);\n }\n}\n","import { ConfirmationService } from 'primeng/api';\nimport { Component } from '@angular/core';\nimport { DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { SpiderlyButtonComponent } from '../spiderly-buttons/spiderly-button/spiderly-button.component';\nimport { ConfirmDialogModule } from 'primeng/confirmdialog';\nimport { Observable } from 'rxjs';\n\nexport type DeleteConfirmationData =\n | {\n message: string;\n deleteItemFromTableObservableMethod: (id: number) => Observable<any>;\n id: number;\n }\n | {\n message: string;\n deleteListFromTableObservableMethod: (ids: number[]) => Observable<any>;\n ids: number[];\n };\n\n@Component({\n selector: 'spiderly-delete-confirmation',\n templateUrl: './spiderly-delete-confirmation.component.html',\n styles: [],\n imports: [SpiderlyButtonComponent, TranslocoDirective, ConfirmDialogModule],\n providers: [ConfirmationService],\n})\nexport class SpiderlyDeleteConfirmationComponent {\n constructor(\n public ref: DynamicDialogRef,\n public config: DynamicDialogConfig<DeleteConfirmationData>,\n ) {}\n\n accept() {\n const data = this.config.data;\n const observable =\n 'deleteListFromTableObservableMethod' in data\n ? data.deleteListFromTableObservableMethod(data.ids)\n : data.deleteItemFromTableObservableMethod(data.id);\n\n observable.subscribe({\n next: () => {\n this.ref.close(true); // deleted succesfully\n },\n error: () => {\n this.ref.close(false); // not deleted succesfully\n },\n });\n }\n\n reject() {\n this.ref.close(false);\n }\n}\n","<ng-container *transloco=\"let t\">\n <p-confirmDialog #cd></p-confirmDialog>\n <div\n class=\"border-b surface-border text-lg\"\n style=\"\n display: flex;\n align-items: center;\n padding-bottom: 10px;\n width: 100%;\n gap: 10px;\n \"\n >\n <i class=\"pi pi-exclamation-circle text-4xl\"></i>\n <p>{{ config.data.message }}</p>\n </div>\n\n <div\n style=\"display: flex; gap: 12px; justify-content: right; margin-top: 28px\"\n >\n <spiderly-button\n (onClick)=\"reject()\"\n icon=\"pi pi-times\"\n [label]=\"t('Cancel')\"\n severity=\"secondary\"\n ></spiderly-button>\n <spiderly-button\n (onClick)=\"accept()\"\n icon=\"pi pi-check\"\n [label]=\"t('Confirm')\"\n styleClass=\"p-button-danger\"\n ></spiderly-button>\n </div>\n</ng-container>\n","import { CommonModule, formatDate, formatNumber } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n ContentChild,\n ContentChildren,\n ElementRef,\n ErrorHandler,\n EventEmitter,\n effect,\n inject,\n Inject,\n Injector,\n Input,\n LOCALE_ID,\n NgZone,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n SimpleChanges,\n TemplateRef,\n viewChild,\n ViewChild,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { SortMeta } from 'primeng/api';\nimport { ButtonModule } from 'primeng/button';\nimport { CheckboxModule } from 'primeng/checkbox';\nimport { DialogService, DynamicDialogRef } from 'primeng/dynamicdialog';\nimport { Popover, PopoverModule } from 'primeng/popover';\nimport { Table, TableLazyLoadEvent, TableModule } from 'primeng/table';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { firstValueFrom, Observable, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { SpiderlyControlsModule } from '../../controls/spiderly-controls.module';\nimport {\n CellTemplateContext,\n SpiderlyCellTemplateDirective,\n} from '../../directives/spiderly-cell-template.directive';\nimport { SpiderlyDataTableActionsDirective } from '../../directives/spiderly-data-table-actions.directive';\nimport { SpiderlyOverflowTitleDirective } from '../../directives/spiderly-overflow-title.directive';\nimport { Filter } from '../../entities/filter';\nimport { LazyLoadSelectedIdsResult } from '../../entities/lazy-load-selected-ids-result';\nimport { PaginatedResult } from '../../entities/paginated-result';\nimport { PrimengOption } from '../../entities/primeng-option';\nimport {\n FilterSource,\n SortKeyLabel,\n SortPickOption,\n} from '../../filters/filter-store';\nimport { SpiderlyFilterTemplateDirective } from '../../directives/spiderly-filter-template.directive';\nimport { SpiderlyFilterBarComponent } from '../../filters/spiderly-filter-bar.component';\nimport { ConfigServiceBase } from '../../services/config.service.base';\nimport {\n exportListToExcel,\n firstCharToUpper,\n getHtmlImgDisplayString64,\n parseDateOnlyLocal,\n scrollElementIntoViewIfAboveViewport,\n} from '../../services/helper-functions';\nimport { SpiderlyMessageService } from '../../services/spiderly-message.service';\nimport { readStoredJson, writeStoredJson } from '../../services/web-storage';\nimport {\n DeleteConfirmationData,\n SpiderlyDeleteConfirmationComponent,\n} from '../spiderly-delete-dialog/spiderly-delete-confirmation.component';\nimport { SpiderlyFormControl } from '../spiderly-form-control/spiderly-form-control';\n\n/**\n * Default column width per value type, in rem — generous on purpose (these numbers date from when\n * the header carried a filter input, and nobody has re-derived them from values yet), and\n * {@link Column.width} is the per-column override.\n *\n * A table, not a switch, so the mapping is exhaustive: a new `filterType` fails the build here\n * instead of silently inheriting the actions-column reservation below.\n */\n/** One rem in pixels. Both the share arithmetic and the px-to-share conversion need it. */\nfunction rootFontSizePx(): number {\n return parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\n}\n\n/** Order matters: `[a, b]` and `[b, a]` ask the server for different orderings. */\nfunction sortMetaEquals(a: SortMeta[], b: SortMeta[]): boolean {\n return (\n a.length === b.length &&\n a.every((m, i) => m.field === b[i].field && m.order === b[i].order)\n );\n}\n\nconst DEFAULT_COLUMN_WIDTH_REM: Record<\n NonNullable<Column['filterType']>,\n number\n> = {\n text: 12,\n date: 10,\n multiselect: 12,\n boolean: 8,\n numeric: 12,\n // Fits the 45px thumbnail `#defaultCell` renders for a blob.\n blob: 5,\n};\n\n@Component({\n selector: 'spiderly-data-table',\n templateUrl: './spiderly-data-table.component.html',\n styleUrl: 'spiderly-data-table.component.scss',\n imports: [\n FormsModule,\n CommonModule,\n TranslocoDirective,\n SpiderlyControlsModule,\n TableModule,\n ButtonModule,\n PopoverModule,\n CheckboxModule,\n SpiderlyFilterBarComponent,\n SpiderlyOverflowTitleDirective,\n TooltipModule,\n ],\n})\nexport class SpiderlyDataTableComponent\n implements OnInit, OnChanges, AfterViewInit, OnDestroy\n{\n private readonly destroy$ = new Subject<void>();\n\n @ViewChild('dt') table: Table;\n\n private readonly injector = inject(Injector);\n private readonly zone = inject(NgZone);\n\n /**\n * The selection column's declared share. Under the fixed layout this is a RATIO, not a width.\n *\n * 4rem, down from 6: the original reserved room for a five-digit select-all counter sitting at\n * body text size beside the box, which is the widest thing it can ever hold and not what it\n * holds on any ordinary screen. The counter is a smaller step now (see the SCSS), so the same\n * five digits fit in two thirds of the space.\n */\n protected readonly selectionColumnWidth = '4rem';\n\n /**\n * The selection column's MEASURED width, which is what the frozen identity column offsets\n * itself by. Declaring `6rem` on both looked like the one-telling answer and is wrong: widths\n * are shares, so that column renders at whatever proportion of the table it gets — 148px for a\n * declared 6rem in one spec — and the identity column would sit 52px inside it, overlapping the\n * checkboxes the moment anyone scrolled. The spec caught it; nothing about the page would have.\n */\n protected frozenOffsetPx = 0;\n\n private selectionWidthObserver?: ResizeObserver;\n\n /** Aborts an in-flight column resize's document listeners, from `onUp` or from teardown. */\n private resizeAbort: AbortController | null = null;\n\n /**\n * Whether this column is pinned against the left edge. Only the FIRST column, and only when it\n * is `lockVisible`: a sticky column in the middle of the grid pins the wrong thing and leaves a\n * hole where it used to be. Once the grid scrolls sideways a row otherwise loses its identity\n * — \"Intesa, plaćeno, 12.400\" with no idea whose order it is — and NN/g's Data Tables is\n * explicit that the leftmost header column must lock in place. `lockVisible` already names\n * exactly that column in every table, so this needs no new API (CLAUDE.md -> decision 8).\n */\n isColumnFrozen(col: Column): boolean {\n return col.lockVisible === true && this.visibleCols[0] === col;\n }\n\n /**\n * The rightmost pinned cell, which carries the seam's shadow. It is the identity column when\n * there is one and the checkbox column otherwise — a fact only this side knows, which is why\n * the SCSS asking for it as `:last-of-type` drew nothing at all.\n */\n isLastFrozenColumn(col: Column): boolean {\n return this.isColumnFrozen(col);\n }\n\n get isSelectionColumnLastFrozen(): boolean {\n return !this.visibleCols.some((col) => this.isColumnFrozen(col));\n }\n\n /** A frozen column starts after the checkbox column, when there is one. */\n frozenColumnOffset(): string {\n return this.selectionMode === 'multiple' ? `${this.frozenOffsetPx}px` : '0';\n }\n\n /**\n * Tracks the selection column's rendered width. A ResizeObserver rather than a one-off read:\n * every column drag and every window resize re-splits the shares, so the offset moves without\n * anything about the selection column itself changing.\n */\n private observeSelectionWidth(): void {\n const cell = this.selectionHeader()?.nativeElement;\n if (!cell || this.selectionWidthObserver) return;\n\n const measure = () => {\n const width = cell.offsetWidth;\n if (width === this.frozenOffsetPx) return;\n\n this.zone.run(() => (this.frozenOffsetPx = width));\n };\n\n if (typeof ResizeObserver !== 'undefined') {\n this.zone.runOutsideAngular(() => {\n this.selectionWidthObserver = new ResizeObserver(measure);\n this.selectionWidthObserver.observe(cell);\n });\n }\n\n // Measured once immediately as well, on a microtask. The observer's first callback arrives an\n // animation frame later, and until it does the identity column sits at left:0 — on top of the\n // checkbox column it is supposed to start after. The microtask keeps the write out of the CD\n // pass that just finished, which doing it inline here would break with an NG0100.\n queueMicrotask(measure);\n }\n\n /**\n * Custom toolbar content projected via `<ng-template spiderlyDataTableActions>`.\n * Rendered in the caption action area ahead of the built-in buttons.\n */\n @ContentChild(SpiderlyDataTableActionsDirective, { read: TemplateRef })\n actionsTemplate: TemplateRef<any>;\n\n /**\n * Per-column cell templates projected via `<ng-template spiderlyCellTemplate=\"field\">`.\n * A column with no template keeps the built-in rendering.\n */\n @ContentChildren(SpiderlyCellTemplateDirective)\n cellTemplates: QueryList<SpiderlyCellTemplateDirective>;\n\n @Input() tableTitle: string;\n @Input() tableIcon: string = 'pi pi-list';\n @Input() items: any[]; // Pass only when hasLazyLoad === false\n @Input() rows: number;\n /** Paginator page-size choices; merge rules and persistence: CLAUDE.md → \"Rows-per-page\". */\n @Input() rowsPerPageOptions: number[] = [10, 25, 50, 100];\n @Input() cols: Column[];\n\n /**\n * The consumer's filter store — the table's WHOLE filter surface, rendered as the chip bar. A\n * table given none has no filtering at all (`Column.filterType` is only the value's shape; the\n * legacy header-filter fallback was deleted — CLAUDE.md -> \"Operator-owned view\").\n *\n * READ ONCE, in ngOnInit — a store assigned later is silently ignored: the requery effect\n * stays subscribed to the first store's `applied()`, and `resolvedStateKey` (which\n * `additionalFilterIdLong` feeds) is never re-derived either. A consumer that must swap\n * stores at runtime destroys and recreates the table around the swap — PACMS\n * `integration-matching-products` nulls its view model for exactly this. Teaching\n * ngOnChanges to re-arm both is the open upstream fix.\n */\n @Input() filters?: FilterSource;\n\n /** Saved questions for this table, rendered as tabs above the bar. */\n @Input() views?: TableView[];\n\n /**\n * The view currently selected. Seeded from the first view in `ngOnInit` — then overridden by\n * `restoreActiveView`, so a reload lands where the operator was — and never left null on a\n * table that has views: `viewScope` keys the layout off it, so an unseeded table writes its\n * width and order to the SAME key an unmigrated table uses — orphaned the moment the operator\n * clicks the first tab — and no tab reads as selected until they do.\n */\n activeViewId: string | null = null;\n /** Whether the paginator is shown. Pass only when `hasLazyLoad === false`. Defaults to `true`. */\n @Input() showPaginator: boolean = true;\n /** Whether the table is wrapped in a card container. Defaults to `false`. */\n @Input() showCardWrapper: boolean = false;\n @Input() readonly: boolean = false;\n @Input() idField = 'id';\n\n /**\n * Sizes the columns from their declared widths instead of from the rendered rows.\n *\n * The browser default is `table-layout: auto`, which computes every column from the content\n * of the rows currently on screen — so a column is one width on this page and another on the\n * next, and a filter (which narrows the variety of values in the column it filters) moves the\n * whole grid. PrimeNG sets no `table-layout` of its own, so without this the table inherits\n * that default. Bound to a field, never an object literal in the template: a literal is a new\n * reference on every change-detection pass.\n */\n protected readonly tableStyle = { 'table-layout': 'fixed' };\n totalRecords: number;\n @Output() onTotalRecordsChange: EventEmitter<number> = new EventEmitter();\n\n @Input() getPaginatedListObservableMethod: (\n tableFilter: Filter,\n ) => Observable<PaginatedResult>;\n @Input() exportListToExcelObservableMethod: (\n tableFilter: Filter,\n ) => Observable<any>;\n @Input() deleteItemFromTableObservableMethod: (\n rowId: number,\n ) => Observable<any>;\n @Input() deleteListFromTableObservableMethod: (\n ids: number[],\n ) => Observable<any>;\n\n lastLazyLoadEvent: TableLazyLoadEvent;\n private loading: boolean = true;\n\n @Input() newlySelectedItems: number[] = [];\n fakeSelectedItems: number[] = []; // Only for showing checkboxes, we will not send this to the backend\n currentPageSelectedItemsFromDb: number[] = []; // Made so we can add only newly selected items to the newlySelectedItems\n @Input() unselectedItems: number[] = [];\n @Input() selectionMode: 'single' | 'multiple' | undefined | null;\n @Output() onLazyLoad: EventEmitter<Filter> = new EventEmitter();\n rowsSelectedNumber: number = 0;\n isAllSelected: boolean = null;\n fakeIsAllSelected: boolean = false; // Only for showing checkboxes, we will not send this to the backend\n isFirstTimeLazyLoad: boolean = true;\n /** Shift-range selection state — model and invariants: CLAUDE.md → \"Shift-click range selection\". */\n private rangeAnchorId: number | null = null;\n private pendingShift: { shiftKey: boolean; id: number } | null = null;\n @Output() onIsAllSelectedChange: EventEmitter<AllClickEvent> =\n new EventEmitter();\n @Input() selectedLazyLoadObservableMethod: (\n tableFilter: Filter,\n ) => Observable<LazyLoadSelectedIdsResult>;\n @Input() additionalFilterIdLong: number;\n\n /** Whether the \"Add\" button is shown. Defaults to `true`. */\n @Input() showAddButton: boolean = true;\n /** Whether the \"Export to Excel\" button is shown. Defaults to `true`. */\n @Input() showExportToExcelButton: boolean = true;\n /** Whether the reload-table button is shown. Defaults to `false`. */\n @Input() showReloadTableButton: boolean = false;\n\n deleteRef: DynamicDialogRef;\n\n // Client side table\n // @Input() formArrayItems: any[]; // Pass this only if you have some additional logic for showing data\n @Input() getFormArrayItems: (additionalIndexes?: any) => any[];\n @Input() hasLazyLoad: boolean = true;\n\n /**\n * Unique key for persisting table state (filters, sort, pagination) to storage.\n * Auto-generated from the current route when not provided.\n */\n @Input() stateKey?: string;\n\n /** 'session' persists across refresh only; 'local' persists indefinitely. */\n @Input() stateStorage: 'session' | 'local' = 'session';\n\n /**\n * Column field the table sorts by while the user has no sort of their own — applied on\n * first load (persisted state, when present, wins) and re-applied whenever an action\n * would leave the table unsorted (tri-state header click, Clear filters). Shows as a\n * regular header sort arrow. Omit to keep the backend's implicit Id DESC ordering.\n */\n @Input() defaultSortField?: string;\n\n /** Direction for `defaultSortField`: 1 ascending (default), -1 descending. */\n @Input() defaultSortOrder: 1 | -1 = 1;\n\n initialMultiSortMeta: SortMeta[] | null = null;\n\n /** Columns currently rendered — `cols` minus the hidden ones. Actions columns always render. */\n visibleCols: Column[] = [];\n\n /** Cached count of visible data columns, so template bindings don't re-derive it per CD cycle. */\n private visibleDataColsCount = 0;\n\n /** Data columns offered in the column chooser (actions columns are excluded). */\n chooserCols: Column[] = [];\n\n resolvedStateKey: string | null = null;\n selectedItemIds: number[] = []; // Pass only when hasLazyLoad === false, it's enough if the M2M association hasn't additional fields\n @Input() getAlreadySelectedItemIds: (additionalIndexes?: any) => number[]; // Pass only when hasLazyLoad === false, it's enough if the M2M association hasn't additional fields\n selectedItems: any[] = []; // Pass only when hasLazyLoad === false\n @Input() getAlreadySelectedItems: (additionalIndexes?: any) => any[]; // Pass only when hasLazyLoad === false, it's enough if the M2M association hasn't additional fields\n @Input() getFormControl: (\n formControlName: string,\n index: number,\n additionalIndexes?: any,\n ) => SpiderlyFormControl;\n @Input() additionalIndexes: any;\n @Output() onRowSelect: EventEmitter<RowClickEvent> = new EventEmitter();\n @Output() onRowUnselect: EventEmitter<RowClickEvent> = new EventEmitter();\n /**\n * if true, clicking a row will navigate to the details page.\n * Set to false to disable row navigation.\n * Default is false.\n */\n @Input() navigateOnRowClick: boolean = false;\n\n /**\n * Path to navigate to when clicking a row.\n * If not provided, it will use the current route with the row ID.\n * Example: 'details' will navigate to '/details/{rowId}'.\n */\n @Input() rowNavigationPath: string;\n\n constructor(\n private router: Router,\n private dialogService: DialogService,\n private route: ActivatedRoute,\n private messageService: SpiderlyMessageService,\n private translocoService: TranslocoService,\n private configService: ConfigServiceBase,\n private errorHandler: ErrorHandler,\n @Inject(LOCALE_ID) private locale: string,\n ) {}\n\n ngAfterViewInit(): void {\n this.setupRemovableSort();\n this.observeSelectionWidth();\n }\n\n /**\n * The template that renders this column's cells, or null to use the built-in rendering.\n * Actions columns have no `field`, so they never match one.\n *\n * Read straight off the QueryList, which is live — a consumer declaring its templates inside a\n * `@for`/`@if` is served with no subscription and nothing to invalidate. The scan is over the\n * TEMPLATED columns only (typically one or two), not over `cols`.\n */\n getCellTemplate(col: Column): TemplateRef<CellTemplateContext> | null {\n if (col.field == null) return null;\n return (\n this.cellTemplates?.find((directive) => directive.field === col.field)\n ?.template ?? null\n );\n }\n\n // PrimeNG v19 removed the removableSort property. This overrides the table's\n // sort() method to add tri-state cycling: ascending → descending → unsorted\n // (or back to the declared default sort when one is set).\n private setupRemovableSort(): void {\n const originalSort = this.table.sort.bind(this.table);\n\n this.table.sort = (event: { originalEvent: Event; field: string }) => {\n const sortMeta = this.table.getSortMeta(event.field);\n\n if (sortMeta && sortMeta.order === -1) {\n const mouseEvent = event.originalEvent as MouseEvent;\n const isMultiSortClick = mouseEvent.metaKey || mouseEvent.ctrlKey;\n\n if (isMultiSortClick) {\n // Removing ONE level of a multi-sort keeps the reader's place (PrimeNG's metaKey\n // path never pages either), so this cannot ride applySort, whose page reset is\n // half the point. The substituted default keeps sortMultiple() to one emission.\n const remaining = this.table._multiSortMeta.filter(\n (m) => m.field !== event.field,\n );\n this.table._multiSortMeta = remaining.length\n ? remaining\n : (this.defaultMultiSortMeta() ?? remaining);\n\n this.table.sortMultiple();\n if (this.table.isStateful()) this.table.saveState();\n this.table.anchorRowIndex = null;\n this.persistActiveViewSort();\n } else {\n // A single-click un-sort IS \"back to the default\" — the exact gesture the bar's\n // reset row asks for, so it uses the same body.\n this.resetSortFromBar();\n }\n } else {\n originalSort(event);\n // PrimeNG's sort() pages/saves itself; the override slot is ours to record.\n this.persistActiveViewSort();\n }\n };\n }\n\n /**\n * A page size PrimeNG will actually apply but that is missing from `rowsPerPageOptions` leaves\n * the paginator dropdown blank — so both the effective `rows` and the persisted pick (which\n * `restoreState` applies after init) are merged in. Runs again on input changes because a\n * consumer may resolve `[rows]` asynchronously. Storage is user-writable, hence the shape and\n * ceiling check: a hand-edited `{\"rows\": 100000}` must not become an offered choice, since the\n * backend `.Take`s whatever it is sent.\n */\n private mergeActivePageSizesIntoOptions(): void {\n const ceiling = Math.max(...this.rowsPerPageOptions);\n const persisted = this.persistedTableState()?.rows;\n const candidates = [\n this.rows,\n Number.isInteger(persisted) && persisted > 0 && persisted <= ceiling\n ? persisted\n : null,\n ];\n\n for (const value of candidates) {\n if (value != null && !this.rowsPerPageOptions.includes(value)) {\n this.rowsPerPageOptions = [...this.rowsPerPageOptions, value].sort(\n (a, b) => a - b,\n );\n }\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // Only meaningful once ngOnInit has resolved the defaults; before that it is a no-op re-run.\n if (this.rows != null) this.mergeActivePageSizesIntoOptions();\n if (changes['views']) this.adoptStoredView();\n }\n\n ngOnInit(): void {\n // Fail loud, not half-broken: the store commits through the paginated request, and a\n // client-side (form-array) table has none — armed anyway, the first commit would call the\n // absent getPaginatedListObservableMethod inside the requery effect and strand the pending\n // overlay forever. Client-side store predicates are unbuilt (spiderly#407 territory).\n if (this.filters && !this.hasLazyLoad) {\n throw new Error(\n 'spiderly-data-table: [filters] requires a lazy table — client-side filtering through a store is not implemented. Remove [filters] or make the table lazy.',\n );\n }\n\n if (this.rows == null) this.rows = this.configService.defaultPageSize;\n\n this.activeViewId ??= this.views?.[0]?.id ?? null;\n\n\n if (this.deleteListFromTableObservableMethod && !this.selectionMode) {\n this.selectionMode = 'multiple';\n }\n\n if (this.hasLazyLoad) {\n const baseKey = this.stateKey ?? `spiderly-table:${this.router.url}`;\n this.resolvedStateKey =\n this.additionalFilterIdLong != null\n ? `${baseKey}:${this.additionalFilterIdLong}`\n : baseKey;\n } else {\n this.clientLoad();\n }\n\n this.mergeActivePageSizesIntoOptions();\n\n // AFTER `resolvedStateKey` is derived, which is what every restore below keys off — placed\n // above it they read a null key and silently restore nothing. The view restore runs FIRST,\n // because the other three read the `viewScope` it decides. And all of it before the effect\n // is armed, so the first request already carries the filters and the effect's skipped first\n // run sees the state it will be watching.\n const restoredView = this.restoreActiveView();\n\n this.restoreColumnVisibility();\n this.restoreColumnLayout();\n\n this.enterViewFilters(restoredView, 'refresh');\n if (this.filters) this.requeryOnAppliedFilters();\n\n this.chooserCols = this.cols.filter(SpiderlyDataTableComponent.isDataColumn);\n this.refreshVisibleCols();\n\n // From chooserCols, not cols: same \"every data column, hidden included\" set the chooser\n // offers — one derivation of that list, so the picker cannot drift from it.\n this.sortPickOptions = this.chooserCols\n .filter((col) => this.isColumnSortable(col))\n .map((col) => ({ field: col.field!, label: col.name }));\n\n // Bound to p-table's [multiSortMeta] so the FIRST request already carries the right\n // sort. On a viewed table the persisted table-global sort is a NON-SOURCE (2026-09-06):\n // sort is per-view state (override ?? declared ?? table default), and the blob — which\n // holds the last ordering ANY view used — would re-impose across views the exact\n // carry-over the per-view model removes, on every F5. It still carries rows/first there,\n // and stays the one sort memory of a view-less table. We read it all ourselves because\n // PrimeNG's restoreState() runs on the first [value] change — after the initial lazy emit\n // has already left — and is then told to agree (see `alignPersistedTableStateSort`).\n const tableState = this.persistedTableState();\n this.initialMultiSortMeta = this.views?.length\n ? this.resolvedViewSort()\n : (this.sanitizedSortMeta(tableState?.multiSortMeta) ??\n this.tableDefaultMultiSortMeta());\n this.alignPersistedTableStateSort(tableState);\n }\n\n //#region Column visibility\n\n /**\n * User visibility choices (field → visible), holding only fields the user explicitly\n * toggled away from their declared default — so a page changing a column's declared\n * default later flows through to every user who never touched that column.\n */\n private columnVisibilityOverrides: Record<string, boolean> = {};\n\n /** A data column shows values for a `field`; anything else (the actions column) always renders. */\n private static isDataColumn(col: Column): boolean {\n return !!col.field;\n }\n\n /**\n * Storage slot for the visibility overrides. Deliberately ALWAYS localStorage, even when\n * `stateStorage` is 'session': the column layout is a durable preference, while filters\n * are a transient working set — different natural lifetimes.\n */\n private get columnsStateKey(): string | null {\n return this.resolvedStateKey\n ? `${this.resolvedStateKey}${this.viewScope}:columns`\n : null;\n }\n\n /** Actions columns always render; data columns follow the override, then declared default. */\n isColumnVisible(col: Column): boolean {\n if (!SpiderlyDataTableComponent.isDataColumn(col)) return true;\n if (col.lockVisible) return true; // pinned — wins over any (possibly stale) override\n return this.columnVisibilityOverrides[col.field] ?? col.visible !== false;\n }\n\n /**\n * `cols` in the operator's order. A field the stored order has never seen — a column added in a\n * later release — sorts to the END rather than displacing a layout someone built by hand\n * (CLAUDE.md -> \"Operator-owned view\", decision 7); the sort is stable, so those keep their\n * declared order among themselves. Actions columns carry no field and are always last, which is\n * where every consumer already declares them.\n */\n private orderedCols(): Column[] {\n if (this.columnOrder.length === 0) return this.cols;\n\n const rank = new Map(\n this.columnOrder.map((field, index) => [field, index]),\n );\n\n return [...this.cols].sort(\n (a, b) =>\n (rank.get(a.field!) ?? Number.MAX_SAFE_INTEGER) -\n (rank.get(b.field!) ?? Number.MAX_SAFE_INTEGER),\n );\n }\n\n /**\n * Whether this column can move one place in `direction` (-1 left, 1 right). A locked column is\n * the row's anchor — and, once the left edge freezes, the thing a horizontal scroll keeps in\n * view — so it does not move and nothing moves in front of it.\n */\n canMoveColumn(col: Column, direction: -1 | 1): boolean {\n if (col.lockVisible || !col.field) return false;\n\n const order = this.dataColumnsInOrder();\n const from = order.indexOf(col);\n const to = from + direction;\n\n if (from < 0 || to < 0 || to >= order.length) return false;\n\n return !order[to].lockVisible;\n }\n\n moveMenuColumn(direction: -1 | 1): void {\n const col = this.menuColumn;\n this.columnMenu().hide();\n if (!col || !this.canMoveColumn(col, direction)) return;\n\n const order = this.dataColumnsInOrder();\n this.placeColumn(order, col, order.indexOf(col) + direction);\n }\n\n /** The move itself, shared by the menu and the drag — two entry points, one rule. */\n private placeColumn(order: Column[], col: Column, to: number): void {\n order.splice(to, 0, ...order.splice(order.indexOf(col), 1));\n\n this.columnOrder = order.map((entry) => entry.field!);\n this.persistColumnLayout();\n this.refreshVisibleCols();\n }\n\n private dataColumnsInOrder(): Column[] {\n return this.orderedCols().filter(SpiderlyDataTableComponent.isDataColumn);\n }\n\n /**\n * Header drag, ours rather than PrimeNG's `pReorderableColumn`, for two reasons: its\n * `onMouseDown` arms the th for anything that is not an INPUT, a TEXTAREA or its OWN resizer —\n * so our menu chevron and our resize grip would each start a column drag, and reaching for a\n * width would silently reorder the grid — and its `onColumnDrop` reorders blind, with no notion\n * of a locked column (CLAUDE.md -> decision 6).\n *\n * A shortcut for neighbours, never the mechanism: HTML5 dnd has no edge auto-scroll, so a column\n * scrolled off the right is unreachable this way, and there is no keyboard path at all. The menu\n * carries both.\n *\n * This half is the arming rule; the drop rule is `canDropOn` below.\n */\n onHeaderMouseDown(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n\n this.headerDragArmed = !target.closest(\n '.column-menu-button, .column-resizer',\n );\n }\n\n onHeaderDragStart(col: Column, event: DragEvent): void {\n if (col.lockVisible || !this.headerDragArmed) {\n event.preventDefault();\n return;\n }\n\n this.draggedColumn = col;\n event.dataTransfer?.setData('text/plain', col.field ?? '');\n }\n\n onHeaderDragOver(col: Column, event: DragEvent): void {\n if (this.canDropOn(col)) event.preventDefault();\n }\n\n onHeaderDrop(col: Column, event: DragEvent): void {\n event.preventDefault();\n\n const dragged = this.draggedColumn;\n this.draggedColumn = null;\n if (!dragged || dragged === col || !this.canDropOn(col)) return;\n\n const order = this.dataColumnsInOrder();\n this.placeColumn(order, dragged, order.indexOf(col));\n }\n\n /** Nothing lands on, or in front of, the locked column. Enforced here as well as in the menu:\n * a drop is a separate entry point, and the rule is about the grid rather than about a button. */\n private canDropOn(col: Column): boolean {\n return !col.lockVisible && SpiderlyDataTableComponent.isDataColumn(col);\n }\n\n private refreshVisibleCols(): void {\n this.visibleCols = this.orderedCols().filter((col) =>\n this.isColumnVisible(col),\n );\n this.visibleDataColsCount = this.visibleCols.filter(\n SpiderlyDataTableComponent.isDataColumn,\n ).length;\n }\n\n /**\n * Locked columns can't be toggled; the last visible data column can't be hidden — the\n * table must never collapse to just an actions column. Revealing is always allowed.\n */\n canToggleColumn(col: Column): boolean {\n if (col.lockVisible) return false;\n if (!this.isColumnVisible(col)) return true;\n return this.visibleDataColsCount > 1;\n }\n\n toggleColumn(col: Column, visible: boolean): void {\n if (visible === (col.visible !== false)) {\n delete this.columnVisibilityOverrides[col.field]; // back at the declared default\n } else {\n this.columnVisibilityOverrides[col.field] = visible;\n }\n\n this.persistColumnVisibility();\n this.refreshVisibleCols();\n\n if (!visible) this.dropHiddenColumnSort([col]);\n }\n\n /**\n * Restores every column to its declared default and forgets the stored overrides — visibility,\n * wrap, order and width alike. It undid visibility only until the header menu shipped three\n * more gestures beside it, and a layout with no way back is worse than one with no knobs.\n *\n * On a STORE table, hiding — here or from the menu — never touches filters or sort: the chip\n * bar names every applied filter and the sort chip names the sort, hidden column or not\n * (decision 2b). A storeless table keeps the sort half of the legacy invariant instead — see\n * `dropHiddenColumnSort`.\n */\n resetColumnLayout(): void {\n this.columnWrap = {};\n this.columnOrder = [];\n this.columnWidths = {};\n this.persistColumnLayout();\n\n const wasVisible = this.visibleCols.filter(\n SpiderlyDataTableComponent.isDataColumn,\n );\n\n this.columnVisibilityOverrides = {};\n this.persistColumnVisibility();\n this.refreshVisibleCols();\n\n // Columns the reset just hid follow the same rule as a manual hide.\n this.dropHiddenColumnSort(\n wasVisible.filter((col) => !this.isColumnVisible(col)),\n );\n }\n\n /**\n * The sort half of the legacy \"hidden contributes nothing\" invariant, kept ONLY for storeless\n * tables (the generated M2M details grids, until spiderly#407 scaffolds their stores): they\n * have no sort chip, so a hidden column's sort would order the grid with nothing on screen\n * naming it and no control left to clear it. The filter half needs no heir — `lazyLoad`\n * overwrites the outgoing filters unconditionally. On a store table this is a no-op:\n * decision 2b's chips are the visible surface, hidden column or not.\n */\n private dropHiddenColumnSort(cols: Column[]): void {\n if (!this.table || this.filters) return;\n\n const sorted = cols.filter((col) =>\n this.table._multiSortMeta?.some((m) => m.field === col.field),\n );\n if (!sorted.length) return;\n\n this.table._multiSortMeta = this.table._multiSortMeta.filter(\n (m) => !sorted.some((col) => col.field === m.field),\n );\n this.table.tableService.onSort(this.table._multiSortMeta);\n this.table._filter(); // re-emits the lazy load and saves the cleaned state\n }\n\n /**\n * Per-column wrap, by `field`. A SEPARATE key from the visibility overrides on purpose: folding\n * both into one object would invalidate every layout already in an operator's localStorage, and\n * this is the key the width and order overrides will join (decision 5).\n */\n private columnWrap: Record<string, boolean> = {};\n\n /** Data-column fields in the operator's order. Empty means \"as declared\". */\n private columnOrder: string[] = [];\n\n /**\n * Per-column width overrides, as SHARES in the same unit `getColWidth` emits — never pixels.\n * Under the fixed layout the browser splits surplus in proportion to these, so a pixel would\n * pin the column and stop it answering the window: the operator on a 1280 laptop and the one\n * on a 2560 monitor would get the same frozen column (decision 4).\n */\n private columnWidths: Record<string, number> = {};\n\n /**\n * Layout keys carry the ACTIVE VIEW, which is what makes a view more than a saved filter: a\n * picking view and a payments view want different COLUMNS, not just different rows. Global\n * layout would re-create the original complaint one level up — the operator still re-picking\n * columns every time the job changes.\n *\n * A table with no views has no segment, so the twenty-six tables that have not migrated keep\n * reading exactly the keys they already wrote.\n */\n private get viewScope(): string {\n return this.activeViewId ? `:${this.activeViewId}` : '';\n }\n\n /**\n * Where the applied filters live. Follows `stateStorage` rather than the layout's always-local\n * rule, because that is where they lived before the bar took them off the header: PrimeNG's\n * stateful table persisted them for free, and nothing replaced it — a refresh dropped every\n * filter (Filip, on /tags). A filter is a question you are in the middle of asking, not a\n * durable preference like a column's width.\n */\n private get filtersStateKey(): string | null {\n return this.resolvedStateKey\n ? `${this.resolvedStateKey}${this.viewScope}:filters`\n : null;\n }\n\n private get filterStorage(): Storage {\n return this.stateStorage === 'local' ? localStorage : sessionStorage;\n }\n\n /**\n * Where the active view id lives. Deliberately NOT view-scoped — it is the input `viewScope`\n * derives from — and it follows `stateStorage` like the filters rather than the layout's\n * always-local rule, because the id and the filters it scopes are one question: a durable id\n * over session-scoped filters would restore a tab with nothing under it.\n */\n private get viewStateKey(): string | null {\n return this.resolvedStateKey ? `${this.resolvedStateKey}:view` : null;\n }\n\n /** Only `selectView` writes; the `ngOnInit` seed does not — absence means \"the default\". */\n private persistActiveView(): void {\n if (!this.viewStateKey || !this.activeViewId) return;\n\n writeStoredJson(this.filterStorage, this.viewStateKey, this.activeViewId);\n }\n\n /**\n * Puts a reload back on the view the operator was using. Every persisted key carries the view\n * segment, so before this existed the seed decided what got restored: F5 landed on the first\n * view and read `…:all:filters` — the tab snapped to \"Sve\" and the bar came back empty while\n * the operator's filters sat intact under the old view's segment (Filip, on /porudzbine).\n *\n * An id naming no current view keeps the seed AND the stored key: \"vanished by deploy\" and\n * \"not yet arrived\" are indistinguishable here (order-list's catalog-licensed \"Za pakovanje\"\n * is literally both), so `adoptStoredView` re-reads the key on every `[views]` change and the\n * key self-heals on the next explicit click.\n */\n private restoreActiveView(): TableView | null {\n if (!this.viewStateKey || !this.views?.length) return null;\n\n const storedId = readStoredJson(this.filterStorage, this.viewStateKey);\n if (typeof storedId !== 'string') return null;\n\n const view = this.viewById(storedId) ?? null;\n if (view) this.activeViewId = view.id;\n\n return view;\n }\n\n /**\n * The second half of `restoreActiveView`: a stored view that did not exist at init is adopted\n * when a later `[views]` change brings it — through `selectView`, so it gets the same\n * stored-wins/transient/layout/requery semantics a click would have had. There is no parked\n * copy of the stored id — the key itself is re-read, and because every explicit pick\n * overwrites it, the operator's own choice wins by construction. Accepted cost of adopting\n * late instead of holding the first request: a brief flash of the seeded view's rows and a\n * second request when the late view lands.\n */\n private adoptStoredView(): void {\n if (!this.viewStateKey) return;\n\n const storedId = readStoredJson(this.filterStorage, this.viewStateKey);\n if (typeof storedId !== 'string' || storedId === this.activeViewId) return;\n\n const view = this.viewById(storedId);\n if (view) this.selectView(view);\n }\n\n private viewById(id: string): TableView | undefined {\n return this.views?.find((candidate) => candidate.id === id);\n }\n\n private persistAppliedFilters(): void {\n if (!this.filtersStateKey || !this.filters) return;\n\n const snapshot = this.filters.snapshot();\n\n if (Object.keys(snapshot).length === 0) {\n this.filterStorage.removeItem(this.filtersStateKey);\n } else {\n writeStoredJson(this.filterStorage, this.filtersStateKey, snapshot);\n }\n }\n\n /**\n * Applies the right filters for entering `view` — the transient rule's one home. A TRANSIENT\n * view's `apply` is a function of NOW, so it always re-derives; restoring would put\n * yesterday's date under a tab claiming \"today\" (`persistAppliedFilters` has no transient\n * guard, so storage holds the LAST answer). A non-transient view's own stored answer wins\n * over its `apply`. The semantics argument is the one deliberate difference between the\n * callers: a 'click' re-asks the view's question when nothing is stored, a 'refresh' returns\n * the empty state the operator left — they cleared it, and F5 must give the cleared state\n * back. On a table with no views, `view` is null and this is a plain restore of the\n * `persistAppliedFilters` snapshot.\n */\n private enterViewFilters(\n view: TableView | null,\n semantics: 'click' | 'refresh',\n ): void {\n if (!this.filters) return;\n\n const stored =\n !view?.transient && this.filtersStateKey\n ? readStoredJson(this.filterStorage, this.filtersStateKey)\n : null;\n\n if (stored) this.filters.restore(stored);\n else if (view?.transient || semantics === 'click') view?.apply?.(this.filters);\n }\n\n private get layoutStateKey(): string | null {\n return this.resolvedStateKey\n ? `${this.resolvedStateKey}${this.viewScope}:layout`\n : null;\n }\n\n /** One key for the whole layout — wrap now, widths next (decision 5). */\n private persistColumnLayout(): void {\n if (!this.layoutStateKey) return;\n\n const layout = {\n wrap: this.columnWrap,\n order: this.columnOrder,\n widths: this.columnWidths,\n };\n const isDefault =\n Object.keys(this.columnWrap).length === 0 &&\n this.columnOrder.length === 0 &&\n Object.keys(this.columnWidths).length === 0;\n\n if (isDefault) localStorage.removeItem(this.layoutStateKey);\n else writeStoredJson(localStorage, this.layoutStateKey, layout);\n }\n\n private restoreColumnLayout(): void {\n if (!this.layoutStateKey) return;\n\n const layout = readStoredJson(localStorage, this.layoutStateKey);\n this.columnWrap = layout?.wrap ?? {};\n this.columnOrder = layout?.order ?? [];\n this.columnWidths = layout?.widths ?? {};\n }\n\n private persistColumnVisibility(): void {\n if (!this.columnsStateKey) return;\n\n if (Object.keys(this.columnVisibilityOverrides).length === 0) {\n localStorage.removeItem(this.columnsStateKey);\n } else {\n writeStoredJson(\n localStorage,\n this.columnsStateKey,\n this.columnVisibilityOverrides,\n );\n }\n }\n\n private restoreColumnVisibility(): void {\n if (!this.columnsStateKey) return;\n\n this.columnVisibilityOverrides =\n readStoredJson(localStorage, this.columnsStateKey) ?? {};\n }\n\n /**\n * PrimeNG's persisted table state (filters/sort/pagination), read directly from storage\n * because we need it before PrimeNG's restoreState() runs on the first [value] change.\n */\n private persistedTableState(): any {\n if (!this.resolvedStateKey) return null;\n\n return readStoredJson(\n this.stateStorage === 'local' ? localStorage : sessionStorage,\n this.resolvedStateKey,\n );\n }\n\n private activeView(): TableView | undefined {\n return this.activeViewId ? this.viewById(this.activeViewId) : undefined;\n }\n\n /**\n * Where the operator's per-view sort override lives. Null on a table without views — those\n * keep the pure PrimeNG sort persistence they always had — and null on a STORELESS table:\n * there \"hidden contributes nothing\" retires a hidden column's sort (`dropHiddenColumnSort`)\n * with no persist call at the hide site, so an override restored blind at the next init\n * would re-impose a sort no chip can name. Store tables — where every viewed consumer\n * lives — have the chip. Follows `stateStorage` like the filters and the view id: the sort\n * is part of the same question they scope.\n */\n private get viewSortStateKey(): string | null {\n if (!this.views?.length || !this.filters) return null;\n\n return this.resolvedStateKey\n ? `${this.resolvedStateKey}${this.viewScope}:sort`\n : null;\n }\n\n /** The operator's stored sort for the active view, sanitized like any persisted sort. */\n private persistedViewSort(): SortMeta[] | null {\n if (!this.viewSortStateKey) return null;\n\n const stored = readStoredJson(this.filterStorage, this.viewSortStateKey);\n return Array.isArray(stored) ? this.sanitizedSortMeta(stored) : null;\n }\n\n /**\n * THE resolution ladder, named once: the operator's stored override, else the declared\n * default (`defaultMultiSortMeta` = view's declared sort ?? table default). Null means\n * \"unsorted\" — callers append their own `?? []` / blob terms rather than re-spelling the\n * ladder, so a future term (a per-view default refinement, decision 10's columns half)\n * lands everywhere at once.\n */\n private resolvedViewSort(): SortMeta[] | null {\n return this.persistedViewSort() ?? this.defaultMultiSortMeta();\n }\n\n /**\n * Records the current sort as the active view's override — called from the EXPLICIT sort\n * gestures only (header click, `applySort` — the menu and both bar entry points), never\n * from a load: a sort merely inherited at init must not crystallize into an override, or a\n * later change to the view's declared sort would stop flowing to operators who never\n * touched sort — the same flows-through rule `columnVisibilityOverrides` documents. A sort\n * equal to the declared default is stored as ABSENCE for the same reason.\n */\n private persistActiveViewSort(): void {\n const key = this.viewSortStateKey;\n if (!key) return;\n\n const current = this.table._multiSortMeta ?? [];\n\n if (sortMetaEquals(current, this.defaultMultiSortMeta() ?? [])) {\n this.filterStorage.removeItem(key);\n } else {\n writeStoredJson(this.filterStorage, key, current);\n }\n }\n\n /**\n * Puts the entering view's sort on the grid — stored override, else declared sort, else the\n * table default, else UNSORTED. A view is a COMPLETE state, sort included (2026-09-06,\n * grilled — supersedes the \"a view stating no preference keeps the ordering already there\"\n * this first shipped with): the carried-over ordering read as a bug in its first live week,\n * when \"Poslate\"'s statusChangedAt rode onto \"Sve\", whose sorted column ships hidden —\n * read-only chip, no header to tri-state, no way out. Polaris IndexFilters is the model:\n * sort is part of a view's saved definition. Broadcast only — the caller owns the refetch,\n * because which request carries the new sort differs between the store and storeless paths.\n */\n private applyViewSort(): boolean {\n const target = this.resolvedViewSort() ?? [];\n if (sortMetaEquals(target, this.table._multiSortMeta ?? [])) return false;\n\n this.broadcastSort(target);\n return true;\n }\n\n /**\n * Rewrites the sort inside PrimeNG's persisted state to the one `ngOnInit` resolved. The two\n * can disagree only on a viewed table — PrimeNG's state is table-global while the resolved\n * sort is the view's — and PrimeNG's restoreState() applies its copy on the first [value]\n * change, AFTER the initial request already left with ours: without this line the grid's\n * arrows and every later request silently fall back to the other view's sort. Handed the\n * already-parsed state: `ngOnInit` reads the blob once for the whole init pass.\n */\n private alignPersistedTableStateSort(state: any): void {\n if (!this.views?.length || !this.resolvedStateKey || !state) return;\n\n const resolved = this.initialMultiSortMeta ?? [];\n if (sortMetaEquals(state.multiSortMeta ?? [], resolved)) return;\n\n state.multiSortMeta = resolved.length ? resolved : undefined;\n writeStoredJson(this.filterStorage, this.resolvedStateKey, state);\n }\n\n //#endregion\n\n /**\n * The DECLARED default in the current context: the active view's own sort when it declares\n * one, else the table-level `defaultSortField`. Every \"fall back to the declared default\"\n * site — tri-state un-sort, Clear filters, the unsorted-load safety net — reads this, so\n * un-sorting inside a view lands on the view's ordering, not the table's.\n */\n private defaultMultiSortMeta(): SortMeta[] | null {\n return this.viewDeclaredMultiSortMeta() ?? this.tableDefaultMultiSortMeta();\n }\n\n /**\n * The active view's declared sort, sanitized: a non-sortable field would answer every load\n * with a 400 (`keepSortableMeta`'s rationale), so it is dropped rather than sent; a view\n * whose declaration sanitizes to nothing falls through to the table default.\n */\n private viewDeclaredMultiSortMeta(): SortMeta[] | null {\n return this.sanitizedSortMeta(this.activeView()?.sort);\n }\n\n /**\n * The table-level declared default as PrimeNG sort meta, or null when none is declared. On a\n * store table it applies even while its column is hidden — the sort chip names the ordering\n * whether or not the column is on screen (decision 2b). A STORELESS table has no chip, so a\n * hidden default would order the grid with nothing on screen naming it; there the default\n * dies with the column, exactly as the legacy invariant had it (see `dropHiddenColumnSort`).\n */\n private tableDefaultMultiSortMeta(): SortMeta[] | null {\n if (!this.defaultSortField) return null;\n\n const defaultSortCol = this.cols?.find(\n (col) => col.field === this.defaultSortField,\n );\n if (\n defaultSortCol &&\n !this.filters &&\n !this.isColumnVisible(defaultSortCol)\n )\n return null;\n // A declared default on a non-sortable column is a consumer mistake the backend answers\n // with a 400 on every load; fall back to its implicit Id DESC instead (see keepSortableMeta).\n if (defaultSortCol && !this.isColumnSortable(defaultSortCol)) return null;\n\n return [{ field: this.defaultSortField, order: this.defaultSortOrder }];\n }\n\n /**\n * `keepSortableMeta` with \"sanitized to nothing\" surfaced as null — the rule every sort\n * SOURCE shares (\"a sort that sanitizes to nothing is no sort\"), so the resolution chains\n * can `??` past an empty answer instead of stopping on an empty array.\n */\n private sanitizedSortMeta(\n multiSortMeta: SortMeta[] | null | undefined,\n ): SortMeta[] | null {\n const sortable = this.keepSortableMeta(multiSortMeta);\n return sortable.length ? sortable : null;\n }\n\n /**\n * Drops sort meta the backend has no sort case for. Persisted state outlives the rule that\n * produced it — a sort stored before a column became non-sortable (or before the library\n * started disabling `*CommaSeparated` headers) would otherwise ride every lazy load, and the\n * generated `Build` answers an unknown sort field with a 400. There would be no way out from\n * the UI either: the header that could clear it is exactly the one no longer clickable.\n * Unknown fields (no matching column) are left alone — a consumer may sort on something it\n * declares no column for.\n */\n private keepSortableMeta(\n multiSortMeta: SortMeta[] | null | undefined,\n ): SortMeta[] {\n return (multiSortMeta ?? []).filter((sortMeta) => {\n const col = this.cols?.find((c) => c.field === sortMeta?.field);\n return col == null || this.isColumnSortable(col);\n });\n }\n\n // Safety net: any lazy load still leaving unsorted (stale persisted state; a viewless\n // table with no sort memory yet) falls back to the declared default. Patching the event\n // before it becomes the backend Filter avoids a second fetch; the re-broadcast keeps the\n // header icons agreeing with what was actually sent. The tri-state un-sort path never\n // gets here — it substitutes the default at its source in setupRemovableSort().\n private applyDefaultSortIfUnsorted(event: TableLazyLoadEvent): void {\n if (event.multiSortMeta?.length) return;\n\n const defaultSort = this.defaultMultiSortMeta();\n if (defaultSort == null) return;\n\n event.multiSortMeta = defaultSort;\n\n if (this.table) this.broadcastSort(defaultSort);\n }\n\n /** Puts `meta` on the grid and tells the header icons — no fetch; the caller owns that. */\n private broadcastSort(meta: SortMeta[]): void {\n this.table._multiSortMeta = meta;\n this.table.tableService.onSort(meta);\n }\n\n onPageChange(container: HTMLElement): void {\n scrollElementIntoViewIfAboveViewport(container);\n }\n\n /**\n * The one pending predicate: PrimeNG's overlay and the container's `aria-busy` must never\n * disagree about whether a fetch is in flight.\n *\n * It used to also test `items === undefined`, for the first load. That clause is dead now\n * that `loading` initialises true and every lazyLoad raises it — except in the one state\n * where it was actively wrong: a FAILED first load lowers the flag with `items` still\n * undefined, which pinned the overlay up forever. Same stranded overlay this component was\n * fixed for once already, through the other door.\n */\n get isPending(): boolean {\n return this.loading;\n }\n\n lazyLoad(event: TableLazyLoadEvent) {\n // Every refetch is pending, not just the first load and reload(). `items` is deliberately\n // left alone: the previous page stays on screen under the overlay (stale-while-revalidate)\n // rather than blanking. Raising the flag is also what stops PrimeNG's empty message, gated\n // on `isEmpty() && !loading`, from claiming \"no records\" for the length of the request.\n this.loading = true;\n\n this.applyDefaultSortIfUnsorted(event);\n this.lastLazyLoadEvent = event;\n this.refreshSortKeys();\n this.rangeAnchorId = null;\n\n let tableFilter: Filter = event as unknown as Filter;\n tableFilter.additionalFilterIdLong = this.additionalFilterIdLong;\n\n // The store is the ONLY source of what narrows the grid, on every table. Unconditional on\n // purpose: with the header filters gone, the one remaining writer of PrimeNG's own\n // `event.filters` is a stale persisted blob from the header-filter era replayed by\n // `restoreState` — and letting that through would narrow a storeless table invisibly, with\n // no chip and no button left to clear it.\n tableFilter.filters = this.filters?.toFilterPayload() ?? {};\n\n this.onLazyLoad.next(tableFilter);\n\n // Issued NOW rather than after the list lands: it needs only `tableFilter`, so serialising\n // it behind the list response cost a second round trip on every page of every\n // selection-enabled table — and the overlay is held up for both. The `.catch` at creation\n // is mandatory, not defensive: when the list request errors, `next` never runs, and a\n // rejected promise nobody awaits is exactly the unowned rejection this handler exists to\n // prevent. The rejection is re-thrown out of `awaitSelectedIds` instead, where it has one.\n const selectedIds =\n this.selectedLazyLoadObservableMethod != null\n ? firstValueFrom(\n this.selectedLazyLoadObservableMethod(tableFilter),\n ).catch((error) => error as Error)\n : null;\n\n this.getPaginatedListObservableMethod(tableFilter).subscribe({\n next: async (res) => {\n // The await below is INSIDE an async subscriber, so a rejection there settles nothing:\n // `error:` belongs to the paginated-list observable and never runs. That used to strand\n // the overlay forever, hence the finally.\n try {\n this.items = res.data;\n this.totalRecords = res.totalRecords;\n this.onTotalRecordsChange.next(res.totalRecords);\n\n await this.reconcileSelectionForLoadedPage(selectedIds);\n } catch (error) {\n // The library's own owner: it toasts, it skips HttpErrorResponse (the interceptor\n // already reported those), and a consumer's ErrorHandler wrapper forwards to their\n // tracker. console.error here would have dropped both.\n this.errorHandler.handleError(error);\n } finally {\n this.loading = false;\n }\n },\n error: () => {\n this.loading = false;\n },\n });\n }\n\n /**\n * Repaints the checkbox column for the page that just landed. Split out of the subscriber so\n * the try/finally that guarantees the pending flag wraps an await, not fifty lines of\n * selection algebra.\n */\n private async reconcileSelectionForLoadedPage(\n selectedIds: Promise<LazyLoadSelectedIdsResult | Error> | null,\n ): Promise<void> {\n if (selectedIds == null) {\n if (this.deleteListFromTableObservableMethod) {\n this.fakeSelectedItems = this.items\n .map((x) => x[this.idField])\n .filter((id) => this.newlySelectedItems.includes(id));\n }\n return;\n }\n\n const selectedRowsMethodResult = await selectedIds;\n if (selectedRowsMethodResult instanceof Error) throw selectedRowsMethodResult;\n\n this.currentPageSelectedItemsFromDb = [\n ...selectedRowsMethodResult.selectedIds,\n ];\n\n if (this.isFirstTimeLazyLoad == true) {\n this.rowsSelectedNumber = selectedRowsMethodResult.totalRecordsSelected;\n this.setFakeIsAllSelected();\n this.isFirstTimeLazyLoad = false;\n }\n\n if (this.isAllSelected == true) {\n let idsToInsert = [...this.items.map((x) => x[this.idField])];\n idsToInsert = idsToInsert.filter(\n (x) => this.unselectedItems.includes(x) == false,\n );\n this.fakeSelectedItems = [...idsToInsert]; // Only for showing checkboxes, we will not send this to the backend\n } else if (this.isAllSelected == false) {\n this.fakeSelectedItems = [...this.newlySelectedItems]; // Only for showing checkboxes, we will not send this to the backend\n } else if (this.isAllSelected == null) {\n let idsToInsert = [\n ...selectedRowsMethodResult.selectedIds,\n ...this.newlySelectedItems,\n ];\n idsToInsert = idsToInsert.filter(\n (x) => this.unselectedItems.includes(x) == false,\n );\n this.fakeSelectedItems = [...idsToInsert];\n }\n }\n\n clientLoad() {\n this.loading = false;\n\n this.loadFormArrayItems();\n this.totalRecords = this.items.length;\n this.onTotalRecordsChange.next(this.items.length);\n\n if (this.getAlreadySelectedItemIds) {\n this.selectedItemIds = this.getAlreadySelectedItemIds(\n this.additionalIndexes,\n );\n }\n if (this.getAlreadySelectedItems) {\n this.selectedItems = this.getAlreadySelectedItems(this.additionalIndexes);\n }\n this.rowsSelectedNumber = this.selectedItemIds.length;\n this.setFakeIsAllSelected();\n }\n\n private loadFormArrayItems() {\n this.items = this.getFormArrayItems(this.additionalIndexes);\n this.rangeAnchorId = null;\n this.items.forEach((item, index) => {\n item.index = index;\n });\n }\n\n /**\n * Single source for whether a column header offers click-to-sort (drives both\n * `pSortableColumnDisabled` and the sort icon). Beyond the consumer's explicit `sortable: false`,\n * `*CommaSeparated` fields are auto-disabled: the backend's `PaginatedResultGenerator` never emits\n * a sort case for collection columns (the same naming convention decides both), and since unknown\n * sort fields are rejected with a 400, a clickable header here would be a guaranteed error toast.\n */\n isColumnSortable(col: Column): boolean {\n return (\n col.sortable !== false &&\n !!col.field &&\n !col.field.endsWith('CommaSeparated')\n );\n }\n\n /** The column the header menu is currently open for, and its header cell. */\n menuColumn: Column | null = null;\n\n private menuHeaderCell: HTMLElement | null = null;\n\n private draggedColumn: Column | null = null;\n\n /** False while a gesture that began on the menu chevron or the resize grip is in flight. */\n private headerDragArmed = true;\n\n /**\n * A ViewChild rather than a template reference passed in from the header. The popover lives in\n * the CAPTION template and the button that opens it in the HEADER one, and a reference variable\n * does not cross an ng-template boundary — it arrived as undefined, and the click did nothing\n * at all.\n */\n private readonly columnMenu = viewChild.required<Popover>('columnMenu');\n\n private readonly filterBar = viewChild(SpiderlyFilterBarComponent);\n\n /**\n * Consumer-projected filter controls, forwarded to the bar. Collected here rather than by the\n * bar itself because the bar is OURS: a consumer's template is projected at the table, and\n * content queries only see what was projected into the component that declares them.\n */\n @ContentChildren(SpiderlyFilterTemplateDirective)\n filterTemplates: QueryList<SpiderlyFilterTemplateDirective>;\n\n private readonly selectionHeader =\n viewChild<ElementRef<HTMLElement>>('selectionHeader');\n\n openColumnMenu(col: Column, event: Event): void {\n this.menuColumn = col;\n // Kept so `fitMenuColumn` can find the column's cells: it needs the header's position among\n // its siblings, which is the only thing that ties a Column to a table column in the DOM.\n this.menuHeaderCell = (event.target as HTMLElement).closest('th');\n this.columnMenu().toggle(event);\n }\n\n /**\n * Switches to a view. Clears first, always: a view is a STATE rather than an addition, and two\n * of them composed produce a question nobody asked. The clear runs through the store directly\n * rather than through `clear()`, whose requery effect would spend a fetch before the entering\n * view's filters are in place.\n */\n selectView(view: TableView): void {\n this.activeViewId = view.id;\n // Always writes — including the first view, so a deliberate \"Sve\" during a deploy race\n // sticks, and so an explicit pick beats a stored id whose view has not arrived yet\n // (`adoptStoredView` compares against this key).\n this.persistActiveView();\n\n // The keys just changed under us, so the layout has to be re-read for the view being entered\n // — otherwise the one being left keeps rendering until something else forces a reload.\n this.restoreColumnVisibility();\n this.restoreColumnLayout();\n this.refreshVisibleCols();\n\n // Sort is view state too (decision 10's sort half). Swapped BEFORE the filter transition so\n // the one request the requery effect sends carries both.\n const sortChanged = this.applyViewSort();\n\n if (!this.filters) {\n if (sortChanged) this.table.sortMultiple();\n return;\n }\n\n const appliedBefore = this.filters.applied();\n\n // The filter key moved with the view too; `enterViewFilters` holds the stored-wins and\n // transient rules.\n this.filters.clear();\n this.enterViewFilters(view, 'click');\n\n // The requery effect runs only when the applied set actually changed — `clear()` on an\n // already-empty store writes nothing (two views sharing one filter answer are exactly that)\n // — so a sort-only switch fetches here. `applied` is a computed: reference equality across\n // the transition means none of its sources moved.\n if (sortChanged && this.filters.applied() === appliedBefore) {\n this.refetchFromFirstPage();\n }\n }\n\n /**\n * The filter this column stands for. Defaults to the column's own `field`, because a store id\n * IS a backend property name — `toFilterPayload` emits it straight into `Filter.filters`. So\n * `filterId` is an escape hatch for the rare mismatch, not something every column restates:\n * all eight of the first migrated table's declarations were the field name written a second\n * time.\n */\n private filterIdFor(col: Column): string | undefined {\n return col.filterId ?? col.field;\n }\n\n /**\n * Asks the STORE, not the column. Checking only that an id was declared let a typo through to\n * `store.get(id)`, which reads `definitions[id].label` — so a mistyped id threw on click rather\n * than greying the item out. With 195 declarations to migrate, that is the failure mode worth\n * closing here rather than in each consumer.\n */\n canFilterColumn(col: Column): boolean {\n const id = this.filterIdFor(col);\n\n return id != null && this.filters?.definitions[id] != null;\n }\n\n /**\n * Opens the bar's editor for this column's filter. The bar took the filter off the header and\n * the header is still where an operator reaches for it, which is twenty-seven tables' worth of\n * habit; this is the shortcut back rather than a second filter surface — it drives the same\n * editor, on the same bar, that `+ Filter` opens.\n */\n filterMenuColumn(): void {\n const col = this.menuColumn;\n this.columnMenu().hide();\n if (!col || !this.canFilterColumn(col)) return;\n\n this.filterBar()?.startEditing(this.filterIdFor(col)!);\n }\n\n /**\n * Sorts by this column in the NAMED direction. Clicking a header cycles asc, desc and off,\n * which is fine for one column and a guess for a direction someone wants now — you click, look,\n * and click again if it went the other way. This is also the only sort path that works from a\n * keyboard.\n *\n * A column the generated paginator has no sort case for answers every load with a 400, so the\n * items are disabled by the same predicate that keeps its header from being clickable.\n */\n sortMenuColumn(order: 1 | -1): void {\n const col = this.menuColumn;\n this.columnMenu().hide();\n if (!col?.field || !this.isColumnSortable(col)) return;\n\n this.applySort([{ field: col.field, order }]);\n }\n\n /**\n * Sizes the column to the widest thing in it. The cheaper escape from a cramped column: no\n * drag, no aim. Unlike a drag it does NOT trade with the neighbour — a minimum that grew is\n * exactly the case decision 4 lets push the table past its container and start scrolling.\n *\n * Measures the CELL CONTENT, not the cell: the clamp lives on the inner span, so a `td` reports\n * a scrollWidth that fits while the text inside it does not.\n */\n fitMenuColumn(): void {\n const col = this.menuColumn;\n const th = this.menuHeaderCell;\n this.columnMenu().hide();\n if (!col?.field || !th?.parentElement) return;\n\n // Walked up from the header rather than reached through PrimeNG's own ElementRef: the th is\n // the only thing that ties a Column to a table column in the DOM, and it already knows which\n // table it is in.\n const index = Array.from(th.parentElement.children).indexOf(th) + 1;\n const cells = th\n .closest('table')\n ?.querySelectorAll<HTMLElement>(`tbody tr > td:nth-child(${index})`);\n if (!cells?.length) return;\n\n // Padding comes from one CSS rule for every cell in the column, so it is read once off the\n // first — a getComputedStyle per cell was a hundred style flushes for one number.\n const styles = getComputedStyle(cells[0]);\n const padding =\n (parseFloat(styles.paddingLeft) || 0) +\n (parseFloat(styles.paddingRight) || 0);\n\n // Cells AND their descendants in one query rather than one per cell: the clamp lives on an\n // inner span, so a td reports a scrollWidth that fits while the text inside it does not, and\n // a consumer's cell template can nest the overflowing element arbitrarily deep.\n const content = th\n .closest('table')!\n .querySelectorAll<HTMLElement>(\n `tbody tr > td:nth-child(${index}), tbody tr > td:nth-child(${index}) *`,\n );\n\n let widest = th.scrollWidth;\n for (const node of Array.from(content)) {\n widest = Math.max(widest, node.scrollWidth + padding);\n }\n this.columnWidths[col.field] = this.shareThatFits(col, th, widest);\n this.persistColumnLayout();\n }\n\n /**\n * The share that actually yields `needed` pixels — not `needed` scaled by the column's current\n * px-per-share, which is the obvious answer and the wrong one. Shares are a PROPORTION of\n * whatever width the table has, so growing this column's share also shrinks the realized width\n * of every other column, and the naive figure lands short. The spec caught it as a cell that\n * was still clipped after being told to fit.\n *\n * While the columns fit, the table keeps the container's width and the proportion has to solve\n * needed / tableWidth = newShare / (otherShares + newShare)\n * with `otherShares` recovered from what this column currently renders at. Once `needed` is the\n * whole container the proportional regime has no answer: the table is about to overrun its\n * container and scroll (decision 4), and there a share IS its own length, so the pixels convert\n * straight through the root font size.\n */\n private shareThatFits(col: Column, th: HTMLElement, needed: number): number {\n const share = this.columnShare(col);\n const thPx = Math.max(th.offsetWidth, 1);\n const tableWidth = (th.closest('table') as HTMLElement | null)?.offsetWidth ?? 0;\n\n if (needed < tableWidth) {\n const otherShares = (share * (tableWidth - thPx)) / thPx;\n\n return (needed * otherShares) / (tableWidth - needed);\n }\n\n return needed / rootFontSizePx();\n }\n\n hideMenuColumn(): void {\n if (this.menuColumn) this.toggleColumn(this.menuColumn, false);\n this.columnMenu().hide();\n }\n\n /**\n * Whether this column's cells give up the one-line clamp. The DEFAULT stays clamped\n * (CLAUDE.md -> \"Operator-owned view\", decision 9); what changes is that the operator picks\n * which column pays the row height, not whoever wrote `cols`.\n *\n * Lands on the td as `.cell-wrap`, whose inherited `--spiderly-cell-*` properties are how the\n * toggle crosses into a projected `spiderlyCellTemplate` too — the contract's one telling is\n * on that SCSS rule; a consumer clamp that hard-codes its values opts out.\n */\n isColumnWrapped(col: Column): boolean {\n return col.field != null && this.columnWrap[col.field] === true;\n }\n\n get isMenuColumnWrapped(): boolean {\n return this.menuColumn != null && this.isColumnWrapped(this.menuColumn);\n }\n\n toggleWrapForMenuColumn(): void {\n const col = this.menuColumn;\n this.columnMenu().hide();\n if (!col?.field) return;\n\n if (this.columnWrap[col.field]) delete this.columnWrap[col.field];\n else this.columnWrap[col.field] = true;\n\n this.persistColumnLayout();\n }\n\n /** Exposed for the template: actions columns carry no field and get no menu. */\n isDataColumn(col: Column): boolean {\n return SpiderlyDataTableComponent.isDataColumn(col);\n }\n\n /**\n * What the grid is ordered by, resolved to COLUMN NAMES for the bar. Read off PrimeNG's live\n * meta rather than mirrored into a field, so it cannot fall out of step with the sort the table\n * is actually applying. A field with no column left (hidden, or removed in a later release)\n * falls back to its own name rather than vanishing from the list.\n */\n /**\n * What the grid is ordered by, resolved to COLUMN NAMES for the bar.\n *\n * A field refreshed per fetch, not a getter: it is bound to the bar's `sort`, which is a SIGNAL\n * input, so a freshly mapped array failed `Object.is` on every change-detection pass and marked\n * the bar's consumers dirty forever — for a value that changes once per request. Same reason\n * `tableStyle` is a field.\n */\n sortKeys: SortKeyLabel[] = [];\n\n /**\n * Read off the last REQUEST's sort, not `table._multiSortMeta`. On a first load with a declared\n * default that field is still null: `applyDefaultSortIfUnsorted` writes the default onto the\n * lazy-load event, and PrimeNG fills its own meta only once someone clicks a header. Reading the\n * table there showed no sort on exactly the tables that always have one. A field with no column\n * left falls back to its own name rather than vanishing.\n */\n private refreshSortKeys(): void {\n const meta = this.lastLazyLoadEvent?.multiSortMeta ?? [];\n\n this.sortKeys = meta.map((key) => ({\n field: key.field,\n // A sort may name a field no column declares (keepSortableMeta allows it), and its chip\n // must still speak the operator's language: the same PascalCase-key convention the\n // scaffold seeds resolves it (Transloco falls back to the key, so worst case reads\n // \"CreatedAt\", never the raw camelCase identifier).\n label:\n this.cols.find((col) => col.field === key.field)?.name ??\n this.translocoService.translate(firstCharToUpper(key.field)),\n descending: key.order === -1,\n }));\n this.sortIsDefault = sortMetaEquals(meta, this.defaultMultiSortMeta() ?? []);\n }\n\n /**\n * Gates the picker's reset row. Refreshed with `sortKeys` — same request, same reason it is a\n * field rather than a getter. \"Default\" is view-aware (`defaultMultiSortMeta`), so inside a\n * view the row offers the view's ordering back, not the table's.\n */\n sortIsDefault = true;\n\n /**\n * What the bar's picker offers: every sortable data column, hidden ones INCLUDED — the picker\n * exists so an ordering does not need its column on screen. Built once in `ngOnInit` (columns\n * are a declaration, not state) and labelled here because the bar knows nothing about columns.\n */\n sortPickOptions: SortPickOption[] = [];\n\n /**\n * The one body of an explicit sort GESTURE — the thing `persistActiveViewSort`'s doc calls\n * \"explicit gestures only\": page one, meta on the grid, fetch, save, selection anchor\n * invalidated, override recorded. Shared by the header's single-click un-sort, the header\n * menu and both bar entry points; `broadcastSort` is its deliberate no-fetch sibling. The\n * page reset, `saveState` and anchor line mirror PrimeNG's own `sort()` (`sortMultiple()`\n * does none of the three); the \"lands on page one\" / \"survives a reload\" specs pin why.\n */\n private applySort(meta: SortMeta[]): void {\n if (this.table.resetPageOnSort) {\n this.table._first = 0;\n this.table.firstChange.emit(0);\n }\n\n this.table._multiSortMeta = meta;\n this.table.sortMultiple();\n\n if (this.table.isStateful()) this.table.saveState();\n this.table.anchorRowIndex = null;\n this.persistActiveViewSort();\n }\n\n /** The picker's ask: one sort, replacing the whole meta — the same contract as the header menu. */\n sortFromBar(pick: SortMeta): void {\n this.applySort([pick]);\n }\n\n /**\n * Back to the resolved default — the view's declared sort, else the table default, else\n * unsorted. Persisting right after is what empties the override slot: a sort equal to the\n * default is stored as absence, so the declared ordering flows through again.\n */\n resetSortFromBar(): void {\n this.applySort(this.defaultMultiSortMeta() ?? []);\n }\n\n /** This column's share, override first, then its declared width, then the per-type default. */\n columnShare(col: Column): number {\n if (col.field && this.columnWidths[col.field] != null) {\n return this.columnWidths[col.field];\n }\n\n if (col.width != null) return this.shareOfDeclaredWidth(col);\n\n return this.defaultShare(col);\n }\n\n /**\n * A declared width expressed in SHARE units. rem IS the share unit and px converts; any other\n * unit falls back to the per-type default rather than being read as a bare number.\n *\n * `parseFloat` alone shipped here first, so `width: '150px'` resolved to share 150 against\n * neighbours at 12 — one column eating the grid on the first drag or fit. Every declared width\n * in the consumer happens to be rem today, which is exactly why nothing would have caught it.\n */\n private shareOfDeclaredWidth(col: Column): number {\n const declared = col.width!.trim();\n const value = parseFloat(declared);\n\n if (Number.isNaN(value)) return this.defaultShare(col);\n if (declared.endsWith('rem')) return value;\n if (declared.endsWith('px')) return value / rootFontSizePx();\n\n return this.defaultShare(col);\n }\n\n private defaultShare(col: Column): number {\n if (col.filterType) return DEFAULT_COLUMN_WIDTH_REM[col.filterType];\n\n // What is left declares no filterType: an actions column. It cannot shrink to fit any more,\n // so the icons need a reservation — each sits in a flex row whose gap is set beside them in\n // the template, inside the cell's own padding. 2.5, not 2.2, so the arithmetic stays exact in\n // binary and the string never reads `8.6000000001rem`.\n return 2 + (col.actions?.length ?? 0) * 2.5;\n }\n\n /**\n * Trades share between the column being dragged and the one on its right, so the table keeps\n * its total: widening a column never starts a horizontal scroll by itself, which only happens\n * once the SUM of the minimums stops fitting. The px delta is converted through the column's\n * own rendered width, which is the only place the share-to-pixel scale is actually known.\n */\n startColumnResize(col: Column, event: MouseEvent, th: HTMLElement): void {\n event.preventDefault();\n event.stopPropagation();\n\n const neighbour = this.visibleCols[this.visibleCols.indexOf(col) + 1];\n if (!col.field || !neighbour?.field) return;\n\n const controller = new AbortController();\n this.resizeAbort?.abort();\n this.resizeAbort = controller;\n\n const startX = event.clientX;\n const startShare = this.columnShare(col);\n const neighbourShare = this.columnShare(neighbour);\n const sharePerPx = startShare / Math.max(th.offsetWidth, 1);\n // A column that reaches zero share disappears with no way back from the header it lost.\n const floor = 2;\n\n const neighbourCell = th.nextElementSibling as HTMLElement | null;\n let applied = 0;\n\n const onMove = (move: MouseEvent) => {\n const delta = (move.clientX - startX) * sharePerPx;\n applied = Math.max(\n Math.min(delta, neighbourShare - floor),\n floor - startShare,\n );\n\n // The preview is written straight to the two header cells. Under the fixed layout their\n // widths are what lay the grid out, so this IS the live drag — and it costs no change\n // detection, where routing it through `columnWidths` ran a full-grid pass per mouse move\n // (~60/sec) to move two cells. The bindings overwrite these on the next pass anyway.\n th.style.width = `${startShare + applied}rem`;\n if (neighbourCell) {\n neighbourCell.style.width = `${neighbourShare - applied}rem`;\n }\n };\n\n const onUp = () => {\n controller.abort();\n this.resizeAbort = null;\n\n this.zone.run(() => {\n this.columnWidths[col.field!] = startShare + applied;\n this.columnWidths[neighbour.field!] = neighbourShare - applied;\n this.persistColumnLayout();\n });\n\n // Sorting hangs off CLICK, which stopPropagation on mousedown never touched — so every\n // resize also reordered the grid. Swallowing the click on the grip is not enough either:\n // on a drag that ends away from it, the click fires on their common ancestor, the th.\n // One capturing listener, once, on the document.\n const swallow = (click: MouseEvent) => {\n click.stopPropagation();\n click.preventDefault();\n };\n document.addEventListener('click', swallow, {\n capture: true,\n once: true,\n });\n // Removed on the next tick rather than left to `once`. The click that follows a mouseup\n // fires synchronously, so this always catches it — while a drag that ends with no click at\n // all (the pointer leaves the window, the operator navigates away) would otherwise leave a\n // listener sitting on the document to eat someone's next click entirely.\n setTimeout(() =>\n document.removeEventListener('click', swallow, { capture: true }),\n );\n };\n\n // One controller for the pair, aborted by `onUp` AND by ngOnDestroy. Left to `removeEventListener`\n // inside `onUp` alone, navigating away mid-drag stranded `mousemove` on the document — patched\n // by zone.js, so it ticked the app on every mouse move for the rest of the session, with its\n // closure pinning the dead component and the page of rows it captured.\n this.zone.runOutsideAngular(() => {\n document.addEventListener('mousemove', onMove, {\n signal: controller.signal,\n });\n document.addEventListener('mouseup', onUp, { signal: controller.signal });\n });\n }\n\n /**\n * The column's declared {@link Column.width}, or the default for its filter type.\n *\n * A width, not a minimum: under the fixed layout {@link tableStyle} establishes, this is what\n * the column is sized from, and the table shares its surplus in PROPORTION to these numbers.\n * Columns declaring none would otherwise take an equal share, which throws away what the\n * per-type defaults say — a boolean holds \"Da\"/\"Ne\", a text column holds a name.\n */\n getColWidth(col: Column): string {\n const override = col.field ? this.columnWidths[col.field] : undefined;\n if (override != null) return `${override}rem`;\n\n // A declared width passes through VERBATIM so a consumer keeps % and px; every other branch is\n // a share and renders in rem. Both halves resolve through `columnShare` otherwise, because\n // this chain and that one were written twice and had already drifted apart on the px case.\n if (col.width != null) return col.width;\n\n return `${this.defaultShare(col)}rem`;\n }\n\n /*\n * Navigate to details page based on rowId and rowNavigationPath.\n * If rowNavigationPath is provided, it will navigate to that path with the rowId.\n * If not, it will navigate to the current route with the rowId.\n */\n navigateToDetails(rowId: number): void {\n if (rowId == null) return;\n\n if (this.rowNavigationPath) {\n const cleanPath = this.rowNavigationPath.replace(/^\\/|\\/$/g, ''); // Remove leading and trailing slashes\n\n this.router.navigateByUrl(`/${cleanPath}/${rowId}`);\n } else {\n this.router.navigate([rowId], { relativeTo: this.route });\n }\n }\n\n /**\n * Handle row click event. Arbitration between \"this click navigates the row\" and \"this click\n * belongs to a control inside the row\" happens HERE, once, rather than in each interactive\n * surface: anything marked `.row-interactive` (the selection cell, the actions column, editable\n * cells, opted-in `onCellClick` cells) owns its own click and never navigates. Per-surface\n * `stopPropagation` used to be the mechanism and was structurally lossy — the actions column\n * never had one, so a Delete click opened the dialog AND navigated away. Mark new interactive\n * cells with the class; don't add another stop.\n */\n onRowClick(row: any, event: MouseEvent): void {\n if (!this.navigateOnRowClick) return;\n if ((event.target as HTMLElement)?.closest?.('.row-interactive')) return;\n\n this.navigateToDetails(row?.[this.idField]);\n }\n\n /*\n * Handle a cell click. Only columns that opt in (have an `onCellClick` callback) react; for them\n * we stop propagation so the click does not also trigger row navigation, then invoke the consumer\n * callback with a fully-populated CellClickEvent. Inert cells fall through to onRowClick unchanged.\n */\n onCellClick(col: Column, rowData: any, event: MouseEvent): void {\n if (!col.onCellClick) return;\n event.stopPropagation();\n col.onCellClick({\n ...this.buildClickEvent(rowData, event),\n field: col.field,\n value: rowData[col.field],\n displayValue: this.getRowData(rowData, col),\n });\n }\n\n /*\n * Build the base click payload shared by custom action clicks and cell clicks. The clicked element\n * is captured here, not read later from `originalEvent.currentTarget` (which nulls after dispatch).\n */\n private buildClickEvent(rowData: any, event: MouseEvent): ActionClickEvent {\n return {\n id: rowData[this.idField],\n row: rowData,\n element: event.currentTarget as HTMLElement,\n originalEvent: event,\n };\n }\n\n deleteObject(rowId: number) {\n this.openDeleteConfirmation(\n {\n deleteItemFromTableObservableMethod:\n this.deleteItemFromTableObservableMethod,\n id: rowId,\n message: this.translocoService.translate('PleaseConfirmToProceed'),\n },\n 'SuccessfullyDeletedMessage',\n );\n }\n\n deleteSelectedObjects() {\n const selectedIds = [...this.newlySelectedItems];\n\n if (selectedIds.length === 0) return;\n\n this.openDeleteConfirmation(\n {\n deleteListFromTableObservableMethod:\n this.deleteListFromTableObservableMethod,\n ids: selectedIds,\n message: this.translocoService.translate('DeleteBulkConfirmation', {\n count: selectedIds.length,\n }),\n },\n 'SuccessfullyDeletedListMessage',\n () => this.resetSelection(),\n );\n }\n\n private openDeleteConfirmation(\n data: DeleteConfirmationData,\n successMessageKey: string,\n onSuccess?: () => void,\n ) {\n this.deleteRef = this.dialogService.open(\n SpiderlyDeleteConfirmationComponent,\n {\n header: this.translocoService.translate('AreYouSure'),\n width: '400px',\n data,\n },\n );\n\n this.deleteRef.onClose\n .pipe(takeUntil(this.destroy$))\n .subscribe((deletedSuccessfully: boolean) => {\n if (deletedSuccessfully === true) {\n this.messageService.successMessage(\n this.translocoService.translate(successMessageKey),\n );\n onSuccess?.();\n this.reload();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n this.selectionWidthObserver?.disconnect();\n this.resizeAbort?.abort();\n }\n\n get showSelectAllCheckbox(): boolean {\n return (\n this.selectionMode === 'multiple' &&\n this.selectedLazyLoadObservableMethod != null\n );\n }\n\n private resetSelection() {\n this.newlySelectedItems.length = 0;\n this.unselectedItems.length = 0;\n this.fakeSelectedItems = [];\n this.rowsSelectedNumber = 0;\n this.isAllSelected = null;\n this.fakeIsAllSelected = false;\n }\n\n /**\n * A COMMITTED filter re-queries; a draft does not. Re-fetching per keystroke would be the same\n * lie the chip bar exists to prevent, only paid for in requests rather than in credibility.\n *\n * Back to page one first, and off FRESH metadata rather than `reload()`: that one replays the\n * cached lazy-load event, whose `first` was copied when the event was built, so a filter applied\n * from page 3 would keep asking the server to skip 50 rows a narrower result set does not have.\n * The grid comes back empty for a value that is definitely in it.\n *\n * The first run is PrimeNG's: it fires the initial lazy load itself, and re-querying here would\n * make every table load twice.\n */\n private requeryOnAppliedFilters(): void {\n let isFirstRun = true;\n\n effect(\n () => {\n this.filters!.applied();\n\n if (isFirstRun) {\n isFirstRun = false;\n return;\n }\n\n this.persistAppliedFilters();\n this.refetchFromFirstPage();\n },\n { injector: this.injector },\n );\n }\n\n /**\n * Back to page one, state saved, one fetch off FRESH metadata — the shared tail of the\n * requery effect and `selectView`'s sort-only switch. The save is load-bearing: PrimeNG\n * saves state only from its own interactions, so without it the pre-change page offset\n * survives in storage and the NEXT visit replays it against a narrowed result set — the\n * backend answers data=[] for an offset the filtered total no longer reaches, and the grid\n * renders empty under chips claiming matches.\n */\n private refetchFromFirstPage(): void {\n this.table.first = 0;\n this.table.firstChange.emit(0);\n if (this.table.isStateful()) this.table.saveState();\n this.lazyLoad(this.table.createLazyLoadMetadata());\n }\n\n reload() {\n // Nothing to replay before the table's own initial load, which is already on its way.\n if (this.lastLazyLoadEvent == null) return;\n\n // Not special: same refetch as a page flip, so lazyLoad owns both the flag and `items`.\n this.lazyLoad(this.lastLazyLoadEvent);\n }\n\n showActions(): boolean {\n return this.cols.some((x) => x.actions?.length > 0);\n }\n\n getStyleForBodyColumn(col: Column<any>) {\n switch (col.filterType) {\n case 'numeric':\n return 'text-align: right;';\n default:\n return null;\n }\n }\n\n getClassForAction(action: Action): string {\n switch (action.field) {\n case 'Details':\n return 'pi pi-pencil';\n case 'Delete':\n return 'pi pi-trash';\n default:\n return `${action.icon} ${action.styleClass}`;\n }\n }\n\n getStyleForAction(action: Action): string {\n switch (action.field) {\n case 'Delete':\n return 'cursor: pointer; color: var(--p-button-danger-background);';\n default:\n return `cursor: pointer; ${action.style}`;\n }\n }\n\n getMethodForAction(action: Action, rowData: any, event: MouseEvent) {\n switch (action.field) {\n case 'Details':\n return this.navigateToDetails(rowData[this.idField]);\n case 'Delete':\n return this.deleteObject(rowData[this.idField]);\n default:\n return action.onClick(this.buildClickEvent(rowData, event));\n }\n }\n\n getRowData(rowData: any, col: Column): string {\n switch (col.filterType) {\n case 'text':\n return rowData[col.field];\n case 'date':\n if (rowData[col.field] == null) return null;\n\n if (col.showTime)\n return formatDate(rowData[col.field], 'short', this.locale);\n\n const raw = rowData[col.field];\n const local = typeof raw === 'string' ? parseDateOnlyLocal(raw) : null;\n return formatDate(local ?? raw, 'shortDate', this.locale);\n case 'multiselect': {\n // Translate through the column's own option list. Without this the cell shows the stored\n // value, so an enum column reads `1` instead of \"Info\", and an FK column reads the id.\n //\n // Match on `code`, not `value`: that is the property PrimengOption carries (see the note\n // on the class). The raw value is the fallback rather than an empty cell, because the\n // options are usually filled asynchronously after the first paint — blanking the column\n // until they land would be a worse regression than the number this replaces.\n const multiselectValue = rowData[col.field];\n if (multiselectValue == null) return null;\n\n const option = col.dropdownOrMultiselectValues?.find(\n (x) => x.code === multiselectValue,\n );\n return option?.label ?? multiselectValue;\n }\n case 'boolean':\n return rowData[col.field] == true\n ? this.translocoService.translate('Yes')\n : this.translocoService.translate('No');\n case 'numeric':\n if (rowData[col.field] == null) return null;\n return formatNumber(\n rowData[col.field],\n this.locale,\n col.decimalPlaces != null\n ? `1.${col.decimalPlaces}-${col.decimalPlaces}`\n : '1.0-2',\n );\n case 'blob':\n return getHtmlImgDisplayString64(rowData[col.field]);\n default:\n return null;\n }\n }\n\n colTrackByFn(index, item) {\n return item.field;\n }\n\n actionTrackByFn(index, item: Action) {\n return `${index}${item.field}`;\n }\n\n exportListToExcel() {\n let filter: Filter = this.lastLazyLoadEvent as unknown as Filter;\n filter.additionalFilterIdLong = this.additionalFilterIdLong;\n\n exportListToExcel(this.exportListToExcelObservableMethod, filter);\n }\n\n /**\n * Clears the FILTERS — and nothing else (2026-09-06, grilled). It used to also reach the\n * sort and PrimeNG's persisted state, which made \"Clear filters\" a reset the label never\n * claimed: sort is its own channel with its own affordances (the bar's picker, the header's\n * tri-state), mirroring Polaris, where onClearAll is wired to the Filters while\n * sortSelected never passes through it. The store's requery effect owns the refetch and the\n * persisted-snapshot update — the button only renders with chips on the bar, so the applied\n * set always changes — and dropping table.clear() also drops the second, unsequenced\n * request the 2026-09-05 review flagged on every Clear.\n */\n clear() {\n this.filters?.clear();\n }\n\n //#region Selection\n\n setFakeIsAllSelected() {\n if (this.rowsSelectedNumber == this.totalRecords)\n this.fakeIsAllSelected = true;\n else this.fakeIsAllSelected = false;\n }\n\n selectAll(checked: boolean) {\n this.unselectedItems.length = 0;\n this.newlySelectedItems.length = 0;\n\n if (checked == true) {\n this.isAllSelected = true;\n this.fakeIsAllSelected = true;\n this.onIsAllSelectedChange.next(\n new AllClickEvent({\n checked: true,\n additionalIndexes: this.additionalIndexes,\n }),\n );\n this.rowsSelectedNumber = this.totalRecords;\n this.fakeSelectedItems = [...this.items.map((x) => x[this.idField])];\n this.selectedItemIds = [...this.items.map((x) => x[this.idField])];\n } else {\n this.isAllSelected = false;\n this.fakeIsAllSelected = false;\n this.onIsAllSelectedChange.next(\n new AllClickEvent({\n checked: false,\n additionalIndexes: this.additionalIndexes,\n }),\n );\n this.rowsSelectedNumber = 0;\n this.fakeSelectedItems = [];\n this.selectedItemIds = [];\n }\n }\n\n /**\n * Captures the shift state for the checkbox change this press produces — id-paired so an\n * aborted press can never leak into a later toggle (see CLAUDE.md). Also stops shift+click\n * from extending the browser text selection, which starts at mousedown.\n */\n onSelectionCellMouseDown(event: MouseEvent, id: number) {\n // Arm only for a press on the checkbox itself: a press on the surrounding cell produces no\n // `change`, so arming there would strand the flag until some later toggle consumed it. The\n // text-selection preventDefault still covers the whole cell.\n if ((event.target as HTMLElement).closest('p-checkbox')) {\n this.pendingShift = { shiftKey: event.shiftKey, id };\n }\n if (event.shiftKey) event.preventDefault();\n }\n\n /**\n * The rows the user can currently see, in display order — PrimeNG's own answer, so it cannot\n * drift from what the table paints (it applies `filteredValue` and the paginator slice, and\n * caps lazy pages at `rows` even when the server overshoots). Resolving a range over raw\n * `items` would sweep filtered-out or off-page rows sitting between two visually adjacent\n * ones. An anchor outside this window misses and the shift-click degrades to a plain toggle.\n */\n private renderedRows(): any[] {\n return this.table?.dataToRender(null) ?? this.items;\n }\n\n selectRow(id: number, index: number) {\n const shiftRange =\n this.pendingShift?.id === id && this.pendingShift.shiftKey;\n this.pendingShift = null;\n\n // `null` is the no-anchor sentinel, so it must never resolve to a row: a client-side table\n // can hold unsaved rows whose idField is null, and findIndex would happily match one.\n if (shiftRange && this.rangeAnchorId != null && id != null) {\n const rendered = this.renderedRows();\n const indexOf = (rowId: number) =>\n rendered.findIndex((x) => x[this.idField] === rowId);\n const anchorIndex = indexOf(this.rangeAnchorId);\n const clickedIndex = indexOf(id);\n\n if (anchorIndex !== -1 && clickedIndex !== -1) {\n // The clicked checkbox's NEW state, applied to the whole range. Our model hasn't been\n // updated for this click yet, so the new state is the negation of what we hold.\n this.applyRange(\n rendered,\n anchorIndex,\n clickedIndex,\n !this.isRowSelected(id),\n );\n this.rangeAnchorId = id;\n return;\n }\n }\n\n this.toggleRow(id, index);\n this.rangeAnchorId = id;\n }\n\n /** Single-row toggle — the plain-click path. */\n private toggleRow(id: number, index: number) {\n if (this.isRowSelected(id)) {\n this.rowUnselect(id);\n this.onRowUnselect.next(\n new RowClickEvent({\n index: index,\n id: id,\n additionalIndexes: this.additionalIndexes,\n }),\n );\n } else {\n this.rowSelect(id);\n this.onRowSelect.next(\n new RowClickEvent({\n index: index,\n id: id,\n additionalIndexes: this.additionalIndexes,\n }),\n );\n }\n }\n\n /**\n * Applies `select` to every row between the two positions in `rows` (inclusive), skipping rows\n * already in the target state; each change goes through `toggleRow` so the delta model and\n * per-row events stay identical to manual clicks (see CLAUDE.md). The event payload keeps\n * `row.index` for parity with what the single-click template binding passes.\n */\n private applyRange(\n rows: any[],\n fromIndex: number,\n toIndex: number,\n select: boolean,\n ) {\n const start = Math.min(fromIndex, toIndex);\n const end = Math.max(fromIndex, toIndex);\n\n for (let i = start; i <= end; i++) {\n const rowId = rows[i][this.idField];\n if (this.isRowSelected(rowId) !== select) {\n this.toggleRow(rowId, rows[i].index);\n }\n }\n }\n\n isRowSelected(id: number) {\n if (this.hasLazyLoad) {\n return this.fakeSelectedItems.find((x) => x === id) != undefined;\n } else {\n return this.selectedItemIds.find((x) => x === id) != undefined;\n }\n }\n\n rowSelect(id: number) {\n if (\n this.isAllSelected == false ||\n this.currentPageSelectedItemsFromDb.includes(id) == false\n ) {\n this.newlySelectedItems.push(id);\n }\n\n if (this.hasLazyLoad) {\n this.fakeSelectedItems.push(id);\n } else {\n this.selectedItemIds.push(id);\n }\n\n this.rowsSelectedNumber++;\n\n const index = this.unselectedItems.indexOf(id);\n if (index !== -1) {\n this.unselectedItems.splice(index, 1); // Splice is mutating the array\n }\n\n this.setFakeIsAllSelected();\n }\n\n rowUnselect(id: number) {\n if (\n this.isAllSelected == true ||\n this.currentPageSelectedItemsFromDb.includes(id) == true\n ) {\n this.unselectedItems.push(id);\n }\n\n this.rowsSelectedNumber--;\n\n const index = this.newlySelectedItems.indexOf(id);\n const fakeIndex = this.fakeSelectedItems.indexOf(id);\n const nonLazyLoadIndex = this.selectedItemIds.indexOf(id);\n\n if (index !== -1) {\n this.newlySelectedItems.splice(index, 1); // Splice is mutating the array\n }\n if (fakeIndex !== -1) {\n this.fakeSelectedItems.splice(fakeIndex, 1); // Splice is mutating the array\n }\n if (nonLazyLoadIndex !== -1) {\n this.selectedItemIds.splice(nonLazyLoadIndex, 1); // Splice is mutating the array\n }\n\n this.setFakeIsAllSelected();\n }\n //#endregion\n\n //#region Client side table\n\n // Can do it with Id also, because we are never adding the new record in the table at the same page.\n getFormArrayControlByIndex(\n formControlName: string,\n index: number,\n ): SpiderlyFormControl {\n if (this.getFormControl) {\n return this.getFormControl(\n formControlName,\n index,\n this.additionalIndexes,\n );\n } else {\n return null;\n }\n }\n\n //#endregion\n}\n\nexport class Action {\n name?: string;\n field?: string;\n icon?: string;\n style?: string;\n styleClass?: string;\n /**\n * Fired when a custom action is clicked. Receives an {@link ActionClickEvent} with the\n * row id, the full row object, the clicked DOM element (use it to anchor an overlay/popover),\n * and the original `MouseEvent`.\n *\n * Only fires for custom actions — the built-in `field` values `'Details'` and `'Delete'`\n * are handled internally and never invoke `onClick`.\n */\n onClick?: (event: ActionClickEvent) => void;\n\n constructor({\n name,\n field,\n icon,\n style,\n styleClass,\n onClick,\n }: {\n name?: string;\n field?: string;\n icon?: string;\n style?: string;\n styleClass?: string;\n onClick?: (event: ActionClickEvent) => void;\n } = {}) {\n this.name = name;\n this.field = field;\n this.icon = icon;\n this.style = style;\n this.styleClass = styleClass;\n this.onClick = onClick;\n }\n}\n\n/**\n * A saved question. The bar lets an operator BUILD one; a view is the one they ask every morning,\n * asked in a click — and without them the whole column-and-filter rework is a pile of knobs\n * someone re-sets daily (CLAUDE.md -> \"Operator-owned view\", decision 10).\n *\n * Declared in consumer code, not stored per user: with a handful of operators and a handful of\n * fixed daily jobs, shared built-in views cover the work, while personal saved views would drift\n * into five variants of the same question. Personal LAYOUT choices still persist on top, per view.\n */\nexport interface TableView<TFilters = any> {\n id: string;\n label: string;\n /**\n * Sets the filters this view asks for. Receives the table's own store, so a consumer writes it\n * with the store's typing. Called on a CLEARED store: a view is a state, not an addition.\n */\n apply?: (filters: TFilters) => void;\n /**\n * A view whose `apply` is a function of NOW — \"Danas primljene\", \"this week\". Selecting it\n * always re-runs `apply` instead of restoring what an earlier visit stored: under the normal\n * stored-wins rule a relative-date view clicked yesterday would restore yesterday's date under\n * a tab claiming \"today\". Layout (columns, widths, wrap) still persists per view as usual —\n * transience is about the QUESTION, not the furniture.\n */\n transient?: boolean;\n /**\n * The view's declared ordering — for the view whose question includes one (\"oldest shipped\n * first\" IS the work list, not a reading preference). Entering the view applies it; the\n * tri-state un-sort and Clear filters return to it instead of the table default; an operator's\n * own sort overrides it, persisted per view on store tables (decision 10's sort half). A view\n * declaring none keeps whatever ordering the grid already has, exactly as before this field\n * existed.\n */\n sort?: SortMeta[];\n}\n\nexport class Column<T = any> {\n name?: string;\n field?: string & keyof T;\n /**\n * The column's VALUE SHAPE: it sizes the column (`getColWidth`), picks the cell rendering\n * (`getRowData`, the blob branch) and the numeric right-align. The name is a fossil of the\n * header-filter era — filtering lives in the store handed to `[filters]` — kept because\n * renaming it would be a 195-declaration migration for zero behavior.\n */\n filterType?: 'text' | 'date' | 'multiselect' | 'boolean' | 'numeric' | 'blob';\n /**\n * The id of the filter in the table's store that this column stands for, which is what the\n * header menu's `Filter…` opens. A LINK, not a declaration: the filter exists in the store\n * whether or not any column names it, and a column needs this only to offer the shortcut.\n *\n * Untyped against the store on purpose — a `Column<T>` knows its row type and nothing about\n * which store it will be rendered beside, so the compile-time key check lives where the store\n * is declared (`createFilterStore`), not here.\n */\n filterId?: string;\n /**\n * @deprecated Dead since the header-filter deletion: NOTHING reads it. It survives on the type\n * only so details-table cols emitted by an OLDER Spiderly.SourceGenerators (which wrote\n * `showMatchModes: true`) still compile against this library during a mixed-version window —\n * a consumer on published NuGet generators plus an npm-linked library build. Delete it once\n * every consumer regenerates with a generator from this release or later (spiderly#407).\n */\n showMatchModes?: boolean;\n /**\n * @deprecated The same version-skew bridge as {@link showMatchModes}, and nothing else: older\n * generators emit `filterField: 'xxxId'` for every dropdown-typed details-table column, so\n * deleting it breaks the mixed window the moment a consumer adds one. NOTHING reads it —\n * filter ids live in the store, linked from a column via {@link filterId}. Delete with\n * `showMatchModes` (spiderly#407).\n */\n filterField?: string & keyof T;\n dropdownOrMultiselectValues?: PrimengOption[];\n actions?: Action[];\n editable?: boolean;\n showTime?: boolean;\n decimalPlaces?: number;\n sortable?: boolean;\n /**\n * Whether the column is initially rendered. Defaults to `true`. Declare `visible: false` for\n * columns that should be available in the column chooser but hidden until the user reveals them.\n */\n visible?: boolean;\n /**\n * Pins the column: it always renders and shows in the chooser as checked and disabled.\n * Use for the row's identifying column (e.g. a product's title) so the table can never\n * lose its anchor.\n */\n lockVisible?: boolean;\n /**\n * CSS length fixing this column's width (e.g. `'8rem'`). Overrides the per-type default,\n * which is generous for a column of short values.\n *\n * Declare a width on the columns that must stay NARROW and leave the flexible one undeclared:\n * the table distributes its surplus in proportion to the declared widths, so a column carrying\n * the long values wants the larger number, not a cap.\n */\n width?: string;\n /**\n * Fired when this column's cell is clicked. Receives a {@link CellClickEvent} with the row id,\n * the column field, the full row, the raw and formatted cell value, the clicked `<td>` element\n * (use it to anchor an overlay/popover), and the original `MouseEvent`.\n *\n * Setting this makes the cell visibly clickable (cursor + hover) and the click no longer bubbles\n * up to row navigation. The mirror of {@link Action.onClick}, but for plain value cells.\n * Not applied to editable cells — those belong to their inline input.\n */\n onCellClick?: (event: CellClickEvent) => void;\n\n constructor({\n name,\n field,\n filterType,\n filterId,\n showMatchModes,\n filterField,\n dropdownOrMultiselectValues,\n actions,\n editable,\n showTime,\n decimalPlaces,\n sortable,\n visible,\n lockVisible,\n width,\n onCellClick,\n }: {\n name?: string;\n field?: string & keyof T;\n filterType?: 'text' | 'date' | 'multiselect' | 'boolean' | 'numeric' | 'blob';\n filterId?: string;\n showMatchModes?: boolean;\n filterField?: string & keyof T;\n dropdownOrMultiselectValues?: PrimengOption[];\n actions?: Action[];\n editable?: boolean;\n showTime?: boolean;\n decimalPlaces?: number;\n sortable?: boolean;\n visible?: boolean;\n lockVisible?: boolean;\n width?: string;\n onCellClick?: (event: CellClickEvent) => void;\n } = {}) {\n this.name = name;\n this.field = field;\n this.filterType = filterType;\n this.filterId = filterId;\n this.showMatchModes = showMatchModes;\n this.filterField = filterField;\n this.dropdownOrMultiselectValues = dropdownOrMultiselectValues;\n this.actions = actions;\n this.editable = editable;\n this.showTime = showTime;\n this.decimalPlaces = decimalPlaces;\n this.sortable = sortable;\n this.visible = visible;\n this.lockVisible = lockVisible;\n this.width = width;\n this.onCellClick = onCellClick;\n }\n}\n\n/**\n * Payload passed to {@link Action.onClick} when a custom row action is clicked.\n * Every field is populated by the data table, so consumers can rely on them being present.\n */\nexport interface ActionClickEvent {\n /** The clicked row's id (`row[idField]`). */\n id: number;\n /** The full row object the action belongs to. */\n row: any;\n /**\n * The clicked action element — pass it as the anchor when opening an overlay/popover.\n * Captured at click time on purpose: `originalEvent.currentTarget` is reset to null once\n * dispatch ends, so it would already be null inside an async handler.\n */\n element: HTMLElement;\n /** The original DOM click event. */\n originalEvent: MouseEvent;\n}\n\n/**\n * Payload passed to {@link Column.onCellClick} when a cell is clicked. A superset of\n * {@link ActionClickEvent} (same `id` / `row` / `element` / `originalEvent`) plus the cell's\n * column and value. Every field is populated by the data table.\n */\nexport interface CellClickEvent extends ActionClickEvent {\n /** The clicked column's `field`. */\n field: string;\n /** The cell's raw value (`row[field]`). */\n value: any;\n /** The formatted value shown in the cell (what the table renders via `getRowData`). */\n displayValue: string;\n}\n\nexport class RowClickEvent {\n index?: number;\n id?: number;\n additionalIndexes?: any;\n\n constructor({\n index,\n id,\n additionalIndexes,\n }: {\n index?: number;\n id?: number;\n additionalIndexes?: any;\n } = {}) {\n this.index = index;\n this.id = id;\n this.additionalIndexes = additionalIndexes;\n }\n}\n\nexport class AllClickEvent {\n checked?: boolean;\n additionalIndexes?: any;\n\n constructor({\n checked,\n additionalIndexes,\n }: {\n checked?: boolean;\n additionalIndexes?: any;\n } = {}) {\n this.checked = checked;\n this.additionalIndexes = additionalIndexes;\n }\n}\n","<ng-container *transloco=\"let t\">\n <div\n #tableContainer\n class=\"spiderly-table-container\"\n [attr.aria-busy]=\"isPending\"\n [ngClass]=\"{\n 'card responsive-card-padding overflow-auto': showCardWrapper\n }\"\n >\n <p-table\n #dt\n [value]=\"items\"\n [rows]=\"rows\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [rowHover]=\"true\"\n [paginator]=\"showPaginator\"\n responsiveLayout=\"scroll\"\n [lazy]=\"hasLazyLoad\"\n (onLazyLoad)=\"lazyLoad($event)\"\n (onPage)=\"onPageChange(tableContainer)\"\n [totalRecords]=\"totalRecords\"\n class=\"spiderly-table\"\n [loading]=\"isPending\"\n [selectionMode]=\"selectionMode\"\n dataKey=\"id\"\n sortMode=\"multiple\"\n [multiSortMeta]=\"initialMultiSortMeta\"\n [stateKey]=\"resolvedStateKey\"\n [stateStorage]=\"stateStorage\"\n [tableStyle]=\"tableStyle\"\n >\n <ng-template pTemplate=\"caption\">\n <div class=\"table-header overflow-auto\">\n <div style=\"display: flex; align-items: center; gap: 8px\">\n <i class=\"{{ tableIcon }}\" style=\"font-size: 20px\"></i>\n <div style=\"margin: 0px; font-size: 17.5px\">{{ tableTitle }}</div>\n </div>\n <div style=\"display: flex; gap: 8px\">\n <ng-container\n *ngIf=\"actionsTemplate\"\n [ngTemplateOutlet]=\"actionsTemplate\"\n ></ng-container>\n <button\n pButton\n *ngIf=\"hasLazyLoad\"\n data-testid=\"column-chooser-button\"\n [label]=\"t('Columns')\"\n class=\"p-button-outlined\"\n style=\"flex: none\"\n icon=\"pi pi-sliders-h\"\n (click)=\"columnChooser.toggle($event)\"\n ></button>\n <button\n pButton\n *ngIf=\"showExportToExcelButton\"\n [label]=\"t('ExportToExcel')\"\n class=\"p-button-outlined\"\n style=\"flex: none\"\n icon=\"pi pi-download\"\n (click)=\"exportListToExcel()\"\n ></button>\n <button\n pButton\n *ngIf=\"showReloadTableButton\"\n [label]=\"t('Reload')\"\n class=\"p-button-outlined\"\n style=\"flex: none\"\n icon=\"pi pi-refresh\"\n (click)=\"reload()\"\n ></button>\n <button\n pButton\n *ngIf=\"deleteListFromTableObservableMethod && rowsSelectedNumber > 0\"\n [label]=\"t('DeleteSelected') + ' (' + rowsSelectedNumber + ')'\"\n class=\"p-button-danger\"\n style=\"flex: none\"\n icon=\"pi pi-trash\"\n (click)=\"deleteSelectedObjects()\"\n ></button>\n </div>\n </div>\n <!-- ONE menu for every column, with the target held in `menuColumn`. Rendering its items\n inside an @if keyed on the column would put them inside the popover's projected\n content, and PrimeNG does not re-project content an @if has destroyed — the filter\n bar's editor lost a whole afternoon to exactly that. -->\n <p-popover #columnMenu>\n <div class=\"column-menu\" role=\"menu\">\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"column-menu-item\"\n data-testid=\"column-menu-hide\"\n [disabled]=\"!menuColumn || !canToggleColumn(menuColumn)\"\n (click)=\"hideMenuColumn()\"\n >\n <i class=\"pi pi-eye-slash\"></i>\n <span class=\"column-menu-item-label\">{{ t('HideColumn') }}</span>\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"column-menu-item\"\n data-testid=\"column-menu-filter\"\n [disabled]=\"!menuColumn || !canFilterColumn(menuColumn)\"\n (click)=\"filterMenuColumn()\"\n >\n <i class=\"pi pi-filter\"></i>\n <span class=\"column-menu-item-label\">{{ t('Filter') }}…</span>\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"column-menu-item\"\n data-testid=\"column-menu-sort-asc\"\n [disabled]=\"!menuColumn || !isColumnSortable(menuColumn)\"\n (click)=\"sortMenuColumn(1)\"\n >\n <i class=\"pi pi-sort-amount-up-alt\"></i>\n <span class=\"column-menu-item-label\">{{ t('SortAscending') }}</span>\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"column-menu-item\"\n data-testid=\"column-menu-sort-desc\"\n [disabled]=\"!menuColumn || !isColumnSortable(menuColumn)\"\n (click)=\"sortMenuColumn(-1)\"\n >\n <i class=\"pi pi-sort-amount-down\"></i>\n <span class=\"column-menu-item-label\">{{ t('SortDescending') }}</span>\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"column-menu-item\"\n data-testid=\"column-menu-left\"\n [disabled]=\"!menuColumn || !canMoveColumn(menuColumn, -1)\"\n (click)=\"moveMenuColumn(-1)\"\n >\n <i class=\"pi pi-arrow-left\"></i>\n <span class=\"column-menu-item-label\">{{ t('MoveLeft') }}</span>\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"column-menu-item\"\n data-testid=\"column-menu-right\"\n [disabled]=\"!menuColumn || !canMoveColumn(menuColumn, 1)\"\n (click)=\"moveMenuColumn(1)\"\n >\n <i class=\"pi pi-arrow-right\"></i>\n <span class=\"column-menu-item-label\">{{ t('MoveRight') }}</span>\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"column-menu-item\"\n data-testid=\"column-menu-fit\"\n (click)=\"fitMenuColumn()\"\n >\n <i class=\"pi pi-arrows-h\"></i>\n <span class=\"column-menu-item-label\">{{ t('FitWidth') }}</span>\n </button>\n <!-- menuitemcheckbox, not menuitem: this one TOGGLES, and a label reading the same\n in both states leaves the operator to find out by clicking — which on a wide\n column means re-laying the grid out to learn what it was already set to. The\n check is the state; the label stays put, which is what the role is for.\n Disabled for an editable column: its cell holds an input, not clamped text, so\n the toggle could only persist a preference that changes nothing. -->\n <button\n type=\"button\"\n role=\"menuitemcheckbox\"\n class=\"column-menu-item\"\n data-testid=\"column-menu-wrap\"\n [disabled]=\"!menuColumn || menuColumn.editable === true\"\n [attr.aria-checked]=\"isMenuColumnWrapped\"\n (click)=\"toggleWrapForMenuColumn()\"\n >\n <i class=\"pi pi-align-left\"></i>\n <span class=\"column-menu-item-label\">{{ t('WrapText') }}</span>\n <i *ngIf=\"isMenuColumnWrapped\" class=\"pi pi-check\"></i>\n </button>\n </div>\n </p-popover>\n\n <div class=\"table-views\" *ngIf=\"views?.length\" role=\"tablist\">\n <button\n *ngFor=\"let view of views\"\n type=\"button\"\n role=\"tab\"\n class=\"table-view\"\n data-testid=\"table-view\"\n [class.table-view-active]=\"activeViewId === view.id\"\n [attr.aria-selected]=\"activeViewId === view.id\"\n (click)=\"selectView(view)\"\n >\n {{ view.label }}\n </button>\n </div>\n\n <spiderly-filter-bar\n *ngIf=\"filters\"\n [filters]=\"filters\"\n [totalRecords]=\"totalRecords\"\n [sort]=\"sortKeys\"\n [sortOptions]=\"sortPickOptions\"\n [sortIsDefault]=\"sortIsDefault\"\n [controlTemplates]=\"filterTemplates\"\n (clearAll)=\"clear()\"\n (sortPick)=\"sortFromBar($event)\"\n (sortReset)=\"resetSortFromBar()\"\n ></spiderly-filter-bar>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <!-- Sized for the checkbox plus the counter beside it, which shows `totalRecords` on a\n select-all and so reaches five digits on a large table. Not `0rem` (see CLAUDE.md →\n Column widths), and not routed through getColWidth: this column has no `Column`. -->\n <th\n #selectionHeader\n class=\"frozen-column\"\n [class.frozen-column-last]=\"isSelectionColumnLastFrozen\"\n [style.width]=\"selectionColumnWidth\"\n [style.left]=\"'0'\"\n *ngIf=\"selectionMode == 'multiple'\"\n >\n <div style=\"display: flex; gap: 8px\">\n <p-checkbox\n *ngIf=\"showSelectAllCheckbox\"\n [disabled]=\"readonly\"\n (onChange)=\"selectAll($event.checked)\"\n [(ngModel)]=\"fakeIsAllSelected\"\n [binary]=\"true\"\n ></p-checkbox>\n <span class=\"selection-count\">({{ rowsSelectedNumber }})</span>\n </div>\n </th>\n <ng-container *ngFor=\"let col of visibleCols; trackBy: colTrackByFn\">\n <th\n #headerCell\n [pSortableColumn]=\"col.field\"\n [pSortableColumnDisabled]=\"!isColumnSortable(col)\"\n [style.width]=\"getColWidth(col)\"\n [class.frozen-column]=\"isColumnFrozen(col)\"\n [class.frozen-column-last]=\"isLastFrozenColumn(col)\"\n [style.left]=\"isColumnFrozen(col) ? frozenColumnOffset() : null\"\n [attr.draggable]=\"hasLazyLoad && !col.lockVisible ? true : null\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (dragstart)=\"onHeaderDragStart(col, $event)\"\n (dragover)=\"onHeaderDragOver(col, $event)\"\n (drop)=\"onHeaderDrop(col, $event)\"\n >\n <!-- Ours, not PrimeNG's: enabling [resizableColumns] makes it persist widths by\n th:nth-child INDEX into our own stateKey, which slides every stored width onto\n the wrong column the first time the chooser hides one (CLAUDE.md -> decision\n 5). We take the gesture and keep the state. -->\n <span\n *ngIf=\"hasLazyLoad && isDataColumn(col)\"\n class=\"column-resizer\"\n data-testid=\"column-resizer\"\n (mousedown)=\"startColumnResize(col, $event, headerCell)\"\n ></span>\n <div\n style=\"\n display: flex;\n justify-content: space-between;\n align-items: center;\n \"\n >\n <span style=\"display: flex; align-items: center; gap: 4px\">\n {{ col.name }}\n <p-sortIcon\n *ngIf=\"isColumnSortable(col)\"\n [field]=\"col.field!\"\n ></p-sortIcon>\n <!-- stopPropagation is load-bearing: the th carries pSortableColumn, so a click\n that reaches it sorts the grid. Opening a menu must not reorder the table on\n the way. -->\n <button\n *ngIf=\"hasLazyLoad && isDataColumn(col)\"\n type=\"button\"\n class=\"column-menu-button\"\n data-testid=\"column-menu\"\n [attr.aria-label]=\"t('Columns')\"\n (click)=\"$event.stopPropagation(); openColumnMenu(col, $event)\"\n >\n <i class=\"pi pi-chevron-down\"></i>\n </button>\n </span>\n </div>\n </th>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template\n pTemplate=\"body\"\n let-rowData\n let-index=\"rowIndex\"\n let-editing=\"editing\"\n >\n <!-- The cell rendering every column gets unless it projects a spiderlyCellTemplate. Declared\n once here rather than inside the column loop, and fed the same context the projected\n template gets, so getRowData is evaluated exactly once per cell either way. -->\n <ng-template #defaultCell let-col=\"col\" let-displayValue=\"displayValue\">\n <ng-container *ngIf=\"col.filterType === 'blob'\">\n <img width=\"45\" [src]=\"displayValue\" alt=\"\" />\n </ng-container>\n <ng-container *ngIf=\"col.filterType !== 'blob'\">\n <span spiderlyOverflowTitle class=\"cell-text\">{{\n displayValue\n }}</span>\n </ng-container>\n </ng-template>\n <tr\n [class.clickable]=\"navigateOnRowClick\"\n (click)=\"onRowClick(rowData, $event)\"\n >\n <!-- row-interactive: a selection gesture must never double as row navigation (onRowClick). -->\n <td\n *ngIf=\"selectionMode == 'multiple'\"\n class=\"selection-cell row-interactive frozen-column\"\n [class.frozen-column-last]=\"isSelectionColumnLastFrozen\"\n [style.left]=\"'0'\"\n (mousedown)=\"onSelectionCellMouseDown($event, rowData[idField])\"\n >\n <p-checkbox\n [disabled]=\"readonly\"\n (onChange)=\"selectRow(rowData[idField], rowData.index)\"\n [ngModel]=\"isRowSelected(rowData[idField])\"\n [binary]=\"true\"\n ></p-checkbox>\n </td>\n <ng-container *ngFor=\"let col of visibleCols; trackBy: colTrackByFn\">\n <td\n [style]=\"getStyleForBodyColumn(col)\"\n [class.clickable]=\"col.onCellClick\"\n [class.row-interactive]=\"col.onCellClick\"\n [class.frozen-column]=\"isColumnFrozen(col)\"\n [class.frozen-column-last]=\"isLastFrozenColumn(col)\"\n [class.cell-wrap]=\"isColumnWrapped(col)\"\n [style.left]=\"isColumnFrozen(col) ? frozenColumnOffset() : null\"\n (click)=\"onCellClick(col, rowData, $event)\"\n *ngIf=\"!col.editable\"\n >\n <!-- getColWidth reserves this column's width from `actions.length`; this gap is\n the geometry it reserves for, so changing it belongs in the same edit. -->\n <div\n style=\"\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 18px;\n \"\n >\n <ng-container\n *ngFor=\"let action of col.actions; trackBy: actionTrackByFn\"\n >\n <span\n [pTooltip]=\"action.name\"\n [class]=\"getClassForAction(action) + ' row-interactive'\"\n [style]=\"getStyleForAction(action)\"\n (click)=\"getMethodForAction(action, rowData, $event)\"\n ></span>\n </ng-container>\n </div>\n <ng-container\n [ngTemplateOutlet]=\"getCellTemplate(col) ?? defaultCell\"\n [ngTemplateOutletContext]=\"{\n $implicit: rowData,\n value: rowData[col.field],\n displayValue: getRowData(rowData, col),\n col: col\n }\"\n ></ng-container>\n </td>\n <td\n *ngIf=\"col.editable\"\n class=\"row-interactive\"\n [class.frozen-column]=\"isColumnFrozen(col)\"\n [class.frozen-column-last]=\"isLastFrozenColumn(col)\"\n [style.left]=\"isColumnFrozen(col) ? frozenColumnOffset() : null\"\n >\n <spiderly-number\n [control]=\"getFormArrayControlByIndex(col.field, rowData.index)\"\n [showLabel]=\"false\"\n ></spiderly-number>\n </td>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td\n [attr.colspan]=\"\n visibleCols.length + (selectionMode === 'multiple' ? 1 : 0)\n \"\n >\n {{ t(\"NoRecordsFound\") }}\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"paginatorleft\">\n {{ t(\"TotalRecords\") }}: {{ totalRecords }}\n </ng-template>\n <ng-template pTemplate=\"paginatorright\">\n <div style=\"display: flex; justify-content: end; gap: 10px\">\n <spiderly-button\n *ngIf=\"showAddButton\"\n [label]=\"t('AddNew')\"\n icon=\"pi pi-plus\"\n (onClick)=\"navigateToDetails(0)\"\n ></spiderly-button>\n </div>\n </ng-template>\n </p-table>\n <p-popover #columnChooser>\n <div class=\"column-chooser\">\n <label\n *ngFor=\"let col of chooserCols; trackBy: colTrackByFn\"\n data-testid=\"column-chooser-option\"\n class=\"column-chooser-option\"\n >\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"isColumnVisible(col)\"\n [disabled]=\"!canToggleColumn(col)\"\n (onChange)=\"toggleColumn(col, $event.checked)\"\n ></p-checkbox>\n <span>{{ col.name }}</span>\n </label>\n <button\n type=\"button\"\n data-testid=\"column-chooser-reset\"\n class=\"column-chooser-reset\"\n (click)=\"resetColumnLayout()\"\n >\n {{ t('ResetToDefault') }}\n </button>\n </div>\n </p-popover>\n </div>\n</ng-container>\n","export enum MatchModeCodes {\n StartsWith = \"startsWith\",\n Contains = \"contains\",\n Equals = \"equals\",\n LessThan = \"lessThan\",\n GreaterThan = \"greaterThan\",\n In = \"in\",\n}\n","import { MatchModeCodes } from '../enums/match-mode-enum-codes';\n\n/**\n * What each value type may be asked — the ONE operator table, mirroring what the generated\n * paginator implements per type (`PaginatedResultGenerator`): `In` on a string column answers\n * with InvalidMatchMode, PrimeNG's own text list adds three modes the backend 400s, and so on.\n *\n * Deliberately a LEAF module (imports nothing but the codes) so every consumer can derive from\n * it without a cycle: the store's runtime validation and offered lists (`filter-store.ts`), the\n * compile-time `FilterRule.matchMode` union (`entities/filter-rule.ts`), and the data view's\n * kind-level lists (via `operatorOptionsForKind`). These used to be hand-kept copies; edit the\n * table here and every surface follows.\n *\n * Tuple order is DISPLAY order for every operator picker (Equals, then \"less/before\", then\n * \"more/after\" — the order the header dropdowns always shipped).\n */\nexport const ALLOWED_OPERATORS = {\n text: [\n MatchModeCodes.StartsWith,\n MatchModeCodes.Contains,\n MatchModeCodes.Equals,\n ],\n number: [\n MatchModeCodes.Equals,\n MatchModeCodes.LessThan,\n MatchModeCodes.GreaterThan,\n MatchModeCodes.In,\n ],\n boolean: [MatchModeCodes.Equals],\n date: [\n MatchModeCodes.Equals,\n MatchModeCodes.LessThan,\n MatchModeCodes.GreaterThan,\n ],\n} as const satisfies Record<string, readonly MatchModeCodes[]>;\n\nexport type FilterValueKind = keyof typeof ALLOWED_OPERATORS;\n\n/** The compile-time half of one kind's row, derived so it can never drift from the runtime half. */\nexport type AllowedOperatorFor<TKind extends FilterValueKind> =\n (typeof ALLOWED_OPERATORS)[TKind][number];\n","import { computed, signal, Signal } from '@angular/core';\n\nimport { FilterRule } from '../entities/filter-rule';\nimport { MatchModeCodes } from '../enums/match-mode-enum-codes';\nimport {\n ALLOWED_OPERATORS,\n AllowedOperatorFor,\n FilterValueKind,\n} from './allowed-operators';\n\n/** One tickable choice. `value` is the filter's own value type — an id, not a display string. */\nexport interface FilterOption {\n value: unknown;\n label: string;\n}\n\n/**\n * A filter declaration. It carries its VALUE type, never a UI control name — that separation is\n * the whole point: `multiselect` is a control, and it emits `In`, which `AllowedMatchModes` allows\n * on a number and forbids on a string. Conflating the two is what shipped `paymentGatewayCode` as\n * a text filter with a hand-written comment instead of a compile error.\n */\nexport interface FilterDefinition<TKind extends FilterValueKind = FilterValueKind> {\n kind: TKind;\n label: string;\n /**\n * Declaring options turns this filter into a pick-list, which means `In` — the same rule as the\n * table's `[filters]`, where the SHAPE of what is supplied decides, not a mode flag. It is also\n * the only way \"Processing OR PreparingForShipping\" can be expressed at all.\n */\n options?: FilterOption[];\n /** Offered-operator narrowing; semantics on `FilterConfig.operators`, the factories' door. */\n operators?: MatchModeCodes[];\n /** Whether \"+ Filter\" offers it; semantics on `FilterConfig.offered`, the factories' door. */\n offered?: boolean;\n}\n\n/**\n * Transloco keys for the operator a control offers. The keys are seeded in the init template's\n * en block (`NetAndAngularFilesGenerator.cs`), so one operator cannot be worded two ways in one\n * admin. The wording is per KIND on purpose: `LessThan` reads \"Less than\" for a number and\n * \"Dates before\" for a date.\n *\n * The operator TABLE itself lives in `allowed-operators.ts`, the one telling both consumers\n * derive from (this store's runtime lists, `FilterRule`'s compile-time union).\n */\ninterface OperatorWords {\n /** The picker's option label. */\n pickerKey: string;\n /**\n * The chip's inline phrase, which cannot reuse the picker key: those are capitalised option\n * labels and one of them is a plural noun, so a chip would read \"Datum Datumi pre 1.9.\" A chip\n * is a sentence — \"Firma sadrži Elektromont\" — and needs its own words.\n */\n phraseKey: string;\n}\n\nconst OPERATOR_WORDS: Record<\n FilterValueKind,\n Partial<Record<MatchModeCodes, OperatorWords>>\n> = {\n text: {\n [MatchModeCodes.StartsWith]: {\n pickerKey: 'StartsWith',\n phraseKey: 'FilterChipStartsWith',\n },\n [MatchModeCodes.Contains]: {\n pickerKey: 'Contains',\n phraseKey: 'FilterChipContains',\n },\n [MatchModeCodes.Equals]: {\n pickerKey: 'Equals',\n phraseKey: 'FilterChipEquals',\n },\n // No `In` for text: ALLOWED_OPERATORS.text does not carry it, so the entry was unreachable —\n // and it made `textFilter({ options })` look supported when the store throws on it.\n },\n number: {\n [MatchModeCodes.Equals]: {\n pickerKey: 'Equals',\n phraseKey: 'FilterChipEquals',\n },\n [MatchModeCodes.GreaterThan]: {\n pickerKey: 'MoreThan',\n phraseKey: 'FilterChipGreaterThan',\n },\n [MatchModeCodes.LessThan]: {\n pickerKey: 'LessThan',\n phraseKey: 'FilterChipLessThan',\n },\n // The picker never renders for a pick-list (one operator), but the CHIP always does.\n [MatchModeCodes.In]: { pickerKey: 'In', phraseKey: 'FilterChipIn' },\n },\n boolean: {\n [MatchModeCodes.Equals]: {\n pickerKey: 'Equals',\n phraseKey: 'FilterChipEquals',\n },\n },\n date: {\n [MatchModeCodes.Equals]: {\n pickerKey: 'OnDate',\n phraseKey: 'FilterChipEquals',\n },\n [MatchModeCodes.LessThan]: {\n pickerKey: 'DatesBefore',\n phraseKey: 'FilterChipBefore',\n },\n [MatchModeCodes.GreaterThan]: {\n pickerKey: 'DatesAfter',\n phraseKey: 'FilterChipAfter',\n },\n },\n};\n\nexport interface OperatorOption {\n value: MatchModeCodes;\n /** Transloco key, resolved by the control — the store holds no translations. */\n labelKey: string;\n}\n\n/**\n * `In` and options are the same fact seen from two sides: `In` needs a list of values, and the\n * editor only draws one when the filter declares options. So options mean `In` and nothing else,\n * and their absence rules `In` out — offering it on a plain number filter would hand the\n * operator a mode with no control behind it.\n *\n * Widened first: the per-kind tuples are literal, so `boolean`'s `[Equals]` makes the `In`\n * comparison a \"no overlap\" error rather than an empty result.\n */\nfunction baseOperators(\n kind: FilterValueKind,\n hasOptions: boolean,\n): readonly MatchModeCodes[] {\n const accepted: readonly MatchModeCodes[] = ALLOWED_OPERATORS[kind];\n\n return accepted.filter((value) =>\n hasOptions ? value === MatchModeCodes.In : value !== MatchModeCodes.In,\n );\n}\n\nfunction toOperatorOptions(\n kind: FilterValueKind,\n operators: readonly MatchModeCodes[],\n): OperatorOption[] {\n return operators.map((value) => ({\n value,\n labelKey: OPERATOR_WORDS[kind][value]?.pickerKey ?? value,\n }));\n}\n\n/**\n * A KIND's operator picker options, for callers with no filter behind them — today that is\n * `spiderly-data-view`, whose own filter config derives its operator lists here instead of\n * hand-keeping copies (the drift `allowed-operators.ts` exists to end). Per-FILTER narrowing\n * lives in the store (`createFilterStore` resolves it once per declaration), so this cannot be\n * handed a fake definition to satisfy — that shape shipped once and interpolated an empty\n * filter name into its own error message.\n */\nexport function operatorOptionsForKind(\n kind: FilterValueKind,\n hasOptions = false,\n): OperatorOption[] {\n return toOperatorOptions(kind, baseOperators(kind, hasOptions));\n}\n\n/**\n * The operator applied when nobody picked one, which has to be what a person MEANS by filling in\n * the control. `Contains` for a fragment typed into a box; `GreaterThan` for a date, never\n * `Equals` — a date equality against a TIMESTAMP matches only the row written in that exact\n * second, and answers with an empty grid rather than an error (PACMS ran into this on all three\n * of its date columns, Filip 2026-08-28).\n */\nexport const DEFAULT_OPERATOR = {\n text: MatchModeCodes.Contains,\n number: MatchModeCodes.Equals,\n boolean: MatchModeCodes.Equals,\n date: MatchModeCodes.GreaterThan,\n} as const satisfies Record<FilterValueKind, MatchModeCodes>;\n\n/** The value each kind carries. Exhaustive over the kinds by construction. */\ninterface ValueByKind {\n text: string;\n number: number;\n boolean: boolean;\n date: Date;\n}\n\n/**\n * What every factory takes, so narrowing does not have to be re-plumbed per factory (its adjacent\n * asymmetry — `options` on `numberFilter` only — is FORCED and documented there; this one is not).\n *\n * `operators` narrows what the editor OFFERS, in display order; the first entry becomes the\n * default. Typed per kind, so declaring an operator the kind cannot answer is a build error at\n * the declaration — the store's runtime drop-and-report covers only what dodges the type system\n * (a dynamically built array). The store still accepts every wire-legal operator on restore, so\n * an old persisted constraint keeps filtering: the narrowing shapes the controls, not the\n * contract. The forcing case: date-equality against a timestamp matches one second and answers\n * with an empty grid, so PACMS's order dates offer only \"posle\"/\"pre\".\n */\ninterface FilterConfig<TKind extends FilterValueKind> {\n label: string;\n operators?: AllowedOperatorFor<TKind>[];\n /**\n * `false` keeps the filter out of the bar's \"+ Filter\" menu — for a filter with a DEDICATED\n * control somewhere on the page (PACMS's order search box is a placement of the store's\n * `mixedSearch`), where the generic entry point would give one question two homes. The chip\n * still renders when the filter is applied, so the bar's claim to list every constraint holds.\n */\n offered?: boolean;\n}\n\nexport function textFilter(config: FilterConfig<'text'>): FilterDefinition<'text'> {\n return {\n kind: 'text',\n label: config.label,\n operators: config.operators,\n offered: config.offered,\n };\n}\n\n/**\n * Only a NUMBER filter accepts options, and the asymmetry is forced rather than chosen: options\n * mean `In`, and `In` is the one operator ALLOWED_OPERATORS grants to numbers alone — because the\n * generated paginator answers it with InvalidMatchMode on a string column. A text pick-list used\n * to type-check and then throw at the first `set`.\n */\nexport function numberFilter(\n config: FilterConfig<'number'> & { options?: FilterOption[] },\n): FilterDefinition<'number'> {\n return {\n kind: 'number',\n label: config.label,\n options: config.options,\n operators: config.operators,\n offered: config.offered,\n };\n}\n\nexport function booleanFilter(\n config: FilterConfig<'boolean'>,\n): FilterDefinition<'boolean'> {\n return {\n kind: 'boolean',\n label: config.label,\n operators: config.operators,\n offered: config.offered,\n };\n}\n\nexport function dateFilter(config: FilterConfig<'date'>): FilterDefinition<'date'> {\n return {\n kind: 'date',\n label: config.label,\n operators: config.operators,\n offered: config.offered,\n };\n}\n\n/**\n * `In` is the only multi-valued operator MatchModeCodes has, so it is the only one whose value is\n * a list. Distributing over the operator union yields a discriminated union rather than a loose\n * `T | T[]`, so `{ operator: Equals, value: [2, 3] }` is a compile error rather than a query the\n * paginator answers in some way nobody predicted.\n */\ntype ConstraintFor<TKind extends FilterValueKind, TOperator> =\n TOperator extends MatchModeCodes.In\n ? { operator: TOperator; value: ValueByKind[TKind][] | null | undefined }\n : { operator: TOperator; value: ValueByKind[TKind] | null | undefined };\n\n/**\n * The kind is what carries BOTH halves — which operators are legal and what the value is. It has\n * to stay a literal all the way from the factory to here: typing the definition's `kind` as the\n * widened `FilterValueKind` silently allows every operator on every filter, which is the shape\n * this first had (the runtime guard still fired, so only a `@ts-expect-error` pin caught it).\n */\nexport type FilterConstraint<TKind extends FilterValueKind> = ConstraintFor<\n TKind,\n (typeof ALLOWED_OPERATORS)[TKind][number]\n>;\n\n/** What the maps hold. The public generic precision is for the CALLER; internally it is noise. */\ninterface StoredConstraint {\n operator: MatchModeCodes;\n value: unknown;\n}\n\n/** One filter, addressed on its own. The placement API, and what the bar's editor drives. */\nexport interface FilterHandle {\n id: string;\n label: string;\n kind: FilterValueKind;\n /** The DRAFT — what a control shows. `applied()` answers the other question. */\n value: Signal<unknown>;\n operator: Signal<MatchModeCodes | undefined>;\n /** Every operator this filter accepts, in display order. */\n operators: OperatorOption[];\n /** Applied when nobody picked an operator. */\n defaultOperator: MatchModeCodes;\n /** The tickable choices, when this filter declares any. */\n options?: FilterOption[];\n set(constraint: { operator: MatchModeCodes; value: unknown }): void;\n commit(): void;\n reset(): void;\n}\n\n/**\n * What the CHIP BAR needs from a store, and no more: it reads the applied set and removes from it.\n * Narrow on purpose — it keeps the bar free of the store's generics, so the bar renders any store\n * without the two types having to agree on filter ids.\n */\nexport interface FilterBarSource {\n /** Every DECLARED filter, which is what \"+ Filter\" offers — not every visible column. */\n definitions: Record<string, FilterDefinition<FilterValueKind>>;\n applied: Signal<AppliedFilter[]>;\n get(id: string): FilterHandle;\n reset(id: string): void;\n clear(): void;\n}\n\n/** What the TABLE needs: the bar's half, plus the payload it sends to the paginator. */\nexport interface FilterSource extends FilterBarSource {\n toFilterPayload(): Record<string, FilterRule[]>;\n /** The applied set as plain JSON, for whoever owns this table's persisted state. */\n snapshot(): FilterSnapshot;\n /** Replaces the applied set, and the drafts with it so every control agrees with its chip. */\n restore(snapshot: FilterSnapshot): void;\n}\n\n/** The applied constraints in a form that survives `JSON.stringify`. */\nexport type FilterSnapshot = Record<\n string,\n { operator: MatchModeCodes; value: unknown }\n>;\n\n/** The shape `Date.toJSON` writes, which is the only value here JSON cannot round-trip itself. */\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/;\n\nfunction reviveValue(value: unknown): unknown {\n if (typeof value === 'string' && ISO_DATE.test(value)) return new Date(value);\n if (Array.isArray(value)) return value.map(reviveValue);\n\n return value;\n}\n\n/**\n * One column the bar's sort picker offers, labelled by whoever owns the columns — the bar knows\n * nothing about them. Hidden sortable columns belong in the list: the picker exists precisely so\n * an ordering does not need its column on screen (decision 2b's sort half).\n */\nexport interface SortPickOption {\n field: string;\n label: string;\n}\n\n/**\n * One sort key as the bar draws it — a pick option WITH its direction. Sort deliberately does\n * NOT live in the filter store: `multiSortMeta` already holds it, keyed by field, and a copy\n * here would be a second source of truth for one fact. The bar is one surface reading two\n * owners. `field` is what lets the picker mark the active row and flip its direction; the\n * label alone could not say which option it names once two columns share a name.\n */\nexport interface SortKeyLabel extends SortPickOption {\n descending: boolean;\n}\n\n/** One applied constraint, in the shape the chip bar draws. */\nexport interface AppliedFilter {\n id: string;\n label: string;\n /** The bar reads this to word the chip — `String(false)` would print \"false\" at an operator. */\n kind: FilterValueKind;\n operator: MatchModeCodes;\n /**\n * Transloco key for the chip's middle word. Without it a chip reads \"Firma Elektromont\", which\n * leaves the reader to guess whether the grid is narrowed by `contains` or by `equals` — very\n * different sets for one typed value, on a surface whose only claim is that it cannot lie.\n */\n operatorPhraseKey: string;\n value: unknown;\n}\n\n/**\n * A blanked value is NOT a constraint. `contains ''` matches every row, so emitting one would\n * narrow nothing while the bar claims the grid is filtered.\n */\nfunction isBlank(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === 'string') return value.trim() === '';\n if (Array.isArray(value)) return value.length === 0;\n // A half-typed datepicker yields an Invalid Date, which JSON.stringify writes as `null`.\n if (value instanceof Date) return Number.isNaN(value.getTime());\n\n return false;\n}\n\n/**\n * Whether two constraint values are the same QUESTION. Identity is not it: every `set` builds a\n * fresh draft, a multiselect hands back a fresh array per change, and two Dates at one instant\n * are one constraint. This is what `commit` bails on, so a paste-over-itself or a double Apply\n * cannot spend a request — the rule PACMS's order list used to hand-roll as `lastCommittedTerm`.\n */\nfunction valueEquals(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((item, i) => valueEquals(item, b[i]));\n }\n\n return false;\n}\n\nfunction constraintEquals(\n a: StoredConstraint | undefined,\n b: StoredConstraint,\n): boolean {\n return a != null && a.operator === b.operator && valueEquals(a.value, b.value);\n}\n\n/**\n * The filter engine. It knows nothing about columns: a filter has an id, a value type and a\n * constraint, and that is the entire vocabulary.\n */\nexport function createFilterStore<\n TDefs extends Record<string, FilterDefinition<FilterValueKind>>,\n>(definitions: TDefs) {\n // Per-filter offered operators, resolved ONCE per declaration — so an invalid narrowing is\n // said once, not on every editor open — and re-resolved only where the inputs can actually\n // change: `setOptions`, because options' PRESENCE flips a filter between pick-list (`In`) and\n // plain operators. A per-store Map rather than the module-level WeakMap this first shipped\n // as: that memo was keyed on a definition object consumers mutate, so late-filled options\n // could freeze a filter's operators at the wrong answer.\n const resolveOffered = (id: keyof TDefs) => {\n const definition = definitions[id];\n const base = baseOperators(definition.kind, definition.options != null);\n\n let codes: readonly MatchModeCodes[] = base;\n if (definition.operators?.length) {\n const survivors = definition.operators.filter((operator) =>\n base.includes(operator),\n );\n\n // Same polarity as the column path's computeMatchModes: a bad entry is dropped and said\n // out loud, and a narrowing that leaves nothing falls back to the full list — an editor\n // with no operators would be unusable, which is worse than an unwanted one. Mostly\n // unreachable now that FilterConfig types `operators` per kind; kept for dynamically\n // built arrays.\n if (survivors.length < definition.operators.length) {\n console.error(\n `Filter '${definition.label}' narrows to operators its ${definition.kind} kind does not ` +\n `offer (${definition.operators.join(', ')}; offered: ${base.join(', ')}). ` +\n `Unsupported entries are ignored${survivors.length ? '' : '; falling back to the full list'}.`,\n );\n }\n\n codes = survivors.length ? survivors : base;\n }\n\n return { codes, options: toOperatorOptions(definition.kind, codes) };\n };\n\n const offered = new Map<\n keyof TDefs,\n { codes: readonly MatchModeCodes[]; options: OperatorOption[] }\n >();\n for (const id of Object.keys(definitions) as (keyof TDefs)[]) {\n offered.set(id, resolveOffered(id));\n }\n\n /**\n * The operator applied when nobody picked one. Options mean `In`, whatever the kind's default;\n * a narrowed filter defaults to its FIRST declared operator.\n */\n const defaultOperatorFor = (id: keyof TDefs): MatchModeCodes => {\n const definition = definitions[id];\n if (definition.options != null) return MatchModeCodes.In;\n\n return definition.operators?.length\n ? offered.get(id)!.codes[0]\n : DEFAULT_OPERATOR[definition.kind];\n };\n\n // Two stores, and the split is the whole point: `set` writes a DRAFT, `commit` publishes it.\n // A chip drawn off a draft would repeat the mistake the header's filter icon already shipped —\n // claiming the grid is narrowed on the first keystroke. Controls that apply on change\n // (multiselect, boolean, date) call both at once; a text box commits on Enter or blur.\n const drafts = signal<ReadonlyMap<keyof TDefs, StoredConstraint>>(new Map());\n\n const writeDraft = (id: keyof TDefs, constraint: StoredConstraint | null) => {\n const next = new Map(drafts());\n if (constraint === null) next.delete(id);\n else next.set(id, constraint);\n drafts.set(next);\n };\n const committed = signal<ReadonlyMap<keyof TDefs, StoredConstraint>>(\n new Map(),\n );\n\n const applied: Signal<AppliedFilter[]> = computed(() =>\n [...committed()].map(([id, constraint]) => ({\n id: id as string,\n label: definitions[id].label,\n kind: definitions[id].kind,\n operator: constraint.operator,\n operatorPhraseKey:\n OPERATOR_WORDS[definitions[id].kind][constraint.operator]?.phraseKey ??\n constraint.operator,\n value: constraint.value,\n })),\n );\n\n const store = {\n definitions,\n applied,\n\n /**\n * A handle bound to one filter. This is the PLACEMENT api: it needs nothing from the component\n * tree, so the same filter can be driven from the bar, from a header cell, or from a drawer\n * rendered at app root. `value` is the DRAFT — a control shows what was typed, not what was\n * applied; `applied()` is the other question and the bar asks that one.\n */\n get<K extends keyof TDefs>(id: K) {\n return {\n id: id as string,\n label: definitions[id].label,\n kind: definitions[id].kind,\n value: computed(() => drafts().get(id)?.value),\n operator: computed(() => drafts().get(id)?.operator),\n // Getters, not snapshots: options can land AFTER a handle is taken — the bar's editor\n // holds one for the life of the popover, and PACMS fills its lookups asynchronously —\n // and a snapshot left an already-open pick-list empty until it was reopened. The\n // operator list rides along, since setOptions can flip it to `In`.\n get operators() {\n return offered.get(id)!.options;\n },\n get defaultOperator() {\n return defaultOperatorFor(id);\n },\n get options() {\n return definitions[id].options;\n },\n set: (constraint: FilterConstraint<TDefs[K]['kind']>) =>\n store.set(id, constraint),\n commit: () => store.commit(id),\n reset: () => store.reset(id),\n };\n },\n\n /**\n * The ONE seam for choices that arrive after the store is built (PACMS fills its pick-lists\n * from lookups that race a deploy). Never write `definitions[id].options` by hand: options'\n * PRESENCE is what makes a filter a pick-list, so the setter also re-resolves the offered\n * operators — a hand write would leave a late-filled filter offering `Equals` on a control\n * that emits a list.\n */\n setOptions<K extends keyof TDefs>(id: K, options: FilterOption[]): void {\n definitions[id].options = options;\n offered.set(id, resolveOffered(id));\n },\n\n set<K extends keyof TDefs>(\n id: K,\n constraint: FilterConstraint<TDefs[K]['kind']>,\n ): void {\n const kind = definitions[id].kind;\n\n // Throws rather than logging and ignoring, which is what `computeMatchModes` does for a\n // column's OFFERED match modes. Different stakes: that one narrows a dropdown, so a bad\n // entry merely fails to show, while this one assembles a QUERY — dropping it silently would\n // leave the operator looking at unfiltered rows believing they are filtered.\n if (!ALLOWED_OPERATORS[kind].includes(constraint.operator as never)) {\n throw new Error(\n `Filter '${String(id)}' is ${kind}, which does not accept the '${constraint.operator}' ` +\n `operator (allowed: ${ALLOWED_OPERATORS[kind].join(', ')}). The generated paginator ` +\n `answers an unsupported match mode with InvalidMatchMode.`,\n );\n }\n\n writeDraft(id, constraint);\n },\n\n /**\n * `set` + `commit` in one breath — the shape every PROGRAMMATIC write takes (a view's\n * `apply`, the sheet flow). The split API stays for controls, where draft-on-type /\n * publish-on-Apply is the point; but a bare `set` whose `commit` is forgotten (or written\n * with the wrong id — the pair repeats the string twice) fails silently: the draft is\n * written, nothing is published, and a view narrows by nothing under a labelled tab.\n */\n setAndCommit<K extends keyof TDefs>(\n id: K,\n constraint: FilterConstraint<TDefs[K]['kind']>,\n ): void {\n store.set(id, constraint);\n store.commit(id);\n },\n\n /**\n * Publishes the draft. A blanked draft REMOVES the constraint rather than committing an empty\n * one, so `applied()` and the payload agree: no chip, no key, no `contains ''`.\n */\n commit<K extends keyof TDefs>(id: K): void {\n const draft = drafts().get(id);\n const current = committed();\n const shouldRemove = draft === undefined || isBlank(draft.value);\n\n // A new Map is a new identity even with identical contents, and everything downstream\n // reacts to identity — so a no-op commit would spend a request. The bail compares the\n // CONSTRAINT, not the draft object: every set() builds a fresh draft, and the case that\n // matters is an identical value re-committed (see valueEquals).\n if (shouldRemove ? !current.has(id) : constraintEquals(current.get(id), draft)) return;\n\n const next = new Map(current);\n if (shouldRemove) next.delete(id);\n else next.set(id, draft);\n\n committed.set(next);\n },\n\n /**\n * The chip's `x`. Drops the DRAFT as well as the committed constraint: a surviving draft\n * leaves the control still showing the cleared text, and the next commit would restore a\n * filter nobody re-typed.\n */\n reset<K extends keyof TDefs>(id: K): void {\n if (drafts().has(id)) writeDraft(id, null);\n if (!committed().has(id)) return;\n\n const next = new Map(committed());\n next.delete(id);\n committed.set(next);\n },\n\n /**\n * The applied set, plain enough to store. Drafts are deliberately NOT included: a half-typed\n * value is not a state anyone should come back to, and the bar's whole claim is that what it\n * shows is what narrows the grid.\n */\n snapshot(): FilterSnapshot {\n const snapshot: FilterSnapshot = {};\n\n for (const [id, constraint] of committed()) {\n snapshot[id as string] = {\n operator: constraint.operator,\n value: constraint.value,\n };\n }\n\n return snapshot;\n },\n\n /**\n * Replaces the applied set. The drafts are written too, so reopening a restored chip shows\n * the value it is filtering by rather than an empty control.\n *\n * Ids the store no longer declares are dropped rather than carried: a filter removed from the\n * declaration in a later release would otherwise ride every request from anyone whose storage\n * still held it, with no chip able to name it and no way to clear it from the UI.\n */\n restore(snapshot: FilterSnapshot): void {\n const next = new Map<keyof TDefs, StoredConstraint>();\n\n for (const [id, constraint] of Object.entries(snapshot ?? {})) {\n if (!(id in definitions)) continue;\n\n next.set(id as keyof TDefs, {\n operator: constraint.operator,\n value: reviveValue(constraint.value),\n });\n }\n\n drafts.set(new Map(next));\n committed.set(next);\n },\n\n /** The bar's \"Clear all\". `reset` for every filter, drafts included. */\n clear(): void {\n if (drafts().size > 0) drafts.set(new Map());\n if (committed().size > 0) committed.set(new Map());\n },\n\n /** The `filters` half of `Filter` — what the generated paginator reads. */\n toFilterPayload(): Record<string, FilterRule[]> {\n const payload: Record<string, FilterRule[]> = {};\n\n for (const [id, constraint] of committed()) {\n payload[id as string] = [\n { matchMode: constraint.operator, value: constraint.value } as FilterRule,\n ];\n }\n\n return payload;\n },\n };\n\n return store;\n}\n","import {\n Component,\n ContentChild,\n EventEmitter,\n Inject,\n Input,\n LOCALE_ID,\n OnInit,\n Output,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport {\n Table,\n TableFilterEvent,\n TableLazyLoadEvent,\n TableModule,\n} from 'primeng/table';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { SpiderlyControlsModule } from '../../controls/spiderly-controls.module';\nimport { PaginatedResult } from '../../entities/paginated-result';\nimport { Filter } from '../../entities/filter';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { ButtonModule } from 'primeng/button';\nimport { MultiSelectModule } from 'primeng/multiselect';\nimport { CheckboxModule } from 'primeng/checkbox';\nimport { MatchModeCodes } from '../../enums/match-mode-enum-codes';\nimport {\n FilterValueKind,\n} from '../../filters/allowed-operators';\nimport { operatorOptionsForKind } from '../../filters/filter-store';\nimport { Action } from '../spiderly-data-table/spiderly-data-table.component';\nimport { SelectItem } from 'primeng/api';\nimport { DatePickerModule } from 'primeng/datepicker';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { InputNumberModule } from 'primeng/inputnumber';\nimport { SelectModule } from 'primeng/select';\nimport { BaseEntity } from '../../entities/base-entity';\nimport { PrimengOption } from '../../entities/primeng-option';\nimport { scrollElementIntoViewIfAboveViewport } from '../../services/helper-functions';\n\n@Component({\n selector: 'spiderly-data-view',\n templateUrl: './spiderly-data-view.component.html',\n styleUrl: 'spiderly-data-view.component.scss',\n imports: [\n FormsModule,\n CommonModule,\n TranslocoDirective,\n SpiderlyControlsModule,\n TableModule,\n ButtonModule,\n MultiSelectModule,\n CheckboxModule,\n TooltipModule,\n DatePickerModule,\n InputTextModule,\n InputNumberModule,\n SelectModule,\n ],\n})\nexport class SpiderlyDataViewComponent<T> implements OnInit {\n @ViewChild('dt') table: Table;\n /**\n * List of items in the table.\n * Should be provided only when `hasLazyLoad === false`.\n */\n @Input() items: T[];\n @Input() rows: number = 10;\n @Input() filters: DataViewFilter<T>[] = [];\n totalRecords: number;\n @Output() onLazyLoad: EventEmitter<Filter> = new EventEmitter();\n\n /** Whether the data view is wrapped in a card container. Defaults to `true`. */\n @Input() showCardWrapper: boolean = true;\n /**\n * Whether to display additional data on the right side of the paginator.\n * Defaults to `false`.\n */\n @Input() showPaginatorRightData: boolean = false;\n /** Whether the total records count is shown. Defaults to `false`. */\n @Input() showTotalRecordsNumber: boolean = false;\n @Input() applyFiltersIcon: string = 'pi pi-filter';\n @Input() clearFiltersIcon: string = 'pi pi-filter-slash';\n\n @Input() getPaginatedListObservableMethod: (\n filter: Filter,\n ) => Observable<PaginatedResult>;\n\n lastLazyLoadEvent: TableLazyLoadEvent;\n private loading: boolean = true;\n\n matchModeDateOptions: SelectItem[] = [];\n matchModeNumberOptions: SelectItem[] = [];\n\n @ContentChild('cardBody', { read: TemplateRef }) cardBody!: TemplateRef<any>;\n\n constructor(\n private translocoService: TranslocoService,\n @Inject(LOCALE_ID) private locale: string,\n ) {}\n\n ngOnInit(): void {\n // Derived from the ONE operator table (`filters/allowed-operators.ts`) rather than\n // hand-kept: these were the last hand-written copies of the per-kind lists, and a backend\n // operator change edited in the shared table would silently never have reached them.\n const matchModeOptionsFor = (kind: FilterValueKind): SelectItem[] =>\n operatorOptionsForKind(kind).map((option) => ({\n label: this.translocoService.translate(option.labelKey),\n value: option.value,\n }));\n\n this.matchModeDateOptions = matchModeOptionsFor('date');\n this.matchModeNumberOptions = matchModeOptionsFor('number');\n }\n\n // Paging semantics and the scroll-margin contract are documented once, on the data table:\n // spiderly-data-table/CLAUDE.md → \"Scroll back to the table on page change\".\n onPageChange(container: HTMLElement): void {\n scrollElementIntoViewIfAboveViewport(container);\n }\n\n /**\n * The one pending predicate: PrimeNG's overlay and the container's `aria-busy` must never\n * disagree. Mirrors the data table's, including why it is not also testing `items`; the\n * rationale lives there.\n */\n get isPending(): boolean {\n return this.loading;\n }\n\n lazyLoad(event: TableLazyLoadEvent) {\n // Every refetch is pending, not just the first load. `items` is deliberately left alone so\n // the previous page stays readable under the overlay. Full reasoning: the data table's\n // CLAUDE.md → \"Pending state\".\n this.loading = true;\n\n this.lastLazyLoadEvent = event;\n\n const transformedFilter: {\n [K in keyof T]?: { value: any; matchMode: MatchModeCodes }[];\n } = {};\n\n for (const key in event.filters) {\n const filterMeta = event.filters[key];\n\n if (Array.isArray(filterMeta)) {\n transformedFilter[key] = filterMeta;\n } else {\n transformedFilter[key] = [\n {\n value: filterMeta.value,\n matchMode: filterMeta.matchMode,\n },\n ];\n }\n }\n\n let tableFilter = event as unknown as Filter<T>;\n\n tableFilter.filters = transformedFilter;\n\n this.onLazyLoad.next(tableFilter);\n\n this.getPaginatedListObservableMethod(tableFilter).subscribe({\n next: (res) => {\n this.items = res.data;\n this.totalRecords = res.totalRecords;\n\n this.loading = false;\n },\n error: () => {\n this.loading = false;\n },\n });\n }\n\n filter(event: TableFilterEvent) {}\n\n getDefaultMatchMode(filterType: string): any {\n switch (filterType) {\n case 'text':\n return MatchModeCodes.Contains;\n case 'date':\n return MatchModeCodes.Equals;\n case 'multiselect':\n return MatchModeCodes.In;\n case 'boolean':\n return MatchModeCodes.Equals;\n case 'numeric':\n return MatchModeCodes.Equals;\n default:\n return null;\n }\n }\n\n getMatchModeOptions(filterType: string) {\n switch (filterType) {\n case 'text':\n return [];\n case 'date':\n return this.matchModeDateOptions;\n case 'multiselect':\n return [];\n case 'boolean':\n return [];\n case 'numeric':\n return this.matchModeNumberOptions;\n default:\n return [];\n }\n }\n\n reload() {\n // Nothing to replay before the initial load, which is already on its way.\n if (this.lastLazyLoadEvent == null) return;\n\n // Not special: same refetch as a page flip, so lazyLoad owns both the flag and `items`.\n this.lazyLoad(this.lastLazyLoadEvent);\n }\n\n colTrackByFn(index, item) {\n return item.field;\n }\n\n actionTrackByFn(index, item: Action) {\n return `${index}${item.field}`;\n }\n\n applyFilters = () => {\n this.table._filter();\n };\n\n clearFilters() {\n this.table.clear();\n }\n}\n\nexport interface DataViewCardBody<T> {\n $implicit: T;\n item: T;\n index: number;\n}\n\nexport interface DataViewFilter<T extends BaseEntity> {\n label?: string;\n field?: string & keyof T;\n filterField?: string & keyof T; // Made specificaly for multiautocomplete, maybe for something more in the future\n type?: 'text' | 'date' | 'multiselect' | 'boolean' | 'numeric' | 'blob';\n placeholder?: string;\n showMatchModes?: boolean;\n dropdownOrMultiselectValues?: PrimengOption[];\n}\n","<ng-container *transloco=\"let t\">\n <div\n #tableContainer\n class=\"spiderly-table-container\"\n [attr.aria-busy]=\"isPending\"\n [ngClass]=\"{\n 'card responsive-card-padding overflow-auto': showCardWrapper\n }\"\n >\n <p-table\n #dt\n [value]=\"items\"\n [rows]=\"rows\"\n [rowHover]=\"false\"\n responsiveLayout=\"scroll\"\n [lazy]=\"true\"\n (onLazyLoad)=\"lazyLoad($event)\"\n (onPage)=\"onPageChange(tableContainer)\"\n [totalRecords]=\"totalRecords\"\n class=\"spiderly-table\"\n [loading]=\"isPending\"\n dataKey=\"id\"\n (onFilter)=\"filter($event)\"\n [filterDelay]=\"500\"\n [paginator]=\"true\"\n >\n <ng-template #caption>\n <div *ngIf=\"filters.length !== 0\">\n <div class=\"data-view-grid\">\n @for (filter of filters; track $index) {\n <div>\n <div\n style=\"\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n position: relative;\n \"\n >\n <div>\n <label>\n {{ filter.label }}\n </label>\n </div>\n\n <p-columnFilter\n *ngIf=\"filter.type != null\"\n [type]=\"filter.type\"\n [field]=\"filter.filterField ?? filter.field\"\n display=\"row\"\n [placeholder]=\"filter.placeholder\"\n [showOperator]=\"false\"\n [showMenu]=\"filter.showMatchModes\"\n [showMatchModes]=\"true\"\n [showClearButton]=\"false\"\n [matchMode]=\"getDefaultMatchMode(filter.type)\"\n [matchModeOptions]=\"getMatchModeOptions(filter.type)\"\n >\n <ng-container *ngIf=\"filter.type == 'multiselect'\">\n <ng-template\n pTemplate=\"filter\"\n let-value\n let-filter=\"filterCallback\"\n >\n <p-multiSelect\n [ngModel]=\"value\"\n [options]=\"filter.dropdownOrMultiselectValues\"\n [placeholder]=\"t('All')\"\n (onChange)=\"filter($event.value)\"\n optionLabel=\"label\"\n optionValue=\"code\"\n [style]=\"{ width: '100%' }\"\n >\n <ng-template let-item pTemplate=\"item\">\n <div class=\"p-multiselect-representative-option\">\n <span class=\"ml-2\">{{ item.label }}</span>\n </div>\n </ng-template>\n </p-multiSelect>\n </ng-template>\n </ng-container>\n </p-columnFilter>\n </div>\n </div>\n }\n </div>\n <div style=\"display: flex; gap: 12px\">\n <spiderly-button\n [label]=\"t('ApplyFilters')\"\n (onClick)=\"applyFilters()\"\n [icon]=\"applyFiltersIcon\"\n ></spiderly-button>\n <spiderly-button\n [label]=\"t('ClearFilters')\"\n (onClick)=\"clearFilters()\"\n [icon]=\"clearFiltersIcon\"\n ></spiderly-button>\n </div>\n </div>\n </ng-template>\n <ng-template #body let-rowData let-index=\"rowIndex\">\n <tr style=\"padding: 0; margin-bottom: 0\">\n <td style=\"display: block; border: 0; padding: 0\">\n <ng-container\n *ngTemplateOutlet=\"\n cardBody;\n context: { $implicit: rowData, item: rowData, index: index }\n \"\n >\n </ng-container>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n {{ t(\"NoRecordsFound\") }}\n </ng-template>\n <ng-template *ngIf=\"showTotalRecordsNumber\" pTemplate=\"paginatorleft\">\n {{ t(\"TotalRecords\") }}: {{ totalRecords }}\n </ng-template>\n <ng-template *ngIf=\"showPaginatorRightData\" pTemplate=\"paginatorright\">\n <ng-content select=\"[PAGINATORRIGHT]\"></ng-content>\n </ng-template>\n </p-table>\n </div>\n</ng-container>\n","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'spiderly-card',\n templateUrl: './spiderly-card.component.html',\n styles: [],\n})\nexport class SpiderlyCardComponent implements OnInit {\n @Input() icon: string = 'pi pi-file-edit';\n @Input() title: string;\n\n constructor() {}\n\n ngOnInit(): void {}\n}\n","<div class=\"card responsive-card-padding\">\n <div\n style=\"display: flex; align-items: center; margin-bottom: 14px; gap: 8px\"\n >\n <i style=\"font-size: 21px\" class=\"{{ icon }} primary-color\"></i>\n <div style=\"margin: 0; font-size: 17.5px\">{{ title }}</div>\n </div>\n <ng-content></ng-content>\n</div>\n","import { BaseEntity } from './base-entity';\n\n// FT HACK: Fake class, because of api imports\nexport class Codebook extends BaseEntity {\n code?: string;\n displayName?: string;\n\n constructor({\n code,\n displayName,\n }: {\n code?: string;\n displayName?: string;\n } = {}) {\n super();\n\n this.code = code;\n this.displayName = displayName;\n }\n\n static readonly typeName = 'Codebook' as const;\n}\n","export class FilterSortMeta {\n field: string;\n order: number;\n\n constructor({\n field,\n order,\n }: {\n field?: string;\n order?: number;\n } = {}) {\n this.field = field as string;\n this.order = order as number;\n }\n\n static schema = {\n field: {\n type: 'string',\n },\n order: {\n type: 'number',\n },\n } as const;\n\n static readonly typeName = 'FilterSortMeta' as const;\n}\n","import { BaseEntity } from './base-entity';\nimport { FilterRule } from './filter-rule';\nimport { FilterSortMeta } from './filter-sort-meta';\n\nexport class Filter<T extends BaseEntity = any> extends BaseEntity {\n filters?: { [K in keyof T]?: FilterRule[] };\n first?: number;\n rows?: number;\n multiSortMeta?: FilterSortMeta[];\n additionalFilterIdInt?: number;\n additionalFilterIdLong?: number;\n\n constructor({\n filters,\n first,\n rows,\n multiSortMeta,\n additionalFilterIdInt,\n additionalFilterIdLong,\n }: {\n filters?: { [K in keyof T]?: FilterRule[] };\n first?: number;\n rows?: number;\n multiSortMeta?: FilterSortMeta[];\n additionalFilterIdInt?: number;\n additionalFilterIdLong?: number;\n } = {}) {\n super();\n\n this.filters = filters;\n this.first = first;\n this.rows = rows;\n this.multiSortMeta = multiSortMeta;\n this.additionalFilterIdInt = additionalFilterIdInt;\n this.additionalFilterIdLong = additionalFilterIdLong;\n }\n\n static schema = {\n filters: {\n type: 'Object',\n // Note: 'filters' is a dynamic map (Dictionary), so we usually treat it as a generic Object\n // unless strict typing is required for the inner FilterRule[] values by the serializer.\n },\n first: {\n type: 'number',\n },\n rows: {\n type: 'number',\n },\n multiSortMeta: {\n type: 'FilterSortMeta[]',\n get nestedConstructor() {\n return FilterSortMeta;\n },\n },\n additionalFilterIdInt: {\n type: 'number',\n },\n additionalFilterIdLong: {\n type: 'number',\n },\n } as const;\n\n static readonly typeName = 'Filter' as const;\n}\n","import { MatchModeCodes } from '../enums/match-mode-enum-codes';\nimport { AllowedOperatorFor } from '../filters/allowed-operators';\n\n/**\n * Represents a filter rule used for querying or filtering data collections.\n *\n * The `FilterRule` class is a generic structure that defines a single filtering condition,\n * including the match mode (comparison operator), the value to compare, and an optional logical operator.\n *\n * The allowed match modes are determined by the type parameter `T`, each union derived from the\n * one operator table in `filters/allowed-operators.ts` (for other types, any `MatchModeCodes`\n * value is allowed).\n *\n * @template T The type of the value to filter by.\n */\nexport class FilterRule<T = any> {\n matchMode: AllowedMatchModes<T>;\n value: T;\n operator?: string;\n}\n\ntype AllowedMatchModes<T> = T extends string\n ? AllowedOperatorFor<'text'>\n : T extends boolean\n ? AllowedOperatorFor<'boolean'>\n : T extends Date\n ? AllowedOperatorFor<'date'>\n : T extends number\n ? AllowedOperatorFor<'number'>\n : MatchModeCodes;\n","import { BaseEntity } from './base-entity';\n\nexport class IsAuthorizedForSaveEvent extends BaseEntity {\n isAuthorizedForSave?: boolean;\n\n constructor({\n isAuthorizedForSave,\n }: {\n isAuthorizedForSave?: boolean;\n } = {}) {\n super();\n\n this.isAuthorizedForSave = isAuthorizedForSave;\n }\n\n static readonly typeName = 'IsAuthorizedForSaveEvent' as const;\n}\n","import { BaseEntity } from './base-entity';\n\nexport class LastMenuIconIndexClicked extends BaseEntity {\n index?: number;\n\n constructor({\n index,\n }: {\n index?: number;\n } = {}) {\n super();\n\n this.index = index;\n }\n\n static readonly typeName = 'LastMenuIconIndexClicked' as const;\n}\n","import { BaseEntity } from '../entities/base-entity';\n\nexport class LazyLoadSelectedIdsResult extends BaseEntity {\n selectedIds?: number[] = []; // FT: Only for showing checkboxes, we will not send this to the backend\n totalRecordsSelected?: number = 0;\n\n constructor({\n selectedIds,\n totalRecordsSelected,\n }: {\n selectedIds?: number[];\n totalRecordsSelected?: number;\n } = {}) {\n super();\n\n this.selectedIds = selectedIds;\n this.totalRecordsSelected = totalRecordsSelected;\n }\n\n static readonly typeName = 'LazyLoadSelectedIdsResult' as const;\n}\n","export class MenuChangeEvent {\n key: string;\n routeEvent?: boolean;\n}\n","import { BaseEntity } from '../entities/base-entity';\n\nexport class Namebook extends BaseEntity {\n id?: any;\n displayName?: string;\n\n constructor({\n id,\n displayName,\n }: {\n id?: any;\n displayName?: string;\n } = {}) {\n super();\n\n this.id = id;\n this.displayName = displayName;\n }\n\n static schema = {\n id: {\n type: 'any',\n },\n displayName: {\n type: 'string',\n },\n } as const;\n\n static readonly typeName = 'Namebook' as const;\n}\n","export class PaginatedResult<T = any> {\n data?: T[];\n totalRecords: number;\n}\n","import { BaseEntity } from '../entities/base-entity';\n\nexport class PrimengOption extends BaseEntity {\n label?: string;\n code?: any; // Can't be value: https://github.com/primefaces/primeng/issues/17332#issuecomment-2922861294\n\n constructor({\n label,\n code,\n }: {\n label?: string;\n code?: any;\n } = {}) {\n super();\n\n this.label = label;\n this.code = code;\n }\n\n static readonly typeName = 'PrimengOption' as const;\n}\n","import { BaseEntity } from '../entities/base-entity';\n\n// FT HACK: Fake class, because of api imports\nexport class SimpleSaveResult extends BaseEntity {\n id?: string;\n\n constructor({\n id,\n }: {\n id?: string;\n } = {}) {\n super();\n\n this.id = id;\n }\n\n static typeName = 'SimpleSaveResult' as const;\n}\n","export enum SecurityPermissionCodes {\n ReadUser = 'ReadUser',\n UpdateUser = 'UpdateUser',\n InsertUser = 'InsertUser',\n DeleteUser = 'DeleteUser',\n ReadRole = 'ReadRole',\n UpdateRole = 'UpdateRole',\n InsertRole = 'InsertRole',\n DeleteRole = 'DeleteRole',\n ReadPermission = 'ReadPermission',\n UpdatePermission = 'UpdatePermission',\n InsertPermission = 'InsertPermission',\n DeletePermission = 'DeletePermission',\n}\n","export enum VerificationTypeCodes {\n Login = 0,\n Registration = 1,\n}\n","import { Injectable } from '@angular/core';\nimport { CanActivate, Router } from '@angular/router';\nimport { Observable, filter, map, take } from 'rxjs';\nimport { AuthServiceBase } from '../services/auth.service.base';\nimport { ConfigServiceBase } from '../services/config.service.base';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthGuard implements CanActivate {\n constructor(\n private authService: AuthServiceBase,\n private router: Router,\n private config: ConfigServiceBase,\n ) {}\n\n canActivate(): Observable<boolean> {\n return this.checkAuth();\n }\n\n private checkAuth(): Observable<boolean> {\n return this.authService.user$.pipe(\n filter((user) => user !== undefined), // wait until the session is resolved (undefined = still loading)\n take(1),\n map((user) => {\n if (user) {\n return true;\n }\n this.router.navigate([this.config.loginSlug]);\n return false;\n }),\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CanActivate } from '@angular/router';\nimport { Observable, filter, map, take } from 'rxjs';\nimport { AuthServiceBase } from '../services/auth.service.base';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NotAuthGuard implements CanActivate {\n constructor(private authService: AuthServiceBase) {}\n\n canActivate(): Observable<boolean> {\n return this.checkAuth();\n }\n\n private checkAuth(): Observable<boolean> {\n return this.authService.user$.pipe(\n filter((user) => user !== undefined), // wait until the session is resolved (undefined = still loading)\n take(1),\n map((user) => {\n if (user) {\n this.authService.navigateToDashboard();\n return false;\n }\n return true;\n }),\n );\n }\n}\n","import { TranslocoService } from '@jsverse/transloco';\nimport { ErrorHandler, Injectable } from '@angular/core';\nimport { SpiderlyMessageService } from '../services/spiderly-message.service';\nimport { HttpErrorResponse } from '@angular/common/http';\n\n/**\n * The app's global {@link ErrorHandler}: logs the error and shows the generic error toast. HTTP\n * errors are skipped entirely — `unauthorizedInterceptor` owns them end to end and has already\n * logged the failed request and shown the message matched to its status.\n *\n * Logging is unconditional, production included. The toast tells the user the team was notified,\n * and unless the app wires an error tracker this line is the only place the error exists — so\n * staying quiet in production left a deployed app with a red toast and nothing to open. The\n * console is a developer surface; a user never sees it.\n *\n * An error tracker plugs in by providing an `ErrorHandler` that reports and then delegates here,\n * which keeps this class's toast copy true (see the PACMS admin's `AdminErrorHandler`).\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class SpiderlyErrorHandler implements ErrorHandler {\n constructor(\n private messageService: SpiderlyMessageService,\n private translocoService: TranslocoService,\n ) {}\n\n handleError(error: any): void {\n if (error instanceof HttpErrorResponse) return;\n\n console.error(error);\n\n this.messageService.errorMessage(\n this.translocoService.translate('UnexpectedErrorDetails'),\n this.translocoService.translate('UnexpectedErrorTitle'),\n );\n }\n}\n","import { HttpEvent, HttpInterceptorFn } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { NgxSpinnerService } from 'ngx-spinner';\nimport { Observable, finalize } from 'rxjs';\n\nexport const httpLoadingInterceptor: HttpInterceptorFn = (req, next) => {\n const spinner = inject(NgxSpinnerService);\n\n const shouldSkipSpinner = req.params.has('X-Skip-Spinner'); // Using this for multiautocomplete, autocomplete, dropdown, table etc...\n\n if (!shouldSkipSpinner) spinner.show();\n\n return next(req).pipe(\n finalize(() => {\n if (!shouldSkipSpinner) {\n spinner.hide();\n }\n }),\n ) as Observable<HttpEvent<any>>;\n};\n","import {\n HttpEvent,\n HttpResponse,\n HttpInterceptorFn,\n HttpRequest,\n HttpParams,\n} from '@angular/common/http';\nimport { tap } from 'rxjs';\n\nexport const jsonHttpInterceptor: HttpInterceptorFn = (req, next) => {\n const cleanedBody = getCleanRequestBody(req.body);\n const clonedRequest: HttpRequest<any> = req.clone({\n body: cleanedBody,\n });\n\n return next(clonedRequest).pipe(\n tap((event: HttpEvent<any>) => {\n if (event instanceof HttpResponse) {\n convertToDate(event.body);\n }\n }),\n );\n};\n\nconst getCleanRequestBody = (obj: unknown): unknown => {\n if (\n obj === null ||\n obj === undefined ||\n obj instanceof FormData ||\n obj instanceof Blob ||\n obj instanceof File ||\n obj instanceof ArrayBuffer\n ) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => getCleanRequestBody(item));\n }\n\n if (obj instanceof Date) {\n return obj.toISOString();\n }\n\n if (typeof obj === 'object') {\n const newObj: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n newObj[key] = getCleanRequestBody((obj as any)[key]);\n }\n return newObj;\n }\n\n return obj;\n};\n\n/**\n * @see https://stackoverflow.com/a/54733846/1306679\n */\nconst convertToDate = (\n object: unknown,\n parent?: Record<string, unknown> | unknown[],\n key?: number | string,\n) => {\n if (object === null) return;\n\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/;\n\n if (typeof object === 'string') {\n if (dateRegex.test(object)) {\n const date = new Date(object);\n parent[key] = date;\n }\n } else if (Array.isArray(object)) {\n for (let i = 0; i < object.length; i++) convertToDate(object[i], object, i);\n } else {\n for (const key of Object.keys(object as Record<string, unknown>)) {\n convertToDate(\n (object as Record<string, unknown>)[key],\n object as Record<string, unknown>,\n key,\n );\n }\n }\n};\n","import { inject } from '@angular/core';\nimport { HttpInterceptorFn } from '@angular/common/http';\nimport { ConfigServiceBase } from '../services/config.service.base';\n\n// Cookie-based auth: the session JWTs are HttpOnly cookies, so we just send credentials on API calls.\n// The browser attaches/refreshes the cookies; JS never holds the tokens (XSS-safe).\n//\n// CSRF: state-changing requests (POST/PUT/DELETE/PATCH) authenticated via cookie must include the\n// X-CSRF header, otherwise Spiderly.Shared/Attributes/AuthGuardAttribute.cs returns 403 Forbidden\n// (the server-side check was added in commit 92f238d but the matching client-side header was never\n// emitted, so every cookie-authed write was failing in the admin). The check is presence-only —\n// any non-empty value works — and the protection comes from the fact that a cross-origin form\n// submission cannot set custom request headers without a CORS preflight.\nconst SAFE_HTTP_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);\n\nexport const jwtInterceptor: HttpInterceptorFn = (req, next) => {\n const config = inject(ConfigServiceBase);\n\n const isApiUrl = req.url.startsWith(config.apiUrl);\n if (isApiUrl) {\n const isStateChanging = !SAFE_HTTP_METHODS.has(req.method.toUpperCase());\n req = req.clone({\n withCredentials: true,\n ...(isStateChanging && { setHeaders: { 'X-CSRF': '1' } }),\n });\n }\n\n return next(req);\n};\n","import {\n HttpErrorResponse,\n HttpInterceptorFn,\n HttpRequest,\n} from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { Observable, from, of, throwError } from 'rxjs';\nimport { catchError, map, switchMap } from 'rxjs/operators';\nimport { ApiErrorCodes } from '../errors/api-error-codes';\nimport { AuthServiceBase } from '../services/auth.service.base';\nimport { SpiderlyMessageService } from '../services/spiderly-message.service';\n\n/**\n * Owns cross-cutting HTTP-error UX: shows the right message and, on an expired session, clears auth — then\n * RETHROWS. Errors stay errors: callers run only their success path, and an unhandled HttpErrorResponse that\n * reaches the global ErrorHandler is intentionally ignored there (HTTP-error UX lives here). This interceptor\n * must never convert an error into a value — doing so makes callers treat failures as data.\n */\nexport const unauthorizedInterceptor: HttpInterceptorFn = (req, next) => {\n const messageService = inject(SpiderlyMessageService);\n const translocoService = inject(TranslocoService);\n const authService = inject(AuthServiceBase);\n\n const reactToError = (err: HttpErrorResponse, request: HttpRequest<any>, errorResponse: any): void => {\n // Unconditional, production included, and the only log for a failed request (the global\n // ErrorHandler skips HTTP errors): the toast the user gets is deliberately vague, so this is\n // where a developer reads which request failed and how. See SpiderlyErrorHandler for why\n // silence in production cost more than the console noise saves. The summary leads because an\n // HttpErrorResponse on its own stringifies to \"[object HttpErrorResponse]\" in an error\n // tracker's console breadcrumb; the object still follows, to expand in devtools.\n console.error(`HTTP ${err.status} ${request.method} ${request.url}`, err);\n\n // TODO: type errorResponse as an ApiError interface (TS mirror of ApiErrorDTO, next to\n // errors/api-error-codes.ts) so message/errorCode/traceId reads of the cross-language contract\n // are compile-checked, not conventional.\n\n // ApiErrorDTO.traceId is present only on reportable errors, so this is a no-op everywhere else —\n // the server decides which responses carry a support reference, never this status-code chain.\n const withReference = (detail: string): string =>\n errorResponse?.traceId\n ? `${detail} ${translocoService.translate('ErrorReference', { traceId: errorResponse.traceId })}`\n : detail;\n\n if (err.status === 0) {\n // Server unreachable; defer so the message isn't lost during a shutdown/refresh race.\n setTimeout(() => {\n messageService.warningMessage(\n withReference(translocoService.translate('ServerLostConnectionDetails')),\n translocoService.translate('ServerLostConnectionTitle'),\n );\n }, 100);\n } else if (err.status === 400) {\n messageService.warningMessage(\n withReference(errorResponse?.message ?? translocoService.translate('BadRequestDetails')),\n translocoService.translate('Warning'),\n );\n } else if (err.status === 401) {\n if (errorResponse?.errorCode === ApiErrorCodes.InvalidToken) {\n authService.clearSession(); // expired/invalid session — drop it; guards send the user to login\n } else {\n messageService.warningMessage(\n withReference(errorResponse?.message ?? translocoService.translate('LoginRequired')),\n translocoService.translate('Warning'),\n );\n }\n } else if (err.status === 403) {\n messageService.warningMessage(\n withReference(translocoService.translate('PermissionErrorDetails')),\n translocoService.translate('PermissionErrorTitle'),\n );\n } else if (err.status === 404) {\n messageService.warningMessage(\n withReference(translocoService.translate('NotFoundDetails')),\n translocoService.translate('NotFoundTitle'),\n );\n } else {\n messageService.errorMessage(\n withReference(translocoService.translate('UnexpectedErrorDetails')),\n translocoService.translate('UnexpectedErrorTitle'),\n );\n }\n };\n\n return next(req).pipe(\n catchError((err: HttpErrorResponse) =>\n readErrorBody(err, req).pipe(\n switchMap((errorResponse) => {\n reactToError(err, req, errorResponse);\n return throwError(() => err);\n }),\n ),\n ),\n );\n};\n\n/**\n * The server's ApiErrorDTO, whatever body type the request asked for. Angular hands the ERROR body\n * back in the requested `responseType` too: a `'text'` request gets the JSON as a string, and a\n * `'blob'` request (every PDF / Excel download) gets it as a Blob, whose text is only readable\n * asynchronously — which is why this is an Observable and the toast waits for it. Before the Blob\n * branch existed, a BusinessException on a download endpoint reached the operator as the generic\n * \"bad request\" toast: the sentence the server had spelled out was sitting unread in the Blob.\n * A body that is not JSON resolves to null, so the status-code fallbacks below still apply.\n */\nconst readErrorBody = (err: HttpErrorResponse, request: HttpRequest<any>): Observable<any> => {\n if (err.error instanceof Blob) {\n return from(err.error.text()).pipe(\n map(parseJsonOrNull),\n catchError(() => of(null)),\n );\n }\n if (request.responseType !== 'json' && typeof err.error === 'string') {\n return of(parseJsonOrNull(err.error));\n }\n return of(err.error);\n};\n\nconst parseJsonOrNull = (text: string): any => {\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n};\n","import { Observable, of } from 'rxjs';\nimport { AuthServiceBase } from './auth.service.base';\nimport { AuthResult } from '../entities/security-entities';\nimport { isPlatformBrowser } from '@angular/common';\n\nexport function authInitializer(\n authService: AuthServiceBase,\n platformId,\n): () => Observable<AuthResult> {\n if (isPlatformBrowser(platformId)) {\n return () => {\n authService.captureExternalAuthError(); // before the router can strip ?externalAuthError on the /login redirect\n return authService.refreshToken();\n };\n }\n return () => {\n return of();\n };\n}\n","import { ConfigServiceBase } from './config.service.base';\nimport { Injectable } from '@angular/core';\nimport { TranslocoLoader } from '@jsverse/transloco';\nimport { HttpClient } from '@angular/common/http';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SpiderlyTranslocoLoader implements TranslocoLoader {\n constructor(\n private http: HttpClient,\n private config: ConfigServiceBase,\n ) {}\n\n getTranslation(lang: string) {\n return this.http.get(`${this.config.frontendUrl}/assets/i18n/${lang}.json`);\n }\n}\n","import { Directive, Input } from '@angular/core';\n\n@Directive({\n selector: '[templateType]',\n})\nexport class SpiderlyTemplateTypeDirective<T> {\n @Input() templateType?: T;\n\n static ngTemplateContextGuard<T>(\n dir: SpiderlyTemplateTypeDirective<T>,\n ctx: unknown,\n ): ctx is T {\n return true;\n }\n}\n","/*\n * Public API Surface of spiderly\n */\n\nexport * from './lib/errors/api-error-codes';\nexport * from './lib/controls/base-autocomplete-control';\nexport * from './lib/controls/base-control';\nexport * from './lib/controls/base-dropdown-control';\nexport * from './lib/controls/spiderly-autocomplete/spiderly-autocomplete.component';\nexport * from './lib/controls/spiderly-calendar/spiderly-calendar.component';\nexport * from './lib/controls/spiderly-checkbox/spiderly-checkbox.component';\nexport * from './lib/controls/spiderly-colorpicker/spiderly-colorpicker.component';\nexport * from './lib/controls/spiderly-controls.module';\nexport * from './lib/controls/spiderly-dropdown/spiderly-dropdown.component';\nexport * from './lib/controls/spiderly-editor/spiderly-editor.component';\nexport * from './lib/controls/spiderly-markdown/spiderly-markdown.component';\nexport * from './lib/controls/spiderly-file/spiderly-file.component';\nexport * from './lib/controls/spiderly-multiautocomplete/spiderly-multiautocomplete.component';\nexport * from './lib/controls/spiderly-multiselect/spiderly-multiselect.component';\nexport * from './lib/controls/spiderly-number/spiderly-number.component';\nexport * from './lib/controls/spiderly-password/spiderly-password.component';\nexport * from './lib/controls/spiderly-textarea/spiderly-textarea.component';\nexport * from './lib/controls/spiderly-textbox/spiderly-textbox.component';\n\nexport * from './lib/components/auth/auth-card/auth-card.component';\nexport * from './lib/components/auth/external-provider-icons';\nexport * from './lib/components/auth/external-login/external-login.component';\nexport * from './lib/components/auth/login/login.component';\nexport * from './lib/components/auth/partials/login-verification.component';\nexport * from './lib/components/auth/partials/verification-wrapper.component';\nexport * from './lib/components/base-form/base-form.component';\nexport * from './lib/components/card-skeleton/card-skeleton.component';\nexport * from './lib/components/index-card/index-card.component';\nexport * from './lib/components/info-card/info-card.component';\nexport * from './lib/components/layout/layout.component';\nexport * from './lib/components/layout/profile-avatar/profile-avatar.component';\nexport * from './lib/components/layout/sidebar/menuitem.component';\nexport * from './lib/components/layout/sidebar/sidebar-menu.component';\nexport * from './lib/components/layout/sidebar/sidebar.component';\nexport * from './lib/components/layout/sidemenu-topbar/sidemenu-topbar.component';\nexport * from './lib/components/layout/topbar/topbar.component';\nexport * from './lib/components/not-found/not-found.component';\nexport * from './lib/components/required/required.component';\nexport * from './lib/components/spiderly-buttons/return-button/return-button.component';\nexport * from './lib/components/spiderly-buttons/spiderly-button-base/spiderly-button-base';\nexport * from './lib/components/spiderly-buttons/spiderly-button/spiderly-button.component';\nexport * from './lib/components/spiderly-buttons/spiderly-split-button/spiderly-split-button.component';\nexport * from './lib/components/spiderly-data-table/spiderly-data-table.component';\nexport * from './lib/directives/spiderly-filter-template.directive';\nexport * from './lib/directives/spiderly-overflow-title.directive';\nexport * from './lib/filters/allowed-operators';\nexport * from './lib/filters/filter-store';\nexport * from './lib/filters/spiderly-filter-bar.component';\nexport * from './lib/components/spiderly-data-view/spiderly-data-view.component';\nexport * from './lib/components/spiderly-delete-dialog/spiderly-delete-confirmation.component';\nexport * from './lib/components/spiderly-form-control/spiderly-form-control';\nexport * from './lib/components/spiderly-panels/panel-body/panel-body.component';\nexport * from './lib/components/spiderly-panels/panel-footer/panel-footer.component';\nexport * from './lib/components/spiderly-panels/panel-header/panel-header.component';\nexport * from './lib/components/spiderly-panels/spiderly-card/spiderly-card.component';\nexport * from './lib/components/spiderly-panels/spiderly-panel/spiderly-panel.component';\nexport * from './lib/components/spiderly-panels/spiderly-panels.module';\n\nexport * from './lib/entities/base-entity';\nexport * from './lib/entities/codebook';\nexport * from './lib/entities/editor-image-upload-result';\nexport * from './lib/entities/filter';\nexport * from './lib/entities/filter-rule';\nexport * from './lib/entities/filter-sort-meta';\nexport * from './lib/entities/image-dimensions-validation-result';\nexport * from './lib/entities/init-company-auth-dialog-details';\nexport * from './lib/entities/init-top-bar-data';\nexport * from './lib/entities/is-authorized-for-save-event';\nexport * from './lib/entities/last-menu-icon-index-clicked';\nexport * from './lib/entities/lazy-load-selected-ids-result';\nexport * from './lib/entities/menuchangeevent';\nexport * from './lib/entities/namebook';\nexport * from './lib/entities/paginated-result';\nexport * from './lib/entities/primeng-option';\nexport * from './lib/entities/security-entities';\nexport * from './lib/entities/simple-save-result';\nexport * from './lib/entities/spiderly-button';\n\nexport * from './lib/enums/match-mode-enum-codes';\nexport * from './lib/enums/security-enums';\nexport * from './lib/enums/verification-type-codes';\n\nexport * from './lib/guards/auth.guard';\nexport * from './lib/guards/not-auth.guard';\n\nexport * from './lib/handlers/spiderly-error-handler';\n\nexport * from './lib/interceptors/http-loading.interceptor';\nexport * from './lib/interceptors/json-parser.interceptor';\nexport * from './lib/interceptors/jwt.interceptor';\nexport * from './lib/interceptors/unauthorized.interceptor';\n\nexport * from './lib/services/api.service.security';\nexport * from './lib/services/app-initializer';\nexport * from './lib/services/app-layout.service.base';\nexport * from './lib/services/auth.service.base';\nexport * from './lib/services/base-form.service';\nexport * from './lib/services/config.service.base';\nexport * from './lib/services/helper-functions';\nexport * from './lib/services/spiderly-message.service';\nexport * from './lib/services/spiderly-transloco-loader';\nexport * from './lib/services/validator-abstract.service';\n\nexport * from './lib/directives/spiderly-cell-template.directive';\nexport * from './lib/directives/spiderly-data-table-actions.directive';\nexport * from './lib/directives/template-type.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.ValidatorAbstractService","i5","i4","i2","i3","i1","i2.SpiderlyMessageService","i3.ValidatorAbstractService","i6","i2.ConfigServiceBase","map","i1.AuthServiceBase","i1.ConfigServiceBase","i2.AuthServiceBase","i3.ApiSecurityService","i1.ValidatorAbstractService","i5.BaseFormService","i8.PanelHeaderComponent","i9.PanelBodyComponent","i10.PanelFooterComponent","i11.SpiderlyPanelComponent","i12","i6.AuthServiceBase","i7","i8.SpiderlyTextboxComponent","i9.SpiderlyButtonComponent","i3.PanelHeaderComponent","i4.PanelBodyComponent","i5.SpiderlyPanelComponent","i1.ApiSecurityService","i3.AuthServiceBase","i1.LayoutServiceBase","i3.SidebarMenuService","i4.AuthServiceBase","i5.ApiSecurityService","i6.ConfigServiceBase","i8.SpiderlyAutocompleteComponent","i4.ConfigServiceBase","filter","i5.ConfigServiceBase","i3.ConfigServiceBase","i9","i8.SpiderlyButtonComponent","i9.SpiderlyNumberComponent","i13","i14","i15","i4.SpiderlyButtonComponent","i1.SpiderlyMessageService","finalize","tap"],"mappings":"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"}
|