@arsedizioni/ars-utils 21.2.325 → 21.2.326
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +4 -4
- package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-core.mjs +37 -0
- package/fesm2022/arsedizioni-ars-utils-core.mjs.map +1 -1
- package/package.json +1 -1
- package/types/arsedizioni-ars-utils-clipper.ui.d.ts +1 -1
- package/types/arsedizioni-ars-utils-core.d.ts +6 -0
- package/types/arsedizioni-ars-utils-ui.application.d.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arsedizioni-ars-utils-clipper.ui.mjs","sources":["../../../projects/ars-utils/clipper.ui/ui/document-menu/document-menu.component.ts","../../../projects/ars-utils/clipper.ui/ui/document-menu/document-menu.component.html","../../../projects/ars-utils/clipper.ui/ui/search-facets/search-facets.component.ts","../../../projects/ars-utils/clipper.ui/ui/search-facets/search-facets.component.html","../../../projects/ars-utils/clipper.ui/ui/document-manager/document-manager.ts","../../../projects/ars-utils/clipper.ui/documents.ts","../../../projects/ars-utils/clipper.ui/ui/search-result-manager/search-result-manager.ts","../../../projects/ars-utils/clipper.ui/ui/contacts-selector/contacts-selector.ts","../../../projects/ars-utils/clipper.ui/ui/note-badge/note-badge.component.ts","../../../projects/ars-utils/clipper.ui/ui/note-badge/note-badge.component.html","../../../projects/ars-utils/clipper.ui/ui/search-result-item/search-result-item.component.ts","../../../projects/ars-utils/clipper.ui/ui/search-result-item/search-result-item.component.html","../../../projects/ars-utils/clipper.ui/ui/browser/browser.component.ts","../../../projects/ars-utils/clipper.ui/ui/browser/browser.component.html","../../../projects/ars-utils/clipper.ui/ui/browser/browser-dialog/browser-dialog.component.ts","../../../projects/ars-utils/clipper.ui/ui/browser/browser-dialog/browser-dialog.component.html","../../../projects/ars-utils/clipper.ui/ui/contact-edit/contact-edit.component.ts","../../../projects/ars-utils/clipper.ui/ui/contact-edit/contact-edit.component.html","../../../projects/ars-utils/clipper.ui/ui/document/document.component.ts","../../../projects/ars-utils/clipper.ui/ui/document/document.component.html","../../../projects/ars-utils/clipper.ui/ui/document-index/document-index.component.ts","../../../projects/ars-utils/clipper.ui/ui/document-index/document-index.component.html","../../../projects/ars-utils/clipper.ui/ui/note-edit/note-edit.component.ts","../../../projects/ars-utils/clipper.ui/ui/note-edit/note-edit.component.html","../../../projects/ars-utils/clipper.ui/ui/references/references.component.ts","../../../projects/ars-utils/clipper.ui/ui/references/references.component.html","../../../projects/ars-utils/clipper.ui/ui/search-calendar/search-calendar.component.ts","../../../projects/ars-utils/clipper.ui/ui/search-calendar/search-calendar.component.html","../../../projects/ars-utils/clipper.ui/ui/search-free-text-help/search-free-text-help.component.ts","../../../projects/ars-utils/clipper.ui/ui/search-free-text-help/search-free-text-help.component.html","../../../projects/ars-utils/clipper.ui/ui/search-free-text-query-builder/search-free-text-query-builder.component.ts","../../../projects/ars-utils/clipper.ui/ui/search-free-text-query-builder/search-free-text-query-builder.component.html","../../../projects/ars-utils/clipper.ui/public_api.ts","../../../projects/ars-utils/clipper.ui/arsedizioni-ars-utils-clipper.ui.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, DestroyRef, Renderer2, afterNextRender, computed, inject, input, signal, viewChild } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\r\nimport { FlexModule } from '@ngbracket/ngx-layout';\r\nimport { ClipperDocumentInfo, ClipperModel, ClipperService, ClipperUtils } from '@arsedizioni/ars-utils/clipper.common';\r\n\r\n@Component({\r\n selector: 'clipper-document-menu',\r\n templateUrl: './document-menu.component.html',\r\n styleUrls: ['./document-menu.component.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [FlexModule, MatMenuModule, MatIconModule, MatDividerModule, MatTooltipModule]\r\n})\r\nexport class ClipperDocumentMenuComponent {\r\n\r\n private readonly rsMenuTrigger = viewChild<MatMenuTrigger>('rsMenuTrigger');\r\n private readonly aiAssistantMenuTrigger = viewChild<MatMenuTrigger>('aiAssistantMenuTrigger');\r\n private readonly linksMenuTrigger = viewChild<MatMenuTrigger>('linksMenuTrigger');\r\n private readonly allMenuTriggers = [\r\n this.linksMenuTrigger,\r\n this.rsMenuTrigger,\r\n this.aiAssistantMenuTrigger,\r\n ];\r\n\r\n private readonly renderer2 = inject(Renderer2);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly clipperService = inject(ClipperService);\r\n\r\n /** Internal counter incremented on each external selection-model change to drive signal re-evaluation. */\r\n private readonly selectionChangeTick = signal(0);\r\n\r\n readonly useSelections = input<boolean>(false);\r\n readonly selectionSource = input<'bag' | 'selection' | 'none' | undefined>('selection');\r\n\r\n /**\r\n * Computed signal that returns the current effective document selection.\r\n * Re-evaluates when any input signal or the underlying selection model changes.\r\n */\r\n protected readonly selection = computed((): ClipperDocumentInfo[] => {\r\n this.selectionChangeTick(); // track external SelectionModel changes\r\n if (this.useSelections()) {\r\n switch (this.selectionSource()) {\r\n case 'bag': return this.parent()?.clipperService.bag() ?? [];\r\n case 'selection': return this.parent()?.selection?.all ?? [];\r\n }\r\n }\r\n return [];\r\n });\r\n\r\n readonly parent = input.required<any>();\r\n readonly item = input<ClipperDocumentInfo>();\r\n readonly isReference = input<boolean>(false);\r\n readonly isReadable = input<boolean>(true);\r\n readonly isReadableModel = input<ClipperModel | undefined>(undefined);\r\n readonly isLawInForce = input<boolean>(false);\r\n readonly canPrint = input<boolean>(false);\r\n readonly canFind = input<boolean>(false);\r\n readonly canUseCalendar = input<boolean>(false);\r\n readonly canUseArchive = input<boolean>(false);\r\n readonly canUseNotes = input<boolean>(false);\r\n readonly canUseAIAssistant = input<boolean>(false);\r\n\r\n protected readonly canUseAIEditor: boolean = this.clipperService.loginInfo?.context.hasAIEditor ?? false;\r\n\r\n readonly canUseRS = input<boolean>(true);\r\n readonly canOpenDocument = input<boolean>(true);\r\n\r\n /** `true` when the current selection source is 'selection' and at least one item is selected. */\r\n protected readonly canDeselectAll = computed(() =>\r\n this.selectionSource() === 'selection' && this.selection().length > 0\r\n );\r\n /** `true` when operating in bag-management mode. */\r\n protected readonly canManageBag = computed(() => this.selectionSource() === 'bag');\r\n /** `true` when opening a document is allowed and exactly one item is selected. */\r\n protected readonly canOpen = computed(() => this.canOpenDocument() && this.hasSingleSelection());\r\n /** `true` when at least one item can be sent by email. */\r\n protected readonly canSendByEmail = computed(() => this.getMultipleSelection().length > 0);\r\n /** `true` when custom notes can be added to the single selected document. */\r\n protected readonly canAddNotes = computed(() =>\r\n this.canUseNotes() &&\r\n this.clipperService.loginInfo?.context.hasSharedNotes === true &&\r\n this.hasSingleSelection()\r\n );\r\n /** `true` when archive access is enabled and there is at least one selected item. */\r\n protected readonly canAddToArchive = computed(() => this.canUseArchive() && this.canSendByEmail());\r\n /** `true` when all selected items are deadline/alert documents and calendar is enabled. */\r\n protected readonly canAddToCalendar = computed(() =>\r\n this.getMultipleSelection().every(\r\n n => n.model === ClipperModel.Scadenze || n.model === ClipperModel.Segnalazioni\r\n ) && this.canUseCalendar() && !this.isReference()\r\n );\r\n /** `true` when all selected items can be exported as an ICS calendar file. */\r\n protected readonly canExportCalendar = computed(() =>\r\n this.getMultipleSelection().every(\r\n n => n.model === ClipperModel.Scadenze || n.model === ClipperModel.Segnalazioni\r\n ) && this.canUseCalendar() && !this.isReference()\r\n );\r\n /** `true` when the selection contains non-Coordinamento items that can be added to working documents. */\r\n protected readonly canAddToWorkingDocuments = computed(() => {\r\n if (this.selectionSource() === 'bag') return false;\r\n const items = this.getMultipleSelection();\r\n return items.length > 0 && items.every(n => n.model !== ClipperModel.Coordinamento);\r\n });\r\n /** `true` when a single non-Coordinamento document is selected and can be saved as PDF. */\r\n protected readonly canSaveAsPdf = computed(() => {\r\n const item = this.getSingleSelection();\r\n return item !== undefined && item.model !== ClipperModel.Coordinamento;\r\n });\r\n /** `true` when the selection contains at least one unread document that supports the read state. */\r\n protected readonly canSetAsRead = computed(() => {\r\n const items = this.getMultipleSelection();\r\n return this.isReadable() && (\r\n items.length > 1 ||\r\n (items.length === 1 && items[0].isRead !== true &&\r\n ClipperUtils.isClipperModelReadable(this.isReadableModel() ?? items[0].model))\r\n );\r\n });\r\n /** `true` when the selection contains at least one already-read document that supports the read state. */\r\n protected readonly canSetAsUnread = computed(() => {\r\n const items = this.getMultipleSelection();\r\n return this.isReadable() && (\r\n items.length > 1 ||\r\n (items.length === 1 && items[0].isRead === true &&\r\n ClipperUtils.isClipperModelReadable(this.isReadableModel() ?? items[0].model))\r\n );\r\n });\r\n /** `true` when the Clipper service supports RS and all selected items are RS-enabled. */\r\n protected readonly canAccessRS = computed(() => {\r\n const items = this.getMultipleSelection();\r\n return this.clipperService.supportsRS() && this.canUseRS() && this.parent()?.RS_enabled(items) === true;\r\n });\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n if (this.selectionSource() === 'selection') {\r\n this.parent()?.selection?.changed\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.selectionChangeTick.update(v => v + 1));\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Returns a single selected document: the bound item if present, or the sole item in the selection list.\r\n * @returns The selected document, or `undefined` when zero or more than one item is selected.\r\n */\r\n protected getSingleSelection(): ClipperDocumentInfo | undefined {\r\n if (this.item()) {\r\n return this.item();\r\n } else if (this.selection().length === 1) {\r\n return this.selection()[0];\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Returns the full effective selection as an array.\r\n * If a bound item is present it is returned wrapped in a single-element array;\r\n * otherwise the full selection list is returned.\r\n * @returns An array of selected documents, or an empty array when nothing is selected.\r\n */\r\n protected getMultipleSelection(): ClipperDocumentInfo[] {\r\n const item = this.item();\r\n if (item) return [item];\r\n return this.selection().length > 0 ? this.selection() : [];\r\n }\r\n\r\n /**\r\n * Returns whether exactly one document is available for single-item operations.\r\n * @returns `true` if the bound item has a non-empty document ID, or if exactly one item is selected.\r\n */\r\n protected hasSingleSelection(): boolean {\r\n return (this.item()?.documentId?.length ?? 0) > 0 || this.selection().length === 1;\r\n }\r\n\r\n /**\r\n * Closes all open sub-menu panels, then optionally opens the given trigger's menu.\r\n * @param trigger - The menu trigger to open after closing others; omit to only close.\r\n */\r\n protected showSubMenu(trigger?: MatMenuTrigger): void {\r\n this.allMenuTriggers.forEach(menuTrigger => {\r\n const menu = menuTrigger();\r\n if (menu?.menuOpen) {\r\n menu.closeMenu();\r\n this.resetSubMenu(menu);\r\n }\r\n });\r\n trigger?.openMenu();\r\n }\r\n\r\n /**\r\n * Removes the CDK focus classes from the given trigger element to reset its visual state.\r\n * @param trigger - The menu trigger whose focus styles to clear.\r\n */\r\n protected resetSubMenu(trigger: MatMenuTrigger): void {\r\n this.renderer2.removeClass(trigger['_element'].nativeElement, 'cdk-focused');\r\n this.renderer2.removeClass(trigger['_element'].nativeElement, 'cdk-program-focused');\r\n }\r\n\r\n /**\r\n * Returns the read state of the current item or selection.\r\n * @returns `0` if unread, `1` if read, `2` if mixed or unknown.\r\n */\r\n protected isRead(): number {\r\n if (this.item()) return this.item()?.isRead === true ? 1 : 0;\r\n if (this.parent()?.hasAnySelection()) return 2;\r\n const firstSelection = this.parent()?.getSingleSelection();\r\n if (firstSelection) {\r\n return firstSelection.isRead === true ? 1 : 0;\r\n }\r\n return 0;\r\n }\r\n\r\n /**\r\n * Delegates a read/unread state change to the parent component.\r\n * @param value - `true` to mark as read, `false` to mark as unread.\r\n */\r\n protected setRead(value: boolean): void {\r\n this.parent()?.setRead(value, this.item());\r\n }\r\n\r\n /**\r\n * Opens the given document, optionally in a new browser window.\r\n * @param item - The document to open; no-op when `undefined`.\r\n * @param newWindow - When `true`, opens the document in a new window.\r\n */\r\n protected open(item: ClipperDocumentInfo | undefined, newWindow: boolean = false): void {\r\n if (item?.documentId) {\r\n this.parent()?.open(item.documentId, undefined, undefined, newWindow);\r\n }\r\n }\r\n\r\n /**\r\n * Opens the references panel for the given document in the specified mode.\r\n * @param item - The document whose references to display; no-op when `undefined`.\r\n * @param mode - The reference query mode (e.g. 1 = referenced by, 2 = references, 4 = case law).\r\n */\r\n protected openReferences(item: ClipperDocumentInfo | undefined, mode: number): void {\r\n if (item?.documentId) {\r\n this.parent()?.openReferences(item.documentId, mode);\r\n }\r\n }\r\n}\r\n","@if (canDeselectAll()) {\r\n<button mat-menu-item (click)=\"parent().selection?.clear()\" [attr.aria-label]=\"'Deseleziona tutti'\"\r\n (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>clear</mat-icon>Deseleziona tutti\r\n</button>\r\n} @else if (canManageBag()) {\r\n<button mat-menu-item (click)=\"parent().openBag()\" [attr.aria-label]=\"'Gestisci documenti di lavoro'\"\r\n (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>work_outline</mat-icon>Gestisci documenti di lavoro\r\n</button>\r\n}\r\n@if (canOpen()) {\r\n<button mat-menu-item [attr.aria-label]=\"'Apri documento'\" (mouseenter)=\"showSubMenu()\"\r\n (click)=\"open(getSingleSelection())\">\r\n <mat-icon></mat-icon>Apri\r\n</button>\r\n}\r\n<button mat-menu-item [attr.aria-label]=\"'Apri documento in una nuova finestra'\" (mouseenter)=\"showSubMenu()\"\r\n (click)=\"open(getSingleSelection(), true)\">\r\n <mat-icon>open_in_new</mat-icon>Apri in una nuova finestra...\r\n</button>\r\n@if (canAddToWorkingDocuments()) {\r\n<button mat-menu-item [attr.aria-label]=\"'Aggiungi ai documenti di lavoro'\"\r\n (click)=\"parent().addItemsToBag(getMultipleSelection())\" (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>work_outline</mat-icon>Aggiungi ai documenti di lavoro\r\n</button>\r\n}\r\n@if(canPrint()) {\r\n<button mat-menu-item (click)=\"parent().print()\" [attr.aria-label]=\"'Stampa documento'\" (mouseenter)=\"showSubMenu()\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"20px\" fxLayoutAlign=\"start center\" fxFill>\r\n <div fxFlex=\"*\" fxLayout=\"row\" fxFill fxLayoutAlign=\"start center\">\r\n <mat-icon>print</mat-icon>\r\n <div>Stampa</div>\r\n </div>\r\n <div class=\"accent small bold\">CTRL+P</div>\r\n </div>\r\n</button>\r\n}\r\n@if(canFind()) {\r\n<button mat-menu-item (click)=\"parent().find()\" [attr.aria-label]=\"'Trova nel documento'\" (mouseenter)=\"showSubMenu()\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"20px\" fxLayoutAlign=\"start center\" fxFill>\r\n <div fxFlex=\"*\" fxLayout=\"row\" fxFill fxLayoutAlign=\"start center\">\r\n <mat-icon>find_in_page</mat-icon>\r\n <div>Trova nel documento</div>\r\n </div>\r\n <div class=\"accent small bold\">CTRL+F</div>\r\n </div>\r\n</button>\r\n}\r\n@if (canAddNotes()) {\r\n<button mat-menu-item (click)=\"parent().addItemNotes(getSingleSelection())\"\r\n [attr.aria-label]=\"'Annota'\" (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>note_stack_add</mat-icon>Aggiungi nota\r\n</button>\r\n}\r\n@if (canSendByEmail()) {\r\n<button mat-menu-item (click)=\"parent().sendItemsTo(getMultipleSelection())\"\r\n [attr.aria-label]=\"'Invia documento per email'\" (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>send</mat-icon>Invia per email\r\n</button>\r\n}\r\n@if (canAddToArchive()) {\r\n<button mat-menu-item (click)=\"parent().addToArchive(getMultipleSelection())\" [attr.aria-label]=\"'Archivia'\">\r\n <mat-icon>account_tree</mat-icon>Archivia\r\n</button>\r\n}\r\n@if (canSaveAsPdf()) {\r\n<button mat-menu-item (click)=\"parent().exportPdf(getSingleSelection())\" (mouseenter)=\"showSubMenu()\"\r\n [attr.aria-label]=\"'Salva documento in pdf'\">\r\n <mat-icon>save_alt</mat-icon>Salva in pdf\r\n</button>\r\n}\r\n<button mat-menu-item [attr.aria-label]=\"'Genera un link permanente da utilizzare esternamente'\"\r\n (click)=\"parent().showLink(getSingleSelection())\" (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>link</mat-icon>Link\r\n</button>\r\n<button mat-menu-item [attr.aria-label]=\"'Copia metadati negli appunti'\"\r\n (click)=\"parent().copyMetadataToClipboard(getSingleSelection())\" (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>content_copy</mat-icon>Copia metadati\r\n</button>\r\n@if (!isReference() && canOpen()) {\r\n<button mat-menu-item [matMenuTriggerFor]=\"linksMenu\" #linksMenuTrigger=\"matMenuTrigger\"\r\n (mouseenter)=\"showSubMenu(linksMenuTrigger)\" (mouseleave)=\"resetSubMenu(linksMenuTrigger)\">\r\n <mat-icon>compare_arrows</mat-icon>Collegamenti\r\n</button>\r\n<mat-menu #linksMenu=\"matMenu\">\r\n @if (!isReference() && canOpen()) {\r\n <button mat-menu-item [attr.aria-label]=\"'Mostra i documenti richiamati da questo'\"\r\n (click)=\"openReferences(getSingleSelection(), 1)\">\r\n Documenti richiamati\r\n </button>\r\n }\r\n @if (!isReference() && canOpen()) {\r\n <button mat-menu-item [attr.aria-label]=\"'Mostra i documenti che richiamano questo'\"\r\n (click)=\"openReferences(getSingleSelection(), 2)\">\r\n Documenti che richiamano\r\n </button>\r\n }\r\n @if (!isReference() && isLawInForce() && canOpen()) {\r\n <button mat-menu-item [attr.aria-label]=\"'Mostra giurisprudenza'\" (click)=\"openReferences(getSingleSelection(), 4)\">\r\n Juris\r\n </button>\r\n }\r\n @if (!isReference() && isLawInForce() && canOpen()) {\r\n <button mat-menu-item [attr.aria-label]=\"'Mostra modifiche normative'\"\r\n (click)=\"openReferences(getSingleSelection(), 3)\">\r\n Modifiche\r\n </button>\r\n }\r\n</mat-menu>\r\n}\r\n@if (canAddToCalendar()) {\r\n<button mat-menu-item [attr.aria-label]=\"'Aggiungi al calendario'\"\r\n (click)=\"parent().addToCalendar(getSingleSelection())\">\r\n <mat-icon>alarm</mat-icon> Crea scadenza\r\n</button>\r\n}\r\n@if (canExportCalendar()) {\r\n@if(useSelections()) {\r\n<button mat-menu-item [attr.aria-label]=\"'Importa in Oultook (iCalandar)'\" (click)=\"parent().exportResults(2)\">\r\n <mat-icon>mail_outline</mat-icon>Importa in Outlook (iCalendar)\r\n</button>\r\n} @else if (item()) {\r\n<button mat-menu-item [attr.aria-label]=\"'Importa in Oultook (iCalandar)'\"\r\n (click)=\"parent().exportItems([item().documentId], null, 2)\">\r\n <mat-icon>mail_outline</mat-icon>Importa in Outlook (iCalendar)\r\n</button>\r\n}\r\n}\r\n@if (canSetAsUnread()) {\r\n<button mat-menu-item [attr.aria-label]=\"'Segna come da leggere'\" (click)=\"setRead(false)\" (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>outlined_flag</mat-icon>Segna come da leggere\r\n</button>\r\n}\r\n@if (canSetAsRead()) {\r\n<button mat-menu-item [attr.aria-label]=\"'Segna come già letto'\" (click)=\"setRead(true)\" (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>flag</mat-icon>Segna come già letto\r\n</button>\r\n}\r\n\r\n\r\n@if (isLawInForce() && canOpen()) {\r\n<button mat-menu-item [attr.aria-label]=\"'Mostra report'\" (click)=\"parent().report(getSingleSelection())\"\r\n (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>assignment</mat-icon>Report\r\n</button>\r\n}\r\n\r\n@if (canUseAIAssistant() && hasSingleSelection()) {\r\n<mat-divider></mat-divider>\r\n<button mat-menu-item matTooltip=\"Assistente IA\" [attr.aria-label]=\"'Assistente IA'\"\r\n [matMenuTriggerFor]=\"aiAssistantMenu\" #aiAssistantMenuTrigger=\"matMenuTrigger\"\r\n (mouseenter)=\"showSubMenu(aiAssistantMenuTrigger)\" (mouseleave)=\"resetSubMenu(aiAssistantMenuTrigger)\">\r\n <mat-icon>borg</mat-icon>\r\n Assistente IA\r\n</button>\r\n<mat-menu #aiAssistantMenu=\"matMenu\">\r\n <button mat-menu-item [attr.aria-label]=\"'Mi riguarda?'\" (click)=\"parent().AI_concernMe(getSingleSelection())\">\r\n Mi riguarda?\r\n </button>\r\n <button mat-menu-item [attr.aria-label]=\"'Di che si tratta?'\" (click)=\"parent().AI_explain(getSingleSelection())\">\r\n Di che si tratta?\r\n </button>\r\n @if (canUseAIEditor) {\r\n <button mat-menu-item [attr.aria-label]=\"'Genera commento tecnico'\"\r\n (click)=\"parent().AI_comment(getSingleSelection())\">\r\n Genera commento tecnico\r\n </button>\r\n <button mat-menu-item [attr.aria-label]=\"'Genera news'\" (click)=\"parent().AI_news(getSingleSelection())\">\r\n Genera news\r\n </button>\r\n }\r\n</mat-menu>\r\n}\r\n\r\n@if (canAccessRS()) {\r\n<mat-divider></mat-divider>\r\n<button mat-menu-item matTooltip=\"Registro & Scadenzario\" [attr.aria-label]=\"'Opzioni di Registro & Scadenzario'\"\r\n [matMenuTriggerFor]=\"rsMenu\" #rsMenuTrigger=\"matMenuTrigger\" (mouseenter)=\"showSubMenu(rsMenuTrigger)\"\r\n (mouseleave)=\"resetSubMenu(rsMenuTrigger)\">\r\n <mat-icon>alarm_on</mat-icon>\r\n Registro e scadenzario\r\n</button>\r\n<mat-menu #rsMenu=\"matMenu\">\r\n <button mat-menu-item [attr.aria-label]=\"'Nuova legge'\" (click)=\"parent().RS_newLaw(getMultipleSelection())\">\r\n Nuova legge\r\n </button>\r\n @if (hasSingleSelection()) {\r\n <button mat-menu-item [attr.aria-label]=\"'Nuova attività'\" (click)=\"parent().RS_newActivity(getSingleSelection())\">\r\n Nuova attività\r\n </button>\r\n }\r\n @if (hasSingleSelection()) {\r\n <button mat-menu-item [attr.aria-label]=\"'Report utilizzo norma'\"\r\n (click)=\"parent().RS_usageReport(getSingleSelection())\">\r\n Report utilizzo norma\r\n </button>\r\n }\r\n</mat-menu>\r\n}","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, input, output } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport {\r\n ClipperFacet,\r\n ClipperSearchFacet,\r\n ClipperSearchFacetGroup,\r\n ClipperSearchFacetsSnapshot\r\n} from '@arsedizioni/ars-utils/clipper.common';\r\nimport { FlexModule } from '@ngbracket/ngx-layout/flex';\r\n\r\n\r\n@Component({\r\n selector: 'clipper-search-facets',\r\n templateUrl: './search-facets.component.html',\r\n styleUrls: ['./search-facets.component.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [FlexModule, MatButtonModule, MatTooltipModule, MatChipsModule, MatIconModule, \r\n MatDividerModule, MatExpansionModule]\r\n})\r\nexport class ClipperSearchFacetsComponent {\r\n readonly changed = output<ClipperSearchFacetsSnapshot>();\r\n private readonly changeDetector = inject(ChangeDetectorRef);\r\n\r\n protected snapshot: ClipperSearchFacetsSnapshot = new ClipperSearchFacetsSnapshot();\r\n\r\n /**\r\n * Returns whether the current snapshot contains at least one available or applied facet group.\r\n */\r\n public hasFacets(): boolean { return this.snapshot.hasFacets; }\r\n\r\n readonly handleTooManyResults = input<boolean>(false);\r\n\r\n /**\r\n * Pushes a new set of facet groups into the snapshot and refreshes the view.\r\n * @param values - The raw facet data returned by the search engine, grouped by type.\r\n * @param interval - Optional display label for the year-range interval (YEAR facet type).\r\n */\r\n update(values?: ClipperSearchFacet[][], interval?: string): void {\r\n this.snapshot.interval = interval;\r\n if (values) {\r\n this.snapshot.groups = [];\r\n values.forEach(n => {\r\n const name = n[0].typeName;\r\n const index = n[0].type;\r\n const i = this.snapshot.usedGroups.findIndex(n => n.index === index);\r\n const j = this.snapshot.groups.findIndex(n => n.index === index);\r\n if (i === -1 && j === -1) {\r\n this.snapshot.groups.push({\r\n name: name,\r\n selectedValue: null,\r\n selectedValueDescription: null,\r\n values: n,\r\n index: index,\r\n }); \r\n }\r\n });\r\n }\r\n this.snapshot.hasFacets = this.snapshot.groups.length > 0 || this.snapshot.usedGroups.length > 0; \r\n this.snapshot.hasMoreFacets = this.snapshot.hasFacets && this.snapshot.groups.length > this.snapshot.usedGroups.length; \r\n this.changeDetector.markForCheck();\r\n }\r\n\r\n\r\n\r\n /**\r\n * Applies the given facet item as an active filter and emits a `changed` event.\r\n * @param group - The facet group that owns the selected item.\r\n * @param item - The facet item chosen by the user.\r\n */\r\n protected use(group: ClipperSearchFacetGroup, item: ClipperSearchFacet): void {\r\n group.selectedValue = item.value;\r\n group.selectedValueDescription = item.title;\r\n const j = this.snapshot.groups.findIndex(n => n.index === group.index);\r\n if (j !== -1) {\r\n this.snapshot.groups.splice(j, 1);\r\n // Insert into usedGroups in ascending index order without mutating while iterating.\r\n const insertAt = this.snapshot.usedGroups.findIndex(n => n.index > group.index);\r\n if (insertAt !== -1) {\r\n this.snapshot.usedGroups.splice(insertAt, 0, group);\r\n } else {\r\n this.snapshot.usedGroups.push(group);\r\n }\r\n }\r\n this.apply();\r\n }\r\n\r\n /**\r\n * Removes an active facet filter from the selection and optionally emits a `changed` event.\r\n * @param group - The applied facet group to dismiss.\r\n * @param apply - When `true` (default), emits the `changed` event to trigger a new search.\r\n */\r\n protected dismiss(group: ClipperSearchFacetGroup, apply: boolean = true): void {\r\n group.selectedValue = undefined;\r\n group.selectedValueDescription = undefined;\r\n const i = this.snapshot.usedGroups.findIndex(n => n.index === group.index);\r\n if (i !== -1) {\r\n this.snapshot.usedGroups.splice(i, 1);\r\n // Re-insert into groups in ascending index order without mutating while iterating.\r\n const insertAt = this.snapshot.groups.findIndex(n => n.index > group.index);\r\n if (insertAt !== -1) {\r\n this.snapshot.groups.splice(insertAt, 0, group);\r\n } else {\r\n this.snapshot.groups.push(group);\r\n }\r\n }\r\n if (apply) {\r\n this.apply();\r\n }\r\n }\r\n\r\n /**\r\n * Builds and emits the current `ClipperSearchFacetsSnapshot` after resolving each applied\r\n * facet group's filter value into the corresponding snapshot date/sector/author/type fields.\r\n */\r\n private apply(): void {\r\n if (this.snapshot.usedGroups.length > 0) {\r\n this.snapshot.usedGroups.forEach(n => {\r\n if (n.index === ClipperFacet.Year) {\r\n if (n.selectedValue) {\r\n this.snapshot.fromDate = new Date(parseInt(n.selectedValue), 0, 1, 12, 0, 0);\r\n this.snapshot.toDate = new Date(parseInt(n.selectedValue), 11, 31, 12, 0, 0);\r\n } else {\r\n this.snapshot.fromDate = undefined;\r\n this.snapshot.toDate = undefined;\r\n }\r\n } else if (n.index === ClipperFacet.Sector) {\r\n this.snapshot.sector = n.selectedValue ?? null;\r\n } else if (n.index === ClipperFacet.Author) {\r\n this.snapshot.author = n.selectedValue ?? null;\r\n } else if (n.index === ClipperFacet.DocumentType) {\r\n this.snapshot.type = n.selectedValue ?? null;\r\n } else if (n.index === ClipperFacet.Article) {\r\n this.snapshot.anchor = n.selectedValue ?? null;\r\n } else if (n.index === ClipperFacet.Reason) {\r\n this.snapshot.reason = n.selectedValue ?? null;\r\n }\r\n });\r\n }\r\n if (this.snapshot.groups.length > 0) {\r\n this.snapshot.groups.forEach(n => {\r\n if (n.index === ClipperFacet.Year) {\r\n this.snapshot.fromDate = undefined;\r\n this.snapshot.toDate = undefined;\r\n } else if (n.index === ClipperFacet.Sector) {\r\n this.snapshot.sector = undefined;\r\n } else if (n.index === ClipperFacet.Author) {\r\n this.snapshot.author = undefined;\r\n } else if (n.index === ClipperFacet.DocumentType) {\r\n this.snapshot.type = undefined;\r\n } else if (n.index === ClipperFacet.Article) {\r\n this.snapshot.anchor = undefined;\r\n } else if (n.index === ClipperFacet.Reason) {\r\n this.snapshot.reason = undefined;\r\n }\r\n });\r\n }\r\n this.changed.emit(this.snapshot);\r\n }\r\n\r\n /**\r\n * Dismisses one or all applied facet groups and emits a `changed` event if any were removed.\r\n * @param index - The group index to clear, or `-1` to clear all applied groups at once.\r\n * @returns The number of groups that were dismissed.\r\n */\r\n protected clear(index: number = -1): number {\r\n let dismissed = 0;\r\n // Snapshot the list first to avoid mutating usedGroups while iterating it.\r\n const toRemove = this.snapshot.usedGroups.filter(n => index === -1 || index === n.index);\r\n toRemove.forEach(n => {\r\n if (n.index === ClipperFacet.Year) {\r\n this.snapshot.fromDate = undefined;\r\n this.snapshot.toDate = undefined;\r\n } else if (n.index === ClipperFacet.Sector) {\r\n this.snapshot.sector = undefined;\r\n } else if (n.index === ClipperFacet.Author) {\r\n this.snapshot.author = undefined;\r\n } else if (n.index === ClipperFacet.DocumentType) {\r\n this.snapshot.type = undefined;\r\n } else if (n.index === ClipperFacet.Article) {\r\n this.snapshot.anchor = undefined;\r\n } else if (n.index === ClipperFacet.Reason) {\r\n this.snapshot.reason = undefined;\r\n }\r\n this.dismiss(n, false);\r\n dismissed++;\r\n });\r\n if (dismissed) {\r\n this.changed.emit(this.snapshot);\r\n }\r\n return dismissed;\r\n }\r\n\r\n /**\r\n * Resets all facet state: clears every applied/available group and all derived filter fields.\r\n */\r\n reset(): void {\r\n this.snapshot.groups = [];\r\n this.snapshot.usedGroups = [];\r\n this.snapshot.hasFacets = false;\r\n this.snapshot.fromDate = undefined;\r\n this.snapshot.toDate = undefined;\r\n this.snapshot.sector = undefined;\r\n this.snapshot.author = undefined;\r\n this.snapshot.anchor = undefined;\r\n this.snapshot.type = undefined;\r\n this.snapshot.reason = undefined;\r\n }\r\n\r\n /**\r\n * Restores a previously serialised facets snapshot and refreshes the view.\r\n * @param data - The snapshot to restore.\r\n */\r\n restore(data: ClipperSearchFacetsSnapshot): void {\r\n if (data) {\r\n this.snapshot = data;\r\n this.changeDetector.markForCheck();\r\n }\r\n }\r\n\r\n /**\r\n * Returns the current facets snapshot for external serialisation (e.g. save/restore cycle).\r\n * @returns The current `ClipperSearchFacetsSnapshot`.\r\n */\r\n save(): ClipperSearchFacetsSnapshot {\r\n return this.snapshot;\r\n }\r\n}\r\n","<div fxLayout=\"column\" fxFill class=\"facets-container scroll-hidden\">\r\n @if (snapshot.usedGroups.length > 0) {\r\n <div class=\"facets-selection\">\r\n <mat-chip-set aria-label=\"Selezione\">\r\n @for (ug of snapshot.usedGroups; track $index) {\r\n <mat-chip (removed)=\"dismiss(ug)\" [matTooltip]=\"ug.selectedValueDescription ?? ''\" matTooltipPosition=\"above\">\r\n {{ug.selectedValueDescription}}\r\n <button matChipRemove [attr.aria-label]=\"'Rimuovi ' + ug.name\" [matTooltip]=\"'Rimuovi ' + ug.name\">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip>\r\n }\r\n </mat-chip-set>\r\n <mat-divider class=\"divider\"></mat-divider>\r\n </div>\r\n }\r\n <div fxFlex=\"*\" class=\"scroll-auto facets-items-container\">\r\n @if (snapshot.groups.length > 0) {\r\n @for (group of snapshot.groups; track group.index; let i = $index) {\r\n <mat-accordion multi displayMode=\"flat\">\r\n <mat-expansion-panel class=\"accordion-panel mat-elevation-z0 \" [expanded]=\"i == 0\">\r\n <mat-expansion-panel-header class=\"accordion-header\" [attr.aria-label]=\"group.name\">\r\n <mat-panel-title>\r\n @if (group.index == 2 && snapshot.interval) {\r\n {{snapshot.interval}} ({{group.values.length}})\r\n } @else {\r\n {{group.name}} ({{group.values.length}})\r\n }\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <nav class=\"facets-items\">\r\n <ul>\r\n @for (item of group.values; track $index) {\r\n <li (click)=\"use(group, item)\" [attr.aria-label]=\"item.title\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\" class=\"truncated\">\r\n <div class=\"truncated\">{{item.title}}</div>\r\n </div>\r\n <div fxLayoutAlign=\"end\" fxFlexAlign=\"center\">\r\n {{!handleTooManyResults() && snapshot.hasTooManyResults ? '~' : ''}}{{item.count}}\r\n </div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </nav>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n }\r\n } @else if (snapshot.hasFacets && !snapshot.hasMoreFacets) {\r\n <div class=\"facets-message\">\r\n <p class=\"small\"><i>Tutte le opzioni sono state selezionate</i></p>\r\n </div>\r\n }\r\n </div>\r\n</div>","import { Clipboard } from '@angular/cdk/clipboard';\r\nimport { ChangeDetectionStrategy, Component, inject, output, signal } from '@angular/core';\r\nimport { ClipperDocumentInfo, ClipperExportDocumentsParams, ClipperMessages, ClipperModel, ClipperModule, ClipperQueryReferencesMode, ClipperSearchParams, ClipperSendDocumentsByEmailParams, ClipperService } from '@arsedizioni/ars-utils/clipper.common';\r\nimport { BroadcastService, SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { DialogResult } from '@arsedizioni/ars-utils/ui';\r\nimport { ApplicationDialogService, SelectableItem, SelectDialogDelete, SendToDialogComponent, SendToPopulateData } from '@arsedizioni/ars-utils/ui.application';\r\nimport saveAs from 'file-saver';\r\nimport { finalize } from 'rxjs';\r\n\r\n\r\n@Component({\r\n template: '<div></div>',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ClipperDocumentManager {\r\n readonly populateContacts = output<SendToPopulateData>();\r\n protected readonly clipboard = inject(Clipboard);\r\n public readonly clipperService = inject(ClipperService);\r\n protected readonly broadcastService = inject(BroadcastService);\r\n protected readonly dialogService = inject(ApplicationDialogService);\r\n protected readonly canUseArchive = signal<boolean>(false);\r\n protected readonly canUseNotes = signal<boolean>(false);\r\n protected readonly canHandleTooManyResults = signal<boolean>(false);\r\n protected readonly canPopulateContacts = signal<boolean>(false);\r\n\r\n \r\n /**\r\n * Exports a document in PDF format, after asking for confirmation.\r\n * @param item - The document to export.\r\n */\r\n exportPdf(item: ClipperDocumentInfo): void {\r\n if (!this.clipperService.loggedIn()) return;\r\n if (!item) return;\r\n this.dialogService\r\n .confirm(\"Confermi l'esportazione?\", 'Attenzione!')\r\n .componentInstance.choosen.subscribe((data: DialogResult) => {\r\n if (data.result === 'ok') {\r\n const id = item.id ?? item.documentId;\r\n this.dialogService.busy('Esportazione in corso...');\r\n this.clipperService.exportPdf(id)\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n saveAs(r, (item.title1 ?? id) + '.pdf');\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Exports the current document list (or only the selected documents) as CSV or ICS.\r\n * @param documentIds - The list of document IDs to export; if empty, the full search result is exported.\r\n * @param searchParams - The search parameters used to identify the full result set when no IDs are provided.\r\n * @param format - The export format: 1 = list (CSV), 2 = deadlines (ICS).\r\n */\r\n exportItems(\r\n documentIds: string[] | undefined,\r\n searchParams: ClipperSearchParams | undefined = undefined,\r\n format: number = 1): void {\r\n if (!this.clipperService.loggedIn()) return;\r\n const model: ClipperExportDocumentsParams = { ids: documentIds ?? [], query: null, format: format };\r\n if (!model.ids || model.ids.length === 0) {\r\n model.query = searchParams;\r\n }\r\n this.dialogService.busy('Salvataggio in corso...');\r\n this.clipperService.export(model)\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (r.type === 'application/json') {\r\n r.text().then(json => this.dialogService.error(JSON.parse(json).message));\r\n } else {\r\n if (format === 1) {\r\n saveAs(r, 'elenco_' + SystemUtils.formatDate(new Date(), 'yyyyMMddhhmmss') + '.csv');\r\n } else {\r\n saveAs(r, 'scadenze_' + SystemUtils.formatDate(new Date(), 'yyyyMMddhhmmss') + '.ics');\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Exports a single document's deadline as an ICS file.\r\n * @param item - The document whose deadline to export.\r\n */\r\n exportDeadline(item: ClipperDocumentInfo): void {\r\n this.exportItems([item.documentId], undefined, 2);\r\n }\r\n\r\n /**\r\n * Sends a broadcast message to add the given documents to the archive.\r\n * @param items - The list of documents to archive.\r\n */\r\n addToArchive(items: ClipperDocumentInfo[]): void {\r\n this.broadcastService.sendMessage(ClipperMessages.COMMAND_ARCHIVE_ADD, items);\r\n }\r\n\r\n /**\r\n * Sends a broadcast message to create a new calendar deadline from the given document.\r\n * @param item - The document to add to the calendar.\r\n */\r\n addToCalendar(item: ClipperDocumentInfo): void {\r\n this.broadcastService.sendMessage(ClipperMessages.COMMAND_CALENDAR_ADD, item);\r\n }\r\n\r\n /**\r\n * Sends a broadcast message to add the given documents to the working-documents set.\r\n * @param items - The list of documents to add.\r\n */\r\n addItemsToWorkingDocuments(items: ClipperDocumentInfo[]): void {\r\n this.broadcastService.sendMessage(ClipperMessages.COMMAND_WORKING_ADD, items);\r\n }\r\n\r\n /**\r\n * Sends a request to the Clipper service to add the given documents to the bag.\r\n * @param items - The list of documents to add.\r\n */\r\n addItemsToBag(items: ClipperDocumentInfo[]): void {\r\n if (!this.clipperService.loggedIn()) return;\r\n this.clipperService.addToBag(items?.map(n => n.documentId ?? n.id) ?? []);\r\n }\r\n\r\n /**\r\n * Sends a broadcast message to add custom notes to the given document.\r\n * @param item - The document to add notes to.\r\n */\r\n addItemNotes(item: ClipperDocumentInfo): void {\r\n this.broadcastService.sendMessage(ClipperMessages.COMMAND_NOTES_ADD, item);\r\n }\r\n\r\n\r\n /**\r\n * Copies the document's metadata (ID, titles, number, date, origin) as a tab-separated string to the clipboard.\r\n * @param item - The document whose metadata to copy.\r\n */\r\n copyMetadataToClipboard(item: ClipperDocumentInfo): void {\r\n if (!item || item.model === ClipperModel.Coordinamento) return;\r\n let meta =\r\n (item.id ?? item.documentId) + '\\t' +\r\n (item.title1?.replaceAll(\"\\r\\n\", \" \") ?? '') + '\\t';\r\n if (item.title2)\r\n meta += item.title2.replaceAll(\"\\r\\n\", \" \");\r\n meta += '\\t';\r\n if (item.number)\r\n meta += item.number;\r\n meta += '\\t';\r\n if (item.publishingDate) {\r\n meta += SystemUtils.formatDate(new Date(item.publishingDate));\r\n } else if (item.date) {\r\n meta += SystemUtils.formatDate(new Date(item.date));\r\n }\r\n meta += '\\t';\r\n if (item.originDescription)\r\n meta += item.originDescription;\r\n this.clipboard.copy(meta);\r\n this.dialogService.toast(\"Metadati copiati negli appunti.\");\r\n }\r\n\r\n /**\r\n * Displays a dialog with a shareable permalink for the given document.\r\n * @param item - The document to show the permalink for.\r\n */\r\n showLink(item: ClipperDocumentInfo): void {\r\n if (!item) return;\r\n const id = item.id ?? item.documentId;\r\n if (!id) return;\r\n const channels = item.channelName\r\n ? 'Canali: ' + item.channelName + '<br>'\r\n : '';\r\n const origin = item.origin\r\n ? `Origine: ${item.origin} - ${item.originDescription ?? ''}<br>`\r\n : '';\r\n const topics = item.topics\r\n ? 'Argomenti: ' + item.topics.replaceAll('o', '.') + '<br>'\r\n : '';\r\n const taxonomy = item.taxonomyPath\r\n ? 'Tassonomia:<br> - ' + item.taxonomyPath.replaceAll('\\r\\n', '<br> - ') + '<br>'\r\n : '';\r\n const message =\r\n \"<p >Il link che trovi qui sotto è un riferimento diretto al documento selezionato.</p>\" +\r\n \"<p >Lo puoi utilizzare nella tua documentazione o inviarlo per email ad un tuo collega. La persona che desidererà visualizzare il documento dovrà necessariamente essere un utente abbonato.</p>\" +\r\n \"<p >Seleziona e copia (fai CTRL+C) il link qui sotto.</p>\" +\r\n \"<div class='small accent'>\" +\r\n 'https://clipper.arsedizioni.it/?id=' +\r\n id +\r\n '</div>' +\r\n '<br>' +\r\n '<hr>' +\r\n '<p class=\"small\">' +\r\n channels +\r\n origin +\r\n topics +\r\n taxonomy +\r\n '</p>';\r\n\r\n this.dialogService.info(message, 'Copia link', 'Chiudi');\r\n }\r\n\r\n /**\r\n * Opens a dialog to send document links by email to one or more recipients.\r\n * @param items - The list of documents to send.\r\n */\r\n sendItemsTo(items: ClipperDocumentInfo[]): void {\r\n if (!this.clipperService.loggedIn()) return;\r\n if (!items || items.length === 0) return;\r\n const d = this.dialogService.open(SendToDialogComponent, {\r\n ariaLabel: 'invia documenti per email',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: false,\r\n closeOnNavigation: false,\r\n data: {\r\n info:'Puoi inviare i documenti a chi vuoi ma, per poterli visualizzare, è necessario essere un utente abbonato.',\r\n count: items.length,\r\n canPopulate: this.canPopulateContacts(),\r\n },\r\n minWidth: '375px',\r\n maxWidth: '600px',\r\n width: '100%',\r\n });\r\n d.componentInstance.done\r\n .subscribe(data => {\r\n const params: ClipperSendDocumentsByEmailParams = {\r\n recipients: data.recipients,\r\n subject: data.subject,\r\n text: data.text,\r\n ids: items?.map(n => n.documentId ?? n.id) ?? []\r\n } as ClipperSendDocumentsByEmailParams;\r\n this.dialogService.busy('Invio in corso...');\r\n this.clipperService.sendTo(params)\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n this.dialogService.toast('Invio completato con successo.');\r\n d.close();\r\n }\r\n });\r\n });\r\n d.componentInstance.populate\r\n .subscribe(data => {\r\n this.populateContacts.emit(data);\r\n });\r\n }\r\n\r\n /**\r\n * Downloads the document's HTML report.\r\n * @param documentId - The ID of the document.\r\n * @param title - Optional display title used as the file name.\r\n */\r\n openReport(documentId: string, title?: string): void {\r\n if (!this.clipperService.loggedIn()) return;\r\n if (!documentId) return;\r\n this.clipperService.report(documentId)\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n saveAs(r, (title ? title : documentId) + '.html');\r\n });\r\n }\r\n\r\n /**\r\n * Opens a document for display. Override in subclasses to provide the actual implementation.\r\n * @param _documentId - The document ID.\r\n * @param _query - The search query string.\r\n * @param _queryChunks - Pipe-separated highlight chunks (e.g. \"|1|2|3...\").\r\n * @param _newWindow - When true, opens the document in a new browser window.\r\n */\r\n open(\r\n _documentId?: string,\r\n _query?: string,\r\n _queryChunks?: string,\r\n _newWindow?: boolean): void {\r\n }\r\n\r\n /**\r\n * Downloads the HTML report for a normativa/scadenze document.\r\n * @param item - The document to report on.\r\n */\r\n report(item: ClipperDocumentInfo): void {\r\n if (!item) return;\r\n if (item.model !== ClipperModel.NormativaVigente && item.model !== ClipperModel.Scadenze) {\r\n this.dialogService.info(\"Questa funzionalità non è disponibile per questo tipo di documento.\");\r\n return;\r\n } else {\r\n this.openReport(item.documentId, item.title1);\r\n }\r\n }\r\n\r\n /**\r\n * Opens the references dialog for the given document.\r\n * @param documentId - The ID of the document whose references to display.\r\n * @param mode - The reference mode (e.g. ReferencesIn, ReferencesOut).\r\n */\r\n openReferences(documentId?: string, mode: ClipperQueryReferencesMode = ClipperQueryReferencesMode.ReferencesIn): void {\r\n if (!documentId) return;\r\n import('../references/references.component').then(({ ClipperReferencesComponent }) => {\r\n const d = this.dialogService.open(ClipperReferencesComponent, {\r\n ariaLabel: 'riferimenti legati al documento',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: false,\r\n closeOnNavigation: false,\r\n data: { \r\n documentId: documentId, \r\n mode: mode, \r\n canUseArchive: this.canUseArchive(),\r\n canHandleTooManyResults: this.canHandleTooManyResults() \r\n },\r\n minWidth: '375px',\r\n maxWidth: '1200px',\r\n width: '100%',\r\n height: '100%',\r\n });\r\n d.afterClosed()\r\n .subscribe((r: { documentId: string }) => {\r\n if (r && r.documentId) this.open(r.documentId);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Opens a dialog to manage the documents in the working bag (view, select, delete).\r\n */\r\n openBag(): void {\r\n const items: SelectableItem[] = [];\r\n this.clipperService.bag().forEach(n => {\r\n const title = n.title1 ?? n.title2 ?? '';\r\n items.push({\r\n template: title,\r\n bag: n,\r\n searchBag: { name: title },\r\n });\r\n });\r\n const d = this.dialogService.select({\r\n title: 'Gestisci documenti di lavoro',\r\n multipleSelection: false,\r\n mustSelect: false,\r\n okCaption: 'SELEZIONA',\r\n items: items,\r\n canDelete: true,\r\n canView: true,\r\n });\r\n d.componentInstance.view\r\n .subscribe((r: SelectableItem) => {\r\n let item = r.bag;\r\n this.open(item.documentId);\r\n });\r\n d.componentInstance.delete\r\n .subscribe((r: SelectDialogDelete) => {\r\n const item = r.selectedItems[0].bag;\r\n this.clipperService.removeFromBag(item.documentId).add(\r\n () => {\r\n this.dialogService.toast('Operazione completata con successo.');\r\n for (let p = 0; p < r.items.length; p++) {\r\n if (r.items[p].bag.DocumentId === item.DocumentId) {\r\n r.items.splice(p, 1);\r\n if (r.items.length === 0) d.close();\r\n return;\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Sends a print command to the Clipper document iframe.\r\n */\r\n print(): void {\r\n const f = document.getElementById('clipper-document-iframe') as any;\r\n f?.contentWindow.postMessage('{\"type\": \"print\"}', '*');\r\n }\r\n\r\n /**\r\n * Displays a hint dialog explaining how to use the browser's find-in-page feature.\r\n */\r\n find(): void {\r\n this.dialogService.info('Per cercare nel documento premi CTRL + F.');\r\n }\r\n\r\n\r\n ////\r\n // AI Assistant\r\n ////\r\n /**\r\n * AI: sends a \"concern me\" request for the given document.\r\n * @param document - The document to analyse.\r\n */\r\n AI_concernMe(document?: ClipperDocumentInfo): void {\r\n if (!document) return;\r\n this.broadcastService.sendMessage(ClipperMessages.AI_CONCERN_ME, document);\r\n }\r\n\r\n /**\r\n * AI: sends an \"explain\" request for the given document.\r\n * @param document - The document to explain.\r\n */\r\n AI_explain(document?: ClipperDocumentInfo): void {\r\n if (!document) return;\r\n this.broadcastService.sendMessage(ClipperMessages.AI_EXPLAIN, document);\r\n }\r\n\r\n\r\n /**\r\n * AI: sends a \"comment\" request for the given document.\r\n * @param document - The document to comment on.\r\n */\r\n AI_comment(document?: ClipperDocumentInfo): void {\r\n if (!document) return;\r\n this.broadcastService.sendMessage(ClipperMessages.AI_COMMENT, document);\r\n }\r\n\r\n /**\r\n * AI: sends a \"news\" request for the given document.\r\n * @param document - The document to retrieve news for.\r\n */\r\n AI_news(document?: ClipperDocumentInfo): void {\r\n if (!document) return;\r\n this.broadcastService.sendMessage(ClipperMessages.AI_NEWS, document);\r\n }\r\n\r\n ////\r\n // Registro e scadenzario\r\n ////\r\n\r\n /**\r\n * Returns whether the given Clipper module is supported by Registro e Scadenzario (RS).\r\n * @param module - The module to check.\r\n * @returns `true` if the module is supported by RS.\r\n */\r\n isModuleSupportedByRS(module: ClipperModule): boolean {\r\n return module === ClipperModule.GazzetteBollettiniEFontiDiverse ||\r\n module === ClipperModule.NormativaVigente ||\r\n module === ClipperModule.ScadenzeESegnalazioni;\r\n }\r\n\r\n /**\r\n * Returns whether the given Clipper model is supported by Registro e Scadenzario (RS).\r\n * @param model - The model to check.\r\n * @returns `true` if the model is supported by RS.\r\n */\r\n isModelSupportedByRS(model: ClipperModel): boolean {\r\n return model === ClipperModel.AggiornamentoNormativo ||\r\n model === ClipperModel.NormativaVigente ||\r\n model === ClipperModel.Scadenze;\r\n\r\n }\r\n\r\n /**\r\n * Returns whether every document in the list has a model supported by RS.\r\n * @param documents - The list of documents to check.\r\n * @returns `true` if all documents are RS-compatible.\r\n */\r\n canSupportRS(documents: ClipperDocumentInfo[]): boolean {\r\n return documents.every(n => this.isModelSupportedByRS(n.model));\r\n }\r\n\r\n /**\r\n * Returns whether every document in the list has a model that supports RS tracking.\r\n * @param documents - The documents to check.\r\n * @returns `true` if all documents are RS-enabled.\r\n */\r\n RS_enabled(documents: ClipperDocumentInfo[]): boolean {\r\n if (!documents || documents.length === 0) return false;\r\n return documents.every(n =>\r\n n.model === ClipperModel.NormativaVigente ||\r\n n.model === ClipperModel.AggiornamentoNormativo ||\r\n n.model === ClipperModel.GiurisprudenzaRecente ||\r\n n.model === ClipperModel.Scadenze\r\n );\r\n }\r\n\r\n /**\r\n * Sends a broadcast message to create a new RS law entry linked to the given documents.\r\n * @param documents - The array of documents to link to the new law.\r\n */\r\n RS_newLaw(documents?: ClipperDocumentInfo[]): void {\r\n if (!this.clipperService.supportsRS() || !documents) return;\r\n this.broadcastService.sendMessage(ClipperMessages.INTEROP_RS_NEW_LAW, documents);\r\n }\r\n\r\n /**\r\n * Sends a broadcast message to create a new RS activity linked to the given document.\r\n * @param document - The document to link to the new activity.\r\n */\r\n RS_newActivity(document?: ClipperDocumentInfo): void {\r\n if (!this.clipperService.supportsRS() || !document) return;\r\n this.broadcastService.sendMessage(ClipperMessages.INTEROP_RS_NEW_ACTIVITY, document);\r\n }\r\n\r\n /**\r\n * Sends a broadcast message to open the RS usage report for the given document.\r\n * @param document - The document to generate the usage report for.\r\n */\r\n RS_usageReport(document?: ClipperDocumentInfo): void {\r\n if (!this.clipperService.supportsRS() || !document) return;\r\n this.broadcastService.sendMessage(ClipperMessages.INTEROP_RS_USAGE_REPORT, document);\r\n }\r\n\r\n\r\n}\r\n","import { DialogService } from '@arsedizioni/ars-utils/ui';\r\nimport {\r\n ClipperModule,\r\n ClipperSelectionMode,\r\n ClipperService\r\n} from '@arsedizioni/ars-utils/clipper.common';\r\nimport { ThemeType } from '@arsedizioni/ars-utils/core';\r\nimport { inject, Injector, runInInjectionContext } from '@angular/core';\r\n\r\nexport class ClipperDocumentsUtils {\r\n /**\r\n * Opens the Clipper document viewer dialog for the given document.\r\n * @param injector - The Angular injector used to resolve `DialogService` and `ClipperService`.\r\n * @param documentId - The ID of the document to open.\r\n * @param query - The search query string used for term highlighting.\r\n * @param queryChunks - Pipe-separated highlight chunks (e.g. \"|1|2|3...\").\r\n * @param selectionMode - The Clipper selection mode to activate inside the viewer.\r\n * @param selectableModules - The list of Clipper modules available for selection.\r\n * @param theme - The UI theme to apply. Defaults to the system theme.\r\n * @param canUseArchive - When `true`, archive access is enabled inside the viewer.\r\n * @param canUseNotes - When `true`, notes access is enabled inside the viewer.\r\n * @param canHandleTooManyResults - When `true`, the component handles oversized result sets.\r\n * @param replaceUrl - When provided, after the dialog closes the method calls `window.close()`\r\n * if the page was opened by another window, or navigates to this URL otherwise.\r\n */\r\n static openDocument(\r\n injector: Injector,\r\n documentId: string,\r\n query?: string,\r\n queryChunks?: string,\r\n selectionMode?: ClipperSelectionMode,\r\n selectableModules?: ClipperModule[],\r\n theme?: ThemeType,\r\n canUseArchive?: boolean,\r\n canUseNotes?: boolean,\r\n canHandleTooManyResults?: boolean,\r\n replaceUrl?: string): void {\r\n runInInjectionContext(injector, () => {\r\n const dialogService = inject(DialogService);\r\n const clipperService = inject(ClipperService);\r\n if (!clipperService.loggedIn()) {\r\n dialogService.error(\"Clipper non è disponibile in questo momento. Verifica la connessione.\");\r\n return;\r\n }\r\n if (!documentId) {\r\n dialogService.error(\"Documento non valido.\");\r\n return;\r\n }\r\n import('./ui/document/document.component').then(({ ClipperDocumentComponent }) => {\r\n const ref = dialogService.open(ClipperDocumentComponent, {\r\n ariaLabel: 'documento',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: false,\r\n data: {\r\n id: documentId,\r\n query: query,\r\n queryChunks: queryChunks,\r\n selectionMode: selectionMode,\r\n selectableModules: selectableModules,\r\n theme: theme,\r\n canUseArchive: canUseArchive,\r\n canUseNotes: canUseNotes,\r\n canHandleTooManyResults: canHandleTooManyResults\r\n },\r\n minWidth: '375px',\r\n maxWidth: '1400px',\r\n width: '100%',\r\n height: '100%'\r\n });\r\n if (replaceUrl && ref) {\r\n ref.beforeClosed().subscribe(() => {\r\n setTimeout(() => {\r\n if (window.opener !== null) {\r\n window.close();\r\n } else {\r\n window.location.replace(replaceUrl);\r\n }\r\n }, 500);\r\n });\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Extracts the display title from a full document title by stripping any trailing `[...]` suffix.\r\n * @param title - The full document title, which may contain a bracketed qualifier.\r\n * @returns The portion of the title before the first `[`, or the original title when no `[` is present.\r\n */\r\n static parseDocumentTitle(title: string): string {\r\n if (!title) return title;\r\n const p = title.indexOf('[');\r\n return p !== -1 ? title.substring(0, p) : title;\r\n }\r\n\r\n}","import { BreakpointObserver } from '@angular/cdk/layout';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component, DestroyRef, Injector, computed, inject, signal,\r\n viewChild\r\n} from '@angular/core';\r\nimport { MatPaginator } from '@angular/material/paginator';\r\nimport { ClipperDocumentInfo, ClipperMessages, ClipperModel, ClipperQueryDocumentFlags, ClipperSearchParams, ClipperSearchResult, ClipperSearchUtils, ClipperSelectionMode, ClipperSort, ClipperUtils } from '@arsedizioni/ars-utils/clipper.common';\r\nimport {\r\n DateFormat,\r\n NameValueItem, ScreenService, SelectableModel, SystemUtils,\r\n ThemeService\r\n} from '@arsedizioni/ars-utils/core';\r\nimport { startOfDay, startOfToday, subDays } from 'date-fns';\r\nimport { ClipperSearchFacetsComponent } from '../search-facets/search-facets.component';\r\nimport { ClipperDocumentManager } from '../document-manager/document-manager';\r\nimport { ClipperSearchCalendarComponent } from '../search-calendar/search-calendar.component';\r\nimport { ClipperDocumentsUtils } from '../../documents';\r\n\r\n\r\n\r\n\r\n@Component({\r\n template: '<div></div>',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ClipperSearchResultManager extends ClipperDocumentManager {\r\n readonly paginator = viewChild<MatPaginator>('paginator');\r\n readonly facets = viewChild<ClipperSearchFacetsComponent>('facets');\r\n readonly calendar = viewChild<ClipperSearchCalendarComponent>('calendar');\r\n protected readonly destroyRef = inject(DestroyRef);\r\n protected readonly changeDetector = inject(ChangeDetectorRef);\r\n protected readonly breakpointObserver = inject(BreakpointObserver);\r\n protected readonly injector = inject(Injector);\r\n protected readonly themeService = inject(ThemeService);\r\n public readonly screenService = inject(ScreenService);\r\n public selection: SelectableModel<ClipperDocumentInfo, string> | undefined;\r\n public readonly selectionMode = signal<ClipperSelectionMode>(ClipperSelectionMode.None);\r\n protected snapshot: ClipperSearchResult | undefined = new ClipperSearchResult();\r\n protected readonly filterBusy = signal<boolean>(false);\r\n protected filterParams: ClipperSearchParams = new ClipperSearchParams();\r\n protected readonly filterPaneHasBackdrop = signal<boolean>(false);\r\n protected readonly filterPaneClosed = signal<boolean>(false);\r\n protected readonly filterPane2HasBackdrop = signal<boolean>(false);\r\n protected readonly filterPane2Closed = signal<boolean>(false);\r\n protected readonly sortOptions = signal<NameValueItem<ClipperSort>[]>([]);\r\n protected readonly sortMode = signal<NameValueItem<ClipperSort> | undefined>(undefined);\r\n protected scrollPos: number = 0;\r\n protected readonly scrollerId: string = 'scroller_' + SystemUtils.generateUUID();\r\n protected restorableId: string | undefined;\r\n protected readonly hasFacets = signal<boolean>(false);\r\n /** `true` when the current sector filter contains any regional-law (LR) entries. */\r\n protected readonly hasRegions = computed(() =>\r\n (this.filterParams.sectors?.filter(n => n.value === 'LR').length ?? 0) > 0\r\n );\r\n\r\n\r\n\r\n /**\r\n * Resets the `isMenuOpen` flag on every snapshot item so that action-menu buttons are hidden.\r\n */\r\n updateMenuButtonsVisibility(): void {\r\n if (this.snapshot) {\r\n this.snapshot.items?.forEach(n => {\r\n n.isMenuOpen = false;\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Scrolls the results list container to the given vertical position.\r\n * @param top - The target scroll offset in pixels. Defaults to 0 (top).\r\n */\r\n scroll(top: number = 0): void {\r\n const elem = document.getElementById(this.scrollerId);\r\n if (elem) {\r\n elem.scrollTo({ top: top, left: 0, behavior: 'auto' });\r\n }\r\n }\r\n\r\n /**\r\n * Returns whether every item in the current snapshot is selected.\r\n * @returns `true` if the selection count equals the total snapshot item count.\r\n */\r\n allSelected(): boolean {\r\n return this.selection?.current?.selected?.length === this.snapshot?.items?.length;\r\n }\r\n\r\n /**\r\n * Selects or deselects all items in the current snapshot.\r\n * @param select - When `true`, selects all items; when `false`, deselects all.\r\n */\r\n selectAll(select: boolean = true): void {\r\n if (select) {\r\n this.snapshot?.items?.forEach(n => this.selection?.select(n, n.documentId));\r\n } else {\r\n this.snapshot?.items?.forEach(n => this.selection?.deselect(n, n.documentId));\r\n }\r\n }\r\n\r\n /**\r\n * Returns whether at least one item is currently selected.\r\n * @returns `true` if the selection contains one or more items.\r\n */\r\n hasAnySelection(): boolean {\r\n return (this.selection?.all?.length ?? 0) > 0;\r\n }\r\n\r\n /**\r\n * Returns whether exactly one item is selected.\r\n * @returns `true` if the selection count is exactly 1.\r\n */\r\n hasSingleSelection(): boolean {\r\n return (this.selection?.all?.length ?? 0) === 1;\r\n }\r\n\r\n /**\r\n * Returns the first (and only) selected item, or `undefined` when nothing or multiple items are selected.\r\n * @returns The selected document, or `undefined`.\r\n */\r\n getSingleSelection(): ClipperDocumentInfo | undefined {\r\n return this.hasAnySelection() ? this.selection?.all[0] : undefined;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Clears the entire selection.\r\n */\r\n clearSelection(): void {\r\n this.selection?.clear();\r\n }\r\n\r\n /**\r\n * Returns the number of currently selected items, or `undefined` when nothing is selected.\r\n * @returns The selection count, or `undefined`.\r\n */\r\n countSelections(): number | undefined {\r\n return (this.selection && this.selection?.all?.length > 0) ? this.selection?.all?.length : undefined;\r\n }\r\n\r\n /**\r\n * Returns the document ID of the first selected item, or `undefined` when nothing is selected.\r\n * @returns The selected document ID, or `undefined`.\r\n */\r\n getSeletectId(): string | undefined {\r\n if (this.hasAnySelection()) {\r\n return this.selection?.all[0].documentId;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Returns the document IDs of all selected items.\r\n * Shows an error and returns `undefined` when more than 100 items are selected.\r\n * @returns An array of document IDs, or `undefined` when the limit is exceeded.\r\n */\r\n getSeletectIds(): string[] | undefined {\r\n if ((this.selection?.all?.length ?? 0) > 100) {\r\n this.dialogService.error('La selezione non può contenere più di 100 elementi.');\r\n return undefined;\r\n }\r\n const ids: string[] = [];\r\n if (this.hasAnySelection()) {\r\n this.selection?.all?.forEach(n => {\r\n if (n.documentId) {\r\n ids.push(n.documentId);\r\n }\r\n });\r\n }\r\n return ids;\r\n }\r\n\r\n /**\r\n * Returns a list of `[documentId, document]` tuples for all selected items.\r\n * Shows an error and returns `undefined` when more than 100 items are selected.\r\n * @returns An array of ID-document tuples, or `undefined` when the limit is exceeded.\r\n */\r\n getSeletectIdsAndData(): [string, ClipperDocumentInfo][] | undefined {\r\n if ((this.selection?.all?.length ?? 0) > 100) {\r\n this.dialogService.error('La selezione non può contenere più di 100 elementi.');\r\n return undefined;\r\n }\r\n const data: [string, ClipperDocumentInfo][] = [];\r\n if (this.hasAnySelection()) {\r\n this.selection?.all?.forEach(n => {\r\n if (n.documentId) {\r\n data.push([n.documentId, n]);\r\n }\r\n });\r\n }\r\n return data;\r\n }\r\n\r\n\r\n /**\r\n * Enriches raw search result items with display metadata: grouping labels, expiry/validity\r\n * state, anchor relevance scores, and model-specific fields.\r\n * @param items - The raw document list to process in place.\r\n * @param params - The search parameters used to determine grouping and filtering.\r\n */\r\n prepareResultItems(items: ClipperDocumentInfo[], params: ClipperSearchParams): void {\r\n const today = startOfToday();\r\n const groupByYear =\r\n !params.sortMode ||\r\n params.sortMode === ClipperSort.DateAsc ||\r\n params.sortMode === ClipperSort.DateDesc ||\r\n params.sortMode === ClipperSort.SourceDateAsc ||\r\n params.sortMode === ClipperSort.SourceDateDesc;\r\n const groupByRelevance = params.sortMode === ClipperSort.Relevance;\r\n const groupByPopularity = params.sortMode === ClipperSort.Popularity;\r\n let group = '';\r\n items?.forEach(n => {\r\n n.documentId = n.documentId ?? n.id;\r\n if (n.documentId) {\r\n this.selection?.updateCurrent(n, n.documentId);\r\n }\r\n if (n.model === ClipperModel.Quesiti) {\r\n n.info = \"Quesito n° \" + n.number + \" del \" + SystemUtils.formatDate(n.date, \"d MMM yyyy\");\r\n } else if (n.model === ClipperModel.Scadenze ||\r\n n.model === ClipperModel.Segnalazioni) {\r\n switch (n.model) {\r\n case ClipperModel.Scadenze:\r\n n.originDescription = 'Scadenza';\r\n break;\r\n case ClipperModel.Segnalazioni:\r\n n.originDescription = 'Segnalazione';\r\n break;\r\n }\r\n if (n.expiringInfo) {\r\n const parts = n.expiringInfo.split('|');\r\n if (parts.length === 3) {\r\n n.expiringDescription = parts[2];\r\n }\r\n }\r\n if (n.expiringDate) {\r\n n.date = startOfDay(new Date(n.expiringDate));\r\n const d = startOfDay(subDays(n.date, 15));\r\n n.isExpiring = today <= n.date && today >= d;\r\n n.isExpired = n.date < today;\r\n\r\n }\r\n } else {\r\n if ((n.model === ClipperModel.Articoli ||\r\n n.model === ClipperModel.News) &&\r\n n.tags) {\r\n n.info = n.tags.toUpperCase();\r\n }\r\n if (n.model !== ClipperModel.AggiornamentoNormativo &&\r\n n.model !== ClipperModel.NormativaVigente &&\r\n n.model !== ClipperModel.GiurisprudenzaRecente &&\r\n n.model !== ClipperModel.Juris &&\r\n n.date) {\r\n n.date = startOfDay(new Date(n.date ?? n.publishingDate));\r\n const d = startOfDay(subDays(startOfToday(), 7))\r\n n.isNew = n.date > d;\r\n }\r\n if (n.anchors) {\r\n let anchorType: number | undefined;\r\n const anchors: any[] = [];\r\n let minScore = 10;\r\n let maxScore = 0;\r\n n.anchors.forEach(a => {\r\n if ((a.score ?? 0) < minScore) {\r\n minScore = a.score ?? 0;\r\n }\r\n if ((a.score ?? 0) > maxScore) {\r\n maxScore = a.score ?? 0;\r\n }\r\n });\r\n maxScore = maxScore - minScore;\r\n n.anchors.forEach(a => {\r\n if (a.type === 20) return;\r\n if (a.type !== anchorType) {\r\n if ((a.type ?? 0) >= 3)\r\n anchors.push({ text: a.typeDescription });\r\n anchorType = a.type;\r\n }\r\n const score = maxScore > 0 ? ((a.score ?? 0) - minScore) / maxScore : 0;\r\n anchors.push({\r\n text: a.text,\r\n title: a.title,\r\n documentId: a.documentId,\r\n uri: a.uri,\r\n veryRelevant: score > 0.7,\r\n score: score,\r\n chunk: a.chunk\r\n });\r\n });\r\n n.anchors = anchors;\r\n }\r\n if ((n.validityState ?? 0) > 0) {\r\n n.validityDescription = 'Non è più vigente';\r\n n.isExpired = true;\r\n if (n.validUntilDate) {\r\n const expiringDate = startOfDay(new Date(n.validUntilDate));\r\n if (expiringDate < today) {\r\n n.validityDescription =\r\n 'Non più vigente dal ' +\r\n SystemUtils.formatDate(expiringDate) +\r\n '.';\r\n } else {\r\n n.validityDescription =\r\n 'Non sarà più vigente dal ' +\r\n SystemUtils.formatDate(expiringDate) +\r\n '.';\r\n n.isExpired = false;\r\n }\r\n }\r\n }\r\n if (n.expiringDate) {\r\n n.date = startOfDay(new Date(n.expiringDate));\r\n const d = startOfDay(subDays(n.date, 15));\r\n n.isExpiring = today <= n.date && today >= d;\r\n n.isExpired = n.date < today;\r\n }\r\n }\r\n if (groupByYear) {\r\n const d = (this.filterParams.models?.length ?? 0) > 1\r\n ? n.publishingDate\r\n : n.date;\r\n const year = SystemUtils.formatDate(d, DateFormat.LongMonthAndYear)?.toLowerCase();\r\n if (group !== year) {\r\n n.group = year;\r\n group = year;\r\n }\r\n } else if (groupByRelevance) {\r\n if (group !== 'none') {\r\n n.group =\r\n 'Elementi più rilevanti per la ricerca: ' + params.text;\r\n group = 'none';\r\n }\r\n } else if (groupByPopularity) {\r\n if (group !== 'none') {\r\n n.group = 'Elementi più popolari in ordine decrescente';\r\n group = 'none';\r\n }\r\n }\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Applies a new search result snapshot: clears the current selection, optionally preserves\r\n * facet state for incremental updates, and triggers change detection.\r\n * @param data - The incoming search result.\r\n * @param newSearch - When `true`, facet state is reset along with the results.\r\n */\r\n prepareResults(data: ClipperSearchResult, newSearch: boolean = false): void {\r\n const currentTotal = this.snapshot?.total ?? 0;\r\n this.selection?.current.clear();\r\n if (!newSearch) {\r\n data.facets = this.snapshot?.facets;\r\n }\r\n this.snapshot = data;\r\n if (this.snapshot.total === -1) {\r\n this.snapshot.total = currentTotal;\r\n }\r\n if (this.snapshot.items) {\r\n this.prepareResultItems(this.snapshot.items, this.filterParams);\r\n }\r\n this.changeDetector.markForCheck();\r\n }\r\n\r\n\r\n /**\r\n * Exports either the selected documents or the full result set in the given format.\r\n * @param format - The export format: 1 = list (CSV), 2 = deadlines (ICS).\r\n */\r\n exportResults(format: number = 1): void {\r\n if ((this.snapshot?.total ?? 0) > 0 || this.hasAnySelection()) {\r\n this.exportItems(this.getSeletectIds(), this.filterParams, format);\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Returns the CSS class that reflects the item's read/expiry state.\r\n * @param item - The document to evaluate.\r\n * @returns A CSS class name string, or `undefined` when no special state applies.\r\n */\r\n getItemStateCssClass(item: ClipperDocumentInfo): string | undefined {\r\n if (item.isRead !== true && item.model && ClipperUtils.isClipperModelReadable(item.model)) return 'unread-bg';\r\n else if (item.isExpired) return 'expired-bg';\r\n //else if (item.popularity === 3) return 'popular-bg';\r\n //else if (item.popularity > 3) return 'very-popular-bg';\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Returns the tooltip text that explains the item's current read/expiry state.\r\n * @param item - The document to evaluate.\r\n * @returns A human-readable state description, or an empty string when no special state applies.\r\n */\r\n getItemStateTooltip(item: ClipperDocumentInfo): string {\r\n if (item.isRead !== true && item.model && ClipperUtils.isClipperModelReadable(item.model)) return 'Non letto';\r\n else if (item.isExpired) return 'Non più vigente';\r\n //else if (item.popularity === 3) return 'Documento con numero di citazioni alto';\r\n //else if (item.popularity > 3) return 'Documento con numero di citazioni molto alto';\r\n return '';\r\n }\r\n\r\n /**\r\n * Returns the Material icon name that represents the given document's model.\r\n * @param item - The document whose icon to determine.\r\n * @returns A Material icon name string.\r\n */\r\n getItemIcon(item: ClipperDocumentInfo): string {\r\n switch (item.model) {\r\n case ClipperModel.NormativaVigente: return 'gavel';\r\n case ClipperModel.Articoli:\r\n case ClipperModel.Quesiti:\r\n case ClipperModel.MetodiDiAnalisi: return 'extension';\r\n default: return 'updated';\r\n }\r\n }\r\n\r\n /**\r\n * Toggles the read flag of the given item and stops event propagation.\r\n * @param item - The document whose read state to toggle.\r\n * @param e - Optional DOM event; when provided, default action and propagation are suppressed.\r\n */\r\n toggleRead(item: ClipperDocumentInfo, e?: Event): void {\r\n e?.preventDefault();\r\n e?.stopPropagation();\r\n this.setRead(!item?.isRead, item);\r\n\r\n }\r\n\r\n /**\r\n * Toggles the selection state of the given item and stops event propagation.\r\n * @param item - The document to select or deselect.\r\n * @param e - Optional DOM event; when provided, default action and propagation are suppressed.\r\n */\r\n toggleSelection(item: ClipperDocumentInfo, e?: Event): void {\r\n e?.preventDefault();\r\n e?.stopPropagation();\r\n this.selection?.toggle(item, item.documentId)\r\n\r\n\r\n }\r\n\r\n\r\n /**\r\n * Sets the read state on the given item or on all currently selected items.\r\n * Broadcasts a read-state-changed event and updates the unread counter.\r\n * @param value - The new read flag value.\r\n * @param item - When provided, only this item is updated; otherwise the full selection is used.\r\n */\r\n setRead(value: boolean, item?: ClipperDocumentInfo): void {\r\n let documentIds: string[];\r\n if (item?.documentId) {\r\n documentIds = [item.documentId];\r\n } else if (this.hasAnySelection()) {\r\n documentIds = this.selection?.all?.map(n => n.documentId ?? '') ?? [];\r\n } else {\r\n return;\r\n }\r\n this.clipperService.updateState({ documentIds: documentIds, isRead: value })\r\n .subscribe(r => {\r\n if (!r.success) {\r\n // soft error\r\n this.dialogService.toast(r.message);\r\n } else {\r\n if (item) {\r\n if (item.isRead !== value) {\r\n item.isRead = value;\r\n this.broadcastService.sendMessage(ClipperMessages.DOCUMENT_READ, { document: item, value: value });\r\n const module = ClipperUtils.getClipperModuleFromModel(item);\r\n if (module) {\r\n this.clipperService.updateUnreadItems(\r\n module,\r\n item.model,\r\n value ? -1 : 1);\r\n }\r\n this.changeDetector.markForCheck();\r\n }\r\n } else if (this.hasAnySelection()) {\r\n this.selection?.all?.forEach(n => {\r\n if (n.isRead !== value) {\r\n n.isRead = value;\r\n this.broadcastService.sendMessage(ClipperMessages.DOCUMENT_READ, { document: n, value: value });\r\n const module = ClipperUtils.getClipperModuleFromModel(n);\r\n if (module) {\r\n this.clipperService.updateUnreadItems(\r\n module,\r\n n.model,\r\n value ? -1 : 1);\r\n }\r\n this.changeDetector.markForCheck();\r\n }\r\n })\r\n }\r\n this.broadcastService.sendMessage(ClipperMessages.COMMAND_DASHBOARD_UPDATED);\r\n }\r\n });\r\n }\r\n\r\n \r\n\r\n /**\r\n * Opens a document by ID, either inline or in a new browser tab.\r\n * @param documentId - The ID of the document to open.\r\n * @param query - The current search query used to highlight terms in the viewer.\r\n * @param queryChunks - Pipe-separated highlight chunks (e.g. \"|1|2|3...\").\r\n * @param newWindow - When `true`, opens the document in a new browser tab.\r\n */\r\n override open(documentId?: string, query?: string, queryChunks?: string, newWindow?: boolean): void {\r\n if (!documentId) return;\r\n if (!newWindow) this.openDocument(documentId, query, queryChunks);\r\n else {\r\n window.open((this.clipperService.appUri ?? '') + '/documento/' + documentId, '_blank');\r\n }\r\n }\r\n\r\n /**\r\n * Opens the Clipper document viewer dialog for the given document.\r\n * @param documentId - The ID of the document to open.\r\n * @param query - The normalized search query used for term highlighting.\r\n * @param queryChunks - Pipe-separated highlight chunks (e.g. \"|1|2|3...\").\r\n */\r\n openDocument(documentId?: string, query?: string, queryChunks?: string): void {\r\n if (!documentId) return;\r\n query = ClipperSearchUtils.normalizeTextQuery2(query ?? this.filterParams.text ?? '');\r\n if (((this.filterParams.flags ?? 0) & ClipperQueryDocumentFlags.UseSemanticSearch) > 0) {\r\n query = '$' + query;\r\n }\r\n ClipperDocumentsUtils.openDocument(\r\n this.injector,\r\n documentId,\r\n query,\r\n queryChunks,\r\n this.selectionMode(),\r\n undefined,\r\n this.themeService.getTheme(),\r\n this.canUseArchive(),\r\n this.canUseNotes(),\r\n this.canHandleTooManyResults()\r\n );\r\n\r\n }\r\n\r\n ///\r\n // Restorable\r\n ///\r\n\r\n /**\r\n * Serialises the current component state (paginator, facets, filter params, scroll, sort, data)\r\n * to the given storage under the given key, enabling later restoration.\r\n * @param id - The storage key to write to.\r\n * @param storage - The Web Storage instance to use. Defaults to `sessionStorage`.\r\n */\r\n save(id: string, storage: Storage = sessionStorage): void {\r\n storage.setItem(\r\n id,\r\n JSON.stringify({\r\n paginator: {\r\n index: this.paginator()?.pageIndex ?? 0,\r\n total: this.snapshot?.total ?? 0,\r\n size: this.paginator()?.pageSize ?? this.filterParams?.count ?? 15\r\n },\r\n facets: this.facets()?.save(),\r\n filterParams: this.filterParams,\r\n scroll: this.scrollPos,\r\n sort: { mode: this.sortMode(), options: this.sortOptions() },\r\n data: this.snapshot\r\n ? { items: this.snapshot.items, total: this.snapshot.total }\r\n : null\r\n }));\r\n }\r\n\r\n /**\r\n * Restores a previously serialised component state from storage and re-applies it.\r\n * Facets, paginator, scroll position, and filter parameters are all re-hydrated.\r\n * @param id - The storage key to read from.\r\n * @param storage - The Web Storage instance to use. Defaults to `sessionStorage`.\r\n */\r\n restore(id: string, storage: Storage = sessionStorage): void {\r\n const value = storage.getItem(id);\r\n if (value) {\r\n const data = JSON.parse(value);\r\n if (data) {\r\n this.filterParams = data.filterParams;\r\n const modules = SystemUtils.clone(this.filterParams.modules);\r\n const sectors = SystemUtils.clone(this.filterParams.sectors);\r\n const authors = SystemUtils.clone(this.filterParams.authors);\r\n const tags = SystemUtils.clone(this.filterParams.tags);\r\n const topics = SystemUtils.clone(this.filterParams.topics);\r\n this.filterParams.modules = modules;\r\n this.filterParams.sectors = undefined;\r\n this.filterParams.authors = undefined;\r\n this.filterParams.tags = undefined;\r\n this.filterParams.topics = undefined;\r\n this.snapshot = data.data;\r\n this.sortMode.set(data.sort.mode);\r\n this.sortOptions.set(data.sort.options ?? []);\r\n setTimeout(() => {\r\n this.filterParams.sectors = sectors;\r\n this.filterParams.authors = authors;\r\n this.filterParams.tags = tags;\r\n this.filterParams.topics = topics;\r\n const facets = this.facets();\r\n if (facets && data.facets) {\r\n facets.restore(data.facets);\r\n this.hasFacets.set(data.facets.hasFacets === true);\r\n }\r\n const paginator = this.paginator();\r\n if (paginator && data.paginator) {\r\n paginator.pageIndex = data.paginator.index;\r\n paginator.pageSize = data.paginator.size;\r\n paginator.length = data.paginator.total;\r\n }\r\n this.scroll(data.scroll ?? 0);\r\n this.broadcastService.sendMessage(ClipperMessages.COMMAND_SEARCH_RESTORED, data.filterParams)\r\n this.changeDetector.markForCheck();\r\n }, 750);\r\n\r\n }\r\n }\r\n }\r\n}\r\n","import { inject, Injector, runInInjectionContext } from '@angular/core';\r\nimport { ClipperContactInfo, ClipperService, EditDialogCompleted } from '@arsedizioni/ars-utils/clipper.common';\r\nimport { DialogResult } from '@arsedizioni/ars-utils/ui';\r\nimport { ApplicationDialogService } from '@arsedizioni/ars-utils/ui.application';\r\nimport { finalize, Subscription } from 'rxjs';\r\n\r\nexport class ClipperContactsSelector {\r\n\r\n /**\r\n * Builds an HTML string representing a list of email addresses separated by line breaks.\r\n * @param emails - A semicolon-separated string of email addresses, or undefined.\r\n * @returns An HTML string with each address wrapped in a `<span>` tag.\r\n */\r\n private static buildEmailsHtml(emails: string | undefined): string {\r\n if (!emails) return '';\r\n return emails.split(';').map(n => `<span>${n}</span>`).join('<br>');\r\n }\r\n\r\n /**\r\n * Builds the HTML row template used to display a contact inside the selection dialog.\r\n * @param item - The contact data to render.\r\n * @returns An HTML string representing the contact row.\r\n */\r\n private static buildContactTemplate(item: ClipperContactInfo): string {\r\n const emails = ClipperContactsSelector.buildEmailsHtml(item.emails);\r\n const disabledAttr = item.disabled ? \"class='disabled' title='Disabilitato'\" : '';\r\n const teamHtml = item.teamTitle\r\n ? `<br><span class='x-small uppercase accent'>${item.teamTitle}</span>`\r\n : '';\r\n return `<table class='template-table'><tr ${disabledAttr}>`\r\n + `<td class='col-50 col-maximizable small bold'>${item.name ?? ''}${teamHtml}</td>`\r\n + `<td class='col-50 col-hideable x-small uppercase'>${emails}</td>`\r\n + `</tr></table>`;\r\n }\r\n\r\n /**\r\n * Opens the contacts selection/management dialog and wires up all interaction events.\r\n * @param injector - The Angular injector used to resolve services within the dialog context.\r\n * @param canAppend - When true, the dialog allows adding new contacts.\r\n * @param canEdit - When true, the dialog allows editing and deleting contacts.\r\n * @param onSelect - Optional callback invoked with the selection result when the user confirms.\r\n */\r\n static Show(\r\n injector: Injector,\r\n canAppend?: boolean,\r\n canEdit?: boolean,\r\n onSelect?: (result: unknown) => void,\r\n ): void {\r\n runInInjectionContext(injector, () => {\r\n const dialogService = inject(ApplicationDialogService);\r\n const clipperService = inject(ClipperService);\r\n let lookupSubscription: Subscription | undefined;\r\n const canSelect = onSelect !== undefined;\r\n\r\n const d = dialogService.select({\r\n title: canSelect ? 'Seleziona un contatto' : 'Gestisci contatti',\r\n multipleSelection: true,\r\n mustSelect: canSelect,\r\n header: \"<table class='template-table template-table-header small'><tr><th class='col-50 col-maximizable'>Nome</th><th class='col-50 col-hideable'>Indirizzi email</th></tr></table>\",\r\n okCaption: 'Seleziona',\r\n canAppend,\r\n canEdit,\r\n canDelete: canEdit,\r\n canLookup: true,\r\n });\r\n\r\n d?.afterClosed().subscribe(() => lookupSubscription?.unsubscribe());\r\n\r\n d?.componentInstance.done.subscribe((result: unknown) => onSelect?.(result));\r\n\r\n d?.componentInstance.append.subscribe((result: any) => {\r\n import('../contact-edit/contact-edit.component').then(({ ClipperContactEditComponent }) => {\r\n const d2 = dialogService.open(ClipperContactEditComponent, {\r\n ariaLabel: 'crea contatto',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: true,\r\n data: { currentItem: null },\r\n minWidth: '375px',\r\n maxWidth: '500px',\r\n width: '99%',\r\n });\r\n d2?.componentInstance.done.subscribe((result2: EditDialogCompleted<ClipperContactInfo>) => {\r\n if (result2.isNew) {\r\n const item = result2.data;\r\n result.items.unshift({\r\n template: ClipperContactsSelector.buildContactTemplate(item),\r\n bag: item,\r\n searchBag: { name: item.name ?? '?' },\r\n });\r\n }\r\n result.owner.notifyChanges();\r\n d2?.close();\r\n });\r\n });\r\n });\r\n\r\n d?.componentInstance.edit.subscribe((result: any) => {\r\n import('../contact-edit/contact-edit.component').then(({ ClipperContactEditComponent }) => {\r\n const d2 = dialogService.open(ClipperContactEditComponent, {\r\n ariaLabel: 'modifica contatto',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: true,\r\n data: { currentItem: result.item.bag },\r\n minWidth: '375px',\r\n maxWidth: '500px',\r\n width: '99%',\r\n });\r\n d2?.componentInstance.done.subscribe((result2: EditDialogCompleted<ClipperContactInfo>) => {\r\n const item = result2.data;\r\n const i: number = result.items.indexOf(result.item);\r\n if (i !== -1) {\r\n result.items[i].template = ClipperContactsSelector.buildContactTemplate(item);\r\n result.items[i].bag = item;\r\n result.items[i].searchBag = { name: item.name ?? '' };\r\n }\r\n result.owner?.notifyChanges();\r\n d2?.close();\r\n });\r\n });\r\n });\r\n\r\n d?.componentInstance.delete.subscribe((result: any) => {\r\n if (!(result.selectedItems?.length > 0)) return;\r\n const ids = (result.selectedItems as any[])\r\n .map(n => n.bag?.id as number | undefined)\r\n .filter((id): id is number => id != null);\r\n const message = result.selectedItems.length === 1\r\n ? `Vuoi davvero eliminare il contatto ${result.selectedItems[0].bag.name}?`\r\n : 'Vuoi davvero eliminare i contatti selezionati?';\r\n dialogService.confirm(message)\r\n ?.componentInstance.choosen.subscribe((data: DialogResult) => {\r\n if (data.result !== 'ok') return;\r\n dialogService.busy('Eliminazione in corso...');\r\n clipperService.deleteContacts(ids)\r\n .pipe(finalize(() => dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) {\r\n dialogService.error(r.message);\r\n } else {\r\n for (let i = result.items.length - 1; i >= 0; i--) {\r\n if (ids.includes(result.items[i].bag?.id)) {\r\n result.items.splice(i, 1);\r\n }\r\n }\r\n result.owner?.notifyChanges(result.items.length);\r\n d?.componentInstance.clearSelection();\r\n dialogService.toast('Operazione completata con successo.');\r\n }\r\n });\r\n });\r\n });\r\n\r\n d?.componentInstance.lookup.subscribe((result: any) => {\r\n dialogService.busy('Ricerca in corso...');\r\n lookupSubscription?.unsubscribe();\r\n lookupSubscription = clipperService\r\n .queryContacts({ any: result.filter, count: 100 })\r\n .pipe(finalize(() => dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) {\r\n dialogService.error(r.message);\r\n return;\r\n }\r\n if ((r.value?.total ?? 0) > 0) {\r\n result.items.length = 0;\r\n (r.value.items as ClipperContactInfo[]).forEach(n => {\r\n result.items.push({\r\n template: ClipperContactsSelector.buildContactTemplate(n),\r\n bag: n,\r\n searchBag: { name: n.name ?? '?' },\r\n });\r\n });\r\n }\r\n result.owner?.notifyChanges(r.value?.total ?? 0);\r\n });\r\n });\r\n });\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, DestroyRef, Injector, TemplateRef, ViewContainerRef, afterNextRender, computed, inject, model, output, signal, viewChild } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { Overlay, OverlayModule, OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { ClipperDocumentNote, ClipperMessages, ClipperNotifyDocumentNoteParams, ClipperService } from '@arsedizioni/ars-utils/clipper.common';\r\nimport { BroadcastService, FormatPipe, ThemeService } from '@arsedizioni/ars-utils/core';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { Subscription, finalize, fromEvent } from 'rxjs';\r\nimport { ApplicationDialogService, SendToDialogComponent, SendToPopulateData } from '@arsedizioni/ars-utils/ui.application';\r\nimport { DialogResult } from '@arsedizioni/ars-utils/ui';\r\nimport { ClipperContactsSelector } from '../contacts-selector/contacts-selector';\r\n\r\n\r\n@Component({\r\n selector: 'clipper-note-badge',\r\n templateUrl: './note-badge.component.html',\r\n styleUrls: ['./note-badge.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [MatButtonModule,\r\n MatIconModule,\r\n MatTooltipModule,\r\n FormatPipe,\r\n FlexLayoutModule,\r\n OverlayModule],\r\n})\r\nexport class ClipperNoteBadgeComponent {\r\n private readonly themeService = inject(ThemeService);\r\n private readonly injector = inject(Injector);\r\n private readonly clipperService = inject(ClipperService);\r\n private readonly broadcastService = inject(BroadcastService);\r\n private readonly dialogService = inject(ApplicationDialogService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly overlay = inject(Overlay);\r\n private overlayRef: OverlayRef | null = null;\r\n private resizeSub: Subscription | null = null;\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n readonly populateContacts = output<SendToPopulateData>();\r\n private readonly popupTpl = viewChild.required<TemplateRef<void>>('popupTpl');\r\n readonly note = model.required<ClipperDocumentNote>();\r\n protected readonly backgroundColor = signal<string>('');\r\n protected readonly trackingUnopenedCount = computed(() => {\r\n const trackings = this.note().trackings;\r\n if (!trackings?.length) return -1;\r\n return trackings.filter(t => !t.openDate).length;\r\n });\r\n protected readonly trackingOpenedCount = computed(() => {\r\n const trackings = this.note().trackings;\r\n if (!trackings?.length) return 0;\r\n return trackings.filter(t => !!t.openDate).length;\r\n });\r\n protected readonly totalTrackings = computed(() => this.note().trackings?.length ?? 0);\r\n\r\n constructor() {\r\n this.destroyRef.onDestroy(() => this.closePopup());\r\n afterNextRender(() => {\r\n this.themeService.changed\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.backgroundColor.set(this.getBackgroundColor()));\r\n this.backgroundColor.set(this.getBackgroundColor());\r\n });\r\n }\r\n\r\n /**\r\n * Computes the badge background color by blending the note colour with\r\n * black (dark theme) or white (light theme).\r\n * @returns The calculated background colour as a CSS `color-mix()` string.\r\n */\r\n private getBackgroundColor(): string {\r\n return this.themeService.getTheme() === 'dark'\r\n ? `color-mix(in srgb, ${this.note().color} 60%, black)`\r\n : `color-mix(in srgb, ${this.note().color} 40%, white)`;\r\n }\r\n\r\n /**\r\n * Opens the note-details popup positioned near the mouse cursor.\r\n * Stops event propagation to avoid triggering parent click handlers.\r\n * @param event - The mouse event used to determine the popup position.\r\n */\r\n protected showPopup(event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.closePopup();\r\n\r\n const popupWidth = 320;\r\n const fitsRight = event.clientX + popupWidth <= window.innerWidth;\r\n\r\n const buildPositionBelow = () => {\r\n const s = this.overlay.position().global().top(`${event.clientY}px`);\r\n return fitsRight ? s.left(`${event.clientX}px`) : s.centerHorizontally();\r\n };\r\n const buildPositionAbove = () => {\r\n const s = this.overlay.position().global().bottom(`${window.innerHeight - event.clientY}px`);\r\n return fitsRight ? s.left(`${event.clientX}px`) : s.centerHorizontally();\r\n };\r\n\r\n const ref = this.overlay.create({\r\n positionStrategy: buildPositionBelow(),\r\n hasBackdrop: true,\r\n backdropClass: 'cdk-overlay-transparent-backdrop',\r\n scrollStrategy: this.overlay.scrollStrategies.close(),\r\n });\r\n\r\n this.resizeSub = fromEvent(window, 'resize').pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => this.closePopup());\r\n\r\n ref.keydownEvents().pipe(takeUntilDestroyed(this.destroyRef)).subscribe(e => { if (e.key === 'Escape') this.closePopup(); });\r\n ref.backdropClick().pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => this.closePopup());\r\n ref.attach(new TemplatePortal(this.popupTpl(), this.viewContainerRef));\r\n\r\n // After rendering, check if the popup overflows the bottom of the viewport and reposition upward\r\n setTimeout(() => {\r\n if (!this.overlayRef) return;\r\n const rect = ref.overlayElement.getBoundingClientRect();\r\n if (rect.bottom > window.innerHeight) {\r\n ref.updatePositionStrategy(buildPositionAbove());\r\n }\r\n });\r\n\r\n this.overlayRef = ref;\r\n }\r\n\r\n /**\r\n * Closes the note-details popup and cleans up overlay resources.\r\n * @param event - Optional mouse event; when provided, propagation is stopped.\r\n */\r\n protected closePopup(event?: MouseEvent): void {\r\n event?.stopPropagation();\r\n this.resizeSub?.unsubscribe();\r\n this.resizeSub = null;\r\n this.overlayRef?.detach();\r\n this.overlayRef?.dispose();\r\n this.overlayRef = null;\r\n }\r\n\r\n /**\r\n * Opens the note-edit dialog pre-populated with the current note data.\r\n * On confirmation, updates the model and broadcasts the change.\r\n * Stops event propagation to avoid triggering parent click handlers.\r\n * @param event - The mouse event that triggered the edit action.\r\n */\r\n protected edit(event: MouseEvent): void {\r\n event.stopPropagation();\r\n import('../note-edit/note-edit.component').then(({ ClipperNoteEditComponent }) => {\r\n const d = this.dialogService.open(ClipperNoteEditComponent, {\r\n ariaLabel: 'modifica annotazione',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: true,\r\n closeOnNavigation: false,\r\n data: { currentItem: this.note() },\r\n minWidth: '375px',\r\n maxWidth: '600px',\r\n width: '100%',\r\n });\r\n d?.componentInstance.done.subscribe(result => {\r\n this.note.update(t => ({ ...result, trackings: t.trackings }));\r\n this.broadcastService.sendMessage(ClipperMessages.COMMAND_NOTES_UPDATE, this.note());\r\n d?.close();\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Opens a confirmation dialog and, on confirmation, deletes the note via the service.\r\n * Broadcasts the deletion and closes the popup on success.\r\n * Stops event propagation to avoid triggering parent click handlers.\r\n * @param event - The mouse event that triggered the delete action.\r\n */\r\n protected delete(event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.dialogService\r\n .confirm(\r\n 'Sei sicuro di voler eliminare questa annotazione?',\r\n 'Attenzione!'\r\n )\r\n ?.componentInstance.choosen.subscribe((data: DialogResult) => {\r\n if (data.result === 'ok') {\r\n this.dialogService.busy('Eliminazione in corso...');\r\n this.clipperService.deleteNotes([this.note().id ?? 0])\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n this.dialogService.toast('Operazione completata con successo.');\r\n this.broadcastService.sendMessage(ClipperMessages.COMMAND_NOTES_DELETE, this.note());\r\n this.closePopup();\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Opens the send-by-email dialog for the document linked to this note.\r\n * On confirmation, sends a notification via the service and updates tracking data.\r\n * Stops event propagation to avoid triggering parent click handlers.\r\n * @param event - The mouse event that triggered the send action.\r\n */\r\n protected sendTo(event: MouseEvent): void {\r\n event.stopPropagation();\r\n if (!this.note().documentId) return;\r\n const d = this.dialogService.open(SendToDialogComponent, {\r\n ariaLabel: 'invia documenti per email',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: true,\r\n closeOnNavigation: true,\r\n data: {\r\n title: 'Invia per email',\r\n text: this.note().note,\r\n subject: `${this.note().name}`,\r\n canPopulate: true,\r\n },\r\n minWidth: '375px',\r\n maxWidth: '600px',\r\n width: '100%',\r\n });\r\n d?.componentInstance.done\r\n .subscribe(data => {\r\n const params: ClipperNotifyDocumentNoteParams = {\r\n recipients: data.recipients,\r\n userNoteId: this.note().id ?? 0,\r\n subject: data.subject,\r\n text: data.text\r\n } as ClipperNotifyDocumentNoteParams;\r\n this.dialogService.busy('Invio in corso...');\r\n this.clipperService.notifyNoteTo(params)\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n if (r.value.updated > 0) {\r\n this.note.update(t => ({ ...t, trackings: r.value.items }));\r\n this.dialogService.toast('Invio completato con successo.');\r\n } else {\r\n this.dialogService.toast('Non è stato necessario inviare alcun email.');\r\n }\r\n\r\n d?.close();\r\n }\r\n });\r\n });\r\n d?.componentInstance.populate\r\n .subscribe(data => {\r\n ClipperContactsSelector.Show(\r\n this.injector,\r\n true,\r\n true,\r\n (contacts: any) => {\r\n if (contacts?.selectedItems?.length > 0) {\r\n const recipients = contacts.selectedItems\r\n .filter((c: any) => c.bag?.emails)\r\n .map((c: any) => c.bag.emails as string)\r\n .join(';');\r\n data.source.updateRecipients(recipients);\r\n }\r\n });\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Opens a confirmation dialog and, on confirmation, resends the email notifications\r\n * associated with this note.\r\n * Stops event propagation to avoid triggering parent click handlers.\r\n * @param event - The mouse event that triggered the resend action.\r\n * @param notifyIfNotOpen - When `true`, only recipients who have not yet opened the previous email are notified.\r\n */\r\n protected sendAgain(event: MouseEvent, notifyIfNotOpen: boolean): void {\r\n event.stopPropagation();\r\n this.dialogService.confirm(\r\n 'Vuoi inviare nuovamente le email associate a questa annotazione?',\r\n 'Attenzione!'\r\n )?.componentInstance.choosen.subscribe((data: DialogResult) => {\r\n if (data.result === 'ok') {\r\n this.dialogService.busy('Invio in corso...');\r\n const params: ClipperNotifyDocumentNoteParams = {\r\n notifyIfNotOpen: notifyIfNotOpen,\r\n userNoteId: this.note().id ?? 0,\r\n } as ClipperNotifyDocumentNoteParams;\r\n this.clipperService.notifyNoteTo(params)\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n return;\r\n } else {\r\n if (r.value.updated > 0) {\r\n this.note.update(t => ({ ...t, trackings: r.value.items }));\r\n this.dialogService.toast('Invio completato con successo.');\r\n } else {\r\n this.dialogService.toast('Non è stato necessario inviare alcun email.');\r\n }\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Fetches the latest tracking data for the note from the server and updates the model.\r\n * Stops event propagation to avoid triggering parent click handlers.\r\n * @param event - The mouse event that triggered the refresh action.\r\n */\r\n protected refresh(event: MouseEvent): void {\r\n event.stopPropagation();\r\n const noteId = this.note().id ?? 0;\r\n if (!noteId) return;\r\n this.dialogService.busy('Aggiornamento in corso...');\r\n this.clipperService.getNoteTrackings(noteId)\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n this.note.update(t => ({ ...t, trackings: r.value }));\r\n }\r\n });\r\n }\r\n\r\n\r\n}\r\n","<div class=\"note-wrapper\">\r\n <div class=\"note\" [style.border-left-color]=\"note().color\" [style.background-color]=\"backgroundColor()\"\r\n (click)=\"showPopup($event)\">\r\n {{note().name}}\r\n @if (trackingUnopenedCount() >= 0) {\r\n @if (trackingUnopenedCount() === 0) {\r\n <span class=\"tracking-badge tracking-badge--all-open\"\r\n [matTooltip]=\"'Mail tutte aperte'\"><mat-icon>check_circle</mat-icon></span>\r\n } @else {\r\n <span class=\"tracking-badge tracking-badge--missing\"\r\n [matTooltip]=\"'Mail non aperte: ' + trackingUnopenedCount()\">{{-trackingUnopenedCount()}}</span>\r\n }\r\n }\r\n </div>\r\n</div>\r\n\r\n<ng-template #popupTpl>\r\n <div class=\"popup\">\r\n <div class=\"popup-header\" [style.border-left-color]=\"note().color\">\r\n <span class=\"popup-name\">{{note().name}}</span>\r\n <button mat-icon-button (click)=\"closePopup($event)\" aria-label=\"Chiudi\" matTooltip=\"Chiudi\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n <div class=\"popup-content\">\r\n @if (note().note) {\r\n <div class=\"popup-note\">{{note().note}}</div>\r\n }\r\n @if (totalTrackings() > 0) {\r\n <div class=\"popup-toolbar\" fxLayout=\"row\" fxLayoutAlign=\"space-between center\" fxFill>\r\n <div class=\"tracking-summary\" matTooltip=\"Aperture mail\">\r\n <mat-icon class=\"open-yes\">mark_email_read</mat-icon>\r\n {{trackingOpenedCount()}} / {{totalTrackings()}}\r\n </div>\r\n <div>\r\n <button mat-icon-button (click)=\"refresh($event)\" aria-label=\"Aggiorna\" matTooltip=\"Aggiorna stato aperture\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tracking-table-wrapper\">\r\n <table class=\"tracking-table\">\r\n <thead>\r\n <tr>\r\n <th>Destinatario</th>\r\n <th fxHide.xs>Inviato il</th>\r\n <th>Apertura</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (t of note().trackings; track t.id) {\r\n <tr>\r\n <td>{{t.email ?? '-'}}</td>\r\n <td fxHide.xs class=\"center\">{{t.sentDate | format:'D':'dd/MM/yyyy HH:mm'}}</td>\r\n <td class=\"open-cell\">\r\n @if (t.openDate) {\r\n <mat-icon class=\"open-yes\"\r\n [matTooltip]=\"t.openDate | format:'D':'dd/MM/yyyy HH:mm'\">check_circle</mat-icon>\r\n } @else {\r\n <mat-icon class=\"open-no\">radio_button_unchecked</mat-icon>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n }\r\n <div class=\"popup-footer\">\r\n <button mat-icon-button (click)=\"edit($event)\" aria-label=\"Modifica\" matTooltip=\"Modifica\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button mat-icon-button (click)=\"delete($event)\" aria-label=\"Elimina\" matTooltip=\"Elimina\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n <button mat-icon-button (click)=\"sendTo($event)\" aria-label=\"Invia\" matTooltip=\"Invia per email\">\r\n <mat-icon>send</mat-icon>\r\n </button>\r\n @if(totalTrackings() > 0) {\r\n <button mat-icon-button (click)=\"sendAgain($event, false)\" aria-label=\"Invia di nuovo\"\r\n matTooltip=\"Invia di nuovo per email\">\r\n <mat-icon>forward</mat-icon>\r\n </button>\r\n @if (trackingUnopenedCount() > 0) {\r\n <button mat-icon-button (click)=\"sendAgain($event, true)\" aria-label=\"Invia se non aperto\"\r\n matTooltip=\"Invia una nuova mail a coloro che non hanno ancora aperto la mail precedente.\">\r\n <mat-icon>notifications_active</mat-icon>\r\n </button>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>","import { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, model, signal } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenu, MatMenuModule } from '@angular/material/menu';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { ClipperDocumentInfo, ClipperMessages, ClipperModel, ClipperUtils } from '@arsedizioni/ars-utils/clipper.common';\r\nimport { BroadcastService, FormatPipe, ScreenService } from '@arsedizioni/ars-utils/core';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { ClipperNoteBadgeComponent } from '../note-badge/note-badge.component';\r\nimport { ClipperSearchResultManager } from '../search-result-manager/search-result-manager';\r\n\r\n\r\nexport enum ClipperSearchResultItemDisplayMode {\r\n List = 1,\r\n Tile = 2,\r\n Stripe = 3\r\n}\r\n\r\n\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'clipper-search-result-item',\r\n templateUrl: './search-result-item.component.html',\r\n styleUrls: ['./search-result-item.component.scss'],\r\n standalone: true,\r\n imports: [\r\n MatCheckboxModule,\r\n MatButtonModule,\r\n MatTooltipModule,\r\n MatIconModule,\r\n MatMenuModule,\r\n FlexLayoutModule,\r\n FormatPipe,\r\n ClipperNoteBadgeComponent\r\n ],\r\n})\r\nexport class ClipperSearchResultItemComponent {\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n protected readonly screenService = inject(ScreenService);\r\n private readonly broadcastService = inject(BroadcastService);\r\n readonly parent = input.required<ClipperSearchResultManager>();\r\n readonly item = model.required<ClipperDocumentInfo>();\r\n readonly actions = input.required<MatMenu>();\r\n protected taxonomy = signal<string[]>([]);\r\n readonly tileNoPictureUrl = input<string>();\r\n readonly tilePictureUrl = input<string>(); \r\n readonly isSelectable = input<boolean>(true);\r\n readonly isReadable = input<boolean>(true);\r\n readonly isReadableModel = input<ClipperModel | undefined>(undefined);\r\n readonly displayModifiedTitle = input<boolean>(false);\r\n readonly displayModelName = input<boolean>(false);\r\n readonly displayDate = input<boolean>(true);\r\n readonly displayMode = input<ClipperSearchResultItemDisplayMode>(ClipperSearchResultItemDisplayMode.List);\r\n protected readonly displayModesEnum: typeof ClipperSearchResultItemDisplayMode = ClipperSearchResultItemDisplayMode;\r\n protected readonly modelsEnum: typeof ClipperModel = ClipperModel;\r\n\r\n /** Incremented whenever the parent's SelectionModel changes, invalidating `isSelected`. */\r\n private readonly selectionChangeTick = signal(0);\r\n\r\n /**\r\n * Whether this item is currently selected in the parent's selection model.\r\n * Recomputed whenever `selectionChangeTick` is updated by the selection-changed subscription.\r\n */\r\n protected readonly isSelected = computed(() => {\r\n this.selectionChangeTick();\r\n return this.isSelectable() && this.parent()?.selection?.isSelected(this.item().documentId) === true;\r\n });\r\n\r\n /**\r\n * Whether this item has already been read by the user.\r\n */\r\n protected readonly isRead = computed(() => {\r\n const model = this.isReadableModel() ?? this.item().model ?? 0;\r\n return this.isReadable() && model > 0 && ClipperUtils.isClipperModelReadable(model) && this.item().isRead === true;\r\n });\r\n\r\n /**\r\n * Whether this item is readable but not yet read (i.e. the read-flag action should be shown).\r\n */\r\n protected readonly canBeRead = computed(() => {\r\n const model = this.isReadableModel() ?? this.item().model ?? 0;\r\n return this.isReadable() && model > 0 && ClipperUtils.isClipperModelReadable(model) && this.item().isRead !== true;\r\n });\r\n\r\n constructor() {\r\n // Recompute taxonomy path whenever item() changes.\r\n effect(() => {\r\n const taxonomy: string[] = [];\r\n this.item().taxonomyPath?.split('\\r\\n').forEach(p => {\r\n const pathValues = p.split('>');\r\n if (pathValues.length > 0) {\r\n taxonomy.push(pathValues[pathValues.length - 1].trim());\r\n } else {\r\n taxonomy.push(p.trim());\r\n }\r\n });\r\n this.taxonomy.set(taxonomy);\r\n });\r\n\r\n // Subscribe to selection changes once the parent input signal is available.\r\n effect(() => {\r\n this.parent()?.selection?.changed\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => {\r\n this.selectionChangeTick.update(v => v + 1); \r\n });\r\n });\r\n\r\n // React to broadcast messages from other components.\r\n this.broadcastService.getMessage()\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(message => {\r\n if (message.id === ClipperMessages.DOCUMENT_NAVIGATED) {\r\n if (this.isReadable() && this.item().documentId === message.data.document.documentId && !this.item().isRead) {\r\n this.parent()?.setRead(true, this.item());\r\n }\r\n } else if (message.id === ClipperMessages.DOCUMENT_READ) {\r\n if (this.isReadable() && this.item().documentId === message.data.document.documentId) {\r\n this.item.update(v => ({ ...v, isRead: message.data.value }));\r\n }\r\n } else if (message.id === ClipperMessages.COMMAND_NOTES_DELETE) {\r\n const p = this.item().notes?.findIndex(p => p.id === message.data.id);\r\n if (p !== undefined && p >= 0) {\r\n this.item.update(v => ({ ...v, notes: v.notes?.filter((_, i) => i !== p) }));\r\n }\r\n } else if (message.id === ClipperMessages.COMMAND_NOTES_UPDATE) {\r\n const p = this.item().notes?.findIndex(p => p.id === message.data.id);\r\n if (p !== undefined && p >= 0) {\r\n const props = [...(this.item().notes ?? [])];\r\n props[p] = message.data;\r\n this.item.update(v => ({ ...v, notes: props }));\r\n }\r\n }\r\n });\r\n }\r\n\r\n}\r\n","<div>\r\n @if (displayMode() === displayModesEnum.List ) {\r\n <div class=\"item\" fxLayout=\"row\" fxLayoutGap=\"6px\" fxLayoutAlign=\"start center\" fxFill\r\n [class.item-selected]=\"isSelected()\" [matContextMenuTriggerFor]=\"actions()\"\r\n [matContextMenuTriggerData]=\"{item: item()}\" (mouseenter)=\"item().isOver = true\"\r\n (mouseleave)=\"item().isOver = false\">\r\n <div fxFlex=\"6px\" fxFlexAlign=\"stretch\" [class]=\"parent().getItemStateCssClass(item())\"\r\n [matTooltip]=\"parent().getItemStateTooltip(item())\"><span></span>\r\n </div>\r\n <div [fxFlex]=\"isSelectable() ? '48px' : '16px'\" fxLayoutAlign=\"center\">\r\n @if (isSelectable() && (screenService.isTouchable || item().isOver || isSelected())) {\r\n <mat-checkbox (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? parent().selection?.toggle(item(), item().documentId) : null\" [checked]=\"isSelected()\">\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxFlex=\"*\">\r\n <div class=\"item-content\">\r\n\r\n @if (displayModelName() && item().modelName) {\r\n @if (item().origin === 'GC' || item().origin === 'GN') {\r\n <div class=\"info-2\">GIURISPRUDENZA</div>\r\n } @else {\r\n <div class=\"info-2\">{{item().modelName}}</div>\r\n }\r\n }\r\n @if (item().info && item().model === modelsEnum.Quesiti) {\r\n @if(item().info) {\r\n <div class=\"info-1\">{{item().info}}</div>\r\n }\r\n }@else if(item().model === modelsEnum.NormativaVigente ||\r\n item().model === modelsEnum.AggiornamentoNormativo ||\r\n item().model === modelsEnum.GiurisprudenzaRecente ||\r\n item().model === modelsEnum.Juris) {\r\n @if (item().author && (item().origin === 'LR' || item().origin === 'GC' || item().origin\r\n === 'GN')) {\r\n <div class=\"info-1\">{{item().author}}</div>\r\n }\r\n @if(item().model === modelsEnum.Juris && displayDate() && item().date) {\r\n <div class=\"info-1\">{{item().date | format:'D':'d MMM yyyy'}}</div>\r\n }\r\n }@else if (displayDate() && item().date) {\r\n <div class=\"info-1\">{{item().date | format:'D':'d MMM yyyy'}}</div>\r\n }\r\n <div>\r\n <a class=\"link\" (click)=\"parent().open(item().documentId, undefined, item().chunksList)\"\r\n [attr.aria-label]=\"'Apri documento ' + item().title1\">{{item().title1 ?? item().title2}}</a>\r\n @if ((item().part ?? 0) > 0) {\r\n <span class=\"badge\">PARTE {{item().part}}</span>\r\n }\r\n @if (item().isCommented) {\r\n <span class=\"badge\">COMMENTATA</span>\r\n }\r\n @if ((item().validityState ?? 0) > 0) {\r\n <span class=\"badge-red\">{{item().validityDescription}}</span>\r\n }\r\n </div>\r\n @if(item().description && item().model === modelsEnum.Coordinamento) {\r\n <div class=\"title\">{{item().description}}</div>\r\n }\r\n @if (item().title2 &&\r\n item().model !== modelsEnum.Coordinamento &&\r\n item().model !== modelsEnum.News &&\r\n item().model !== modelsEnum.AllerteAlimentari &&\r\n item().model !== modelsEnum.Articoli &&\r\n item().model !== modelsEnum.Juris &&\r\n item().model !== modelsEnum.Quesiti &&\r\n item().model !== modelsEnum.Scadenze &&\r\n item().model !== modelsEnum.Segnalazioni) {\r\n <div class=\"title\">{{item().title2}}</div>\r\n }\r\n @if (item().originDescription &&\r\n item().model !== modelsEnum.Scadenze &&\r\n item().model !== modelsEnum.Segnalazioni &&\r\n item().model !== modelsEnum.News &&\r\n item().model !== modelsEnum.Articoli &&\r\n item().model !== modelsEnum.Juris) {\r\n <div class=\"info-1\"\r\n [class.info-3]=\"(item().model === modelsEnum.Coordinamento && (item().validFromDate || item().applicableFromDate))\">\r\n {{item().originDescription}}\r\n @if (item().model === modelsEnum.Coordinamento ) {\r\n @if (item().validFromDate) {\r\n in vigore da: <span class=\"bold\">{{item().validFromDate | format:'D':'d MMMM yyyy'}}</span>\r\n }\r\n @if (item().applicableFromDate) {\r\n applicabile da: <span class=\"bold\">{{item().applicableFromDate | format:'D':'d MMMM yyyy'}}</span>\r\n }\r\n }\r\n </div>\r\n }\r\n @if ((item().anchors?.length ?? 0) > 0) {\r\n <div class=\"details\">\r\n <div>DETTAGLIO</div>\r\n <div class=\"links\">\r\n @for (a of item().anchors; track $index) {\r\n <span>\r\n @if (a.uri && a.text) {\r\n <a (click)=\"parent().open(a.documentId + '#' + a.uri, undefined, item().chunksList)\"\r\n [matTooltip]=\"a.title\" [class.bright]=\"(a.score ?? 0) > 0.75\">\r\n {{a.text}}\r\n @if (a.veryRelevant) {\r\n <sup>\r\n <mat-icon class=\"thumb\"\r\n [matTooltip]=\"(a.score ?? 0) > 0.75 ? 'Molto rilevante' : 'Più rilevante'\">thumb_up_alt</mat-icon>\r\n </sup>\r\n }</a>\r\n }\r\n @if (!a.uri && a.text) {\r\n <span>{{a.text}}</span>\r\n }\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n @if (taxonomy().length > 0) {\r\n <div class=\"details\">\r\n <div>ARGOMENTI</div>\r\n <div class=\"links\">\r\n <div class=\"lowercase\" [innerHTML]=\"taxonomy().join(' − ')\"></div>\r\n </div>\r\n </div>\r\n }\r\n @if (item().model === modelsEnum.News ||\r\n item().model === modelsEnum.Articoli ||\r\n item().model === modelsEnum.Juris) {\r\n @if (item().info){\r\n <div class=\"details\">\r\n <div class=\"links\">\r\n <div>{{item().info}}</div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n @if (item().model === modelsEnum.Coordinamento) {\r\n @if (item().title1 && displayModifiedTitle()) {\r\n <div class=\"details\">\r\n <div>TITOLO DOCUMENTO MODIFICATO</div>\r\n <div class=\"links\">\r\n <div>{{item().title1}}</div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n @if (item().model === modelsEnum.Scadenze || item().model === modelsEnum.Segnalazioni) {\r\n @if (item().expiringDescription) {\r\n <div class=\"details\">\r\n <div>PROSSIMA SCADENZA</div>\r\n <div class=\"links\">\r\n <div>{{item().expiringDescription}}</div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n @if((item().notes?.length ?? 0) > 0 ) {\r\n <div class=\"notes-container\">\r\n @for (note of item().notes; track note.id) {\r\n <clipper-note-badge [note]=\"note\" />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"end\">\r\n @if (canBeRead())\r\n {\r\n <button type=\"button\" mat-icon-button matTooltip=\"Segna come già letta\" [attr.aria-label]=\"'Segna come già letta'\"\r\n (click)=\"parent().toggleRead(item(), $event)\" [hidden]=\"!(item().isOver || item().isMenuOpen)\">\r\n <mat-icon>flag</mat-icon>\r\n </button>\r\n }\r\n @if(item().model === modelsEnum.Scadenze || item().model === modelsEnum.Segnalazioni) {\r\n <button type=\"button\" mat-icon-button matTooltip=\"Aggiungi al tuo calendario\"\r\n (click)=\"parent().addToCalendar(item())\" [attr.aria-label]=\"'Aggiungi al tuo calendario'\"\r\n [hidden]=\"!(item().isOver || item().isMenuOpen)\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Menu\" [attr.aria-label]=\"'Menu opzioni'\"\r\n [matMenuTriggerFor]=\"actions()\" [matMenuTriggerData]=\"{item: item()}\" (click)=\"item().isMenuOpen = true\"\r\n [hidden]=\"!(item().isOver || item().isMenuOpen)\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n } @else if (displayMode() === displayModesEnum.Tile ) {\r\n <div class=\"tile\" [matContextMenuTriggerFor]=\"actions()\" [matContextMenuTriggerData]=\"{item: item()}\"\r\n (mouseenter)=\"item().isOver = true\" (mouseleave)=\"item().isOver = false\" [class.item-selected]=\"isSelected()\"\r\n [class.item-unread]=\"isRead()\" (click)=\"parent().open(item().documentId, undefined, item().chunksList)\">\r\n <div class=\"image\">\r\n @if (canBeRead() || isSelectable()) {\r\n <div class=\"buttons\">\r\n @if (canBeRead()) {\r\n <button mat-icon-button class=\"unread-button\" matTooltip=\"Segna come già letto\"\r\n (click)=\"parent().toggleRead(item(), $event)\"><mat-icon>flag</mat-icon></button>\r\n }\r\n @if (isSelectable() && (isSelected() || item().isOver === true)) {\r\n <button mat-icon-button class=\"check\" [class.check-selected]=\"isSelected()\" matTooltip=\"Seleziona/Deseleziona\"\r\n (click)=\"parent().toggleSelection(item(), $event)\"><mat-icon>check</mat-icon></button>\r\n }\r\n </div>\r\n }\r\n <div class=\"info-1\">{{item().modelName}}</div>\r\n @if (item().info) {\r\n <div class=\"info-2\">{{item().info}}</div>\r\n }\r\n @if (item().pictureId && tilePictureUrl()) {\r\n <img decoding=\"async\" loading=\"lazy\" [src]=\"tilePictureUrl() + '?id=' + item().pictureId\" [alt]=\"item().title2\" />\r\n } @else if (tileNoPictureUrl()) {\r\n <picture>\r\n <img decoding=\"async\" loading=\"lazy\" [src]=\"tileNoPictureUrl()\"\r\n [alt]=\"item().title2 || 'immagine non trovata'\" />\r\n </picture>\r\n }\r\n </div>\r\n <div class=\"body\">\r\n <div class=\"date\">\r\n <span class=\"date-day\" [class.unread]=\"!item().isRead\">{{item().date | format:'D':'d\r\n MMMM'}}</span>\r\n <span class=\"date-divider\"></span>\r\n <span>{{item().date| format:'D':'yyyy'}}</span>\r\n </div>\r\n <div class=\"title\">{{item().title2}}</div>\r\n </div>\r\n </div>\r\n } @else if (displayMode() === displayModesEnum.Stripe ) {\r\n <div class=\"stripe\" [matContextMenuTriggerFor]=\"actions()\" [matContextMenuTriggerData]=\"{item: item()}\"\r\n (mouseenter)=\"item().isOver = true\" (mouseleave)=\"item().isOver = false\" [class.item-selected]=\"isSelected()\"\r\n [class.item-unread]=\"isRead()\" (click)=\"parent().open(item().documentId, undefined, item().chunksList)\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFill>\r\n <div>\r\n <div fxLayout=\"row\">\r\n <div fxHide.xs class=\"image\">\r\n @if (canBeRead() || isSelectable()) {\r\n <div class=\"buttons\">\r\n @if (canBeRead()) {\r\n <button mat-icon-button class=\"unread-button\" matTooltip=\"Segna come già letto\"\r\n (click)=\"parent().toggleRead(item(), $event)\"><mat-icon>flag</mat-icon></button>\r\n }\r\n @if (isSelectable() && (isSelected() || item().isOver === true)) {\r\n <button mat-icon-button class=\"check\" [class.check-selected]=\"isSelected()\"\r\n matTooltip=\"Seleziona/Deseleziona\"\r\n (click)=\"parent().toggleSelection(item(), $event)\"><mat-icon>check</mat-icon></button>\r\n }\r\n </div>\r\n }\r\n @if (item().pictureId && tilePictureUrl()) {\r\n <img decoding=\"async\" loading=\"lazy\" [src]=\"tilePictureUrl() + '?id=' + item().pictureId\"\r\n [alt]=\"item().title2\" />\r\n } @else if (tileNoPictureUrl()) {\r\n <picture>\r\n <img decoding=\"async\" loading=\"lazy\" [src]=\"tileNoPictureUrl()\"\r\n [alt]=\"item().title2 || 'immagine non trovata'\" />\r\n </picture>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" class=\"body\">\r\n <div class=\"date\">\r\n <span class=\"date-day\" [class.unread]=\"!item().isRead\">{{item().date | format:'D':'d\r\n MMMM'}}</span>\r\n <span class=\"date-divider\"></span>\r\n <span>{{item().date| format:'D':'yyyy'}}</span>\r\n </div>\r\n <div class=\"title\">{{item().title2}}</div>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\">\r\n <div class=\"info-1\">{{item().modelName}}</div>\r\n @if (item().info) {\r\n <div class=\"info-2\">{{item().info}}</div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</div>","import { Breakpoints } from '@angular/cdk/layout';\r\nimport { ScrollDispatcher, ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { afterNextRender, ChangeDetectionStrategy, Component, computed, effect, inject, input, signal, viewChild } from '@angular/core';\r\nimport { outputToObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatBadge } from '@angular/material/badge';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatExpansionModule, MatExpansionPanel } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInput, MatInputModule } from '@angular/material/input';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatPaginator, PageEvent } from '@angular/material/paginator';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatDrawer, MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { ClipperAuthors, ClipperChannel, ClipperDocumentChangeReasons, ClipperDocumentInfo, ClipperMessages, ClipperModel, ClipperModule, ClipperRegions, ClipperSearchFacetsSnapshot, ClipperSearchParams, ClipperSearchUtils, ClipperSectors, ClipperSectorTypes, ClipperSort, ClipperSources, ClipperUserInfo, ClipperUserSearch, ClipperUtils, SectorInfo } from '@arsedizioni/ars-utils/clipper.common';\r\nimport { ArsCoreModule, DateInterval, INode, NameValueItem, SelectableModel, SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { DialogResult } from '@arsedizioni/ars-utils/ui';\r\nimport { ButtonSelectorComponent, ButtonToggleComponent, ChipsSelectorComponent } from '@arsedizioni/ars-utils/ui.application';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { finalize } from 'rxjs';\r\nimport { ClipperDocumentMenuComponent } from '../document-menu/document-menu.component';\r\nimport { ClipperSearchFacetsComponent } from '../search-facets/search-facets.component';\r\nimport { ClipperSearchResultManager } from '../search-result-manager/search-result-manager';\r\nimport type { SearchFreeTextQueryParams } from '../search-free-text-query-builder/search-free-text-query-builder.component';\r\nimport { ClipperSearchResultItemComponent } from '../search-result-item/search-result-item.component';\r\n\r\n\r\n\r\n\r\n@Component({\r\n selector: 'clipper-browser',\r\n standalone: true,\r\n imports: [FormsModule, FlexLayoutModule, MatIconModule, MatButtonModule, MatTooltipModule, MatSidenavModule,\r\n MatExpansionModule, MatDividerModule, MatMenuModule, MatFormFieldModule, MatInputModule, MatDatepickerModule, MatBadge,\r\n ScrollingModule, MatSelectModule, MatChipsModule, MatSlideToggleModule, MatPaginator, MatCheckboxModule, MatButtonToggleModule, MatProgressBarModule,\r\n ArsCoreModule, ChipsSelectorComponent, ButtonSelectorComponent, ButtonToggleComponent,\r\n ClipperSearchResultItemComponent,\r\n ClipperDocumentMenuComponent, ClipperSearchFacetsComponent],\r\n templateUrl: './browser.component.html',\r\n styleUrl: './browser.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ClipperBrowserComponent extends ClipperSearchResultManager {\r\n\r\n\r\n readonly filterByNumber = viewChild<MatInput>('filterByNumber');\r\n readonly filterByText = viewChild<MatInput>('filterByText');\r\n readonly filterByChangeNumber = viewChild<MatInput>('filterByChangeNumber');\r\n readonly filterPane = viewChild.required<MatDrawer>('filterPane');\r\n readonly filterPane2 = viewChild.required<MatDrawer>('filterPane2');\r\n readonly filterSelector = viewChild<ButtonSelectorComponent>('filterSelector');\r\n readonly moduleSelector = viewChild.required<ChipsSelectorComponent>('moduleSelector');\r\n readonly sourceExpansionPanel = viewChild<MatExpansionPanel>('sourceExpansionPanel');\r\n readonly otherOptionsExpansionPanel = viewChild<MatExpansionPanel>('otherOptionsExpansionPanel');\r\n readonly modifierExpansionPanel = viewChild<MatExpansionPanel>('modifierExpansionPanel');\r\n readonly showChannels = input<boolean>(true);\r\n readonly showRSOptions = input<boolean>(true);\r\n readonly showAIAssistantOptions = input<boolean>(false);\r\n readonly selectableModules = input<ClipperModule[]>([]);\r\n readonly initialModule = input<ClipperModule | undefined>(undefined);\r\n protected scrollDispatcher = inject(ScrollDispatcher);\r\n protected readonly filterDescription = signal<string>('');\r\n protected readonly filters = signal<NameValueItem<ClipperUserSearch>[]>([]);\r\n\r\n /** Currently selected saved filter, derived from the filters list and the active search id. */\r\n protected readonly filter = computed<NameValueItem<ClipperUserSearch> | undefined>(() =>\r\n this.hasFilters() && this.filterParams.searchId\r\n ? this.filters().find(x => x.value.id === this.filterParams.searchId)\r\n : undefined\r\n );\r\n\r\n /** True when the user has access to the AI assistant feature. */\r\n protected readonly hasAIAssistant = computed(() =>\r\n this.showAIAssistantOptions() && this.clipperService.loginInfo?.context.hasAIAssistant === true\r\n );\r\n\r\n /** True when at least one saved filter is available. */\r\n protected readonly hasFilters = computed(() => this.filters().length > 0);\r\n\r\n /**\r\n * Checks whether the current module selection targets law-related content.\r\n * @param allowEmpty - When true, an empty module list also counts as law-related. Defaults to true.\r\n * @returns True if the selection includes any law module or (when allowEmpty) is empty.\r\n */\r\n protected isLaws(allowEmpty: boolean = true): boolean {\r\n const modules = this.filterParams.modules;\r\n return (allowEmpty && (modules?.length ?? 0) === 0) ||\r\n (modules?.findIndex(x =>\r\n x.value === ClipperModule.GazzetteBollettiniEFontiDiverse ||\r\n x.value === ClipperModule.NormativaVigente ||\r\n x.value === ClipperModule.GiurisprudenzaRecente) ?? -1) !== -1;\r\n }\r\n\r\n /**\r\n * Checks whether the currently selected modules produce readable content.\r\n * @returns True when the modules allow content reading.\r\n */\r\n protected isReadable(): boolean {\r\n return (this.canSearch() && (this.filterParams.modules?.length ?? 0) === 0) ||\r\n ((this.filterParams.modules?.length ?? 0) > 0 &&\r\n (this.filterParams.modules?.findIndex(\r\n m => m.value === ClipperModule.NormativaVigente || m.value === ClipperModule.ScadenzeESegnalazioni\r\n ) ?? -1) === -1);\r\n }\r\n\r\n /**\r\n * Checks whether the current selection targets the coordination module.\r\n * @returns True when the 'ModificheAbrogazioniERinvii' module is selected.\r\n */\r\n protected isCoordination(): boolean {\r\n return (this.filterParams.modules?.length ?? 0) > 0 &&\r\n (this.filterParams.modules?.findIndex(x => x.value === ClipperModule.ModificheAbrogazioniERinvii) ?? -1) !== -1;\r\n }\r\n\r\n /**\r\n * Checks whether the current sort mode is one of the date-based sort options.\r\n * @returns True when results are sorted by date (ascending or descending).\r\n */\r\n protected isSortedByDate(): boolean {\r\n return this.sortMode()?.value === ClipperSort.DateAsc ||\r\n this.sortMode()?.value === ClipperSort.DateDesc ||\r\n this.sortMode()?.value === ClipperSort.SourceDateAsc ||\r\n this.sortMode()?.value === ClipperSort.SourceDateDesc;\r\n }\r\n\r\n /**\r\n * Checks whether the current filter parameters define a valid search.\r\n * @returns True when at least one filter parameter has been set.\r\n */\r\n protected canSearch(): boolean {\r\n return this.isFiltering(this.filterParams);\r\n }\r\n\r\n protected readonly sectors = signal<SectorInfo[]>([]);\r\n\r\n /**\r\n * Checks whether sector-based filtering is available for the current selection.\r\n * @returns True when sector filtering applies.\r\n */\r\n protected hasSectors(): boolean {\r\n return this.isLaws();\r\n }\r\n\r\n protected readonly regions = signal<NameValueItem<string>[]>([]);\r\n\r\n /**\r\n * Checks whether region-based filtering is available.\r\n * @returns True when the selection includes sectors with regional content (LR).\r\n */\r\n protected override readonly hasRegions = computed(() =>\r\n this.hasSectors() && (this.filterParams.sectors?.filter(n => n.value === 'LR').length ?? 0) > 0\r\n );\r\n\r\n protected readonly sources = signal<NameValueItem<string>[]>([...ClipperSources]);\r\n\r\n /**\r\n * Checks whether source-based filtering applies to the current module selection.\r\n * @returns True when source filtering is available.\r\n */\r\n protected hasSource(): boolean {\r\n return this.isLaws();\r\n }\r\n\r\n protected readonly authors = signal<NameValueItem<string>[]>([]);\r\n protected readonly types = signal<NameValueItem<string>[]>([]);\r\n /** Topic tree loaded on initialization, used as input for the tree-selection dialog. */\r\n protected topics: INode[] = [];\r\n\r\n /**\r\n * Checks whether topic-based filtering applies to the current module selection.\r\n * @returns True when topic filtering is available.\r\n */\r\n protected hasTopics(): boolean {\r\n return this.isLaws();\r\n }\r\n\r\n protected readonly tags = signal<NameValueItem<string>[]>([]);\r\n\r\n /**\r\n * Checks whether tag-based filtering is available for the current modules.\r\n * @returns True when tags are loaded and the selection includes news or in-depth modules.\r\n */\r\n protected hasTags(): boolean {\r\n return this.tags().length > 0 &&\r\n ((this.filterParams.modules?.length === 0 &&\r\n (this.hasModule(ClipperModule.News) || this.hasModule(ClipperModule.Approfondimenti))) ||\r\n (this.filterParams.modules?.findIndex(\r\n m => m.value === ClipperModule.News || m.value === ClipperModule.Approfondimenti\r\n ) ?? -1) !== -1);\r\n }\r\n protected reasons = signal<NameValueItem<number>[]>([...ClipperDocumentChangeReasons]);\r\n protected modules = signal<NameValueItem<ClipperModule>[]>(this.getAllModules());\r\n\r\n /**\r\n * The subset of modules available for selection, filtered by `selectableModules` when it is non-empty.\r\n * Falls back to all modules when `selectableModules` is empty or null.\r\n */\r\n protected readonly filteredModules = computed<NameValueItem<ClipperModule>[]>(() => {\r\n const selectable = this.selectableModules();\r\n if (!selectable || selectable.length === 0) return this.modules();\r\n return this.modules().filter(m => selectable.includes(m.value));\r\n });\r\n protected interval: DateInterval = new DateInterval();\r\n protected sourceInterval: DateInterval = new DateInterval();\r\n protected user: ClipperUserInfo | undefined = this.clipperService.loginInfo?.context;\r\n private _viewReady = false;\r\n\r\n\r\n constructor() {\r\n super();\r\n\r\n // Initialize filter params with defaults\r\n this.filterParams.version = 7;\r\n this.filterParams.modules = [{ name: \"Normativa vigente\", shortName: \"Normativa vigente\", value: ClipperModule.NormativaVigente }];\r\n this.initializeFilter();\r\n\r\n // Initialize document selection model\r\n this.selection = new SelectableModel<ClipperDocumentInfo, string>(true, 'documentId');\r\n\r\n // React to breakpoint changes to update the filter pane layout\r\n this.breakpointObserver\r\n .observe([\r\n Breakpoints.XSmall,\r\n Breakpoints.Small,\r\n Breakpoints.Medium,\r\n Breakpoints.Large,\r\n Breakpoints.XLarge,\r\n ])\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(result => {\r\n if (!this._viewReady) return; // DOM not ready yet\r\n for (const query of Object.keys(result.breakpoints)) {\r\n if (result.breakpoints[query]) {\r\n this.handleFilterPaneVisibility();\r\n }\r\n }\r\n });\r\n\r\n // React to broadcasted messages\r\n this.broadcastService.getMessage()\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(message => {\r\n if (message.id === ClipperMessages.COMMAND_DASHBOARD_UPDATED) {\r\n this.updateModulesUnreadItems();\r\n } else if (message.id === ClipperMessages.COMMAND_SEARCH_RESTORED) {\r\n const filter = this.filter();\r\n if (filter) {\r\n this.selectFilter(filter);\r\n }\r\n this.handleFilterPaneVisibility();\r\n }\r\n });\r\n\r\n // Load tags if the feature is enabled for this user\r\n if (this.clipperService.allowTags()) {\r\n this.loadTags();\r\n }\r\n\r\n // Load topics and saved searches\r\n this.loadTopics();\r\n this.loadFilters();\r\n\r\n // Set up view-dependent behaviour after the first render\r\n afterNextRender(() => {\r\n this._viewReady = true;\r\n this.handleFilterPaneVisibility();\r\n this.filterPane().openedChange\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(opened => {\r\n this.updateFilterPaneFocus();\r\n // Sync backdrop with actual open state when in overlay mode\r\n if (this.filterPane().mode === 'over') {\r\n this.filterPaneHasBackdrop.set(opened);\r\n }\r\n });\r\n this.filterPane2().openedChange\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(opened => {\r\n if (this.filterPane2().mode === 'over') {\r\n this.filterPane2HasBackdrop.set(opened);\r\n }\r\n });\r\n this.updateFilterPaneFocus();\r\n this.updateModulesUnreadItems();\r\n this.modulesChanged();\r\n\r\n // Subscribe to facet changes\r\n const facets = this.facets();\r\n if (facets) {\r\n outputToObservable(facets.changed)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((value: ClipperSearchFacetsSnapshot) => {\r\n if (this.snapshot) {\r\n this.snapshot.facets = value;\r\n this.fetch(true);\r\n }\r\n });\r\n }\r\n });\r\n\r\n // React to initialModule changes: preselect the matching module in the UI and in filterParams\r\n effect(() => {\r\n const initialModule = this.initialModule();\r\n const selector = this.moduleSelector();\r\n const selected = this.filteredModules().find(x => x.value === initialModule) ?? this.filteredModules()[0];\r\n selector.select(selected);\r\n if (selected) {\r\n this.filterParams.modules = [selected];\r\n this.modulesChanged();\r\n }\r\n });\r\n\r\n // Trim filterParams.modules to only include items still available in filteredModules\r\n effect(() => {\r\n const available = this.filteredModules();\r\n if (this.filterParams.modules) {\r\n this.filterParams.modules = this.filterParams.modules.filter(\r\n x => available.findIndex(y => y.value === x.value) !== -1\r\n );\r\n }\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Get all available modules\r\n */\r\n private getAllModules(): NameValueItem<ClipperModule>[] {\r\n let modules: NameValueItem<ClipperModule>[] = [];\r\n modules.push({ name: \"News\", shortName: \"News\", value: ClipperModule.News });\r\n modules.push({ name: \"Gazzette, Bollettini e fonti diverse\", shortName: \"Gazzette, Bollettini e fonti diverse\", value: ClipperModule.GazzetteBollettiniEFontiDiverse });\r\n modules.push({ name: \"Modifiche, abrogazioni e rinvii\", shortName: \"Modifiche, abrogazioni e rinvii\", value: ClipperModule.ModificheAbrogazioniERinvii });\r\n modules.push({ name: \"Normativa vigente\", shortName: \"Normativa vigente\", value: ClipperModule.NormativaVigente });\r\n modules.push({ name: \"Giurisprudenza\", shortName: \"Giurisprudenza\", value: ClipperModule.GiurisprudenzaRecente });\r\n modules.push({ name: \"Articoli\", shortName: \"Articoli\", value: ClipperModule.Approfondimenti });\r\n modules.push({ name: \"Note a sentenza\", shortName: \"Note a sentenza\", value: ClipperModule.Giurisprudenza });\r\n modules.push({ name: \"Quesiti\", shortName: \"Quesiti\", value: ClipperModule.QuesitiECasiRisolti });\r\n modules.push({ name: \"Scadenze e segnalazioni\", shortName: \"Scadenze e segnalazioni\", value: ClipperModule.ScadenzeESegnalazioni });\r\n return modules;\r\n }\r\n\r\n /**\r\n * Return the snapshot document by id\r\n * @param id : the document id\r\n * @returns the document or null\r\n */\r\n public getSnapshotDocument(id: string): ClipperDocumentInfo | undefined {\r\n return this.snapshot.items.find(x => x.documentId === id || x.id === id);\r\n }\r\n\r\n\r\n /**\r\n * Loads available tags from the server and populates the tag signal.\r\n */\r\n protected loadTags(): void {\r\n this.clipperService.getTags()\r\n .subscribe(r => {\r\n if (r.success) {\r\n this.tags.set(r.value);\r\n }\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Load topics\r\n */\r\n private loadTopics() {\r\n if (!this.clipperService.loggedIn()) return;\r\n this.clipperService.getTopicsAsTree()\r\n .subscribe(r => {\r\n if (!r.success) this.dialogService.error(r.message);\r\n else {\r\n this.topics = SystemUtils.toNodes(r.value.children as INode[]);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Show hide filter pane manually\r\n */\r\n protected toggleFilterPane() {\r\n this.filterPaneClosed.set(!this.filterPaneClosed());\r\n this.filterPane()?.toggle();\r\n }\r\n\r\n /**\r\n * Show hide filter pane manually\r\n */\r\n protected toggleFilterPane2() {\r\n this.filterPane2Closed.set(!this.filterPane2Closed());\r\n this.filterPane2()?.toggle();\r\n }\r\n\r\n\r\n /**\r\n * Handle filter pane visibility\r\n */\r\n protected handleFilterPaneVisibility() {\r\n const filterPane = this.filterPane();\r\n if (filterPane) {\r\n if (this.breakpointObserver.isMatched(Breakpoints.XSmall) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Small) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Medium)) {\r\n if (filterPane.opened) {\r\n filterPane.close();\r\n }\r\n filterPane.mode = 'over';\r\n filterPane.disableClose = false;\r\n this.filterPaneHasBackdrop.set(filterPane.opened);\r\n } else {\r\n if (!filterPane.opened && !this.filterPaneClosed()) {\r\n filterPane.open();\r\n } else if (filterPane.opened && this.filterPaneClosed()) {\r\n filterPane.close();\r\n }\r\n filterPane.mode = 'side';\r\n filterPane.disableClose = true;\r\n this.filterPaneHasBackdrop.set(false);\r\n }\r\n }\r\n setTimeout(() => {\r\n const filterPane2 = this.filterPane2();\r\n if (filterPane2) {\r\n if (this.breakpointObserver.isMatched(Breakpoints.XSmall) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Small) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Medium)) {\r\n if (filterPane2.opened) {\r\n filterPane2.close();\r\n }\r\n filterPane2.mode = 'over';\r\n filterPane2.disableClose = false;\r\n this.filterPane2HasBackdrop.set(filterPane2.opened);\r\n } else {\r\n if (!this.hasFacets()) {\r\n filterPane2.close();\r\n } else if (!filterPane2.opened && !this.filterPane2Closed()) {\r\n filterPane2.open();\r\n } else if (filterPane2.opened && this.filterPane2Closed()) {\r\n filterPane2.close();\r\n }\r\n filterPane2.mode = 'side';\r\n filterPane2.disableClose = true;\r\n this.filterPane2HasBackdrop.set(false);\r\n }\r\n }\r\n }, 250);\r\n }\r\n\r\n /**\r\n * Initialize filter\r\n */\r\n private initializeFilter() {\r\n this.filterParams.channels = this.clipperService.activeChannels();\r\n this.channelsChanged(false);\r\n }\r\n\r\n /**\r\n * Update filter when channels changes\r\n * @param updateChannels: true to update channels\r\n */\r\n protected channelsChanged(updateChannels: boolean = true) {\r\n if (updateChannels) {\r\n this.clipperService.updateChannels(this.filterParams.channels);\r\n }\r\n const sectors: SectorInfo[] = [];\r\n const regions: NameValueItem<string>[] = [];\r\n const modules = this.getAllModules();\r\n this.filterParams.channels?.forEach(channel => {\r\n if (channel.value == ClipperChannel.SostanzeAlimentari && this.hasModule(ClipperModule.AllerteAlimentari)) {\r\n modules.push({ name: \"Allerte alimentari\", shortName: \"Allerte alimentari\", value: ClipperModule.AllerteAlimentari });\r\n }\r\n const channelSettings = this.clipperService.loginInfo?.channels?.find(x => x.channelId === channel.value);\r\n if (channelSettings) {\r\n channelSettings.sectors.filter(x => x.checked).forEach(x => {\r\n if (sectors.findIndex(y => y.value === x.value) === -1) {\r\n ClipperSectors.filter(y => y.group === 'S' && y.value === x.value).forEach(y => {\r\n sectors.push(y);\r\n });\r\n }\r\n });\r\n channelSettings.regions.filter(x => x.checked).forEach(x => {\r\n if (regions.findIndex(y => y.value === x.value) === -1) {\r\n ClipperRegions.filter(y => y.value === x.value).forEach(y => {\r\n regions.push(y);\r\n });\r\n }\r\n });\r\n }\r\n });\r\n this.modules.set(modules);\r\n this.sectors.set(sectors);\r\n this.regions.set(regions);\r\n if (this.filterParams.modules) {\r\n this.filterParams.modules = this.filterParams.modules.filter(x => this.modules().findIndex(y => y.value === x.value) !== -1) ?? [];\r\n }\r\n if (this.filterParams.sectors) {\r\n this.filterParams.sectors = this.filterParams.sectors.filter(x => this.sectors().findIndex(y => y.value === x.value) !== -1) ?? [];\r\n }\r\n if (this.filterParams.authors) {\r\n this.filterParams.authors = this.filterParams.authors.filter(x => this.regions().findIndex(y => y.value === x.value) !== -1) ?? [];\r\n }\r\n this.sectorsChanged();\r\n this.updateModulesUnreadItems();\r\n }\r\n\r\n /**\r\n * Update filter pane focus\r\n */\r\n private updateFilterPaneFocus() {\r\n setTimeout(() => {\r\n let focusableElement = this.filterByText();\r\n if (this.isLaws()) {\r\n focusableElement = this.filterByNumber();\r\n }\r\n focusableElement?.focus();\r\n }, 250);\r\n }\r\n\r\n /**\r\n * Loads the user's saved searches from the server and populates the filter selector.\r\n */\r\n protected loadFilters(): void {\r\n if (!this.clipperService.loggedIn()) return;\r\n this.clipperService.loadSearches(ClipperModule.Ricerca)\r\n .subscribe(\r\n r => {\r\n if (r.success) {\r\n const items: NameValueItem<ClipperUserSearch>[] = [];\r\n r.value.forEach(n => {\r\n items.push({ name: n.name ?? '', value: n });\r\n });\r\n this.filters.set(items);\r\n this.handleFilterPaneVisibility();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Saves the current filter parameters as a named search.\r\n * @param newFilter - When true, always prompts for a new filter name; otherwise updates the existing one. Defaults to false.\r\n */\r\n saveFilter(newFilter: boolean = false): void {\r\n this.loadFilter();\r\n if (newFilter || !this.filterParams.searchId) {\r\n const d = this.dialogService.prompt(\r\n \"Crea un nuovo filtro\",\r\n 0,\r\n \"Nome filtro\");\r\n d.componentInstance.done.subscribe((data) => {\r\n if (data?.value) {\r\n this.clipperService.saveSearch({\r\n module: ClipperModule.Ricerca,\r\n name: data.value,\r\n data: JSON.stringify(this.filterParams)\r\n }).subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n const newItem = { name: r.value.name ?? '', value: r.value };\r\n this.filters.update(items => [...items, newItem]);\r\n setTimeout(() => {\r\n this.filterSelector()?.select(newItem);\r\n }, 250);\r\n this.dialogService.toast(\"Operazione completata con successo.\");\r\n d.close();\r\n }\r\n });\r\n }\r\n });\r\n } else {\r\n this.clipperService.saveSearch({\r\n id: this.filterParams.searchId,\r\n data: JSON.stringify(this.filterParams)\r\n }).subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n this.filters.update(items => {\r\n const item = items.find(n => n.value.id === r.value.id);\r\n if (item) {\r\n item.value.data = r.value.data;\r\n }\r\n return [...items];\r\n });\r\n this.dialogService.toast(\"Operazione completata con successo.\");\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Prompts for confirmation and then deletes the currently active saved filter.\r\n */\r\n deleteFilter(): void {\r\n if (this.filterParams.searchId) {\r\n this.dialogService.confirm(\"Vuoi davvero eliminare il filtro in uso?\", \"Conferma\", \"Si, eliminalo\")\r\n .componentInstance.choosen\r\n .subscribe((data: DialogResult) => {\r\n if (data.result === 'ok') {\r\n if (this.filterParams.searchId) {\r\n this.clipperService.deleteSearch(this.filterParams.searchId)\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n this.filters.update(items => {\r\n const p = items.findIndex(x => x.value.id === this.filterParams.searchId);\r\n if (p !== -1) {\r\n items.splice(p, 1);\r\n }\r\n return [...items];\r\n });\r\n this.filterSelector()?.reset();\r\n this.filterParams.searchId = undefined;\r\n this.filterParams.searchName = undefined;\r\n this.dialogService.toast('Operazione completata con successo.');\r\n }\r\n });\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Applies a saved filter by deserializing its parameters into the current filter state.\r\n * @param item - The saved filter to apply, or undefined to clear the filter.\r\n */\r\n selectFilter(item: NameValueItem<ClipperUserSearch> | undefined): void {\r\n if (item && item.value.data) {\r\n this.filterSelector().select(item, false);\r\n const filter = JSON.parse(item.value.data);\r\n this.filterParams.searchId = item.value.id;\r\n this.filterParams.searchName = item.value.name;\r\n this.filterParams.modules = filter.modules;\r\n setTimeout(() => {\r\n this.filterParams.sectors = filter.sectors;\r\n this.filterParams.authors = filter.authors;\r\n this.filterParams.number = filter.number;\r\n this.filterParams.tags = filter.tags;\r\n this.filterParams.year = filter.year;\r\n if (filter.fromDate && filter.toDate) {\r\n this.interval.from = filter.fromDate;\r\n this.interval.to = filter.toDate;\r\n }\r\n this.filterParams.text = filter.text;\r\n this.filterParams.titleOnly = filter.titleOnly;\r\n this.filterParams.showCommentedDocumentsOnly = filter.showCommentedDocumentsOnly;\r\n this.filterParams.showNotAbrogatedDocumentsOnly = filter.showNotAbrogatedDocumentsOnly;\r\n this.filterParams.sourceNumber = filter.sourceNumber;\r\n this.filterParams.sourceYear = filter.sourceYear;\r\n if (filter.sourceFromDate && filter.sourceToDate) {\r\n this.sourceInterval.from = filter.sourceFromDate;\r\n this.sourceInterval.to = filter.sourceToDate;\r\n }\r\n this.filterParams.source = filter.source;\r\n this.filterParams.type = filter.type;\r\n this.filterParams.topic = filter.topic;\r\n this.filterParams.topics = filter.topics;\r\n this.filterParams.changeReason = filter.changeReason;\r\n this.filterParams.changedNumber = filter.changedNumber;\r\n this.filterParams.changedTitle = filter.changedTitle;\r\n this.filterParams.changedYear = filter.changedYear;\r\n this.filterParams.modifierNumber = filter.modifierNumber;\r\n this.filterParams.modifierTitle = filter.modifierTitle;\r\n this.filterParams.modifierYear = filter.modifierYear;\r\n // Show expansion panels\r\n if (this.filterParams.sourceNumber != undefined ||\r\n this.filterParams.sourceYear != undefined ||\r\n this.filterParams.source != undefined ||\r\n this.sourceInterval.from != undefined) {\r\n this.sourceExpansionPanel()?.open();\r\n }\r\n if (!this.isCoordination() && this.filterParams.sourceNumber != undefined ||\r\n this.filterParams.author != undefined ||\r\n this.filterParams.type != undefined) {\r\n this.otherOptionsExpansionPanel()?.open();\r\n } else if (this.isCoordination() && this.filterParams.changeReason != undefined) {\r\n this.otherOptionsExpansionPanel()?.open();\r\n }\r\n if (this.isCoordination() &&\r\n this.filterParams.modifierNumber != undefined ||\r\n this.filterParams.modifierYear != undefined ||\r\n this.filterParams.modifierTitle != undefined) {\r\n this.modifierExpansionPanel()?.open();\r\n }\r\n }, 250);\r\n } else {\r\n this.clearFilter();\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Clear current filter params\r\n */\r\n protected clearFilter() {\r\n ClipperSearchUtils.clear(this.filterParams);\r\n const module = this.modules().find(x => x.value === ClipperModule.NormativaVigente);\r\n if (module) {\r\n this.filterParams.modules = [module];\r\n }\r\n this.filterSelector()?.reset();\r\n this.filterParams.searchId = undefined;\r\n this.filterParams.searchName = undefined;\r\n this.interval.clear();\r\n this.sourceInterval.clear();\r\n }\r\n\r\n /**\r\n * Load selected filter\r\n */\r\n private loadFilter() {\r\n if (this.filterParams.year && this.filterParams.year > 0) {\r\n const year = this.filterParams.year;\r\n this.filterParams.fromDate = new Date(year, 0, 1, 2);\r\n this.filterParams.toDate = new Date(year, 11, 31, 2);\r\n } else {\r\n this.filterParams.year = undefined;\r\n }\r\n if (this.interval) {\r\n this.filterParams.fromDate = this.interval.from;\r\n this.filterParams.toDate = this.interval.to;\r\n }\r\n if (this.filterParams.sourceYear && this.filterParams.sourceYear > 0) {\r\n const year = this.filterParams.sourceYear;\r\n this.filterParams.sourceFromDate = new Date(year, 0, 1, 2);\r\n this.filterParams.sourceToDate = new Date(year, 11, 31, 2);\r\n } else {\r\n this.filterParams.sourceYear = undefined;\r\n }\r\n if (this.sourceInterval) {\r\n this.filterParams.sourceFromDate = this.sourceInterval.from;\r\n this.filterParams.sourceToDate = this.sourceInterval.to;\r\n }\r\n if (this.filterParams.text) {\r\n this.filterParams.text = ClipperSearchUtils.normalizeTextQuery(this.filterParams.text);\r\n }\r\n }\r\n\r\n /**\r\n * Apply current filter params\r\n */\r\n protected applyFilter() {\r\n if (this.canSearch()) {\r\n this.facets()?.reset();\r\n this.fetch(true);\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Manage sectors selection changes\r\n */\r\n protected sectorsChanged() {\r\n // Reset authors and types\r\n this.filterParams.authors = [];\r\n this.filterParams.type = undefined;\r\n let authors: NameValueItem<string>[] = [];\r\n const sectors =\r\n (this.filterParams.sectors?.length ?? 0) > 0\r\n ? this.filterParams.sectors\r\n : this.sectors();\r\n ClipperAuthors.forEach(n => {\r\n if (sectors &&\r\n sectors.length > 0 &&\r\n sectors.findIndex(x => x.value === n.sectorId) !== -1) {\r\n authors.push(n);\r\n }\r\n });\r\n if (authors.length == 0) {\r\n ClipperAuthors.forEach(n => {\r\n if (!n.sectorId) {\r\n authors.push(n);\r\n }\r\n });\r\n }\r\n let types: NameValueItem<string>[] = [];\r\n ClipperSectorTypes.forEach(n => {\r\n if (sectors &&\r\n sectors.length > 0 &&\r\n sectors.findIndex(x => x.value === n.parentValue) !== -1) {\r\n types.push(n);\r\n }\r\n });\r\n if (types.length == 0) {\r\n types = [...ClipperSectorTypes];\r\n }\r\n this.authors.set(authors.sort((a, b) => a.name.localeCompare(b.name)));\r\n this.types.set(types);\r\n }\r\n\r\n /**\r\n * Check if any search parameter has been set\r\n * @param params : the search params to check\r\n * @returns true if at least one parameters has been set\r\n */\r\n private isFiltering(params: ClipperSearchParams): boolean {\r\n return (params.sector !== null\r\n || (params.sectors?.length ?? 0) > 0\r\n || params.author !== null\r\n || (params.authors?.length ?? 0) > 0\r\n || params.topic !== null\r\n || (params.topics?.length ?? 0) > 0\r\n || params.taxonomy !== null\r\n || params.taxonomyPath !== null\r\n || params.taxonomyNode !== null\r\n || params.number !== null\r\n || params.fromDate !== null\r\n || params.toDate !== null\r\n || params.year !== null\r\n || params.sourceNumber !== null\r\n || params.source !== null\r\n || params.sourceFromDate !== null\r\n || params.sourceToDate !== null\r\n || params.sourceYear !== null\r\n || params.tag !== null\r\n || (params.tags?.length ?? 0) > 0\r\n || params.text !== null\r\n || params.titleOnly === true\r\n || params.type !== null\r\n || params.showUnreadDocumentsOnly === true\r\n || params.showCommentedDocumentsOnly === true\r\n || params.changeReason !== null\r\n || params.changedNumber !== null\r\n || params.changedYear !== null\r\n || params.changedTitle !== null\r\n || params.modifierNumber !== null\r\n || params.modifierYear !== null\r\n || params.modifierTitle !== null\r\n || params.model !== null\r\n || (params.models?.length ?? 0) > 0\r\n || params.module !== null\r\n || (params.modules?.length ?? 0) > 0\r\n || this.interval.from != null\r\n || this.interval.to != null\r\n || this.sourceInterval.from != null\r\n || this.sourceInterval.to != null);\r\n }\r\n\r\n\r\n /**\r\n * Checkif a single module is selected\r\n * @param module : the module to check\r\n * @returns : true if the specified module is the only one selected\r\n */\r\n private isSingleModule(module: ClipperModule): boolean {\r\n return (this.filterParams.modules?.length === 1 && this.filterParams.modules?.findIndex(x => x.value === module) !== -1);\r\n }\r\n\r\n /**\r\n * Update modules unread items\r\n */\r\n private updateModulesUnreadItems() {\r\n this.modules().forEach(module => {\r\n let totalUnread = 0;\r\n if (module.value === ClipperModule.News) {\r\n totalUnread = this.clipperService.dashboard.getUnreadItems(module.value, ClipperModel.News);\r\n } else if (module.value === ClipperModule.Approfondimenti) {\r\n totalUnread = this.clipperService.dashboard.getUnreadItems(module.value, ClipperModel.Articoli);\r\n } else if (module.value === ClipperModule.Giurisprudenza) {\r\n totalUnread = this.clipperService.dashboard.getUnreadItems(module.value, ClipperModel.Juris);\r\n } else if (module.value === ClipperModule.GiurisprudenzaRecente) {\r\n totalUnread = this.clipperService.dashboard.getUnreadItems(ClipperModule.Giurisprudenza, null);\r\n } else {\r\n totalUnread = this.clipperService.dashboard.getUnreadItems(module.value, null);\r\n }\r\n if (totalUnread > 0) {\r\n module.bag = totalUnread.toString();\r\n module.bagInfo = totalUnread + ' non letti';\r\n } else {\r\n module.bag = undefined;\r\n module.bagInfo = undefined;\r\n }\r\n });\r\n this.modules.update(values => [...values]);\r\n }\r\n\r\n /**\r\n * Checks if a module is supported\r\n * @param module : the module to check\r\n * @returns true if the module is supported\r\n */\r\n private hasModule(module: ClipperModule) {\r\n return (this.selectableModules().length === 0 || this.selectableModules().findIndex(x => x === module) !== -1) &&\r\n this.modules().findIndex(x => x.value === module) !== -1;\r\n }\r\n\r\n /**\r\n * Manage module selection changes \r\n */\r\n protected modulesChanged() {\r\n const hasModules = (this.filterParams.modules?.length ?? 0) > 0;\r\n // Update models\r\n if (!hasModules) {\r\n this.filterParams.models = [];\r\n // Update sectors\r\n this.sectors.set(ClipperSectors.filter(n => n.group === 'S').map(n => {\r\n return { name: n.shortName ?? n.name, value: n.value };\r\n }));\r\n } else {\r\n this.filterParams.models = ClipperSearchUtils.getModulesModels(this.filterParams.modules);\r\n // Update sectors\r\n if (this.isSingleModule(ClipperModule.ScadenzeESegnalazioni)) {\r\n this.sectors.set([]);\r\n } else if (this.isSingleModule(ClipperModule.GiurisprudenzaRecente)) {\r\n this.sectors.set(ClipperSectors.filter(n => n.group === 'S' && n.value[0] === 'G').map(n => {\r\n return { name: n.shortName ?? n.name, value: n.value };\r\n }));\r\n } else if (this.isLaws()) {\r\n this.sectors.set(ClipperSectors.filter(n => n.group === 'S').map(n => {\r\n return { name: n.shortName ?? n.name, value: n.value };\r\n }));\r\n }\r\n }\r\n this.selection?.clear();\r\n this.sectorsChanged();\r\n this.updateFilterPaneFocus();\r\n }\r\n\r\n /**\r\n * Checks the current module selection against a list of expected modules.\r\n * @param modules - The modules to check for.\r\n * @param mode - The check mode: 1) exactly these elements, 2) all of these elements, 3) any of these elements.\r\n * @returns True if the check passes.\r\n */\r\n private checkModules(modules: ClipperModule[], mode: number = 1): boolean {\r\n const currentModules = this.filterParams.modules;\r\n let ok: boolean = false;\r\n if (mode === 1) {\r\n // All and only the elements specified\r\n currentModules?.forEach(n => {\r\n ok = (modules.findIndex(x => x === n.value) ?? -1) !== -1;\r\n if (!ok) {\r\n return;\r\n }\r\n });\r\n return ok && modules.length >= (currentModules?.length ?? 0);\r\n } else if (mode === 2) {\r\n // All the elements specified\r\n modules.forEach(n => {\r\n ok = (currentModules?.findIndex(x => x.value === n) ?? -1) !== -1;\r\n if (!ok) {\r\n return;\r\n }\r\n });\r\n } else if (mode === 3) {\r\n // Any of the specified elements \r\n modules.forEach(n => {\r\n ok = (currentModules?.findIndex(x => x.value === n) ?? -1) !== -1;\r\n if (ok) {\r\n return;\r\n }\r\n });\r\n }\r\n return ok;\r\n }\r\n\r\n /**\r\n * Builds the effective query parameters for the next search request.\r\n * @param newSearch - When true, resets pagination and triggers facet loading. Defaults to false.\r\n * @returns The resolved {@link ClipperSearchParams} ready to be sent to the API.\r\n */\r\n private prepareFetch(newSearch: boolean = false): ClipperSearchParams {\r\n if (this.interval) {\r\n this.filterParams.fromDate = this.interval.fromAsDate;\r\n this.filterParams.toDate = this.interval.toAsDate;\r\n }\r\n if (this.sourceInterval) {\r\n this.filterParams.sourceFromDate = this.sourceInterval.fromAsDate;\r\n this.filterParams.sourceToDate = this.sourceInterval.toAsDate;\r\n }\r\n let newParams: ClipperSearchParams = new ClipperSearchParams();\r\n if ((this.filterParams.modules?.length ?? 0) > 0) {\r\n newParams.first = this.filterParams.first;\r\n newParams.channels = this.filterParams.channels\r\n newParams.count = this.filterParams.count;\r\n newParams.sortMode = this.filterParams.sortMode;\r\n if (this.isCoordination()) {\r\n newParams.models = [ClipperModel.Coordinamento];\r\n newParams.authors = this.filterParams.authors ?? [];\r\n newParams.sectors = this.filterParams.sectors ?? [];\r\n newParams.fromDate = this.filterParams.fromDate;\r\n newParams.toDate = this.filterParams.toDate;\r\n newParams.changeReason = this.filterParams.changeReason;\r\n newParams.changedNumber = this.filterParams.changedNumber;\r\n newParams.changedYear = this.filterParams.changedYear;\r\n newParams.changedTitle = this.filterParams.changedTitle;\r\n newParams.modifierNumber = this.filterParams.modifierNumber;\r\n newParams.modifierYear = this.filterParams.modifierYear;\r\n newParams.modifierTitle = this.filterParams.modifierTitle;\r\n } else {\r\n if (this.filterParams.text) {\r\n newParams.text = ClipperSearchUtils.normalizeTextQuery2(this.filterParams.text);\r\n }\r\n newParams.titleOnly = this.filterParams.titleOnly;\r\n newParams.fromDate = this.filterParams.fromDate;\r\n newParams.toDate = this.filterParams.toDate;\r\n newParams.models = ClipperSearchUtils.getModulesModels(this.filterParams.modules);\r\n if (this.checkModules([\r\n ClipperModule.News,\r\n ClipperModule.GazzetteBollettiniEFontiDiverse,\r\n ClipperModule.GiurisprudenzaRecente,\r\n ClipperModule.QuesitiECasiRisolti,\r\n ClipperModule.AllerteAlimentari], 1)) {\r\n newParams.showUnreadDocumentsOnly = this.filterParams.showUnreadDocumentsOnly;\r\n }\r\n if (this.checkModules([\r\n ClipperModule.NormativaVigente,\r\n ClipperModule.GazzetteBollettiniEFontiDiverse,\r\n ClipperModule.GiurisprudenzaRecente], 1)) {\r\n newParams.showCommentedDocumentsOnly = this.filterParams.showCommentedDocumentsOnly;\r\n newParams.showNotAbrogatedDocumentsOnly = this.filterParams.showNotAbrogatedDocumentsOnly;\r\n newParams.sectors = this.filterParams.sectors;\r\n newParams.number = this.filterParams.number;\r\n newParams.year = this.filterParams.year;\r\n newParams.topics = this.filterParams.topics;\r\n newParams.authors = this.filterParams.authors ?? [];\r\n if (newParams.authors.length == 0 && this.filterParams.author) {\r\n newParams.authors = [{ name: '?', value: this.filterParams.author }];\r\n }\r\n newParams.types = this.filterParams.types ?? [];\r\n if (newParams.types.length == 0 && this.filterParams.type) {\r\n newParams.types = [{ name: '?', value: this.filterParams.type }];\r\n }\r\n newParams.source = this.filterParams.source;\r\n newParams.sourceNumber = this.filterParams.sourceNumber;\r\n newParams.sourceYear = this.filterParams.sourceYear;\r\n newParams.sourceFromDate = this.filterParams.sourceFromDate;\r\n newParams.sourceToDate = this.filterParams.sourceToDate;\r\n }\r\n if (this.checkModules([ClipperModule.News], 1)) {\r\n newParams.tags = this.filterParams.tags;\r\n }\r\n }\r\n } else {\r\n newParams = SystemUtils.clone(this.filterParams) as ClipperSearchParams;\r\n newParams.channels = this.filterParams.channels\r\n newParams.authors = this.filterParams.authors ?? [];\r\n if (newParams.authors.length == 0 && this.filterParams.author) {\r\n newParams.authors = [{ name: '?', value: this.filterParams.author }];\r\n }\r\n newParams.types = this.filterParams.types ?? [];\r\n if (newParams.types.length == 0 && this.filterParams.type) {\r\n newParams.types = [{ name: '?', value: this.filterParams.type }];\r\n }\r\n if (newParams.text) {\r\n newParams.text = ClipperSearchUtils.normalizeTextQuery2(newParams.text);\r\n }\r\n newParams.titleOnly = this.filterParams.titleOnly;\r\n }\r\n // Setup sort options\r\n this.sortOptions.set(ClipperUtils.getClipperAvailableSortOptions(this.filterParams.modules, newParams));\r\n if (newParams.text && newSearch) {\r\n this.sortMode.set(this.sortOptions()[0]);\r\n this.changeDetector.markForCheck();\r\n }\r\n if (!this.sortMode() || this.sortOptions().findIndex((x: NameValueItem<ClipperSort>) => x.value === this.sortMode()?.value) === -1) {\r\n this.sortMode.set(this.sortOptions()[0]);\r\n }\r\n newParams.sortMode = this.sortMode()?.value;\r\n // Apply facets\r\n if (this.snapshot?.facets?.fromDate) {\r\n newParams.fromDate = this.snapshot.facets?.fromDate;\r\n newParams.toDate = this.snapshot.facets?.toDate;\r\n newParams.year = this.snapshot.facets?.fromDate.getFullYear();\r\n }\r\n if (this.snapshot?.facets?.sector) {\r\n if (this.snapshot?.facets?.sector) {\r\n const model: ClipperModel = parseInt(this.snapshot.facets?.sector) as ClipperModel;\r\n if (model > 0) {\r\n newParams.models = [model];\r\n } else\r\n newParams.sectors = [{ value: this.snapshot.facets?.sector ?? \"\", name: \"\" }];\r\n } else {\r\n if ((newParams.sectors?.length ?? 0) == 0)\r\n newParams.models = ClipperSearchUtils.getModulesModels(this.filterParams.modules);\r\n }\r\n }\r\n if (this.snapshot?.facets?.type) {\r\n newParams.types = [{ value: this.snapshot.facets.type ?? \"\", name: \"\" }];\r\n }\r\n if (this.snapshot?.facets?.author) {\r\n newParams.authors = [{ value: this.snapshot.facets?.author ?? \"\", name: \"\" }];\r\n }\r\n\r\n newParams.version = 7;\r\n newParams.count = 15;\r\n if (newSearch) {\r\n newParams.first = 0;\r\n this.filterParams.first = 0;\r\n }\r\n\r\n // Compute a filter description\r\n this.updateFilterDescription();\r\n\r\n return newParams;\r\n }\r\n\r\n /**\r\n * Update filter description\r\n */\r\n private updateFilterDescription() {\r\n let filterDescription = \"\";\r\n this.filterParams.modules?.forEach((n, i) => {\r\n if (i > 0) filterDescription += \", \";\r\n filterDescription += n.shortName;\r\n });\r\n if ((this.filterParams.sectors?.length ?? 0) > 0) {\r\n filterDescription += \" > \";\r\n this.filterParams.sectors?.forEach((n, i) => {\r\n if (i > 0) filterDescription += \", \";\r\n filterDescription += n.name;\r\n });\r\n }\r\n if ((this.filterParams.authors?.length ?? 0) > 0) {\r\n filterDescription += \" > \";\r\n this.filterParams.authors?.forEach((n, i) => {\r\n if (i > 0) filterDescription += \", \";\r\n filterDescription += n.name;\r\n });\r\n }\r\n this.filterDescription.set(filterDescription);\r\n }\r\n\r\n /**\r\n * Fetches and applies search facets for the current result set.\r\n * @param params - The search parameters used to query facets.\r\n */\r\n protected fetchFacets(params: ClipperSearchParams): void {\r\n if (!this.clipperService.loggedIn()) return;\r\n this.filterBusy.set(true);\r\n this.clipperService.queryFacets(params)\r\n .subscribe({\r\n next: r => {\r\n if (r.success) {\r\n let hasFacets = (r.value.facets?.length ?? 0) > 0;\r\n if (r.value.facets) {\r\n this.facets()?.update(r.value.facets, r.value.interval);\r\n if (this.facets && this.snapshot) {\r\n hasFacets = this.facets().hasFacets();\r\n this.snapshot.facets = this.facets().save();\r\n this.snapshot.facets.hasTooManyResults = (this.snapshot?.total ?? 0) >= 1000;\r\n }\r\n }\r\n this.hasFacets.set(hasFacets);\r\n this.handleFilterPaneVisibility();\r\n }\r\n },\r\n complete: () => {\r\n this.filterBusy.set(false);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Hide facets\r\n */\r\n protected hideFacets() {\r\n this.hasFacets.set(false);\r\n this.facets()?.reset();\r\n this.filterPane2().close();\r\n this.filterPane2Closed.set(false);\r\n }\r\n\r\n /**\r\n * Executes the search query and updates the result snapshot.\r\n * @param newSearch - When true, resets pagination and reloads facets. Defaults to false.\r\n */\r\n protected fetch(newSearch: boolean = false): void {\r\n const searchParams = this.prepareFetch(newSearch);\r\n this.dialogService.busy('Ricerca in corso...');\r\n this.clipperService.query(searchParams)\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) this.dialogService.error(r.message);\r\n else {\r\n // Handle data\r\n this.prepareResults(r.value, newSearch);\r\n // Handle facets\r\n if (this.snapshot?.total ?? 0 > 0) {\r\n if (newSearch) {\r\n this.fetchFacets(searchParams);\r\n }\r\n } else {\r\n this.hideFacets();\r\n }\r\n\r\n if (newSearch) {\r\n if (this.paginator()) {\r\n this.paginator().pageIndex = 0;\r\n }\r\n }\r\n\r\n this.scroll(0);\r\n this.handleFilterPaneVisibility();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Navigate to a new result page.\r\n * @param e - The paginator {@link PageEvent} containing the new page index and size.\r\n */\r\n protected fetchMore(e: PageEvent): void {\r\n let first = e.pageIndex * (this.filterParams.count ?? 15);\r\n this.filterParams.first = first;\r\n this.fetch();\r\n }\r\n\r\n\r\n /**\r\n * Change the current sort mode and refresh results.\r\n * @param newSort - The new sort option to apply.\r\n */\r\n protected sort(newSort?: NameValueItem<ClipperSort>): void {\r\n if (newSort) {\r\n this.sortMode.set(newSort);\r\n this.fetch();\r\n }\r\n }\r\n\r\n /**\r\n * Open the free-text search help dialog.\r\n */\r\n protected help(): void {\r\n import('../search-free-text-help/search-free-text-help.component').then(({ ClipperSearchFreeTextHelpComponent }) => {\r\n this.dialogService.open(ClipperSearchFreeTextHelpComponent, {\r\n ariaLabel: 'informazioni ricerca',\r\n autoFocus: false,\r\n restoreFocus: true,\r\n disableClose: false,\r\n minWidth: '375px',\r\n maxWidth: '800px',\r\n width: '99%',\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Open the query-builder dialog to compose a free-text search expression.\r\n */\r\n protected compose(): void {\r\n import('../search-free-text-query-builder/search-free-text-query-builder.component').then(({ ClipperSearchFreeTextQueryBuilderComponent }) => {\r\n const d = this.dialogService.open(ClipperSearchFreeTextQueryBuilderComponent, {\r\n ariaLabel: 'costruisci ricerca',\r\n autoFocus: false,\r\n restoreFocus: true,\r\n disableClose: false,\r\n minWidth: '375px',\r\n maxWidth: '500px',\r\n width: '99%',\r\n });\r\n d.componentInstance.done.subscribe((result: SearchFreeTextQueryParams) => {\r\n this.filterParams.text = result.query;\r\n this.changeDetector.markForCheck();\r\n d.close();\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Open the topic-selection dialog and append the chosen topics to the current filter.\r\n */\r\n protected addTopic(): void {\r\n this.dialogService\r\n .selectTree(\r\n this.topics,\r\n 'Seleziona un argomento',\r\n undefined,\r\n (this.filterParams.topics && this.filterParams.topics.length > 0)\r\n ? this.filterParams.topics[this.filterParams.topics.length - 1].name\r\n : undefined\r\n )\r\n .componentInstance.done.subscribe(r => {\r\n if (!this.filterParams.topics) {\r\n this.filterParams.topics = [];\r\n }\r\n r.selectedItems.forEach(item => {\r\n this.filterParams.topics?.push({ name: item.bag.name, value: item.bag.id });\r\n this.changeDetector.markForCheck();\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Remove a topic from the current filter.\r\n * @param item - The topic item to remove.\r\n */\r\n protected deleteTopic(item: NameValueItem<string>): void {\r\n const p = this.filterParams.topics?.findIndex(x => x.value === item.value) ?? -1;\r\n if (p !== -1) {\r\n this.filterParams.topics?.splice(p, 1);\r\n this.changeDetector.markForCheck();\r\n }\r\n }\r\n\r\n /**\r\n * Remove all topics from the current filter.\r\n */\r\n protected clearTopics(): void {\r\n this.filterParams.topics = []\r\n this.changeDetector.markForCheck();\r\n }\r\n\r\n}\r\n\r\n\r\n","<mat-drawer-container [hasBackdrop]=\"filterPaneHasBackdrop()\" class=\"fill\">\r\n <mat-drawer #filterPane class=\"drawer\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"78px\" class=\"title-container\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"start center\" fxFill>\r\n <div class=\"title\">Filtro</div>\r\n <div fxFlex=\"*\" fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" mat-icon-button (click)=\"saveFilter(true)\"\r\n matTooltip=\"Crea una nuovo filtro con i parametri attuali \"><mat-icon>add</mat-icon></button>\r\n <button fxFlexAlign=\"center\" mat-icon-button (click)=\"toggleFilterPane()\"\r\n matTooltip=\"Nascondi\"><mat-icon>left_panel_close</mat-icon></button>\r\n </div>\r\n </div>\r\n </div>\r\n @if(hasFilters()) {\r\n <div style=\"padding:10px 20px\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlex=\"*\">\r\n <button-selector #filterSelector [options]=\"filters()\" label=\"Seleziona un filtro salvato\"\r\n labelSelected=\"Filtro in uso:\" fxFlexAlign=\"center\" (selected)=\"selectFilter($event)\"\r\n [matTooltip]=\"filterParams.searchName ?? ''\"></button-selector>\r\n </div>\r\n @if(filterParams.searchId) {\r\n <div fxFlex=\"40px\">\r\n <button fxFlexAlign=\"center\" mat-icon-button (click)=\"deleteFilter()\"\r\n matTooltip=\"Elimina il filtro in uso\"><mat-icon>delete</mat-icon></button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n <div fxFlex=\"*\" class=\"content scroll-hidden\" style=\"padding-bottom: 10px;\">\r\n <div class=\"scroll-auto\" style=\"padding: 0 10px;\">\r\n <form name=\"form\" #f=\"ngForm\" (keyup.Enter)=\"applyFilter()\" novalidate>\r\n <mat-accordion multi displayMode=\"flat\">\r\n <mat-expansion-panel expanded class=\"accordion-panel mat-elevation-z0 \">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Cerca in..\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <chips-selector #moduleSelector [(ngModel)]=\"filterParams.modules\" [collapseAt]=\"599\" [multiple]=\"true\"\r\n label=\"Sezioni\" name=\"modules\" [options]=\"filteredModules()\" (changed)=\"modulesChanged()\">\r\n </chips-selector>\r\n </mat-expansion-panel>\r\n\r\n @if((hasTags() || hasTopics()) && !isCoordination()) {\r\n <mat-expansion-panel class=\"accordion-panel mat-elevation-z0\">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Argomenti\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n @if(hasTags()) {\r\n <chips-selector [collapseAt]=\"599\" [(ngModel)]=\"filterParams.tags\" [multiple]=\"true\" name=\"tags\"\r\n label=\"Argomenti\" [options]=\"tags()\"></chips-selector>\r\n }\r\n @if(hasTopics()) {\r\n @if ((filterParams.topics?.length ?? 0) > 0) {\r\n <mat-chip-grid #topics [(ngModel)]=\"filterParams.topics\" name=\"topics\" style=\"padding-bottom: 5px;\">\r\n @for (o of filterParams.topics; track $index) {\r\n <mat-chip-row [value]=\"o\" (removed)=\"deleteTopic(o)\">\r\n {{o.name}}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button></mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n <input style=\"display: none;\" [matChipInputFor]=\"topics\" />\r\n }\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\">\r\n <button mat-button type=\"button\" (click)=\"addTopic()\"><mat-icon>add</mat-icon> Aggiungi\r\n argomento</button>\r\n @if ((filterParams.topics?.length ?? 0) > 0) {\r\n <button mat-button type=\"button\" (click)=\"clearTopics()\"><mat-icon>delete</mat-icon> Azzera</button>\r\n }\r\n </div>\r\n }\r\n </mat-expansion-panel>\r\n }\r\n @if(hasSectors()) {\r\n <mat-expansion-panel class=\"accordion-panel mat-elevation-z0 \">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Settori\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <chips-selector [collapseAt]=\"599\" [(ngModel)]=\"filterParams.sectors\" [multiple]=\"true\" name=\"sectors\"\r\n label=\"Settori\" [options]=\"sectors()\" (changed)=\"sectorsChanged()\" />\r\n @if(hasRegions())\r\n {\r\n <mat-divider style=\"padding-top: 8px; margin-top:8px\"></mat-divider>\r\n <chips-selector [(ngModel)]=\"filterParams.authors\" [multiple]=\"true\" name=\"authors\" mode=\"collapsed\"\r\n label=\"Tutte le regioni\" [options]=\"regions()\" />\r\n }\r\n </mat-expansion-panel>\r\n }\r\n @if(!isCoordination()) {\r\n <mat-expansion-panel expanded class=\"accordion-panel mat-elevation-z0 \">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Documento\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div fxLayout=\"column\">\r\n @if(isLaws()) {\r\n <div fxLayout=\"row wrap\" fxLayoutAlign=\"space-between center\" fxFill>\r\n <mat-form-field fxFlex=\"59\" fxFlex.xs=\"49\">\r\n <mat-label>Numero</mat-label>\r\n <input matInput maxlength=\"10\" [(ngModel)]=\"filterParams.number\" name=\"number\"\r\n #filterByNumber=\"matInput\" />\r\n @if (filterParams.number) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.number = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxFlex=\"39\" fxFlex.xs=\"49\">\r\n <mat-label>Anno</mat-label>\r\n <input type=\"number\" min=\"1750\" matInput maxlength=\"4\" [(ngModel)]=\"filterParams.year\"\r\n name=\"year\" />\r\n @if (filterParams.year) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.year = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n <mat-form-field>\r\n <mat-label>Intervallo di pubblicazione</mat-label>\r\n <mat-date-range-input [rangePicker]=\"picker1\">\r\n <input matStartDate [(ngModel)]=\"interval.from\" [dateIntervalChange]=\"interval\"\r\n #rangeFrom1=\"ngModel\" name=\"rangeFrom1\" placeholder=\"Da data\">\r\n <input matEndDate [(ngModel)]=\"interval.to\" [dateIntervalChange]=\"interval\" [end]=\"true\"\r\n #rangeTo1=\"ngModel\" name=\"rangeTo1\" placeholder=\"A data\">\r\n </mat-date-range-input>\r\n @if (interval.from || interval.to) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"interval.clear()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-datepicker-toggle matSuffix [for]=\"picker1\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker1></mat-date-range-picker>\r\n @if (rangeFrom1.invalid || rangeTo1.invalid) {\r\n <mat-error>Intervallo non valido.</mat-error>\r\n }\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>Testo</mat-label>\r\n <input matInput maxlength=\"200\" [(ngModel)]=\"filterParams.text\" name=\"text\"\r\n #filterByText=\"matInput\" />\r\n @if (filterParams.text) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.text = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix matTooltip=\"Opzioni\"\r\n aria-label=\"Opzioni\"\r\n [matMenuTriggerFor]=\"filterPaneOptionsMenu\"><mat-icon>more_vert</mat-icon></button>\r\n </mat-form-field>\r\n <div>\r\n @if(filterParams.text) {\r\n <div style=\"padding-bottom:10px\">\r\n <mat-slide-toggle [(ngModel)]=\"filterParams.titleOnly\" name=\"titleOnly\">Cerca solo nel\r\n titolo</mat-slide-toggle>\r\n </div>\r\n }\r\n @if(isLaws(false)) {\r\n <div style=\"padding-bottom:10px\">\r\n <mat-slide-toggle [(ngModel)]=\"filterParams.showNotAbrogatedDocumentsOnly\"\r\n name=\"showNotAbrogatedDocumentsOnly\">Mostra solo elementi non abrogati</mat-slide-toggle>\r\n </div>\r\n <div style=\"padding-bottom:10px\">\r\n <mat-slide-toggle [(ngModel)]=\"filterParams.showCommentedDocumentsOnly\"\r\n name=\"showCommentedDocumentsOnly\">Mostra solo elementi con commenti</mat-slide-toggle>\r\n </div>\r\n }\r\n @if(isReadable()) {\r\n <div style=\"padding-bottom:10px\">\r\n <mat-slide-toggle [(ngModel)]=\"filterParams.showUnreadDocumentsOnly\"\r\n name=\"showUnreadDocumentsOnly\">Mostra solo elementi non letti</mat-slide-toggle>\r\n </div>\r\n }\r\n\r\n </div>\r\n </div>\r\n </mat-expansion-panel>\r\n @if(isLaws(false)) {\r\n <mat-expansion-panel #sourceExpansionPanel class=\"accordion-panel mat-elevation-z0 \">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Fonte\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div fxLayout=\"column\">\r\n <div fxLayout=\"row wrap\" fxLayoutAlign=\"space-between center\" fxFill>\r\n <mat-form-field fxFlex=\"59\" fxFlex.xs=\"100\">\r\n <mat-label>Numero</mat-label>\r\n <input matInput maxlength=\"10\" [(ngModel)]=\"filterParams.sourceNumber\" name=\"sourceNumber\" />\r\n @if (filterParams.sourceNumber) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.sourceNumber = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxHide.xs fxFlex=\"39\" fxFlex.xs=\"100\">\r\n <mat-label>Anno</mat-label>\r\n <input type=\"number\" min=\"1750\" matInput maxlength=\"4\" [(ngModel)]=\"filterParams.sourceYear\"\r\n name=\"sourceYear\" />\r\n @if (filterParams.sourceYear) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.sourceYear = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <mat-form-field>\r\n <mat-label>Intervallo di pubblicazione</mat-label>\r\n <mat-date-range-input [rangePicker]=\"picker2\">\r\n <input matStartDate [(ngModel)]=\"sourceInterval.from\" [dateIntervalChange]=\"sourceInterval\"\r\n #rangeFrom2=\"ngModel\" name=\"rangeFrom2\" placeholder=\"Da data\">\r\n <input matEndDate [(ngModel)]=\"sourceInterval.to\" [dateIntervalChange]=\"sourceInterval\"\r\n [end]=\"true\" #rangeTo2=\"ngModel\" name=\"rangeTo2\" placeholder=\"A data\">\r\n </mat-date-range-input>\r\n @if (sourceInterval.from || sourceInterval.to) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"sourceInterval.clear()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-datepicker-toggle matSuffix [for]=\"picker2\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker2></mat-date-range-picker>\r\n @if (rangeFrom2.invalid || rangeTo2.invalid) {\r\n <mat-error>Intervallo non valido.</mat-error>\r\n }\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>Tipo</mat-label>\r\n <mat-select [(ngModel)]=\"filterParams.source\" name=\"source\">\r\n @for (s of sources(); track $index) {\r\n <mat-option [value]=\"s.value\" [matTooltip]=\"s.name\">\r\n {{s.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n </div>\r\n </mat-expansion-panel>\r\n <mat-expansion-panel #otherOptionsExpansionPanel class=\"accordion-panel mat-elevation-z0\">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Altre opzioni\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div fxLayout=\"column\">\r\n @if(authors().length > 0 && !hasRegions()) {\r\n <mat-form-field>\r\n <mat-label>Autore</mat-label>\r\n <mat-select [(ngModel)]=\"filterParams.author\" name=\"author\">\r\n @for (a of authors(); track $index) {\r\n <mat-option [value]=\"a.value\" [matTooltip]=\"a.name\">\r\n {{a.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n <mat-form-field>\r\n <mat-label>Tipo documento</mat-label>\r\n <mat-select [(ngModel)]=\"filterParams.type\" name=\"type\">\r\n @for (t of types(); track $index) {\r\n <mat-option [value]=\"t.value\" [matTooltip]=\"t.name\">\r\n {{t.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n </mat-expansion-panel>\r\n }\r\n } @else {\r\n <mat-expansion-panel expanded class=\"accordion-panel mat-elevation-z0 \">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Periodo\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <mat-form-field style=\"width:100%\">\r\n <mat-label>Intervallo di pubblicazione</mat-label>\r\n <mat-date-range-input [rangePicker]=\"picker1\">\r\n <input matStartDate [(ngModel)]=\"interval.from\" [dateIntervalChange]=\"interval\"\r\n #rangeFrom1=\"ngModel\" name=\"rangeFrom1\" placeholder=\"Da data\">\r\n <input matEndDate [(ngModel)]=\"interval.to\" [dateIntervalChange]=\"interval\" [end]=\"true\"\r\n #rangeTo1=\"ngModel\" name=\"rangeTo1\" placeholder=\"A data\">\r\n </mat-date-range-input>\r\n @if (interval.from || interval.to) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"interval.clear()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-datepicker-toggle matSuffix [for]=\"picker1\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker1></mat-date-range-picker>\r\n @if (rangeFrom1.invalid || rangeTo1.invalid) {\r\n <mat-error>Intervallo non valido.</mat-error>\r\n }\r\n </mat-form-field>\r\n @if(isReadable()) {\r\n <div style=\"padding-bottom:10px\">\r\n <mat-slide-toggle [(ngModel)]=\"filterParams.showUnreadDocumentsOnly\"\r\n name=\"showUnreadDocumentsOnly\">Mostra solo elementi non letti</mat-slide-toggle>\r\n </div>\r\n }\r\n </mat-expansion-panel>\r\n <mat-expansion-panel expanded class=\"accordion-panel mat-elevation-z0 \">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Documento modificato\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div fxLayout=\"column\">\r\n <div fxLayout=\"row wrap\" fxLayoutAlign=\"space-between center\" fxFill>\r\n <mat-form-field fxFlex=\"59\" fxFlex.xs=\"100\">\r\n <mat-label>Numero</mat-label>\r\n <input matInput maxlength=\"10\" [(ngModel)]=\"filterParams.changedNumber\" name=\"changedNumber\"\r\n #filterByChangeNumber=\"matInput\" />\r\n @if (filterParams.changedNumber) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.changedNumber = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxHide.xs fxFlex=\"39\" fxFlex.xs=\"100\">\r\n <mat-label>Anno</mat-label>\r\n <input type=\"number\" min=\"1750\" matInput maxlength=\"4\" [(ngModel)]=\"filterParams.changedYear\"\r\n name=\"changedYear\" />\r\n @if (filterParams.changedYear) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.changedYear = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <mat-form-field>\r\n <mat-label>Titolo</mat-label>\r\n <input matInput maxlength=\"200\" [(ngModel)]=\"filterParams.changedTitle\" name=\"changedTitle\" />\r\n @if (filterParams.changedTitle) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.changedTitle = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </mat-expansion-panel>\r\n <mat-expansion-panel #modifierOptionsExpansionPanel class=\"accordion-panel mat-elevation-z0 \">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Documento modificante\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div fxLayout=\"column\">\r\n <div fxLayout=\"row wrap\" fxLayoutAlign=\"space-between center\" fxFill>\r\n <mat-form-field fxFlex=\"59\" fxFlex.xs=\"100\">\r\n <mat-label>Numero</mat-label>\r\n <input matInput maxlength=\"10\" [(ngModel)]=\"filterParams.modifierNumber\" name=\"modifierNumber\" />\r\n @if (filterParams.changedNumber) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.modifierNumber = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxHide.xs fxFlex=\"39\" fxFlex.xs=\"100\">\r\n <mat-label>Anno</mat-label>\r\n <input type=\"number\" min=\"1750\" matInput maxlength=\"4\" [(ngModel)]=\"filterParams.modifierYear\"\r\n name=\"modifierYear\" />\r\n @if (filterParams.modifierYear) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.modifierYear = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <mat-form-field>\r\n <mat-label>Titolo</mat-label>\r\n <input matInput maxlength=\"200\" [(ngModel)]=\"filterParams.modifierTitle\" name=\"modifierTitle\" />\r\n @if (filterParams.modifierTitle) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.modifierTitle = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </mat-expansion-panel>\r\n <mat-expansion-panel #otherOptionsExpansionPanel class=\"accordion-panel mat-elevation-z0\">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Altre opzioni\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div fxLayout=\"column\">\r\n <mat-form-field>\r\n <mat-label>Motivo</mat-label>\r\n <mat-select [(ngModel)]=\"filterParams.changeReason\" name=\"changeReason\">\r\n @for (r of reasons(); track $index) {\r\n <mat-option [value]=\"r.value\" [matTooltip]=\"r.name\">\r\n {{r.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </mat-expansion-panel>\r\n }\r\n </mat-accordion>\r\n </form>\r\n </div>\r\n </div>\r\n @if(showChannels()) {\r\n <div style=\"padding:10px\">\r\n <div fxLayout=\"column\">\r\n <mat-expansion-panel class=\"accordion-panel mat-elevation-z0\" style=\"margin-bottom: 10px;\">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Canali\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n @for (c of clipperService.availableChannels(); track $index) {\r\n <div class=\"channel-box\" [class.channel-disabled]=\"!c.active || c.disabled\" [matTooltip]=\"c.name\">\r\n <span class=\"label\">{{c.header}}</span>\r\n </div>\r\n }\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n <chips-selector [collapseAt]=\"599\" [(ngModel)]=\"filterParams.channels\" [multiple]=\"true\" name=\"channels\"\r\n label=\"Canali\" [options]=\"clipperService.availableChannels()\"\r\n (changed)=\"channelsChanged()\"></chips-selector>\r\n\r\n </mat-expansion-panel>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlex=\"*\" fxFlexAlign=\"end\">\r\n <button mat-stroked-button (click)=\"clearFilter()\">Pulisci</button>\r\n <button mat-stroked-button (click)=\"saveFilter()\" style=\"margin-left: 10px;\">Salva</button>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"end\" mat-flat-button (click)=\"applyFilter()\"\r\n [disabled]=\"!canSearch()\">Applica</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mat-drawer>\r\n <div fxLayout=\"column\" fxLayoutGap=\"10px\" fxFill class=\"drawer-content scroll-hidden\">\r\n <div class=\"module-toolbar \">\r\n <div fxLayout=\"row wrap\" fxLayoutAlign=\"space-between\" fxFill>\r\n <div fxFlex=\"49\" fxFlex.lt-md=\"100\" style=\"padding-left: 10px; padding-bottom: 5px;\">\r\n @if(!filterPane.opened) {\r\n <button-toggle cssClass=\"small\" cssClassSmall=\"x-small\" iconOn=\"left_panel_close\" iconOff=\"tune\"\r\n labelOn=\"Nascondi<br>filtri\" labelOff=\"Mostra<br>filtri\" [value]=\"filterPane.opened\"\r\n (changed)=\"toggleFilterPane()\"></button-toggle>\r\n }\r\n </div>\r\n <div fxFlex=\"49\" fxFlex.lt-md=\"100\" fxLayoutAlign=\"end\">\r\n <div fxLayout=\"row\" style=\"height:48px; padding-bottom: 5px;\">\r\n @if((snapshot?.total ?? 0) > 0) {\r\n @if(sortOptions().length > 0) {\r\n <button-selector [options]=\"sortOptions()\" label=\"Ordina per:\" style=\"margin-right: 5px;\" [border]=\"0\"\r\n fxFlexAlign=\"center\" [ngModel]=\"sortMode()\" name=\"sortMode\" (selected)=\"sort($event)\"></button-selector>\r\n }\r\n <button fxFlexAlign=\"center\" mat-icon-button matSuffix matTooltip=\"Opzioni sulla selezione\"\r\n aria-label=\"Opzioni sulla selezione\" [matMenuTriggerFor]=\"selectionOptionsMenu\"\r\n [matBadge]=\"countSelections()\"><mat-icon>checklist</mat-icon></button>\r\n <button fxFlexAlign=\"center\" mat-icon-button matTooltip=\"Salva elenco in Excel \"\r\n (click)=\"exportResults()\"><mat-icon>save_alt</mat-icon></button>\r\n @if (!filterPane2?.opened && hasFacets()){\r\n <button fxFlexAlign=\"center\" mat-icon-button matTooltip=\"Affina ricerca\"\r\n (click)=\"toggleFilterPane2()\"><mat-icon>right_panel_open</mat-icon></button>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" class=\"module-content\">\r\n <mat-drawer-container [hasBackdrop]=\"filterPane2HasBackdrop()\" class=\"fill\">\r\n <mat-drawer #filterPane2 class=\"drawer-small drawer-with-loader\" position=\"end\" opened=\"false\">\r\n @if (filterBusy()) {\r\n <div class=\"overlay\"></div>\r\n }\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"6px\">\r\n @if (filterBusy()) {\r\n <mat-progress-bar style=\"z-index: 11;\" mode=\"indeterminate\">\r\n </mat-progress-bar>\r\n }\r\n </div>\r\n <div fxFlex=\"78px\" class=\"title-container-with-loader\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFill>\r\n <div class=\"title\">Affina ricerca</div>\r\n <div fxFlex=\"*\" fxLayoutAlign=\"end\">\r\n <button mat-icon-button (click)=\"toggleFilterPane2()\"\r\n matTooltip=\"Nascondi\"><mat-icon>right_panel_close</mat-icon></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" class=\"content scroll-hidden\" style=\"padding: 0 5px;\">\r\n <clipper-search-facets #facets></clipper-search-facets>\r\n\r\n </div>\r\n </div>\r\n </mat-drawer>\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"*\" [id]=\"scrollerId\" cdkScrollable class=\"scroll-auto\" style=\"padding: 0 20px;\">\r\n @if (!snapshot?.total) {\r\n <div class=\"message-container\">\r\n @if(snapshot?.total === 0) {\r\n <p class=\"message\"><b>Nessun elemento da visualizzare.</b></p>\r\n } @else {\r\n <div class=\"message\">\r\n <p fxHide.xs><b>Esegui una ricerca compilando i campi necessari nella maschera di ricarca qui a\r\n fianco.</b></p>\r\n <p fxHide.gt-xs><b>Fai click sul bottone <span class=\"accent\"><mat-icon>tune</mat-icon></span> ed esegui\r\n una\r\n ricerca compilando i campi necessari.</b></p>\r\n <p>E' possibile salvare i parametri delle le ricerche più utilizzate facendo clic su \r\n <mat-icon\r\n style=\"display: inline-flex; border-radius: 9999px; height: 25px; width: 25px; color: var(--ars-color-text-low); background-color: var(--ars-color-accent);\">add</mat-icon>.\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n @if (snapshot && (snapshot.total ?? 0) > 0) {\r\n @for (item of snapshot.items; track $index; let i = $index) {\r\n @if (item.group && isSortedByDate()) {\r\n <div class=\"items-group-title\">\r\n <div [class.group-spaced]=\"i > 0\">{{item.group}}</div>\r\n </div>\r\n }\r\n <clipper-search-result-item [item]=\"item\" [parent]=\"this\" [displayModelName]=\"true\" [actions]=\"contextMenu\"\r\n [isReadable]=\"true\"></clipper-search-result-item>\r\n }\r\n }\r\n }\r\n </div>\r\n <!-- footer -->\r\n @if ((snapshot?.total ?? 0) > 0) {\r\n <div class=\"items-footer\">\r\n <div fxLayout=\"row wrap\" fxLayoutGap=\"10px\" fxLayoutAlign=\"space-between center\" fxFill>\r\n <!-- legend -->\r\n <div fxFlex.lt-md=\"100\" class=\"legend-container\">\r\n <div class=\"legend unread-bg\"></div>\r\n non letto\r\n <!--<div class=\"legend next very-popular-bg\"></div>\r\n molto citato\r\n <div class=\"legend next popular-bg\"></div>\r\n citato-->\r\n <div class=\"legend next expired-bg \"></div>\r\n non più vigente\r\n </div>\r\n <div fxFlex.lt-md=\"100\" fxLayoutAlign=\"end\" [class.wide]=\"filterPane2?.opened\">\r\n <div fxLayout=\"row\">\r\n <mat-paginator fxFlexAlign=\"center\" #paginator class=\"paginator\" [hidePageSize]=\"true\"\r\n [length]=\"snapshot?.total ?? 0\" [pageSize]=\"filterParams.count\" [showFirstLastButtons]=\"true\"\r\n (page)=\"fetchMore($event)\">\r\n </mat-paginator>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mat-drawer-container>\r\n </div>\r\n </div>\r\n</mat-drawer-container>\r\n<mat-menu #filterPaneOptionsMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"compose()\">\r\n <mat-icon>build</mat-icon>Componi\r\n </button>\r\n <button mat-menu-item (click)=\"help()\">\r\n <mat-icon>help</mat-icon>Come usare la ricerca in testo libero\r\n </button>\r\n</mat-menu>\r\n<mat-menu #selectionOptionsMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"selectAll()\">\r\n <mat-icon>select_all</mat-icon>Seleziona tutti\r\n </button>\r\n <clipper-document-menu [parent]=\"this\" [useSelections]=\"true\" [isReadable]=\"true\" [canUseArchive]=\"false\"\r\n [canUseCalendar]=\"false\" [canUseAIAssistant]=\"hasAIAssistant()\" [canUseRS]=\"showRSOptions()\">\r\n </clipper-document-menu>\r\n</mat-menu>\r\n<mat-menu #contextMenu=\"matMenu\" (closed)=\"updateMenuButtonsVisibility()\">\r\n <ng-template matMenuContent let-item=\"item\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"item\" [isReadable]=\"true\" [canUseArchive]=\"false\"\r\n [canUseCalendar]=\"false\" [canUseAIAssistant]=\"hasAIAssistant()\" [canUseRS]=\"showRSOptions()\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n</mat-menu>","import { ChangeDetectionStrategy, Component, DestroyRef, effect, inject, viewChild } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MAT_DIALOG_DATA, MatDialogClose, MatDialogContent, MatDialogRef } from '@angular/material/dialog';\r\nimport { ClipperMessages, ClipperModule, ClipperSelectionMode, ClipperService, ClipperUtils } from '@arsedizioni/ars-utils/clipper.common';\r\nimport { BroadcastService, SystemUtils, ThemeType } from '@arsedizioni/ars-utils/core';\r\nimport { ClipperBrowserComponent } from '../browser.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\n\r\n\r\nexport interface ClipperBrowserDialogData {\r\n showChannels?: boolean;\r\n selectionMode?: ClipperSelectionMode;\r\n selectableModules?: ClipperModule[];\r\n selectionMessage?: string;\r\n initialModule?: number;\r\n theme?: ThemeType;\r\n}\r\n\r\n@Component({\r\n host: { 'Bind': SystemUtils.generateUUID() },\r\n templateUrl: './browser-dialog.component.html',\r\n styleUrls: ['./browser-dialog.component.scss'],\r\n imports: [MatDialogClose, MatDialogContent, MatButtonModule, MatBadgeModule, MatIconModule, FlexLayoutModule, ClipperBrowserComponent],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ClipperBrowserDialogComponent {\r\n private readonly destroyRef = inject(DestroyRef);\r\n readonly clipperBrowser = viewChild.required<ClipperBrowserComponent>('clipperBrowser');\r\n protected clipperService = inject(ClipperService);\r\n protected dialogData: ClipperBrowserDialogData = inject(MAT_DIALOG_DATA);\r\n private dialogRef = inject(MatDialogRef<ClipperBrowserDialogComponent>);\r\n private broadcastService = inject(BroadcastService);\r\n\r\n constructor() {\r\n // Apply the selection mode from dialog data once the browser view is available.\r\n // Falls back to ClipperSelectionMode.None when selectionMode is not provided.\r\n effect(() => {\r\n this.clipperBrowser().selectionMode.set(this.dialogData.selectionMode ?? ClipperSelectionMode.None);\r\n });\r\n\r\n // Subscribe to inner document-selection events and forward them as dialog output.\r\n this.broadcastService.getMessage()\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(message => {\r\n if (message.id === ClipperMessages.DOCUMENT_SELECTED_INNER) {\r\n const documentId: string | undefined = message.data.documentId ?? message.data.id;\r\n const document = documentId != null ? this.clipperBrowser().getSnapshotDocument(documentId) : undefined;\r\n if (document) {\r\n this.broadcastService.sendMessage(\r\n this.dialogData.selectionMessage ?? ClipperMessages.DOCUMENT_SELECTED, [document]);\r\n this.dialogRef.close();\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Determines whether the current selection satisfies the required selection mode\r\n * and module constraints defined in the dialog data.\r\n *\r\n * @returns `true` if the selection is valid and can be confirmed; `false` otherwise.\r\n */\r\n protected canSelect(): boolean {\r\n const selection = this.clipperBrowser().selection;\r\n const selectionCount = selection?.all?.length ?? 0;\r\n const mode = this.dialogData.selectionMode;\r\n\r\n let allow =\r\n (mode === ClipperSelectionMode.Single && selectionCount === 1) ||\r\n (mode === ClipperSelectionMode.TwoOrMore && selectionCount > 1) ||\r\n (mode === ClipperSelectionMode.Multi && selectionCount > 0);\r\n\r\n if (allow && (this.dialogData.selectableModules?.length ?? 0) > 0) {\r\n selection?.all?.forEach(n => {\r\n const module = ClipperUtils.getClipperModuleFromModel(n);\r\n if (this.dialogData.selectableModules?.findIndex(x => x === module) === -1) {\r\n allow = false;\r\n }\r\n });\r\n }\r\n\r\n return allow;\r\n }\r\n\r\n /**\r\n * Broadcasts the current selection as a message and closes the dialog.\r\n * Does nothing when the selection is empty.\r\n */\r\n protected select(): void {\r\n const items = this.clipperBrowser().selection?.all;\r\n if (items && items.length > 0) {\r\n this.broadcastService.sendMessage(\r\n this.dialogData.selectionMessage ?? ClipperMessages.DOCUMENT_SELECTED,\r\n items\r\n );\r\n this.dialogRef.close();\r\n }\r\n }\r\n\r\n}\r\n","<div style=\"padding:10px 0 10px 0\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"20px\" fxLayoutAlign=\"start center\" fxFill>\r\n <div class=\"dialog-title\">\r\n <a href=\"https://clipper.arsedizioni.it\" matTooltip=\"Apri Clipper in un nuovo tab\" target=\"_blank\">\r\n <div class=\"clipper-logo\"></div>\r\n </a>\r\n </div>\r\n <div fxFlex=\"*\"></div>\r\n @if ((dialogData.selectionMode ?? 0) > 0 && canSelect()) {\r\n <div fxFlexAlign=\"center\" fxFlex=\"170px\" fxFlex.lt-md=\"58px\">\r\n <button fxHide.lt-md fxFlexAlign=\"center\" type=\"button\" mat-flat-button (click)=\"select()\"\r\n class=\"clipper-selection-button\">\r\n <span class=\"small bold\">Usa selezione</span>\r\n </button>\r\n <button fxHide.gt-sm fxFlexAlign=\"center\" type=\"button\" mat-icon-button (click)=\"select()\"\r\n matTooltip=\"Usa selezione\" aria-label=\"'Usa la selezione'\" class=\"clipper-selection-icon-button\">\r\n <mat-icon>check</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n <div fxFlexAlign=\"center\" class=\"dialog-close\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\" fxLayoutGap=\"5px\">\r\n @if (clipperService.bag.length > 0) {\r\n <button type=\"button\" mat-icon-button matTooltip=\"Documenti di lavoro\"\r\n aria-label=\"'Documenti di lavoro'\" (click)=\"clipperBrowser.openBag()\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"clipperService.bag.length\"\r\n >work_outline</mat-icon>\r\n </button>\r\n }\r\n <button type=\"button\" mat-icon-button matTooltip=\"Chiudi\" [mat-dialog-close]=\"true\" aria-label=\"Chiudi\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<mat-dialog-content style=\"padding: 0\">\r\n <clipper-browser #clipperBrowser class=\"wide fill\" [showChannels]=\"dialogData.showChannels ?? true\"\r\n [selectableModules]=\"dialogData.selectableModules ?? []\"\r\n [initialModule]=\"dialogData.initialModule\" [showRSOptions]=\"false\" [showAIAssistantOptions]=\"false\"></clipper-browser>\r\n</mat-dialog-content>","import { Component, output, viewChild, inject, ChangeDetectionStrategy, signal, DestroyRef } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { NgForm, FormsModule } from '@angular/forms';\r\nimport { MAT_DIALOG_DATA, MatDialogRef, MatDialogTitle, MatDialogContent, MatDialogActions, MatDialogClose } from '@angular/material/dialog';\r\nimport { ArsCoreModule, NameValueItem, SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { DialogService } from '@arsedizioni/ars-utils/ui';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { FlexModule } from '@ngbracket/ngx-layout/flex';\r\nimport { finalize } from 'rxjs/operators';\r\nimport { ClipperContactInfo, ClipperService, ClipperTeamProduct, EditDialogCompleted, EditDialogData } from '@arsedizioni/ars-utils/clipper.common';\r\nimport { MatSelectModule } from '@angular/material/select';\r\n\r\n@Component({\r\n host: { 'Bind': SystemUtils.generateUUID() },\r\n templateUrl: './contact-edit.component.html',\r\n styleUrls: ['./contact-edit.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n ArsCoreModule,\r\n MatDialogTitle,\r\n MatDialogContent,\r\n FormsModule,\r\n FlexModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatDialogActions,\r\n MatDialogClose,\r\n MatSelectModule\r\n ]\r\n})\r\nexport class ClipperContactEditComponent {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private clipperService = inject(ClipperService);\r\n private dialogService = inject(DialogService);\r\n private dialogRef = inject<MatDialogRef<ClipperContactEditComponent>>(MatDialogRef);\r\n private dialogData = inject<EditDialogData<ClipperContactInfo>>(MAT_DIALOG_DATA);\r\n protected readonly f = viewChild<NgForm>('f');\r\n readonly done = output<EditDialogCompleted<ClipperContactInfo>>();\r\n protected readonly dialogTitle = this.dialogData?.currentItem ? 'Modifica contatto' : 'Nuovo contatto';\r\n protected readonly isNew = signal<boolean>(!this.dialogData?.currentItem?.id);\r\n protected item: ClipperContactInfo = this.dialogData?.currentItem ?? { id: 0 };\r\n protected readonly availableTeams = signal<NameValueItem<string>[]>([]);\r\n protected selectedTeam: NameValueItem<string> = { name: 'Nessuno, usa contatti personali', value: SystemUtils.emptyUUID() };\r\n\r\n constructor() {\r\n this.loadTeams();\r\n }\r\n\r\n /**\r\n * Loads the list of available teams from the server and populates the team selector.\r\n * Pre-selects the team that matches the current contact's team id, falling back to 'Personale'.\r\n */\r\n private loadTeams(): void {\r\n this.clipperService\r\n .getTeams({ productId: ClipperTeamProduct.SharedNotes })\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else if ((r.value?.total ?? 0) > 0) {\r\n const teams: NameValueItem<string>[] = [{ name: 'Nessuno, usa contatti personali', value: SystemUtils.emptyUUID() }];\r\n r.value?.items.forEach(n =>\r\n teams.push({ name: n.name, value: n.value.toLowerCase() })\r\n );\r\n this.availableTeams.set(teams);\r\n this.selectedTeam = teams.find(x => x.value === this.item.teamId) ?? teams[0];\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Persists the current contact to the server.\r\n * Closes the dialog without saving when editing an existing contact whose form is unchanged.\r\n */\r\n protected save(): void {\r\n if (!this.isNew() && this.f()?.form.pristine) {\r\n this.dialogRef.close();\r\n return;\r\n }\r\n\r\n if (this.isNew()) {\r\n this.item.teamId = this.selectedTeam.value;\r\n }\r\n\r\n this.dialogService.busy('Aggiornamento in corso...');\r\n this.clipperService.saveContact(this.item)\r\n .pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n finalize(() => this.dialogService.clearBusy())\r\n )\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n this.done.emit({ data: r.value, isNew: this.isNew() });\r\n this.dialogService.toast('Operazione completata con successo.');\r\n setTimeout(() => this.dialogRef.close(), 500);\r\n }\r\n });\r\n }\r\n}\r\n","<div class=\"dialog-info\">\r\n @if (f.form.invalid) {\r\n <span class=\"dialog-info-red\">Ci sono ancora dei campi obbligatori (*) non\r\n compilati o con errori.</span>\r\n } @else {\r\n <span class=\"dialog-info-green\">Tutti i campi obbligatori (*) sono compilati senza errori.</span>\r\n }\r\n</div>\r\n<h2 mat-dialog-title>{{dialogTitle}}</h2>\r\n<div mat-dialog-content class=\" no-spaced\">\r\n <form name=\"form\" #f=\"ngForm\" novalidate>\r\n <div fxLayout=\"column\" class=\"spaced\">\r\n @if (availableTeams() && availableTeams().length > 1) {\r\n <mat-form-field>\r\n <mat-label>Team</mat-label>\r\n <mat-select [(ngModel)]=\"selectedTeam\" #team=\"ngModel\" name=\"team\" required [disabled]=\"!isNew()\">\r\n @for (t of availableTeams(); track $index;) {\r\n <mat-option [value]=\"t\">\r\n {{t.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (team.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n <mat-form-field>\r\n <mat-label>Nome</mat-label>\r\n <input matInput [(ngModel)]=\"item.name\" name=\"name\" #name=\"ngModel\" required maxlength=\"100\" />\r\n <mat-hint align=\"end\">{{name.value?.length || 0}}/100 </mat-hint>\r\n @if (name.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>Elenco email...</mat-label>\r\n <textarea matInput [(ngModel)]=\"item.emails\" name=\"emails\" #emails=\"ngModel\" maxlength=\"1000\"\r\n emails cdkTextareaAutosize></textarea>\r\n <mat-hint align=\"start\">Separati da punto e virgola</mat-hint>\r\n <mat-hint align=\"end\">{{emails.value?.length || 0}}/1000 </mat-hint>\r\n @if (emails.invalid) {\r\n <mat-error>Non valido</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n </div>\r\n </form>\r\n</div>\r\n<div mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\r\n <button mat-flat-button color=\"primary\" [disabled]=\"f.form.invalid || f.form.pristine\"\r\n (click)=\"save()\">Salva</button>\r\n <button mat-stroked-button [mat-dialog-close]=\"true\" color=\"primary\">Chiudi</button>\r\n </div>\r\n</div>","import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n Renderer2,\r\n inject,\r\n signal,\r\n output,\r\n viewChild,\r\n Injector,\r\n afterNextRender\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogContent, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatDrawer, MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { Router } from '@angular/router';\r\nimport {\r\n ClipperDocumentAnchorInfo, ClipperDocumentInfo,\r\n ClipperDocumentRelevantChunkHit,\r\n ClipperDocumentRelevants,\r\n ClipperMessages,\r\n ClipperModel,\r\n ClipperModule,\r\n ClipperQueryReferencesMode, ClipperSearchParams, ClipperSearchUtils,\r\n ClipperSelectionMode, ClipperUserInfo, ClipperUtils\r\n} from '@arsedizioni/ars-utils/clipper.common';\r\nimport {\r\n SafeUrlPipe,\r\n SystemUtils,\r\n ThemeType\r\n} from '@arsedizioni/ars-utils/core';\r\nimport { FilePreviewComponent } from '@arsedizioni/ars-utils/ui.application';\r\n\r\nimport type { ClipperReferenceDialogResult } from '../references/references.component';\r\nimport type { ClipperDocumentIndexDialogResult } from '../document-index/document-index.component';\r\nimport { ClipperDocumentManager } from '../document-manager/document-manager';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { ClipperDocumentsUtils } from '../../documents';\r\nimport { ClipperDocumentMenuComponent } from '../document-menu/document-menu.component';\r\nimport { ClipperNoteBadgeComponent } from '../note-badge/note-badge.component';\r\n\r\n\r\nexport interface ClipperDocumentDialogData {\r\n selectionMode?: ClipperSelectionMode;\r\n selectableModules?: ClipperModule[];\r\n id: string;\r\n query?: string;\r\n queryChunks?: string;\r\n theme?: ThemeType;\r\n canUseArchive?: boolean;\r\n canUseNotes?: boolean;\r\n canHandleTooManyResults?: boolean;\r\n\r\n}\r\n\r\n@Component({\r\n host: { 'Bind': SystemUtils.generateUUID() },\r\n templateUrl: './document.component.html',\r\n styleUrls: ['./document.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [\r\n FlexLayoutModule,\r\n MatButtonModule,\r\n MatTooltipModule,\r\n MatIconModule,\r\n MatMenuModule,\r\n MatDividerModule,\r\n MatProgressBarModule,\r\n MatDialogContent,\r\n MatSidenavModule,\r\n SafeUrlPipe,\r\n ClipperDocumentMenuComponent,\r\n ClipperNoteBadgeComponent\r\n ],\r\n})\r\nexport class ClipperDocumentComponent extends ClipperDocumentManager {\r\n readonly relevantsPane = viewChild<MatDrawer>('relevantsPane');\r\n readonly closing = output();\r\n readonly opening = output<string>();\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly injector = inject(Injector);\r\n private readonly breakpointObserver = inject(BreakpointObserver);\r\n private readonly renderer = inject(Renderer2);\r\n private rendererListener1: (() => void) | undefined;\r\n private readonly router = inject(Router);\r\n private readonly dialogRef = inject(MatDialogRef<ClipperDocumentComponent>);\r\n protected readonly dialogData: ClipperDocumentDialogData = inject(MAT_DIALOG_DATA) ?? { mode: ClipperQueryReferencesMode.ReferencesIn };\r\n protected readonly url = signal<string | null>(null);\r\n protected readonly title = signal<string | null>(null);\r\n protected readonly busy = signal<boolean>(false);\r\n protected lastQuery?: string;\r\n protected lastQueryChunks: string = '';\r\n protected lastQueryType: 'fulltext' | 'semantic' = 'fulltext';\r\n protected readonly lastDocument = signal<ClipperDocumentInfo | undefined>(undefined);\r\n protected readonly relevants = signal<ClipperDocumentRelevants>({\r\n items: [],\r\n hits: 0,\r\n hit: 0,\r\n chunks: 0,\r\n });\r\n protected readonly relevantsPaneHasBackdrop = signal<boolean>(false);\r\n protected readonly relevantsPaneClosed = signal<boolean>(false);\r\n protected readonly relevantsBusy = signal<boolean>(false);\r\n protected readonly hasRelevants = signal<boolean>(false);\r\n protected readonly user: ClipperUserInfo | undefined = this.clipperService.loginInfo?.context;\r\n\r\n constructor() {\r\n super();\r\n\r\n if (this.dialogData?.id) {\r\n // Build the document render URL from the dialog data\r\n let id = this.dialogData.id.toString();\r\n const hashPos = id.indexOf('#');\r\n if (hashPos !== -1) {\r\n id = id.substring(0, hashPos);\r\n }\r\n let query = this.dialogData.query ?? '';\r\n if (this.dialogData.queryChunks && this.dialogData.queryChunks.length > 0) {\r\n query += '__CHUNKS__' + id + ':' + this.dialogData.queryChunks;\r\n }\r\n const url =\r\n this.clipperService.serviceUri +\r\n '/documents/render/?query=' + query +\r\n '&theme=' + this.dialogData.theme +\r\n '&id=' + this.dialogData.id;\r\n this.navigateByUrl(url);\r\n }\r\n\r\n // Listen to postMessage events from the embedded iframe\r\n this.rendererListener1 = this.renderer.listen('window', 'message', (e: Event) => {\r\n const event = e as MessageEvent;\r\n if (!event?.data) return;\r\n try {\r\n const data = JSON.parse(event.data);\r\n if (!data) return;\r\n switch (data.type) {\r\n case 'navigated':\r\n this.navigated(\r\n data.id, data.title1, data.title2, data.tags, data.model,\r\n data.module, data.moduleName, data.date, data.number, data.author,\r\n data.origin, data.originDescription, data.bag, data.validityInfo,\r\n data.expiringInfo, data.primaryId, data.primaryModel, data.secondaryId, data.isTrial\r\n );\r\n break;\r\n case 'navigate':\r\n this.navigate(data.url);\r\n break;\r\n case 'references':\r\n this.openReferences(data.id, data.mode, data.model, data.anchor, data.anchorTitle, data.update);\r\n break;\r\n case 'hits':\r\n this.relevants.update(r => ({ ...r, hits: data.total as number }));\r\n if (data.update) {\r\n this.updateRelevants();\r\n }\r\n break;\r\n case 'hits2':\r\n this.relevants.update(r => ({ ...r, chunks: data.total as number }));\r\n this.updateRelevants2(data.items as ClipperDocumentRelevantChunkHit[]);\r\n break;\r\n }\r\n } catch {\r\n // Ignore malformed messages from the iframe\r\n }\r\n });\r\n\r\n // Release the renderer listener on component destroy\r\n this.destroyRef.onDestroy(() => this.rendererListener1?.());\r\n\r\n // React to broadcast messages from other components.\r\n this.broadcastService.getMessage()\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(message => {\r\n if (message.id === ClipperMessages.COMMAND_NOTES_DELETE) {\r\n const p = this.lastDocument().notes?.findIndex(p => p.id === message.data.id);\r\n if (p !== undefined && p >= 0) {\r\n this.lastDocument.update(v => ({ ...v, notes: v.notes?.filter((_, i) => i !== p) }));\r\n }\r\n } else if (message.id === ClipperMessages.COMMAND_NOTES_UPDATE) {\r\n const p = this.lastDocument().notes?.findIndex(p => p.id === message.data.id);\r\n if (p !== undefined && p >= 0) {\r\n this.lastDocument.update(v => {\r\n const props = [...(v.notes ?? [])];\r\n props[p] = message.data;\r\n return { ...v, notes: props };\r\n });\r\n }\r\n }\r\n });\r\n\r\n // Start tracking breakpoint changes only after the first render, when the DOM is ready.\r\n afterNextRender(() => {\r\n this.breakpointObserver\r\n .observe([\r\n Breakpoints.XSmall,\r\n Breakpoints.Small,\r\n Breakpoints.Medium,\r\n Breakpoints.Large,\r\n Breakpoints.XLarge,\r\n ])\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(result => {\r\n for (const query of Object.keys(result.breakpoints)) {\r\n if (result.breakpoints[query]) {\r\n this.handleRelevantsPaneVisibility();\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n\r\n\r\n /**\r\n * Toggles the relevants side-pane open/closed state.\r\n */\r\n protected toggleRelevantsPane(): void {\r\n this.relevantsPaneClosed.set(!this.relevantsPaneClosed());\r\n this.relevantsPane()?.toggle();\r\n }\r\n\r\n /**\r\n * Adjusts the relevants side-pane mode and visibility based on the current viewport breakpoint.\r\n */\r\n private handleRelevantsPaneVisibility(): void {\r\n const relevantsPane = this.relevantsPane();\r\n if (!relevantsPane) return;\r\n if (\r\n this.breakpointObserver.isMatched(Breakpoints.XSmall) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Small) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Medium)\r\n ) {\r\n if (relevantsPane.opened) relevantsPane.close();\r\n relevantsPane.mode = 'over';\r\n relevantsPane.disableClose = false;\r\n this.relevantsPaneHasBackdrop.set(true);\r\n } else {\r\n if (!relevantsPane.opened && !this.relevantsPaneClosed() && this.hasRelevants()) {\r\n relevantsPane.open();\r\n } else if (relevantsPane.opened && this.relevantsPaneClosed()) {\r\n relevantsPane.close();\r\n }\r\n relevantsPane.mode = 'side';\r\n relevantsPane.disableClose = true;\r\n this.relevantsPaneHasBackdrop.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Emits the closing event and closes the dialog after a short delay.\r\n */\r\n protected close(): void {\r\n this.closing.emit();\r\n setTimeout(() => this.dialogRef.close(), 500);\r\n }\r\n\r\n /**\r\n * Navigates to a document or external URL received from the iframe.\r\n * @param id - The document id or URL to navigate to.\r\n */\r\n navigate(id: string): void {\r\n if (!id || id.length === 0) return;\r\n\r\n if (id.indexOf('?') !== -1) {\r\n if (id.startsWith('/api'))\r\n this.navigateByUrl(this.clipperService.serviceUri + id.substring(4));\r\n else if (!id.startsWith(this.clipperService.serviceUri))\r\n this.navigateByUrl(this.clipperService.serviceUri + id);\r\n else\r\n this.navigateByUrl(id);\r\n } else {\r\n this.navigateByUrl(this.clipperService.serviceUri + '/documents/render/?query=&id=' + id);\r\n }\r\n }\r\n\r\n /**\r\n * Resolves and loads a document by its fully-qualified render URL.\r\n * Parses query, theme, and anchor information before navigating.\r\n * @param url - The full render URL to load.\r\n */\r\n navigateByUrl(url: string): void {\r\n if (!url || url.length === 0 || url === 'about:blank') return;\r\n\r\n // Keep only the first anchor fragment\r\n const urlParts = url.split('#');\r\n url = urlParts[0];\r\n if (urlParts.length > 1) {\r\n url += '#' + urlParts[1];\r\n }\r\n\r\n // Extract and process the free-text query parameter\r\n let query = '';\r\n let p = url.indexOf('query=');\r\n if (p !== -1) {\r\n p += 6;\r\n while (url.length > p && url[p] !== '&' && url[p] !== '#') {\r\n query += url[p++];\r\n }\r\n if (query.length > 0) {\r\n if (query[0] === '$') {\r\n query = query.substring(1);\r\n this.lastQueryType = 'semantic';\r\n }\r\n this.relevants.update(r => ({ ...r, hit: 0 }));\r\n try {\r\n query = decodeURIComponent(encodeURIComponent(query));\r\n } catch {\r\n // Keep original query if encoding fails\r\n }\r\n\r\n // Extract the document id\r\n let id = '';\r\n p = url.indexOf('id=');\r\n while (url.length > p && url[p] !== '&' && url[p] !== '#') {\r\n id += url[p++];\r\n }\r\n\r\n // Split into text query and optional chunk offsets\r\n const queryParts = query.split('__CHUNKS__');\r\n if (queryParts.length > 0) {\r\n this.lastQuery = ClipperSearchUtils.normalizeTextQuery2(queryParts[0]);\r\n if (queryParts.length > 1) {\r\n const queryChunksParts = queryParts[1].split(':');\r\n if (queryChunksParts.length > 2 && queryChunksParts[0] === id) {\r\n this.lastQueryChunks = queryChunksParts[1];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Inject the current theme into the URL if not already present\r\n if (url.indexOf('theme=') === -1) {\r\n p = url.indexOf('id=');\r\n if (p !== -1) {\r\n url = url.substring(0, p) + 'theme=' + this.dialogData.theme + '&' + url.substring(p);\r\n }\r\n }\r\n\r\n if (url.indexOf('&file=true') !== -1) {\r\n this.previewFile(url);\r\n } else {\r\n this.clipperService.preRender().subscribe(() => {\r\n this.busy.set(url.indexOf('documents/render/item') === -1);\r\n this.url.set(url);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Called by the iframe when a document has finished rendering.\r\n * Parses and stores all document metadata, then triggers auxiliary data loading.\r\n * @param id - Document id.\r\n * @param title1 - Primary title.\r\n * @param title2 - Secondary title.\r\n * @param tags - Comma-separated tag list.\r\n * @param model - Document model identifier.\r\n * @param moduleId - Module identifier.\r\n * @param moduleName - Module display name.\r\n * @param date - Publication date string.\r\n * @param number - Document number.\r\n * @param author - Author name.\r\n * @param origin - Source origin code.\r\n * @param originDescription - Human-readable origin description.\r\n * @param bag - Encoded flags string.\r\n * @param validityInfo - Encoded validity information.\r\n * @param expiringInfo - Encoded expiration information.\r\n * @param primaryId - Id of the primary linked document, if any.\r\n * @param primaryModel - Model of the primary linked document.\r\n * @param secondaryId - Id of the secondary linked document, if any.\r\n * @param isTrial - True when the request is a trial/preview access.\r\n */\r\n public navigated(\r\n id: string,\r\n title1: string,\r\n title2: string,\r\n tags: string,\r\n model: number,\r\n moduleId: number,\r\n moduleName: string,\r\n date: string,\r\n number: string,\r\n author: string,\r\n origin: string,\r\n originDescription: string,\r\n bag: string,\r\n validityInfo: string,\r\n expiringInfo: string,\r\n primaryId: string,\r\n primaryModel: number,\r\n secondaryId: string,\r\n isTrial: boolean\r\n ): void {\r\n // Redirect to login when the session has expired\r\n if (title1 === 'Sessione non valida') {\r\n this.dialogService\r\n .error(title2, null, title1, 'Accedi di nuovo')\r\n .afterClosed()\r\n .subscribe(() => this.router.navigate(['login']));\r\n return;\r\n }\r\n\r\n // Resolve the primary document description label\r\n let primaryDescription: string | undefined;\r\n if (primaryId) {\r\n switch (primaryModel ?? model) {\r\n case ClipperModel.NormativaVigente: primaryDescription = 'Testo vigente'; break;\r\n case ClipperModel.AggiornamentoNormativo: primaryDescription = 'Testo storico'; break;\r\n case ClipperModel.Scadenze: primaryDescription = 'Scadenza'; break;\r\n case ClipperModel.Coordinamento: primaryDescription = 'Modifica'; break;\r\n default: primaryDescription = 'Collegamento'; break;\r\n }\r\n }\r\n\r\n // Parse the expiring info block\r\n let expiringDate: Date | undefined;\r\n let expiringInfoText: string | undefined;\r\n let expiringDescription: string | undefined;\r\n if (expiringInfo) {\r\n const expiringParts = expiringInfo.split('#');\r\n if (expiringParts.length > 0) {\r\n const dateParts = expiringParts[0].split('|');\r\n if (dateParts.length > 0) expiringDate = new Date(dateParts[0]);\r\n if (dateParts.length > 1) expiringInfoText = dateParts[1];\r\n if (dateParts.length > 2) expiringInfoText += '|' + dateParts[2];\r\n }\r\n if (expiringParts.length > 1) expiringDescription = expiringParts[1];\r\n }\r\n\r\n const updatedDoc: ClipperDocumentInfo = {\r\n ...this.lastDocument() ?? {},\r\n id,\r\n documentId: id,\r\n title1: title1 ? SystemUtils.urlDecode(title1).replaceAll('\\\\\"', '\"') : undefined,\r\n title2: title2 ? SystemUtils.urlDecode(title2).replaceAll('\\\\\"', '\"') : undefined,\r\n tags,\r\n model,\r\n module: moduleId,\r\n moduleName,\r\n date: new Date(date),\r\n number,\r\n author,\r\n origin,\r\n originDescription,\r\n bag,\r\n validityInfo,\r\n primaryId,\r\n primaryModel,\r\n hasPrimary: !!primaryId && (model === ClipperModel.AggiornamentoNormativo || model === ClipperModel.NormativaVigente),\r\n primaryDescription,\r\n secondaryId,\r\n isTrial,\r\n expiringDate,\r\n expiringInfo: expiringInfoText,\r\n expiringDescription,\r\n };\r\n\r\n this.lastDocument.set(updatedDoc);\r\n this.title.set(updatedDoc.title1 ?? updatedDoc.title2 ?? null);\r\n this.busy.set(false);\r\n\r\n // Broadcast the navigation event so other components can react\r\n this.broadcastService.sendMessage(ClipperMessages.DOCUMENT_NAVIGATED, {\r\n document: SystemUtils.clone(updatedDoc),\r\n });\r\n\r\n // Fetch and store the last update timestamp asynchronously\r\n this.clipperService.metadata(id).subscribe(r => {\r\n if (r.success) {\r\n this.lastDocument.update(doc => doc ? { ...doc, lastUpdate: r.value.item1, notes: r.value.item2 } : doc);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Navigates back in the iframe's browsing history.\r\n */\r\n protected back(): void {\r\n const f = document.getElementById('clipper-document-iframe') as any;\r\n f?.contentWindow.postMessage('{\"type\": \"back\"}', '*');\r\n }\r\n\r\n /**\r\n * Navigates forward in the iframe's browsing history.\r\n */\r\n protected forward(): void {\r\n const f = document.getElementById('clipper-document-iframe') as any;\r\n f?.contentWindow.postMessage('{\"type\": \"forward\"}', '*');\r\n }\r\n\r\n /**\r\n * Moves focus to the next highlighted relevant hit inside the document.\r\n */\r\n protected nextRelevant(): void {\r\n const current = this.relevants();\r\n let i = current.hit + 1;\r\n if (i > current.hits) i = 0;\r\n const f = document.getElementById('clipper-document-iframe') as any;\r\n f?.contentWindow.postMessage('{\"type\": \"relevant\", \"value\": \"next\"}', '*');\r\n this.relevants.update(r => ({ ...r, hit: i }));\r\n }\r\n\r\n /**\r\n * Moves focus to the previous highlighted relevant hit inside the document.\r\n */\r\n protected previousRelevant(): void {\r\n const current = this.relevants();\r\n let i = current.hit - 1;\r\n if (i < 0) i = current.hits;\r\n const f = document.getElementById('clipper-document-iframe') as any;\r\n f?.contentWindow.postMessage('{\"type\": \"relevant\", \"value\": \"previous\"}', '*');\r\n this.relevants.update(r => ({ ...r, hit: i }));\r\n }\r\n\r\n /**\r\n * Scrolls to a specific relevant anchor inside the document, or opens it in a new tab.\r\n * @param item - The anchor item to navigate to.\r\n */\r\n protected gotoRelevant(item: ClipperDocumentAnchorInfo): void {\r\n if (item.type === 20) {\r\n window.open(\r\n this.clipperService.serviceUri +\r\n '/documents/render/item/?theme=' + this.dialogData.theme + '&id=' + item.documentId,\r\n '_blank'\r\n );\r\n } else {\r\n const f = document.getElementById('clipper-document-iframe') as any;\r\n f?.contentWindow.postMessage('{\"type\": \"relevant\", \"value\": \"' + item.uri + '\"}', '*');\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n /**\r\n * Fetches and renders full-text relevant anchors for the current document and query.\r\n */\r\n private updateRelevants(): void {\r\n const query = this.lastQuery;\r\n if (!query || query.length === 0 || query === ' ') {\r\n this.handleRelevantsPaneVisibility();\r\n return;\r\n }\r\n const doc = this.lastDocument();\r\n const docId = doc?.documentId ?? doc?.id;\r\n if (!docId) return;\r\n\r\n const params = new ClipperSearchParams();\r\n params.id = docId;\r\n params.text = query;\r\n params.count = 1;\r\n\r\n this.clipperService.query(params).subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else if (r.value?.items && r.value.items.length > 0) {\r\n const anchors = r.value.items[0].anchors;\r\n let minScore = 10;\r\n let maxScore = 0;\r\n anchors.forEach(n => {\r\n if (n.score < minScore) minScore = n.score;\r\n if (n.score > maxScore) maxScore = n.score;\r\n });\r\n const range = maxScore - minScore;\r\n anchors.forEach(n => {\r\n const score = range > 0 ? (n.score - minScore) / range : 0;\r\n n.score = score;\r\n n.veryRelevant = score > 0.7;\r\n });\r\n this.relevants.update(r => ({ ...r, items: anchors }));\r\n this.hasRelevants.set(anchors.length > 0);\r\n }\r\n this.handleRelevantsPaneVisibility();\r\n });\r\n }\r\n\r\n /**\r\n * Updates the relevant anchors list from chunk-based hit data received from the iframe.\r\n * @param anchors - Array of chunk hit data to convert into anchor items.\r\n */\r\n private updateRelevants2(anchors?: ClipperDocumentRelevantChunkHit[]): void {\r\n if (!anchors?.length) return;\r\n const items: ClipperDocumentAnchorInfo[] = anchors.map(a => ({\r\n score: ClipperSearchUtils.getRankFromChar(a.score),\r\n veryRelevant: a.score.toUpperCase() === 'A',\r\n title: a.text,\r\n uri: a.uri ?? '__CHUNK_' + a.index,\r\n }));\r\n this.relevants.update(r => ({ ...r, items }));\r\n this.hasRelevants.set(items.length > 0);\r\n this.handleRelevantsPaneVisibility();\r\n }\r\n\r\n /**\r\n * Opens the document structure index dialog and scrolls to or opens the selected section.\r\n * @param documentId - The id of the document whose index to display.\r\n */\r\n protected index(documentId: string): void {\r\n import('../document-index/document-index.component').then(({ ClipperDocumentIndexComponent }) => {\r\n const d = this.dialogService.open(ClipperDocumentIndexComponent, {\r\n ariaLabel: 'indice documento',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: true,\r\n closeOnNavigation: false,\r\n data: {\r\n documentId: documentId,\r\n excludedTypes: null,\r\n multiple: false\r\n },\r\n minWidth: '375px',\r\n maxWidth: '600px',\r\n width: '100%',\r\n });\r\n d.componentInstance.done\r\n .subscribe((r: ClipperDocumentIndexDialogResult) => {\r\n const item = r.data.length > 0 ? r.data[0] : null;\r\n if (item) {\r\n if (item.documentId === documentId) {\r\n const f = document.getElementById('clipper-document-iframe') as any;\r\n f?.contentWindow.postMessage('{\"type\": \"goto\", \"value\":\"' + item.uri + '\"}', '*');\r\n } else {\r\n this.openDocument(item.documentId + '#' + item.uri);\r\n }\r\n }\r\n d.close();\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Extracts the value of a named query-string parameter from a URL.\r\n * @param url - The URL string to search.\r\n * @param name - The parameter name to look for. Defaults to 'id'.\r\n * @returns The extracted parameter value.\r\n */\r\n private getId(url: string, name: string = 'id'): string {\r\n const start = url.lastIndexOf(name + '=') + 3;\r\n const end = url.indexOf('&', start);\r\n return url.substring(start, end);\r\n }\r\n\r\n /**\r\n * Previews or downloads a file identified by a render URL.\r\n * Opens a preview dialog when the file supports embedding, otherwise triggers a browser download.\r\n * @param url - The file render URL to preview.\r\n */\r\n private previewFile(url: string): void {\r\n if (!url || url.length === 0) return;\r\n const id = this.getId(url);\r\n if (!id || id.length === 0) return;\r\n this.clipperService.newOTP(id).subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else if (!r.value.canPreview) {\r\n location.href = url;\r\n } else {\r\n this.dialogService.open(FilePreviewComponent, {\r\n panelClass: 'preview-panel',\r\n ariaLabel: 'anteprima',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: true,\r\n data: { url, embed: r.value.canEmbed },\r\n minWidth: '375px',\r\n maxWidth: '900px',\r\n width: '100%',\r\n height: '100%'\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Loads and displays the editorial comment associated with the current document.\r\n */\r\n protected showComment(): void {\r\n const doc = this.lastDocument();\r\n if (doc?.bag?.[7] !== 'T') return;\r\n this.clipperService.comment(doc.documentId).subscribe(r => {\r\n if (!r.success) {\r\n if (r.message === \"Il tuo abbonamento non consente di visualizzare i commenti alle norme.\")\r\n this.dialogService.error(\"Il servizio di <b>commenti alle norme</b> non è compreso nel tuo abbonamento, per maggiori informazioni rivolgersi all'agente commerciale di riferimento o inviare una mail a <a href='mailto:sales@arsedizioni.it' target='_blank'>sales@arsedizioni.it</a>.\", null, \"Attenzione\");\r\n else\r\n this.dialogService.error(r.message);\r\n } else {\r\n if (r.value && r.value.length > 1) {\r\n this.dialogService.info(\r\n r.value.replace(/<\\/p><br>\\r\\n/g, '</p>\\r\\n'),\r\n \"Commento\",\r\n \"Chiudi\",\r\n 700);\r\n } else\r\n this.dialogService.info(\"Commento non più disponibile o in fase di revisione.\");\r\n }\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Opens a document, either inline or in a new browser tab.\r\n * @param documentId - The id of the document to open.\r\n * @param query - Optional free-text query for highlight.\r\n * @param queryChunks - Optional chunk offsets for semantic highlight.\r\n * @param newWindow - When true, opens the document in a new browser tab.\r\n */\r\n override open(documentId: string, query?: string, queryChunks?: string, newWindow?: boolean): void {\r\n if (!newWindow) {\r\n if (this.opening) this.opening.emit(documentId);\r\n else this.openDocument(documentId, query, queryChunks);\r\n } else {\r\n window.open((this.clipperService.appUri ?? '') + '/documento/' + documentId, '_blank');\r\n }\r\n }\r\n\r\n /**\r\n * Opens a document inline via the {@link ClipperDocumentsUtils} helper.\r\n * @param documentId - The id of the document to open.\r\n * @param query - Optional free-text query for highlight.\r\n * @param queryChunks - Optional chunk offsets for semantic highlight.\r\n */\r\n private openDocument(documentId: string, query?: string, queryChunks?: string): void {\r\n if (!documentId) return;\r\n ClipperDocumentsUtils.openDocument(\r\n this.injector,\r\n documentId,\r\n query,\r\n queryChunks,\r\n this.dialogData.selectionMode,\r\n this.dialogData.selectableModules,\r\n this.dialogData.theme,\r\n this.dialogData.canUseArchive,\r\n this.dialogData.canUseNotes,\r\n this.dialogData.canHandleTooManyResults\r\n );\r\n }\r\n\r\n /**\r\n * Opens the references panel for the given document.\r\n * @param documentId - The id of the document whose references to display.\r\n * @param mode - The reference query mode. Defaults to ReferencesIn.\r\n * @param model - Optional document model filter.\r\n * @param anchor - Optional anchor id to highlight.\r\n * @param anchorTitle - Optional anchor title to display.\r\n * @param update - When true, triggers a refresh of the references list. Defaults to true.\r\n */\r\n override openReferences(\r\n documentId: string,\r\n mode: ClipperQueryReferencesMode = ClipperQueryReferencesMode.ReferencesIn,\r\n model: number | null = null,\r\n anchor: string | null = null,\r\n anchorTitle: string | null = null,\r\n update: boolean = true\r\n ): void {\r\n import('../references/references.component').then(({ ClipperReferencesComponent }) => {\r\n this.dialogService.open(ClipperReferencesComponent, {\r\n ariaLabel: 'riferimenti legati al documento',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: true,\r\n closeOnNavigation: false,\r\n data: {\r\n documentId: documentId ?? this.lastDocument()?.documentId,\r\n mode,\r\n model,\r\n anchor,\r\n anchorTitle,\r\n update,\r\n canUseArchive: this.dialogData.canUseArchive,\r\n canUseNotes: this.dialogData.canUseNotes,\r\n canHandleTooManyResults: this.dialogData.canHandleTooManyResults\r\n },\r\n minWidth: '375px',\r\n maxWidth: '1200px',\r\n width: '100%',\r\n height: '100%',\r\n }).afterClosed()\r\n .subscribe((r: ClipperReferenceDialogResult) => {\r\n if (r?.documentId) {\r\n this.navigate(r.documentId);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Opens the report viewer for the given document when supported by its model.\r\n * @param item - The document whose report to display.\r\n */\r\n protected displayReport(item: ClipperDocumentInfo): void {\r\n if (!item) return;\r\n if (item.model != ClipperModel.NormativaVigente && item.model != ClipperModel.Scadenze) {\r\n this.dialogService.info(\"Questa funzionalità non è disponibile per questo tipo di documento.\");\r\n return;\r\n }\r\n this.openReport(item.id, item.title1 ? item.title1 : item.title2);\r\n }\r\n\r\n /**\r\n * Determines whether the current document satisfies the dialog's selection constraints.\r\n * @returns True when the document can be selected and confirmed.\r\n */\r\n protected canSelect(): boolean {\r\n const doc = this.lastDocument();\r\n const selectionMode = this.dialogData.selectionMode ?? 0;\r\n const selectableModules = this.dialogData.selectableModules;\r\n if (!doc || selectionMode === 0) return false;\r\n if (!selectableModules?.length) {\r\n return doc.model === ClipperModel.NormativaVigente || doc.model === ClipperModel.AggiornamentoNormativo;\r\n }\r\n return selectableModules.findIndex(x => x === ClipperUtils.getClipperModuleFromModel(doc)) !== -1;\r\n }\r\n\r\n /**\r\n * Broadcasts the current document as a selection message and closes the dialog.\r\n */\r\n protected select(): void {\r\n const doc = this.lastDocument();\r\n if (doc) {\r\n this.broadcastService.sendMessage(ClipperMessages.DOCUMENT_SELECTED_INNER, doc);\r\n this.close();\r\n }\r\n }\r\n\r\n}\r\n\r\n","<div class=\"clipper-document-fixed\">\r\n <div style=\"height:6px\">\r\n @if (busy()) {\r\n <mat-progress-bar style=\"z-index:11\" mode=\"indeterminate\"></mat-progress-bar>\r\n }\r\n </div>\r\n <div>\r\n <div fxLayout=\"row\" fxLayoutGap=\"20px\" fxLayoutAlign=\"start start\" fxFill>\r\n <div fxFlex=\"*\" class=\"title-container\">\r\n <div class=\"title bold\">{{title()}}</div>\r\n @if (lastDocument()?.tags) {\r\n <div style=\"padding-top: 5px;\">\r\n <div class=\"x-small bold uppercase\">\r\n TAG: <span class=\"accent\">{{lastDocument()?.tags}}</span>\r\n </div>\r\n </div>\r\n }\r\n @if (lastDocument()?.lastUpdate) {\r\n <div style=\"padding-top: 5px;\">\r\n <div class=\"x-small bold uppercase\">\r\n AGGIORNATO A:\r\n <span class=\"accent\">{{lastDocument()?.lastUpdate}}</span>\r\n </div>\r\n </div>\r\n }\r\n @if (lastDocument()?.expiringDescription || lastDocument()?.validityInfo) {\r\n <div style=\"padding-top: 5px;\">\r\n @if (lastDocument()?.expiringDescription) {\r\n <div class=\"x-small error bold uppercase\">\r\n {{lastDocument()?.expiringDescription}}</div>\r\n }\r\n @if (lastDocument()?.validityInfo) {\r\n <div class=\"x-small error bold uppercase\"><b>Attenzione!</b>\r\n {{lastDocument()?.validityInfo}}</div>\r\n }\r\n </div>\r\n }\r\n @if((lastDocument()?.notes?.length ?? 0) > 0 ) {\r\n <div class=\"notes-container\">\r\n @for (note of lastDocument()?.notes; track note.id) {\r\n <clipper-note-badge [note]=\"note\" />\r\n }\r\n </div>\r\n }\r\n </div>\r\n @if (canSelect()) {\r\n <div fxFlex=\"170px\" fxFlex.lt-md=\"58px\">\r\n <button fxHide.lt-md fxFlexAlign=\"center\" type=\"button\" mat-flat-button (click)=\"select()\"\r\n class=\"clipper-selection-button\" style=\"margin-top: 8px;\">\r\n <span class=\"small\">Usa selezione</span>\r\n </button>\r\n <button fxHide.gt-sm fxFlexAlign=\"center\" type=\"button\" mat-icon-button (click)=\"select()\"\r\n class=\"clipper-selection-icon-button\" matTooltip=\"Usa selezione\" aria-label=\"'Usa la selezione'\"\r\n style=\"margin-top: 4px;\">\r\n <mat-icon>check</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n <div fxFlex=\"170px\" fxFlex.lt-md=\"48px\" fxLayoutAlign=\"end\">\r\n <div class=\"dialog-close\">\r\n <button fxHide.lt-md fxFlexAlign=\"start\" type=\"button\" mat-icon-button matTooltip=\"Indietro\"\r\n aria-label=\"Indietro\" (click)=\"back()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n </button>\r\n <button fxHide.lt-md fxFlexAlign=\"start\" type=\"button\" mat-icon-button matTooltip=\"Avanti\" aria-label=\"Avanti\"\r\n (click)=\"forward()\">\r\n <mat-icon>arrow_forward</mat-icon>\r\n </button>\r\n <button fxFlexAlign=\"start\" type=\"button\" mat-icon-button matTooltip=\"Chiudi\" aria-label=\"Chiudi\"\r\n (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div>\r\n <div fxLayout=\"row wrap \" fxFill fxLayoutAlign=\"space-between center\" style=\"padding: 10px 10px 10px 15px;\">\r\n <div fxFlex.xs=\"100\">\r\n @if (lastDocument()?.model === 9) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Mostra indice'\"\r\n (click)=\"index(lastDocument()?.documentId)\">\r\n Indice\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && (lastDocument()?.bag[1] ==='T' || lastDocument()?.bag[3] ==='T')) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Collegamenti\"\r\n [attr.aria-label]=\"'Collegamenti al documento'\" [matMenuTriggerFor]=\"menuLinks\">\r\n Collegamenti\r\n </button>\r\n }\r\n <mat-menu #menuLinks=\"matMenu\">\r\n @if (lastDocument()?.bag && lastDocument()?.bag[1] ==='T') {\r\n <button mat-menu-item [attr.aria-label]=\"'Mostra documenti richiamati'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 1)\">\r\n Documenti richiamati\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[3] ==='T') {\r\n <button mat-menu-item [attr.aria-label]=\"'Mostra documenti che richiamano'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 2)\">\r\n Documenti che richiamano\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[2] ==='T') {\r\n <button fxHide fxShow.lt-md mat-menu-item [attr.aria-label]=\"'Mostra juris'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 4)\">\r\n Juris\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[4] ==='T') {\r\n <button fxHide fxShow.lt-md mat-menu-item [attr.aria-label]=\"'Mostra modifiche subite'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 3)\">\r\n Modifiche subite\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[4] !=='T' && lastDocument()?.bag[6] ==='T') {\r\n <button fxHide fxShow.lt-md mat-menu-item [attr.aria-label]=\"'Mostra modifiche apportate'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 5)\">\r\n Modifiche apportate\r\n </button>\r\n }\r\n </mat-menu>\r\n @if (lastDocument()?.hasPrimary) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Mostra documento primario'\"\r\n (click)=\"navigate(lastDocument()?.primaryId)\">\r\n {{lastDocument()?.primaryDescription}}\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[2] ==='T') {\r\n <button fxFlexAlign=\"center\" type=\"button\" fxHide.lt-md mat-button [attr.aria-label]=\"'Mostra juris'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 4)\">\r\n Juris\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[4] === 'T') {\r\n <button fxFlexAlign=\"center\" type=\"button\" fxHide.lt-md mat-button [attr.aria-label]=\"'Mostra modifiche subite'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 3)\">\r\n Modifiche subite\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[4] !== 'T' && lastDocument()?.bag[6] === 'T') {\r\n <button fxFlexAlign=\"center\" type=\"button\" fxHide.lt-md mat-button\r\n [attr.aria-label]=\"'Mostra modifiche apportate'\" (click)=\"openReferences(lastDocument()?.documentId, 5)\">\r\n Modifiche apportate\r\n </button>\r\n }\r\n @if (lastDocument()?.secondaryId) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Mostra documento secondario'\"\r\n (click)=\"navigate(lastDocument()?.secondaryId)\">\r\n Testo storico\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[7] === 'T') {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Mostra commento'\"\r\n (click)=\"showComment()\">\r\n Commento\r\n </button>\r\n }\r\n </div>\r\n <div fxFlex.xs=\"100\" fxLayoutAlign=\"end\">\r\n <div fxFlexAlign=\"center\">\r\n @if (relevants().hits) {\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\">\r\n <div fxFlexAlign=\"center\" class=\"small item-greyed\" style=\"margin-left:20px; margin-right: 5px\"\r\n matTooltip=\"Parole evidenziate\">{{relevants().hit}}\r\n di {{relevants().hits}}</div>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button [attr.aria-label]=\"'Vai alla parola precedente'\"\r\n (click)=\"previousRelevant()\" matTooltip=\"Parola precedente\">\r\n <mat-icon>chevron_left</mat-icon>\r\n </button>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button [attr.aria-label]=\"'Vai alla prossima parola'\"\r\n (click)=\"nextRelevant()\" matTooltip=\"Prossima parola\">\r\n <mat-icon>chevron_right</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Azioni sul documento\"\r\n [attr.aria-label]=\"'Azioni da eseguire sul documento'\" [matMenuTriggerFor]=\"menuActions\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menuActions=\"matMenu\">\r\n <ng-template matMenuContent let-item=\"lastDocument\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"lastDocument()\" [canOpenDocument]=\"false\" [canPrint]=\"true\"\r\n [canFind]=\"true\" [isReadable]=\"false\" [canUseArchive]=\"dialogData.canUseArchive ?? false\"\r\n [canUseNotes]=\"dialogData.canUseNotes ?? false\" [isLawInForce]=\"lastDocument()?.model === 9\"\r\n selectionSource=\"none\" [canUseAIAssistant]=\"user?.hasAIAssistant ?? false\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n @if (hasRelevants() && relevants().items && relevantsPane && (!relevantsPane.opened || relevantsPaneClosed())) {\r\n <div fxFlexAlign=\"center\">\r\n <button type=\"button\" mat-icon-button matTooltip=\"Rilevanza\" aria-label=\"'Rilevanza'\"\r\n (click)=\"toggleRelevantsPane()\">\r\n <mat-icon>right_panel_open</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<mat-dialog-content id=\"clipper-document-scrollable\">\r\n <mat-drawer-container class=\"fill\" [hasBackdrop]=\"relevantsPaneHasBackdrop()\">\r\n <mat-drawer #relevantsPane position=\"end\" class=\"drawer-small drawer-with-loader\" opened=\"false\">\r\n @if (relevantsBusy()) {\r\n <div class=\"overlay\"></div>\r\n }\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"6px\">\r\n @if (relevantsBusy()) {\r\n <mat-progress-bar style=\"z-index: 11;\" mode=\"indeterminate\">\r\n </mat-progress-bar>\r\n }\r\n </div>\r\n <div fxFlex=\"78px\" class=\"title-container-with-loader\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFill>\r\n <div class=\"title\">Rilevanza</div>\r\n <div fxFlex=\"*\" fxLayoutAlign=\"end\">\r\n <button mat-icon-button (click)=\"toggleRelevantsPane()\"\r\n matTooltip=\"Nascondi\"><mat-icon>right_panel_close</mat-icon></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" class=\"relevants-container scroll-auto\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div>\r\n <p>Parti del documento più significative per la ricerca di <span\r\n class='word-hit-chunk'>{{lastQuery}}</span>\r\n </p>\r\n </div>\r\n <div fxFlex=\"*\">\r\n <nav class=\"relevants-items\">\r\n <ul>\r\n @for (item of relevants().items; track $index) {\r\n <li class=\"small\" (click)=\"gotoRelevant(item)\" [attr.aria-label]=\"item.title\"\r\n [class.bright]=\"item.score > 0.75\" [class.accent]=\"item.score > 0.75\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start start\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlex=\"*\">\r\n {{item.title}}\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n @if (item.score > 0.7) {\r\n <mat-icon style='font-size:x-small; height: 10px; width:10px'\r\n [matTooltip]=\"item.score > 0.75 ? 'Molto rilevante' : 'Più rilevante'\">thumb_up_alt</mat-icon>\r\n }\r\n </div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </nav>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-drawer>\r\n <div class=\"fill scroll-hidden\">\r\n <iframe id=\"clipper-document-iframe\" class=\"iframe\" [src]=\"url() | safeUrl\"></iframe>\r\n </div>\r\n </mat-drawer-container>\r\n</mat-dialog-content>","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n inject,\r\n signal,\r\n output,\r\n viewChild\r\n} from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { MatListModule, MatSelectionList } from '@angular/material/list';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport {\r\n ClipperDocumentAnchorInfo,\r\n ClipperService\r\n} from '@arsedizioni/ars-utils/clipper.common';\r\nimport { SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { DialogService } from '@arsedizioni/ars-utils/ui';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { finalize } from 'rxjs';\r\n\r\n\r\nexport interface ClipperDocumentIndexDialogData {\r\n documentId: string;\r\n excludedTypes?: number[];\r\n multiple?: boolean;\r\n}\r\n\r\nexport interface ClipperDocumentIndexDialogResult {\r\n data: ClipperDocumentAnchorInfo[];\r\n}\r\n\r\n@Component({\r\n host: { 'Bind': SystemUtils.generateUUID() },\r\n templateUrl: './document-index.component.html',\r\n styleUrls: ['./document-index.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [\r\n FlexLayoutModule,\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatListModule,\r\n MatTooltipModule,\r\n MatDialogActions,\r\n MatButtonModule,\r\n MatDialogClose,\r\n ],\r\n})\r\nexport class ClipperDocumentIndexComponent {\r\n readonly selection = viewChild.required<MatSelectionList>('selection');\r\n readonly done = output<ClipperDocumentIndexDialogResult>();\r\n\r\n private clipperService = inject(ClipperService);\r\n private dialogService = inject(DialogService);\r\n protected dialogData: ClipperDocumentIndexDialogData = inject(MAT_DIALOG_DATA);\r\n protected readonly items = signal<ClipperDocumentAnchorInfo[]>([]);\r\n protected readonly okDisabled = signal<boolean>(false);\r\n\r\n constructor() {\r\n if (this.dialogData?.documentId) {\r\n this.load();\r\n }\r\n }\r\n\r\n /**\r\n * Loads the document's structural index from the server and populates the item list.\r\n * Items whose type appears in {@link ClipperDocumentIndexDialogData.excludedTypes} are filtered out.\r\n * Each item's description is built from its title, or derived from its type and text when no title is set.\r\n */\r\n private load(): void {\r\n if (!this.clipperService.loggedIn()) return;\r\n this.dialogService.setBusy('Caricamento in corso...');\r\n this.clipperService.index(this.dialogData.documentId)\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n return;\r\n }\r\n const result: ClipperDocumentAnchorInfo[] = [];\r\n r.value?.items.forEach((n: ClipperDocumentAnchorInfo) => {\r\n if (this.dialogData.excludedTypes && this.dialogData.excludedTypes.indexOf(n.type) !== -1) return;\r\n if (n.title) {\r\n n.description = n.title;\r\n } else if (n.type < 3) {\r\n n.description = n.text?.trim() ?? '';\r\n } else {\r\n n.description = `${n.typeDescription?.trim() ?? ''} ${n.text?.trim() ?? ''}.`;\r\n }\r\n result.push(n);\r\n });\r\n this.items.set(result);\r\n });\r\n }\r\n\r\n /**\r\n * Updates the OK button disabled state based on whether anything is selected in the list.\r\n */\r\n protected select(): void {\r\n const selected = this.selection().selectedOptions.selected;\r\n this.okDisabled.set(selected.length === 0);\r\n }\r\n\r\n /**\r\n * Emits the current selection as the dialog result.\r\n * In single-selection mode, emits the explicitly provided item.\r\n * In multiple-selection mode, collects all selected items from the list.\r\n * @param item - The directly clicked item for single-selection mode; omit for multiple-selection mode.\r\n */\r\n protected use(item?: ClipperDocumentAnchorInfo): void {\r\n if (this.dialogData?.multiple) {\r\n if (item != null) return; // Direct-click not supported in multiple-selection mode\r\n const selected: ClipperDocumentAnchorInfo[] = this.selection()\r\n .selectedOptions.selected.map(o => o.value as ClipperDocumentAnchorInfo);\r\n if (selected.length === 0) return;\r\n this.done.emit({ data: selected });\r\n } else if (item != null) {\r\n this.done.emit({ data: [item] });\r\n }\r\n }\r\n}\r\n\r\n","<h2 mat-dialog-title>Indice</h2>\r\n<mat-dialog-content>\r\n @if (items().length === 0) {\r\n <div>\r\n <p class=\"message\"><i>Nessun elemento da visualizzare.</i></p>\r\n </div>\r\n } @else {\r\n <mat-selection-list dense #selection (selectionChange)=\"select();\" [multiple]=\"dialogData.multiple\"\r\n hideSingleSelectionIndicator=\"true\">\r\n @for (item of items(); track $index) {\r\n @if (item.type > 4) {\r\n <div class=\"small uppercase truncated accent\" style=\"display: flex; align-items: center; min-height: 36px;\">\r\n <div><b>{{item.description}}</b></div>\r\n </div>\r\n } @else {\r\n <mat-list-option [selected]=\"false\" [value]=\"item\" (click)=\"use(item)\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div [fxFlex]=\"(10 * item.level) + 'px'\"></div>\r\n <div fxFlex=\"*\" class=\"truncated\">\r\n <div class=\"small\" [matTooltip]=\"item.description\">{{item.description}}</div>\r\n </div>\r\n </div>\r\n </mat-list-option>\r\n }\r\n }\r\n </mat-selection-list>\r\n }\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\r\n @if (dialogData.multiple) {\r\n <button mat-flat-button [disabled]=\"okDisabled()\" (click)=\"use()\">Usa</button>\r\n }\r\n <button mat-stroked-button [mat-dialog-close]=\"true\" >Chiudi</button>\r\n </div>\r\n</mat-dialog-actions>","import { TextFieldModule } from \"@angular/cdk/text-field\";\r\nimport { ChangeDetectionStrategy, Component, DestroyRef, inject, output, signal } from \"@angular/core\";\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule } from \"@angular/forms\";\r\nimport { MatButtonModule } from \"@angular/material/button\";\r\nimport { MatCheckboxModule } from \"@angular/material/checkbox\";\r\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from \"@angular/material/dialog\";\r\nimport { MatFormFieldModule } from \"@angular/material/form-field\";\r\nimport { MatIconModule } from \"@angular/material/icon\";\r\nimport { MatInputModule } from \"@angular/material/input\";\r\nimport { MatSelectModule } from \"@angular/material/select\";\r\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\r\nimport { ClipperDocumentNote, ClipperService, ClipperTeamProduct, EditDialogData, NotesColors } from \"@arsedizioni/ars-utils/clipper.common\";\r\nimport { NameValueItem, SafeHtmlPipe, SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { FlexModule } from \"@ngbracket/ngx-layout/flex\";\r\nimport { ApplicationDialogService } from \"@arsedizioni/ars-utils/ui.application\";\r\n\r\n\r\n@Component({\r\n host: { 'Bind': SystemUtils.generateUUID() },\r\n templateUrl: \"./note-edit.component.html\",\r\n styleUrls: ['./note-edit.component.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n FormsModule,\r\n FlexModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n TextFieldModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatTooltipModule,\r\n MatCheckboxModule,\r\n MatDialogActions,\r\n MatDialogClose,\r\n SafeHtmlPipe,\r\n MatSelectModule\r\n ],\r\n})\r\nexport class ClipperNoteEditComponent {\r\n readonly done = output<ClipperDocumentNote>();\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly dialogService = inject(ApplicationDialogService);\r\n protected readonly dialogData: EditDialogData<ClipperDocumentNote> = inject(MAT_DIALOG_DATA);\r\n protected readonly dialogTitle = signal<string>((this.dialogData.currentItem?.id ?? 0) > 0 ? 'Modifica annotazione' : 'Nuova annotazione');\r\n private readonly clipperService = inject(ClipperService);\r\n protected readonly colors = NotesColors;\r\n protected readonly isNew = signal<boolean>(!this.dialogData?.currentItem?.id);\r\n protected readonly availableTeams = signal<NameValueItem<string>[]>([]);\r\n protected selectedTeam: NameValueItem<string> = { name: 'Nessuno, usa note personali', value: SystemUtils.emptyUUID() };\r\n protected item: ClipperDocumentNote =\r\n this.dialogData.currentItem?.id\r\n ? SystemUtils.clone(this.dialogData.currentItem)\r\n : { color: this.colors[0].value } as ClipperDocumentNote;\r\n\r\n constructor() {\r\n if (this.dialogData.currentItem?.documentId) {\r\n this.item.documentId = this.dialogData.currentItem.documentId;\r\n }\r\n if (this.dialogData.currentItem?.documentTitle) {\r\n this.item.documentTitle = this.dialogData.currentItem.documentTitle;\r\n this.dialogTitle.set(\r\n this.isNew() \r\n ? `Nuova annotazione per:<br><div class=\"small bold accent uppercase\">${this.dialogData.currentItem.documentTitle}</div>` \r\n : `Modifica annotazione per:<br><div class=\"small bold accent uppercase\">${this.dialogData.currentItem.documentTitle}</div>`);\r\n }\r\n this.loadTeams();\r\n }\r\n\r\n /**\r\n * Returns the display name for the given colour value.\r\n * @param value - The hex/CSS colour string to look up.\r\n * @returns The human-readable colour name, or the raw value when not found.\r\n */\r\n protected colorName(value: string): string {\r\n return this.colors.find(c => c.value === value)?.name ?? value;\r\n }\r\n\r\n /**\r\n * Loads the teams available for shared-workspace notes and populates the teams dropdown.\r\n * Pre-selects the team matching the current item's teamId, defaulting to \"Personale\".\r\n */\r\n private loadTeams(): void {\r\n this.clipperService\r\n .getTeams({ productId: ClipperTeamProduct.SharedNotes })\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n return;\r\n }\r\n if ((r.value?.total ?? 0) > 0) {\r\n const teams: NameValueItem<string>[] = [{ name: 'Nessuno, usa note personali', value: SystemUtils.emptyUUID() }];\r\n r.value?.items.forEach(n => teams.push({ name: n.name, value: n.value.toLowerCase() }));\r\n this.availableTeams.set(teams);\r\n this.selectedTeam = teams.find(x => x.value === this.item.teamId) ?? teams[0];\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Saves the note via the service and emits the result through the `done` output.\r\n * For new notes, assigns the selected team before saving.\r\n */\r\n protected ok(): void {\r\n if (this.isNew()) {\r\n this.item.teamId = this.selectedTeam.value;\r\n }\r\n this.clipperService.saveNote(this.item)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n this.done.emit(r.value);\r\n this.dialogService.toast(\"Operazione completata con successo.\");\r\n }\r\n });\r\n }\r\n}","<div class=\"dialog-info\">\r\n @if (f.form.invalid) {\r\n <span class=\"dialog-info-error\">Ci sono ancora dei campi obbligatori (*) non compilati.</span>\r\n } @else {\r\n <span class=\"dialog-info-ok\">Tutti i campi obbligatori (*) sono compilati.</span>\r\n }\r\n</div>\r\n<h2 mat-dialog-title [innerHTML]=\"dialogTitle() | safeHtml\"></h2>\r\n<mat-dialog-content>\r\n <form name=\"form\" #f=\"ngForm\" novalidate>\r\n <div fxLayout=\"column\" class=\"spaced\">\r\n @if (availableTeams() && availableTeams().length > 1) {\r\n <mat-form-field>\r\n <mat-label>Team</mat-label>\r\n <mat-select [(ngModel)]=\"selectedTeam\" #team=\"ngModel\" name=\"team\" required [disabled]=\"!isNew()\">\r\n @for (t of availableTeams(); track $index;) {\r\n <mat-option [value]=\"t\">\r\n {{t.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (team.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n <div fxLayout=\"row wrap\" fxLayoutAlign=\"space-between center\" fxFill>\r\n <div fxFlex=\"29\" fxFlex.xs=\"100\">\r\n <mat-form-field class=\"wide\">\r\n <mat-label>Colore</mat-label>\r\n <mat-select name=\"color\" [(ngModel)]=\"item.color\" #color=\"ngModel\" name=\"color\" required>\r\n <mat-select-trigger>\r\n @if (item.color) {\r\n <span style=\"display:inline-flex;align-items:center;gap:8px;\">\r\n <span [style.background]=\"item.color\" style=\"width:14px;height:14px;border-radius:50%;display:inline-block;flex-shrink:0;\"></span>\r\n {{ colorName(item.color) }}\r\n </span>\r\n }\r\n </mat-select-trigger>\r\n @for (c of colors; track c) {\r\n <mat-option [value]=\"c.value\">\r\n <span style=\"display:inline-flex;align-items:center;gap:8px;\">\r\n <span [style.background]=\"c.value\"\r\n style=\"width:16px;height:16px;border-radius:50%;display:inline-block;\"></span>\r\n {{ c.name }}\r\n </span>\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (color.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <div fxFlex=\"69\" fxFlex.xs=\"100\">\r\n <mat-form-field class=\"wide\">\r\n <mat-label>Etichetta</mat-label>\r\n <input matInput name=\"name\" [(ngModel)]=\"item.name\" #name=\"ngModel\" maxlength=\"100\" required />\r\n @if (name.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n <mat-hint align=\"end\">{{name.value?.length || 0}}/100 </mat-hint>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <mat-form-field>\r\n <mat-label>Note</mat-label>\r\n <textarea matInput [(ngModel)]=\"item.note\" name=\"note\" maxlength=\"1000\" #text=\"ngModel\" cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"1\" cdkAutosizeMaxRows=\"10\"></textarea>\r\n <mat-hint align=\"end\">{{text.value?.length || 0}}/1000 </mat-hint>\r\n </mat-form-field>\r\n </div>\r\n\r\n </form>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxLayoutAlign=\"end\" fxFill>\r\n <button mat-flat-button [disabled]=\"f.form.invalid\" (click)=\"ok()\">Salva</button>\r\n <button mat-stroked-button [mat-dialog-close]=\"true\">Annulla</button>\r\n </div>\r\n </div>\r\n</mat-dialog-actions>","import { Breakpoints } from '@angular/cdk/layout';\r\nimport { ChangeDetectionStrategy, Component, afterNextRender, inject, viewChild } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MAT_DIALOG_DATA, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatDrawer, MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport {\r\n ClipperDocumentInfo,\r\n ClipperQueryReferencesMode, ClipperReferencesSearchParams, ClipperSearchFacetsResult, ClipperSearchFacetsSnapshot,\r\n ClipperSearchParams,\r\n ClipperUserInfo\r\n} from '@arsedizioni/ars-utils/clipper.common';\r\nimport { ApiResult, SelectableModel, SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { finalize } from 'rxjs/operators';\r\nimport { ClipperSearchResultManager } from '../search-result-manager/search-result-manager';\r\nimport { ClipperDocumentMenuComponent } from '../document-menu/document-menu.component';\r\nimport { ClipperSearchFacetsComponent } from '../search-facets/search-facets.component';\r\nimport { ClipperSearchResultItemComponent } from '../search-result-item/search-result-item.component';\r\n\r\n\r\nexport interface ClipperReferencesDialogData {\r\n mode?: ClipperQueryReferencesMode;\r\n anchor?: string;\r\n anchorTitle?: string;\r\n documentId: string;\r\n model: number;\r\n canUseArchive?: boolean;\r\n canHandleTooManyResults?: boolean;\r\n}\r\n\r\nexport interface ClipperReferenceDialogResult {\r\n documentId: string;\r\n}\r\n\r\n@Component({\r\n host: { 'Bind': SystemUtils.generateUUID() },\r\n templateUrl: './references.component.html',\r\n styleUrls: ['./references.component.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n FlexLayoutModule,\r\n MatDialogTitle,\r\n MatButtonModule,\r\n MatTooltipModule,\r\n MatIconModule,\r\n MatCheckboxModule,\r\n MatSlideToggleModule,\r\n FormsModule,\r\n MatMenuModule,\r\n MatBadgeModule,\r\n MatPaginatorModule,\r\n MatDialogContent,\r\n MatSidenavModule,\r\n MatProgressBarModule,\r\n ClipperDocumentMenuComponent,\r\n ClipperSearchFacetsComponent,\r\n ClipperSearchResultItemComponent,\r\n ],\r\n})\r\nexport class ClipperReferencesComponent extends ClipperSearchResultManager {\r\n readonly filterPane = viewChild<MatDrawer>('filterPane');\r\n\r\n private readonly dialogRef = inject(MatDialogRef<ClipperReferencesComponent>);\r\n protected readonly dialogData: ClipperReferencesDialogData = inject(MAT_DIALOG_DATA) ?? { mode: ClipperQueryReferencesMode.ReferencesIn };\r\n protected title?: string;\r\n protected item?: ClipperDocumentInfo;\r\n protected readonly user: ClipperUserInfo | undefined = this.clipperService.loginInfo?.context;\r\n private _viewReady = false;\r\n\r\n constructor() {\r\n super();\r\n if (this.dialogData) {\r\n switch (this.dialogData.mode) {\r\n case ClipperQueryReferencesMode.ReferencesIn:\r\n this.title = \"Documenti richiamati nelle note o nel testo\";\r\n break;\r\n case ClipperQueryReferencesMode.ReferencesOut:\r\n this.title = \"Documenti che richiamano quello in visione\";\r\n break;\r\n case ClipperQueryReferencesMode.ChangesIn:\r\n this.title = \"Modifiche subite\";\r\n break;\r\n case ClipperQueryReferencesMode.ChangesOut:\r\n this.title = \"Modifiche apportate\";\r\n break;\r\n case ClipperQueryReferencesMode.Juris:\r\n this.title = \"Giurisprudenza associata\";\r\n break;\r\n }\r\n if (this.dialogData.anchorTitle) {\r\n this.title += \" - \" + this.dialogData.anchorTitle;\r\n }\r\n // Use service snapshot\r\n this.snapshot = this.clipperService.referencesSnapshot() ?? { searchParams: new ClipperSearchParams(), interval: \"-1\" };\r\n if (\r\n this.filterParams.mode !== this.dialogData.mode ||\r\n this.filterParams.id !== this.dialogData.documentId ||\r\n this.filterParams.anchor !== this.dialogData.anchor\r\n ) {\r\n this.filterParams = new ClipperSearchParams();\r\n this.filterParams.mode = this.dialogData.mode;\r\n this.filterParams.model = this.dialogData.model;\r\n this.filterParams.anchor = this.dialogData.anchor;\r\n this.filterParams.id = this.dialogData.documentId;\r\n this.filterParams.useModifierInfo = this.dialogData.mode === ClipperQueryReferencesMode.ChangesOut;\r\n this.filterParams.returnModifierInfo = this.dialogData.mode !== ClipperQueryReferencesMode.ChangesOut;\r\n this.clipperService.referencesSnapshot.set(this.snapshot);\r\n }\r\n }\r\n\r\n // Initialize selection\r\n this.selection = new SelectableModel<ClipperDocumentInfo, string>(true, 'documentId');\r\n\r\n // Observe layout changes\r\n this.breakpointObserver\r\n .observe([\r\n Breakpoints.XSmall,\r\n Breakpoints.Small,\r\n Breakpoints.Medium,\r\n Breakpoints.Large,\r\n Breakpoints.XLarge,\r\n ])\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((result: any) => {\r\n if (!this._viewReady) return; // DOM not ready yet\r\n for (const query of Object.keys(result.breakpoints)) {\r\n if (result.breakpoints[query]) {\r\n this.handleFilterPaneVisibility();\r\n }\r\n }\r\n });\r\n\r\n // Run view-dependent initialization after the first render.\r\n afterNextRender(() => {\r\n this._viewReady = true;\r\n this.handleFilterPaneVisibility();\r\n const filterPane = this.filterPane();\r\n if (filterPane) {\r\n filterPane.openedChange\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(opened => {\r\n if (filterPane.mode === 'over') {\r\n this.filterPaneHasBackdrop.set(opened);\r\n }\r\n });\r\n }\r\n const facets = this.facets();\r\n if (facets) {\r\n facets.changed\r\n .subscribe((value: ClipperSearchFacetsSnapshot) => {\r\n this.snapshot.facets = value;\r\n this.fetch(true);\r\n });\r\n }\r\n this.fetch(true);\r\n this.restoreFacets();\r\n this.changeDetector.markForCheck();\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Toggles the filter pane open/closed state.\r\n */\r\n protected toggleFilterPane(): void {\r\n this.filterPaneClosed.set(!this.filterPaneClosed());\r\n this.filterPane()?.toggle();\r\n }\r\n\r\n\r\n\r\n /**\r\n * Adjusts the filter pane mode (side vs. overlay) and backdrop based on the current breakpoint.\r\n */\r\n private handleFilterPaneVisibility(): void {\r\n const filterPane = this.filterPane();\r\n if (filterPane) {\r\n if (this.breakpointObserver.isMatched(Breakpoints.XSmall) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Small) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Medium)) {\r\n if (filterPane.opened) {\r\n filterPane.close();\r\n }\r\n filterPane.mode = 'over';\r\n filterPane.disableClose = false;\r\n this.filterPaneHasBackdrop.set(filterPane.opened);\r\n } else {\r\n if (!this.hasFacets()) {\r\n filterPane.close();\r\n } else if (!filterPane.opened && !this.filterPaneClosed()) {\r\n filterPane.open();\r\n } else if (filterPane.opened && this.filterPaneClosed()) {\r\n filterPane.close();\r\n }\r\n filterPane.mode = 'side';\r\n filterPane.disableClose = true;\r\n this.filterPaneHasBackdrop.set(false);\r\n }\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Closes the references dialog without returning a result.\r\n */\r\n close(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n\r\n\r\n /**\r\n * Sends document links by email for the given item or, when omitted, for all selected items.\r\n * @param item - The specific document to send, or `undefined` to use the current selection.\r\n */\r\n sendTo(item?: ClipperDocumentInfo): void {\r\n this.sendItemsTo(item ? [item] : this.selection?.all);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Builds the search parameters for the next fetch call.\r\n * @param newSearch - When `true`, resets the pagination offset to 0.\r\n * @returns A cloned and enriched `ClipperSearchParams` ready to be sent to the API.\r\n */\r\n private prepareFetch(newSearch: boolean = false): ClipperSearchParams {\r\n const newParams = SystemUtils.clone(this.filterParams) as ClipperSearchParams;\r\n newParams.count = 15;\r\n newParams.useModifierInfo =\r\n newParams.mode === ClipperQueryReferencesMode.ChangesOut;\r\n newParams.returnModifierInfo =\r\n newParams.mode !== ClipperQueryReferencesMode.ChangesOut;\r\n // New search, reset paging\r\n if (newSearch) {\r\n newParams.first = 0;\r\n this.filterParams.first = 0;\r\n }\r\n\r\n // Apply facets\r\n if (this.snapshot.facets?.fromDate) {\r\n newParams.fromDate = this.snapshot.facets?.fromDate;\r\n newParams.toDate = this.snapshot.facets?.toDate;\r\n newParams.year = this.snapshot.facets?.fromDate.getFullYear();\r\n }\r\n if (this.snapshot.facets?.sector) {\r\n newParams.sector = this.snapshot.facets?.sector;\r\n }\r\n if (this.snapshot.facets?.type) {\r\n newParams.type = this.snapshot.facets?.type;\r\n }\r\n if (this.snapshot.facets?.author) {\r\n newParams.author = this.snapshot.facets?.author;\r\n }\r\n return newParams;\r\n }\r\n\r\n /**\r\n * Maps a generic `ClipperSearchParams` to the references-specific API parameter shape.\r\n * @param params - The base search parameters to convert.\r\n * @returns A `ClipperReferencesSearchParams` object ready for the references endpoint.\r\n */\r\n private toReferencesSearchParams(params: ClipperSearchParams): ClipperReferencesSearchParams {\r\n return {\r\n documentId: params.id,\r\n year: params.year,\r\n sector: params.sector,\r\n author: params.author,\r\n anchor: params.anchor,\r\n model: params.model?.toString() ?? null,\r\n mode: params.mode,\r\n excludeTextReferences: params.excludeTextReferences,\r\n excludeNotesReferences: params.excludeNotesReferences,\r\n returnModifierInfo: params.returnModifierInfo,\r\n useModifierInfo: params.useModifierInfo,\r\n count: 15,\r\n first: params.first ?? 0\r\n }\r\n }\r\n\r\n /**\r\n * Executes the references search and updates the result snapshot.\r\n * @param newSearch - When `true`, resets pagination and reloads facets. Defaults to `false`.\r\n */\r\n fetch(newSearch: boolean = false): void {\r\n if (!this.clipperService.loggedIn()) return;\r\n this.dialogService.busy('Ricerca in corso...');\r\n const searchParams = this.prepareFetch(newSearch);\r\n if (searchParams) {\r\n this.clipperService.references(this.toReferencesSearchParams(searchParams))\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) this.dialogService.error(r.message);\r\n else {\r\n this.prepareResults(r.value, newSearch);\r\n\r\n // Handle facets\r\n if (this.snapshot.total > 0) {\r\n if (newSearch)\r\n // Update facets\r\n this.fetchFacets(searchParams);\r\n } else {\r\n this.hideFacets();\r\n }\r\n\r\n if (newSearch) {\r\n const paginator = this.paginator();\r\n if (paginator) paginator.pageIndex = 0;\r\n }\r\n\r\n this.scroll(0);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Navigates to the next result page.\r\n * @param e - The `PageEvent` emitted by the paginator with the new page index and size.\r\n */\r\n fetchMore(e: PageEvent): void {\r\n const first = e.pageIndex * (this.filterParams.count ?? 15);\r\n this.filterParams.first = first;\r\n this.fetch();\r\n }\r\n\r\n /**\r\n * Loads available facets for the current search parameters and updates the filter pane.\r\n * @param params - The search parameters used to request facets from the API.\r\n */\r\n fetchFacets(params: ClipperSearchParams): void {\r\n if (!this.clipperService.loggedIn() || !params) return;\r\n if (!this.snapshot.facets || this.snapshot.facets?.hasMoreFacets) {\r\n this.filterBusy.set(true);\r\n this.clipperService.referencesFacets(this.toReferencesSearchParams(params))\r\n .subscribe({\r\n next: (r: ApiResult<ClipperSearchFacetsResult>) => {\r\n if (r.success) {\r\n let hasFacets = (r.value.facets?.length ?? 0) > 0;\r\n if (r.value.facets) {\r\n const facets = this.facets();\r\n facets?.update(r.value.facets, r.value.interval);\r\n if (facets && this.snapshot) {\r\n hasFacets = facets.hasFacets();\r\n this.snapshot.facets = facets.save();\r\n this.snapshot.facets.hasTooManyResults = (this.snapshot?.total ?? 0) >= 1000;\r\n }\r\n }\r\n this.hasFacets.set(hasFacets);\r\n this.handleFilterPaneVisibility();\r\n }\r\n },\r\n complete: () => {\r\n this.filterBusy.set(false);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Hides the facet filter pane and resets all applied facet filters.\r\n */\r\n protected hideFacets(): void {\r\n this.hasFacets.set(false);\r\n this.facets()?.reset();\r\n this.filterPane().close();\r\n this.filterPaneClosed.set(false);\r\n }\r\n /**\r\n * Restores previously saved facets from the snapshot and adjusts the filter pane accordingly.\r\n */\r\n restoreFacets(): void {\r\n if (this.snapshot.facets) {\r\n this.facets().restore(this.snapshot.facets);\r\n this.handleFilterPaneVisibility();\r\n }\r\n }\r\n\r\n /**\r\n * Closes the dialog and navigates to the selected document.\r\n * @param documentId - The ID of the document to open.\r\n */\r\n override open(documentId?: string): void {\r\n if (documentId) this.dialogRef.close({ documentId });\r\n }\r\n\r\n /**\r\n * Returns the CSS class reflecting the item's validity state.\r\n * @param item - The document to evaluate.\r\n * @returns A CSS class name string, or `undefined` when no special state applies.\r\n */\r\n override getItemStateCssClass(item: ClipperDocumentInfo): string | undefined {\r\n if (item.isExpired) return 'expired-bg';\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Returns the tooltip text explaining the item's current validity state.\r\n * @param item - The document to evaluate.\r\n * @returns A human-readable state description, or an empty string when no special state applies.\r\n */\r\n override getItemStateTooltip(item: ClipperDocumentInfo): string {\r\n if (item.isExpired) return 'Non più vigente';\r\n return '';\r\n }\r\n}\r\n","<div class=\"clipper-references-fixed\">\r\n <div class=\"dialog-header\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"*\">\r\n <h2 mat-dialog-title>{{title}} </h2>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"start\" type=\"button\" mat-icon-button matTooltip=\"Chiudi\" aria-label=\"Chiudi\"\r\n (click)=\"close()\" class=\"dialog-close\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n @if (dialogData.mode > 0 || selection?.hasValue() || (snapshot && snapshot.facets?.hasFacets && filterPane &&\r\n (!filterPane.opened || filterPaneClosed()))) {\r\n <div class=\"dialog-toolbar\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFill>\r\n <div fxFlex=\"*\">\r\n @if (dialogData.mode === 1) {\r\n <mat-slide-toggle name=\"excludeTextReferences\" [(ngModel)]=\"filterParams.excludeTextReferences\"\r\n (change)=\"fetch(true)\">\r\n Mostra solo se citati nelle note\r\n </mat-slide-toggle>\r\n } @else if (dialogData.mode == 2) {\r\n <mat-slide-toggle name=\"excludeNotesReferences\" [(ngModel)]=\"filterParams.excludeNotesReferences\"\r\n (change)=\"fetch(true)\">\r\n Mostra solo se citano nel testo il documento\r\n </mat-slide-toggle>\r\n }\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n @if (selection?.hasValue()) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button\r\n matTooltip=\"Azioni da eseguire sugli elementi selezionati\"\r\n [attr.aria-label]=\"'Menu opzioni per elementi selezionati'\" [matMenuTriggerFor]=\"menuSelections\"\r\n [disabled]=\"!snapshot.total\" [matBadge]=\"selection?.all?.length\">\r\n <mat-icon>checklist</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSelections=\"matMenu\">\r\n <clipper-document-menu [parent]=\"this\" selectionSource=\"selection\" [useSelections]=\"true\"\r\n [canUseArchive]=\"dialogData.canUseArchive ?? false\"\r\n [isReadable]=\"false\" [isReference]=\"true\" [canUseAIAssistant]=\"user?.hasAIAssistant ?? false\">\r\n </clipper-document-menu>\r\n </mat-menu>\r\n @if (snapshot && snapshot.facets?.hasFacets && filterPane && (!filterPane.opened || filterPaneClosed())) {\r\n <div fxFlexAlign=\"center\">\r\n <button type=\"button\" mat-icon-button matTooltip=\"Affina ricerca\" aria-label=\"'Affina ricerca'\"\r\n (click)=\"toggleFilterPane()\">\r\n <mat-icon>right_panel_open</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n<mat-dialog-content id=\"clipper-references-scrollable\">\r\n <mat-drawer-container class=\"fill\" [hasBackdrop]=\"filterPaneHasBackdrop()\">\r\n <mat-drawer #filterPane position=\"end\" class=\"drawer-small drawer-with-loader\" opened=\"false\">\r\n @if (filterBusy()) {\r\n <div class=\"overlay\"></div>\r\n }\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"6px\">\r\n @if (filterBusy()) {\r\n <mat-progress-bar style=\"z-index: 11;\" mode=\"indeterminate\">\r\n </mat-progress-bar>\r\n }\r\n </div>\r\n <div fxFlex=\"78px\" class=\"title-container-with-loader\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFill>\r\n <div class=\"title\">Affina ricerca</div>\r\n <div fxFlex=\"*\" fxLayoutAlign=\"end\">\r\n <button mat-icon-button (click)=\"toggleFilterPane()\"\r\n matTooltip=\"Nascondi\"><mat-icon>right_panel_close</mat-icon></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" class=\"scroll-hidden\" style=\"padding: 0 5px;\">\r\n <clipper-search-facets #facets [handleTooManyResults]=\"dialogData.canHandleTooManyResults\" ></clipper-search-facets>\r\n </div>\r\n </div>\r\n </mat-drawer>\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"*\" [id]=\"scrollerId\" class=\"scroll-auto\" style=\"padding: 0 5px;\">\r\n @if (!snapshot.total) {\r\n <div class=\"message-container\">\r\n <p class=\"message\"><b>Nessun elemento da visualizzare.</b></p>\r\n </div>\r\n } @else {\r\n <div>\r\n @for (item of snapshot.items; track $index; let i = $index) {\r\n @if (item.group) {\r\n <div class=\"items-group-title\">\r\n <div [class.group-spaced]=\"i > 0\">{{item.group}}</div>\r\n </div>\r\n }\r\n <clipper-search-result-item [item]=\"item\" [parent]=\"this\" [isReadable]=\"false\"\r\n [actions]=\"contextMenu\"></clipper-search-result-item>\r\n }\r\n <mat-menu #contextMenu=\"matMenu\" (closed)=\"updateMenuButtonsVisibility()\">\r\n <ng-template matMenuContent let-item=\"item\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"item\" [isReadable]=\"false\" [isReference]=\"true\"\r\n [canUseAIAssistant]=\"user?.hasAIAssistant ?? false\" [canUseArchive]=\"dialogData.canUseArchive ?? false\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n </div>\r\n }\r\n </div>\r\n <!-- footer -->\r\n @if ((snapshot?.total ?? 0) > 0) {\r\n <div class=\"items-footer\">\r\n <div fxLayout=\"row wrap\" fxLayoutGap=\"10px\" fxLayoutAlign=\"space-between center\" fxFill>\r\n <!-- legend -->\r\n <div fxFlex.lt-md=\"100\" class=\"legend-container\">\r\n <div class=\"legend expired-bg \"></div>\r\n non più vigente\r\n </div>\r\n <div fxFlex.lt-md=\"100\" fxLayoutAlign=\"end\" [class.wide]=\"filterPane?.opened\">\r\n <div fxLayout=\"row\">\r\n <mat-paginator fxFlexAlign=\"center\" #paginator class=\"paginator\" [hidePageSize]=\"true\"\r\n [length]=\"snapshot?.total ?? 0\" [pageSize]=\"filterParams.count ?? 15\" [showFirstLastButtons]=\"true\"\r\n (page)=\"fetchMore($event)\">\r\n </mat-paginator>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mat-drawer-container>\r\n</mat-dialog-content>","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, input, signal, output, viewChild } from '@angular/core';\r\nimport { DateInterval } from '@arsedizioni/ars-utils/core';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { FlexModule } from '@ngbracket/ngx-layout/flex';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatCalendar, MatCalendarCellClassFunction } from '@angular/material/datepicker';\r\nimport { endOfDay, endOfMonth, startOfMonth, startOfToday, subDays } from 'date-fns';\r\nimport { CalendarEmptyHeader } from '@arsedizioni/ars-utils/ui.application';\r\nimport { ClipperSearchCalendarSnapshotMonth, ClipperSearchCalendarSnapshotResult } from '@arsedizioni/ars-utils/clipper.common';\r\n\r\n\r\n\r\n@Component({\r\n selector: 'clipper-search-calendar',\r\n templateUrl: './search-calendar.component.html',\r\n styleUrls: ['./search-calendar.component.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n FlexModule,\r\n MatButtonModule,\r\n MatTooltipModule,\r\n MatCalendar,\r\n MatChipsModule,\r\n MatIconModule,\r\n MatDividerModule,\r\n MatExpansionModule\r\n ],\r\n})\r\nexport class ClipperSearchCalendarComponent {\r\n readonly calendar = viewChild.required<MatCalendar<any>>('calendar');\r\n readonly changed = output<DateInterval | undefined>();\r\n private readonly changeDetector = inject(ChangeDetectorRef);\r\n\r\n protected busy = signal<boolean>(false);\r\n protected months = signal<ClipperSearchCalendarSnapshotMonth[] | undefined>(undefined);\r\n protected calendarSpecialDays?: number[];\r\n protected calendarEmptyHeader = CalendarEmptyHeader;\r\n public calendarDate: Date = startOfToday();\r\n protected calendarDateClass: MatCalendarCellClassFunction<Date> = (cellDate) => {\r\n if (!this.calendarSpecialDays) return '';\r\n if (this.calendarSpecialDays[cellDate.getDate() - 1] > 0) {\r\n if (cellDate < startOfToday()) return 'special-date-expired';\r\n else if (subDays(cellDate, 15) <= startOfToday()) return 'special-date-expiring';\r\n else return 'special-date';\r\n }\r\n return '';\r\n };\r\n protected calendarDateFilter = (cellDate: Date): boolean => {\r\n return this.canFilter() && this.calendarSpecialDays != null && this.calendarSpecialDays[cellDate.getDate() - 1] > 0;\r\n }\r\n readonly canFilter = input<boolean>(false);\r\n\r\n\r\n /**\r\n * Refreshes the calendar with a new month/days snapshot and updates the active date.\r\n * @param month - The single-month snapshot used to populate special-day highlighting.\r\n * @param months - The full year snapshot used to populate the month-selector chips.\r\n * @param date - The date the calendar should navigate to. Defaults to today.\r\n */\r\n update(month?: ClipperSearchCalendarSnapshotResult,\r\n months?: ClipperSearchCalendarSnapshotResult,\r\n date: Date = startOfToday()): void {\r\n if (months?.months) {\r\n this.months.set(months.months);\r\n }\r\n if (month && month.months && month.months.length > 0) {\r\n this.calendarSpecialDays = month.months[0].days;\r\n }\r\n const calendar = this.calendar();\r\n if (calendar) {\r\n calendar.activeDate = date;\r\n calendar.selected = date;\r\n calendar.updateTodaysDate();\r\n }\r\n this.calendarDate = date;\r\n this.changeDetector.markForCheck();\r\n }\r\n\r\n\r\n /**\r\n * Emits a `DateInterval` for the given date or, when `'month'` is passed, for the entire\r\n * current calendar month. Passing `undefined` clears the active date filter.\r\n * @param date - A specific `Date` to filter by, the string `'month'` to filter the whole\r\n * month, or `undefined` to clear the filter.\r\n */\r\n protected filterByDate(date?: Date | string): void {\r\n if (date === 'month') {\r\n if (this.calendarDate) {\r\n const today = new Date();\r\n const start = endOfDay(startOfMonth(this.calendarDate));\r\n const end = endOfMonth(this.calendarDate);\r\n this.changed.emit(new DateInterval(start, end));\r\n if (start <= today && end >= today) {\r\n const calendar = this.calendar();\r\n calendar.selected = today;\r\n calendar.updateTodaysDate();\r\n }\r\n }\r\n } else if (date) {\r\n const d = date as Date;\r\n this.changed.emit(new DateInterval(endOfDay(d), endOfDay(d)));\r\n this.calendarDate = d;\r\n const calendar = this.calendar();\r\n calendar.selected = d;\r\n calendar.updateTodaysDate();\r\n } else {\r\n this.changed.emit(undefined);\r\n }\r\n }\r\n\r\n /**\r\n * Navigates the calendar to the given month and emits its full date range as a filter.\r\n * @param monthInfo - The month snapshot to navigate to and filter by.\r\n */\r\n protected filterByMonth(monthInfo: ClipperSearchCalendarSnapshotMonth): void {\r\n const newDate = new Date(monthInfo.year, monthInfo.month - 1, 1);\r\n const today = new Date();\r\n const start = endOfDay(startOfMonth(newDate));\r\n const end = endOfMonth(newDate);\r\n this.changed.emit(new DateInterval(start, end));\r\n this.calendarSpecialDays = monthInfo.days;\r\n const calendar = this.calendar();\r\n if (start <= today && end >= today) {\r\n calendar.selected = today;\r\n }\r\n calendar.activeDate = newDate;\r\n calendar.updateTodaysDate();\r\n this.calendarDate = newDate;\r\n }\r\n}\r\n","<div fxLayout=\"column\" fxFill class=\"calendar-container scroll-hidden\">\r\n <div class=\"calendar-months\">\r\n <div>\r\n <div fxLayout=\"row wrap\" fxLayoutAlign=\"center\" fxLayoutGap=\"8px\" fxFill>\r\n @for (m of months(); track $index) {\r\n <button fxFlex=\"37px\" mat-button class=\"small uppercase\" (click)=\"filterByMonth(m)\" [disabled]=\"m.total === 0\">\r\n @if (m.expired) {\r\n <span class=\"expired\" [matTooltip]=\"m.expired + ' elementi in ritardo'\">{{m.monthShortName}}</span>\r\n } @else {\r\n <span [matTooltip]=\"m.total + ' elementi'\">{{m.monthShortName}}</span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"separator\"></div>\r\n </div>\r\n <div fxFlex=\"*\" class=\"scroll-auto\">\r\n @if (!busy()) {\r\n <mat-calendar #calendar [headerComponent]=\"calendarEmptyHeader\" [dateClass]=\"calendarDateClass\"\r\n [dateFilter]=\"calendarDateFilter\" (selectedChange)=\"filterByDate($event)\" class=\"calendar-month\">\r\n </mat-calendar>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"space-around\" style=\"padding:0 15px\">\r\n <button type=\"button\" mat-stroked-button (click)=\"filterByDate('month')\">Tutto il\r\n mese</button>\r\n </div>\r\n }\r\n </div>\r\n</div>","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { FlexModule } from '@ngbracket/ngx-layout/flex';\r\n\r\n@Component({\r\n host: { 'Bind': SystemUtils.generateUUID() },\r\n templateUrl: './search-free-text-help.component.html',\r\n styleUrls: ['./search-free-text-help.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [MatDialogTitle, MatDialogContent, MatDialogActions, FlexModule, MatButtonModule, MatDialogClose]\r\n})\r\nexport class ClipperSearchFreeTextHelpComponent{\r\n}\r\n","<h2 mat-dialog-title>Come effettuare la ricerca in testo libero</h2>\r\n<mat-dialog-content>\r\n <p>Normalmente viene sempre effettuata una ricerca per frase: tutte le parole specificate debbono essere\r\n \"ragionevolmente vicine\" (entro 5 parole) l'una dall'altra.</p>\r\n <p>La ricerca per frase di solito produce i risultati più rilevanti.</p>\r\n <p>Tuttavia è possibile istruire Clipper per eseguire ricerche differenti e più complesse.</p>\r\n <p>Tutte gli elementi che compongono la stringa di ricerca devono essere separati da virgola.</p>\r\n <ul>\r\n <li>Se un elemento è composto da più parole è una frase, altrimenti una parola</li>\r\n <li>Aggiungendo un <b style=\"font-size: 20px\">+</b> davanti all'elemento, l'elemento <b>dovrà per forza</b> essere presente nel documento\r\n </li>\r\n <li>Aggiungendo un <b style=\"font-size: 20px\">-</b> davanti all'elemento, l'elemento <b>non dovrà</b> essere presente nel documento</li>\r\n </ul>\r\n <p>Ecco alcuni esempi:</p>\r\n <ul>\r\n <li><b>serbatoi interrati</b>: sarà effettuata una ricerca per la frase \"serbatoi interrati\"</li>\r\n <li><b>serbatoi, interrati</b>: sarà effettuata una ricerca per le parole \"serbatoi\" e \"interrati\"; il risultato sarà tutti i documenti che contengono una o l'altra parola.</li>\r\n <li><b>serbatoi, +interrati</b>: sarà effettuata una ricerca per le parole \"serbatoi\" e \"interrati\"; il risultato sarà tutti i documenti che contengono necessariamente \"interrati\" ed eventualmente \"serbatoi\".</li>\r\n <li><b>serbatoi, -interrati</b>: sarà effettuata una ricerca per le parole \"serbatoi\" e \"interrati\"; il risultato sarà tutti i documenti che contengono necessariamente \"interrati\" ma non \"serbatoi\".</li>\r\n <li><b>\"serbatoi interrati\", -gas</b>: sarà effettuata una ricerca per la frase \"serbatoi interrati\" e per la parola \"gas\"; il risultato sarà tutti i documenti che contengono la frase \"serbatoi interrati\" ma non la parola \"gas\".</li>\r\n </ul>\r\n <p>Saranno mostrati per primi (più rilevanti) i documenti che rispettano in pieno la condizione.</p>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxLayoutAlign=\"end\" fxFill >\r\n <button mat-stroked-button [mat-dialog-close]=\"true\" >Chiudi</button>\r\n </div>\r\n </div>\r\n</mat-dialog-actions>\r\n","import { ChangeDetectionStrategy, Component, inject, output } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { DialogService } from '@arsedizioni/ars-utils/ui';\r\nimport { FlexModule } from '@ngbracket/ngx-layout/flex';\r\n\r\nexport interface SearchFreeTextQueryParams {\r\n query: string;\r\n}\r\n\r\n@Component({\r\n host: { 'Bind': SystemUtils.generateUUID() },\r\n templateUrl: './search-free-text-query-builder.component.html',\r\n styleUrls: ['./search-free-text-query-builder.component.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [MatDialogTitle, MatDialogContent, FormsModule, FlexModule, MatFormFieldModule, MatInputModule,\r\n MatButtonModule, MatIconModule, MatDialogActions, MatDialogClose]\r\n})\r\nexport class ClipperSearchFreeTextQueryBuilderComponent {\r\n readonly done = output<SearchFreeTextQueryParams>();\r\n\r\n private readonly dialogService = inject(DialogService);\r\n\r\n protected queryAnd: string = '';\r\n protected queryOr: string = '';\r\n protected queryNot: string = '';\r\n protected queryPhrase: string = '';\r\n protected queryStart: string = '';\r\n\r\n /**\r\n * Resets all query fields to empty strings.\r\n */\r\n protected clear(): void {\r\n this.queryAnd = '';\r\n this.queryOr = '';\r\n this.queryNot = '';\r\n this.queryPhrase = '';\r\n this.queryStart = '';\r\n }\r\n\r\n /**\r\n * Builds the Lucene-style free-text query from the current field values and emits it via `done`.\r\n * Shows an error dialog when only the NOT operator has been filled in, since it requires\r\n * at least one positive term to produce a valid query.\r\n */\r\n protected ok(): void {\r\n let query = '';\r\n const phrase = this.queryPhrase?.trim() ?? '';\r\n const and = this.queryAnd?.trim() ?? '';\r\n const or = this.queryOr?.trim() ?? '';\r\n const not = this.queryNot?.trim() ?? '';\r\n const start = this.queryStart?.trim() ?? '';\r\n\r\n // Phrase\r\n if (phrase.length > 0) {\r\n query += ` \"${phrase.replaceAll('\"', '')}\" `;\r\n }\r\n // OR — each comma-separated word is wrapped in quotes\r\n if (or.length > 0) {\r\n for (const part of or.split(',')) {\r\n if (query.length > 0) query += ' ';\r\n query += `\"${part.replaceAll('\"', '').trim()}\" `;\r\n }\r\n }\r\n // AND — each comma-separated word is prefixed with +\r\n if (and.length > 0) {\r\n for (const part of and.split(',')) {\r\n if (query.length > 0) query += ' ';\r\n query += `+\"${part.replaceAll('\"', '').trim()}\" `;\r\n }\r\n }\r\n // Starts-with — appends a wildcard suffix\r\n if (start.length > 0) {\r\n if (query.length > 0) query += ' ';\r\n query += `+\"${start.replaceAll('\"', '')}*\" `;\r\n }\r\n // NOT — each comma-separated word is prefixed with - (requires at least one positive term)\r\n if (not.length > 0) {\r\n if (query.length === 0) {\r\n this.dialogService.error(\r\n \"L'operatore di esclusione funziona solo se prima è stato inserito un valore in almeno uno degli altri quattro campi.\"\r\n );\r\n return;\r\n }\r\n for (const part of not.split(',')) {\r\n if (query.length > 0) query += ' ';\r\n query += `-\"${part.replaceAll('\"', '').trim()}\" `;\r\n }\r\n }\r\n\r\n if (query.length > 0) this.done.emit({ query: query.trim() });\r\n }\r\n}\r\n","<h2 mat-dialog-title>Trova gli elementi che contengono...</h2>\r\n<mat-dialog-content>\r\n <form name=\"form\" #f=\"ngForm\" (keyup.Enter)=\"!f.form.invalid ? ok() : null\" novalidate>\r\n <div fxLayout=\"column\" style=\"padding-bottom: 20px;\">\r\n <mat-form-field>\r\n <mat-label>Questa esatta parola o frase</mat-label>\r\n <input matInput name=\"queryPhrase\" [(ngModel)]=\"queryPhrase\" maxlength=\"200\" />\r\n @if (queryPhrase) {\r\n <a matSuffix mat-icon-button aria-label=\"Azzera\" (click)=\"queryPhrase=''\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n }\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>Tutte queste parole</mat-label>\r\n <input matInput name=\"queryAnd\" [(ngModel)]=\"queryAnd\" maxlength=\"200\" />\r\n @if (queryAnd) {\r\n <a matSuffix mat-icon-button aria-label=\"Azzera\" (click)=\"queryAnd=''\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n }\r\n <mat-hint>Separate da virgola</mat-hint>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>Una qualunque di queste parole</mat-label>\r\n <input matInput name=\"queryOr\" [(ngModel)]=\"queryOr\" maxlength=\"200\" />\r\n @if (queryOr) {\r\n <a matSuffix mat-icon-button aria-label=\"Azzera\" (click)=\"queryOr=''\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n }\r\n <mat-hint>Separate da virgola</mat-hint>\r\n </mat-form-field>\r\n <!--\r\n <mat-form-field>\r\n <mat-label>Parole che iniziano con</mat-label>\r\n <input matInput name=\"queryStart\" [(ngModel)]=\"queryStart\" maxlength=\"200\" />\r\n @if (queryStart) {\r\n <a matSuffix mat-icon-button aria-label=\"Azzera\" (click)=\"queryStart=''\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n }\r\n <mat-hint>Separate da virgola</mat-hint>\r\n </mat-form-field>\r\n -->\r\n <mat-form-field>\r\n <mat-label>Nessuna qualunque di queste parole</mat-label>\r\n <input matInput name=\"queryNot\" [(ngModel)]=\"queryNot\" maxlength=\"200\" />\r\n @if (queryNot) {\r\n <a matSuffix mat-icon-button aria-label=\"Azzera\" (click)=\"queryNot=''\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n }\r\n <mat-hint>Separate da virgola. L'operatore di esclusione funziona solo se prima è stato inserito un valore in\r\n almeno uno degli altri quattro campi. </mat-hint>\r\n </mat-form-field>\r\n </div>\r\n </form>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlex=\"30\" fxLayoutAlign=\"start\">\r\n <button type=\"button\" mat-stroked-button (click)=\"clear()\">Pulisci</button>\r\n </div>\r\n <div fxFlex=\"70\" fxLayoutAlign=\"end\">\r\n <button mat-flat-button (click)=\"ok()\">Ok</button>\r\n <button mat-stroked-button [mat-dialog-close]=\"true\">Annulla</button>\r\n </div>\r\n </div>\r\n</mat-dialog-actions>","/*\r\n * Public API Surface of ars-utils\r\n */\r\n\r\n\r\nexport * from './ui/index';\r\nexport * from './documents';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i2","i3","i4","i5","FlexModule","i6","i1","i7","i10","i12","i13","i15","finalize","i8","i9","i11"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"arsedizioni-ars-utils-clipper.ui.mjs","sources":["../../../projects/ars-utils/clipper.ui/ui/document-menu/document-menu.component.ts","../../../projects/ars-utils/clipper.ui/ui/document-menu/document-menu.component.html","../../../projects/ars-utils/clipper.ui/ui/search-facets/search-facets.component.ts","../../../projects/ars-utils/clipper.ui/ui/search-facets/search-facets.component.html","../../../projects/ars-utils/clipper.ui/ui/document-manager/document-manager.ts","../../../projects/ars-utils/clipper.ui/documents.ts","../../../projects/ars-utils/clipper.ui/ui/search-result-manager/search-result-manager.ts","../../../projects/ars-utils/clipper.ui/ui/contacts-selector/contacts-selector.ts","../../../projects/ars-utils/clipper.ui/ui/note-badge/note-badge.component.ts","../../../projects/ars-utils/clipper.ui/ui/note-badge/note-badge.component.html","../../../projects/ars-utils/clipper.ui/ui/search-result-item/search-result-item.component.ts","../../../projects/ars-utils/clipper.ui/ui/search-result-item/search-result-item.component.html","../../../projects/ars-utils/clipper.ui/ui/browser/browser.component.ts","../../../projects/ars-utils/clipper.ui/ui/browser/browser.component.html","../../../projects/ars-utils/clipper.ui/ui/browser/browser-dialog/browser-dialog.component.ts","../../../projects/ars-utils/clipper.ui/ui/browser/browser-dialog/browser-dialog.component.html","../../../projects/ars-utils/clipper.ui/ui/contact-edit/contact-edit.component.ts","../../../projects/ars-utils/clipper.ui/ui/contact-edit/contact-edit.component.html","../../../projects/ars-utils/clipper.ui/ui/document/document.component.ts","../../../projects/ars-utils/clipper.ui/ui/document/document.component.html","../../../projects/ars-utils/clipper.ui/ui/document-index/document-index.component.ts","../../../projects/ars-utils/clipper.ui/ui/document-index/document-index.component.html","../../../projects/ars-utils/clipper.ui/ui/note-edit/note-edit.component.ts","../../../projects/ars-utils/clipper.ui/ui/note-edit/note-edit.component.html","../../../projects/ars-utils/clipper.ui/ui/references/references.component.ts","../../../projects/ars-utils/clipper.ui/ui/references/references.component.html","../../../projects/ars-utils/clipper.ui/ui/search-calendar/search-calendar.component.ts","../../../projects/ars-utils/clipper.ui/ui/search-calendar/search-calendar.component.html","../../../projects/ars-utils/clipper.ui/ui/search-free-text-help/search-free-text-help.component.ts","../../../projects/ars-utils/clipper.ui/ui/search-free-text-help/search-free-text-help.component.html","../../../projects/ars-utils/clipper.ui/ui/search-free-text-query-builder/search-free-text-query-builder.component.ts","../../../projects/ars-utils/clipper.ui/ui/search-free-text-query-builder/search-free-text-query-builder.component.html","../../../projects/ars-utils/clipper.ui/public_api.ts","../../../projects/ars-utils/clipper.ui/arsedizioni-ars-utils-clipper.ui.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, DestroyRef, Renderer2, afterNextRender, computed, inject, input, signal, viewChild } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\r\nimport { FlexModule } from '@ngbracket/ngx-layout';\r\nimport { ClipperDocumentInfo, ClipperModel, ClipperService, ClipperUtils } from '@arsedizioni/ars-utils/clipper.common';\r\n\r\n@Component({\r\n selector: 'clipper-document-menu',\r\n templateUrl: './document-menu.component.html',\r\n styleUrls: ['./document-menu.component.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [FlexModule, MatMenuModule, MatIconModule, MatDividerModule, MatTooltipModule]\r\n})\r\nexport class ClipperDocumentMenuComponent {\r\n\r\n private readonly rsMenuTrigger = viewChild<MatMenuTrigger>('rsMenuTrigger');\r\n private readonly aiAssistantMenuTrigger = viewChild<MatMenuTrigger>('aiAssistantMenuTrigger');\r\n private readonly linksMenuTrigger = viewChild<MatMenuTrigger>('linksMenuTrigger');\r\n private readonly allMenuTriggers = [\r\n this.linksMenuTrigger,\r\n this.rsMenuTrigger,\r\n this.aiAssistantMenuTrigger,\r\n ];\r\n\r\n private readonly renderer2 = inject(Renderer2);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly clipperService = inject(ClipperService);\r\n\r\n /** Internal counter incremented on each external selection-model change to drive signal re-evaluation. */\r\n private readonly selectionChangeTick = signal(0);\r\n\r\n readonly useSelections = input<boolean>(false);\r\n readonly selectionSource = input<'bag' | 'selection' | 'none' | undefined>('selection');\r\n\r\n /**\r\n * Computed signal that returns the current effective document selection.\r\n * Re-evaluates when any input signal or the underlying selection model changes.\r\n */\r\n protected readonly selection = computed((): ClipperDocumentInfo[] => {\r\n this.selectionChangeTick(); // track external SelectionModel changes\r\n if (this.useSelections()) {\r\n switch (this.selectionSource()) {\r\n case 'bag': return this.parent()?.clipperService.bag() ?? [];\r\n case 'selection': return this.parent()?.selection?.all ?? [];\r\n }\r\n }\r\n return [];\r\n });\r\n\r\n readonly parent = input.required<any>();\r\n readonly item = input<ClipperDocumentInfo>();\r\n readonly isReference = input<boolean>(false);\r\n readonly isReadable = input<boolean>(true);\r\n readonly isReadableModel = input<ClipperModel | undefined>(undefined);\r\n readonly isLawInForce = input<boolean>(false);\r\n readonly canPrint = input<boolean>(false);\r\n readonly canFind = input<boolean>(false);\r\n readonly canUseCalendar = input<boolean>(false);\r\n readonly canUseArchive = input<boolean>(false);\r\n readonly canUseNotes = input<boolean>(false);\r\n readonly canUseAIAssistant = input<boolean>(false);\r\n\r\n protected readonly canUseAIEditor: boolean = this.clipperService.loginInfo?.context.hasAIEditor ?? false;\r\n\r\n readonly canUseRS = input<boolean>(true);\r\n readonly canOpenDocument = input<boolean>(true);\r\n\r\n /** `true` when the current selection source is 'selection' and at least one item is selected. */\r\n protected readonly canDeselectAll = computed(() =>\r\n this.selectionSource() === 'selection' && this.selection().length > 0\r\n );\r\n /** `true` when operating in bag-management mode. */\r\n protected readonly canManageBag = computed(() => this.selectionSource() === 'bag');\r\n /** `true` when opening a document is allowed and exactly one item is selected. */\r\n protected readonly canOpen = computed(() => this.canOpenDocument() && this.hasSingleSelection());\r\n /** `true` when at least one item can be sent by email. */\r\n protected readonly canSendByEmail = computed(() => this.getMultipleSelection().length > 0);\r\n /** `true` when custom notes can be added to the single selected document. */\r\n protected readonly canAddNotes = computed(() =>\r\n this.canUseNotes() &&\r\n this.clipperService.loginInfo?.context.hasSharedNotes === true &&\r\n this.hasSingleSelection()\r\n );\r\n /** `true` when archive access is enabled and there is at least one selected item. */\r\n protected readonly canAddToArchive = computed(() => this.canUseArchive() && this.canSendByEmail());\r\n /** `true` when all selected items are deadline/alert documents and calendar is enabled. */\r\n protected readonly canAddToCalendar = computed(() =>\r\n this.getMultipleSelection().every(\r\n n => n.model === ClipperModel.Scadenze || n.model === ClipperModel.Segnalazioni\r\n ) && this.canUseCalendar() && !this.isReference()\r\n );\r\n /** `true` when all selected items can be exported as an ICS calendar file. */\r\n protected readonly canExportCalendar = computed(() =>\r\n this.getMultipleSelection().every(\r\n n => n.model === ClipperModel.Scadenze || n.model === ClipperModel.Segnalazioni\r\n ) && this.canUseCalendar() && !this.isReference()\r\n );\r\n /** `true` when the selection contains non-Coordinamento items that can be added to working documents. */\r\n protected readonly canAddToWorkingDocuments = computed(() => {\r\n if (this.selectionSource() === 'bag') return false;\r\n const items = this.getMultipleSelection();\r\n return items.length > 0 && items.every(n => n.model !== ClipperModel.Coordinamento);\r\n });\r\n /** `true` when a single non-Coordinamento document is selected and can be saved as PDF. */\r\n protected readonly canSaveAsPdf = computed(() => {\r\n const item = this.getSingleSelection();\r\n return item !== undefined && item.model !== ClipperModel.Coordinamento;\r\n });\r\n /** `true` when the selection contains at least one unread document that supports the read state. */\r\n protected readonly canSetAsRead = computed(() => {\r\n const items = this.getMultipleSelection();\r\n return this.isReadable() && (\r\n items.length > 1 ||\r\n (items.length === 1 && items[0].isRead !== true &&\r\n ClipperUtils.isClipperModelReadable(this.isReadableModel() ?? items[0].model))\r\n );\r\n });\r\n /** `true` when the selection contains at least one already-read document that supports the read state. */\r\n protected readonly canSetAsUnread = computed(() => {\r\n const items = this.getMultipleSelection();\r\n return this.isReadable() && (\r\n items.length > 1 ||\r\n (items.length === 1 && items[0].isRead === true &&\r\n ClipperUtils.isClipperModelReadable(this.isReadableModel() ?? items[0].model))\r\n );\r\n });\r\n /** `true` when the Clipper service supports RS and all selected items are RS-enabled. */\r\n protected readonly canAccessRS = computed(() => {\r\n const items = this.getMultipleSelection();\r\n return this.clipperService.supportsRS() && this.canUseRS() && this.parent()?.RS_enabled(items) === true;\r\n });\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n if (this.selectionSource() === 'selection') {\r\n this.parent()?.selection?.changed\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.selectionChangeTick.update(v => v + 1));\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Returns a single selected document: the bound item if present, or the sole item in the selection list.\r\n * @returns The selected document, or `undefined` when zero or more than one item is selected.\r\n */\r\n protected getSingleSelection(): ClipperDocumentInfo | undefined {\r\n if (this.item()) {\r\n return this.item();\r\n } else if (this.selection().length === 1) {\r\n return this.selection()[0];\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Returns the full effective selection as an array.\r\n * If a bound item is present it is returned wrapped in a single-element array;\r\n * otherwise the full selection list is returned.\r\n * @returns An array of selected documents, or an empty array when nothing is selected.\r\n */\r\n protected getMultipleSelection(): ClipperDocumentInfo[] {\r\n const item = this.item();\r\n if (item) return [item];\r\n return this.selection().length > 0 ? this.selection() : [];\r\n }\r\n\r\n /**\r\n * Returns whether exactly one document is available for single-item operations.\r\n * @returns `true` if the bound item has a non-empty document ID, or if exactly one item is selected.\r\n */\r\n protected hasSingleSelection(): boolean {\r\n return (this.item()?.documentId?.length ?? 0) > 0 || this.selection().length === 1;\r\n }\r\n\r\n /**\r\n * Closes all open sub-menu panels, then optionally opens the given trigger's menu.\r\n * @param trigger - The menu trigger to open after closing others; omit to only close.\r\n */\r\n protected showSubMenu(trigger?: MatMenuTrigger): void {\r\n this.allMenuTriggers.forEach(menuTrigger => {\r\n const menu = menuTrigger();\r\n if (menu?.menuOpen) {\r\n menu.closeMenu();\r\n this.resetSubMenu(menu);\r\n }\r\n });\r\n trigger?.openMenu();\r\n }\r\n\r\n /**\r\n * Removes the CDK focus classes from the given trigger element to reset its visual state.\r\n * @param trigger - The menu trigger whose focus styles to clear.\r\n */\r\n protected resetSubMenu(trigger: MatMenuTrigger): void {\r\n this.renderer2.removeClass(trigger['_element'].nativeElement, 'cdk-focused');\r\n this.renderer2.removeClass(trigger['_element'].nativeElement, 'cdk-program-focused');\r\n }\r\n\r\n /**\r\n * Returns the read state of the current item or selection.\r\n * @returns `0` if unread, `1` if read, `2` if mixed or unknown.\r\n */\r\n protected isRead(): number {\r\n if (this.item()) return this.item()?.isRead === true ? 1 : 0;\r\n if (this.parent()?.hasAnySelection()) return 2;\r\n const firstSelection = this.parent()?.getSingleSelection();\r\n if (firstSelection) {\r\n return firstSelection.isRead === true ? 1 : 0;\r\n }\r\n return 0;\r\n }\r\n\r\n /**\r\n * Delegates a read/unread state change to the parent component.\r\n * @param value - `true` to mark as read, `false` to mark as unread.\r\n */\r\n protected setRead(value: boolean): void {\r\n this.parent()?.setRead(value, this.item());\r\n }\r\n\r\n /**\r\n * Opens the given document, optionally in a new browser window.\r\n * @param item - The document to open; no-op when `undefined`.\r\n * @param newWindow - When `true`, opens the document in a new window.\r\n */\r\n protected open(item: ClipperDocumentInfo | undefined, newWindow: boolean = false): void {\r\n if (item?.documentId) {\r\n this.parent()?.open(item.documentId, undefined, undefined, newWindow);\r\n }\r\n }\r\n\r\n /**\r\n * Opens the references panel for the given document in the specified mode.\r\n * @param item - The document whose references to display; no-op when `undefined`.\r\n * @param mode - The reference query mode (e.g. 1 = referenced by, 2 = references, 4 = case law).\r\n */\r\n protected openReferences(item: ClipperDocumentInfo | undefined, mode: number): void {\r\n if (item?.documentId) {\r\n this.parent()?.openReferences(item.documentId, mode);\r\n }\r\n }\r\n}\r\n","@if (canDeselectAll()) {\r\n<button mat-menu-item (click)=\"parent().selection?.clear()\" [attr.aria-label]=\"'Deseleziona tutti'\"\r\n (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>clear</mat-icon>Deseleziona tutti\r\n</button>\r\n} @else if (canManageBag()) {\r\n<button mat-menu-item (click)=\"parent().openBag()\" [attr.aria-label]=\"'Gestisci documenti di lavoro'\"\r\n (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>work_outline</mat-icon>Gestisci documenti di lavoro\r\n</button>\r\n}\r\n@if (canOpen()) {\r\n<button mat-menu-item [attr.aria-label]=\"'Apri documento'\" (mouseenter)=\"showSubMenu()\"\r\n (click)=\"open(getSingleSelection())\">\r\n <mat-icon></mat-icon>Apri\r\n</button>\r\n}\r\n<button mat-menu-item [attr.aria-label]=\"'Apri documento in una nuova finestra'\" (mouseenter)=\"showSubMenu()\"\r\n (click)=\"open(getSingleSelection(), true)\">\r\n <mat-icon>open_in_new</mat-icon>Apri in una nuova finestra...\r\n</button>\r\n@if (canAddToWorkingDocuments()) {\r\n<button mat-menu-item [attr.aria-label]=\"'Aggiungi ai documenti di lavoro'\"\r\n (click)=\"parent().addItemsToBag(getMultipleSelection())\" (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>work_outline</mat-icon>Aggiungi ai documenti di lavoro\r\n</button>\r\n}\r\n@if(canPrint()) {\r\n<button mat-menu-item (click)=\"parent().print()\" [attr.aria-label]=\"'Stampa documento'\" (mouseenter)=\"showSubMenu()\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"20px\" fxLayoutAlign=\"start center\" fxFill>\r\n <div fxFlex=\"*\" fxLayout=\"row\" fxFill fxLayoutAlign=\"start center\">\r\n <mat-icon>print</mat-icon>\r\n <div>Stampa</div>\r\n </div>\r\n <div class=\"accent small bold\">CTRL+P</div>\r\n </div>\r\n</button>\r\n}\r\n@if(canFind()) {\r\n<button mat-menu-item (click)=\"parent().find()\" [attr.aria-label]=\"'Trova nel documento'\" (mouseenter)=\"showSubMenu()\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"20px\" fxLayoutAlign=\"start center\" fxFill>\r\n <div fxFlex=\"*\" fxLayout=\"row\" fxFill fxLayoutAlign=\"start center\">\r\n <mat-icon>find_in_page</mat-icon>\r\n <div>Trova nel documento</div>\r\n </div>\r\n <div class=\"accent small bold\">CTRL+F</div>\r\n </div>\r\n</button>\r\n}\r\n@if (canAddNotes()) {\r\n<button mat-menu-item (click)=\"parent().addItemNotes(getSingleSelection())\"\r\n [attr.aria-label]=\"'Annota'\" (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>note_stack_add</mat-icon>Aggiungi nota\r\n</button>\r\n}\r\n@if (canSendByEmail()) {\r\n<button mat-menu-item (click)=\"parent().sendItemsTo(getMultipleSelection())\"\r\n [attr.aria-label]=\"'Invia documento per email'\" (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>send</mat-icon>Invia per email\r\n</button>\r\n}\r\n@if (canAddToArchive()) {\r\n<button mat-menu-item (click)=\"parent().addToArchive(getMultipleSelection())\" [attr.aria-label]=\"'Archivia'\">\r\n <mat-icon>account_tree</mat-icon>Archivia\r\n</button>\r\n}\r\n@if (canSaveAsPdf()) {\r\n<button mat-menu-item (click)=\"parent().exportPdf(getSingleSelection())\" (mouseenter)=\"showSubMenu()\"\r\n [attr.aria-label]=\"'Salva documento in pdf'\">\r\n <mat-icon>save_alt</mat-icon>Salva in pdf\r\n</button>\r\n}\r\n<button mat-menu-item [attr.aria-label]=\"'Genera un link permanente da utilizzare esternamente'\"\r\n (click)=\"parent().showLink(getSingleSelection())\" (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>link</mat-icon>Link\r\n</button>\r\n<button mat-menu-item [attr.aria-label]=\"'Copia metadati negli appunti'\"\r\n (click)=\"parent().copyMetadataToClipboard(getSingleSelection())\" (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>content_copy</mat-icon>Copia metadati\r\n</button>\r\n@if (!isReference() && canOpen()) {\r\n<button mat-menu-item [matMenuTriggerFor]=\"linksMenu\" #linksMenuTrigger=\"matMenuTrigger\"\r\n (mouseenter)=\"showSubMenu(linksMenuTrigger)\" (mouseleave)=\"resetSubMenu(linksMenuTrigger)\">\r\n <mat-icon>compare_arrows</mat-icon>Collegamenti\r\n</button>\r\n<mat-menu #linksMenu=\"matMenu\">\r\n @if (!isReference() && canOpen()) {\r\n <button mat-menu-item [attr.aria-label]=\"'Mostra i documenti richiamati da questo'\"\r\n (click)=\"openReferences(getSingleSelection(), 1)\">\r\n Documenti richiamati\r\n </button>\r\n }\r\n @if (!isReference() && canOpen()) {\r\n <button mat-menu-item [attr.aria-label]=\"'Mostra i documenti che richiamano questo'\"\r\n (click)=\"openReferences(getSingleSelection(), 2)\">\r\n Documenti che richiamano\r\n </button>\r\n }\r\n @if (!isReference() && isLawInForce() && canOpen()) {\r\n <button mat-menu-item [attr.aria-label]=\"'Mostra giurisprudenza'\" (click)=\"openReferences(getSingleSelection(), 4)\">\r\n Juris\r\n </button>\r\n }\r\n @if (!isReference() && isLawInForce() && canOpen()) {\r\n <button mat-menu-item [attr.aria-label]=\"'Mostra modifiche normative'\"\r\n (click)=\"openReferences(getSingleSelection(), 3)\">\r\n Modifiche\r\n </button>\r\n }\r\n</mat-menu>\r\n}\r\n@if (canAddToCalendar()) {\r\n<button mat-menu-item [attr.aria-label]=\"'Aggiungi al calendario'\"\r\n (click)=\"parent().addToCalendar(getSingleSelection())\">\r\n <mat-icon>alarm</mat-icon> Crea scadenza\r\n</button>\r\n}\r\n@if (canExportCalendar()) {\r\n@if(useSelections()) {\r\n<button mat-menu-item [attr.aria-label]=\"'Importa in Oultook (iCalandar)'\" (click)=\"parent().exportResults(2)\">\r\n <mat-icon>mail_outline</mat-icon>Importa in Outlook (iCalendar)\r\n</button>\r\n} @else if (item()) {\r\n<button mat-menu-item [attr.aria-label]=\"'Importa in Oultook (iCalandar)'\"\r\n (click)=\"parent().exportItems([item().documentId], null, 2)\">\r\n <mat-icon>mail_outline</mat-icon>Importa in Outlook (iCalendar)\r\n</button>\r\n}\r\n}\r\n@if (canSetAsUnread()) {\r\n<button mat-menu-item [attr.aria-label]=\"'Segna come da leggere'\" (click)=\"setRead(false)\" (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>outlined_flag</mat-icon>Segna come da leggere\r\n</button>\r\n}\r\n@if (canSetAsRead()) {\r\n<button mat-menu-item [attr.aria-label]=\"'Segna come già letto'\" (click)=\"setRead(true)\" (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>flag</mat-icon>Segna come già letto\r\n</button>\r\n}\r\n\r\n\r\n@if (isLawInForce() && canOpen()) {\r\n<button mat-menu-item [attr.aria-label]=\"'Mostra report'\" (click)=\"parent().report(getSingleSelection())\"\r\n (mouseenter)=\"showSubMenu()\">\r\n <mat-icon>assignment</mat-icon>Report\r\n</button>\r\n}\r\n\r\n@if (canUseAIAssistant() && hasSingleSelection()) {\r\n<mat-divider></mat-divider>\r\n<button mat-menu-item matTooltip=\"Assistente IA\" [attr.aria-label]=\"'Assistente IA'\"\r\n [matMenuTriggerFor]=\"aiAssistantMenu\" #aiAssistantMenuTrigger=\"matMenuTrigger\"\r\n (mouseenter)=\"showSubMenu(aiAssistantMenuTrigger)\" (mouseleave)=\"resetSubMenu(aiAssistantMenuTrigger)\">\r\n <mat-icon>borg</mat-icon>\r\n Assistente IA\r\n</button>\r\n<mat-menu #aiAssistantMenu=\"matMenu\">\r\n <button mat-menu-item [attr.aria-label]=\"'Mi riguarda?'\" (click)=\"parent().AI_concernMe(getSingleSelection())\">\r\n Mi riguarda?\r\n </button>\r\n <button mat-menu-item [attr.aria-label]=\"'Di che si tratta?'\" (click)=\"parent().AI_explain(getSingleSelection())\">\r\n Di che si tratta?\r\n </button>\r\n @if (canUseAIEditor) {\r\n <button mat-menu-item [attr.aria-label]=\"'Genera commento tecnico'\"\r\n (click)=\"parent().AI_comment(getSingleSelection())\">\r\n Genera commento tecnico\r\n </button>\r\n <button mat-menu-item [attr.aria-label]=\"'Genera news'\" (click)=\"parent().AI_news(getSingleSelection())\">\r\n Genera news\r\n </button>\r\n }\r\n</mat-menu>\r\n}\r\n\r\n@if (canAccessRS()) {\r\n<mat-divider></mat-divider>\r\n<button mat-menu-item matTooltip=\"Registro & Scadenzario\" [attr.aria-label]=\"'Opzioni di Registro & Scadenzario'\"\r\n [matMenuTriggerFor]=\"rsMenu\" #rsMenuTrigger=\"matMenuTrigger\" (mouseenter)=\"showSubMenu(rsMenuTrigger)\"\r\n (mouseleave)=\"resetSubMenu(rsMenuTrigger)\">\r\n <mat-icon>alarm_on</mat-icon>\r\n Registro e scadenzario\r\n</button>\r\n<mat-menu #rsMenu=\"matMenu\">\r\n <button mat-menu-item [attr.aria-label]=\"'Nuova legge'\" (click)=\"parent().RS_newLaw(getMultipleSelection())\">\r\n Nuova legge\r\n </button>\r\n @if (hasSingleSelection()) {\r\n <button mat-menu-item [attr.aria-label]=\"'Nuova attività'\" (click)=\"parent().RS_newActivity(getSingleSelection())\">\r\n Nuova attività\r\n </button>\r\n }\r\n @if (hasSingleSelection()) {\r\n <button mat-menu-item [attr.aria-label]=\"'Report utilizzo norma'\"\r\n (click)=\"parent().RS_usageReport(getSingleSelection())\">\r\n Report utilizzo norma\r\n </button>\r\n }\r\n</mat-menu>\r\n}","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, input, output } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport {\r\n ClipperFacet,\r\n ClipperSearchFacet,\r\n ClipperSearchFacetGroup,\r\n ClipperSearchFacetsSnapshot\r\n} from '@arsedizioni/ars-utils/clipper.common';\r\nimport { FlexModule } from '@ngbracket/ngx-layout/flex';\r\n\r\n\r\n@Component({\r\n selector: 'clipper-search-facets',\r\n templateUrl: './search-facets.component.html',\r\n styleUrls: ['./search-facets.component.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [FlexModule, MatButtonModule, MatTooltipModule, MatChipsModule, MatIconModule, \r\n MatDividerModule, MatExpansionModule]\r\n})\r\nexport class ClipperSearchFacetsComponent {\r\n readonly changed = output<ClipperSearchFacetsSnapshot>();\r\n private readonly changeDetector = inject(ChangeDetectorRef);\r\n\r\n protected snapshot: ClipperSearchFacetsSnapshot = new ClipperSearchFacetsSnapshot();\r\n\r\n /**\r\n * Returns whether the current snapshot contains at least one available or applied facet group.\r\n */\r\n public hasFacets(): boolean { return this.snapshot.hasFacets; }\r\n\r\n readonly handleTooManyResults = input<boolean>(false);\r\n\r\n /**\r\n * Pushes a new set of facet groups into the snapshot and refreshes the view.\r\n * @param values - The raw facet data returned by the search engine, grouped by type.\r\n * @param interval - Optional display label for the year-range interval (YEAR facet type).\r\n */\r\n update(values?: ClipperSearchFacet[][], interval?: string): void {\r\n this.snapshot.interval = interval;\r\n if (values) {\r\n this.snapshot.groups = [];\r\n values.forEach(n => {\r\n const name = n[0].typeName;\r\n const index = n[0].type;\r\n const i = this.snapshot.usedGroups.findIndex(n => n.index === index);\r\n const j = this.snapshot.groups.findIndex(n => n.index === index);\r\n if (i === -1 && j === -1) {\r\n this.snapshot.groups.push({\r\n name: name,\r\n selectedValue: null,\r\n selectedValueDescription: null,\r\n values: n,\r\n index: index,\r\n }); \r\n }\r\n });\r\n }\r\n this.snapshot.hasFacets = this.snapshot.groups.length > 0 || this.snapshot.usedGroups.length > 0; \r\n this.snapshot.hasMoreFacets = this.snapshot.hasFacets && this.snapshot.groups.length > this.snapshot.usedGroups.length; \r\n this.changeDetector.markForCheck();\r\n }\r\n\r\n\r\n\r\n /**\r\n * Applies the given facet item as an active filter and emits a `changed` event.\r\n * @param group - The facet group that owns the selected item.\r\n * @param item - The facet item chosen by the user.\r\n */\r\n protected use(group: ClipperSearchFacetGroup, item: ClipperSearchFacet): void {\r\n group.selectedValue = item.value;\r\n group.selectedValueDescription = item.title;\r\n const j = this.snapshot.groups.findIndex(n => n.index === group.index);\r\n if (j !== -1) {\r\n this.snapshot.groups.splice(j, 1);\r\n // Insert into usedGroups in ascending index order without mutating while iterating.\r\n const insertAt = this.snapshot.usedGroups.findIndex(n => n.index > group.index);\r\n if (insertAt !== -1) {\r\n this.snapshot.usedGroups.splice(insertAt, 0, group);\r\n } else {\r\n this.snapshot.usedGroups.push(group);\r\n }\r\n }\r\n this.apply();\r\n }\r\n\r\n /**\r\n * Removes an active facet filter from the selection and optionally emits a `changed` event.\r\n * @param group - The applied facet group to dismiss.\r\n * @param apply - When `true` (default), emits the `changed` event to trigger a new search.\r\n */\r\n protected dismiss(group: ClipperSearchFacetGroup, apply: boolean = true): void {\r\n group.selectedValue = undefined;\r\n group.selectedValueDescription = undefined;\r\n const i = this.snapshot.usedGroups.findIndex(n => n.index === group.index);\r\n if (i !== -1) {\r\n this.snapshot.usedGroups.splice(i, 1);\r\n // Re-insert into groups in ascending index order without mutating while iterating.\r\n const insertAt = this.snapshot.groups.findIndex(n => n.index > group.index);\r\n if (insertAt !== -1) {\r\n this.snapshot.groups.splice(insertAt, 0, group);\r\n } else {\r\n this.snapshot.groups.push(group);\r\n }\r\n }\r\n if (apply) {\r\n this.apply();\r\n }\r\n }\r\n\r\n /**\r\n * Builds and emits the current `ClipperSearchFacetsSnapshot` after resolving each applied\r\n * facet group's filter value into the corresponding snapshot date/sector/author/type fields.\r\n */\r\n private apply(): void {\r\n if (this.snapshot.usedGroups.length > 0) {\r\n this.snapshot.usedGroups.forEach(n => {\r\n if (n.index === ClipperFacet.Year) {\r\n if (n.selectedValue) {\r\n this.snapshot.fromDate = new Date(parseInt(n.selectedValue), 0, 1, 12, 0, 0);\r\n this.snapshot.toDate = new Date(parseInt(n.selectedValue), 11, 31, 12, 0, 0);\r\n } else {\r\n this.snapshot.fromDate = undefined;\r\n this.snapshot.toDate = undefined;\r\n }\r\n } else if (n.index === ClipperFacet.Sector) {\r\n this.snapshot.sector = n.selectedValue ?? null;\r\n } else if (n.index === ClipperFacet.Author) {\r\n this.snapshot.author = n.selectedValue ?? null;\r\n } else if (n.index === ClipperFacet.DocumentType) {\r\n this.snapshot.type = n.selectedValue ?? null;\r\n } else if (n.index === ClipperFacet.Article) {\r\n this.snapshot.anchor = n.selectedValue ?? null;\r\n } else if (n.index === ClipperFacet.Reason) {\r\n this.snapshot.reason = n.selectedValue ?? null;\r\n }\r\n });\r\n }\r\n if (this.snapshot.groups.length > 0) {\r\n this.snapshot.groups.forEach(n => {\r\n if (n.index === ClipperFacet.Year) {\r\n this.snapshot.fromDate = undefined;\r\n this.snapshot.toDate = undefined;\r\n } else if (n.index === ClipperFacet.Sector) {\r\n this.snapshot.sector = undefined;\r\n } else if (n.index === ClipperFacet.Author) {\r\n this.snapshot.author = undefined;\r\n } else if (n.index === ClipperFacet.DocumentType) {\r\n this.snapshot.type = undefined;\r\n } else if (n.index === ClipperFacet.Article) {\r\n this.snapshot.anchor = undefined;\r\n } else if (n.index === ClipperFacet.Reason) {\r\n this.snapshot.reason = undefined;\r\n }\r\n });\r\n }\r\n this.changed.emit(this.snapshot);\r\n }\r\n\r\n /**\r\n * Dismisses one or all applied facet groups and emits a `changed` event if any were removed.\r\n * @param index - The group index to clear, or `-1` to clear all applied groups at once.\r\n * @returns The number of groups that were dismissed.\r\n */\r\n protected clear(index: number = -1): number {\r\n let dismissed = 0;\r\n // Snapshot the list first to avoid mutating usedGroups while iterating it.\r\n const toRemove = this.snapshot.usedGroups.filter(n => index === -1 || index === n.index);\r\n toRemove.forEach(n => {\r\n if (n.index === ClipperFacet.Year) {\r\n this.snapshot.fromDate = undefined;\r\n this.snapshot.toDate = undefined;\r\n } else if (n.index === ClipperFacet.Sector) {\r\n this.snapshot.sector = undefined;\r\n } else if (n.index === ClipperFacet.Author) {\r\n this.snapshot.author = undefined;\r\n } else if (n.index === ClipperFacet.DocumentType) {\r\n this.snapshot.type = undefined;\r\n } else if (n.index === ClipperFacet.Article) {\r\n this.snapshot.anchor = undefined;\r\n } else if (n.index === ClipperFacet.Reason) {\r\n this.snapshot.reason = undefined;\r\n }\r\n this.dismiss(n, false);\r\n dismissed++;\r\n });\r\n if (dismissed) {\r\n this.changed.emit(this.snapshot);\r\n }\r\n return dismissed;\r\n }\r\n\r\n /**\r\n * Resets all facet state: clears every applied/available group and all derived filter fields.\r\n */\r\n reset(): void {\r\n this.snapshot.groups = [];\r\n this.snapshot.usedGroups = [];\r\n this.snapshot.hasFacets = false;\r\n this.snapshot.fromDate = undefined;\r\n this.snapshot.toDate = undefined;\r\n this.snapshot.sector = undefined;\r\n this.snapshot.author = undefined;\r\n this.snapshot.anchor = undefined;\r\n this.snapshot.type = undefined;\r\n this.snapshot.reason = undefined;\r\n }\r\n\r\n /**\r\n * Restores a previously serialised facets snapshot and refreshes the view.\r\n * @param data - The snapshot to restore.\r\n */\r\n restore(data: ClipperSearchFacetsSnapshot): void {\r\n if (data) {\r\n this.snapshot = data;\r\n this.changeDetector.markForCheck();\r\n }\r\n }\r\n\r\n /**\r\n * Returns the current facets snapshot for external serialisation (e.g. save/restore cycle).\r\n * @returns The current `ClipperSearchFacetsSnapshot`.\r\n */\r\n save(): ClipperSearchFacetsSnapshot {\r\n return this.snapshot;\r\n }\r\n}\r\n","<div fxLayout=\"column\" fxFill class=\"facets-container scroll-hidden\">\r\n @if (snapshot.usedGroups.length > 0) {\r\n <div class=\"facets-selection\">\r\n <mat-chip-set aria-label=\"Selezione\">\r\n @for (ug of snapshot.usedGroups; track $index) {\r\n <mat-chip (removed)=\"dismiss(ug)\" [matTooltip]=\"ug.selectedValueDescription ?? ''\" matTooltipPosition=\"above\">\r\n {{ug.selectedValueDescription}}\r\n <button matChipRemove [attr.aria-label]=\"'Rimuovi ' + ug.name\" [matTooltip]=\"'Rimuovi ' + ug.name\">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip>\r\n }\r\n </mat-chip-set>\r\n <mat-divider class=\"divider\"></mat-divider>\r\n </div>\r\n }\r\n <div fxFlex=\"*\" class=\"scroll-auto facets-items-container\">\r\n @if (snapshot.groups.length > 0) {\r\n @for (group of snapshot.groups; track group.index; let i = $index) {\r\n <mat-accordion multi displayMode=\"flat\">\r\n <mat-expansion-panel class=\"accordion-panel mat-elevation-z0 \" [expanded]=\"i == 0\">\r\n <mat-expansion-panel-header class=\"accordion-header\" [attr.aria-label]=\"group.name\">\r\n <mat-panel-title>\r\n @if (group.index == 2 && snapshot.interval) {\r\n {{snapshot.interval}} ({{group.values.length}})\r\n } @else {\r\n {{group.name}} ({{group.values.length}})\r\n }\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <nav class=\"facets-items\">\r\n <ul>\r\n @for (item of group.values; track $index) {\r\n <li (click)=\"use(group, item)\" [attr.aria-label]=\"item.title\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\" class=\"truncated\">\r\n <div class=\"truncated\">{{item.title}}</div>\r\n </div>\r\n <div fxLayoutAlign=\"end\" fxFlexAlign=\"center\">\r\n {{!handleTooManyResults() && snapshot.hasTooManyResults ? '~' : ''}}{{item.count}}\r\n </div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </nav>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n }\r\n } @else if (snapshot.hasFacets && !snapshot.hasMoreFacets) {\r\n <div class=\"facets-message\">\r\n <p class=\"small\"><i>Tutte le opzioni sono state selezionate</i></p>\r\n </div>\r\n }\r\n </div>\r\n</div>","import { Clipboard } from '@angular/cdk/clipboard';\r\nimport { ChangeDetectionStrategy, Component, inject, output, signal } from '@angular/core';\r\nimport { ClipperDocumentInfo, ClipperExportDocumentsParams, ClipperMessages, ClipperModel, ClipperModule, ClipperQueryReferencesMode, ClipperSearchParams, ClipperSendDocumentsByEmailParams, ClipperService } from '@arsedizioni/ars-utils/clipper.common';\r\nimport { BroadcastService, SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { DialogResult } from '@arsedizioni/ars-utils/ui';\r\nimport { ApplicationDialogService, SelectableItem, SelectDialogDelete, SendToDialogComponent, SendToPopulateData } from '@arsedizioni/ars-utils/ui.application';\r\nimport saveAs from 'file-saver';\r\nimport { finalize } from 'rxjs';\r\n\r\n\r\n@Component({\r\n template: '<div></div>',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ClipperDocumentManager {\r\n readonly populateContacts = output<SendToPopulateData>();\r\n protected readonly clipboard = inject(Clipboard);\r\n public readonly clipperService = inject(ClipperService);\r\n protected readonly broadcastService = inject(BroadcastService);\r\n protected readonly dialogService = inject(ApplicationDialogService);\r\n protected readonly canUseArchive = signal<boolean>(false);\r\n protected readonly canUseNotes = signal<boolean>(false);\r\n protected readonly canHandleTooManyResults = signal<boolean>(false);\r\n protected readonly canPopulateContacts = signal<boolean>(false);\r\n\r\n \r\n /**\r\n * Exports a document in PDF format, after asking for confirmation.\r\n * @param item - The document to export.\r\n */\r\n exportPdf(item: ClipperDocumentInfo): void {\r\n if (!this.clipperService.loggedIn()) return;\r\n if (!item) return;\r\n this.dialogService\r\n .confirm(\"Confermi l'esportazione?\", 'Attenzione!')\r\n .componentInstance.choosen.subscribe((data: DialogResult) => {\r\n if (data.result === 'ok') {\r\n const id = item.id ?? item.documentId;\r\n this.dialogService.busy('Esportazione in corso...');\r\n this.clipperService.exportPdf(id)\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n saveAs(r, (item.title1 ?? id) + '.pdf');\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Exports the current document list (or only the selected documents) as CSV or ICS.\r\n * @param documentIds - The list of document IDs to export; if empty, the full search result is exported.\r\n * @param searchParams - The search parameters used to identify the full result set when no IDs are provided.\r\n * @param format - The export format: 1 = list (CSV), 2 = deadlines (ICS).\r\n */\r\n exportItems(\r\n documentIds: string[] | undefined,\r\n searchParams: ClipperSearchParams | undefined = undefined,\r\n format: number = 1): void {\r\n if (!this.clipperService.loggedIn()) return;\r\n const model: ClipperExportDocumentsParams = { ids: documentIds ?? [], query: null, format: format };\r\n if (!model.ids || model.ids.length === 0) {\r\n model.query = searchParams;\r\n }\r\n this.dialogService.busy('Salvataggio in corso...');\r\n this.clipperService.export(model)\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (r.type === 'application/json') {\r\n r.text().then(json => this.dialogService.error(JSON.parse(json).message));\r\n } else {\r\n if (format === 1) {\r\n saveAs(r, 'elenco_' + SystemUtils.formatDate(new Date(), 'yyyyMMddhhmmss') + '.csv');\r\n } else {\r\n saveAs(r, 'scadenze_' + SystemUtils.formatDate(new Date(), 'yyyyMMddhhmmss') + '.ics');\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Exports a single document's deadline as an ICS file.\r\n * @param item - The document whose deadline to export.\r\n */\r\n exportDeadline(item: ClipperDocumentInfo): void {\r\n this.exportItems([item.documentId], undefined, 2);\r\n }\r\n\r\n /**\r\n * Sends a broadcast message to add the given documents to the archive.\r\n * @param items - The list of documents to archive.\r\n */\r\n addToArchive(items: ClipperDocumentInfo[]): void {\r\n this.broadcastService.sendMessage(ClipperMessages.COMMAND_ARCHIVE_ADD, items);\r\n }\r\n\r\n /**\r\n * Sends a broadcast message to create a new calendar deadline from the given document.\r\n * @param item - The document to add to the calendar.\r\n */\r\n addToCalendar(item: ClipperDocumentInfo): void {\r\n this.broadcastService.sendMessage(ClipperMessages.COMMAND_CALENDAR_ADD, item);\r\n }\r\n\r\n /**\r\n * Sends a broadcast message to add the given documents to the working-documents set.\r\n * @param items - The list of documents to add.\r\n */\r\n addItemsToWorkingDocuments(items: ClipperDocumentInfo[]): void {\r\n this.broadcastService.sendMessage(ClipperMessages.COMMAND_WORKING_ADD, items);\r\n }\r\n\r\n /**\r\n * Sends a request to the Clipper service to add the given documents to the bag.\r\n * @param items - The list of documents to add.\r\n */\r\n addItemsToBag(items: ClipperDocumentInfo[]): void {\r\n if (!this.clipperService.loggedIn()) return;\r\n this.clipperService.addToBag(items?.map(n => n.documentId ?? n.id) ?? []);\r\n }\r\n\r\n /**\r\n * Sends a broadcast message to add custom notes to the given document.\r\n * @param item - The document to add notes to.\r\n */\r\n addItemNotes(item: ClipperDocumentInfo): void {\r\n this.broadcastService.sendMessage(ClipperMessages.COMMAND_NOTES_ADD, item);\r\n }\r\n\r\n\r\n /**\r\n * Copies the document's metadata (ID, titles, number, date, origin) as a tab-separated string to the clipboard.\r\n * @param item - The document whose metadata to copy.\r\n */\r\n copyMetadataToClipboard(item: ClipperDocumentInfo): void {\r\n if (!item || item.model === ClipperModel.Coordinamento) return;\r\n let meta =\r\n (item.id ?? item.documentId) + '\\t' +\r\n (item.title1?.replaceAll(\"\\r\\n\", \" \") ?? '') + '\\t';\r\n if (item.title2)\r\n meta += item.title2.replaceAll(\"\\r\\n\", \" \");\r\n meta += '\\t';\r\n if (item.number)\r\n meta += item.number;\r\n meta += '\\t';\r\n if (item.publishingDate) {\r\n meta += SystemUtils.formatDate(new Date(item.publishingDate));\r\n } else if (item.date) {\r\n meta += SystemUtils.formatDate(new Date(item.date));\r\n }\r\n meta += '\\t';\r\n if (item.originDescription)\r\n meta += item.originDescription;\r\n this.clipboard.copy(meta);\r\n this.dialogService.toast(\"Metadati copiati negli appunti.\");\r\n }\r\n\r\n /**\r\n * Displays a dialog with a shareable permalink for the given document.\r\n * @param item - The document to show the permalink for.\r\n */\r\n showLink(item: ClipperDocumentInfo): void {\r\n if (!item) return;\r\n const id = item.id ?? item.documentId;\r\n if (!id) return;\r\n const channels = item.channelName\r\n ? 'Canali: ' + item.channelName + '<br>'\r\n : '';\r\n const origin = item.origin\r\n ? `Origine: ${item.origin} - ${item.originDescription ?? ''}<br>`\r\n : '';\r\n const topics = item.topics\r\n ? 'Argomenti: ' + item.topics.replaceAll('o', '.') + '<br>'\r\n : '';\r\n const taxonomy = item.taxonomyPath\r\n ? 'Tassonomia:<br> - ' + item.taxonomyPath.replaceAll('\\r\\n', '<br> - ') + '<br>'\r\n : '';\r\n const message =\r\n \"<p >Il link che trovi qui sotto è un riferimento diretto al documento selezionato.</p>\" +\r\n \"<p >Lo puoi utilizzare nella tua documentazione o inviarlo per email ad un tuo collega. La persona che desidererà visualizzare il documento dovrà necessariamente essere un utente abbonato.</p>\" +\r\n \"<p >Seleziona e copia (fai CTRL+C) il link qui sotto.</p>\" +\r\n \"<div class='small accent'>\" +\r\n 'https://clipper.arsedizioni.it/?id=' +\r\n id +\r\n '</div>' +\r\n '<br>' +\r\n '<hr>' +\r\n '<p class=\"small\">' +\r\n channels +\r\n origin +\r\n topics +\r\n taxonomy +\r\n '</p>';\r\n\r\n this.dialogService.info(message, 'Copia link', 'Chiudi');\r\n }\r\n\r\n /**\r\n * Opens a dialog to send document links by email to one or more recipients.\r\n * @param items - The list of documents to send.\r\n */\r\n sendItemsTo(items: ClipperDocumentInfo[]): void {\r\n if (!this.clipperService.loggedIn()) return;\r\n if (!items || items.length === 0) return;\r\n const d = this.dialogService.open(SendToDialogComponent, {\r\n ariaLabel: 'invia documenti per email',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: false,\r\n closeOnNavigation: false,\r\n data: {\r\n info:'Puoi inviare i documenti a chi vuoi ma, per poterli visualizzare, è necessario essere un utente abbonato.',\r\n count: items.length,\r\n canPopulate: this.canPopulateContacts(),\r\n },\r\n minWidth: '375px',\r\n maxWidth: '600px',\r\n width: '100%',\r\n });\r\n d.componentInstance.done\r\n .subscribe(data => {\r\n const params: ClipperSendDocumentsByEmailParams = {\r\n recipients: data.recipients,\r\n subject: data.subject,\r\n text: data.text,\r\n ids: items?.map(n => n.documentId ?? n.id) ?? []\r\n } as ClipperSendDocumentsByEmailParams;\r\n this.dialogService.busy('Invio in corso...');\r\n this.clipperService.sendTo(params)\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n this.dialogService.toast('Invio completato con successo.');\r\n d.close();\r\n }\r\n });\r\n });\r\n d.componentInstance.populate\r\n .subscribe(data => {\r\n this.populateContacts.emit(data);\r\n });\r\n }\r\n\r\n /**\r\n * Downloads the document's HTML report.\r\n * @param documentId - The ID of the document.\r\n * @param title - Optional display title used as the file name.\r\n */\r\n openReport(documentId: string, title?: string): void {\r\n if (!this.clipperService.loggedIn()) return;\r\n if (!documentId) return;\r\n this.clipperService.report(documentId)\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n saveAs(r, (title ? title : documentId) + '.html');\r\n });\r\n }\r\n\r\n /**\r\n * Opens a document for display. Override in subclasses to provide the actual implementation.\r\n * @param _documentId - The document ID.\r\n * @param _query - The search query string.\r\n * @param _queryChunks - Pipe-separated highlight chunks (e.g. \"|1|2|3...\").\r\n * @param _newWindow - When true, opens the document in a new browser window.\r\n */\r\n open(\r\n _documentId?: string,\r\n _query?: string,\r\n _queryChunks?: string,\r\n _newWindow?: boolean): void {\r\n }\r\n\r\n /**\r\n * Downloads the HTML report for a normativa/scadenze document.\r\n * @param item - The document to report on.\r\n */\r\n report(item: ClipperDocumentInfo): void {\r\n if (!item) return;\r\n if (item.model !== ClipperModel.NormativaVigente && item.model !== ClipperModel.Scadenze) {\r\n this.dialogService.info(\"Questa funzionalità non è disponibile per questo tipo di documento.\");\r\n return;\r\n } else {\r\n this.openReport(item.documentId, item.title1);\r\n }\r\n }\r\n\r\n /**\r\n * Opens the references dialog for the given document.\r\n * @param documentId - The ID of the document whose references to display.\r\n * @param mode - The reference mode (e.g. ReferencesIn, ReferencesOut).\r\n */\r\n openReferences(documentId?: string, mode: ClipperQueryReferencesMode = ClipperQueryReferencesMode.ReferencesIn): void {\r\n if (!documentId) return;\r\n import('../references/references.component').then(({ ClipperReferencesComponent }) => {\r\n const d = this.dialogService.open(ClipperReferencesComponent, {\r\n ariaLabel: 'riferimenti legati al documento',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: false,\r\n closeOnNavigation: false,\r\n data: { \r\n documentId: documentId, \r\n mode: mode, \r\n canUseArchive: this.canUseArchive(),\r\n canHandleTooManyResults: this.canHandleTooManyResults() \r\n },\r\n minWidth: '375px',\r\n maxWidth: '1200px',\r\n width: '100%',\r\n height: '100%',\r\n });\r\n d.afterClosed()\r\n .subscribe((r: { documentId: string }) => {\r\n if (r && r.documentId) this.open(r.documentId);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Opens a dialog to manage the documents in the working bag (view, select, delete).\r\n */\r\n openBag(): void {\r\n const items: SelectableItem[] = [];\r\n this.clipperService.bag().forEach(n => {\r\n const title = n.title1 ?? n.title2 ?? '';\r\n items.push({\r\n template: title,\r\n bag: n,\r\n searchBag: { name: title },\r\n });\r\n });\r\n const d = this.dialogService.select({\r\n title: 'Gestisci documenti di lavoro',\r\n multipleSelection: false,\r\n mustSelect: false,\r\n okCaption: 'SELEZIONA',\r\n items: items,\r\n canDelete: true,\r\n canView: true,\r\n });\r\n d.componentInstance.view\r\n .subscribe((r: SelectableItem) => {\r\n let item = r.bag;\r\n this.open(item.documentId);\r\n });\r\n d.componentInstance.delete\r\n .subscribe((r: SelectDialogDelete) => {\r\n const item = r.selectedItems[0].bag;\r\n this.clipperService.removeFromBag(item.documentId).add(\r\n () => {\r\n this.dialogService.toast('Operazione completata con successo.');\r\n for (let p = 0; p < r.items.length; p++) {\r\n if (r.items[p].bag.DocumentId === item.DocumentId) {\r\n r.items.splice(p, 1);\r\n if (r.items.length === 0) d.close();\r\n return;\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Sends a print command to the Clipper document iframe.\r\n */\r\n print(): void {\r\n const f = document.getElementById('clipper-document-iframe') as any;\r\n f?.contentWindow.postMessage('{\"type\": \"print\"}', '*');\r\n }\r\n\r\n /**\r\n * Displays a hint dialog explaining how to use the browser's find-in-page feature.\r\n */\r\n find(): void {\r\n this.dialogService.info('Per cercare nel documento premi CTRL + F.');\r\n }\r\n\r\n\r\n ////\r\n // AI Assistant\r\n ////\r\n /**\r\n * AI: sends a \"concern me\" request for the given document.\r\n * @param document - The document to analyse.\r\n */\r\n AI_concernMe(document?: ClipperDocumentInfo): void {\r\n if (!document) return;\r\n this.broadcastService.sendMessage(ClipperMessages.AI_CONCERN_ME, document);\r\n }\r\n\r\n /**\r\n * AI: sends an \"explain\" request for the given document.\r\n * @param document - The document to explain.\r\n */\r\n AI_explain(document?: ClipperDocumentInfo): void {\r\n if (!document) return;\r\n this.broadcastService.sendMessage(ClipperMessages.AI_EXPLAIN, document);\r\n }\r\n\r\n\r\n /**\r\n * AI: sends a \"comment\" request for the given document.\r\n * @param document - The document to comment on.\r\n */\r\n AI_comment(document?: ClipperDocumentInfo): void {\r\n if (!document) return;\r\n this.broadcastService.sendMessage(ClipperMessages.AI_COMMENT, document);\r\n }\r\n\r\n /**\r\n * AI: sends a \"news\" request for the given document.\r\n * @param document - The document to retrieve news for.\r\n */\r\n AI_news(document?: ClipperDocumentInfo): void {\r\n if (!document) return;\r\n this.broadcastService.sendMessage(ClipperMessages.AI_NEWS, document);\r\n }\r\n\r\n ////\r\n // Registro e scadenzario\r\n ////\r\n\r\n /**\r\n * Returns whether the given Clipper module is supported by Registro e Scadenzario (RS).\r\n * @param module - The module to check.\r\n * @returns `true` if the module is supported by RS.\r\n */\r\n isModuleSupportedByRS(module: ClipperModule): boolean {\r\n return module === ClipperModule.GazzetteBollettiniEFontiDiverse ||\r\n module === ClipperModule.NormativaVigente ||\r\n module === ClipperModule.ScadenzeESegnalazioni;\r\n }\r\n\r\n /**\r\n * Returns whether the given Clipper model is supported by Registro e Scadenzario (RS).\r\n * @param model - The model to check.\r\n * @returns `true` if the model is supported by RS.\r\n */\r\n isModelSupportedByRS(model: ClipperModel): boolean {\r\n return model === ClipperModel.AggiornamentoNormativo ||\r\n model === ClipperModel.NormativaVigente ||\r\n model === ClipperModel.Scadenze;\r\n\r\n }\r\n\r\n /**\r\n * Returns whether every document in the list has a model supported by RS.\r\n * @param documents - The list of documents to check.\r\n * @returns `true` if all documents are RS-compatible.\r\n */\r\n canSupportRS(documents: ClipperDocumentInfo[]): boolean {\r\n return documents.every(n => this.isModelSupportedByRS(n.model));\r\n }\r\n\r\n /**\r\n * Returns whether every document in the list has a model that supports RS tracking.\r\n * @param documents - The documents to check.\r\n * @returns `true` if all documents are RS-enabled.\r\n */\r\n RS_enabled(documents: ClipperDocumentInfo[]): boolean {\r\n if (!documents || documents.length === 0) return false;\r\n return documents.every(n =>\r\n n.model === ClipperModel.NormativaVigente ||\r\n n.model === ClipperModel.AggiornamentoNormativo ||\r\n n.model === ClipperModel.GiurisprudenzaRecente ||\r\n n.model === ClipperModel.Scadenze\r\n );\r\n }\r\n\r\n /**\r\n * Sends a broadcast message to create a new RS law entry linked to the given documents.\r\n * @param documents - The array of documents to link to the new law.\r\n */\r\n RS_newLaw(documents?: ClipperDocumentInfo[]): void {\r\n if (!this.clipperService.supportsRS() || !documents) return;\r\n this.broadcastService.sendMessage(ClipperMessages.INTEROP_RS_NEW_LAW, documents);\r\n }\r\n\r\n /**\r\n * Sends a broadcast message to create a new RS activity linked to the given document.\r\n * @param document - The document to link to the new activity.\r\n */\r\n RS_newActivity(document?: ClipperDocumentInfo): void {\r\n if (!this.clipperService.supportsRS() || !document) return;\r\n this.broadcastService.sendMessage(ClipperMessages.INTEROP_RS_NEW_ACTIVITY, document);\r\n }\r\n\r\n /**\r\n * Sends a broadcast message to open the RS usage report for the given document.\r\n * @param document - The document to generate the usage report for.\r\n */\r\n RS_usageReport(document?: ClipperDocumentInfo): void {\r\n if (!this.clipperService.supportsRS() || !document) return;\r\n this.broadcastService.sendMessage(ClipperMessages.INTEROP_RS_USAGE_REPORT, document);\r\n }\r\n\r\n\r\n}\r\n","import { DialogService } from '@arsedizioni/ars-utils/ui';\r\nimport {\r\n ClipperModule,\r\n ClipperSelectionMode,\r\n ClipperService\r\n} from '@arsedizioni/ars-utils/clipper.common';\r\nimport { ThemeType } from '@arsedizioni/ars-utils/core';\r\nimport { inject, Injector, runInInjectionContext } from '@angular/core';\r\n\r\nexport class ClipperDocumentsUtils {\r\n /**\r\n * Opens the Clipper document viewer dialog for the given document.\r\n * @param injector - The Angular injector used to resolve `DialogService` and `ClipperService`.\r\n * @param documentId - The ID of the document to open.\r\n * @param query - The search query string used for term highlighting.\r\n * @param queryChunks - Pipe-separated highlight chunks (e.g. \"|1|2|3...\").\r\n * @param selectionMode - The Clipper selection mode to activate inside the viewer.\r\n * @param selectableModules - The list of Clipper modules available for selection.\r\n * @param theme - The UI theme to apply. Defaults to the system theme.\r\n * @param canUseArchive - When `true`, archive access is enabled inside the viewer.\r\n * @param canUseNotes - When `true`, notes access is enabled inside the viewer.\r\n * @param canHandleTooManyResults - When `true`, the component handles oversized result sets.\r\n * @param replaceUrl - When provided, after the dialog closes the method calls `window.close()`\r\n * if the page was opened by another window, or navigates to this URL otherwise.\r\n */\r\n static openDocument(\r\n injector: Injector,\r\n documentId: string,\r\n query?: string,\r\n queryChunks?: string,\r\n selectionMode?: ClipperSelectionMode,\r\n selectableModules?: ClipperModule[],\r\n theme?: ThemeType,\r\n canUseArchive?: boolean,\r\n canUseNotes?: boolean,\r\n canHandleTooManyResults?: boolean,\r\n replaceUrl?: string): void {\r\n runInInjectionContext(injector, () => {\r\n const dialogService = inject(DialogService);\r\n const clipperService = inject(ClipperService);\r\n if (!clipperService.loggedIn()) {\r\n dialogService.error(\"Clipper non è disponibile in questo momento. Verifica la connessione.\");\r\n return;\r\n }\r\n if (!documentId) {\r\n dialogService.error(\"Documento non valido.\");\r\n return;\r\n }\r\n import('./ui/document/document.component').then(({ ClipperDocumentComponent }) => {\r\n const ref = dialogService.open(ClipperDocumentComponent, {\r\n ariaLabel: 'documento',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: false,\r\n data: {\r\n id: documentId,\r\n query: query,\r\n queryChunks: queryChunks,\r\n selectionMode: selectionMode,\r\n selectableModules: selectableModules,\r\n theme: theme,\r\n canUseArchive: canUseArchive,\r\n canUseNotes: canUseNotes,\r\n canHandleTooManyResults: canHandleTooManyResults\r\n },\r\n minWidth: '375px',\r\n maxWidth: '1400px',\r\n width: '100%',\r\n height: '100%'\r\n });\r\n if (replaceUrl && ref) {\r\n ref.beforeClosed().subscribe(() => {\r\n setTimeout(() => {\r\n if (window.opener !== null) {\r\n window.close();\r\n } else {\r\n window.location.replace(replaceUrl);\r\n }\r\n }, 500);\r\n });\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Extracts the display title from a full document title by stripping any trailing `[...]` suffix.\r\n * @param title - The full document title, which may contain a bracketed qualifier.\r\n * @returns The portion of the title before the first `[`, or the original title when no `[` is present.\r\n */\r\n static parseDocumentTitle(title: string): string {\r\n if (!title) return title;\r\n const p = title.indexOf('[');\r\n return p !== -1 ? title.substring(0, p) : title;\r\n }\r\n\r\n}","import { BreakpointObserver } from '@angular/cdk/layout';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component, DestroyRef, Injector, computed, inject, signal,\r\n viewChild\r\n} from '@angular/core';\r\nimport { MatPaginator } from '@angular/material/paginator';\r\nimport { ClipperDocumentInfo, ClipperMessages, ClipperModel, ClipperQueryDocumentFlags, ClipperSearchParams, ClipperSearchResult, ClipperSearchUtils, ClipperSelectionMode, ClipperSort, ClipperUtils } from '@arsedizioni/ars-utils/clipper.common';\r\nimport {\r\n DateFormat,\r\n NameValueItem, ScreenService, SelectableModel, SystemUtils,\r\n ThemeService\r\n} from '@arsedizioni/ars-utils/core';\r\nimport { startOfDay, startOfToday, subDays } from 'date-fns';\r\nimport { ClipperSearchFacetsComponent } from '../search-facets/search-facets.component';\r\nimport { ClipperDocumentManager } from '../document-manager/document-manager';\r\nimport { ClipperSearchCalendarComponent } from '../search-calendar/search-calendar.component';\r\nimport { ClipperDocumentsUtils } from '../../documents';\r\n\r\n\r\n\r\n\r\n@Component({\r\n template: '<div></div>',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ClipperSearchResultManager extends ClipperDocumentManager {\r\n readonly paginator = viewChild<MatPaginator>('paginator');\r\n readonly facets = viewChild<ClipperSearchFacetsComponent>('facets');\r\n readonly calendar = viewChild<ClipperSearchCalendarComponent>('calendar');\r\n protected readonly destroyRef = inject(DestroyRef);\r\n protected readonly changeDetector = inject(ChangeDetectorRef);\r\n protected readonly breakpointObserver = inject(BreakpointObserver);\r\n protected readonly injector = inject(Injector);\r\n protected readonly themeService = inject(ThemeService);\r\n public readonly screenService = inject(ScreenService);\r\n public selection: SelectableModel<ClipperDocumentInfo, string> | undefined;\r\n public readonly selectionMode = signal<ClipperSelectionMode>(ClipperSelectionMode.None);\r\n protected snapshot: ClipperSearchResult | undefined = new ClipperSearchResult();\r\n protected readonly filterBusy = signal<boolean>(false);\r\n protected filterParams: ClipperSearchParams = new ClipperSearchParams();\r\n protected readonly filterPaneHasBackdrop = signal<boolean>(false);\r\n protected readonly filterPaneClosed = signal<boolean>(false);\r\n protected readonly filterPane2HasBackdrop = signal<boolean>(false);\r\n protected readonly filterPane2Closed = signal<boolean>(false);\r\n protected readonly sortOptions = signal<NameValueItem<ClipperSort>[]>([]);\r\n protected readonly sortMode = signal<NameValueItem<ClipperSort> | undefined>(undefined);\r\n protected scrollPos: number = 0;\r\n protected readonly scrollerId: string = 'scroller_' + SystemUtils.generateUUID();\r\n protected restorableId: string | undefined;\r\n protected readonly hasFacets = signal<boolean>(false);\r\n /** `true` when the current sector filter contains any regional-law (LR) entries. */\r\n protected readonly hasRegions = computed(() =>\r\n (this.filterParams.sectors?.filter(n => n.value === 'LR').length ?? 0) > 0\r\n );\r\n\r\n\r\n\r\n /**\r\n * Resets the `isMenuOpen` flag on every snapshot item so that action-menu buttons are hidden.\r\n */\r\n updateMenuButtonsVisibility(): void {\r\n if (this.snapshot) {\r\n this.snapshot.items?.forEach(n => {\r\n n.isMenuOpen = false;\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Scrolls the results list container to the given vertical position.\r\n * @param top - The target scroll offset in pixels. Defaults to 0 (top).\r\n */\r\n scroll(top: number = 0): void {\r\n const elem = document.getElementById(this.scrollerId);\r\n if (elem) {\r\n elem.scrollTo({ top: top, left: 0, behavior: 'auto' });\r\n }\r\n }\r\n\r\n /**\r\n * Returns whether every item in the current snapshot is selected.\r\n * @returns `true` if the selection count equals the total snapshot item count.\r\n */\r\n allSelected(): boolean {\r\n return this.selection?.current?.selected?.length === this.snapshot?.items?.length;\r\n }\r\n\r\n /**\r\n * Selects or deselects all items in the current snapshot.\r\n * @param select - When `true`, selects all items; when `false`, deselects all.\r\n */\r\n selectAll(select: boolean = true): void {\r\n if (select) {\r\n this.snapshot?.items?.forEach(n => this.selection?.select(n, n.documentId));\r\n } else {\r\n this.snapshot?.items?.forEach(n => this.selection?.deselect(n, n.documentId));\r\n }\r\n }\r\n\r\n /**\r\n * Returns whether at least one item is currently selected.\r\n * @returns `true` if the selection contains one or more items.\r\n */\r\n hasAnySelection(): boolean {\r\n return (this.selection?.all?.length ?? 0) > 0;\r\n }\r\n\r\n /**\r\n * Returns whether exactly one item is selected.\r\n * @returns `true` if the selection count is exactly 1.\r\n */\r\n hasSingleSelection(): boolean {\r\n return (this.selection?.all?.length ?? 0) === 1;\r\n }\r\n\r\n /**\r\n * Returns the first (and only) selected item, or `undefined` when nothing or multiple items are selected.\r\n * @returns The selected document, or `undefined`.\r\n */\r\n getSingleSelection(): ClipperDocumentInfo | undefined {\r\n return this.hasAnySelection() ? this.selection?.all[0] : undefined;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Clears the entire selection.\r\n */\r\n clearSelection(): void {\r\n this.selection?.clear();\r\n }\r\n\r\n /**\r\n * Returns the number of currently selected items, or `undefined` when nothing is selected.\r\n * @returns The selection count, or `undefined`.\r\n */\r\n countSelections(): number | undefined {\r\n return (this.selection && this.selection?.all?.length > 0) ? this.selection?.all?.length : undefined;\r\n }\r\n\r\n /**\r\n * Returns the document ID of the first selected item, or `undefined` when nothing is selected.\r\n * @returns The selected document ID, or `undefined`.\r\n */\r\n getSeletectId(): string | undefined {\r\n if (this.hasAnySelection()) {\r\n return this.selection?.all[0].documentId;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Returns the document IDs of all selected items.\r\n * Shows an error and returns `undefined` when more than 100 items are selected.\r\n * @returns An array of document IDs, or `undefined` when the limit is exceeded.\r\n */\r\n getSeletectIds(): string[] | undefined {\r\n if ((this.selection?.all?.length ?? 0) > 100) {\r\n this.dialogService.error('La selezione non può contenere più di 100 elementi.');\r\n return undefined;\r\n }\r\n const ids: string[] = [];\r\n if (this.hasAnySelection()) {\r\n this.selection?.all?.forEach(n => {\r\n if (n.documentId) {\r\n ids.push(n.documentId);\r\n }\r\n });\r\n }\r\n return ids;\r\n }\r\n\r\n /**\r\n * Returns a list of `[documentId, document]` tuples for all selected items.\r\n * Shows an error and returns `undefined` when more than 100 items are selected.\r\n * @returns An array of ID-document tuples, or `undefined` when the limit is exceeded.\r\n */\r\n getSeletectIdsAndData(): [string, ClipperDocumentInfo][] | undefined {\r\n if ((this.selection?.all?.length ?? 0) > 100) {\r\n this.dialogService.error('La selezione non può contenere più di 100 elementi.');\r\n return undefined;\r\n }\r\n const data: [string, ClipperDocumentInfo][] = [];\r\n if (this.hasAnySelection()) {\r\n this.selection?.all?.forEach(n => {\r\n if (n.documentId) {\r\n data.push([n.documentId, n]);\r\n }\r\n });\r\n }\r\n return data;\r\n }\r\n\r\n\r\n /**\r\n * Enriches raw search result items with display metadata: grouping labels, expiry/validity\r\n * state, anchor relevance scores, and model-specific fields.\r\n * @param items - The raw document list to process in place.\r\n * @param params - The search parameters used to determine grouping and filtering.\r\n */\r\n prepareResultItems(items: ClipperDocumentInfo[], params: ClipperSearchParams): void {\r\n const today = startOfToday();\r\n const groupByYear =\r\n !params.sortMode ||\r\n params.sortMode === ClipperSort.DateAsc ||\r\n params.sortMode === ClipperSort.DateDesc ||\r\n params.sortMode === ClipperSort.SourceDateAsc ||\r\n params.sortMode === ClipperSort.SourceDateDesc;\r\n const groupByRelevance = params.sortMode === ClipperSort.Relevance;\r\n const groupByPopularity = params.sortMode === ClipperSort.Popularity;\r\n let group = '';\r\n items?.forEach(n => {\r\n n.documentId = n.documentId ?? n.id;\r\n if (n.documentId) {\r\n this.selection?.updateCurrent(n, n.documentId);\r\n }\r\n if (n.model === ClipperModel.Quesiti) {\r\n n.info = \"Quesito n° \" + n.number + \" del \" + SystemUtils.formatDate(n.date, \"d MMM yyyy\");\r\n } else if (n.model === ClipperModel.Scadenze ||\r\n n.model === ClipperModel.Segnalazioni) {\r\n switch (n.model) {\r\n case ClipperModel.Scadenze:\r\n n.originDescription = 'Scadenza';\r\n break;\r\n case ClipperModel.Segnalazioni:\r\n n.originDescription = 'Segnalazione';\r\n break;\r\n }\r\n if (n.expiringInfo) {\r\n const parts = n.expiringInfo.split('|');\r\n if (parts.length === 3) {\r\n n.expiringDescription = parts[2];\r\n }\r\n }\r\n if (n.expiringDate) {\r\n n.date = startOfDay(new Date(n.expiringDate));\r\n const d = startOfDay(subDays(n.date, 15));\r\n n.isExpiring = today <= n.date && today >= d;\r\n n.isExpired = n.date < today;\r\n\r\n }\r\n } else {\r\n if ((n.model === ClipperModel.Articoli ||\r\n n.model === ClipperModel.News) &&\r\n n.tags) {\r\n n.info = n.tags.toUpperCase();\r\n }\r\n if (n.model !== ClipperModel.AggiornamentoNormativo &&\r\n n.model !== ClipperModel.NormativaVigente &&\r\n n.model !== ClipperModel.GiurisprudenzaRecente &&\r\n n.model !== ClipperModel.Juris &&\r\n n.date) {\r\n n.date = startOfDay(new Date(n.date ?? n.publishingDate));\r\n const d = startOfDay(subDays(startOfToday(), 7))\r\n n.isNew = n.date > d;\r\n }\r\n if (n.anchors) {\r\n let anchorType: number | undefined;\r\n const anchors: any[] = [];\r\n let minScore = 10;\r\n let maxScore = 0;\r\n n.anchors.forEach(a => {\r\n if ((a.score ?? 0) < minScore) {\r\n minScore = a.score ?? 0;\r\n }\r\n if ((a.score ?? 0) > maxScore) {\r\n maxScore = a.score ?? 0;\r\n }\r\n });\r\n maxScore = maxScore - minScore;\r\n n.anchors.forEach(a => {\r\n if (a.type === 20) return;\r\n if (a.type !== anchorType) {\r\n if ((a.type ?? 0) >= 3)\r\n anchors.push({ text: a.typeDescription });\r\n anchorType = a.type;\r\n }\r\n const score = maxScore > 0 ? ((a.score ?? 0) - minScore) / maxScore : 0;\r\n anchors.push({\r\n text: a.text,\r\n title: a.title,\r\n documentId: a.documentId,\r\n uri: a.uri,\r\n veryRelevant: score > 0.7,\r\n score: score,\r\n chunk: a.chunk\r\n });\r\n });\r\n n.anchors = anchors;\r\n }\r\n if ((n.validityState ?? 0) > 0) {\r\n n.validityDescription = 'Non è più vigente';\r\n n.isExpired = true;\r\n if (n.validUntilDate) {\r\n const expiringDate = startOfDay(new Date(n.validUntilDate));\r\n if (expiringDate < today) {\r\n n.validityDescription =\r\n 'Non più vigente dal ' +\r\n SystemUtils.formatDate(expiringDate) +\r\n '.';\r\n } else {\r\n n.validityDescription =\r\n 'Non sarà più vigente dal ' +\r\n SystemUtils.formatDate(expiringDate) +\r\n '.';\r\n n.isExpired = false;\r\n }\r\n }\r\n }\r\n if (n.expiringDate) {\r\n n.date = startOfDay(new Date(n.expiringDate));\r\n const d = startOfDay(subDays(n.date, 15));\r\n n.isExpiring = today <= n.date && today >= d;\r\n n.isExpired = n.date < today;\r\n }\r\n }\r\n if (groupByYear) {\r\n const d = (this.filterParams.models?.length ?? 0) > 1\r\n ? n.publishingDate\r\n : n.date;\r\n const year = SystemUtils.formatDate(d, DateFormat.LongMonthAndYear)?.toLowerCase();\r\n if (group !== year) {\r\n n.group = year;\r\n group = year;\r\n }\r\n } else if (groupByRelevance) {\r\n if (group !== 'none') {\r\n n.group =\r\n 'Elementi più rilevanti per la ricerca: ' + params.text;\r\n group = 'none';\r\n }\r\n } else if (groupByPopularity) {\r\n if (group !== 'none') {\r\n n.group = 'Elementi più popolari in ordine decrescente';\r\n group = 'none';\r\n }\r\n }\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Applies a new search result snapshot: clears the current selection, optionally preserves\r\n * facet state for incremental updates, and triggers change detection.\r\n * @param data - The incoming search result.\r\n * @param newSearch - When `true`, facet state is reset along with the results.\r\n */\r\n prepareResults(data: ClipperSearchResult, newSearch: boolean = false): void {\r\n const currentTotal = this.snapshot?.total ?? 0;\r\n this.selection?.current.clear();\r\n if (!newSearch) {\r\n data.facets = this.snapshot?.facets;\r\n }\r\n this.snapshot = data;\r\n if (this.snapshot.total === -1) {\r\n this.snapshot.total = currentTotal;\r\n }\r\n if (this.snapshot.items) {\r\n this.prepareResultItems(this.snapshot.items, this.filterParams);\r\n }\r\n this.changeDetector.markForCheck();\r\n }\r\n\r\n\r\n /**\r\n * Exports either the selected documents or the full result set in the given format.\r\n * @param format - The export format: 1 = list (CSV), 2 = deadlines (ICS).\r\n */\r\n exportResults(format: number = 1): void {\r\n if ((this.snapshot?.total ?? 0) > 0 || this.hasAnySelection()) {\r\n this.exportItems(this.getSeletectIds(), this.filterParams, format);\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Returns the CSS class that reflects the item's read/expiry state.\r\n * @param item - The document to evaluate.\r\n * @returns A CSS class name string, or `undefined` when no special state applies.\r\n */\r\n getItemStateCssClass(item: ClipperDocumentInfo): string | undefined {\r\n if (item.isRead !== true && item.model && ClipperUtils.isClipperModelReadable(item.model)) return 'unread-bg';\r\n else if (item.isExpired) return 'expired-bg';\r\n //else if (item.popularity === 3) return 'popular-bg';\r\n //else if (item.popularity > 3) return 'very-popular-bg';\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Returns the tooltip text that explains the item's current read/expiry state.\r\n * @param item - The document to evaluate.\r\n * @returns A human-readable state description, or an empty string when no special state applies.\r\n */\r\n getItemStateTooltip(item: ClipperDocumentInfo): string {\r\n if (item.isRead !== true && item.model && ClipperUtils.isClipperModelReadable(item.model)) return 'Non letto';\r\n else if (item.isExpired) return 'Non più vigente';\r\n //else if (item.popularity === 3) return 'Documento con numero di citazioni alto';\r\n //else if (item.popularity > 3) return 'Documento con numero di citazioni molto alto';\r\n return '';\r\n }\r\n\r\n /**\r\n * Returns the Material icon name that represents the given document's model.\r\n * @param item - The document whose icon to determine.\r\n * @returns A Material icon name string.\r\n */\r\n getItemIcon(item: ClipperDocumentInfo): string {\r\n switch (item.model) {\r\n case ClipperModel.NormativaVigente: return 'gavel';\r\n case ClipperModel.Articoli:\r\n case ClipperModel.Quesiti:\r\n case ClipperModel.MetodiDiAnalisi: return 'extension';\r\n default: return 'updated';\r\n }\r\n }\r\n\r\n /**\r\n * Toggles the read flag of the given item and stops event propagation.\r\n * @param item - The document whose read state to toggle.\r\n * @param e - Optional DOM event; when provided, default action and propagation are suppressed.\r\n */\r\n toggleRead(item: ClipperDocumentInfo, e?: Event): void {\r\n e?.preventDefault();\r\n e?.stopPropagation();\r\n this.setRead(!item?.isRead, item);\r\n\r\n }\r\n\r\n /**\r\n * Toggles the selection state of the given item and stops event propagation.\r\n * @param item - The document to select or deselect.\r\n * @param e - Optional DOM event; when provided, default action and propagation are suppressed.\r\n */\r\n toggleSelection(item: ClipperDocumentInfo, e?: Event): void {\r\n e?.preventDefault();\r\n e?.stopPropagation();\r\n this.selection?.toggle(item, item.documentId)\r\n\r\n\r\n }\r\n\r\n\r\n /**\r\n * Sets the read state on the given item or on all currently selected items.\r\n * Broadcasts a read-state-changed event and updates the unread counter.\r\n * @param value - The new read flag value.\r\n * @param item - When provided, only this item is updated; otherwise the full selection is used.\r\n */\r\n setRead(value: boolean, item?: ClipperDocumentInfo): void {\r\n let documentIds: string[];\r\n if (item?.documentId) {\r\n documentIds = [item.documentId];\r\n } else if (this.hasAnySelection()) {\r\n documentIds = this.selection?.all?.map(n => n.documentId ?? '') ?? [];\r\n } else {\r\n return;\r\n }\r\n this.clipperService.updateState({ documentIds: documentIds, isRead: value })\r\n .subscribe(r => {\r\n if (!r.success) {\r\n // soft error\r\n this.dialogService.toast(r.message);\r\n } else {\r\n if (item) {\r\n if (item.isRead !== value) {\r\n item.isRead = value;\r\n this.broadcastService.sendMessage(ClipperMessages.DOCUMENT_READ, { document: item, value: value });\r\n const module = ClipperUtils.getClipperModuleFromModel(item);\r\n if (module) {\r\n this.clipperService.updateUnreadItems(\r\n module,\r\n item.model,\r\n value ? -1 : 1);\r\n }\r\n this.changeDetector.markForCheck();\r\n }\r\n } else if (this.hasAnySelection()) {\r\n this.selection?.all?.forEach(n => {\r\n if (n.isRead !== value) {\r\n n.isRead = value;\r\n this.broadcastService.sendMessage(ClipperMessages.DOCUMENT_READ, { document: n, value: value });\r\n const module = ClipperUtils.getClipperModuleFromModel(n);\r\n if (module) {\r\n this.clipperService.updateUnreadItems(\r\n module,\r\n n.model,\r\n value ? -1 : 1);\r\n }\r\n this.changeDetector.markForCheck();\r\n }\r\n })\r\n }\r\n this.broadcastService.sendMessage(ClipperMessages.COMMAND_DASHBOARD_UPDATED);\r\n }\r\n });\r\n }\r\n\r\n \r\n\r\n /**\r\n * Opens a document by ID, either inline or in a new browser tab.\r\n * @param documentId - The ID of the document to open.\r\n * @param query - The current search query used to highlight terms in the viewer.\r\n * @param queryChunks - Pipe-separated highlight chunks (e.g. \"|1|2|3...\").\r\n * @param newWindow - When `true`, opens the document in a new browser tab.\r\n */\r\n override open(documentId?: string, query?: string, queryChunks?: string, newWindow?: boolean): void {\r\n if (!documentId) return;\r\n if (!newWindow) this.openDocument(documentId, query, queryChunks);\r\n else {\r\n window.open((this.clipperService.appUri ?? '') + '/documento/' + documentId, '_blank');\r\n }\r\n }\r\n\r\n /**\r\n * Opens the Clipper document viewer dialog for the given document.\r\n * @param documentId - The ID of the document to open.\r\n * @param query - The normalized search query used for term highlighting.\r\n * @param queryChunks - Pipe-separated highlight chunks (e.g. \"|1|2|3...\").\r\n */\r\n openDocument(documentId?: string, query?: string, queryChunks?: string): void {\r\n if (!documentId) return;\r\n query = ClipperSearchUtils.normalizeTextQuery2(query ?? this.filterParams.text ?? '');\r\n if (((this.filterParams.flags ?? 0) & ClipperQueryDocumentFlags.UseSemanticSearch) > 0) {\r\n query = '$' + query;\r\n }\r\n ClipperDocumentsUtils.openDocument(\r\n this.injector,\r\n documentId,\r\n query,\r\n queryChunks,\r\n this.selectionMode(),\r\n undefined,\r\n this.themeService.getTheme(),\r\n this.canUseArchive(),\r\n this.canUseNotes(),\r\n this.canHandleTooManyResults()\r\n );\r\n\r\n }\r\n\r\n ///\r\n // Restorable\r\n ///\r\n\r\n /**\r\n * Serialises the current component state (paginator, facets, filter params, scroll, sort, data)\r\n * to the given storage under the given key, enabling later restoration.\r\n * @param id - The storage key to write to.\r\n * @param storage - The Web Storage instance to use. Defaults to `sessionStorage`.\r\n */\r\n save(id: string, storage: Storage = sessionStorage): void {\r\n storage.setItem(\r\n id,\r\n JSON.stringify({\r\n paginator: {\r\n index: this.paginator()?.pageIndex ?? 0,\r\n total: this.snapshot?.total ?? 0,\r\n size: this.paginator()?.pageSize ?? this.filterParams?.count ?? 15\r\n },\r\n facets: this.facets()?.save(),\r\n filterParams: this.filterParams,\r\n scroll: this.scrollPos,\r\n sort: { mode: this.sortMode(), options: this.sortOptions() },\r\n data: this.snapshot\r\n ? { items: this.snapshot.items, total: this.snapshot.total }\r\n : null\r\n }));\r\n }\r\n\r\n /**\r\n * Restores a previously serialised component state from storage and re-applies it.\r\n * Facets, paginator, scroll position, and filter parameters are all re-hydrated.\r\n * @param id - The storage key to read from.\r\n * @param storage - The Web Storage instance to use. Defaults to `sessionStorage`.\r\n */\r\n restore(id: string, storage: Storage = sessionStorage): void {\r\n const value = storage.getItem(id);\r\n if (value) {\r\n const data = JSON.parse(value);\r\n if (data) {\r\n this.filterParams = data.filterParams;\r\n const modules = SystemUtils.clone(this.filterParams.modules);\r\n const sectors = SystemUtils.clone(this.filterParams.sectors);\r\n const authors = SystemUtils.clone(this.filterParams.authors);\r\n const tags = SystemUtils.clone(this.filterParams.tags);\r\n const topics = SystemUtils.clone(this.filterParams.topics);\r\n this.filterParams.modules = modules;\r\n this.filterParams.sectors = undefined;\r\n this.filterParams.authors = undefined;\r\n this.filterParams.tags = undefined;\r\n this.filterParams.topics = undefined;\r\n this.snapshot = data.data;\r\n this.sortMode.set(data.sort.mode);\r\n this.sortOptions.set(data.sort.options ?? []);\r\n setTimeout(() => {\r\n this.filterParams.sectors = sectors;\r\n this.filterParams.authors = authors;\r\n this.filterParams.tags = tags;\r\n this.filterParams.topics = topics;\r\n const facets = this.facets();\r\n if (facets && data.facets) {\r\n facets.restore(data.facets);\r\n this.hasFacets.set(data.facets.hasFacets === true);\r\n }\r\n const paginator = this.paginator();\r\n if (paginator && data.paginator) {\r\n paginator.pageIndex = data.paginator.index;\r\n paginator.pageSize = data.paginator.size;\r\n paginator.length = data.paginator.total;\r\n }\r\n this.scroll(data.scroll ?? 0);\r\n this.broadcastService.sendMessage(ClipperMessages.COMMAND_SEARCH_RESTORED, data.filterParams)\r\n this.changeDetector.markForCheck();\r\n }, 750);\r\n\r\n }\r\n }\r\n }\r\n}\r\n","import { inject, Injector, runInInjectionContext } from '@angular/core';\r\nimport { ClipperContactInfo, ClipperService, EditDialogCompleted } from '@arsedizioni/ars-utils/clipper.common';\r\nimport { DialogResult } from '@arsedizioni/ars-utils/ui';\r\nimport { ApplicationDialogService } from '@arsedizioni/ars-utils/ui.application';\r\nimport { finalize, Subscription } from 'rxjs';\r\n\r\nexport class ClipperContactsSelector {\r\n\r\n /**\r\n * Builds an HTML string representing a list of email addresses separated by line breaks.\r\n * @param emails - A semicolon-separated string of email addresses, or undefined.\r\n * @returns An HTML string with each address wrapped in a `<span>` tag.\r\n */\r\n private static buildEmailsHtml(emails: string | undefined): string {\r\n if (!emails) return '';\r\n return emails.split(';').map(n => `<span>${n}</span>`).join('<br>');\r\n }\r\n\r\n /**\r\n * Builds the HTML row template used to display a contact inside the selection dialog.\r\n * @param item - The contact data to render.\r\n * @returns An HTML string representing the contact row.\r\n */\r\n private static buildContactTemplate(item: ClipperContactInfo): string {\r\n const emails = ClipperContactsSelector.buildEmailsHtml(item.emails);\r\n const disabledAttr = item.disabled ? \"class='disabled' title='Disabilitato'\" : '';\r\n const teamHtml = item.teamTitle\r\n ? `<br><span class='x-small uppercase accent'>${item.teamTitle}</span>`\r\n : '';\r\n return `<table class='template-table'><tr ${disabledAttr}>`\r\n + `<td class='col-50 col-maximizable small bold'>${item.name ?? ''}${teamHtml}</td>`\r\n + `<td class='col-50 col-hideable x-small uppercase'>${emails}</td>`\r\n + `</tr></table>`;\r\n }\r\n\r\n /**\r\n * Opens the contacts selection/management dialog and wires up all interaction events.\r\n * @param injector - The Angular injector used to resolve services within the dialog context.\r\n * @param canAppend - When true, the dialog allows adding new contacts.\r\n * @param canEdit - When true, the dialog allows editing and deleting contacts.\r\n * @param onSelect - Optional callback invoked with the selection result when the user confirms.\r\n */\r\n static Show(\r\n injector: Injector,\r\n canAppend?: boolean,\r\n canEdit?: boolean,\r\n onSelect?: (result: unknown) => void,\r\n ): void {\r\n runInInjectionContext(injector, () => {\r\n const dialogService = inject(ApplicationDialogService);\r\n const clipperService = inject(ClipperService);\r\n let lookupSubscription: Subscription | undefined;\r\n const canSelect = onSelect !== undefined;\r\n\r\n const d = dialogService.select({\r\n title: canSelect ? 'Seleziona un contatto' : 'Gestisci contatti',\r\n multipleSelection: true,\r\n mustSelect: canSelect,\r\n header: \"<table class='template-table template-table-header small'><tr><th class='col-50 col-maximizable'>Nome</th><th class='col-50 col-hideable'>Indirizzi email</th></tr></table>\",\r\n okCaption: 'Seleziona',\r\n canAppend,\r\n canEdit,\r\n canDelete: canEdit,\r\n canLookup: true,\r\n });\r\n\r\n d?.afterClosed().subscribe(() => lookupSubscription?.unsubscribe());\r\n\r\n d?.componentInstance.done.subscribe((result: unknown) => onSelect?.(result));\r\n\r\n d?.componentInstance.append.subscribe((result: any) => {\r\n import('../contact-edit/contact-edit.component').then(({ ClipperContactEditComponent }) => {\r\n const d2 = dialogService.open(ClipperContactEditComponent, {\r\n ariaLabel: 'crea contatto',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: true,\r\n data: { currentItem: null },\r\n minWidth: '375px',\r\n maxWidth: '500px',\r\n width: '99%',\r\n });\r\n d2?.componentInstance.done.subscribe((result2: EditDialogCompleted<ClipperContactInfo>) => {\r\n if (result2.isNew) {\r\n const item = result2.data;\r\n result.items.unshift({\r\n template: ClipperContactsSelector.buildContactTemplate(item),\r\n bag: item,\r\n searchBag: { name: item.name ?? '?' },\r\n });\r\n }\r\n result.owner.notifyChanges();\r\n d2?.close();\r\n });\r\n });\r\n });\r\n\r\n d?.componentInstance.edit.subscribe((result: any) => {\r\n import('../contact-edit/contact-edit.component').then(({ ClipperContactEditComponent }) => {\r\n const d2 = dialogService.open(ClipperContactEditComponent, {\r\n ariaLabel: 'modifica contatto',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: true,\r\n data: { currentItem: result.item.bag },\r\n minWidth: '375px',\r\n maxWidth: '500px',\r\n width: '99%',\r\n });\r\n d2?.componentInstance.done.subscribe((result2: EditDialogCompleted<ClipperContactInfo>) => {\r\n const item = result2.data;\r\n const i: number = result.items.indexOf(result.item);\r\n if (i !== -1) {\r\n result.items[i].template = ClipperContactsSelector.buildContactTemplate(item);\r\n result.items[i].bag = item;\r\n result.items[i].searchBag = { name: item.name ?? '' };\r\n }\r\n result.owner?.notifyChanges();\r\n d2?.close();\r\n });\r\n });\r\n });\r\n\r\n d?.componentInstance.delete.subscribe((result: any) => {\r\n if (!(result.selectedItems?.length > 0)) return;\r\n const ids = (result.selectedItems as any[])\r\n .map(n => n.bag?.id as number | undefined)\r\n .filter((id): id is number => id != null);\r\n const message = result.selectedItems.length === 1\r\n ? `Vuoi davvero eliminare il contatto ${result.selectedItems[0].bag.name}?`\r\n : 'Vuoi davvero eliminare i contatti selezionati?';\r\n dialogService.confirm(message)\r\n ?.componentInstance.choosen.subscribe((data: DialogResult) => {\r\n if (data.result !== 'ok') return;\r\n dialogService.busy('Eliminazione in corso...');\r\n clipperService.deleteContacts(ids)\r\n .pipe(finalize(() => dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) {\r\n dialogService.error(r.message);\r\n } else {\r\n for (let i = result.items.length - 1; i >= 0; i--) {\r\n if (ids.includes(result.items[i].bag?.id)) {\r\n result.items.splice(i, 1);\r\n }\r\n }\r\n result.owner?.notifyChanges(result.items.length);\r\n d?.componentInstance.clearSelection();\r\n dialogService.toast('Operazione completata con successo.');\r\n }\r\n });\r\n });\r\n });\r\n\r\n d?.componentInstance.lookup.subscribe((result: any) => {\r\n dialogService.busy('Ricerca in corso...');\r\n lookupSubscription?.unsubscribe();\r\n lookupSubscription = clipperService\r\n .queryContacts({ any: result.filter, count: 100 })\r\n .pipe(finalize(() => dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) {\r\n dialogService.error(r.message);\r\n return;\r\n }\r\n if ((r.value?.total ?? 0) > 0) {\r\n result.items.length = 0;\r\n (r.value.items as ClipperContactInfo[]).forEach(n => {\r\n result.items.push({\r\n template: ClipperContactsSelector.buildContactTemplate(n),\r\n bag: n,\r\n searchBag: { name: n.name ?? '?' },\r\n });\r\n });\r\n }\r\n result.owner?.notifyChanges(r.value?.total ?? 0);\r\n });\r\n });\r\n });\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, DestroyRef, Injector, TemplateRef, ViewContainerRef, afterNextRender, computed, inject, model, output, signal, viewChild } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { Overlay, OverlayModule, OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { ClipperDocumentNote, ClipperMessages, ClipperNotifyDocumentNoteParams, ClipperService } from '@arsedizioni/ars-utils/clipper.common';\r\nimport { BroadcastService, FormatPipe, ThemeService } from '@arsedizioni/ars-utils/core';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { Subscription, finalize, fromEvent } from 'rxjs';\r\nimport { ApplicationDialogService, SendToDialogComponent, SendToPopulateData } from '@arsedizioni/ars-utils/ui.application';\r\nimport { DialogResult } from '@arsedizioni/ars-utils/ui';\r\nimport { ClipperContactsSelector } from '../contacts-selector/contacts-selector';\r\n\r\n\r\n@Component({\r\n selector: 'clipper-note-badge',\r\n templateUrl: './note-badge.component.html',\r\n styleUrls: ['./note-badge.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [MatButtonModule,\r\n MatIconModule,\r\n MatTooltipModule,\r\n FormatPipe,\r\n FlexLayoutModule,\r\n OverlayModule],\r\n})\r\nexport class ClipperNoteBadgeComponent {\r\n private readonly themeService = inject(ThemeService);\r\n private readonly injector = inject(Injector);\r\n private readonly clipperService = inject(ClipperService);\r\n private readonly broadcastService = inject(BroadcastService);\r\n private readonly dialogService = inject(ApplicationDialogService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly overlay = inject(Overlay);\r\n private overlayRef: OverlayRef | null = null;\r\n private resizeSub: Subscription | null = null;\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n readonly populateContacts = output<SendToPopulateData>();\r\n private readonly popupTpl = viewChild.required<TemplateRef<void>>('popupTpl');\r\n readonly note = model.required<ClipperDocumentNote>();\r\n protected readonly backgroundColor = signal<string>('');\r\n protected readonly trackingUnopenedCount = computed(() => {\r\n const trackings = this.note().trackings;\r\n if (!trackings?.length) return -1;\r\n return trackings.filter(t => !t.openDate).length;\r\n });\r\n protected readonly trackingOpenedCount = computed(() => {\r\n const trackings = this.note().trackings;\r\n if (!trackings?.length) return 0;\r\n return trackings.filter(t => !!t.openDate).length;\r\n });\r\n protected readonly totalTrackings = computed(() => this.note().trackings?.length ?? 0);\r\n\r\n constructor() {\r\n this.destroyRef.onDestroy(() => this.closePopup());\r\n afterNextRender(() => {\r\n this.themeService.changed\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.backgroundColor.set(this.getBackgroundColor()));\r\n this.backgroundColor.set(this.getBackgroundColor());\r\n });\r\n }\r\n\r\n /**\r\n * Computes the badge background color by blending the note colour with\r\n * black (dark theme) or white (light theme).\r\n * @returns The calculated background colour as a CSS `color-mix()` string.\r\n */\r\n private getBackgroundColor(): string {\r\n return this.themeService.getTheme() === 'dark'\r\n ? `color-mix(in srgb, ${this.note().color} 60%, black)`\r\n : `color-mix(in srgb, ${this.note().color} 40%, white)`;\r\n }\r\n\r\n /**\r\n * Opens the note-details popup positioned near the mouse cursor.\r\n * Stops event propagation to avoid triggering parent click handlers.\r\n * @param event - The mouse event used to determine the popup position.\r\n */\r\n protected showPopup(event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.closePopup();\r\n\r\n const popupWidth = 320;\r\n const fitsRight = event.clientX + popupWidth <= window.innerWidth;\r\n\r\n const buildPositionBelow = () => {\r\n const s = this.overlay.position().global().top(`${event.clientY}px`);\r\n return fitsRight ? s.left(`${event.clientX}px`) : s.centerHorizontally();\r\n };\r\n const buildPositionAbove = () => {\r\n const s = this.overlay.position().global().bottom(`${window.innerHeight - event.clientY}px`);\r\n return fitsRight ? s.left(`${event.clientX}px`) : s.centerHorizontally();\r\n };\r\n\r\n const ref = this.overlay.create({\r\n positionStrategy: buildPositionBelow(),\r\n hasBackdrop: true,\r\n backdropClass: 'cdk-overlay-transparent-backdrop',\r\n scrollStrategy: this.overlay.scrollStrategies.close(),\r\n });\r\n\r\n this.resizeSub = fromEvent(window, 'resize').pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => this.closePopup());\r\n\r\n ref.keydownEvents().pipe(takeUntilDestroyed(this.destroyRef)).subscribe(e => { if (e.key === 'Escape') this.closePopup(); });\r\n ref.backdropClick().pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => this.closePopup());\r\n ref.attach(new TemplatePortal(this.popupTpl(), this.viewContainerRef));\r\n\r\n // After rendering, check if the popup overflows the bottom of the viewport and reposition upward\r\n setTimeout(() => {\r\n if (!this.overlayRef) return;\r\n const rect = ref.overlayElement.getBoundingClientRect();\r\n if (rect.bottom > window.innerHeight) {\r\n ref.updatePositionStrategy(buildPositionAbove());\r\n }\r\n });\r\n\r\n this.overlayRef = ref;\r\n }\r\n\r\n /**\r\n * Closes the note-details popup and cleans up overlay resources.\r\n * @param event - Optional mouse event; when provided, propagation is stopped.\r\n */\r\n protected closePopup(event?: MouseEvent): void {\r\n event?.stopPropagation();\r\n this.resizeSub?.unsubscribe();\r\n this.resizeSub = null;\r\n this.overlayRef?.detach();\r\n this.overlayRef?.dispose();\r\n this.overlayRef = null;\r\n }\r\n\r\n /**\r\n * Opens the note-edit dialog pre-populated with the current note data.\r\n * On confirmation, updates the model and broadcasts the change.\r\n * Stops event propagation to avoid triggering parent click handlers.\r\n * @param event - The mouse event that triggered the edit action.\r\n */\r\n protected edit(event: MouseEvent): void {\r\n event.stopPropagation();\r\n import('../note-edit/note-edit.component').then(({ ClipperNoteEditComponent }) => {\r\n const d = this.dialogService.open(ClipperNoteEditComponent, {\r\n ariaLabel: 'modifica annotazione',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: true,\r\n closeOnNavigation: false,\r\n data: { currentItem: this.note() },\r\n minWidth: '375px',\r\n maxWidth: '600px',\r\n width: '100%',\r\n });\r\n d?.componentInstance.done.subscribe(result => {\r\n this.note.update(t => ({ ...result, trackings: t.trackings }));\r\n this.broadcastService.sendMessage(ClipperMessages.COMMAND_NOTES_UPDATE, this.note());\r\n d?.close();\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Opens a confirmation dialog and, on confirmation, deletes the note via the service.\r\n * Broadcasts the deletion and closes the popup on success.\r\n * Stops event propagation to avoid triggering parent click handlers.\r\n * @param event - The mouse event that triggered the delete action.\r\n */\r\n protected delete(event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.dialogService\r\n .confirm(\r\n 'Sei sicuro di voler eliminare questa annotazione?',\r\n 'Attenzione!'\r\n )\r\n ?.componentInstance.choosen.subscribe((data: DialogResult) => {\r\n if (data.result === 'ok') {\r\n this.dialogService.busy('Eliminazione in corso...');\r\n this.clipperService.deleteNotes([this.note().id ?? 0])\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n this.dialogService.toast('Operazione completata con successo.');\r\n this.broadcastService.sendMessage(ClipperMessages.COMMAND_NOTES_DELETE, this.note());\r\n this.closePopup();\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Opens the send-by-email dialog for the document linked to this note.\r\n * On confirmation, sends a notification via the service and updates tracking data.\r\n * Stops event propagation to avoid triggering parent click handlers.\r\n * @param event - The mouse event that triggered the send action.\r\n */\r\n protected sendTo(event: MouseEvent): void {\r\n event.stopPropagation();\r\n if (!this.note().documentId) return;\r\n const d = this.dialogService.open(SendToDialogComponent, {\r\n ariaLabel: 'invia documenti per email',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: true,\r\n closeOnNavigation: true,\r\n data: {\r\n title: 'Invia per email',\r\n text: this.note().note,\r\n subject: `${this.note().name}`,\r\n canPopulate: true,\r\n },\r\n minWidth: '375px',\r\n maxWidth: '600px',\r\n width: '100%',\r\n });\r\n d?.componentInstance.done\r\n .subscribe(data => {\r\n const params: ClipperNotifyDocumentNoteParams = {\r\n recipients: data.recipients,\r\n userNoteId: this.note().id ?? 0,\r\n subject: data.subject,\r\n text: data.text\r\n } as ClipperNotifyDocumentNoteParams;\r\n this.dialogService.busy('Invio in corso...');\r\n this.clipperService.notifyNoteTo(params)\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n if (r.value.updated > 0) {\r\n this.note.update(t => ({ ...t, trackings: r.value.items }));\r\n this.dialogService.toast('Invio completato con successo.');\r\n } else {\r\n this.dialogService.toast('Non è stato necessario inviare alcun email.');\r\n }\r\n\r\n d?.close();\r\n }\r\n });\r\n });\r\n d?.componentInstance.populate\r\n .subscribe(data => {\r\n ClipperContactsSelector.Show(\r\n this.injector,\r\n true,\r\n true,\r\n (contacts: any) => {\r\n if (contacts?.selectedItems?.length > 0) {\r\n const recipients = contacts.selectedItems\r\n .filter((c: any) => c.bag?.emails)\r\n .map((c: any) => c.bag.emails as string)\r\n .join(';');\r\n data.source.updateRecipients(recipients);\r\n }\r\n });\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Opens a confirmation dialog and, on confirmation, resends the email notifications\r\n * associated with this note.\r\n * Stops event propagation to avoid triggering parent click handlers.\r\n * @param event - The mouse event that triggered the resend action.\r\n * @param notifyIfNotOpen - When `true`, only recipients who have not yet opened the previous email are notified.\r\n */\r\n protected sendAgain(event: MouseEvent, notifyIfNotOpen: boolean): void {\r\n event.stopPropagation();\r\n this.dialogService.confirm(\r\n 'Vuoi inviare nuovamente le email associate a questa annotazione?',\r\n 'Attenzione!'\r\n )?.componentInstance.choosen.subscribe((data: DialogResult) => {\r\n if (data.result === 'ok') {\r\n this.dialogService.busy('Invio in corso...');\r\n const params: ClipperNotifyDocumentNoteParams = {\r\n notifyIfNotOpen: notifyIfNotOpen,\r\n userNoteId: this.note().id ?? 0,\r\n } as ClipperNotifyDocumentNoteParams;\r\n this.clipperService.notifyNoteTo(params)\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n return;\r\n } else {\r\n if (r.value.updated > 0) {\r\n this.note.update(t => ({ ...t, trackings: r.value.items }));\r\n this.dialogService.toast('Invio completato con successo.');\r\n } else {\r\n this.dialogService.toast('Non è stato necessario inviare alcun email.');\r\n }\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Fetches the latest tracking data for the note from the server and updates the model.\r\n * Stops event propagation to avoid triggering parent click handlers.\r\n * @param event - The mouse event that triggered the refresh action.\r\n */\r\n protected refresh(event: MouseEvent): void {\r\n event.stopPropagation();\r\n const noteId = this.note().id ?? 0;\r\n if (!noteId) return;\r\n this.dialogService.busy('Aggiornamento in corso...');\r\n this.clipperService.getNoteTrackings(noteId)\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n this.note.update(t => ({ ...t, trackings: r.value }));\r\n }\r\n });\r\n }\r\n\r\n\r\n}\r\n","<div class=\"note-wrapper\">\r\n <div class=\"note\" [style.border-left-color]=\"note().color\" [style.background-color]=\"backgroundColor()\"\r\n (click)=\"showPopup($event)\">\r\n {{note().name}}\r\n @if (trackingUnopenedCount() >= 0) {\r\n @if (trackingUnopenedCount() === 0) {\r\n <span class=\"tracking-badge tracking-badge--all-open\"\r\n [matTooltip]=\"'Mail tutte aperte'\"><mat-icon>check_circle</mat-icon></span>\r\n } @else {\r\n <span class=\"tracking-badge tracking-badge--missing\"\r\n [matTooltip]=\"'Mail non aperte: ' + trackingUnopenedCount()\">{{-trackingUnopenedCount()}}</span>\r\n }\r\n }\r\n </div>\r\n</div>\r\n\r\n<ng-template #popupTpl>\r\n <div class=\"popup\">\r\n <div class=\"popup-header\" [style.border-left-color]=\"note().color\">\r\n <span class=\"popup-name\">{{note().name}}</span>\r\n <button mat-icon-button (click)=\"closePopup($event)\" aria-label=\"Chiudi\" matTooltip=\"Chiudi\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n <div class=\"popup-content\">\r\n @if (note().note) {\r\n <div class=\"popup-note\">{{note().note}}</div>\r\n }\r\n @if (totalTrackings() > 0) {\r\n <div class=\"popup-toolbar\" fxLayout=\"row\" fxLayoutAlign=\"space-between center\" fxFill>\r\n <div class=\"tracking-summary\" matTooltip=\"Aperture mail\">\r\n <mat-icon class=\"open-yes\">mark_email_read</mat-icon>\r\n {{trackingOpenedCount()}} / {{totalTrackings()}}\r\n </div>\r\n <div>\r\n <button mat-icon-button (click)=\"refresh($event)\" aria-label=\"Aggiorna\" matTooltip=\"Aggiorna stato aperture\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tracking-table-wrapper\">\r\n <table class=\"tracking-table\">\r\n <thead>\r\n <tr>\r\n <th>Destinatario</th>\r\n <th fxHide.xs>Inviato il</th>\r\n <th>Apertura</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (t of note().trackings; track t.id) {\r\n <tr>\r\n <td>{{t.email ?? '-'}}</td>\r\n <td fxHide.xs class=\"center\">{{t.sentDate | format:'D':'dd/MM/yyyy HH:mm'}}</td>\r\n <td class=\"open-cell\">\r\n @if (t.openDate) {\r\n <mat-icon class=\"open-yes\"\r\n [matTooltip]=\"t.openDate | format:'D':'dd/MM/yyyy HH:mm'\">check_circle</mat-icon>\r\n } @else {\r\n <mat-icon class=\"open-no\">radio_button_unchecked</mat-icon>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n }\r\n <div class=\"popup-footer\">\r\n <button mat-icon-button (click)=\"edit($event)\" aria-label=\"Modifica\" matTooltip=\"Modifica\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button mat-icon-button (click)=\"delete($event)\" aria-label=\"Elimina\" matTooltip=\"Elimina\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n <button mat-icon-button (click)=\"sendTo($event)\" aria-label=\"Invia\" matTooltip=\"Invia per email\">\r\n <mat-icon>send</mat-icon>\r\n </button>\r\n @if(totalTrackings() > 0) {\r\n <button mat-icon-button (click)=\"sendAgain($event, false)\" aria-label=\"Invia di nuovo\"\r\n matTooltip=\"Invia di nuovo per email\">\r\n <mat-icon>forward</mat-icon>\r\n </button>\r\n @if (trackingUnopenedCount() > 0) {\r\n <button mat-icon-button (click)=\"sendAgain($event, true)\" aria-label=\"Invia se non aperto\"\r\n matTooltip=\"Invia una nuova mail a coloro che non hanno ancora aperto la mail precedente.\">\r\n <mat-icon>notifications_active</mat-icon>\r\n </button>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>","import { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, model, signal } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenu, MatMenuModule } from '@angular/material/menu';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { ClipperDocumentInfo, ClipperMessages, ClipperModel, ClipperUtils } from '@arsedizioni/ars-utils/clipper.common';\r\nimport { BroadcastService, FormatPipe, ScreenService, SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { ClipperNoteBadgeComponent } from '../note-badge/note-badge.component';\r\nimport { ClipperSearchResultManager } from '../search-result-manager/search-result-manager';\r\n\r\n\r\nexport enum ClipperSearchResultItemDisplayMode {\r\n List = 1,\r\n Tile = 2,\r\n Stripe = 3\r\n}\r\n\r\n\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'clipper-search-result-item',\r\n templateUrl: './search-result-item.component.html',\r\n styleUrls: ['./search-result-item.component.scss'],\r\n standalone: true,\r\n imports: [\r\n MatCheckboxModule,\r\n MatButtonModule,\r\n MatTooltipModule,\r\n MatIconModule,\r\n MatMenuModule,\r\n FlexLayoutModule,\r\n FormatPipe,\r\n ClipperNoteBadgeComponent\r\n ],\r\n})\r\nexport class ClipperSearchResultItemComponent {\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n protected readonly screenService = inject(ScreenService);\r\n private readonly broadcastService = inject(BroadcastService);\r\n readonly parent = input.required<ClipperSearchResultManager>();\r\n readonly item = model.required<ClipperDocumentInfo>();\r\n readonly actions = input.required<MatMenu>();\r\n protected taxonomy = signal<string[]>([]);\r\n readonly tileNoPictureUrl = input<string>();\r\n readonly tilePictureUrl = input<string>(); \r\n readonly isSelectable = input<boolean>(true);\r\n readonly isReadable = input<boolean>(true);\r\n readonly isReadableModel = input<ClipperModel | undefined>(undefined);\r\n readonly displayModifiedTitle = input<boolean>(false);\r\n readonly displayModelName = input<boolean>(false);\r\n readonly displayDate = input<boolean>(true);\r\n readonly displayMode = input<ClipperSearchResultItemDisplayMode>(ClipperSearchResultItemDisplayMode.List);\r\n protected readonly displayModesEnum: typeof ClipperSearchResultItemDisplayMode = ClipperSearchResultItemDisplayMode;\r\n protected readonly modelsEnum: typeof ClipperModel = ClipperModel;\r\n\r\n /** Incremented whenever the parent's SelectionModel changes, invalidating `isSelected`. */\r\n private readonly selectionChangeTick = signal(0);\r\n\r\n /**\r\n * Whether this item is currently selected in the parent's selection model.\r\n * Recomputed whenever `selectionChangeTick` is updated by the selection-changed subscription.\r\n */\r\n protected readonly isSelected = computed(() => {\r\n this.selectionChangeTick();\r\n return this.isSelectable() && this.parent()?.selection?.isSelected(this.item().documentId) === true;\r\n });\r\n\r\n /**\r\n * Whether this item has already been read by the user.\r\n */\r\n protected readonly isRead = computed(() => {\r\n const model = this.isReadableModel() ?? this.item().model ?? 0;\r\n return this.isReadable() && model > 0 && ClipperUtils.isClipperModelReadable(model) && this.item().isRead === true;\r\n });\r\n\r\n /**\r\n * Whether this item is readable but not yet read (i.e. the read-flag action should be shown).\r\n */\r\n protected readonly canBeRead = computed(() => {\r\n const model = this.isReadableModel() ?? this.item().model ?? 0;\r\n return this.isReadable() && model > 0 && ClipperUtils.isClipperModelReadable(model) && this.item().isRead !== true;\r\n });\r\n\r\n constructor() {\r\n // Recompute taxonomy path whenever item() changes.\r\n effect(() => {\r\n const taxonomy: string[] = [];\r\n this.item().taxonomyPath?.split('\\r\\n').forEach(p => {\r\n const pathValues = p.split('>');\r\n if (pathValues.length > 0) {\r\n taxonomy.push(SystemUtils.normalize(pathValues[pathValues.length - 1].trim()));\r\n } else {\r\n taxonomy.push(SystemUtils.normalize(p.trim()));\r\n }\r\n });\r\n this.taxonomy.set(taxonomy);\r\n });\r\n\r\n // Subscribe to selection changes once the parent input signal is available.\r\n effect(() => {\r\n this.parent()?.selection?.changed\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => {\r\n this.selectionChangeTick.update(v => v + 1); \r\n });\r\n });\r\n\r\n // React to broadcast messages from other components.\r\n this.broadcastService.getMessage()\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(message => {\r\n if (message.id === ClipperMessages.DOCUMENT_NAVIGATED) {\r\n if (this.isReadable() && this.item().documentId === message.data.document.documentId && !this.item().isRead) {\r\n this.parent()?.setRead(true, this.item());\r\n }\r\n } else if (message.id === ClipperMessages.DOCUMENT_READ) {\r\n if (this.isReadable() && this.item().documentId === message.data.document.documentId) {\r\n this.item.update(v => ({ ...v, isRead: message.data.value }));\r\n }\r\n } else if (message.id === ClipperMessages.COMMAND_NOTES_DELETE) {\r\n const p = this.item().notes?.findIndex(p => p.id === message.data.id);\r\n if (p !== undefined && p >= 0) {\r\n this.item.update(v => ({ ...v, notes: v.notes?.filter((_, i) => i !== p) }));\r\n }\r\n } else if (message.id === ClipperMessages.COMMAND_NOTES_UPDATE) {\r\n const p = this.item().notes?.findIndex(p => p.id === message.data.id);\r\n if (p !== undefined && p >= 0) {\r\n const props = [...(this.item().notes ?? [])];\r\n props[p] = message.data;\r\n this.item.update(v => ({ ...v, notes: props }));\r\n }\r\n }\r\n });\r\n }\r\n\r\n}\r\n","<div>\r\n @if (displayMode() === displayModesEnum.List ) {\r\n <div class=\"item\" fxLayout=\"row\" fxLayoutGap=\"6px\" fxLayoutAlign=\"start center\" fxFill\r\n [class.item-selected]=\"isSelected()\" [matContextMenuTriggerFor]=\"actions()\"\r\n [matContextMenuTriggerData]=\"{item: item()}\" (mouseenter)=\"item().isOver = true\"\r\n (mouseleave)=\"item().isOver = false\">\r\n <div fxFlex=\"6px\" fxFlexAlign=\"stretch\" [class]=\"parent().getItemStateCssClass(item())\"\r\n [matTooltip]=\"parent().getItemStateTooltip(item())\"><span></span>\r\n </div>\r\n <div [fxFlex]=\"isSelectable() ? '48px' : '16px'\" fxLayoutAlign=\"center\">\r\n @if (isSelectable() && (screenService.isTouchable || item().isOver || isSelected())) {\r\n <mat-checkbox (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? parent().selection?.toggle(item(), item().documentId) : null\" [checked]=\"isSelected()\">\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxFlex=\"*\">\r\n <div class=\"item-content\">\r\n\r\n @if (displayModelName() && item().modelName) {\r\n @if (item().origin === 'GC' || item().origin === 'GN') {\r\n <div class=\"info-2\">GIURISPRUDENZA</div>\r\n } @else {\r\n <div class=\"info-2\">{{item().modelName}}</div>\r\n }\r\n }\r\n @if (item().info && item().model === modelsEnum.Quesiti) {\r\n @if(item().info) {\r\n <div class=\"info-1\">{{item().info}}</div>\r\n }\r\n }@else if(item().model === modelsEnum.NormativaVigente ||\r\n item().model === modelsEnum.AggiornamentoNormativo ||\r\n item().model === modelsEnum.GiurisprudenzaRecente ||\r\n item().model === modelsEnum.Juris) {\r\n @if (item().author && (item().origin === 'LR' || item().origin === 'GC' || item().origin\r\n === 'GN')) {\r\n <div class=\"info-1\">{{item().author}}</div>\r\n }\r\n @if(item().model === modelsEnum.Juris && displayDate() && item().date) {\r\n <div class=\"info-1\">{{item().date | format:'D':'d MMM yyyy'}}</div>\r\n }\r\n }@else if (displayDate() && item().date) {\r\n <div class=\"info-1\">{{item().date | format:'D':'d MMM yyyy'}}</div>\r\n }\r\n <div>\r\n <a class=\"link\" (click)=\"parent().open(item().documentId, undefined, item().chunksList)\"\r\n [attr.aria-label]=\"'Apri documento ' + item().title1\">{{item().title1 ?? item().title2}}</a>\r\n @if ((item().part ?? 0) > 0) {\r\n <span class=\"badge\">PARTE {{item().part}}</span>\r\n }\r\n @if (item().isCommented) {\r\n <span class=\"badge\">COMMENTATA</span>\r\n }\r\n @if ((item().validityState ?? 0) > 0) {\r\n <span class=\"badge-red\">{{item().validityDescription}}</span>\r\n }\r\n </div>\r\n @if(item().description && item().model === modelsEnum.Coordinamento) {\r\n <div class=\"title\">{{item().description}}</div>\r\n }\r\n @if (item().title2 &&\r\n item().model !== modelsEnum.Coordinamento &&\r\n item().model !== modelsEnum.News &&\r\n item().model !== modelsEnum.AllerteAlimentari &&\r\n item().model !== modelsEnum.Articoli &&\r\n item().model !== modelsEnum.Juris &&\r\n item().model !== modelsEnum.Quesiti &&\r\n item().model !== modelsEnum.Scadenze &&\r\n item().model !== modelsEnum.Segnalazioni) {\r\n <div class=\"title\">{{item().title2}}</div>\r\n }\r\n @if (item().originDescription &&\r\n item().model !== modelsEnum.Scadenze &&\r\n item().model !== modelsEnum.Segnalazioni &&\r\n item().model !== modelsEnum.News &&\r\n item().model !== modelsEnum.Articoli &&\r\n item().model !== modelsEnum.Juris) {\r\n <div class=\"info-1\"\r\n [class.info-3]=\"(item().model === modelsEnum.Coordinamento && (item().validFromDate || item().applicableFromDate))\">\r\n {{item().originDescription}}\r\n @if (item().model === modelsEnum.Coordinamento ) {\r\n @if (item().validFromDate) {\r\n in vigore da: <span class=\"bold\">{{item().validFromDate | format:'D':'d MMMM yyyy'}}</span>\r\n }\r\n @if (item().applicableFromDate) {\r\n applicabile da: <span class=\"bold\">{{item().applicableFromDate | format:'D':'d MMMM yyyy'}}</span>\r\n }\r\n }\r\n </div>\r\n }\r\n @if ((item().anchors?.length ?? 0) > 0) {\r\n <div class=\"details\">\r\n <div>DETTAGLIO</div>\r\n <div class=\"links\">\r\n @for (a of item().anchors; track $index) {\r\n <span>\r\n @if (a.uri && a.text) {\r\n <a (click)=\"parent().open(a.documentId + '#' + a.uri, undefined, item().chunksList)\"\r\n [matTooltip]=\"a.title\" [class.bright]=\"(a.score ?? 0) > 0.75\">\r\n {{a.text}}\r\n @if (a.veryRelevant) {\r\n <sup>\r\n <mat-icon class=\"thumb\"\r\n [matTooltip]=\"(a.score ?? 0) > 0.75 ? 'Molto rilevante' : 'Più rilevante'\">thumb_up_alt</mat-icon>\r\n </sup>\r\n }</a>\r\n }\r\n @if (!a.uri && a.text) {\r\n <span>{{a.text}}</span>\r\n }\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n @if (taxonomy().length > 0) {\r\n <div class=\"details\">\r\n <div>ARGOMENTI</div>\r\n <div class=\"links\">\r\n <div [innerHTML]=\"taxonomy().join(' − ')\"></div>\r\n </div>\r\n </div>\r\n }\r\n @if (item().model === modelsEnum.News ||\r\n item().model === modelsEnum.Articoli ||\r\n item().model === modelsEnum.Juris) {\r\n @if (item().info){\r\n <div class=\"details\">\r\n <div class=\"links\">\r\n <div>{{item().info}}</div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n @if (item().model === modelsEnum.Coordinamento) {\r\n @if (item().title1 && displayModifiedTitle()) {\r\n <div class=\"details\">\r\n <div>TITOLO DOCUMENTO MODIFICATO</div>\r\n <div class=\"links\">\r\n <div>{{item().title1}}</div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n @if (item().model === modelsEnum.Scadenze || item().model === modelsEnum.Segnalazioni) {\r\n @if (item().expiringDescription) {\r\n <div class=\"details\">\r\n <div>PROSSIMA SCADENZA</div>\r\n <div class=\"links\">\r\n <div>{{item().expiringDescription}}</div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n @if((item().notes?.length ?? 0) > 0 ) {\r\n <div class=\"notes-container\">\r\n @for (note of item().notes; track note.id) {\r\n <clipper-note-badge [note]=\"note\" />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"end\">\r\n @if (canBeRead())\r\n {\r\n <button type=\"button\" mat-icon-button matTooltip=\"Segna come già letta\" [attr.aria-label]=\"'Segna come già letta'\"\r\n (click)=\"parent().toggleRead(item(), $event)\" [hidden]=\"!(item().isOver || item().isMenuOpen)\">\r\n <mat-icon>flag</mat-icon>\r\n </button>\r\n }\r\n @if(item().model === modelsEnum.Scadenze || item().model === modelsEnum.Segnalazioni) {\r\n <button type=\"button\" mat-icon-button matTooltip=\"Aggiungi al tuo calendario\"\r\n (click)=\"parent().addToCalendar(item())\" [attr.aria-label]=\"'Aggiungi al tuo calendario'\"\r\n [hidden]=\"!(item().isOver || item().isMenuOpen)\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Menu\" [attr.aria-label]=\"'Menu opzioni'\"\r\n [matMenuTriggerFor]=\"actions()\" [matMenuTriggerData]=\"{item: item()}\" (click)=\"item().isMenuOpen = true\"\r\n [hidden]=\"!(item().isOver || item().isMenuOpen)\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n } @else if (displayMode() === displayModesEnum.Tile ) {\r\n <div class=\"tile\" [matContextMenuTriggerFor]=\"actions()\" [matContextMenuTriggerData]=\"{item: item()}\"\r\n (mouseenter)=\"item().isOver = true\" (mouseleave)=\"item().isOver = false\" [class.item-selected]=\"isSelected()\"\r\n [class.item-unread]=\"isRead()\" (click)=\"parent().open(item().documentId, undefined, item().chunksList)\">\r\n <div class=\"image\">\r\n @if (canBeRead() || isSelectable()) {\r\n <div class=\"buttons\">\r\n @if (canBeRead()) {\r\n <button mat-icon-button class=\"unread-button\" matTooltip=\"Segna come già letto\"\r\n (click)=\"parent().toggleRead(item(), $event)\"><mat-icon>flag</mat-icon></button>\r\n }\r\n @if (isSelectable() && (isSelected() || item().isOver === true)) {\r\n <button mat-icon-button class=\"check\" [class.check-selected]=\"isSelected()\" matTooltip=\"Seleziona/Deseleziona\"\r\n (click)=\"parent().toggleSelection(item(), $event)\"><mat-icon>check</mat-icon></button>\r\n }\r\n </div>\r\n }\r\n <div class=\"info-1\">{{item().modelName}}</div>\r\n @if (item().info) {\r\n <div class=\"info-2\">{{item().info}}</div>\r\n }\r\n @if (item().pictureId && tilePictureUrl()) {\r\n <img decoding=\"async\" loading=\"lazy\" [src]=\"tilePictureUrl() + '?id=' + item().pictureId\" [alt]=\"item().title2\" />\r\n } @else if (tileNoPictureUrl()) {\r\n <picture>\r\n <img decoding=\"async\" loading=\"lazy\" [src]=\"tileNoPictureUrl()\"\r\n [alt]=\"item().title2 || 'immagine non trovata'\" />\r\n </picture>\r\n }\r\n </div>\r\n <div class=\"body\">\r\n <div class=\"date\">\r\n <span class=\"date-day\" [class.unread]=\"!item().isRead\">{{item().date | format:'D':'d\r\n MMMM'}}</span>\r\n <span class=\"date-divider\"></span>\r\n <span>{{item().date| format:'D':'yyyy'}}</span>\r\n </div>\r\n <div class=\"title\">{{item().title2}}</div>\r\n </div>\r\n </div>\r\n } @else if (displayMode() === displayModesEnum.Stripe ) {\r\n <div class=\"stripe\" [matContextMenuTriggerFor]=\"actions()\" [matContextMenuTriggerData]=\"{item: item()}\"\r\n (mouseenter)=\"item().isOver = true\" (mouseleave)=\"item().isOver = false\" [class.item-selected]=\"isSelected()\"\r\n [class.item-unread]=\"isRead()\" (click)=\"parent().open(item().documentId, undefined, item().chunksList)\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFill>\r\n <div>\r\n <div fxLayout=\"row\">\r\n <div fxHide.xs class=\"image\">\r\n @if (canBeRead() || isSelectable()) {\r\n <div class=\"buttons\">\r\n @if (canBeRead()) {\r\n <button mat-icon-button class=\"unread-button\" matTooltip=\"Segna come già letto\"\r\n (click)=\"parent().toggleRead(item(), $event)\"><mat-icon>flag</mat-icon></button>\r\n }\r\n @if (isSelectable() && (isSelected() || item().isOver === true)) {\r\n <button mat-icon-button class=\"check\" [class.check-selected]=\"isSelected()\"\r\n matTooltip=\"Seleziona/Deseleziona\"\r\n (click)=\"parent().toggleSelection(item(), $event)\"><mat-icon>check</mat-icon></button>\r\n }\r\n </div>\r\n }\r\n @if (item().pictureId && tilePictureUrl()) {\r\n <img decoding=\"async\" loading=\"lazy\" [src]=\"tilePictureUrl() + '?id=' + item().pictureId\"\r\n [alt]=\"item().title2\" />\r\n } @else if (tileNoPictureUrl()) {\r\n <picture>\r\n <img decoding=\"async\" loading=\"lazy\" [src]=\"tileNoPictureUrl()\"\r\n [alt]=\"item().title2 || 'immagine non trovata'\" />\r\n </picture>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" class=\"body\">\r\n <div class=\"date\">\r\n <span class=\"date-day\" [class.unread]=\"!item().isRead\">{{item().date | format:'D':'d\r\n MMMM'}}</span>\r\n <span class=\"date-divider\"></span>\r\n <span>{{item().date| format:'D':'yyyy'}}</span>\r\n </div>\r\n <div class=\"title\">{{item().title2}}</div>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\">\r\n <div class=\"info-1\">{{item().modelName}}</div>\r\n @if (item().info) {\r\n <div class=\"info-2\">{{item().info}}</div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</div>","import { Breakpoints } from '@angular/cdk/layout';\r\nimport { ScrollDispatcher, ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { afterNextRender, ChangeDetectionStrategy, Component, computed, effect, inject, input, signal, viewChild } from '@angular/core';\r\nimport { outputToObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatBadge } from '@angular/material/badge';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatExpansionModule, MatExpansionPanel } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInput, MatInputModule } from '@angular/material/input';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatPaginator, PageEvent } from '@angular/material/paginator';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatDrawer, MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { ClipperAuthors, ClipperChannel, ClipperDocumentChangeReasons, ClipperDocumentInfo, ClipperMessages, ClipperModel, ClipperModule, ClipperRegions, ClipperSearchFacetsSnapshot, ClipperSearchParams, ClipperSearchUtils, ClipperSectors, ClipperSectorTypes, ClipperSort, ClipperSources, ClipperUserInfo, ClipperUserSearch, ClipperUtils, SectorInfo } from '@arsedizioni/ars-utils/clipper.common';\r\nimport { ArsCoreModule, DateInterval, INode, NameValueItem, SelectableModel, SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { DialogResult } from '@arsedizioni/ars-utils/ui';\r\nimport { ButtonSelectorComponent, ButtonToggleComponent, ChipsSelectorComponent } from '@arsedizioni/ars-utils/ui.application';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { finalize } from 'rxjs';\r\nimport { ClipperDocumentMenuComponent } from '../document-menu/document-menu.component';\r\nimport { ClipperSearchFacetsComponent } from '../search-facets/search-facets.component';\r\nimport { ClipperSearchResultManager } from '../search-result-manager/search-result-manager';\r\nimport type { SearchFreeTextQueryParams } from '../search-free-text-query-builder/search-free-text-query-builder.component';\r\nimport { ClipperSearchResultItemComponent } from '../search-result-item/search-result-item.component';\r\n\r\n\r\n\r\n\r\n@Component({\r\n selector: 'clipper-browser',\r\n standalone: true,\r\n imports: [FormsModule, FlexLayoutModule, MatIconModule, MatButtonModule, MatTooltipModule, MatSidenavModule,\r\n MatExpansionModule, MatDividerModule, MatMenuModule, MatFormFieldModule, MatInputModule, MatDatepickerModule, MatBadge,\r\n ScrollingModule, MatSelectModule, MatChipsModule, MatSlideToggleModule, MatPaginator, MatCheckboxModule, MatButtonToggleModule, MatProgressBarModule,\r\n ArsCoreModule, ChipsSelectorComponent, ButtonSelectorComponent, ButtonToggleComponent,\r\n ClipperSearchResultItemComponent,\r\n ClipperDocumentMenuComponent, ClipperSearchFacetsComponent],\r\n templateUrl: './browser.component.html',\r\n styleUrl: './browser.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ClipperBrowserComponent extends ClipperSearchResultManager {\r\n\r\n\r\n readonly filterByNumber = viewChild<MatInput>('filterByNumber');\r\n readonly filterByText = viewChild<MatInput>('filterByText');\r\n readonly filterByChangeNumber = viewChild<MatInput>('filterByChangeNumber');\r\n readonly filterPane = viewChild.required<MatDrawer>('filterPane');\r\n readonly filterPane2 = viewChild.required<MatDrawer>('filterPane2');\r\n readonly filterSelector = viewChild<ButtonSelectorComponent>('filterSelector');\r\n readonly moduleSelector = viewChild.required<ChipsSelectorComponent>('moduleSelector');\r\n readonly sourceExpansionPanel = viewChild<MatExpansionPanel>('sourceExpansionPanel');\r\n readonly otherOptionsExpansionPanel = viewChild<MatExpansionPanel>('otherOptionsExpansionPanel');\r\n readonly modifierExpansionPanel = viewChild<MatExpansionPanel>('modifierExpansionPanel');\r\n readonly showChannels = input<boolean>(true);\r\n readonly showRSOptions = input<boolean>(true);\r\n readonly showAIAssistantOptions = input<boolean>(false);\r\n readonly selectableModules = input<ClipperModule[]>([]);\r\n readonly initialModule = input<ClipperModule | undefined>(undefined);\r\n protected scrollDispatcher = inject(ScrollDispatcher);\r\n protected readonly filterDescription = signal<string>('');\r\n protected readonly filters = signal<NameValueItem<ClipperUserSearch>[]>([]);\r\n\r\n /** Currently selected saved filter, derived from the filters list and the active search id. */\r\n protected readonly filter = computed<NameValueItem<ClipperUserSearch> | undefined>(() =>\r\n this.hasFilters() && this.filterParams.searchId\r\n ? this.filters().find(x => x.value.id === this.filterParams.searchId)\r\n : undefined\r\n );\r\n\r\n /** True when the user has access to the AI assistant feature. */\r\n protected readonly hasAIAssistant = computed(() =>\r\n this.showAIAssistantOptions() && this.clipperService.loginInfo?.context.hasAIAssistant === true\r\n );\r\n\r\n /** True when at least one saved filter is available. */\r\n protected readonly hasFilters = computed(() => this.filters().length > 0);\r\n\r\n /**\r\n * Checks whether the current module selection targets law-related content.\r\n * @param allowEmpty - When true, an empty module list also counts as law-related. Defaults to true.\r\n * @returns True if the selection includes any law module or (when allowEmpty) is empty.\r\n */\r\n protected isLaws(allowEmpty: boolean = true): boolean {\r\n const modules = this.filterParams.modules;\r\n return (allowEmpty && (modules?.length ?? 0) === 0) ||\r\n (modules?.findIndex(x =>\r\n x.value === ClipperModule.GazzetteBollettiniEFontiDiverse ||\r\n x.value === ClipperModule.NormativaVigente ||\r\n x.value === ClipperModule.GiurisprudenzaRecente) ?? -1) !== -1;\r\n }\r\n\r\n /**\r\n * Checks whether the currently selected modules produce readable content.\r\n * @returns True when the modules allow content reading.\r\n */\r\n protected isReadable(): boolean {\r\n return (this.canSearch() && (this.filterParams.modules?.length ?? 0) === 0) ||\r\n ((this.filterParams.modules?.length ?? 0) > 0 &&\r\n (this.filterParams.modules?.findIndex(\r\n m => m.value === ClipperModule.NormativaVigente || m.value === ClipperModule.ScadenzeESegnalazioni\r\n ) ?? -1) === -1);\r\n }\r\n\r\n /**\r\n * Checks whether the current selection targets the coordination module.\r\n * @returns True when the 'ModificheAbrogazioniERinvii' module is selected.\r\n */\r\n protected isCoordination(): boolean {\r\n return (this.filterParams.modules?.length ?? 0) > 0 &&\r\n (this.filterParams.modules?.findIndex(x => x.value === ClipperModule.ModificheAbrogazioniERinvii) ?? -1) !== -1;\r\n }\r\n\r\n /**\r\n * Checks whether the current sort mode is one of the date-based sort options.\r\n * @returns True when results are sorted by date (ascending or descending).\r\n */\r\n protected isSortedByDate(): boolean {\r\n return this.sortMode()?.value === ClipperSort.DateAsc ||\r\n this.sortMode()?.value === ClipperSort.DateDesc ||\r\n this.sortMode()?.value === ClipperSort.SourceDateAsc ||\r\n this.sortMode()?.value === ClipperSort.SourceDateDesc;\r\n }\r\n\r\n /**\r\n * Checks whether the current filter parameters define a valid search.\r\n * @returns True when at least one filter parameter has been set.\r\n */\r\n protected canSearch(): boolean {\r\n return this.isFiltering(this.filterParams);\r\n }\r\n\r\n protected readonly sectors = signal<SectorInfo[]>([]);\r\n\r\n /**\r\n * Checks whether sector-based filtering is available for the current selection.\r\n * @returns True when sector filtering applies.\r\n */\r\n protected hasSectors(): boolean {\r\n return this.isLaws();\r\n }\r\n\r\n protected readonly regions = signal<NameValueItem<string>[]>([]);\r\n\r\n /**\r\n * Checks whether region-based filtering is available.\r\n * @returns True when the selection includes sectors with regional content (LR).\r\n */\r\n protected override readonly hasRegions = computed(() =>\r\n this.hasSectors() && (this.filterParams.sectors?.filter(n => n.value === 'LR').length ?? 0) > 0\r\n );\r\n\r\n protected readonly sources = signal<NameValueItem<string>[]>([...ClipperSources]);\r\n\r\n /**\r\n * Checks whether source-based filtering applies to the current module selection.\r\n * @returns True when source filtering is available.\r\n */\r\n protected hasSource(): boolean {\r\n return this.isLaws();\r\n }\r\n\r\n protected readonly authors = signal<NameValueItem<string>[]>([]);\r\n protected readonly types = signal<NameValueItem<string>[]>([]);\r\n /** Topic tree loaded on initialization, used as input for the tree-selection dialog. */\r\n protected topics: INode[] = [];\r\n\r\n /**\r\n * Checks whether topic-based filtering applies to the current module selection.\r\n * @returns True when topic filtering is available.\r\n */\r\n protected hasTopics(): boolean {\r\n return this.isLaws();\r\n }\r\n\r\n protected readonly tags = signal<NameValueItem<string>[]>([]);\r\n\r\n /**\r\n * Checks whether tag-based filtering is available for the current modules.\r\n * @returns True when tags are loaded and the selection includes news or in-depth modules.\r\n */\r\n protected hasTags(): boolean {\r\n return this.tags().length > 0 &&\r\n ((this.filterParams.modules?.length === 0 &&\r\n (this.hasModule(ClipperModule.News) || this.hasModule(ClipperModule.Approfondimenti))) ||\r\n (this.filterParams.modules?.findIndex(\r\n m => m.value === ClipperModule.News || m.value === ClipperModule.Approfondimenti\r\n ) ?? -1) !== -1);\r\n }\r\n protected reasons = signal<NameValueItem<number>[]>([...ClipperDocumentChangeReasons]);\r\n protected modules = signal<NameValueItem<ClipperModule>[]>(this.getAllModules());\r\n\r\n /**\r\n * The subset of modules available for selection, filtered by `selectableModules` when it is non-empty.\r\n * Falls back to all modules when `selectableModules` is empty or null.\r\n */\r\n protected readonly filteredModules = computed<NameValueItem<ClipperModule>[]>(() => {\r\n const selectable = this.selectableModules();\r\n if (!selectable || selectable.length === 0) return this.modules();\r\n return this.modules().filter(m => selectable.includes(m.value));\r\n });\r\n protected interval: DateInterval = new DateInterval();\r\n protected sourceInterval: DateInterval = new DateInterval();\r\n protected user: ClipperUserInfo | undefined = this.clipperService.loginInfo?.context;\r\n private _viewReady = false;\r\n\r\n\r\n constructor() {\r\n super();\r\n\r\n // Initialize filter params with defaults\r\n this.filterParams.version = 7;\r\n this.filterParams.modules = [{ name: \"Normativa vigente\", shortName: \"Normativa vigente\", value: ClipperModule.NormativaVigente }];\r\n this.initializeFilter();\r\n\r\n // Initialize document selection model\r\n this.selection = new SelectableModel<ClipperDocumentInfo, string>(true, 'documentId');\r\n\r\n // React to breakpoint changes to update the filter pane layout\r\n this.breakpointObserver\r\n .observe([\r\n Breakpoints.XSmall,\r\n Breakpoints.Small,\r\n Breakpoints.Medium,\r\n Breakpoints.Large,\r\n Breakpoints.XLarge,\r\n ])\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(result => {\r\n if (!this._viewReady) return; // DOM not ready yet\r\n for (const query of Object.keys(result.breakpoints)) {\r\n if (result.breakpoints[query]) {\r\n this.handleFilterPaneVisibility();\r\n }\r\n }\r\n });\r\n\r\n // React to broadcasted messages\r\n this.broadcastService.getMessage()\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(message => {\r\n if (message.id === ClipperMessages.COMMAND_DASHBOARD_UPDATED) {\r\n this.updateModulesUnreadItems();\r\n } else if (message.id === ClipperMessages.COMMAND_SEARCH_RESTORED) {\r\n const filter = this.filter();\r\n if (filter) {\r\n this.selectFilter(filter);\r\n }\r\n this.handleFilterPaneVisibility();\r\n }\r\n });\r\n\r\n // Load tags if the feature is enabled for this user\r\n if (this.clipperService.allowTags()) {\r\n this.loadTags();\r\n }\r\n\r\n // Load topics and saved searches\r\n this.loadTopics();\r\n this.loadFilters();\r\n\r\n // Set up view-dependent behaviour after the first render\r\n afterNextRender(() => {\r\n this._viewReady = true;\r\n this.handleFilterPaneVisibility();\r\n this.filterPane().openedChange\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(opened => {\r\n this.updateFilterPaneFocus();\r\n // Sync backdrop with actual open state when in overlay mode\r\n if (this.filterPane().mode === 'over') {\r\n this.filterPaneHasBackdrop.set(opened);\r\n }\r\n });\r\n this.filterPane2().openedChange\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(opened => {\r\n if (this.filterPane2().mode === 'over') {\r\n this.filterPane2HasBackdrop.set(opened);\r\n }\r\n });\r\n this.updateFilterPaneFocus();\r\n this.updateModulesUnreadItems();\r\n this.modulesChanged();\r\n\r\n // Subscribe to facet changes\r\n const facets = this.facets();\r\n if (facets) {\r\n outputToObservable(facets.changed)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((value: ClipperSearchFacetsSnapshot) => {\r\n if (this.snapshot) {\r\n this.snapshot.facets = value;\r\n this.fetch(true);\r\n }\r\n });\r\n }\r\n });\r\n\r\n // React to initialModule changes: preselect the matching module in the UI and in filterParams\r\n effect(() => {\r\n const initialModule = this.initialModule();\r\n const selector = this.moduleSelector();\r\n const selected = this.filteredModules().find(x => x.value === initialModule) ?? this.filteredModules()[0];\r\n selector.select(selected);\r\n if (selected) {\r\n this.filterParams.modules = [selected];\r\n this.modulesChanged();\r\n }\r\n });\r\n\r\n // Trim filterParams.modules to only include items still available in filteredModules\r\n effect(() => {\r\n const available = this.filteredModules();\r\n if (this.filterParams.modules) {\r\n this.filterParams.modules = this.filterParams.modules.filter(\r\n x => available.findIndex(y => y.value === x.value) !== -1\r\n );\r\n }\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Get all available modules\r\n */\r\n private getAllModules(): NameValueItem<ClipperModule>[] {\r\n let modules: NameValueItem<ClipperModule>[] = [];\r\n modules.push({ name: \"News\", shortName: \"News\", value: ClipperModule.News });\r\n modules.push({ name: \"Gazzette, Bollettini e fonti diverse\", shortName: \"Gazzette, Bollettini e fonti diverse\", value: ClipperModule.GazzetteBollettiniEFontiDiverse });\r\n modules.push({ name: \"Modifiche, abrogazioni e rinvii\", shortName: \"Modifiche, abrogazioni e rinvii\", value: ClipperModule.ModificheAbrogazioniERinvii });\r\n modules.push({ name: \"Normativa vigente\", shortName: \"Normativa vigente\", value: ClipperModule.NormativaVigente });\r\n modules.push({ name: \"Giurisprudenza\", shortName: \"Giurisprudenza\", value: ClipperModule.GiurisprudenzaRecente });\r\n modules.push({ name: \"Articoli\", shortName: \"Articoli\", value: ClipperModule.Approfondimenti });\r\n modules.push({ name: \"Note a sentenza\", shortName: \"Note a sentenza\", value: ClipperModule.Giurisprudenza });\r\n modules.push({ name: \"Quesiti\", shortName: \"Quesiti\", value: ClipperModule.QuesitiECasiRisolti });\r\n modules.push({ name: \"Scadenze e segnalazioni\", shortName: \"Scadenze e segnalazioni\", value: ClipperModule.ScadenzeESegnalazioni });\r\n return modules;\r\n }\r\n\r\n /**\r\n * Return the snapshot document by id\r\n * @param id : the document id\r\n * @returns the document or null\r\n */\r\n public getSnapshotDocument(id: string): ClipperDocumentInfo | undefined {\r\n return this.snapshot.items.find(x => x.documentId === id || x.id === id);\r\n }\r\n\r\n\r\n /**\r\n * Loads available tags from the server and populates the tag signal.\r\n */\r\n protected loadTags(): void {\r\n this.clipperService.getTags()\r\n .subscribe(r => {\r\n if (r.success) {\r\n this.tags.set(r.value);\r\n }\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Load topics\r\n */\r\n private loadTopics() {\r\n if (!this.clipperService.loggedIn()) return;\r\n this.clipperService.getTopicsAsTree()\r\n .subscribe(r => {\r\n if (!r.success) this.dialogService.error(r.message);\r\n else {\r\n this.topics = SystemUtils.toNodes(r.value.children as INode[]);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Show hide filter pane manually\r\n */\r\n protected toggleFilterPane() {\r\n this.filterPaneClosed.set(!this.filterPaneClosed());\r\n this.filterPane()?.toggle();\r\n }\r\n\r\n /**\r\n * Show hide filter pane manually\r\n */\r\n protected toggleFilterPane2() {\r\n this.filterPane2Closed.set(!this.filterPane2Closed());\r\n this.filterPane2()?.toggle();\r\n }\r\n\r\n\r\n /**\r\n * Handle filter pane visibility\r\n */\r\n protected handleFilterPaneVisibility() {\r\n const filterPane = this.filterPane();\r\n if (filterPane) {\r\n if (this.breakpointObserver.isMatched(Breakpoints.XSmall) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Small) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Medium)) {\r\n if (filterPane.opened) {\r\n filterPane.close();\r\n }\r\n filterPane.mode = 'over';\r\n filterPane.disableClose = false;\r\n this.filterPaneHasBackdrop.set(filterPane.opened);\r\n } else {\r\n if (!filterPane.opened && !this.filterPaneClosed()) {\r\n filterPane.open();\r\n } else if (filterPane.opened && this.filterPaneClosed()) {\r\n filterPane.close();\r\n }\r\n filterPane.mode = 'side';\r\n filterPane.disableClose = true;\r\n this.filterPaneHasBackdrop.set(false);\r\n }\r\n }\r\n setTimeout(() => {\r\n const filterPane2 = this.filterPane2();\r\n if (filterPane2) {\r\n if (this.breakpointObserver.isMatched(Breakpoints.XSmall) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Small) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Medium)) {\r\n if (filterPane2.opened) {\r\n filterPane2.close();\r\n }\r\n filterPane2.mode = 'over';\r\n filterPane2.disableClose = false;\r\n this.filterPane2HasBackdrop.set(filterPane2.opened);\r\n } else {\r\n if (!this.hasFacets()) {\r\n filterPane2.close();\r\n } else if (!filterPane2.opened && !this.filterPane2Closed()) {\r\n filterPane2.open();\r\n } else if (filterPane2.opened && this.filterPane2Closed()) {\r\n filterPane2.close();\r\n }\r\n filterPane2.mode = 'side';\r\n filterPane2.disableClose = true;\r\n this.filterPane2HasBackdrop.set(false);\r\n }\r\n }\r\n }, 250);\r\n }\r\n\r\n /**\r\n * Initialize filter\r\n */\r\n private initializeFilter() {\r\n this.filterParams.channels = this.clipperService.activeChannels();\r\n this.channelsChanged(false);\r\n }\r\n\r\n /**\r\n * Update filter when channels changes\r\n * @param updateChannels: true to update channels\r\n */\r\n protected channelsChanged(updateChannels: boolean = true) {\r\n if (updateChannels) {\r\n this.clipperService.updateChannels(this.filterParams.channels);\r\n }\r\n const sectors: SectorInfo[] = [];\r\n const regions: NameValueItem<string>[] = [];\r\n const modules = this.getAllModules();\r\n this.filterParams.channels?.forEach(channel => {\r\n if (channel.value == ClipperChannel.SostanzeAlimentari && this.hasModule(ClipperModule.AllerteAlimentari)) {\r\n modules.push({ name: \"Allerte alimentari\", shortName: \"Allerte alimentari\", value: ClipperModule.AllerteAlimentari });\r\n }\r\n const channelSettings = this.clipperService.loginInfo?.channels?.find(x => x.channelId === channel.value);\r\n if (channelSettings) {\r\n channelSettings.sectors.filter(x => x.checked).forEach(x => {\r\n if (sectors.findIndex(y => y.value === x.value) === -1) {\r\n ClipperSectors.filter(y => y.group === 'S' && y.value === x.value).forEach(y => {\r\n sectors.push(y);\r\n });\r\n }\r\n });\r\n channelSettings.regions.filter(x => x.checked).forEach(x => {\r\n if (regions.findIndex(y => y.value === x.value) === -1) {\r\n ClipperRegions.filter(y => y.value === x.value).forEach(y => {\r\n regions.push(y);\r\n });\r\n }\r\n });\r\n }\r\n });\r\n this.modules.set(modules);\r\n this.sectors.set(sectors);\r\n this.regions.set(regions);\r\n if (this.filterParams.modules) {\r\n this.filterParams.modules = this.filterParams.modules.filter(x => this.modules().findIndex(y => y.value === x.value) !== -1) ?? [];\r\n }\r\n if (this.filterParams.sectors) {\r\n this.filterParams.sectors = this.filterParams.sectors.filter(x => this.sectors().findIndex(y => y.value === x.value) !== -1) ?? [];\r\n }\r\n if (this.filterParams.authors) {\r\n this.filterParams.authors = this.filterParams.authors.filter(x => this.regions().findIndex(y => y.value === x.value) !== -1) ?? [];\r\n }\r\n this.sectorsChanged();\r\n this.updateModulesUnreadItems();\r\n }\r\n\r\n /**\r\n * Update filter pane focus\r\n */\r\n private updateFilterPaneFocus() {\r\n setTimeout(() => {\r\n let focusableElement = this.filterByText();\r\n if (this.isLaws()) {\r\n focusableElement = this.filterByNumber();\r\n }\r\n focusableElement?.focus();\r\n }, 250);\r\n }\r\n\r\n /**\r\n * Loads the user's saved searches from the server and populates the filter selector.\r\n */\r\n protected loadFilters(): void {\r\n if (!this.clipperService.loggedIn()) return;\r\n this.clipperService.loadSearches(ClipperModule.Ricerca)\r\n .subscribe(\r\n r => {\r\n if (r.success) {\r\n const items: NameValueItem<ClipperUserSearch>[] = [];\r\n r.value.forEach(n => {\r\n items.push({ name: n.name ?? '', value: n });\r\n });\r\n this.filters.set(items);\r\n this.handleFilterPaneVisibility();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Saves the current filter parameters as a named search.\r\n * @param newFilter - When true, always prompts for a new filter name; otherwise updates the existing one. Defaults to false.\r\n */\r\n saveFilter(newFilter: boolean = false): void {\r\n this.loadFilter();\r\n if (newFilter || !this.filterParams.searchId) {\r\n const d = this.dialogService.prompt(\r\n \"Crea un nuovo filtro\",\r\n 0,\r\n \"Nome filtro\");\r\n d.componentInstance.done.subscribe((data) => {\r\n if (data?.value) {\r\n this.clipperService.saveSearch({\r\n module: ClipperModule.Ricerca,\r\n name: data.value,\r\n data: JSON.stringify(this.filterParams)\r\n }).subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n const newItem = { name: r.value.name ?? '', value: r.value };\r\n this.filters.update(items => [...items, newItem]);\r\n setTimeout(() => {\r\n this.filterSelector()?.select(newItem);\r\n }, 250);\r\n this.dialogService.toast(\"Operazione completata con successo.\");\r\n d.close();\r\n }\r\n });\r\n }\r\n });\r\n } else {\r\n this.clipperService.saveSearch({\r\n id: this.filterParams.searchId,\r\n data: JSON.stringify(this.filterParams)\r\n }).subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n this.filters.update(items => {\r\n const item = items.find(n => n.value.id === r.value.id);\r\n if (item) {\r\n item.value.data = r.value.data;\r\n }\r\n return [...items];\r\n });\r\n this.dialogService.toast(\"Operazione completata con successo.\");\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Prompts for confirmation and then deletes the currently active saved filter.\r\n */\r\n deleteFilter(): void {\r\n if (this.filterParams.searchId) {\r\n this.dialogService.confirm(\"Vuoi davvero eliminare il filtro in uso?\", \"Conferma\", \"Si, eliminalo\")\r\n .componentInstance.choosen\r\n .subscribe((data: DialogResult) => {\r\n if (data.result === 'ok') {\r\n if (this.filterParams.searchId) {\r\n this.clipperService.deleteSearch(this.filterParams.searchId)\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n this.filters.update(items => {\r\n const p = items.findIndex(x => x.value.id === this.filterParams.searchId);\r\n if (p !== -1) {\r\n items.splice(p, 1);\r\n }\r\n return [...items];\r\n });\r\n this.filterSelector()?.reset();\r\n this.filterParams.searchId = undefined;\r\n this.filterParams.searchName = undefined;\r\n this.dialogService.toast('Operazione completata con successo.');\r\n }\r\n });\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Applies a saved filter by deserializing its parameters into the current filter state.\r\n * @param item - The saved filter to apply, or undefined to clear the filter.\r\n */\r\n selectFilter(item: NameValueItem<ClipperUserSearch> | undefined): void {\r\n if (item && item.value.data) {\r\n this.filterSelector().select(item, false);\r\n const filter = JSON.parse(item.value.data);\r\n this.filterParams.searchId = item.value.id;\r\n this.filterParams.searchName = item.value.name;\r\n this.filterParams.modules = filter.modules;\r\n setTimeout(() => {\r\n this.filterParams.sectors = filter.sectors;\r\n this.filterParams.authors = filter.authors;\r\n this.filterParams.number = filter.number;\r\n this.filterParams.tags = filter.tags;\r\n this.filterParams.year = filter.year;\r\n if (filter.fromDate && filter.toDate) {\r\n this.interval.from = filter.fromDate;\r\n this.interval.to = filter.toDate;\r\n }\r\n this.filterParams.text = filter.text;\r\n this.filterParams.titleOnly = filter.titleOnly;\r\n this.filterParams.showCommentedDocumentsOnly = filter.showCommentedDocumentsOnly;\r\n this.filterParams.showNotAbrogatedDocumentsOnly = filter.showNotAbrogatedDocumentsOnly;\r\n this.filterParams.sourceNumber = filter.sourceNumber;\r\n this.filterParams.sourceYear = filter.sourceYear;\r\n if (filter.sourceFromDate && filter.sourceToDate) {\r\n this.sourceInterval.from = filter.sourceFromDate;\r\n this.sourceInterval.to = filter.sourceToDate;\r\n }\r\n this.filterParams.source = filter.source;\r\n this.filterParams.type = filter.type;\r\n this.filterParams.topic = filter.topic;\r\n this.filterParams.topics = filter.topics;\r\n this.filterParams.changeReason = filter.changeReason;\r\n this.filterParams.changedNumber = filter.changedNumber;\r\n this.filterParams.changedTitle = filter.changedTitle;\r\n this.filterParams.changedYear = filter.changedYear;\r\n this.filterParams.modifierNumber = filter.modifierNumber;\r\n this.filterParams.modifierTitle = filter.modifierTitle;\r\n this.filterParams.modifierYear = filter.modifierYear;\r\n // Show expansion panels\r\n if (this.filterParams.sourceNumber != undefined ||\r\n this.filterParams.sourceYear != undefined ||\r\n this.filterParams.source != undefined ||\r\n this.sourceInterval.from != undefined) {\r\n this.sourceExpansionPanel()?.open();\r\n }\r\n if (!this.isCoordination() && this.filterParams.sourceNumber != undefined ||\r\n this.filterParams.author != undefined ||\r\n this.filterParams.type != undefined) {\r\n this.otherOptionsExpansionPanel()?.open();\r\n } else if (this.isCoordination() && this.filterParams.changeReason != undefined) {\r\n this.otherOptionsExpansionPanel()?.open();\r\n }\r\n if (this.isCoordination() &&\r\n this.filterParams.modifierNumber != undefined ||\r\n this.filterParams.modifierYear != undefined ||\r\n this.filterParams.modifierTitle != undefined) {\r\n this.modifierExpansionPanel()?.open();\r\n }\r\n }, 250);\r\n } else {\r\n this.clearFilter();\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Clear current filter params\r\n */\r\n protected clearFilter() {\r\n ClipperSearchUtils.clear(this.filterParams);\r\n const module = this.modules().find(x => x.value === ClipperModule.NormativaVigente);\r\n if (module) {\r\n this.filterParams.modules = [module];\r\n }\r\n this.filterSelector()?.reset();\r\n this.filterParams.searchId = undefined;\r\n this.filterParams.searchName = undefined;\r\n this.interval.clear();\r\n this.sourceInterval.clear();\r\n }\r\n\r\n /**\r\n * Load selected filter\r\n */\r\n private loadFilter() {\r\n if (this.filterParams.year && this.filterParams.year > 0) {\r\n const year = this.filterParams.year;\r\n this.filterParams.fromDate = new Date(year, 0, 1, 2);\r\n this.filterParams.toDate = new Date(year, 11, 31, 2);\r\n } else {\r\n this.filterParams.year = undefined;\r\n }\r\n if (this.interval) {\r\n this.filterParams.fromDate = this.interval.from;\r\n this.filterParams.toDate = this.interval.to;\r\n }\r\n if (this.filterParams.sourceYear && this.filterParams.sourceYear > 0) {\r\n const year = this.filterParams.sourceYear;\r\n this.filterParams.sourceFromDate = new Date(year, 0, 1, 2);\r\n this.filterParams.sourceToDate = new Date(year, 11, 31, 2);\r\n } else {\r\n this.filterParams.sourceYear = undefined;\r\n }\r\n if (this.sourceInterval) {\r\n this.filterParams.sourceFromDate = this.sourceInterval.from;\r\n this.filterParams.sourceToDate = this.sourceInterval.to;\r\n }\r\n if (this.filterParams.text) {\r\n this.filterParams.text = ClipperSearchUtils.normalizeTextQuery(this.filterParams.text);\r\n }\r\n }\r\n\r\n /**\r\n * Apply current filter params\r\n */\r\n protected applyFilter() {\r\n if (this.canSearch()) {\r\n this.facets()?.reset();\r\n this.fetch(true);\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Manage sectors selection changes\r\n */\r\n protected sectorsChanged() {\r\n // Reset authors and types\r\n this.filterParams.authors = [];\r\n this.filterParams.type = undefined;\r\n let authors: NameValueItem<string>[] = [];\r\n const sectors =\r\n (this.filterParams.sectors?.length ?? 0) > 0\r\n ? this.filterParams.sectors\r\n : this.sectors();\r\n ClipperAuthors.forEach(n => {\r\n if (sectors &&\r\n sectors.length > 0 &&\r\n sectors.findIndex(x => x.value === n.sectorId) !== -1) {\r\n authors.push(n);\r\n }\r\n });\r\n if (authors.length == 0) {\r\n ClipperAuthors.forEach(n => {\r\n if (!n.sectorId) {\r\n authors.push(n);\r\n }\r\n });\r\n }\r\n let types: NameValueItem<string>[] = [];\r\n ClipperSectorTypes.forEach(n => {\r\n if (sectors &&\r\n sectors.length > 0 &&\r\n sectors.findIndex(x => x.value === n.parentValue) !== -1) {\r\n types.push(n);\r\n }\r\n });\r\n if (types.length == 0) {\r\n types = [...ClipperSectorTypes];\r\n }\r\n this.authors.set(authors.sort((a, b) => a.name.localeCompare(b.name)));\r\n this.types.set(types);\r\n }\r\n\r\n /**\r\n * Check if any search parameter has been set\r\n * @param params : the search params to check\r\n * @returns true if at least one parameters has been set\r\n */\r\n private isFiltering(params: ClipperSearchParams): boolean {\r\n return (params.sector !== null\r\n || (params.sectors?.length ?? 0) > 0\r\n || params.author !== null\r\n || (params.authors?.length ?? 0) > 0\r\n || params.topic !== null\r\n || (params.topics?.length ?? 0) > 0\r\n || params.taxonomy !== null\r\n || params.taxonomyPath !== null\r\n || params.taxonomyNode !== null\r\n || params.number !== null\r\n || params.fromDate !== null\r\n || params.toDate !== null\r\n || params.year !== null\r\n || params.sourceNumber !== null\r\n || params.source !== null\r\n || params.sourceFromDate !== null\r\n || params.sourceToDate !== null\r\n || params.sourceYear !== null\r\n || params.tag !== null\r\n || (params.tags?.length ?? 0) > 0\r\n || params.text !== null\r\n || params.titleOnly === true\r\n || params.type !== null\r\n || params.showUnreadDocumentsOnly === true\r\n || params.showCommentedDocumentsOnly === true\r\n || params.changeReason !== null\r\n || params.changedNumber !== null\r\n || params.changedYear !== null\r\n || params.changedTitle !== null\r\n || params.modifierNumber !== null\r\n || params.modifierYear !== null\r\n || params.modifierTitle !== null\r\n || params.model !== null\r\n || (params.models?.length ?? 0) > 0\r\n || params.module !== null\r\n || (params.modules?.length ?? 0) > 0\r\n || this.interval.from != null\r\n || this.interval.to != null\r\n || this.sourceInterval.from != null\r\n || this.sourceInterval.to != null);\r\n }\r\n\r\n\r\n /**\r\n * Checkif a single module is selected\r\n * @param module : the module to check\r\n * @returns : true if the specified module is the only one selected\r\n */\r\n private isSingleModule(module: ClipperModule): boolean {\r\n return (this.filterParams.modules?.length === 1 && this.filterParams.modules?.findIndex(x => x.value === module) !== -1);\r\n }\r\n\r\n /**\r\n * Update modules unread items\r\n */\r\n private updateModulesUnreadItems() {\r\n this.modules().forEach(module => {\r\n let totalUnread = 0;\r\n if (module.value === ClipperModule.News) {\r\n totalUnread = this.clipperService.dashboard.getUnreadItems(module.value, ClipperModel.News);\r\n } else if (module.value === ClipperModule.Approfondimenti) {\r\n totalUnread = this.clipperService.dashboard.getUnreadItems(module.value, ClipperModel.Articoli);\r\n } else if (module.value === ClipperModule.Giurisprudenza) {\r\n totalUnread = this.clipperService.dashboard.getUnreadItems(module.value, ClipperModel.Juris);\r\n } else if (module.value === ClipperModule.GiurisprudenzaRecente) {\r\n totalUnread = this.clipperService.dashboard.getUnreadItems(ClipperModule.Giurisprudenza, null);\r\n } else {\r\n totalUnread = this.clipperService.dashboard.getUnreadItems(module.value, null);\r\n }\r\n if (totalUnread > 0) {\r\n module.bag = totalUnread.toString();\r\n module.bagInfo = totalUnread + ' non letti';\r\n } else {\r\n module.bag = undefined;\r\n module.bagInfo = undefined;\r\n }\r\n });\r\n this.modules.update(values => [...values]);\r\n }\r\n\r\n /**\r\n * Checks if a module is supported\r\n * @param module : the module to check\r\n * @returns true if the module is supported\r\n */\r\n private hasModule(module: ClipperModule) {\r\n return (this.selectableModules().length === 0 || this.selectableModules().findIndex(x => x === module) !== -1) &&\r\n this.modules().findIndex(x => x.value === module) !== -1;\r\n }\r\n\r\n /**\r\n * Manage module selection changes \r\n */\r\n protected modulesChanged() {\r\n const hasModules = (this.filterParams.modules?.length ?? 0) > 0;\r\n // Update models\r\n if (!hasModules) {\r\n this.filterParams.models = [];\r\n // Update sectors\r\n this.sectors.set(ClipperSectors.filter(n => n.group === 'S').map(n => {\r\n return { name: n.shortName ?? n.name, value: n.value };\r\n }));\r\n } else {\r\n this.filterParams.models = ClipperSearchUtils.getModulesModels(this.filterParams.modules);\r\n // Update sectors\r\n if (this.isSingleModule(ClipperModule.ScadenzeESegnalazioni)) {\r\n this.sectors.set([]);\r\n } else if (this.isSingleModule(ClipperModule.GiurisprudenzaRecente)) {\r\n this.sectors.set(ClipperSectors.filter(n => n.group === 'S' && n.value[0] === 'G').map(n => {\r\n return { name: n.shortName ?? n.name, value: n.value };\r\n }));\r\n } else if (this.isLaws()) {\r\n this.sectors.set(ClipperSectors.filter(n => n.group === 'S').map(n => {\r\n return { name: n.shortName ?? n.name, value: n.value };\r\n }));\r\n }\r\n }\r\n this.selection?.clear();\r\n this.sectorsChanged();\r\n this.updateFilterPaneFocus();\r\n }\r\n\r\n /**\r\n * Checks the current module selection against a list of expected modules.\r\n * @param modules - The modules to check for.\r\n * @param mode - The check mode: 1) exactly these elements, 2) all of these elements, 3) any of these elements.\r\n * @returns True if the check passes.\r\n */\r\n private checkModules(modules: ClipperModule[], mode: number = 1): boolean {\r\n const currentModules = this.filterParams.modules;\r\n let ok: boolean = false;\r\n if (mode === 1) {\r\n // All and only the elements specified\r\n currentModules?.forEach(n => {\r\n ok = (modules.findIndex(x => x === n.value) ?? -1) !== -1;\r\n if (!ok) {\r\n return;\r\n }\r\n });\r\n return ok && modules.length >= (currentModules?.length ?? 0);\r\n } else if (mode === 2) {\r\n // All the elements specified\r\n modules.forEach(n => {\r\n ok = (currentModules?.findIndex(x => x.value === n) ?? -1) !== -1;\r\n if (!ok) {\r\n return;\r\n }\r\n });\r\n } else if (mode === 3) {\r\n // Any of the specified elements \r\n modules.forEach(n => {\r\n ok = (currentModules?.findIndex(x => x.value === n) ?? -1) !== -1;\r\n if (ok) {\r\n return;\r\n }\r\n });\r\n }\r\n return ok;\r\n }\r\n\r\n /**\r\n * Builds the effective query parameters for the next search request.\r\n * @param newSearch - When true, resets pagination and triggers facet loading. Defaults to false.\r\n * @returns The resolved {@link ClipperSearchParams} ready to be sent to the API.\r\n */\r\n private prepareFetch(newSearch: boolean = false): ClipperSearchParams {\r\n if (this.interval) {\r\n this.filterParams.fromDate = this.interval.fromAsDate;\r\n this.filterParams.toDate = this.interval.toAsDate;\r\n }\r\n if (this.sourceInterval) {\r\n this.filterParams.sourceFromDate = this.sourceInterval.fromAsDate;\r\n this.filterParams.sourceToDate = this.sourceInterval.toAsDate;\r\n }\r\n let newParams: ClipperSearchParams = new ClipperSearchParams();\r\n if ((this.filterParams.modules?.length ?? 0) > 0) {\r\n newParams.first = this.filterParams.first;\r\n newParams.channels = this.filterParams.channels\r\n newParams.count = this.filterParams.count;\r\n newParams.sortMode = this.filterParams.sortMode;\r\n if (this.isCoordination()) {\r\n newParams.models = [ClipperModel.Coordinamento];\r\n newParams.authors = this.filterParams.authors ?? [];\r\n newParams.sectors = this.filterParams.sectors ?? [];\r\n newParams.fromDate = this.filterParams.fromDate;\r\n newParams.toDate = this.filterParams.toDate;\r\n newParams.changeReason = this.filterParams.changeReason;\r\n newParams.changedNumber = this.filterParams.changedNumber;\r\n newParams.changedYear = this.filterParams.changedYear;\r\n newParams.changedTitle = this.filterParams.changedTitle;\r\n newParams.modifierNumber = this.filterParams.modifierNumber;\r\n newParams.modifierYear = this.filterParams.modifierYear;\r\n newParams.modifierTitle = this.filterParams.modifierTitle;\r\n } else {\r\n if (this.filterParams.text) {\r\n newParams.text = ClipperSearchUtils.normalizeTextQuery2(this.filterParams.text);\r\n }\r\n newParams.titleOnly = this.filterParams.titleOnly;\r\n newParams.fromDate = this.filterParams.fromDate;\r\n newParams.toDate = this.filterParams.toDate;\r\n newParams.models = ClipperSearchUtils.getModulesModels(this.filterParams.modules);\r\n if (this.checkModules([\r\n ClipperModule.News,\r\n ClipperModule.GazzetteBollettiniEFontiDiverse,\r\n ClipperModule.GiurisprudenzaRecente,\r\n ClipperModule.QuesitiECasiRisolti,\r\n ClipperModule.AllerteAlimentari], 1)) {\r\n newParams.showUnreadDocumentsOnly = this.filterParams.showUnreadDocumentsOnly;\r\n }\r\n if (this.checkModules([\r\n ClipperModule.NormativaVigente,\r\n ClipperModule.GazzetteBollettiniEFontiDiverse,\r\n ClipperModule.GiurisprudenzaRecente], 1)) {\r\n newParams.showCommentedDocumentsOnly = this.filterParams.showCommentedDocumentsOnly;\r\n newParams.showNotAbrogatedDocumentsOnly = this.filterParams.showNotAbrogatedDocumentsOnly;\r\n newParams.sectors = this.filterParams.sectors;\r\n newParams.number = this.filterParams.number;\r\n newParams.year = this.filterParams.year;\r\n newParams.topics = this.filterParams.topics;\r\n newParams.authors = this.filterParams.authors ?? [];\r\n if (newParams.authors.length == 0 && this.filterParams.author) {\r\n newParams.authors = [{ name: '?', value: this.filterParams.author }];\r\n }\r\n newParams.types = this.filterParams.types ?? [];\r\n if (newParams.types.length == 0 && this.filterParams.type) {\r\n newParams.types = [{ name: '?', value: this.filterParams.type }];\r\n }\r\n newParams.source = this.filterParams.source;\r\n newParams.sourceNumber = this.filterParams.sourceNumber;\r\n newParams.sourceYear = this.filterParams.sourceYear;\r\n newParams.sourceFromDate = this.filterParams.sourceFromDate;\r\n newParams.sourceToDate = this.filterParams.sourceToDate;\r\n }\r\n if (this.checkModules([ClipperModule.News], 1)) {\r\n newParams.tags = this.filterParams.tags;\r\n }\r\n }\r\n } else {\r\n newParams = SystemUtils.clone(this.filterParams) as ClipperSearchParams;\r\n newParams.channels = this.filterParams.channels\r\n newParams.authors = this.filterParams.authors ?? [];\r\n if (newParams.authors.length == 0 && this.filterParams.author) {\r\n newParams.authors = [{ name: '?', value: this.filterParams.author }];\r\n }\r\n newParams.types = this.filterParams.types ?? [];\r\n if (newParams.types.length == 0 && this.filterParams.type) {\r\n newParams.types = [{ name: '?', value: this.filterParams.type }];\r\n }\r\n if (newParams.text) {\r\n newParams.text = ClipperSearchUtils.normalizeTextQuery2(newParams.text);\r\n }\r\n newParams.titleOnly = this.filterParams.titleOnly;\r\n }\r\n // Setup sort options\r\n this.sortOptions.set(ClipperUtils.getClipperAvailableSortOptions(this.filterParams.modules, newParams));\r\n if (newParams.text && newSearch) {\r\n this.sortMode.set(this.sortOptions()[0]);\r\n this.changeDetector.markForCheck();\r\n }\r\n if (!this.sortMode() || this.sortOptions().findIndex((x: NameValueItem<ClipperSort>) => x.value === this.sortMode()?.value) === -1) {\r\n this.sortMode.set(this.sortOptions()[0]);\r\n }\r\n newParams.sortMode = this.sortMode()?.value;\r\n // Apply facets\r\n if (this.snapshot?.facets?.fromDate) {\r\n newParams.fromDate = this.snapshot.facets?.fromDate;\r\n newParams.toDate = this.snapshot.facets?.toDate;\r\n newParams.year = this.snapshot.facets?.fromDate.getFullYear();\r\n }\r\n if (this.snapshot?.facets?.sector) {\r\n if (this.snapshot?.facets?.sector) {\r\n const model: ClipperModel = parseInt(this.snapshot.facets?.sector) as ClipperModel;\r\n if (model > 0) {\r\n newParams.models = [model];\r\n } else\r\n newParams.sectors = [{ value: this.snapshot.facets?.sector ?? \"\", name: \"\" }];\r\n } else {\r\n if ((newParams.sectors?.length ?? 0) == 0)\r\n newParams.models = ClipperSearchUtils.getModulesModels(this.filterParams.modules);\r\n }\r\n }\r\n if (this.snapshot?.facets?.type) {\r\n newParams.types = [{ value: this.snapshot.facets.type ?? \"\", name: \"\" }];\r\n }\r\n if (this.snapshot?.facets?.author) {\r\n newParams.authors = [{ value: this.snapshot.facets?.author ?? \"\", name: \"\" }];\r\n }\r\n\r\n newParams.version = 7;\r\n newParams.count = 15;\r\n if (newSearch) {\r\n newParams.first = 0;\r\n this.filterParams.first = 0;\r\n }\r\n\r\n // Compute a filter description\r\n this.updateFilterDescription();\r\n\r\n return newParams;\r\n }\r\n\r\n /**\r\n * Update filter description\r\n */\r\n private updateFilterDescription() {\r\n let filterDescription = \"\";\r\n this.filterParams.modules?.forEach((n, i) => {\r\n if (i > 0) filterDescription += \", \";\r\n filterDescription += n.shortName;\r\n });\r\n if ((this.filterParams.sectors?.length ?? 0) > 0) {\r\n filterDescription += \" > \";\r\n this.filterParams.sectors?.forEach((n, i) => {\r\n if (i > 0) filterDescription += \", \";\r\n filterDescription += n.name;\r\n });\r\n }\r\n if ((this.filterParams.authors?.length ?? 0) > 0) {\r\n filterDescription += \" > \";\r\n this.filterParams.authors?.forEach((n, i) => {\r\n if (i > 0) filterDescription += \", \";\r\n filterDescription += n.name;\r\n });\r\n }\r\n this.filterDescription.set(filterDescription);\r\n }\r\n\r\n /**\r\n * Fetches and applies search facets for the current result set.\r\n * @param params - The search parameters used to query facets.\r\n */\r\n protected fetchFacets(params: ClipperSearchParams): void {\r\n if (!this.clipperService.loggedIn()) return;\r\n this.filterBusy.set(true);\r\n this.clipperService.queryFacets(params)\r\n .subscribe({\r\n next: r => {\r\n if (r.success) {\r\n let hasFacets = (r.value.facets?.length ?? 0) > 0;\r\n if (r.value.facets) {\r\n this.facets()?.update(r.value.facets, r.value.interval);\r\n if (this.facets && this.snapshot) {\r\n hasFacets = this.facets().hasFacets();\r\n this.snapshot.facets = this.facets().save();\r\n this.snapshot.facets.hasTooManyResults = (this.snapshot?.total ?? 0) >= 1000;\r\n }\r\n }\r\n this.hasFacets.set(hasFacets);\r\n this.handleFilterPaneVisibility();\r\n }\r\n },\r\n complete: () => {\r\n this.filterBusy.set(false);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Hide facets\r\n */\r\n protected hideFacets() {\r\n this.hasFacets.set(false);\r\n this.facets()?.reset();\r\n this.filterPane2().close();\r\n this.filterPane2Closed.set(false);\r\n }\r\n\r\n /**\r\n * Executes the search query and updates the result snapshot.\r\n * @param newSearch - When true, resets pagination and reloads facets. Defaults to false.\r\n */\r\n protected fetch(newSearch: boolean = false): void {\r\n const searchParams = this.prepareFetch(newSearch);\r\n this.dialogService.busy('Ricerca in corso...');\r\n this.clipperService.query(searchParams)\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) this.dialogService.error(r.message);\r\n else {\r\n // Handle data\r\n this.prepareResults(r.value, newSearch);\r\n // Handle facets\r\n if (this.snapshot?.total ?? 0 > 0) {\r\n if (newSearch) {\r\n this.fetchFacets(searchParams);\r\n }\r\n } else {\r\n this.hideFacets();\r\n }\r\n\r\n if (newSearch) {\r\n if (this.paginator()) {\r\n this.paginator().pageIndex = 0;\r\n }\r\n }\r\n\r\n this.scroll(0);\r\n this.handleFilterPaneVisibility();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Navigate to a new result page.\r\n * @param e - The paginator {@link PageEvent} containing the new page index and size.\r\n */\r\n protected fetchMore(e: PageEvent): void {\r\n let first = e.pageIndex * (this.filterParams.count ?? 15);\r\n this.filterParams.first = first;\r\n this.fetch();\r\n }\r\n\r\n\r\n /**\r\n * Change the current sort mode and refresh results.\r\n * @param newSort - The new sort option to apply.\r\n */\r\n protected sort(newSort?: NameValueItem<ClipperSort>): void {\r\n if (newSort) {\r\n this.sortMode.set(newSort);\r\n this.fetch();\r\n }\r\n }\r\n\r\n /**\r\n * Open the free-text search help dialog.\r\n */\r\n protected help(): void {\r\n import('../search-free-text-help/search-free-text-help.component').then(({ ClipperSearchFreeTextHelpComponent }) => {\r\n this.dialogService.open(ClipperSearchFreeTextHelpComponent, {\r\n ariaLabel: 'informazioni ricerca',\r\n autoFocus: false,\r\n restoreFocus: true,\r\n disableClose: false,\r\n minWidth: '375px',\r\n maxWidth: '800px',\r\n width: '99%',\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Open the query-builder dialog to compose a free-text search expression.\r\n */\r\n protected compose(): void {\r\n import('../search-free-text-query-builder/search-free-text-query-builder.component').then(({ ClipperSearchFreeTextQueryBuilderComponent }) => {\r\n const d = this.dialogService.open(ClipperSearchFreeTextQueryBuilderComponent, {\r\n ariaLabel: 'costruisci ricerca',\r\n autoFocus: false,\r\n restoreFocus: true,\r\n disableClose: false,\r\n minWidth: '375px',\r\n maxWidth: '500px',\r\n width: '99%',\r\n });\r\n d.componentInstance.done.subscribe((result: SearchFreeTextQueryParams) => {\r\n this.filterParams.text = result.query;\r\n this.changeDetector.markForCheck();\r\n d.close();\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Open the topic-selection dialog and append the chosen topics to the current filter.\r\n */\r\n protected addTopic(): void {\r\n this.dialogService\r\n .selectTree(\r\n this.topics,\r\n 'Seleziona un argomento',\r\n undefined,\r\n (this.filterParams.topics && this.filterParams.topics.length > 0)\r\n ? this.filterParams.topics[this.filterParams.topics.length - 1].name\r\n : undefined\r\n )\r\n .componentInstance.done.subscribe(r => {\r\n if (!this.filterParams.topics) {\r\n this.filterParams.topics = [];\r\n }\r\n r.selectedItems.forEach(item => {\r\n this.filterParams.topics?.push({ name: item.bag.name, value: item.bag.id });\r\n this.changeDetector.markForCheck();\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Remove a topic from the current filter.\r\n * @param item - The topic item to remove.\r\n */\r\n protected deleteTopic(item: NameValueItem<string>): void {\r\n const p = this.filterParams.topics?.findIndex(x => x.value === item.value) ?? -1;\r\n if (p !== -1) {\r\n this.filterParams.topics?.splice(p, 1);\r\n this.changeDetector.markForCheck();\r\n }\r\n }\r\n\r\n /**\r\n * Remove all topics from the current filter.\r\n */\r\n protected clearTopics(): void {\r\n this.filterParams.topics = []\r\n this.changeDetector.markForCheck();\r\n }\r\n\r\n}\r\n\r\n\r\n","<mat-drawer-container [hasBackdrop]=\"filterPaneHasBackdrop()\" class=\"fill\">\r\n <mat-drawer #filterPane class=\"drawer\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"78px\" class=\"title-container\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"start center\" fxFill>\r\n <div class=\"title\">Filtro</div>\r\n <div fxFlex=\"*\" fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" mat-icon-button (click)=\"saveFilter(true)\"\r\n matTooltip=\"Crea una nuovo filtro con i parametri attuali \"><mat-icon>add</mat-icon></button>\r\n <button fxFlexAlign=\"center\" mat-icon-button (click)=\"toggleFilterPane()\"\r\n matTooltip=\"Nascondi\"><mat-icon>left_panel_close</mat-icon></button>\r\n </div>\r\n </div>\r\n </div>\r\n @if(hasFilters()) {\r\n <div style=\"padding:10px 20px\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlex=\"*\">\r\n <button-selector #filterSelector [options]=\"filters()\" label=\"Seleziona un filtro salvato\"\r\n labelSelected=\"Filtro in uso:\" fxFlexAlign=\"center\" (selected)=\"selectFilter($event)\"\r\n [matTooltip]=\"filterParams.searchName ?? ''\"></button-selector>\r\n </div>\r\n @if(filterParams.searchId) {\r\n <div fxFlex=\"40px\">\r\n <button fxFlexAlign=\"center\" mat-icon-button (click)=\"deleteFilter()\"\r\n matTooltip=\"Elimina il filtro in uso\"><mat-icon>delete</mat-icon></button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n <div fxFlex=\"*\" class=\"content scroll-hidden\" style=\"padding-bottom: 10px;\">\r\n <div class=\"scroll-auto\" style=\"padding: 0 10px;\">\r\n <form name=\"form\" #f=\"ngForm\" (keyup.Enter)=\"applyFilter()\" novalidate>\r\n <mat-accordion multi displayMode=\"flat\">\r\n <mat-expansion-panel expanded class=\"accordion-panel mat-elevation-z0 \">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Cerca in..\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <chips-selector #moduleSelector [(ngModel)]=\"filterParams.modules\" [collapseAt]=\"599\" [multiple]=\"true\"\r\n label=\"Sezioni\" name=\"modules\" [options]=\"filteredModules()\" (changed)=\"modulesChanged()\">\r\n </chips-selector>\r\n </mat-expansion-panel>\r\n\r\n @if((hasTags() || hasTopics()) && !isCoordination()) {\r\n <mat-expansion-panel class=\"accordion-panel mat-elevation-z0\">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Argomenti\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n @if(hasTags()) {\r\n <chips-selector [collapseAt]=\"599\" [(ngModel)]=\"filterParams.tags\" [multiple]=\"true\" name=\"tags\"\r\n label=\"Argomenti\" [options]=\"tags()\"></chips-selector>\r\n }\r\n @if(hasTopics()) {\r\n @if ((filterParams.topics?.length ?? 0) > 0) {\r\n <mat-chip-grid #topics [(ngModel)]=\"filterParams.topics\" name=\"topics\" style=\"padding-bottom: 5px;\">\r\n @for (o of filterParams.topics; track $index) {\r\n <mat-chip-row [value]=\"o\" (removed)=\"deleteTopic(o)\">\r\n {{o.name}}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button></mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n <input style=\"display: none;\" [matChipInputFor]=\"topics\" />\r\n }\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\">\r\n <button mat-button type=\"button\" (click)=\"addTopic()\"><mat-icon>add</mat-icon> Aggiungi\r\n argomento</button>\r\n @if ((filterParams.topics?.length ?? 0) > 0) {\r\n <button mat-button type=\"button\" (click)=\"clearTopics()\"><mat-icon>delete</mat-icon> Azzera</button>\r\n }\r\n </div>\r\n }\r\n </mat-expansion-panel>\r\n }\r\n @if(hasSectors()) {\r\n <mat-expansion-panel class=\"accordion-panel mat-elevation-z0 \">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Settori\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <chips-selector [collapseAt]=\"599\" [(ngModel)]=\"filterParams.sectors\" [multiple]=\"true\" name=\"sectors\"\r\n label=\"Settori\" [options]=\"sectors()\" (changed)=\"sectorsChanged()\" />\r\n @if(hasRegions())\r\n {\r\n <mat-divider style=\"padding-top: 8px; margin-top:8px\"></mat-divider>\r\n <chips-selector [(ngModel)]=\"filterParams.authors\" [multiple]=\"true\" name=\"authors\" mode=\"collapsed\"\r\n label=\"Tutte le regioni\" [options]=\"regions()\" />\r\n }\r\n </mat-expansion-panel>\r\n }\r\n @if(!isCoordination()) {\r\n <mat-expansion-panel expanded class=\"accordion-panel mat-elevation-z0 \">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Documento\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div fxLayout=\"column\">\r\n @if(isLaws()) {\r\n <div fxLayout=\"row wrap\" fxLayoutAlign=\"space-between center\" fxFill>\r\n <mat-form-field fxFlex=\"59\" fxFlex.xs=\"49\">\r\n <mat-label>Numero</mat-label>\r\n <input matInput maxlength=\"10\" [(ngModel)]=\"filterParams.number\" name=\"number\"\r\n #filterByNumber=\"matInput\" />\r\n @if (filterParams.number) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.number = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxFlex=\"39\" fxFlex.xs=\"49\">\r\n <mat-label>Anno</mat-label>\r\n <input type=\"number\" min=\"1750\" matInput maxlength=\"4\" [(ngModel)]=\"filterParams.year\"\r\n name=\"year\" />\r\n @if (filterParams.year) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.year = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n <mat-form-field>\r\n <mat-label>Intervallo di pubblicazione</mat-label>\r\n <mat-date-range-input [rangePicker]=\"picker1\">\r\n <input matStartDate [(ngModel)]=\"interval.from\" [dateIntervalChange]=\"interval\"\r\n #rangeFrom1=\"ngModel\" name=\"rangeFrom1\" placeholder=\"Da data\">\r\n <input matEndDate [(ngModel)]=\"interval.to\" [dateIntervalChange]=\"interval\" [end]=\"true\"\r\n #rangeTo1=\"ngModel\" name=\"rangeTo1\" placeholder=\"A data\">\r\n </mat-date-range-input>\r\n @if (interval.from || interval.to) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"interval.clear()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-datepicker-toggle matSuffix [for]=\"picker1\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker1></mat-date-range-picker>\r\n @if (rangeFrom1.invalid || rangeTo1.invalid) {\r\n <mat-error>Intervallo non valido.</mat-error>\r\n }\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>Testo</mat-label>\r\n <input matInput maxlength=\"200\" [(ngModel)]=\"filterParams.text\" name=\"text\"\r\n #filterByText=\"matInput\" />\r\n @if (filterParams.text) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.text = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix matTooltip=\"Opzioni\"\r\n aria-label=\"Opzioni\"\r\n [matMenuTriggerFor]=\"filterPaneOptionsMenu\"><mat-icon>more_vert</mat-icon></button>\r\n </mat-form-field>\r\n <div>\r\n @if(filterParams.text) {\r\n <div style=\"padding-bottom:10px\">\r\n <mat-slide-toggle [(ngModel)]=\"filterParams.titleOnly\" name=\"titleOnly\">Cerca solo nel\r\n titolo</mat-slide-toggle>\r\n </div>\r\n }\r\n @if(isLaws(false)) {\r\n <div style=\"padding-bottom:10px\">\r\n <mat-slide-toggle [(ngModel)]=\"filterParams.showNotAbrogatedDocumentsOnly\"\r\n name=\"showNotAbrogatedDocumentsOnly\">Mostra solo elementi non abrogati</mat-slide-toggle>\r\n </div>\r\n <div style=\"padding-bottom:10px\">\r\n <mat-slide-toggle [(ngModel)]=\"filterParams.showCommentedDocumentsOnly\"\r\n name=\"showCommentedDocumentsOnly\">Mostra solo elementi con commenti</mat-slide-toggle>\r\n </div>\r\n }\r\n @if(isReadable()) {\r\n <div style=\"padding-bottom:10px\">\r\n <mat-slide-toggle [(ngModel)]=\"filterParams.showUnreadDocumentsOnly\"\r\n name=\"showUnreadDocumentsOnly\">Mostra solo elementi non letti</mat-slide-toggle>\r\n </div>\r\n }\r\n\r\n </div>\r\n </div>\r\n </mat-expansion-panel>\r\n @if(isLaws(false)) {\r\n <mat-expansion-panel #sourceExpansionPanel class=\"accordion-panel mat-elevation-z0 \">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Fonte\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div fxLayout=\"column\">\r\n <div fxLayout=\"row wrap\" fxLayoutAlign=\"space-between center\" fxFill>\r\n <mat-form-field fxFlex=\"59\" fxFlex.xs=\"100\">\r\n <mat-label>Numero</mat-label>\r\n <input matInput maxlength=\"10\" [(ngModel)]=\"filterParams.sourceNumber\" name=\"sourceNumber\" />\r\n @if (filterParams.sourceNumber) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.sourceNumber = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxHide.xs fxFlex=\"39\" fxFlex.xs=\"100\">\r\n <mat-label>Anno</mat-label>\r\n <input type=\"number\" min=\"1750\" matInput maxlength=\"4\" [(ngModel)]=\"filterParams.sourceYear\"\r\n name=\"sourceYear\" />\r\n @if (filterParams.sourceYear) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.sourceYear = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <mat-form-field>\r\n <mat-label>Intervallo di pubblicazione</mat-label>\r\n <mat-date-range-input [rangePicker]=\"picker2\">\r\n <input matStartDate [(ngModel)]=\"sourceInterval.from\" [dateIntervalChange]=\"sourceInterval\"\r\n #rangeFrom2=\"ngModel\" name=\"rangeFrom2\" placeholder=\"Da data\">\r\n <input matEndDate [(ngModel)]=\"sourceInterval.to\" [dateIntervalChange]=\"sourceInterval\"\r\n [end]=\"true\" #rangeTo2=\"ngModel\" name=\"rangeTo2\" placeholder=\"A data\">\r\n </mat-date-range-input>\r\n @if (sourceInterval.from || sourceInterval.to) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"sourceInterval.clear()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-datepicker-toggle matSuffix [for]=\"picker2\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker2></mat-date-range-picker>\r\n @if (rangeFrom2.invalid || rangeTo2.invalid) {\r\n <mat-error>Intervallo non valido.</mat-error>\r\n }\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>Tipo</mat-label>\r\n <mat-select [(ngModel)]=\"filterParams.source\" name=\"source\">\r\n @for (s of sources(); track $index) {\r\n <mat-option [value]=\"s.value\" [matTooltip]=\"s.name\">\r\n {{s.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n </div>\r\n </mat-expansion-panel>\r\n <mat-expansion-panel #otherOptionsExpansionPanel class=\"accordion-panel mat-elevation-z0\">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Altre opzioni\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div fxLayout=\"column\">\r\n @if(authors().length > 0 && !hasRegions()) {\r\n <mat-form-field>\r\n <mat-label>Autore</mat-label>\r\n <mat-select [(ngModel)]=\"filterParams.author\" name=\"author\">\r\n @for (a of authors(); track $index) {\r\n <mat-option [value]=\"a.value\" [matTooltip]=\"a.name\">\r\n {{a.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n <mat-form-field>\r\n <mat-label>Tipo documento</mat-label>\r\n <mat-select [(ngModel)]=\"filterParams.type\" name=\"type\">\r\n @for (t of types(); track $index) {\r\n <mat-option [value]=\"t.value\" [matTooltip]=\"t.name\">\r\n {{t.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n </mat-expansion-panel>\r\n }\r\n } @else {\r\n <mat-expansion-panel expanded class=\"accordion-panel mat-elevation-z0 \">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Periodo\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <mat-form-field style=\"width:100%\">\r\n <mat-label>Intervallo di pubblicazione</mat-label>\r\n <mat-date-range-input [rangePicker]=\"picker1\">\r\n <input matStartDate [(ngModel)]=\"interval.from\" [dateIntervalChange]=\"interval\"\r\n #rangeFrom1=\"ngModel\" name=\"rangeFrom1\" placeholder=\"Da data\">\r\n <input matEndDate [(ngModel)]=\"interval.to\" [dateIntervalChange]=\"interval\" [end]=\"true\"\r\n #rangeTo1=\"ngModel\" name=\"rangeTo1\" placeholder=\"A data\">\r\n </mat-date-range-input>\r\n @if (interval.from || interval.to) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"interval.clear()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-datepicker-toggle matSuffix [for]=\"picker1\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker1></mat-date-range-picker>\r\n @if (rangeFrom1.invalid || rangeTo1.invalid) {\r\n <mat-error>Intervallo non valido.</mat-error>\r\n }\r\n </mat-form-field>\r\n @if(isReadable()) {\r\n <div style=\"padding-bottom:10px\">\r\n <mat-slide-toggle [(ngModel)]=\"filterParams.showUnreadDocumentsOnly\"\r\n name=\"showUnreadDocumentsOnly\">Mostra solo elementi non letti</mat-slide-toggle>\r\n </div>\r\n }\r\n </mat-expansion-panel>\r\n <mat-expansion-panel expanded class=\"accordion-panel mat-elevation-z0 \">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Documento modificato\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div fxLayout=\"column\">\r\n <div fxLayout=\"row wrap\" fxLayoutAlign=\"space-between center\" fxFill>\r\n <mat-form-field fxFlex=\"59\" fxFlex.xs=\"100\">\r\n <mat-label>Numero</mat-label>\r\n <input matInput maxlength=\"10\" [(ngModel)]=\"filterParams.changedNumber\" name=\"changedNumber\"\r\n #filterByChangeNumber=\"matInput\" />\r\n @if (filterParams.changedNumber) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.changedNumber = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxHide.xs fxFlex=\"39\" fxFlex.xs=\"100\">\r\n <mat-label>Anno</mat-label>\r\n <input type=\"number\" min=\"1750\" matInput maxlength=\"4\" [(ngModel)]=\"filterParams.changedYear\"\r\n name=\"changedYear\" />\r\n @if (filterParams.changedYear) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.changedYear = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <mat-form-field>\r\n <mat-label>Titolo</mat-label>\r\n <input matInput maxlength=\"200\" [(ngModel)]=\"filterParams.changedTitle\" name=\"changedTitle\" />\r\n @if (filterParams.changedTitle) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.changedTitle = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </mat-expansion-panel>\r\n <mat-expansion-panel #modifierOptionsExpansionPanel class=\"accordion-panel mat-elevation-z0 \">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Documento modificante\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div fxLayout=\"column\">\r\n <div fxLayout=\"row wrap\" fxLayoutAlign=\"space-between center\" fxFill>\r\n <mat-form-field fxFlex=\"59\" fxFlex.xs=\"100\">\r\n <mat-label>Numero</mat-label>\r\n <input matInput maxlength=\"10\" [(ngModel)]=\"filterParams.modifierNumber\" name=\"modifierNumber\" />\r\n @if (filterParams.changedNumber) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.modifierNumber = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxHide.xs fxFlex=\"39\" fxFlex.xs=\"100\">\r\n <mat-label>Anno</mat-label>\r\n <input type=\"number\" min=\"1750\" matInput maxlength=\"4\" [(ngModel)]=\"filterParams.modifierYear\"\r\n name=\"modifierYear\" />\r\n @if (filterParams.modifierYear) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.modifierYear = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <mat-form-field>\r\n <mat-label>Titolo</mat-label>\r\n <input matInput maxlength=\"200\" [(ngModel)]=\"filterParams.modifierTitle\" name=\"modifierTitle\" />\r\n @if (filterParams.modifierTitle) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"filterParams.modifierTitle = undefined\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </mat-expansion-panel>\r\n <mat-expansion-panel #otherOptionsExpansionPanel class=\"accordion-panel mat-elevation-z0\">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Altre opzioni\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div fxLayout=\"column\">\r\n <mat-form-field>\r\n <mat-label>Motivo</mat-label>\r\n <mat-select [(ngModel)]=\"filterParams.changeReason\" name=\"changeReason\">\r\n @for (r of reasons(); track $index) {\r\n <mat-option [value]=\"r.value\" [matTooltip]=\"r.name\">\r\n {{r.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </mat-expansion-panel>\r\n }\r\n </mat-accordion>\r\n </form>\r\n </div>\r\n </div>\r\n @if(showChannels()) {\r\n <div style=\"padding:10px\">\r\n <div fxLayout=\"column\">\r\n <mat-expansion-panel class=\"accordion-panel mat-elevation-z0\" style=\"margin-bottom: 10px;\">\r\n <mat-expansion-panel-header class=\"accordion-header\">\r\n <mat-panel-title>\r\n Canali\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n @for (c of clipperService.availableChannels(); track $index) {\r\n <div class=\"channel-box\" [class.channel-disabled]=\"!c.active || c.disabled\" [matTooltip]=\"c.name\">\r\n <span class=\"label\">{{c.header}}</span>\r\n </div>\r\n }\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n <chips-selector [collapseAt]=\"599\" [(ngModel)]=\"filterParams.channels\" [multiple]=\"true\" name=\"channels\"\r\n label=\"Canali\" [options]=\"clipperService.availableChannels()\"\r\n (changed)=\"channelsChanged()\"></chips-selector>\r\n\r\n </mat-expansion-panel>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlex=\"*\" fxFlexAlign=\"end\">\r\n <button mat-stroked-button (click)=\"clearFilter()\">Pulisci</button>\r\n <button mat-stroked-button (click)=\"saveFilter()\" style=\"margin-left: 10px;\">Salva</button>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"end\" mat-flat-button (click)=\"applyFilter()\"\r\n [disabled]=\"!canSearch()\">Applica</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mat-drawer>\r\n <div fxLayout=\"column\" fxLayoutGap=\"10px\" fxFill class=\"drawer-content scroll-hidden\">\r\n <div class=\"module-toolbar \">\r\n <div fxLayout=\"row wrap\" fxLayoutAlign=\"space-between\" fxFill>\r\n <div fxFlex=\"49\" fxFlex.lt-md=\"100\" style=\"padding-left: 10px; padding-bottom: 5px;\">\r\n @if(!filterPane.opened) {\r\n <button-toggle cssClass=\"small\" cssClassSmall=\"x-small\" iconOn=\"left_panel_close\" iconOff=\"tune\"\r\n labelOn=\"Nascondi<br>filtri\" labelOff=\"Mostra<br>filtri\" [value]=\"filterPane.opened\"\r\n (changed)=\"toggleFilterPane()\"></button-toggle>\r\n }\r\n </div>\r\n <div fxFlex=\"49\" fxFlex.lt-md=\"100\" fxLayoutAlign=\"end\">\r\n <div fxLayout=\"row\" style=\"height:48px; padding-bottom: 5px;\">\r\n @if((snapshot?.total ?? 0) > 0) {\r\n @if(sortOptions().length > 0) {\r\n <button-selector [options]=\"sortOptions()\" label=\"Ordina per:\" style=\"margin-right: 5px;\" [border]=\"0\"\r\n fxFlexAlign=\"center\" [ngModel]=\"sortMode()\" name=\"sortMode\" (selected)=\"sort($event)\"></button-selector>\r\n }\r\n <button fxFlexAlign=\"center\" mat-icon-button matSuffix matTooltip=\"Opzioni sulla selezione\"\r\n aria-label=\"Opzioni sulla selezione\" [matMenuTriggerFor]=\"selectionOptionsMenu\"\r\n [matBadge]=\"countSelections()\"><mat-icon>checklist</mat-icon></button>\r\n <button fxFlexAlign=\"center\" mat-icon-button matTooltip=\"Salva elenco in Excel \"\r\n (click)=\"exportResults()\"><mat-icon>save_alt</mat-icon></button>\r\n @if (!filterPane2?.opened && hasFacets()){\r\n <button fxFlexAlign=\"center\" mat-icon-button matTooltip=\"Affina ricerca\"\r\n (click)=\"toggleFilterPane2()\"><mat-icon>right_panel_open</mat-icon></button>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" class=\"module-content\">\r\n <mat-drawer-container [hasBackdrop]=\"filterPane2HasBackdrop()\" class=\"fill\">\r\n <mat-drawer #filterPane2 class=\"drawer-small drawer-with-loader\" position=\"end\" opened=\"false\">\r\n @if (filterBusy()) {\r\n <div class=\"overlay\"></div>\r\n }\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"6px\">\r\n @if (filterBusy()) {\r\n <mat-progress-bar style=\"z-index: 11;\" mode=\"indeterminate\">\r\n </mat-progress-bar>\r\n }\r\n </div>\r\n <div fxFlex=\"78px\" class=\"title-container-with-loader\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFill>\r\n <div class=\"title\">Affina ricerca</div>\r\n <div fxFlex=\"*\" fxLayoutAlign=\"end\">\r\n <button mat-icon-button (click)=\"toggleFilterPane2()\"\r\n matTooltip=\"Nascondi\"><mat-icon>right_panel_close</mat-icon></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" class=\"content scroll-hidden\" style=\"padding: 0 5px;\">\r\n <clipper-search-facets #facets></clipper-search-facets>\r\n\r\n </div>\r\n </div>\r\n </mat-drawer>\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"*\" [id]=\"scrollerId\" cdkScrollable class=\"scroll-auto\" style=\"padding: 0 20px;\">\r\n @if (!snapshot?.total) {\r\n <div class=\"message-container\">\r\n @if(snapshot?.total === 0) {\r\n <p class=\"message\"><b>Nessun elemento da visualizzare.</b></p>\r\n } @else {\r\n <div class=\"message\">\r\n <p fxHide.xs><b>Esegui una ricerca compilando i campi necessari nella maschera di ricarca qui a\r\n fianco.</b></p>\r\n <p fxHide.gt-xs><b>Fai click sul bottone <span class=\"accent\"><mat-icon>tune</mat-icon></span> ed esegui\r\n una\r\n ricerca compilando i campi necessari.</b></p>\r\n <p>E' possibile salvare i parametri delle le ricerche più utilizzate facendo clic su \r\n <mat-icon\r\n style=\"display: inline-flex; border-radius: 9999px; height: 25px; width: 25px; color: var(--ars-color-text-low); background-color: var(--ars-color-accent);\">add</mat-icon>.\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n @if (snapshot && (snapshot.total ?? 0) > 0) {\r\n @for (item of snapshot.items; track $index; let i = $index) {\r\n @if (item.group && isSortedByDate()) {\r\n <div class=\"items-group-title\">\r\n <div [class.group-spaced]=\"i > 0\">{{item.group}}</div>\r\n </div>\r\n }\r\n <clipper-search-result-item [item]=\"item\" [parent]=\"this\" [displayModelName]=\"true\" [actions]=\"contextMenu\"\r\n [isReadable]=\"true\"></clipper-search-result-item>\r\n }\r\n }\r\n }\r\n </div>\r\n <!-- footer -->\r\n @if ((snapshot?.total ?? 0) > 0) {\r\n <div class=\"items-footer\">\r\n <div fxLayout=\"row wrap\" fxLayoutGap=\"10px\" fxLayoutAlign=\"space-between center\" fxFill>\r\n <!-- legend -->\r\n <div fxFlex.lt-md=\"100\" class=\"legend-container\">\r\n <div class=\"legend unread-bg\"></div>\r\n non letto\r\n <!--<div class=\"legend next very-popular-bg\"></div>\r\n molto citato\r\n <div class=\"legend next popular-bg\"></div>\r\n citato-->\r\n <div class=\"legend next expired-bg \"></div>\r\n non più vigente\r\n </div>\r\n <div fxFlex.lt-md=\"100\" fxLayoutAlign=\"end\" [class.wide]=\"filterPane2?.opened\">\r\n <div fxLayout=\"row\">\r\n <mat-paginator fxFlexAlign=\"center\" #paginator class=\"paginator\" [hidePageSize]=\"true\"\r\n [length]=\"snapshot?.total ?? 0\" [pageSize]=\"filterParams.count\" [showFirstLastButtons]=\"true\"\r\n (page)=\"fetchMore($event)\">\r\n </mat-paginator>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mat-drawer-container>\r\n </div>\r\n </div>\r\n</mat-drawer-container>\r\n<mat-menu #filterPaneOptionsMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"compose()\">\r\n <mat-icon>build</mat-icon>Componi\r\n </button>\r\n <button mat-menu-item (click)=\"help()\">\r\n <mat-icon>help</mat-icon>Come usare la ricerca in testo libero\r\n </button>\r\n</mat-menu>\r\n<mat-menu #selectionOptionsMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"selectAll()\">\r\n <mat-icon>select_all</mat-icon>Seleziona tutti\r\n </button>\r\n <clipper-document-menu [parent]=\"this\" [useSelections]=\"true\" [isReadable]=\"true\" [canUseArchive]=\"false\"\r\n [canUseCalendar]=\"false\" [canUseAIAssistant]=\"hasAIAssistant()\" [canUseRS]=\"showRSOptions()\">\r\n </clipper-document-menu>\r\n</mat-menu>\r\n<mat-menu #contextMenu=\"matMenu\" (closed)=\"updateMenuButtonsVisibility()\">\r\n <ng-template matMenuContent let-item=\"item\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"item\" [isReadable]=\"true\" [canUseArchive]=\"false\"\r\n [canUseCalendar]=\"false\" [canUseAIAssistant]=\"hasAIAssistant()\" [canUseRS]=\"showRSOptions()\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n</mat-menu>","import { ChangeDetectionStrategy, Component, DestroyRef, effect, inject, viewChild } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MAT_DIALOG_DATA, MatDialogClose, MatDialogContent, MatDialogRef } from '@angular/material/dialog';\r\nimport { ClipperMessages, ClipperModule, ClipperSelectionMode, ClipperService, ClipperUtils } from '@arsedizioni/ars-utils/clipper.common';\r\nimport { BroadcastService, SystemUtils, ThemeType } from '@arsedizioni/ars-utils/core';\r\nimport { ClipperBrowserComponent } from '../browser.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\n\r\n\r\nexport interface ClipperBrowserDialogData {\r\n showChannels?: boolean;\r\n selectionMode?: ClipperSelectionMode;\r\n selectableModules?: ClipperModule[];\r\n selectionMessage?: string;\r\n initialModule?: number;\r\n theme?: ThemeType;\r\n}\r\n\r\n@Component({\r\n host: { 'Bind': SystemUtils.generateUUID() },\r\n templateUrl: './browser-dialog.component.html',\r\n styleUrls: ['./browser-dialog.component.scss'],\r\n imports: [MatDialogClose, MatDialogContent, MatButtonModule, MatBadgeModule, MatIconModule, FlexLayoutModule, ClipperBrowserComponent],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ClipperBrowserDialogComponent {\r\n private readonly destroyRef = inject(DestroyRef);\r\n readonly clipperBrowser = viewChild.required<ClipperBrowserComponent>('clipperBrowser');\r\n protected clipperService = inject(ClipperService);\r\n protected dialogData: ClipperBrowserDialogData = inject(MAT_DIALOG_DATA);\r\n private dialogRef = inject(MatDialogRef<ClipperBrowserDialogComponent>);\r\n private broadcastService = inject(BroadcastService);\r\n\r\n constructor() {\r\n // Apply the selection mode from dialog data once the browser view is available.\r\n // Falls back to ClipperSelectionMode.None when selectionMode is not provided.\r\n effect(() => {\r\n this.clipperBrowser().selectionMode.set(this.dialogData.selectionMode ?? ClipperSelectionMode.None);\r\n });\r\n\r\n // Subscribe to inner document-selection events and forward them as dialog output.\r\n this.broadcastService.getMessage()\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(message => {\r\n if (message.id === ClipperMessages.DOCUMENT_SELECTED_INNER) {\r\n const documentId: string | undefined = message.data.documentId ?? message.data.id;\r\n const document = documentId != null ? this.clipperBrowser().getSnapshotDocument(documentId) : undefined;\r\n if (document) {\r\n this.broadcastService.sendMessage(\r\n this.dialogData.selectionMessage ?? ClipperMessages.DOCUMENT_SELECTED, [document]);\r\n this.dialogRef.close();\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Determines whether the current selection satisfies the required selection mode\r\n * and module constraints defined in the dialog data.\r\n *\r\n * @returns `true` if the selection is valid and can be confirmed; `false` otherwise.\r\n */\r\n protected canSelect(): boolean {\r\n const selection = this.clipperBrowser().selection;\r\n const selectionCount = selection?.all?.length ?? 0;\r\n const mode = this.dialogData.selectionMode;\r\n\r\n let allow =\r\n (mode === ClipperSelectionMode.Single && selectionCount === 1) ||\r\n (mode === ClipperSelectionMode.TwoOrMore && selectionCount > 1) ||\r\n (mode === ClipperSelectionMode.Multi && selectionCount > 0);\r\n\r\n if (allow && (this.dialogData.selectableModules?.length ?? 0) > 0) {\r\n selection?.all?.forEach(n => {\r\n const module = ClipperUtils.getClipperModuleFromModel(n);\r\n if (this.dialogData.selectableModules?.findIndex(x => x === module) === -1) {\r\n allow = false;\r\n }\r\n });\r\n }\r\n\r\n return allow;\r\n }\r\n\r\n /**\r\n * Broadcasts the current selection as a message and closes the dialog.\r\n * Does nothing when the selection is empty.\r\n */\r\n protected select(): void {\r\n const items = this.clipperBrowser().selection?.all;\r\n if (items && items.length > 0) {\r\n this.broadcastService.sendMessage(\r\n this.dialogData.selectionMessage ?? ClipperMessages.DOCUMENT_SELECTED,\r\n items\r\n );\r\n this.dialogRef.close();\r\n }\r\n }\r\n\r\n}\r\n","<div style=\"padding:10px 0 10px 0\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"20px\" fxLayoutAlign=\"start center\" fxFill>\r\n <div class=\"dialog-title\">\r\n <a href=\"https://clipper.arsedizioni.it\" matTooltip=\"Apri Clipper in un nuovo tab\" target=\"_blank\">\r\n <div class=\"clipper-logo\"></div>\r\n </a>\r\n </div>\r\n <div fxFlex=\"*\"></div>\r\n @if ((dialogData.selectionMode ?? 0) > 0 && canSelect()) {\r\n <div fxFlexAlign=\"center\" fxFlex=\"170px\" fxFlex.lt-md=\"58px\">\r\n <button fxHide.lt-md fxFlexAlign=\"center\" type=\"button\" mat-flat-button (click)=\"select()\"\r\n class=\"clipper-selection-button\">\r\n <span class=\"small bold\">Usa selezione</span>\r\n </button>\r\n <button fxHide.gt-sm fxFlexAlign=\"center\" type=\"button\" mat-icon-button (click)=\"select()\"\r\n matTooltip=\"Usa selezione\" aria-label=\"'Usa la selezione'\" class=\"clipper-selection-icon-button\">\r\n <mat-icon>check</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n <div fxFlexAlign=\"center\" class=\"dialog-close\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\" fxLayoutGap=\"5px\">\r\n @if (clipperService.bag.length > 0) {\r\n <button type=\"button\" mat-icon-button matTooltip=\"Documenti di lavoro\"\r\n aria-label=\"'Documenti di lavoro'\" (click)=\"clipperBrowser.openBag()\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"clipperService.bag.length\"\r\n >work_outline</mat-icon>\r\n </button>\r\n }\r\n <button type=\"button\" mat-icon-button matTooltip=\"Chiudi\" [mat-dialog-close]=\"true\" aria-label=\"Chiudi\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<mat-dialog-content style=\"padding: 0\">\r\n <clipper-browser #clipperBrowser class=\"wide fill\" [showChannels]=\"dialogData.showChannels ?? true\"\r\n [selectableModules]=\"dialogData.selectableModules ?? []\"\r\n [initialModule]=\"dialogData.initialModule\" [showRSOptions]=\"false\" [showAIAssistantOptions]=\"false\"></clipper-browser>\r\n</mat-dialog-content>","import { Component, output, viewChild, inject, ChangeDetectionStrategy, signal, DestroyRef } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { NgForm, FormsModule } from '@angular/forms';\r\nimport { MAT_DIALOG_DATA, MatDialogRef, MatDialogTitle, MatDialogContent, MatDialogActions, MatDialogClose } from '@angular/material/dialog';\r\nimport { ArsCoreModule, NameValueItem, SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { DialogService } from '@arsedizioni/ars-utils/ui';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { FlexModule } from '@ngbracket/ngx-layout/flex';\r\nimport { finalize } from 'rxjs/operators';\r\nimport { ClipperContactInfo, ClipperService, ClipperTeamProduct, EditDialogCompleted, EditDialogData } from '@arsedizioni/ars-utils/clipper.common';\r\nimport { MatSelectModule } from '@angular/material/select';\r\n\r\n@Component({\r\n host: { 'Bind': SystemUtils.generateUUID() },\r\n templateUrl: './contact-edit.component.html',\r\n styleUrls: ['./contact-edit.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n ArsCoreModule,\r\n MatDialogTitle,\r\n MatDialogContent,\r\n FormsModule,\r\n FlexModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatDialogActions,\r\n MatDialogClose,\r\n MatSelectModule\r\n ]\r\n})\r\nexport class ClipperContactEditComponent {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private clipperService = inject(ClipperService);\r\n private dialogService = inject(DialogService);\r\n private dialogRef = inject<MatDialogRef<ClipperContactEditComponent>>(MatDialogRef);\r\n private dialogData = inject<EditDialogData<ClipperContactInfo>>(MAT_DIALOG_DATA);\r\n protected readonly f = viewChild<NgForm>('f');\r\n readonly done = output<EditDialogCompleted<ClipperContactInfo>>();\r\n protected readonly dialogTitle = this.dialogData?.currentItem ? 'Modifica contatto' : 'Nuovo contatto';\r\n protected readonly isNew = signal<boolean>(!this.dialogData?.currentItem?.id);\r\n protected item: ClipperContactInfo = this.dialogData?.currentItem ?? { id: 0 };\r\n protected readonly availableTeams = signal<NameValueItem<string>[]>([]);\r\n protected selectedTeam: NameValueItem<string> = { name: 'Nessuno, usa contatti personali', value: SystemUtils.emptyUUID() };\r\n\r\n constructor() {\r\n this.loadTeams();\r\n }\r\n\r\n /**\r\n * Loads the list of available teams from the server and populates the team selector.\r\n * Pre-selects the team that matches the current contact's team id, falling back to 'Personale'.\r\n */\r\n private loadTeams(): void {\r\n this.clipperService\r\n .getTeams({ productId: ClipperTeamProduct.SharedNotes })\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else if ((r.value?.total ?? 0) > 0) {\r\n const teams: NameValueItem<string>[] = [{ name: 'Nessuno, usa contatti personali', value: SystemUtils.emptyUUID() }];\r\n r.value?.items.forEach(n =>\r\n teams.push({ name: n.name, value: n.value.toLowerCase() })\r\n );\r\n this.availableTeams.set(teams);\r\n this.selectedTeam = teams.find(x => x.value === this.item.teamId) ?? teams[0];\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Persists the current contact to the server.\r\n * Closes the dialog without saving when editing an existing contact whose form is unchanged.\r\n */\r\n protected save(): void {\r\n if (!this.isNew() && this.f()?.form.pristine) {\r\n this.dialogRef.close();\r\n return;\r\n }\r\n\r\n if (this.isNew()) {\r\n this.item.teamId = this.selectedTeam.value;\r\n }\r\n\r\n this.dialogService.busy('Aggiornamento in corso...');\r\n this.clipperService.saveContact(this.item)\r\n .pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n finalize(() => this.dialogService.clearBusy())\r\n )\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n this.done.emit({ data: r.value, isNew: this.isNew() });\r\n this.dialogService.toast('Operazione completata con successo.');\r\n setTimeout(() => this.dialogRef.close(), 500);\r\n }\r\n });\r\n }\r\n}\r\n","<div class=\"dialog-info\">\r\n @if (f.form.invalid) {\r\n <span class=\"dialog-info-red\">Ci sono ancora dei campi obbligatori (*) non\r\n compilati o con errori.</span>\r\n } @else {\r\n <span class=\"dialog-info-green\">Tutti i campi obbligatori (*) sono compilati senza errori.</span>\r\n }\r\n</div>\r\n<h2 mat-dialog-title>{{dialogTitle}}</h2>\r\n<div mat-dialog-content class=\" no-spaced\">\r\n <form name=\"form\" #f=\"ngForm\" novalidate>\r\n <div fxLayout=\"column\" class=\"spaced\">\r\n @if (availableTeams() && availableTeams().length > 1) {\r\n <mat-form-field>\r\n <mat-label>Team</mat-label>\r\n <mat-select [(ngModel)]=\"selectedTeam\" #team=\"ngModel\" name=\"team\" required [disabled]=\"!isNew()\">\r\n @for (t of availableTeams(); track $index;) {\r\n <mat-option [value]=\"t\">\r\n {{t.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (team.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n <mat-form-field>\r\n <mat-label>Nome</mat-label>\r\n <input matInput [(ngModel)]=\"item.name\" name=\"name\" #name=\"ngModel\" required maxlength=\"100\" />\r\n <mat-hint align=\"end\">{{name.value?.length || 0}}/100 </mat-hint>\r\n @if (name.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>Elenco email...</mat-label>\r\n <textarea matInput [(ngModel)]=\"item.emails\" name=\"emails\" #emails=\"ngModel\" maxlength=\"1000\"\r\n emails cdkTextareaAutosize></textarea>\r\n <mat-hint align=\"start\">Separati da punto e virgola</mat-hint>\r\n <mat-hint align=\"end\">{{emails.value?.length || 0}}/1000 </mat-hint>\r\n @if (emails.invalid) {\r\n <mat-error>Non valido</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n </div>\r\n </form>\r\n</div>\r\n<div mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\r\n <button mat-flat-button color=\"primary\" [disabled]=\"f.form.invalid || f.form.pristine\"\r\n (click)=\"save()\">Salva</button>\r\n <button mat-stroked-button [mat-dialog-close]=\"true\" color=\"primary\">Chiudi</button>\r\n </div>\r\n</div>","import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n Renderer2,\r\n inject,\r\n signal,\r\n output,\r\n viewChild,\r\n Injector,\r\n afterNextRender\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogContent, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatDrawer, MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { Router } from '@angular/router';\r\nimport {\r\n ClipperDocumentAnchorInfo, ClipperDocumentInfo,\r\n ClipperDocumentRelevantChunkHit,\r\n ClipperDocumentRelevants,\r\n ClipperMessages,\r\n ClipperModel,\r\n ClipperModule,\r\n ClipperQueryReferencesMode, ClipperSearchParams, ClipperSearchUtils,\r\n ClipperSelectionMode, ClipperUserInfo, ClipperUtils\r\n} from '@arsedizioni/ars-utils/clipper.common';\r\nimport {\r\n SafeUrlPipe,\r\n SystemUtils,\r\n ThemeType\r\n} from '@arsedizioni/ars-utils/core';\r\nimport { FilePreviewComponent } from '@arsedizioni/ars-utils/ui.application';\r\n\r\nimport type { ClipperReferenceDialogResult } from '../references/references.component';\r\nimport type { ClipperDocumentIndexDialogResult } from '../document-index/document-index.component';\r\nimport { ClipperDocumentManager } from '../document-manager/document-manager';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { ClipperDocumentsUtils } from '../../documents';\r\nimport { ClipperDocumentMenuComponent } from '../document-menu/document-menu.component';\r\nimport { ClipperNoteBadgeComponent } from '../note-badge/note-badge.component';\r\n\r\n\r\nexport interface ClipperDocumentDialogData {\r\n selectionMode?: ClipperSelectionMode;\r\n selectableModules?: ClipperModule[];\r\n id: string;\r\n query?: string;\r\n queryChunks?: string;\r\n theme?: ThemeType;\r\n canUseArchive?: boolean;\r\n canUseNotes?: boolean;\r\n canHandleTooManyResults?: boolean;\r\n\r\n}\r\n\r\n@Component({\r\n host: { 'Bind': SystemUtils.generateUUID() },\r\n templateUrl: './document.component.html',\r\n styleUrls: ['./document.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [\r\n FlexLayoutModule,\r\n MatButtonModule,\r\n MatTooltipModule,\r\n MatIconModule,\r\n MatMenuModule,\r\n MatDividerModule,\r\n MatProgressBarModule,\r\n MatDialogContent,\r\n MatSidenavModule,\r\n SafeUrlPipe,\r\n ClipperDocumentMenuComponent,\r\n ClipperNoteBadgeComponent\r\n ],\r\n})\r\nexport class ClipperDocumentComponent extends ClipperDocumentManager {\r\n readonly relevantsPane = viewChild<MatDrawer>('relevantsPane');\r\n readonly closing = output();\r\n readonly opening = output<string>();\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly injector = inject(Injector);\r\n private readonly breakpointObserver = inject(BreakpointObserver);\r\n private readonly renderer = inject(Renderer2);\r\n private rendererListener1: (() => void) | undefined;\r\n private readonly router = inject(Router);\r\n private readonly dialogRef = inject(MatDialogRef<ClipperDocumentComponent>);\r\n protected readonly dialogData: ClipperDocumentDialogData = inject(MAT_DIALOG_DATA) ?? { mode: ClipperQueryReferencesMode.ReferencesIn };\r\n protected readonly url = signal<string | null>(null);\r\n protected readonly title = signal<string | null>(null);\r\n protected readonly busy = signal<boolean>(false);\r\n protected lastQuery?: string;\r\n protected lastQueryChunks: string = '';\r\n protected lastQueryType: 'fulltext' | 'semantic' = 'fulltext';\r\n protected readonly lastDocument = signal<ClipperDocumentInfo | undefined>(undefined);\r\n protected readonly relevants = signal<ClipperDocumentRelevants>({\r\n items: [],\r\n hits: 0,\r\n hit: 0,\r\n chunks: 0,\r\n });\r\n protected readonly relevantsPaneHasBackdrop = signal<boolean>(false);\r\n protected readonly relevantsPaneClosed = signal<boolean>(false);\r\n protected readonly relevantsBusy = signal<boolean>(false);\r\n protected readonly hasRelevants = signal<boolean>(false);\r\n protected readonly user: ClipperUserInfo | undefined = this.clipperService.loginInfo?.context;\r\n\r\n constructor() {\r\n super();\r\n\r\n if (this.dialogData?.id) {\r\n // Build the document render URL from the dialog data\r\n let id = this.dialogData.id.toString();\r\n const hashPos = id.indexOf('#');\r\n if (hashPos !== -1) {\r\n id = id.substring(0, hashPos);\r\n }\r\n let query = this.dialogData.query ?? '';\r\n if (this.dialogData.queryChunks && this.dialogData.queryChunks.length > 0) {\r\n query += '__CHUNKS__' + id + ':' + this.dialogData.queryChunks;\r\n }\r\n const url =\r\n this.clipperService.serviceUri +\r\n '/documents/render/?query=' + query +\r\n '&theme=' + this.dialogData.theme +\r\n '&id=' + this.dialogData.id;\r\n this.navigateByUrl(url);\r\n }\r\n\r\n // Listen to postMessage events from the embedded iframe\r\n this.rendererListener1 = this.renderer.listen('window', 'message', (e: Event) => {\r\n const event = e as MessageEvent;\r\n if (!event?.data) return;\r\n try {\r\n const data = JSON.parse(event.data);\r\n if (!data) return;\r\n switch (data.type) {\r\n case 'navigated':\r\n this.navigated(\r\n data.id, data.title1, data.title2, data.tags, data.model,\r\n data.module, data.moduleName, data.date, data.number, data.author,\r\n data.origin, data.originDescription, data.bag, data.validityInfo,\r\n data.expiringInfo, data.primaryId, data.primaryModel, data.secondaryId, data.isTrial\r\n );\r\n break;\r\n case 'navigate':\r\n this.navigate(data.url);\r\n break;\r\n case 'references':\r\n this.openReferences(data.id, data.mode, data.model, data.anchor, data.anchorTitle, data.update);\r\n break;\r\n case 'hits':\r\n this.relevants.update(r => ({ ...r, hits: data.total as number }));\r\n if (data.update) {\r\n this.updateRelevants();\r\n }\r\n break;\r\n case 'hits2':\r\n this.relevants.update(r => ({ ...r, chunks: data.total as number }));\r\n this.updateRelevants2(data.items as ClipperDocumentRelevantChunkHit[]);\r\n break;\r\n }\r\n } catch {\r\n // Ignore malformed messages from the iframe\r\n }\r\n });\r\n\r\n // Release the renderer listener on component destroy\r\n this.destroyRef.onDestroy(() => this.rendererListener1?.());\r\n\r\n // React to broadcast messages from other components.\r\n this.broadcastService.getMessage()\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(message => {\r\n if (message.id === ClipperMessages.COMMAND_NOTES_DELETE) {\r\n const p = this.lastDocument().notes?.findIndex(p => p.id === message.data.id);\r\n if (p !== undefined && p >= 0) {\r\n this.lastDocument.update(v => ({ ...v, notes: v.notes?.filter((_, i) => i !== p) }));\r\n }\r\n } else if (message.id === ClipperMessages.COMMAND_NOTES_UPDATE) {\r\n const p = this.lastDocument().notes?.findIndex(p => p.id === message.data.id);\r\n if (p !== undefined && p >= 0) {\r\n this.lastDocument.update(v => {\r\n const props = [...(v.notes ?? [])];\r\n props[p] = message.data;\r\n return { ...v, notes: props };\r\n });\r\n }\r\n }\r\n });\r\n\r\n // Start tracking breakpoint changes only after the first render, when the DOM is ready.\r\n afterNextRender(() => {\r\n this.breakpointObserver\r\n .observe([\r\n Breakpoints.XSmall,\r\n Breakpoints.Small,\r\n Breakpoints.Medium,\r\n Breakpoints.Large,\r\n Breakpoints.XLarge,\r\n ])\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(result => {\r\n for (const query of Object.keys(result.breakpoints)) {\r\n if (result.breakpoints[query]) {\r\n this.handleRelevantsPaneVisibility();\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n\r\n\r\n /**\r\n * Toggles the relevants side-pane open/closed state.\r\n */\r\n protected toggleRelevantsPane(): void {\r\n this.relevantsPaneClosed.set(!this.relevantsPaneClosed());\r\n this.relevantsPane()?.toggle();\r\n }\r\n\r\n /**\r\n * Adjusts the relevants side-pane mode and visibility based on the current viewport breakpoint.\r\n */\r\n private handleRelevantsPaneVisibility(): void {\r\n const relevantsPane = this.relevantsPane();\r\n if (!relevantsPane) return;\r\n if (\r\n this.breakpointObserver.isMatched(Breakpoints.XSmall) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Small) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Medium)\r\n ) {\r\n if (relevantsPane.opened) relevantsPane.close();\r\n relevantsPane.mode = 'over';\r\n relevantsPane.disableClose = false;\r\n this.relevantsPaneHasBackdrop.set(true);\r\n } else {\r\n if (!relevantsPane.opened && !this.relevantsPaneClosed() && this.hasRelevants()) {\r\n relevantsPane.open();\r\n } else if (relevantsPane.opened && this.relevantsPaneClosed()) {\r\n relevantsPane.close();\r\n }\r\n relevantsPane.mode = 'side';\r\n relevantsPane.disableClose = true;\r\n this.relevantsPaneHasBackdrop.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Emits the closing event and closes the dialog after a short delay.\r\n */\r\n protected close(): void {\r\n this.closing.emit();\r\n setTimeout(() => this.dialogRef.close(), 500);\r\n }\r\n\r\n /**\r\n * Navigates to a document or external URL received from the iframe.\r\n * @param id - The document id or URL to navigate to.\r\n */\r\n navigate(id: string): void {\r\n if (!id || id.length === 0) return;\r\n\r\n if (id.indexOf('?') !== -1) {\r\n if (id.startsWith('/api'))\r\n this.navigateByUrl(this.clipperService.serviceUri + id.substring(4));\r\n else if (!id.startsWith(this.clipperService.serviceUri))\r\n this.navigateByUrl(this.clipperService.serviceUri + id);\r\n else\r\n this.navigateByUrl(id);\r\n } else {\r\n this.navigateByUrl(this.clipperService.serviceUri + '/documents/render/?query=&id=' + id);\r\n }\r\n }\r\n\r\n /**\r\n * Resolves and loads a document by its fully-qualified render URL.\r\n * Parses query, theme, and anchor information before navigating.\r\n * @param url - The full render URL to load.\r\n */\r\n navigateByUrl(url: string): void {\r\n if (!url || url.length === 0 || url === 'about:blank') return;\r\n\r\n // Keep only the first anchor fragment\r\n const urlParts = url.split('#');\r\n url = urlParts[0];\r\n if (urlParts.length > 1) {\r\n url += '#' + urlParts[1];\r\n }\r\n\r\n // Extract and process the free-text query parameter\r\n let query = '';\r\n let p = url.indexOf('query=');\r\n if (p !== -1) {\r\n p += 6;\r\n while (url.length > p && url[p] !== '&' && url[p] !== '#') {\r\n query += url[p++];\r\n }\r\n if (query.length > 0) {\r\n if (query[0] === '$') {\r\n query = query.substring(1);\r\n this.lastQueryType = 'semantic';\r\n }\r\n this.relevants.update(r => ({ ...r, hit: 0 }));\r\n try {\r\n query = decodeURIComponent(encodeURIComponent(query));\r\n } catch {\r\n // Keep original query if encoding fails\r\n }\r\n\r\n // Extract the document id\r\n let id = '';\r\n p = url.indexOf('id=');\r\n while (url.length > p && url[p] !== '&' && url[p] !== '#') {\r\n id += url[p++];\r\n }\r\n\r\n // Split into text query and optional chunk offsets\r\n const queryParts = query.split('__CHUNKS__');\r\n if (queryParts.length > 0) {\r\n this.lastQuery = ClipperSearchUtils.normalizeTextQuery2(queryParts[0]);\r\n if (queryParts.length > 1) {\r\n const queryChunksParts = queryParts[1].split(':');\r\n if (queryChunksParts.length > 2 && queryChunksParts[0] === id) {\r\n this.lastQueryChunks = queryChunksParts[1];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Inject the current theme into the URL if not already present\r\n if (url.indexOf('theme=') === -1) {\r\n p = url.indexOf('id=');\r\n if (p !== -1) {\r\n url = url.substring(0, p) + 'theme=' + this.dialogData.theme + '&' + url.substring(p);\r\n }\r\n }\r\n\r\n if (url.indexOf('&file=true') !== -1) {\r\n this.previewFile(url);\r\n } else {\r\n this.clipperService.preRender().subscribe(() => {\r\n this.busy.set(url.indexOf('documents/render/item') === -1);\r\n this.url.set(url);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Called by the iframe when a document has finished rendering.\r\n * Parses and stores all document metadata, then triggers auxiliary data loading.\r\n * @param id - Document id.\r\n * @param title1 - Primary title.\r\n * @param title2 - Secondary title.\r\n * @param tags - Comma-separated tag list.\r\n * @param model - Document model identifier.\r\n * @param moduleId - Module identifier.\r\n * @param moduleName - Module display name.\r\n * @param date - Publication date string.\r\n * @param number - Document number.\r\n * @param author - Author name.\r\n * @param origin - Source origin code.\r\n * @param originDescription - Human-readable origin description.\r\n * @param bag - Encoded flags string.\r\n * @param validityInfo - Encoded validity information.\r\n * @param expiringInfo - Encoded expiration information.\r\n * @param primaryId - Id of the primary linked document, if any.\r\n * @param primaryModel - Model of the primary linked document.\r\n * @param secondaryId - Id of the secondary linked document, if any.\r\n * @param isTrial - True when the request is a trial/preview access.\r\n */\r\n public navigated(\r\n id: string,\r\n title1: string,\r\n title2: string,\r\n tags: string,\r\n model: number,\r\n moduleId: number,\r\n moduleName: string,\r\n date: string,\r\n number: string,\r\n author: string,\r\n origin: string,\r\n originDescription: string,\r\n bag: string,\r\n validityInfo: string,\r\n expiringInfo: string,\r\n primaryId: string,\r\n primaryModel: number,\r\n secondaryId: string,\r\n isTrial: boolean\r\n ): void {\r\n // Redirect to login when the session has expired\r\n if (title1 === 'Sessione non valida') {\r\n this.dialogService\r\n .error(title2, null, title1, 'Accedi di nuovo')\r\n .afterClosed()\r\n .subscribe(() => this.router.navigate(['login']));\r\n return;\r\n }\r\n\r\n // Resolve the primary document description label\r\n let primaryDescription: string | undefined;\r\n if (primaryId) {\r\n switch (primaryModel ?? model) {\r\n case ClipperModel.NormativaVigente: primaryDescription = 'Testo vigente'; break;\r\n case ClipperModel.AggiornamentoNormativo: primaryDescription = 'Testo storico'; break;\r\n case ClipperModel.Scadenze: primaryDescription = 'Scadenza'; break;\r\n case ClipperModel.Coordinamento: primaryDescription = 'Modifica'; break;\r\n default: primaryDescription = 'Collegamento'; break;\r\n }\r\n }\r\n\r\n // Parse the expiring info block\r\n let expiringDate: Date | undefined;\r\n let expiringInfoText: string | undefined;\r\n let expiringDescription: string | undefined;\r\n if (expiringInfo) {\r\n const expiringParts = expiringInfo.split('#');\r\n if (expiringParts.length > 0) {\r\n const dateParts = expiringParts[0].split('|');\r\n if (dateParts.length > 0) expiringDate = new Date(dateParts[0]);\r\n if (dateParts.length > 1) expiringInfoText = dateParts[1];\r\n if (dateParts.length > 2) expiringInfoText += '|' + dateParts[2];\r\n }\r\n if (expiringParts.length > 1) expiringDescription = expiringParts[1];\r\n }\r\n\r\n const updatedDoc: ClipperDocumentInfo = {\r\n ...this.lastDocument() ?? {},\r\n id,\r\n documentId: id,\r\n title1: title1 ? SystemUtils.urlDecode(title1).replaceAll('\\\\\"', '\"') : undefined,\r\n title2: title2 ? SystemUtils.urlDecode(title2).replaceAll('\\\\\"', '\"') : undefined,\r\n tags,\r\n model,\r\n module: moduleId,\r\n moduleName,\r\n date: new Date(date),\r\n number,\r\n author,\r\n origin,\r\n originDescription,\r\n bag,\r\n validityInfo,\r\n primaryId,\r\n primaryModel,\r\n hasPrimary: !!primaryId && (model === ClipperModel.AggiornamentoNormativo || model === ClipperModel.NormativaVigente),\r\n primaryDescription,\r\n secondaryId,\r\n isTrial,\r\n expiringDate,\r\n expiringInfo: expiringInfoText,\r\n expiringDescription,\r\n };\r\n\r\n this.lastDocument.set(updatedDoc);\r\n this.title.set(updatedDoc.title1 ?? updatedDoc.title2 ?? null);\r\n this.busy.set(false);\r\n\r\n // Broadcast the navigation event so other components can react\r\n this.broadcastService.sendMessage(ClipperMessages.DOCUMENT_NAVIGATED, {\r\n document: SystemUtils.clone(updatedDoc),\r\n });\r\n\r\n // Fetch and store the last update timestamp asynchronously\r\n this.clipperService.metadata(id).subscribe(r => {\r\n if (r.success) {\r\n this.lastDocument.update(doc => doc ? { ...doc, lastUpdate: r.value.item1, notes: r.value.item2 } : doc);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Navigates back in the iframe's browsing history.\r\n */\r\n protected back(): void {\r\n const f = document.getElementById('clipper-document-iframe') as any;\r\n f?.contentWindow.postMessage('{\"type\": \"back\"}', '*');\r\n }\r\n\r\n /**\r\n * Navigates forward in the iframe's browsing history.\r\n */\r\n protected forward(): void {\r\n const f = document.getElementById('clipper-document-iframe') as any;\r\n f?.contentWindow.postMessage('{\"type\": \"forward\"}', '*');\r\n }\r\n\r\n /**\r\n * Moves focus to the next highlighted relevant hit inside the document.\r\n */\r\n protected nextRelevant(): void {\r\n const current = this.relevants();\r\n let i = current.hit + 1;\r\n if (i > current.hits) i = 0;\r\n const f = document.getElementById('clipper-document-iframe') as any;\r\n f?.contentWindow.postMessage('{\"type\": \"relevant\", \"value\": \"next\"}', '*');\r\n this.relevants.update(r => ({ ...r, hit: i }));\r\n }\r\n\r\n /**\r\n * Moves focus to the previous highlighted relevant hit inside the document.\r\n */\r\n protected previousRelevant(): void {\r\n const current = this.relevants();\r\n let i = current.hit - 1;\r\n if (i < 0) i = current.hits;\r\n const f = document.getElementById('clipper-document-iframe') as any;\r\n f?.contentWindow.postMessage('{\"type\": \"relevant\", \"value\": \"previous\"}', '*');\r\n this.relevants.update(r => ({ ...r, hit: i }));\r\n }\r\n\r\n /**\r\n * Scrolls to a specific relevant anchor inside the document, or opens it in a new tab.\r\n * @param item - The anchor item to navigate to.\r\n */\r\n protected gotoRelevant(item: ClipperDocumentAnchorInfo): void {\r\n if (item.type === 20) {\r\n window.open(\r\n this.clipperService.serviceUri +\r\n '/documents/render/item/?theme=' + this.dialogData.theme + '&id=' + item.documentId,\r\n '_blank'\r\n );\r\n } else {\r\n const f = document.getElementById('clipper-document-iframe') as any;\r\n f?.contentWindow.postMessage('{\"type\": \"relevant\", \"value\": \"' + item.uri + '\"}', '*');\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n /**\r\n * Fetches and renders full-text relevant anchors for the current document and query.\r\n */\r\n private updateRelevants(): void {\r\n const query = this.lastQuery;\r\n if (!query || query.length === 0 || query === ' ') {\r\n this.handleRelevantsPaneVisibility();\r\n return;\r\n }\r\n const doc = this.lastDocument();\r\n const docId = doc?.documentId ?? doc?.id;\r\n if (!docId) return;\r\n\r\n const params = new ClipperSearchParams();\r\n params.id = docId;\r\n params.text = query;\r\n params.count = 1;\r\n\r\n this.clipperService.query(params).subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else if (r.value?.items && r.value.items.length > 0) {\r\n const anchors = r.value.items[0].anchors;\r\n let minScore = 10;\r\n let maxScore = 0;\r\n anchors.forEach(n => {\r\n if (n.score < minScore) minScore = n.score;\r\n if (n.score > maxScore) maxScore = n.score;\r\n });\r\n const range = maxScore - minScore;\r\n anchors.forEach(n => {\r\n const score = range > 0 ? (n.score - minScore) / range : 0;\r\n n.score = score;\r\n n.veryRelevant = score > 0.7;\r\n });\r\n this.relevants.update(r => ({ ...r, items: anchors }));\r\n this.hasRelevants.set(anchors.length > 0);\r\n }\r\n this.handleRelevantsPaneVisibility();\r\n });\r\n }\r\n\r\n /**\r\n * Updates the relevant anchors list from chunk-based hit data received from the iframe.\r\n * @param anchors - Array of chunk hit data to convert into anchor items.\r\n */\r\n private updateRelevants2(anchors?: ClipperDocumentRelevantChunkHit[]): void {\r\n if (!anchors?.length) return;\r\n const items: ClipperDocumentAnchorInfo[] = anchors.map(a => ({\r\n score: ClipperSearchUtils.getRankFromChar(a.score),\r\n veryRelevant: a.score.toUpperCase() === 'A',\r\n title: a.text,\r\n uri: a.uri ?? '__CHUNK_' + a.index,\r\n }));\r\n this.relevants.update(r => ({ ...r, items }));\r\n this.hasRelevants.set(items.length > 0);\r\n this.handleRelevantsPaneVisibility();\r\n }\r\n\r\n /**\r\n * Opens the document structure index dialog and scrolls to or opens the selected section.\r\n * @param documentId - The id of the document whose index to display.\r\n */\r\n protected index(documentId: string): void {\r\n import('../document-index/document-index.component').then(({ ClipperDocumentIndexComponent }) => {\r\n const d = this.dialogService.open(ClipperDocumentIndexComponent, {\r\n ariaLabel: 'indice documento',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: true,\r\n closeOnNavigation: false,\r\n data: {\r\n documentId: documentId,\r\n excludedTypes: null,\r\n multiple: false\r\n },\r\n minWidth: '375px',\r\n maxWidth: '600px',\r\n width: '100%',\r\n });\r\n d.componentInstance.done\r\n .subscribe((r: ClipperDocumentIndexDialogResult) => {\r\n const item = r.data.length > 0 ? r.data[0] : null;\r\n if (item) {\r\n if (item.documentId === documentId) {\r\n const f = document.getElementById('clipper-document-iframe') as any;\r\n f?.contentWindow.postMessage('{\"type\": \"goto\", \"value\":\"' + item.uri + '\"}', '*');\r\n } else {\r\n this.openDocument(item.documentId + '#' + item.uri);\r\n }\r\n }\r\n d.close();\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Extracts the value of a named query-string parameter from a URL.\r\n * @param url - The URL string to search.\r\n * @param name - The parameter name to look for. Defaults to 'id'.\r\n * @returns The extracted parameter value.\r\n */\r\n private getId(url: string, name: string = 'id'): string {\r\n const start = url.lastIndexOf(name + '=') + 3;\r\n const end = url.indexOf('&', start);\r\n return url.substring(start, end);\r\n }\r\n\r\n /**\r\n * Previews or downloads a file identified by a render URL.\r\n * Opens a preview dialog when the file supports embedding, otherwise triggers a browser download.\r\n * @param url - The file render URL to preview.\r\n */\r\n private previewFile(url: string): void {\r\n if (!url || url.length === 0) return;\r\n const id = this.getId(url);\r\n if (!id || id.length === 0) return;\r\n this.clipperService.newOTP(id).subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else if (!r.value.canPreview) {\r\n location.href = url;\r\n } else {\r\n this.dialogService.open(FilePreviewComponent, {\r\n panelClass: 'preview-panel',\r\n ariaLabel: 'anteprima',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: true,\r\n data: { url, embed: r.value.canEmbed },\r\n minWidth: '375px',\r\n maxWidth: '900px',\r\n width: '100%',\r\n height: '100%'\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Loads and displays the editorial comment associated with the current document.\r\n */\r\n protected showComment(): void {\r\n const doc = this.lastDocument();\r\n if (doc?.bag?.[7] !== 'T') return;\r\n this.clipperService.comment(doc.documentId).subscribe(r => {\r\n if (!r.success) {\r\n if (r.message === \"Il tuo abbonamento non consente di visualizzare i commenti alle norme.\")\r\n this.dialogService.error(\"Il servizio di <b>commenti alle norme</b> non è compreso nel tuo abbonamento, per maggiori informazioni rivolgersi all'agente commerciale di riferimento o inviare una mail a <a href='mailto:sales@arsedizioni.it' target='_blank'>sales@arsedizioni.it</a>.\", null, \"Attenzione\");\r\n else\r\n this.dialogService.error(r.message);\r\n } else {\r\n if (r.value && r.value.length > 1) {\r\n this.dialogService.info(\r\n r.value.replace(/<\\/p><br>\\r\\n/g, '</p>\\r\\n'),\r\n \"Commento\",\r\n \"Chiudi\",\r\n 700);\r\n } else\r\n this.dialogService.info(\"Commento non più disponibile o in fase di revisione.\");\r\n }\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Opens a document, either inline or in a new browser tab.\r\n * @param documentId - The id of the document to open.\r\n * @param query - Optional free-text query for highlight.\r\n * @param queryChunks - Optional chunk offsets for semantic highlight.\r\n * @param newWindow - When true, opens the document in a new browser tab.\r\n */\r\n override open(documentId: string, query?: string, queryChunks?: string, newWindow?: boolean): void {\r\n if (!newWindow) {\r\n if (this.opening) this.opening.emit(documentId);\r\n else this.openDocument(documentId, query, queryChunks);\r\n } else {\r\n window.open((this.clipperService.appUri ?? '') + '/documento/' + documentId, '_blank');\r\n }\r\n }\r\n\r\n /**\r\n * Opens a document inline via the {@link ClipperDocumentsUtils} helper.\r\n * @param documentId - The id of the document to open.\r\n * @param query - Optional free-text query for highlight.\r\n * @param queryChunks - Optional chunk offsets for semantic highlight.\r\n */\r\n private openDocument(documentId: string, query?: string, queryChunks?: string): void {\r\n if (!documentId) return;\r\n ClipperDocumentsUtils.openDocument(\r\n this.injector,\r\n documentId,\r\n query,\r\n queryChunks,\r\n this.dialogData.selectionMode,\r\n this.dialogData.selectableModules,\r\n this.dialogData.theme,\r\n this.dialogData.canUseArchive,\r\n this.dialogData.canUseNotes,\r\n this.dialogData.canHandleTooManyResults\r\n );\r\n }\r\n\r\n /**\r\n * Opens the references panel for the given document.\r\n * @param documentId - The id of the document whose references to display.\r\n * @param mode - The reference query mode. Defaults to ReferencesIn.\r\n * @param model - Optional document model filter.\r\n * @param anchor - Optional anchor id to highlight.\r\n * @param anchorTitle - Optional anchor title to display.\r\n * @param update - When true, triggers a refresh of the references list. Defaults to true.\r\n */\r\n override openReferences(\r\n documentId: string,\r\n mode: ClipperQueryReferencesMode = ClipperQueryReferencesMode.ReferencesIn,\r\n model: number | null = null,\r\n anchor: string | null = null,\r\n anchorTitle: string | null = null,\r\n update: boolean = true\r\n ): void {\r\n import('../references/references.component').then(({ ClipperReferencesComponent }) => {\r\n this.dialogService.open(ClipperReferencesComponent, {\r\n ariaLabel: 'riferimenti legati al documento',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: true,\r\n closeOnNavigation: false,\r\n data: {\r\n documentId: documentId ?? this.lastDocument()?.documentId,\r\n mode,\r\n model,\r\n anchor,\r\n anchorTitle,\r\n update,\r\n canUseArchive: this.dialogData.canUseArchive,\r\n canUseNotes: this.dialogData.canUseNotes,\r\n canHandleTooManyResults: this.dialogData.canHandleTooManyResults\r\n },\r\n minWidth: '375px',\r\n maxWidth: '1200px',\r\n width: '100%',\r\n height: '100%',\r\n }).afterClosed()\r\n .subscribe((r: ClipperReferenceDialogResult) => {\r\n if (r?.documentId) {\r\n this.navigate(r.documentId);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Opens the report viewer for the given document when supported by its model.\r\n * @param item - The document whose report to display.\r\n */\r\n protected displayReport(item: ClipperDocumentInfo): void {\r\n if (!item) return;\r\n if (item.model != ClipperModel.NormativaVigente && item.model != ClipperModel.Scadenze) {\r\n this.dialogService.info(\"Questa funzionalità non è disponibile per questo tipo di documento.\");\r\n return;\r\n }\r\n this.openReport(item.id, item.title1 ? item.title1 : item.title2);\r\n }\r\n\r\n /**\r\n * Determines whether the current document satisfies the dialog's selection constraints.\r\n * @returns True when the document can be selected and confirmed.\r\n */\r\n protected canSelect(): boolean {\r\n const doc = this.lastDocument();\r\n const selectionMode = this.dialogData.selectionMode ?? 0;\r\n const selectableModules = this.dialogData.selectableModules;\r\n if (!doc || selectionMode === 0) return false;\r\n if (!selectableModules?.length) {\r\n return doc.model === ClipperModel.NormativaVigente || doc.model === ClipperModel.AggiornamentoNormativo;\r\n }\r\n return selectableModules.findIndex(x => x === ClipperUtils.getClipperModuleFromModel(doc)) !== -1;\r\n }\r\n\r\n /**\r\n * Broadcasts the current document as a selection message and closes the dialog.\r\n */\r\n protected select(): void {\r\n const doc = this.lastDocument();\r\n if (doc) {\r\n this.broadcastService.sendMessage(ClipperMessages.DOCUMENT_SELECTED_INNER, doc);\r\n this.close();\r\n }\r\n }\r\n\r\n}\r\n\r\n","<div class=\"clipper-document-fixed\">\r\n <div style=\"height:6px\">\r\n @if (busy()) {\r\n <mat-progress-bar style=\"z-index:11\" mode=\"indeterminate\"></mat-progress-bar>\r\n }\r\n </div>\r\n <div>\r\n <div fxLayout=\"row\" fxLayoutGap=\"20px\" fxLayoutAlign=\"start start\" fxFill>\r\n <div fxFlex=\"*\" class=\"title-container\">\r\n <div class=\"title bold\">{{title()}}</div>\r\n @if (lastDocument()?.tags) {\r\n <div style=\"padding-top: 5px;\">\r\n <div class=\"x-small bold uppercase\">\r\n TAG: <span class=\"accent\">{{lastDocument()?.tags}}</span>\r\n </div>\r\n </div>\r\n }\r\n @if (lastDocument()?.lastUpdate) {\r\n <div style=\"padding-top: 5px;\">\r\n <div class=\"x-small bold uppercase\">\r\n AGGIORNATO A:\r\n <span class=\"accent\">{{lastDocument()?.lastUpdate}}</span>\r\n </div>\r\n </div>\r\n }\r\n @if (lastDocument()?.expiringDescription || lastDocument()?.validityInfo) {\r\n <div style=\"padding-top: 5px;\">\r\n @if (lastDocument()?.expiringDescription) {\r\n <div class=\"x-small error bold uppercase\">\r\n {{lastDocument()?.expiringDescription}}</div>\r\n }\r\n @if (lastDocument()?.validityInfo) {\r\n <div class=\"x-small error bold uppercase\"><b>Attenzione!</b>\r\n {{lastDocument()?.validityInfo}}</div>\r\n }\r\n </div>\r\n }\r\n @if((lastDocument()?.notes?.length ?? 0) > 0 ) {\r\n <div class=\"notes-container\">\r\n @for (note of lastDocument()?.notes; track note.id) {\r\n <clipper-note-badge [note]=\"note\" />\r\n }\r\n </div>\r\n }\r\n </div>\r\n @if (canSelect()) {\r\n <div fxFlex=\"170px\" fxFlex.lt-md=\"58px\">\r\n <button fxHide.lt-md fxFlexAlign=\"center\" type=\"button\" mat-flat-button (click)=\"select()\"\r\n class=\"clipper-selection-button\" style=\"margin-top: 8px;\">\r\n <span class=\"small\">Usa selezione</span>\r\n </button>\r\n <button fxHide.gt-sm fxFlexAlign=\"center\" type=\"button\" mat-icon-button (click)=\"select()\"\r\n class=\"clipper-selection-icon-button\" matTooltip=\"Usa selezione\" aria-label=\"'Usa la selezione'\"\r\n style=\"margin-top: 4px;\">\r\n <mat-icon>check</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n <div fxFlex=\"170px\" fxFlex.lt-md=\"48px\" fxLayoutAlign=\"end\">\r\n <div class=\"dialog-close\">\r\n <button fxHide.lt-md fxFlexAlign=\"start\" type=\"button\" mat-icon-button matTooltip=\"Indietro\"\r\n aria-label=\"Indietro\" (click)=\"back()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n </button>\r\n <button fxHide.lt-md fxFlexAlign=\"start\" type=\"button\" mat-icon-button matTooltip=\"Avanti\" aria-label=\"Avanti\"\r\n (click)=\"forward()\">\r\n <mat-icon>arrow_forward</mat-icon>\r\n </button>\r\n <button fxFlexAlign=\"start\" type=\"button\" mat-icon-button matTooltip=\"Chiudi\" aria-label=\"Chiudi\"\r\n (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div>\r\n <div fxLayout=\"row wrap \" fxFill fxLayoutAlign=\"space-between center\" style=\"padding: 10px 10px 10px 15px;\">\r\n <div fxFlex.xs=\"100\">\r\n @if (lastDocument()?.model === 9) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Mostra indice'\"\r\n (click)=\"index(lastDocument()?.documentId)\">\r\n Indice\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && (lastDocument()?.bag[1] ==='T' || lastDocument()?.bag[3] ==='T')) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Collegamenti\"\r\n [attr.aria-label]=\"'Collegamenti al documento'\" [matMenuTriggerFor]=\"menuLinks\">\r\n Collegamenti\r\n </button>\r\n }\r\n <mat-menu #menuLinks=\"matMenu\">\r\n @if (lastDocument()?.bag && lastDocument()?.bag[1] ==='T') {\r\n <button mat-menu-item [attr.aria-label]=\"'Mostra documenti richiamati'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 1)\">\r\n Documenti richiamati\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[3] ==='T') {\r\n <button mat-menu-item [attr.aria-label]=\"'Mostra documenti che richiamano'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 2)\">\r\n Documenti che richiamano\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[2] ==='T') {\r\n <button fxHide fxShow.lt-md mat-menu-item [attr.aria-label]=\"'Mostra juris'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 4)\">\r\n Juris\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[4] ==='T') {\r\n <button fxHide fxShow.lt-md mat-menu-item [attr.aria-label]=\"'Mostra modifiche subite'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 3)\">\r\n Modifiche subite\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[4] !=='T' && lastDocument()?.bag[6] ==='T') {\r\n <button fxHide fxShow.lt-md mat-menu-item [attr.aria-label]=\"'Mostra modifiche apportate'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 5)\">\r\n Modifiche apportate\r\n </button>\r\n }\r\n </mat-menu>\r\n @if (lastDocument()?.hasPrimary) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Mostra documento primario'\"\r\n (click)=\"navigate(lastDocument()?.primaryId)\">\r\n {{lastDocument()?.primaryDescription}}\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[2] ==='T') {\r\n <button fxFlexAlign=\"center\" type=\"button\" fxHide.lt-md mat-button [attr.aria-label]=\"'Mostra juris'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 4)\">\r\n Juris\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[4] === 'T') {\r\n <button fxFlexAlign=\"center\" type=\"button\" fxHide.lt-md mat-button [attr.aria-label]=\"'Mostra modifiche subite'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 3)\">\r\n Modifiche subite\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[4] !== 'T' && lastDocument()?.bag[6] === 'T') {\r\n <button fxFlexAlign=\"center\" type=\"button\" fxHide.lt-md mat-button\r\n [attr.aria-label]=\"'Mostra modifiche apportate'\" (click)=\"openReferences(lastDocument()?.documentId, 5)\">\r\n Modifiche apportate\r\n </button>\r\n }\r\n @if (lastDocument()?.secondaryId) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Mostra documento secondario'\"\r\n (click)=\"navigate(lastDocument()?.secondaryId)\">\r\n Testo storico\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[7] === 'T') {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Mostra commento'\"\r\n (click)=\"showComment()\">\r\n Commento\r\n </button>\r\n }\r\n </div>\r\n <div fxFlex.xs=\"100\" fxLayoutAlign=\"end\">\r\n <div fxFlexAlign=\"center\">\r\n @if (relevants().hits) {\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\">\r\n <div fxFlexAlign=\"center\" class=\"small item-greyed\" style=\"margin-left:20px; margin-right: 5px\"\r\n matTooltip=\"Parole evidenziate\">{{relevants().hit}}\r\n di {{relevants().hits}}</div>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button [attr.aria-label]=\"'Vai alla parola precedente'\"\r\n (click)=\"previousRelevant()\" matTooltip=\"Parola precedente\">\r\n <mat-icon>chevron_left</mat-icon>\r\n </button>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button [attr.aria-label]=\"'Vai alla prossima parola'\"\r\n (click)=\"nextRelevant()\" matTooltip=\"Prossima parola\">\r\n <mat-icon>chevron_right</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Azioni sul documento\"\r\n [attr.aria-label]=\"'Azioni da eseguire sul documento'\" [matMenuTriggerFor]=\"menuActions\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menuActions=\"matMenu\">\r\n <ng-template matMenuContent let-item=\"lastDocument\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"lastDocument()\" [canOpenDocument]=\"false\" [canPrint]=\"true\"\r\n [canFind]=\"true\" [isReadable]=\"false\" [canUseArchive]=\"dialogData.canUseArchive ?? false\"\r\n [canUseNotes]=\"dialogData.canUseNotes ?? false\" [isLawInForce]=\"lastDocument()?.model === 9\"\r\n selectionSource=\"none\" [canUseAIAssistant]=\"user?.hasAIAssistant ?? false\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n @if (hasRelevants() && relevants().items && relevantsPane && (!relevantsPane.opened || relevantsPaneClosed())) {\r\n <div fxFlexAlign=\"center\">\r\n <button type=\"button\" mat-icon-button matTooltip=\"Rilevanza\" aria-label=\"'Rilevanza'\"\r\n (click)=\"toggleRelevantsPane()\">\r\n <mat-icon>right_panel_open</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<mat-dialog-content id=\"clipper-document-scrollable\">\r\n <mat-drawer-container class=\"fill\" [hasBackdrop]=\"relevantsPaneHasBackdrop()\">\r\n <mat-drawer #relevantsPane position=\"end\" class=\"drawer-small drawer-with-loader\" opened=\"false\">\r\n @if (relevantsBusy()) {\r\n <div class=\"overlay\"></div>\r\n }\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"6px\">\r\n @if (relevantsBusy()) {\r\n <mat-progress-bar style=\"z-index: 11;\" mode=\"indeterminate\">\r\n </mat-progress-bar>\r\n }\r\n </div>\r\n <div fxFlex=\"78px\" class=\"title-container-with-loader\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFill>\r\n <div class=\"title\">Rilevanza</div>\r\n <div fxFlex=\"*\" fxLayoutAlign=\"end\">\r\n <button mat-icon-button (click)=\"toggleRelevantsPane()\"\r\n matTooltip=\"Nascondi\"><mat-icon>right_panel_close</mat-icon></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" class=\"relevants-container scroll-auto\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div>\r\n <p>Parti del documento più significative per la ricerca di <span\r\n class='word-hit-chunk'>{{lastQuery}}</span>\r\n </p>\r\n </div>\r\n <div fxFlex=\"*\">\r\n <nav class=\"relevants-items\">\r\n <ul>\r\n @for (item of relevants().items; track $index) {\r\n <li class=\"small\" (click)=\"gotoRelevant(item)\" [attr.aria-label]=\"item.title\"\r\n [class.bright]=\"item.score > 0.75\" [class.accent]=\"item.score > 0.75\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start start\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlex=\"*\">\r\n {{item.title}}\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n @if (item.score > 0.7) {\r\n <mat-icon style='font-size:x-small; height: 10px; width:10px'\r\n [matTooltip]=\"item.score > 0.75 ? 'Molto rilevante' : 'Più rilevante'\">thumb_up_alt</mat-icon>\r\n }\r\n </div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </nav>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-drawer>\r\n <div class=\"fill scroll-hidden\">\r\n <iframe id=\"clipper-document-iframe\" class=\"iframe\" [src]=\"url() | safeUrl\"></iframe>\r\n </div>\r\n </mat-drawer-container>\r\n</mat-dialog-content>","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n inject,\r\n signal,\r\n output,\r\n viewChild\r\n} from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { MatListModule, MatSelectionList } from '@angular/material/list';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport {\r\n ClipperDocumentAnchorInfo,\r\n ClipperService\r\n} from '@arsedizioni/ars-utils/clipper.common';\r\nimport { SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { DialogService } from '@arsedizioni/ars-utils/ui';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { finalize } from 'rxjs';\r\n\r\n\r\nexport interface ClipperDocumentIndexDialogData {\r\n documentId: string;\r\n excludedTypes?: number[];\r\n multiple?: boolean;\r\n}\r\n\r\nexport interface ClipperDocumentIndexDialogResult {\r\n data: ClipperDocumentAnchorInfo[];\r\n}\r\n\r\n@Component({\r\n host: { 'Bind': SystemUtils.generateUUID() },\r\n templateUrl: './document-index.component.html',\r\n styleUrls: ['./document-index.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [\r\n FlexLayoutModule,\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatListModule,\r\n MatTooltipModule,\r\n MatDialogActions,\r\n MatButtonModule,\r\n MatDialogClose,\r\n ],\r\n})\r\nexport class ClipperDocumentIndexComponent {\r\n readonly selection = viewChild.required<MatSelectionList>('selection');\r\n readonly done = output<ClipperDocumentIndexDialogResult>();\r\n\r\n private clipperService = inject(ClipperService);\r\n private dialogService = inject(DialogService);\r\n protected dialogData: ClipperDocumentIndexDialogData = inject(MAT_DIALOG_DATA);\r\n protected readonly items = signal<ClipperDocumentAnchorInfo[]>([]);\r\n protected readonly okDisabled = signal<boolean>(false);\r\n\r\n constructor() {\r\n if (this.dialogData?.documentId) {\r\n this.load();\r\n }\r\n }\r\n\r\n /**\r\n * Loads the document's structural index from the server and populates the item list.\r\n * Items whose type appears in {@link ClipperDocumentIndexDialogData.excludedTypes} are filtered out.\r\n * Each item's description is built from its title, or derived from its type and text when no title is set.\r\n */\r\n private load(): void {\r\n if (!this.clipperService.loggedIn()) return;\r\n this.dialogService.setBusy('Caricamento in corso...');\r\n this.clipperService.index(this.dialogData.documentId)\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n return;\r\n }\r\n const result: ClipperDocumentAnchorInfo[] = [];\r\n r.value?.items.forEach((n: ClipperDocumentAnchorInfo) => {\r\n if (this.dialogData.excludedTypes && this.dialogData.excludedTypes.indexOf(n.type) !== -1) return;\r\n if (n.title) {\r\n n.description = n.title;\r\n } else if (n.type < 3) {\r\n n.description = n.text?.trim() ?? '';\r\n } else {\r\n n.description = `${n.typeDescription?.trim() ?? ''} ${n.text?.trim() ?? ''}.`;\r\n }\r\n result.push(n);\r\n });\r\n this.items.set(result);\r\n });\r\n }\r\n\r\n /**\r\n * Updates the OK button disabled state based on whether anything is selected in the list.\r\n */\r\n protected select(): void {\r\n const selected = this.selection().selectedOptions.selected;\r\n this.okDisabled.set(selected.length === 0);\r\n }\r\n\r\n /**\r\n * Emits the current selection as the dialog result.\r\n * In single-selection mode, emits the explicitly provided item.\r\n * In multiple-selection mode, collects all selected items from the list.\r\n * @param item - The directly clicked item for single-selection mode; omit for multiple-selection mode.\r\n */\r\n protected use(item?: ClipperDocumentAnchorInfo): void {\r\n if (this.dialogData?.multiple) {\r\n if (item != null) return; // Direct-click not supported in multiple-selection mode\r\n const selected: ClipperDocumentAnchorInfo[] = this.selection()\r\n .selectedOptions.selected.map(o => o.value as ClipperDocumentAnchorInfo);\r\n if (selected.length === 0) return;\r\n this.done.emit({ data: selected });\r\n } else if (item != null) {\r\n this.done.emit({ data: [item] });\r\n }\r\n }\r\n}\r\n\r\n","<h2 mat-dialog-title>Indice</h2>\r\n<mat-dialog-content>\r\n @if (items().length === 0) {\r\n <div>\r\n <p class=\"message\"><i>Nessun elemento da visualizzare.</i></p>\r\n </div>\r\n } @else {\r\n <mat-selection-list dense #selection (selectionChange)=\"select();\" [multiple]=\"dialogData.multiple\"\r\n hideSingleSelectionIndicator=\"true\">\r\n @for (item of items(); track $index) {\r\n @if (item.type > 4) {\r\n <div class=\"small uppercase truncated accent\" style=\"display: flex; align-items: center; min-height: 36px;\">\r\n <div><b>{{item.description}}</b></div>\r\n </div>\r\n } @else {\r\n <mat-list-option [selected]=\"false\" [value]=\"item\" (click)=\"use(item)\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div [fxFlex]=\"(10 * item.level) + 'px'\"></div>\r\n <div fxFlex=\"*\" class=\"truncated\">\r\n <div class=\"small\" [matTooltip]=\"item.description\">{{item.description}}</div>\r\n </div>\r\n </div>\r\n </mat-list-option>\r\n }\r\n }\r\n </mat-selection-list>\r\n }\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\r\n @if (dialogData.multiple) {\r\n <button mat-flat-button [disabled]=\"okDisabled()\" (click)=\"use()\">Usa</button>\r\n }\r\n <button mat-stroked-button [mat-dialog-close]=\"true\" >Chiudi</button>\r\n </div>\r\n</mat-dialog-actions>","import { TextFieldModule } from \"@angular/cdk/text-field\";\r\nimport { ChangeDetectionStrategy, Component, DestroyRef, inject, output, signal } from \"@angular/core\";\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule } from \"@angular/forms\";\r\nimport { MatButtonModule } from \"@angular/material/button\";\r\nimport { MatCheckboxModule } from \"@angular/material/checkbox\";\r\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from \"@angular/material/dialog\";\r\nimport { MatFormFieldModule } from \"@angular/material/form-field\";\r\nimport { MatIconModule } from \"@angular/material/icon\";\r\nimport { MatInputModule } from \"@angular/material/input\";\r\nimport { MatSelectModule } from \"@angular/material/select\";\r\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\r\nimport { ClipperDocumentNote, ClipperService, ClipperTeamProduct, EditDialogData, NotesColors } from \"@arsedizioni/ars-utils/clipper.common\";\r\nimport { NameValueItem, SafeHtmlPipe, SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { FlexModule } from \"@ngbracket/ngx-layout/flex\";\r\nimport { ApplicationDialogService } from \"@arsedizioni/ars-utils/ui.application\";\r\n\r\n\r\n@Component({\r\n host: { 'Bind': SystemUtils.generateUUID() },\r\n templateUrl: \"./note-edit.component.html\",\r\n styleUrls: ['./note-edit.component.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n FormsModule,\r\n FlexModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n TextFieldModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatTooltipModule,\r\n MatCheckboxModule,\r\n MatDialogActions,\r\n MatDialogClose,\r\n SafeHtmlPipe,\r\n MatSelectModule\r\n ],\r\n})\r\nexport class ClipperNoteEditComponent {\r\n readonly done = output<ClipperDocumentNote>();\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly dialogService = inject(ApplicationDialogService);\r\n protected readonly dialogData: EditDialogData<ClipperDocumentNote> = inject(MAT_DIALOG_DATA);\r\n protected readonly dialogTitle = signal<string>((this.dialogData.currentItem?.id ?? 0) > 0 ? 'Modifica annotazione' : 'Nuova annotazione');\r\n private readonly clipperService = inject(ClipperService);\r\n protected readonly colors = NotesColors;\r\n protected readonly isNew = signal<boolean>(!this.dialogData?.currentItem?.id);\r\n protected readonly availableTeams = signal<NameValueItem<string>[]>([]);\r\n protected selectedTeam: NameValueItem<string> = { name: 'Nessuno, usa note personali', value: SystemUtils.emptyUUID() };\r\n protected item: ClipperDocumentNote =\r\n this.dialogData.currentItem?.id\r\n ? SystemUtils.clone(this.dialogData.currentItem)\r\n : { color: this.colors[0].value } as ClipperDocumentNote;\r\n\r\n constructor() {\r\n if (this.dialogData.currentItem?.documentId) {\r\n this.item.documentId = this.dialogData.currentItem.documentId;\r\n }\r\n if (this.dialogData.currentItem?.documentTitle) {\r\n this.item.documentTitle = this.dialogData.currentItem.documentTitle;\r\n this.dialogTitle.set(\r\n this.isNew() \r\n ? `Nuova annotazione per:<br><div class=\"small bold accent uppercase\">${this.dialogData.currentItem.documentTitle}</div>` \r\n : `Modifica annotazione per:<br><div class=\"small bold accent uppercase\">${this.dialogData.currentItem.documentTitle}</div>`);\r\n }\r\n this.loadTeams();\r\n }\r\n\r\n /**\r\n * Returns the display name for the given colour value.\r\n * @param value - The hex/CSS colour string to look up.\r\n * @returns The human-readable colour name, or the raw value when not found.\r\n */\r\n protected colorName(value: string): string {\r\n return this.colors.find(c => c.value === value)?.name ?? value;\r\n }\r\n\r\n /**\r\n * Loads the teams available for shared-workspace notes and populates the teams dropdown.\r\n * Pre-selects the team matching the current item's teamId, defaulting to \"Personale\".\r\n */\r\n private loadTeams(): void {\r\n this.clipperService\r\n .getTeams({ productId: ClipperTeamProduct.SharedNotes })\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n return;\r\n }\r\n if ((r.value?.total ?? 0) > 0) {\r\n const teams: NameValueItem<string>[] = [{ name: 'Nessuno, usa note personali', value: SystemUtils.emptyUUID() }];\r\n r.value?.items.forEach(n => teams.push({ name: n.name, value: n.value.toLowerCase() }));\r\n this.availableTeams.set(teams);\r\n this.selectedTeam = teams.find(x => x.value === this.item.teamId) ?? teams[0];\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Saves the note via the service and emits the result through the `done` output.\r\n * For new notes, assigns the selected team before saving.\r\n */\r\n protected ok(): void {\r\n if (this.isNew()) {\r\n this.item.teamId = this.selectedTeam.value;\r\n }\r\n this.clipperService.saveNote(this.item)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n this.done.emit(r.value);\r\n this.dialogService.toast(\"Operazione completata con successo.\");\r\n }\r\n });\r\n }\r\n}","<div class=\"dialog-info\">\r\n @if (f.form.invalid) {\r\n <span class=\"dialog-info-error\">Ci sono ancora dei campi obbligatori (*) non compilati.</span>\r\n } @else {\r\n <span class=\"dialog-info-ok\">Tutti i campi obbligatori (*) sono compilati.</span>\r\n }\r\n</div>\r\n<h2 mat-dialog-title [innerHTML]=\"dialogTitle() | safeHtml\"></h2>\r\n<mat-dialog-content>\r\n <form name=\"form\" #f=\"ngForm\" novalidate>\r\n <div fxLayout=\"column\" class=\"spaced\">\r\n @if (availableTeams() && availableTeams().length > 1) {\r\n <mat-form-field>\r\n <mat-label>Team</mat-label>\r\n <mat-select [(ngModel)]=\"selectedTeam\" #team=\"ngModel\" name=\"team\" required [disabled]=\"!isNew()\">\r\n @for (t of availableTeams(); track $index;) {\r\n <mat-option [value]=\"t\">\r\n {{t.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (team.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n <div fxLayout=\"row wrap\" fxLayoutAlign=\"space-between center\" fxFill>\r\n <div fxFlex=\"29\" fxFlex.xs=\"100\">\r\n <mat-form-field class=\"wide\">\r\n <mat-label>Colore</mat-label>\r\n <mat-select name=\"color\" [(ngModel)]=\"item.color\" #color=\"ngModel\" name=\"color\" required>\r\n <mat-select-trigger>\r\n @if (item.color) {\r\n <span style=\"display:inline-flex;align-items:center;gap:8px;\">\r\n <span [style.background]=\"item.color\" style=\"width:14px;height:14px;border-radius:50%;display:inline-block;flex-shrink:0;\"></span>\r\n {{ colorName(item.color) }}\r\n </span>\r\n }\r\n </mat-select-trigger>\r\n @for (c of colors; track c) {\r\n <mat-option [value]=\"c.value\">\r\n <span style=\"display:inline-flex;align-items:center;gap:8px;\">\r\n <span [style.background]=\"c.value\"\r\n style=\"width:16px;height:16px;border-radius:50%;display:inline-block;\"></span>\r\n {{ c.name }}\r\n </span>\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (color.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <div fxFlex=\"69\" fxFlex.xs=\"100\">\r\n <mat-form-field class=\"wide\">\r\n <mat-label>Etichetta</mat-label>\r\n <input matInput name=\"name\" [(ngModel)]=\"item.name\" #name=\"ngModel\" maxlength=\"100\" required />\r\n @if (name.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n <mat-hint align=\"end\">{{name.value?.length || 0}}/100 </mat-hint>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <mat-form-field>\r\n <mat-label>Note</mat-label>\r\n <textarea matInput [(ngModel)]=\"item.note\" name=\"note\" maxlength=\"1000\" #text=\"ngModel\" cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"1\" cdkAutosizeMaxRows=\"10\"></textarea>\r\n <mat-hint align=\"end\">{{text.value?.length || 0}}/1000 </mat-hint>\r\n </mat-form-field>\r\n </div>\r\n\r\n </form>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxLayoutAlign=\"end\" fxFill>\r\n <button mat-flat-button [disabled]=\"f.form.invalid\" (click)=\"ok()\">Salva</button>\r\n <button mat-stroked-button [mat-dialog-close]=\"true\">Annulla</button>\r\n </div>\r\n </div>\r\n</mat-dialog-actions>","import { Breakpoints } from '@angular/cdk/layout';\r\nimport { ChangeDetectionStrategy, Component, afterNextRender, inject, viewChild } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MAT_DIALOG_DATA, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatDrawer, MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport {\r\n ClipperDocumentInfo,\r\n ClipperQueryReferencesMode, ClipperReferencesSearchParams, ClipperSearchFacetsResult, ClipperSearchFacetsSnapshot,\r\n ClipperSearchParams,\r\n ClipperUserInfo\r\n} from '@arsedizioni/ars-utils/clipper.common';\r\nimport { ApiResult, SelectableModel, SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { finalize } from 'rxjs/operators';\r\nimport { ClipperSearchResultManager } from '../search-result-manager/search-result-manager';\r\nimport { ClipperDocumentMenuComponent } from '../document-menu/document-menu.component';\r\nimport { ClipperSearchFacetsComponent } from '../search-facets/search-facets.component';\r\nimport { ClipperSearchResultItemComponent } from '../search-result-item/search-result-item.component';\r\n\r\n\r\nexport interface ClipperReferencesDialogData {\r\n mode?: ClipperQueryReferencesMode;\r\n anchor?: string;\r\n anchorTitle?: string;\r\n documentId: string;\r\n model: number;\r\n canUseArchive?: boolean;\r\n canHandleTooManyResults?: boolean;\r\n}\r\n\r\nexport interface ClipperReferenceDialogResult {\r\n documentId: string;\r\n}\r\n\r\n@Component({\r\n host: { 'Bind': SystemUtils.generateUUID() },\r\n templateUrl: './references.component.html',\r\n styleUrls: ['./references.component.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n FlexLayoutModule,\r\n MatDialogTitle,\r\n MatButtonModule,\r\n MatTooltipModule,\r\n MatIconModule,\r\n MatCheckboxModule,\r\n MatSlideToggleModule,\r\n FormsModule,\r\n MatMenuModule,\r\n MatBadgeModule,\r\n MatPaginatorModule,\r\n MatDialogContent,\r\n MatSidenavModule,\r\n MatProgressBarModule,\r\n ClipperDocumentMenuComponent,\r\n ClipperSearchFacetsComponent,\r\n ClipperSearchResultItemComponent,\r\n ],\r\n})\r\nexport class ClipperReferencesComponent extends ClipperSearchResultManager {\r\n readonly filterPane = viewChild<MatDrawer>('filterPane');\r\n\r\n private readonly dialogRef = inject(MatDialogRef<ClipperReferencesComponent>);\r\n protected readonly dialogData: ClipperReferencesDialogData = inject(MAT_DIALOG_DATA) ?? { mode: ClipperQueryReferencesMode.ReferencesIn };\r\n protected title?: string;\r\n protected item?: ClipperDocumentInfo;\r\n protected readonly user: ClipperUserInfo | undefined = this.clipperService.loginInfo?.context;\r\n private _viewReady = false;\r\n\r\n constructor() {\r\n super();\r\n if (this.dialogData) {\r\n switch (this.dialogData.mode) {\r\n case ClipperQueryReferencesMode.ReferencesIn:\r\n this.title = \"Documenti richiamati nelle note o nel testo\";\r\n break;\r\n case ClipperQueryReferencesMode.ReferencesOut:\r\n this.title = \"Documenti che richiamano quello in visione\";\r\n break;\r\n case ClipperQueryReferencesMode.ChangesIn:\r\n this.title = \"Modifiche subite\";\r\n break;\r\n case ClipperQueryReferencesMode.ChangesOut:\r\n this.title = \"Modifiche apportate\";\r\n break;\r\n case ClipperQueryReferencesMode.Juris:\r\n this.title = \"Giurisprudenza associata\";\r\n break;\r\n }\r\n if (this.dialogData.anchorTitle) {\r\n this.title += \" - \" + this.dialogData.anchorTitle;\r\n }\r\n // Use service snapshot\r\n this.snapshot = this.clipperService.referencesSnapshot() ?? { searchParams: new ClipperSearchParams(), interval: \"-1\" };\r\n if (\r\n this.filterParams.mode !== this.dialogData.mode ||\r\n this.filterParams.id !== this.dialogData.documentId ||\r\n this.filterParams.anchor !== this.dialogData.anchor\r\n ) {\r\n this.filterParams = new ClipperSearchParams();\r\n this.filterParams.mode = this.dialogData.mode;\r\n this.filterParams.model = this.dialogData.model;\r\n this.filterParams.anchor = this.dialogData.anchor;\r\n this.filterParams.id = this.dialogData.documentId;\r\n this.filterParams.useModifierInfo = this.dialogData.mode === ClipperQueryReferencesMode.ChangesOut;\r\n this.filterParams.returnModifierInfo = this.dialogData.mode !== ClipperQueryReferencesMode.ChangesOut;\r\n this.clipperService.referencesSnapshot.set(this.snapshot);\r\n }\r\n }\r\n\r\n // Initialize selection\r\n this.selection = new SelectableModel<ClipperDocumentInfo, string>(true, 'documentId');\r\n\r\n // Observe layout changes\r\n this.breakpointObserver\r\n .observe([\r\n Breakpoints.XSmall,\r\n Breakpoints.Small,\r\n Breakpoints.Medium,\r\n Breakpoints.Large,\r\n Breakpoints.XLarge,\r\n ])\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((result: any) => {\r\n if (!this._viewReady) return; // DOM not ready yet\r\n for (const query of Object.keys(result.breakpoints)) {\r\n if (result.breakpoints[query]) {\r\n this.handleFilterPaneVisibility();\r\n }\r\n }\r\n });\r\n\r\n // Run view-dependent initialization after the first render.\r\n afterNextRender(() => {\r\n this._viewReady = true;\r\n this.handleFilterPaneVisibility();\r\n const filterPane = this.filterPane();\r\n if (filterPane) {\r\n filterPane.openedChange\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(opened => {\r\n if (filterPane.mode === 'over') {\r\n this.filterPaneHasBackdrop.set(opened);\r\n }\r\n });\r\n }\r\n const facets = this.facets();\r\n if (facets) {\r\n facets.changed\r\n .subscribe((value: ClipperSearchFacetsSnapshot) => {\r\n this.snapshot.facets = value;\r\n this.fetch(true);\r\n });\r\n }\r\n this.fetch(true);\r\n this.restoreFacets();\r\n this.changeDetector.markForCheck();\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Toggles the filter pane open/closed state.\r\n */\r\n protected toggleFilterPane(): void {\r\n this.filterPaneClosed.set(!this.filterPaneClosed());\r\n this.filterPane()?.toggle();\r\n }\r\n\r\n\r\n\r\n /**\r\n * Adjusts the filter pane mode (side vs. overlay) and backdrop based on the current breakpoint.\r\n */\r\n private handleFilterPaneVisibility(): void {\r\n const filterPane = this.filterPane();\r\n if (filterPane) {\r\n if (this.breakpointObserver.isMatched(Breakpoints.XSmall) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Small) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Medium)) {\r\n if (filterPane.opened) {\r\n filterPane.close();\r\n }\r\n filterPane.mode = 'over';\r\n filterPane.disableClose = false;\r\n this.filterPaneHasBackdrop.set(filterPane.opened);\r\n } else {\r\n if (!this.hasFacets()) {\r\n filterPane.close();\r\n } else if (!filterPane.opened && !this.filterPaneClosed()) {\r\n filterPane.open();\r\n } else if (filterPane.opened && this.filterPaneClosed()) {\r\n filterPane.close();\r\n }\r\n filterPane.mode = 'side';\r\n filterPane.disableClose = true;\r\n this.filterPaneHasBackdrop.set(false);\r\n }\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Closes the references dialog without returning a result.\r\n */\r\n close(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n\r\n\r\n /**\r\n * Sends document links by email for the given item or, when omitted, for all selected items.\r\n * @param item - The specific document to send, or `undefined` to use the current selection.\r\n */\r\n sendTo(item?: ClipperDocumentInfo): void {\r\n this.sendItemsTo(item ? [item] : this.selection?.all);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Builds the search parameters for the next fetch call.\r\n * @param newSearch - When `true`, resets the pagination offset to 0.\r\n * @returns A cloned and enriched `ClipperSearchParams` ready to be sent to the API.\r\n */\r\n private prepareFetch(newSearch: boolean = false): ClipperSearchParams {\r\n const newParams = SystemUtils.clone(this.filterParams) as ClipperSearchParams;\r\n newParams.count = 15;\r\n newParams.useModifierInfo =\r\n newParams.mode === ClipperQueryReferencesMode.ChangesOut;\r\n newParams.returnModifierInfo =\r\n newParams.mode !== ClipperQueryReferencesMode.ChangesOut;\r\n // New search, reset paging\r\n if (newSearch) {\r\n newParams.first = 0;\r\n this.filterParams.first = 0;\r\n }\r\n\r\n // Apply facets\r\n if (this.snapshot.facets?.fromDate) {\r\n newParams.fromDate = this.snapshot.facets?.fromDate;\r\n newParams.toDate = this.snapshot.facets?.toDate;\r\n newParams.year = this.snapshot.facets?.fromDate.getFullYear();\r\n }\r\n if (this.snapshot.facets?.sector) {\r\n newParams.sector = this.snapshot.facets?.sector;\r\n }\r\n if (this.snapshot.facets?.type) {\r\n newParams.type = this.snapshot.facets?.type;\r\n }\r\n if (this.snapshot.facets?.author) {\r\n newParams.author = this.snapshot.facets?.author;\r\n }\r\n return newParams;\r\n }\r\n\r\n /**\r\n * Maps a generic `ClipperSearchParams` to the references-specific API parameter shape.\r\n * @param params - The base search parameters to convert.\r\n * @returns A `ClipperReferencesSearchParams` object ready for the references endpoint.\r\n */\r\n private toReferencesSearchParams(params: ClipperSearchParams): ClipperReferencesSearchParams {\r\n return {\r\n documentId: params.id,\r\n year: params.year,\r\n sector: params.sector,\r\n author: params.author,\r\n anchor: params.anchor,\r\n model: params.model?.toString() ?? null,\r\n mode: params.mode,\r\n excludeTextReferences: params.excludeTextReferences,\r\n excludeNotesReferences: params.excludeNotesReferences,\r\n returnModifierInfo: params.returnModifierInfo,\r\n useModifierInfo: params.useModifierInfo,\r\n count: 15,\r\n first: params.first ?? 0\r\n }\r\n }\r\n\r\n /**\r\n * Executes the references search and updates the result snapshot.\r\n * @param newSearch - When `true`, resets pagination and reloads facets. Defaults to `false`.\r\n */\r\n fetch(newSearch: boolean = false): void {\r\n if (!this.clipperService.loggedIn()) return;\r\n this.dialogService.busy('Ricerca in corso...');\r\n const searchParams = this.prepareFetch(newSearch);\r\n if (searchParams) {\r\n this.clipperService.references(this.toReferencesSearchParams(searchParams))\r\n .pipe(finalize(() => this.dialogService.clearBusy()))\r\n .subscribe(r => {\r\n if (!r.success) this.dialogService.error(r.message);\r\n else {\r\n this.prepareResults(r.value, newSearch);\r\n\r\n // Handle facets\r\n if (this.snapshot.total > 0) {\r\n if (newSearch)\r\n // Update facets\r\n this.fetchFacets(searchParams);\r\n } else {\r\n this.hideFacets();\r\n }\r\n\r\n if (newSearch) {\r\n const paginator = this.paginator();\r\n if (paginator) paginator.pageIndex = 0;\r\n }\r\n\r\n this.scroll(0);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Navigates to the next result page.\r\n * @param e - The `PageEvent` emitted by the paginator with the new page index and size.\r\n */\r\n fetchMore(e: PageEvent): void {\r\n const first = e.pageIndex * (this.filterParams.count ?? 15);\r\n this.filterParams.first = first;\r\n this.fetch();\r\n }\r\n\r\n /**\r\n * Loads available facets for the current search parameters and updates the filter pane.\r\n * @param params - The search parameters used to request facets from the API.\r\n */\r\n fetchFacets(params: ClipperSearchParams): void {\r\n if (!this.clipperService.loggedIn() || !params) return;\r\n if (!this.snapshot.facets || this.snapshot.facets?.hasMoreFacets) {\r\n this.filterBusy.set(true);\r\n this.clipperService.referencesFacets(this.toReferencesSearchParams(params))\r\n .subscribe({\r\n next: (r: ApiResult<ClipperSearchFacetsResult>) => {\r\n if (r.success) {\r\n let hasFacets = (r.value.facets?.length ?? 0) > 0;\r\n if (r.value.facets) {\r\n const facets = this.facets();\r\n facets?.update(r.value.facets, r.value.interval);\r\n if (facets && this.snapshot) {\r\n hasFacets = facets.hasFacets();\r\n this.snapshot.facets = facets.save();\r\n this.snapshot.facets.hasTooManyResults = (this.snapshot?.total ?? 0) >= 1000;\r\n }\r\n }\r\n this.hasFacets.set(hasFacets);\r\n this.handleFilterPaneVisibility();\r\n }\r\n },\r\n complete: () => {\r\n this.filterBusy.set(false);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Hides the facet filter pane and resets all applied facet filters.\r\n */\r\n protected hideFacets(): void {\r\n this.hasFacets.set(false);\r\n this.facets()?.reset();\r\n this.filterPane().close();\r\n this.filterPaneClosed.set(false);\r\n }\r\n /**\r\n * Restores previously saved facets from the snapshot and adjusts the filter pane accordingly.\r\n */\r\n restoreFacets(): void {\r\n if (this.snapshot.facets) {\r\n this.facets().restore(this.snapshot.facets);\r\n this.handleFilterPaneVisibility();\r\n }\r\n }\r\n\r\n /**\r\n * Closes the dialog and navigates to the selected document.\r\n * @param documentId - The ID of the document to open.\r\n */\r\n override open(documentId?: string): void {\r\n if (documentId) this.dialogRef.close({ documentId });\r\n }\r\n\r\n /**\r\n * Returns the CSS class reflecting the item's validity state.\r\n * @param item - The document to evaluate.\r\n * @returns A CSS class name string, or `undefined` when no special state applies.\r\n */\r\n override getItemStateCssClass(item: ClipperDocumentInfo): string | undefined {\r\n if (item.isExpired) return 'expired-bg';\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Returns the tooltip text explaining the item's current validity state.\r\n * @param item - The document to evaluate.\r\n * @returns A human-readable state description, or an empty string when no special state applies.\r\n */\r\n override getItemStateTooltip(item: ClipperDocumentInfo): string {\r\n if (item.isExpired) return 'Non più vigente';\r\n return '';\r\n }\r\n}\r\n","<div class=\"clipper-references-fixed\">\r\n <div class=\"dialog-header\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"*\">\r\n <h2 mat-dialog-title>{{title}} </h2>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"start\" type=\"button\" mat-icon-button matTooltip=\"Chiudi\" aria-label=\"Chiudi\"\r\n (click)=\"close()\" class=\"dialog-close\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n @if (dialogData.mode > 0 || selection?.hasValue() || (snapshot && snapshot.facets?.hasFacets && filterPane &&\r\n (!filterPane.opened || filterPaneClosed()))) {\r\n <div class=\"dialog-toolbar\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFill>\r\n <div fxFlex=\"*\">\r\n @if (dialogData.mode === 1) {\r\n <mat-slide-toggle name=\"excludeTextReferences\" [(ngModel)]=\"filterParams.excludeTextReferences\"\r\n (change)=\"fetch(true)\">\r\n Mostra solo se citati nelle note\r\n </mat-slide-toggle>\r\n } @else if (dialogData.mode == 2) {\r\n <mat-slide-toggle name=\"excludeNotesReferences\" [(ngModel)]=\"filterParams.excludeNotesReferences\"\r\n (change)=\"fetch(true)\">\r\n Mostra solo se citano nel testo il documento\r\n </mat-slide-toggle>\r\n }\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n @if (selection?.hasValue()) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button\r\n matTooltip=\"Azioni da eseguire sugli elementi selezionati\"\r\n [attr.aria-label]=\"'Menu opzioni per elementi selezionati'\" [matMenuTriggerFor]=\"menuSelections\"\r\n [disabled]=\"!snapshot.total\" [matBadge]=\"selection?.all?.length\">\r\n <mat-icon>checklist</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSelections=\"matMenu\">\r\n <clipper-document-menu [parent]=\"this\" selectionSource=\"selection\" [useSelections]=\"true\"\r\n [canUseArchive]=\"dialogData.canUseArchive ?? false\"\r\n [isReadable]=\"false\" [isReference]=\"true\" [canUseAIAssistant]=\"user?.hasAIAssistant ?? false\">\r\n </clipper-document-menu>\r\n </mat-menu>\r\n @if (snapshot && snapshot.facets?.hasFacets && filterPane && (!filterPane.opened || filterPaneClosed())) {\r\n <div fxFlexAlign=\"center\">\r\n <button type=\"button\" mat-icon-button matTooltip=\"Affina ricerca\" aria-label=\"'Affina ricerca'\"\r\n (click)=\"toggleFilterPane()\">\r\n <mat-icon>right_panel_open</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n<mat-dialog-content id=\"clipper-references-scrollable\">\r\n <mat-drawer-container class=\"fill\" [hasBackdrop]=\"filterPaneHasBackdrop()\">\r\n <mat-drawer #filterPane position=\"end\" class=\"drawer-small drawer-with-loader\" opened=\"false\">\r\n @if (filterBusy()) {\r\n <div class=\"overlay\"></div>\r\n }\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"6px\">\r\n @if (filterBusy()) {\r\n <mat-progress-bar style=\"z-index: 11;\" mode=\"indeterminate\">\r\n </mat-progress-bar>\r\n }\r\n </div>\r\n <div fxFlex=\"78px\" class=\"title-container-with-loader\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFill>\r\n <div class=\"title\">Affina ricerca</div>\r\n <div fxFlex=\"*\" fxLayoutAlign=\"end\">\r\n <button mat-icon-button (click)=\"toggleFilterPane()\"\r\n matTooltip=\"Nascondi\"><mat-icon>right_panel_close</mat-icon></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" class=\"scroll-hidden\" style=\"padding: 0 5px;\">\r\n <clipper-search-facets #facets [handleTooManyResults]=\"dialogData.canHandleTooManyResults\" ></clipper-search-facets>\r\n </div>\r\n </div>\r\n </mat-drawer>\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"*\" [id]=\"scrollerId\" class=\"scroll-auto\" style=\"padding: 0 5px;\">\r\n @if (!snapshot.total) {\r\n <div class=\"message-container\">\r\n <p class=\"message\"><b>Nessun elemento da visualizzare.</b></p>\r\n </div>\r\n } @else {\r\n <div>\r\n @for (item of snapshot.items; track $index; let i = $index) {\r\n @if (item.group) {\r\n <div class=\"items-group-title\">\r\n <div [class.group-spaced]=\"i > 0\">{{item.group}}</div>\r\n </div>\r\n }\r\n <clipper-search-result-item [item]=\"item\" [parent]=\"this\" [isReadable]=\"false\"\r\n [actions]=\"contextMenu\"></clipper-search-result-item>\r\n }\r\n <mat-menu #contextMenu=\"matMenu\" (closed)=\"updateMenuButtonsVisibility()\">\r\n <ng-template matMenuContent let-item=\"item\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"item\" [isReadable]=\"false\" [isReference]=\"true\"\r\n [canUseAIAssistant]=\"user?.hasAIAssistant ?? false\" [canUseArchive]=\"dialogData.canUseArchive ?? false\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n </div>\r\n }\r\n </div>\r\n <!-- footer -->\r\n @if ((snapshot?.total ?? 0) > 0) {\r\n <div class=\"items-footer\">\r\n <div fxLayout=\"row wrap\" fxLayoutGap=\"10px\" fxLayoutAlign=\"space-between center\" fxFill>\r\n <!-- legend -->\r\n <div fxFlex.lt-md=\"100\" class=\"legend-container\">\r\n <div class=\"legend expired-bg \"></div>\r\n non più vigente\r\n </div>\r\n <div fxFlex.lt-md=\"100\" fxLayoutAlign=\"end\" [class.wide]=\"filterPane?.opened\">\r\n <div fxLayout=\"row\">\r\n <mat-paginator fxFlexAlign=\"center\" #paginator class=\"paginator\" [hidePageSize]=\"true\"\r\n [length]=\"snapshot?.total ?? 0\" [pageSize]=\"filterParams.count ?? 15\" [showFirstLastButtons]=\"true\"\r\n (page)=\"fetchMore($event)\">\r\n </mat-paginator>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mat-drawer-container>\r\n</mat-dialog-content>","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, input, signal, output, viewChild } from '@angular/core';\r\nimport { DateInterval } from '@arsedizioni/ars-utils/core';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { FlexModule } from '@ngbracket/ngx-layout/flex';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatCalendar, MatCalendarCellClassFunction } from '@angular/material/datepicker';\r\nimport { endOfDay, endOfMonth, startOfMonth, startOfToday, subDays } from 'date-fns';\r\nimport { CalendarEmptyHeader } from '@arsedizioni/ars-utils/ui.application';\r\nimport { ClipperSearchCalendarSnapshotMonth, ClipperSearchCalendarSnapshotResult } from '@arsedizioni/ars-utils/clipper.common';\r\n\r\n\r\n\r\n@Component({\r\n selector: 'clipper-search-calendar',\r\n templateUrl: './search-calendar.component.html',\r\n styleUrls: ['./search-calendar.component.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n FlexModule,\r\n MatButtonModule,\r\n MatTooltipModule,\r\n MatCalendar,\r\n MatChipsModule,\r\n MatIconModule,\r\n MatDividerModule,\r\n MatExpansionModule\r\n ],\r\n})\r\nexport class ClipperSearchCalendarComponent {\r\n readonly calendar = viewChild.required<MatCalendar<any>>('calendar');\r\n readonly changed = output<DateInterval | undefined>();\r\n private readonly changeDetector = inject(ChangeDetectorRef);\r\n\r\n protected busy = signal<boolean>(false);\r\n protected months = signal<ClipperSearchCalendarSnapshotMonth[] | undefined>(undefined);\r\n protected calendarSpecialDays?: number[];\r\n protected calendarEmptyHeader = CalendarEmptyHeader;\r\n public calendarDate: Date = startOfToday();\r\n protected calendarDateClass: MatCalendarCellClassFunction<Date> = (cellDate) => {\r\n if (!this.calendarSpecialDays) return '';\r\n if (this.calendarSpecialDays[cellDate.getDate() - 1] > 0) {\r\n if (cellDate < startOfToday()) return 'special-date-expired';\r\n else if (subDays(cellDate, 15) <= startOfToday()) return 'special-date-expiring';\r\n else return 'special-date';\r\n }\r\n return '';\r\n };\r\n protected calendarDateFilter = (cellDate: Date): boolean => {\r\n return this.canFilter() && this.calendarSpecialDays != null && this.calendarSpecialDays[cellDate.getDate() - 1] > 0;\r\n }\r\n readonly canFilter = input<boolean>(false);\r\n\r\n\r\n /**\r\n * Refreshes the calendar with a new month/days snapshot and updates the active date.\r\n * @param month - The single-month snapshot used to populate special-day highlighting.\r\n * @param months - The full year snapshot used to populate the month-selector chips.\r\n * @param date - The date the calendar should navigate to. Defaults to today.\r\n */\r\n update(month?: ClipperSearchCalendarSnapshotResult,\r\n months?: ClipperSearchCalendarSnapshotResult,\r\n date: Date = startOfToday()): void {\r\n if (months?.months) {\r\n this.months.set(months.months);\r\n }\r\n if (month && month.months && month.months.length > 0) {\r\n this.calendarSpecialDays = month.months[0].days;\r\n }\r\n const calendar = this.calendar();\r\n if (calendar) {\r\n calendar.activeDate = date;\r\n calendar.selected = date;\r\n calendar.updateTodaysDate();\r\n }\r\n this.calendarDate = date;\r\n this.changeDetector.markForCheck();\r\n }\r\n\r\n\r\n /**\r\n * Emits a `DateInterval` for the given date or, when `'month'` is passed, for the entire\r\n * current calendar month. Passing `undefined` clears the active date filter.\r\n * @param date - A specific `Date` to filter by, the string `'month'` to filter the whole\r\n * month, or `undefined` to clear the filter.\r\n */\r\n protected filterByDate(date?: Date | string): void {\r\n if (date === 'month') {\r\n if (this.calendarDate) {\r\n const today = new Date();\r\n const start = endOfDay(startOfMonth(this.calendarDate));\r\n const end = endOfMonth(this.calendarDate);\r\n this.changed.emit(new DateInterval(start, end));\r\n if (start <= today && end >= today) {\r\n const calendar = this.calendar();\r\n calendar.selected = today;\r\n calendar.updateTodaysDate();\r\n }\r\n }\r\n } else if (date) {\r\n const d = date as Date;\r\n this.changed.emit(new DateInterval(endOfDay(d), endOfDay(d)));\r\n this.calendarDate = d;\r\n const calendar = this.calendar();\r\n calendar.selected = d;\r\n calendar.updateTodaysDate();\r\n } else {\r\n this.changed.emit(undefined);\r\n }\r\n }\r\n\r\n /**\r\n * Navigates the calendar to the given month and emits its full date range as a filter.\r\n * @param monthInfo - The month snapshot to navigate to and filter by.\r\n */\r\n protected filterByMonth(monthInfo: ClipperSearchCalendarSnapshotMonth): void {\r\n const newDate = new Date(monthInfo.year, monthInfo.month - 1, 1);\r\n const today = new Date();\r\n const start = endOfDay(startOfMonth(newDate));\r\n const end = endOfMonth(newDate);\r\n this.changed.emit(new DateInterval(start, end));\r\n this.calendarSpecialDays = monthInfo.days;\r\n const calendar = this.calendar();\r\n if (start <= today && end >= today) {\r\n calendar.selected = today;\r\n }\r\n calendar.activeDate = newDate;\r\n calendar.updateTodaysDate();\r\n this.calendarDate = newDate;\r\n }\r\n}\r\n","<div fxLayout=\"column\" fxFill class=\"calendar-container scroll-hidden\">\r\n <div class=\"calendar-months\">\r\n <div>\r\n <div fxLayout=\"row wrap\" fxLayoutAlign=\"center\" fxLayoutGap=\"8px\" fxFill>\r\n @for (m of months(); track $index) {\r\n <button fxFlex=\"37px\" mat-button class=\"small uppercase\" (click)=\"filterByMonth(m)\" [disabled]=\"m.total === 0\">\r\n @if (m.expired) {\r\n <span class=\"expired\" [matTooltip]=\"m.expired + ' elementi in ritardo'\">{{m.monthShortName}}</span>\r\n } @else {\r\n <span [matTooltip]=\"m.total + ' elementi'\">{{m.monthShortName}}</span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"separator\"></div>\r\n </div>\r\n <div fxFlex=\"*\" class=\"scroll-auto\">\r\n @if (!busy()) {\r\n <mat-calendar #calendar [headerComponent]=\"calendarEmptyHeader\" [dateClass]=\"calendarDateClass\"\r\n [dateFilter]=\"calendarDateFilter\" (selectedChange)=\"filterByDate($event)\" class=\"calendar-month\">\r\n </mat-calendar>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"space-around\" style=\"padding:0 15px\">\r\n <button type=\"button\" mat-stroked-button (click)=\"filterByDate('month')\">Tutto il\r\n mese</button>\r\n </div>\r\n }\r\n </div>\r\n</div>","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { FlexModule } from '@ngbracket/ngx-layout/flex';\r\n\r\n@Component({\r\n host: { 'Bind': SystemUtils.generateUUID() },\r\n templateUrl: './search-free-text-help.component.html',\r\n styleUrls: ['./search-free-text-help.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [MatDialogTitle, MatDialogContent, MatDialogActions, FlexModule, MatButtonModule, MatDialogClose]\r\n})\r\nexport class ClipperSearchFreeTextHelpComponent{\r\n}\r\n","<h2 mat-dialog-title>Come effettuare la ricerca in testo libero</h2>\r\n<mat-dialog-content>\r\n <p>Normalmente viene sempre effettuata una ricerca per frase: tutte le parole specificate debbono essere\r\n \"ragionevolmente vicine\" (entro 5 parole) l'una dall'altra.</p>\r\n <p>La ricerca per frase di solito produce i risultati più rilevanti.</p>\r\n <p>Tuttavia è possibile istruire Clipper per eseguire ricerche differenti e più complesse.</p>\r\n <p>Tutte gli elementi che compongono la stringa di ricerca devono essere separati da virgola.</p>\r\n <ul>\r\n <li>Se un elemento è composto da più parole è una frase, altrimenti una parola</li>\r\n <li>Aggiungendo un <b style=\"font-size: 20px\">+</b> davanti all'elemento, l'elemento <b>dovrà per forza</b> essere presente nel documento\r\n </li>\r\n <li>Aggiungendo un <b style=\"font-size: 20px\">-</b> davanti all'elemento, l'elemento <b>non dovrà</b> essere presente nel documento</li>\r\n </ul>\r\n <p>Ecco alcuni esempi:</p>\r\n <ul>\r\n <li><b>serbatoi interrati</b>: sarà effettuata una ricerca per la frase \"serbatoi interrati\"</li>\r\n <li><b>serbatoi, interrati</b>: sarà effettuata una ricerca per le parole \"serbatoi\" e \"interrati\"; il risultato sarà tutti i documenti che contengono una o l'altra parola.</li>\r\n <li><b>serbatoi, +interrati</b>: sarà effettuata una ricerca per le parole \"serbatoi\" e \"interrati\"; il risultato sarà tutti i documenti che contengono necessariamente \"interrati\" ed eventualmente \"serbatoi\".</li>\r\n <li><b>serbatoi, -interrati</b>: sarà effettuata una ricerca per le parole \"serbatoi\" e \"interrati\"; il risultato sarà tutti i documenti che contengono necessariamente \"interrati\" ma non \"serbatoi\".</li>\r\n <li><b>\"serbatoi interrati\", -gas</b>: sarà effettuata una ricerca per la frase \"serbatoi interrati\" e per la parola \"gas\"; il risultato sarà tutti i documenti che contengono la frase \"serbatoi interrati\" ma non la parola \"gas\".</li>\r\n </ul>\r\n <p>Saranno mostrati per primi (più rilevanti) i documenti che rispettano in pieno la condizione.</p>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxLayoutAlign=\"end\" fxFill >\r\n <button mat-stroked-button [mat-dialog-close]=\"true\" >Chiudi</button>\r\n </div>\r\n </div>\r\n</mat-dialog-actions>\r\n","import { ChangeDetectionStrategy, Component, inject, output } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { DialogService } from '@arsedizioni/ars-utils/ui';\r\nimport { FlexModule } from '@ngbracket/ngx-layout/flex';\r\n\r\nexport interface SearchFreeTextQueryParams {\r\n query: string;\r\n}\r\n\r\n@Component({\r\n host: { 'Bind': SystemUtils.generateUUID() },\r\n templateUrl: './search-free-text-query-builder.component.html',\r\n styleUrls: ['./search-free-text-query-builder.component.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [MatDialogTitle, MatDialogContent, FormsModule, FlexModule, MatFormFieldModule, MatInputModule,\r\n MatButtonModule, MatIconModule, MatDialogActions, MatDialogClose]\r\n})\r\nexport class ClipperSearchFreeTextQueryBuilderComponent {\r\n readonly done = output<SearchFreeTextQueryParams>();\r\n\r\n private readonly dialogService = inject(DialogService);\r\n\r\n protected queryAnd: string = '';\r\n protected queryOr: string = '';\r\n protected queryNot: string = '';\r\n protected queryPhrase: string = '';\r\n protected queryStart: string = '';\r\n\r\n /**\r\n * Resets all query fields to empty strings.\r\n */\r\n protected clear(): void {\r\n this.queryAnd = '';\r\n this.queryOr = '';\r\n this.queryNot = '';\r\n this.queryPhrase = '';\r\n this.queryStart = '';\r\n }\r\n\r\n /**\r\n * Builds the Lucene-style free-text query from the current field values and emits it via `done`.\r\n * Shows an error dialog when only the NOT operator has been filled in, since it requires\r\n * at least one positive term to produce a valid query.\r\n */\r\n protected ok(): void {\r\n let query = '';\r\n const phrase = this.queryPhrase?.trim() ?? '';\r\n const and = this.queryAnd?.trim() ?? '';\r\n const or = this.queryOr?.trim() ?? '';\r\n const not = this.queryNot?.trim() ?? '';\r\n const start = this.queryStart?.trim() ?? '';\r\n\r\n // Phrase\r\n if (phrase.length > 0) {\r\n query += ` \"${phrase.replaceAll('\"', '')}\" `;\r\n }\r\n // OR — each comma-separated word is wrapped in quotes\r\n if (or.length > 0) {\r\n for (const part of or.split(',')) {\r\n if (query.length > 0) query += ' ';\r\n query += `\"${part.replaceAll('\"', '').trim()}\" `;\r\n }\r\n }\r\n // AND — each comma-separated word is prefixed with +\r\n if (and.length > 0) {\r\n for (const part of and.split(',')) {\r\n if (query.length > 0) query += ' ';\r\n query += `+\"${part.replaceAll('\"', '').trim()}\" `;\r\n }\r\n }\r\n // Starts-with — appends a wildcard suffix\r\n if (start.length > 0) {\r\n if (query.length > 0) query += ' ';\r\n query += `+\"${start.replaceAll('\"', '')}*\" `;\r\n }\r\n // NOT — each comma-separated word is prefixed with - (requires at least one positive term)\r\n if (not.length > 0) {\r\n if (query.length === 0) {\r\n this.dialogService.error(\r\n \"L'operatore di esclusione funziona solo se prima è stato inserito un valore in almeno uno degli altri quattro campi.\"\r\n );\r\n return;\r\n }\r\n for (const part of not.split(',')) {\r\n if (query.length > 0) query += ' ';\r\n query += `-\"${part.replaceAll('\"', '').trim()}\" `;\r\n }\r\n }\r\n\r\n if (query.length > 0) this.done.emit({ query: query.trim() });\r\n }\r\n}\r\n","<h2 mat-dialog-title>Trova gli elementi che contengono...</h2>\r\n<mat-dialog-content>\r\n <form name=\"form\" #f=\"ngForm\" (keyup.Enter)=\"!f.form.invalid ? ok() : null\" novalidate>\r\n <div fxLayout=\"column\" style=\"padding-bottom: 20px;\">\r\n <mat-form-field>\r\n <mat-label>Questa esatta parola o frase</mat-label>\r\n <input matInput name=\"queryPhrase\" [(ngModel)]=\"queryPhrase\" maxlength=\"200\" />\r\n @if (queryPhrase) {\r\n <a matSuffix mat-icon-button aria-label=\"Azzera\" (click)=\"queryPhrase=''\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n }\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>Tutte queste parole</mat-label>\r\n <input matInput name=\"queryAnd\" [(ngModel)]=\"queryAnd\" maxlength=\"200\" />\r\n @if (queryAnd) {\r\n <a matSuffix mat-icon-button aria-label=\"Azzera\" (click)=\"queryAnd=''\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n }\r\n <mat-hint>Separate da virgola</mat-hint>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>Una qualunque di queste parole</mat-label>\r\n <input matInput name=\"queryOr\" [(ngModel)]=\"queryOr\" maxlength=\"200\" />\r\n @if (queryOr) {\r\n <a matSuffix mat-icon-button aria-label=\"Azzera\" (click)=\"queryOr=''\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n }\r\n <mat-hint>Separate da virgola</mat-hint>\r\n </mat-form-field>\r\n <!--\r\n <mat-form-field>\r\n <mat-label>Parole che iniziano con</mat-label>\r\n <input matInput name=\"queryStart\" [(ngModel)]=\"queryStart\" maxlength=\"200\" />\r\n @if (queryStart) {\r\n <a matSuffix mat-icon-button aria-label=\"Azzera\" (click)=\"queryStart=''\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n }\r\n <mat-hint>Separate da virgola</mat-hint>\r\n </mat-form-field>\r\n -->\r\n <mat-form-field>\r\n <mat-label>Nessuna qualunque di queste parole</mat-label>\r\n <input matInput name=\"queryNot\" [(ngModel)]=\"queryNot\" maxlength=\"200\" />\r\n @if (queryNot) {\r\n <a matSuffix mat-icon-button aria-label=\"Azzera\" (click)=\"queryNot=''\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n }\r\n <mat-hint>Separate da virgola. L'operatore di esclusione funziona solo se prima è stato inserito un valore in\r\n almeno uno degli altri quattro campi. </mat-hint>\r\n </mat-form-field>\r\n </div>\r\n </form>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlex=\"30\" fxLayoutAlign=\"start\">\r\n <button type=\"button\" mat-stroked-button (click)=\"clear()\">Pulisci</button>\r\n </div>\r\n <div fxFlex=\"70\" fxLayoutAlign=\"end\">\r\n <button mat-flat-button (click)=\"ok()\">Ok</button>\r\n <button mat-stroked-button [mat-dialog-close]=\"true\">Annulla</button>\r\n </div>\r\n </div>\r\n</mat-dialog-actions>","/*\r\n * Public API Surface of ars-utils\r\n */\r\n\r\n\r\nexport * from './ui/index';\r\nexport * from './documents';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i2","i3","i4","i5","FlexModule","i6","i1","i7","i10","i12","i13","i15","finalize","i8","i9","i11"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAiBa,4BAA4B,CAAA;AAuHvC,IAAA,WAAA,GAAA;AArHiB,QAAA,IAAA,CAAA,aAAa,GAAG,SAAS,CAAiB,eAAe,oFAAC;AAC1D,QAAA,IAAA,CAAA,sBAAsB,GAAG,SAAS,CAAiB,wBAAwB,6FAAC;AAC5E,QAAA,IAAA,CAAA,gBAAgB,GAAG,SAAS,CAAiB,kBAAkB,uFAAC;AAChE,QAAA,IAAA,CAAA,eAAe,GAAG;AACjC,YAAA,IAAI,CAAC,gBAAgB;AACrB,YAAA,IAAI,CAAC,aAAa;AAClB,YAAA,IAAI,CAAC,sBAAsB;SAC5B;AAEgB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;AAC7B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;;AAGvC,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,CAAC,0FAAC;AAEvC,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAU,KAAK,oFAAC;AACrC,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAA2C,WAAW,sFAAC;AAEvF;;;AAGG;AACgB,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAA4B;AAClE,YAAA,IAAI,CAAC,mBAAmB,EAAE,CAAC;AAC3B,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;AACxB,gBAAA,QAAQ,IAAI,CAAC,eAAe,EAAE;AAC5B,oBAAA,KAAK,KAAK,EAAO,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE;AACjE,oBAAA,KAAK,WAAW,EAAE,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE;;YAEhE;AACA,YAAA,OAAO,EAAE;AACX,QAAA,CAAC,gFAAC;AAEO,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,4EAAO;QAC9B,IAAA,CAAA,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAuB;AACnC,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAU,KAAK,kFAAC;AACnC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAU,IAAI,iFAAC;AACjC,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAA2B,SAAS,sFAAC;AAC5D,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAU,KAAK,mFAAC;AACpC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;AAC/B,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAU,KAAK,qFAAC;AACtC,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAU,KAAK,oFAAC;AACrC,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAU,KAAK,kFAAC;AACnC,QAAA,IAAA,CAAA,iBAAiB,GAAG,KAAK,CAAU,KAAK,wFAAC;AAE/B,QAAA,IAAA,CAAA,cAAc,GAAY,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK;AAE/F,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAU,IAAI,+EAAC;AAC/B,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAU,IAAI,sFAAC;;QAG5B,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAC3C,IAAI,CAAC,eAAe,EAAE,KAAK,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACtE;;AAEkB,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,KAAK,KAAK,mFAAC;;AAE/D,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,kBAAkB,EAAE,8EAAC;;AAE7E,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC,MAAM,GAAG,CAAC,qFAAC;;QAEvE,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,cAAc,KAAK,IAAI;AAC9D,YAAA,IAAI,CAAC,kBAAkB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC1B;;AAEkB,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,sFAAC;;QAE/E,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAC,MAC7C,IAAI,CAAC,oBAAoB,EAAE,CAAC,KAAK,CAC/B,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,YAAY,CAChF,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAClD;;QAEkB,IAAA,CAAA,iBAAiB,GAAG,QAAQ,CAAC,MAC9C,IAAI,CAAC,oBAAoB,EAAE,CAAC,KAAK,CAC/B,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,YAAY,CAChF,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAClD;;AAEkB,QAAA,IAAA,CAAA,wBAAwB,GAAG,QAAQ,CAAC,MAAK;AAC1D,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE,KAAK,KAAK;AAAE,gBAAA,OAAO,KAAK;AAClD,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,EAAE;YACzC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,aAAa,CAAC;AACrF,QAAA,CAAC,+FAAC;;AAEiB,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC9C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,EAAE;YACtC,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,YAAY,CAAC,aAAa;AACxE,QAAA,CAAC,mFAAC;;AAEiB,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC9C,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,EAAE;YACzC,OAAO,IAAI,CAAC,UAAU,EAAE,KACtB,KAAK,CAAC,MAAM,GAAG,CAAC;AAChB,iBAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI;AAC7C,oBAAA,YAAY,CAAC,sBAAsB,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CACjF;AACH,QAAA,CAAC,mFAAC;;AAEiB,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AAChD,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,EAAE;YACzC,OAAO,IAAI,CAAC,UAAU,EAAE,KACtB,KAAK,CAAC,MAAM,GAAG,CAAC;AAChB,iBAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI;AAC7C,oBAAA,YAAY,CAAC,sBAAsB,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CACjF;AACH,QAAA,CAAC,qFAAC;;AAEiB,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC7C,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,EAAE;YACzC,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI;AACzG,QAAA,CAAC,kFAAC;QAGA,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE,KAAK,WAAW,EAAE;AAC1C,gBAAA,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE;AACvB,qBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,qBAAA,SAAS,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACjE;AACF,QAAA,CAAC,CAAC;IACJ;AAEA;;;AAGG;IACO,kBAAkB,GAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;AACf,YAAA,OAAO,IAAI,CAAC,IAAI,EAAE;QACpB;aAAO,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;AACxC,YAAA,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC5B;AACA,QAAA,OAAO,SAAS;IAClB;AAEA;;;;;AAKG;IACO,oBAAoB,GAAA;AAC5B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,IAAI,IAAI;YAAE,OAAO,CAAC,IAAI,CAAC;AACvB,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;IAC5D;AAEA;;;AAGG;IACO,kBAAkB,GAAA;QAC1B,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,KAAK,CAAC;IACpF;AAEA;;;AAGG;AACO,IAAA,WAAW,CAAC,OAAwB,EAAA;AAC5C,QAAA,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,WAAW,IAAG;AACzC,YAAA,MAAM,IAAI,GAAG,WAAW,EAAE;AAC1B,YAAA,IAAI,IAAI,EAAE,QAAQ,EAAE;gBAClB,IAAI,CAAC,SAAS,EAAE;AAChB,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YACzB;AACF,QAAA,CAAC,CAAC;QACF,OAAO,EAAE,QAAQ,EAAE;IACrB;AAEA;;;AAGG;AACO,IAAA,YAAY,CAAC,OAAuB,EAAA;AAC5C,QAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,aAAa,EAAE,aAAa,CAAC;AAC5E,QAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,aAAa,EAAE,qBAAqB,CAAC;IACtF;AAEA;;;AAGG;IACO,MAAM,GAAA;QACd,IAAI,IAAI,CAAC,IAAI,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC;AAC5D,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,EAAE;AAAE,YAAA,OAAO,CAAC;QAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,EAAE;QAC1D,IAAI,cAAc,EAAE;AAClB,YAAA,OAAO,cAAc,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC;QAC/C;AACA,QAAA,OAAO,CAAC;IACV;AAEA;;;AAGG;AACO,IAAA,OAAO,CAAC,KAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5C;AAEA;;;;AAIG;AACO,IAAA,IAAI,CAAC,IAAqC,EAAE,SAAA,GAAqB,KAAK,EAAA;AAC9E,QAAA,IAAI,IAAI,EAAE,UAAU,EAAE;AACpB,YAAA,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;QACvE;IACF;AAEA;;;;AAIG;IACO,cAAc,CAAC,IAAqC,EAAE,IAAY,EAAA;AAC1E,QAAA,IAAI,IAAI,EAAE,UAAU,EAAE;AACpB,YAAA,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;QACtD;IACF;+GApOW,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,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,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,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,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,wBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjBzC,giRAuMC,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDxLW,UAAU,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,4OAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,sRAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,kTAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,gNAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAE3E,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBARxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,cAGrB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAAA,giRAAA,EAAA;qGAI5B,eAAe,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACN,wBAAwB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAC9B,kBAAkB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEIrE,4BAA4B,CAAA;AATzC,IAAA,WAAA,GAAA;QAUW,IAAA,CAAA,OAAO,GAAG,MAAM,EAA+B;AACvC,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAEjD,QAAA,IAAA,CAAA,QAAQ,GAAgC,IAAI,2BAA2B,EAAE;AAO1E,QAAA,IAAA,CAAA,oBAAoB,GAAG,KAAK,CAAU,KAAK,2FAAC;AAoMtD,IAAA;AAzMC;;AAEG;IACI,SAAS,GAAA,EAAc,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAI9D;;;;AAIG;IACH,MAAM,CAAC,MAA+B,EAAE,QAAiB,EAAA;AACvD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,QAAQ;QACjC,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE;AACzB,YAAA,MAAM,CAAC,OAAO,CAAC,CAAC,IAAG;gBACjB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;gBAC1B,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;gBACvB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;gBACpE,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;gBAChE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;AACxB,oBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;AACxB,wBAAA,IAAI,EAAE,IAAI;AACV,wBAAA,aAAa,EAAE,IAAI;AACnB,wBAAA,wBAAwB,EAAE,IAAI;AAC9B,wBAAA,MAAM,EAAE,CAAC;AACT,wBAAA,KAAK,EAAE,KAAK;AACb,qBAAA,CAAC;gBACJ;AACF,YAAA,CAAC,CAAC;QACJ;QACA,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;QAChG,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM;AACtH,QAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;IACpC;AAIA;;;;AAIG;IACO,GAAG,CAAC,KAA8B,EAAE,IAAwB,EAAA;AACpE,QAAA,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK;AAChC,QAAA,KAAK,CAAC,wBAAwB,GAAG,IAAI,CAAC,KAAK;QAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC;AACtE,QAAA,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YACZ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;;YAEjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;AAC/E,YAAA,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE;AACnB,gBAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC;YACrD;iBAAO;gBACL,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;YACtC;QACF;QACA,IAAI,CAAC,KAAK,EAAE;IACd;AAEA;;;;AAIG;AACO,IAAA,OAAO,CAAC,KAA8B,EAAE,KAAA,GAAiB,IAAI,EAAA;AACrE,QAAA,KAAK,CAAC,aAAa,GAAG,SAAS;AAC/B,QAAA,KAAK,CAAC,wBAAwB,GAAG,SAAS;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC;AAC1E,QAAA,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YACZ,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;;YAErC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;AAC3E,YAAA,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE;AACnB,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC;YACjD;iBAAO;gBACL,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;YAClC;QACF;QACA,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,KAAK,EAAE;QACd;IACF;AAEA;;;AAGG;IACK,KAAK,GAAA;QACX,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;YACvC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAG;gBACnC,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,IAAI,EAAE;AACjC,oBAAA,IAAI,CAAC,CAAC,aAAa,EAAE;wBACnB,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;wBAC5E,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC9E;yBAAO;AACL,wBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,SAAS;AAClC,wBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS;oBAClC;gBACF;qBAAO,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,MAAM,EAAE;oBAC1C,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,aAAa,IAAI,IAAI;gBAChD;qBAAO,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,MAAM,EAAE;oBAC1C,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,aAAa,IAAI,IAAI;gBAChD;qBAAO,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,YAAY,EAAE;oBAChD,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,aAAa,IAAI,IAAI;gBAC9C;qBAAO,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,OAAO,EAAE;oBAC3C,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,aAAa,IAAI,IAAI;gBAChD;qBAAO,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,MAAM,EAAE;oBAC1C,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,aAAa,IAAI,IAAI;gBAChD;AACF,YAAA,CAAC,CAAC;QACJ;QACA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACnC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAG;gBAC/B,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,IAAI,EAAE;AACjC,oBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,SAAS;AAClC,oBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS;gBAClC;qBAAO,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,MAAM,EAAE;AAC1C,oBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS;gBAClC;qBAAO,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,MAAM,EAAE;AAC1C,oBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS;gBAClC;qBAAO,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,YAAY,EAAE;AAChD,oBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,SAAS;gBAChC;qBAAO,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,OAAO,EAAE;AAC3C,oBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS;gBAClC;qBAAO,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,MAAM,EAAE;AAC1C,oBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS;gBAClC;AACF,YAAA,CAAC,CAAC;QACJ;QACA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;IAClC;AAEA;;;;AAIG;IACO,KAAK,CAAC,KAAA,GAAgB,CAAC,CAAC,EAAA;QAChC,IAAI,SAAS,GAAG,CAAC;;QAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC;AACxF,QAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAG;YACnB,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,IAAI,EAAE;AACjC,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,SAAS;AAClC,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS;YAClC;iBAAO,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,MAAM,EAAE;AAC1C,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS;YAClC;iBAAO,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,MAAM,EAAE;AAC1C,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS;YAClC;iBAAO,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,YAAY,EAAE;AAChD,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,SAAS;YAChC;iBAAO,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,OAAO,EAAE;AAC3C,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS;YAClC;iBAAO,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,MAAM,EAAE;AAC1C,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS;YAClC;AACA,YAAA,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC;AACtB,YAAA,SAAS,EAAE;AACb,QAAA,CAAC,CAAC;QACF,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QAClC;AACA,QAAA,OAAO,SAAS;IAClB;AAEA;;AAEG;IACH,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,EAAE;AAC7B,QAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,KAAK;AAC/B,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,SAAS;AAClC,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS;AAChC,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS;AAChC,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS;AAChC,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS;AAChC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,SAAS;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS;IAClC;AAEA;;;AAGG;AACH,IAAA,OAAO,CAAC,IAAiC,EAAA;QACvC,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,YAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;QACpC;IACF;AAEA;;;AAGG;IACH,IAAI,GAAA;QACF,OAAO,IAAI,CAAC,QAAQ;IACtB;+GA9MW,4BAA4B,EAAA,IAAA,EAAA,EAAA,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,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzBzC,k+EAuDM,EAAA,MAAA,EAAA,CAAA,+heAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDjCMC,YAAU,+hGAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,GAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,GAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpF,gBAAgB,oIAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAE3B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBATxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,cAGrB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAACD,YAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa;wBACpF,gBAAgB,EAAE,kBAAkB,CAAC,EAAA,QAAA,EAAA,k+EAAA,EAAA,MAAA,EAAA,CAAA,+heAAA,CAAA,EAAA;;;MER5B,sBAAsB,CAAA;AALnC,IAAA,WAAA,GAAA;QAMa,IAAA,CAAA,gBAAgB,GAAG,MAAM,EAAsB;AACrC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;AAChC,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACpC,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC3C,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAChD,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAU,KAAK,oFAAC;AACtC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAU,KAAK,kFAAC;AACpC,QAAA,IAAA,CAAA,uBAAuB,GAAG,MAAM,CAAU,KAAK,8FAAC;AAChD,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAU,KAAK,0FAAC;AA2dlE,IAAA;AAxdG;;;AAGG;AACH,IAAA,SAAS,CAAC,IAAyB,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;YAAE;AACrC,QAAA,IAAI,CAAC,IAAI;YAAE;AACX,QAAA,IAAI,CAAC;AACA,aAAA,OAAO,CAAC,0BAA0B,EAAE,aAAa;aACjD,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAkB,KAAI;AACxD,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE;gBACtB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,UAAU;AACrC,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,0BAA0B,CAAC;AACnD,gBAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE;AAC3B,qBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;qBACnD,SAAS,CAAC,CAAC,IAAG;AACX,oBAAA,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;AAC3C,gBAAA,CAAC,CAAC;YACV;AACJ,QAAA,CAAC,CAAC;IACV;AAEA;;;;;AAKG;AACH,IAAA,WAAW,CACP,WAAiC,EACjC,eAAgD,SAAS,EACzD,SAAiB,CAAC,EAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;YAAE;AACrC,QAAA,MAAM,KAAK,GAAiC,EAAE,GAAG,EAAE,WAAW,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;AACnG,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;AACtC,YAAA,KAAK,CAAC,KAAK,GAAG,YAAY;QAC9B;AACA,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,yBAAyB,CAAC;AAClD,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK;AAC3B,aAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;aACnD,SAAS,CAAC,CAAC,IAAG;AACX,YAAA,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAkB,EAAE;gBAC/B,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;YAC7E;iBAAO;AACH,gBAAA,IAAI,MAAM,KAAK,CAAC,EAAE;AACd,oBAAA,MAAM,CAAC,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,EAAE,gBAAgB,CAAC,GAAG,MAAM,CAAC;gBACxF;qBAAO;AACH,oBAAA,MAAM,CAAC,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,EAAE,gBAAgB,CAAC,GAAG,MAAM,CAAC;gBAC1F;YACJ;AACJ,QAAA,CAAC,CAAC;IACV;AAEA;;;AAGG;AACH,IAAA,cAAc,CAAC,IAAyB,EAAA;AACpC,QAAA,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACrD;AAEA;;;AAGG;AACH,IAAA,YAAY,CAAC,KAA4B,EAAA;QACrC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,mBAAmB,EAAE,KAAK,CAAC;IACjF;AAEA;;;AAGG;AACH,IAAA,aAAa,CAAC,IAAyB,EAAA;QACnC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,oBAAoB,EAAE,IAAI,CAAC;IACjF;AAEA;;;AAGG;AACH,IAAA,0BAA0B,CAAC,KAA4B,EAAA;QACnD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,mBAAmB,EAAE,KAAK,CAAC;IACjF;AAEA;;;AAGG;AACH,IAAA,aAAa,CAAC,KAA4B,EAAA;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;YAAE;QACrC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IAC7E;AAEA;;;AAGG;AACH,IAAA,YAAY,CAAC,IAAyB,EAAA;QAClC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,iBAAiB,EAAE,IAAI,CAAC;IAC9E;AAGA;;;AAGG;AACH,IAAA,uBAAuB,CAAC,IAAyB,EAAA;QAC7C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,YAAY,CAAC,aAAa;YAAE;AACxD,QAAA,IAAI,IAAI,GACJ,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI;AACnC,aAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;QACvD,IAAI,IAAI,CAAC,MAAM;YACX,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC;QAC/C,IAAI,IAAI,IAAI;QACZ,IAAI,IAAI,CAAC,MAAM;AACX,YAAA,IAAI,IAAI,IAAI,CAAC,MAAM;QACvB,IAAI,IAAI,IAAI;AACZ,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACjE;AAAO,aAAA,IAAI,IAAI,CAAC,IAAI,EAAE;AAClB,YAAA,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD;QACA,IAAI,IAAI,IAAI;QACZ,IAAI,IAAI,CAAC,iBAAiB;AACtB,YAAA,IAAI,IAAI,IAAI,CAAC,iBAAiB;AAClC,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,iCAAiC,CAAC;IAC/D;AAEA;;;AAGG;AACH,IAAA,QAAQ,CAAC,IAAyB,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI;YAAE;QACX,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,UAAU;AACrC,QAAA,IAAI,CAAC,EAAE;YAAE;AACT,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC;AAClB,cAAE,UAAU,GAAG,IAAI,CAAC,WAAW,GAAG;cAChC,EAAE;AACR,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC;cACd,CAAA,SAAA,EAAY,IAAI,CAAC,MAAM,CAAA,GAAA,EAAM,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAA,IAAA;cACzD,EAAE;AACR,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC;AAChB,cAAE,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG;cACnD,EAAE;AACR,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC;AAClB,cAAE,yBAAyB,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG;cACnF,EAAE;QACR,MAAM,OAAO,GACT,wFAAwF;YACxF,kMAAkM;YAClM,2DAA2D;YAC3D,4BAA4B;YAC5B,qCAAqC;YACrC,EAAE;YACF,QAAQ;YACR,MAAM;YACN,MAAM;YACN,mBAAmB;YACnB,QAAQ;YACR,MAAM;YACN,MAAM;YACN,QAAQ;AACZ,YAAA,MAAM;QAEN,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC;IAC5D;AAEA;;;AAGG;AACH,IAAA,WAAW,CAAC,KAA4B,EAAA;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;YAAE;AACrC,QAAA,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,qBAAqB,EAAE;AACrD,YAAA,SAAS,EAAE,2BAA2B;AACtC,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,iBAAiB,EAAE,KAAK;AACxB,YAAA,IAAI,EAAE;AACF,gBAAA,IAAI,EAAC,2GAA2G;gBAChH,KAAK,EAAE,KAAK,CAAC,MAAM;AACnB,gBAAA,WAAW,EAAE,IAAI,CAAC,mBAAmB,EAAE;AAC1C,aAAA;AACD,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,KAAK,EAAE,MAAM;AAChB,SAAA,CAAC;QACF,CAAC,CAAC,iBAAiB,CAAC;aACf,SAAS,CAAC,IAAI,IAAG;AACd,YAAA,MAAM,MAAM,GAAsC;gBAC9C,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,gBAAA,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI;aACZ;AACtC,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC;AAC5C,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM;AAC5B,iBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;iBACnD,SAAS,CAAC,CAAC,IAAG;AACX,gBAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;oBACZ,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;gBACvC;qBAAO;AACH,oBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,gCAAgC,CAAC;oBAC1D,CAAC,CAAC,KAAK,EAAE;gBACb;AACJ,YAAA,CAAC,CAAC;AACV,QAAA,CAAC,CAAC;QACN,CAAC,CAAC,iBAAiB,CAAC;aACf,SAAS,CAAC,IAAI,IAAG;AACd,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;AACpC,QAAA,CAAC,CAAC;IACV;AAEA;;;;AAIG;IACH,UAAU,CAAC,UAAkB,EAAE,KAAc,EAAA;AACzC,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;YAAE;AACrC,QAAA,IAAI,CAAC,UAAU;YAAE;AACjB,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU;AAChC,aAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;aACnD,SAAS,CAAC,CAAC,IAAG;AACX,YAAA,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,KAAK,GAAG,UAAU,IAAI,OAAO,CAAC;AACrD,QAAA,CAAC,CAAC;IACV;AAEA;;;;;;AAMG;AACH,IAAA,IAAI,CACA,WAAoB,EACpB,MAAe,EACf,YAAqB,EACrB,UAAoB,EAAA;IACxB;AAEA;;;AAGG;AACH,IAAA,MAAM,CAAC,IAAyB,EAAA;AAC5B,QAAA,IAAI,CAAC,IAAI;YAAE;AACX,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,YAAY,CAAC,gBAAgB,IAAI,IAAI,CAAC,KAAK,KAAK,YAAY,CAAC,QAAQ,EAAE;AACtF,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,qEAAqE,CAAC;YAC9F;QACJ;aAAO;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;QACjD;IACJ;AAEA;;;;AAIG;AACH,IAAA,cAAc,CAAC,UAAmB,EAAE,IAAA,GAAmC,0BAA0B,CAAC,YAAY,EAAA;AAC1G,QAAA,IAAI,CAAC,UAAU;YAAE;QACjB,oEAA4C,CAAC,IAAI,CAAC,CAAC,EAAE,0BAA0B,EAAE,KAAI;YACjF,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,0BAA0B,EAAE;AAC1D,gBAAA,SAAS,EAAE,iCAAiC;AAC5C,gBAAA,SAAS,EAAE,KAAK;AAChB,gBAAA,YAAY,EAAE,KAAK;AACnB,gBAAA,YAAY,EAAE,KAAK;AACnB,gBAAA,iBAAiB,EAAE,KAAK;AACxB,gBAAA,IAAI,EAAE;AACF,oBAAA,UAAU,EAAE,UAAU;AACtB,oBAAA,IAAI,EAAE,IAAI;AACV,oBAAA,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE;AACnC,oBAAA,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;AACxD,iBAAA;AACD,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,KAAK,EAAE,MAAM;AACb,gBAAA,MAAM,EAAE,MAAM;AACjB,aAAA,CAAC;YACF,CAAC,CAAC,WAAW;AACR,iBAAA,SAAS,CAAC,CAAC,CAAyB,KAAI;AACrC,gBAAA,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU;AAAE,oBAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;AAClD,YAAA,CAAC,CAAC;AACV,QAAA,CAAC,CAAC;IACN;AAEA;;AAEG;IACH,OAAO,GAAA;QACH,MAAM,KAAK,GAAqB,EAAE;QAClC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,IAAG;YAClC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE;YACxC,KAAK,CAAC,IAAI,CAAC;AACP,gBAAA,QAAQ,EAAE,KAAK;AACf,gBAAA,GAAG,EAAE,CAAC;AACN,gBAAA,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;AAC7B,aAAA,CAAC;AACN,QAAA,CAAC,CAAC;AACF,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AAChC,YAAA,KAAK,EAAE,8BAA8B;AACrC,YAAA,iBAAiB,EAAE,KAAK;AACxB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,SAAS,EAAE,WAAW;AACtB,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,OAAO,EAAE,IAAI;AAChB,SAAA,CAAC;QACF,CAAC,CAAC,iBAAiB,CAAC;AACf,aAAA,SAAS,CAAC,CAAC,CAAiB,KAAI;AAC7B,YAAA,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG;AAChB,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;AAC9B,QAAA,CAAC,CAAC;QACN,CAAC,CAAC,iBAAiB,CAAC;AACf,aAAA,SAAS,CAAC,CAAC,CAAqB,KAAI;YACjC,MAAM,IAAI,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG;AACnC,YAAA,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAClD,MAAK;AACD,gBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,qCAAqC,CAAC;AAC/D,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,oBAAA,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,EAAE;wBAC/C,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;AACpB,wBAAA,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;4BAAE,CAAC,CAAC,KAAK,EAAE;wBACnC;oBACJ;gBACJ;AACJ,YAAA,CAAC,CAAC;AACV,QAAA,CAAC,CAAC;IACV;AAEA;;AAEG;IACH,KAAK,GAAA;QACD,MAAM,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,yBAAyB,CAAQ;QACnE,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1D;AAEA;;AAEG;IACH,IAAI,GAAA;AACA,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,2CAA2C,CAAC;IACxE;;;;AAMA;;;AAGG;AACH,IAAA,YAAY,CAAC,QAA8B,EAAA;AACvC,QAAA,IAAI,CAAC,QAAQ;YAAE;QACf,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,aAAa,EAAE,QAAQ,CAAC;IAC9E;AAEA;;;AAGG;AACH,IAAA,UAAU,CAAC,QAA8B,EAAA;AACrC,QAAA,IAAI,CAAC,QAAQ;YAAE;QACf,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC3E;AAGA;;;AAGG;AACH,IAAA,UAAU,CAAC,QAA8B,EAAA;AACrC,QAAA,IAAI,CAAC,QAAQ;YAAE;QACf,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC3E;AAEA;;;AAGG;AACH,IAAA,OAAO,CAAC,QAA8B,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ;YAAE;QACf,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC;IACxE;;;;AAMA;;;;AAIG;AACH,IAAA,qBAAqB,CAAC,MAAqB,EAAA;AACvC,QAAA,OAAO,MAAM,KAAK,aAAa,CAAC,+BAA+B;YAC3D,MAAM,KAAK,aAAa,CAAC,gBAAgB;AACzC,YAAA,MAAM,KAAK,aAAa,CAAC,qBAAqB;IACtD;AAEA;;;;AAIG;AACH,IAAA,oBAAoB,CAAC,KAAmB,EAAA;AACpC,QAAA,OAAO,KAAK,KAAK,YAAY,CAAC,sBAAsB;YAChD,KAAK,KAAK,YAAY,CAAC,gBAAgB;AACvC,YAAA,KAAK,KAAK,YAAY,CAAC,QAAQ;IAEvC;AAEA;;;;AAIG;AACH,IAAA,YAAY,CAAC,SAAgC,EAAA;AACzC,QAAA,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACnE;AAEA;;;;AAIG;AACH,IAAA,UAAU,CAAC,SAAgC,EAAA;AACvC,QAAA,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AACtD,QAAA,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,IACpB,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,gBAAgB;AACzC,YAAA,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,sBAAsB;AAC/C,YAAA,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,qBAAqB;AAC9C,YAAA,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,QAAQ,CACpC;IACL;AAEA;;;AAGG;AACH,IAAA,SAAS,CAAC,SAAiC,EAAA;QACvC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS;YAAE;QACrD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,kBAAkB,EAAE,SAAS,CAAC;IACpF;AAEA;;;AAGG;AACH,IAAA,cAAc,CAAC,QAA8B,EAAA;QACzC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ;YAAE;QACpD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,uBAAuB,EAAE,QAAQ,CAAC;IACxF;AAEA;;;AAGG;AACH,IAAA,cAAc,CAAC,QAA8B,EAAA;QACzC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ;YAAE;QACpD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,uBAAuB,EAAE,QAAQ,CAAC;IACxF;+GAjeS,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,2HAJrB,aAAa,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAId,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBALlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,UAAU,EAAE,IAAI;oBAChB,eAAe,EAAE,uBAAuB,CAAC;AAC5C,iBAAA;;;MCLY,qBAAqB,CAAA;AAChC;;;;;;;;;;;;;;AAcG;IACH,OAAO,YAAY,CACjB,QAAkB,EAClB,UAAkB,EAClB,KAAc,EACd,WAAoB,EACpB,aAAoC,EACpC,iBAAmC,EACnC,KAAiB,EACjB,aAAuB,EACvB,WAAqB,EACrB,uBAAiC,EACjC,UAAmB,EAAA;AACnB,QAAA,qBAAqB,CAAC,QAAQ,EAAE,MAAK;AACnC,YAAA,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAC3C,YAAA,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AAC7C,YAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE;AAC9B,gBAAA,aAAa,CAAC,KAAK,CAAC,uEAAuE,CAAC;gBAC5F;YACF;YACA,IAAI,CAAC,UAAU,EAAE;AACf,gBAAA,aAAa,CAAC,KAAK,CAAC,uBAAuB,CAAC;gBAC5C;YACF;YACA,kEAA0C,CAAC,IAAI,CAAC,CAAC,EAAE,wBAAwB,EAAE,KAAI;AAC/E,gBAAA,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,wBAAwB,EAAE;AACvD,oBAAA,SAAS,EAAE,WAAW;AACtB,oBAAA,SAAS,EAAE,KAAK;AAChB,oBAAA,YAAY,EAAE,KAAK;AACnB,oBAAA,YAAY,EAAE,KAAK;AACnB,oBAAA,IAAI,EAAE;AACJ,wBAAA,EAAE,EAAE,UAAU;AACd,wBAAA,KAAK,EAAE,KAAK;AACZ,wBAAA,WAAW,EAAE,WAAW;AACxB,wBAAA,aAAa,EAAE,aAAa;AAC5B,wBAAA,iBAAiB,EAAE,iBAAiB;AACpC,wBAAA,KAAK,EAAE,KAAK;AACZ,wBAAA,aAAa,EAAE,aAAa;AAC5B,wBAAA,WAAW,EAAE,WAAW;AACxB,wBAAA,uBAAuB,EAAE;AAC1B,qBAAA;AACD,oBAAA,QAAQ,EAAE,OAAO;AACjB,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,KAAK,EAAE,MAAM;AACb,oBAAA,MAAM,EAAE;AACT,iBAAA,CAAC;AACF,gBAAA,IAAI,UAAU,IAAI,GAAG,EAAE;AACrB,oBAAA,GAAG,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,MAAK;wBAChC,UAAU,CAAC,MAAK;AACd,4BAAA,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE;gCAC1B,MAAM,CAAC,KAAK,EAAE;4BAChB;iCAAO;AACL,gCAAA,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC;4BACrC;wBACF,CAAC,EAAE,GAAG,CAAC;AACT,oBAAA,CAAC,CAAC;gBACJ;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEA;;;;AAIG;IACH,OAAO,kBAAkB,CAAC,KAAa,EAAA;AACrC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AAC5B,QAAA,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK;IACjD;AAED;;ACpEK,MAAO,0BAA2B,SAAQ,sBAAsB,CAAA;AALtE,IAAA,WAAA,GAAA;;AAMa,QAAA,IAAA,CAAA,SAAS,GAAG,SAAS,CAAe,WAAW,gFAAC;AAChD,QAAA,IAAA,CAAA,MAAM,GAAG,SAAS,CAA+B,QAAQ,6EAAC;AAC1D,QAAA,IAAA,CAAA,QAAQ,GAAG,SAAS,CAAiC,UAAU,+EAAC;AACtD,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC1C,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC/C,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACtC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAErC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAuB,oBAAoB,CAAC,IAAI,oFAAC;AAC7E,QAAA,IAAA,CAAA,QAAQ,GAAoC,IAAI,mBAAmB,EAAE;AAC5D,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAU,KAAK,iFAAC;AAC5C,QAAA,IAAA,CAAA,YAAY,GAAwB,IAAI,mBAAmB,EAAE;AACpD,QAAA,IAAA,CAAA,qBAAqB,GAAG,MAAM,CAAU,KAAK,4FAAC;AAC9C,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAU,KAAK,uFAAC;AACzC,QAAA,IAAA,CAAA,sBAAsB,GAAG,MAAM,CAAU,KAAK,6FAAC;AAC/C,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAU,KAAK,wFAAC;AAC1C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAA+B,EAAE,kFAAC;AACtD,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAyC,SAAS,+EAAC;QAC7E,IAAA,CAAA,SAAS,GAAW,CAAC;AACZ,QAAA,IAAA,CAAA,UAAU,GAAW,WAAW,GAAG,WAAW,CAAC,YAAY,EAAE;AAE7D,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAU,KAAK,gFAAC;;AAElC,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MACrC,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,iFAC7E;AAsjBJ,IAAA;AAljBG;;AAEG;IACH,2BAA2B,GAAA;AACvB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAG;AAC7B,gBAAA,CAAC,CAAC,UAAU,GAAG,KAAK;AACxB,YAAA,CAAC,CAAC;QACN;IACJ;AAEA;;;AAGG;IACH,MAAM,CAAC,MAAc,CAAC,EAAA;QAClB,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC;QACrD,IAAI,IAAI,EAAE;AACN,YAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QAC1D;IACJ;AAEA;;;AAGG;IACH,WAAW,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM;IACrF;AAEA;;;AAGG;IACH,SAAS,CAAC,SAAkB,IAAI,EAAA;QAC5B,IAAI,MAAM,EAAE;YACR,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QAC/E;aAAO;YACH,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QACjF;IACJ;AAEA;;;AAGG;IACH,eAAe,GAAA;AACX,QAAA,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;IACjD;AAEA;;;AAGG;IACH,kBAAkB,GAAA;AACd,QAAA,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC;IACnD;AAEA;;;AAGG;IACH,kBAAkB,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS;IACtE;AAIA;;AAEG;IACH,cAAc,GAAA;AACV,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE;IAC3B;AAEA;;;AAGG;IACH,eAAe,GAAA;AACX,QAAA,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS;IACxG;AAEA;;;AAGG;IACH,aAAa,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YACxB,OAAO,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU;QAC5C;AACA,QAAA,OAAO,SAAS;IACpB;AAEA;;;;AAIG;IACH,cAAc,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC,IAAI,GAAG,EAAE;AAC1C,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,qDAAqD,CAAC;AAC/E,YAAA,OAAO,SAAS;QACpB;QACA,MAAM,GAAG,GAAa,EAAE;AACxB,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YACxB,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,IAAG;AAC7B,gBAAA,IAAI,CAAC,CAAC,UAAU,EAAE;AACd,oBAAA,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC1B;AACJ,YAAA,CAAC,CAAC;QACN;AACA,QAAA,OAAO,GAAG;IACd;AAEA;;;;AAIG;IACH,qBAAqB,GAAA;AACjB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC,IAAI,GAAG,EAAE;AAC1C,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,qDAAqD,CAAC;AAC/E,YAAA,OAAO,SAAS;QACpB;QACA,MAAM,IAAI,GAAoC,EAAE;AAChD,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YACxB,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,IAAG;AAC7B,gBAAA,IAAI,CAAC,CAAC,UAAU,EAAE;oBACd,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBAChC;AACJ,YAAA,CAAC,CAAC;QACN;AACA,QAAA,OAAO,IAAI;IACf;AAGA;;;;;AAKG;IACH,kBAAkB,CAAC,KAA4B,EAAE,MAA2B,EAAA;AACxE,QAAA,MAAM,KAAK,GAAG,YAAY,EAAE;AAC5B,QAAA,MAAM,WAAW,GACb,CAAC,MAAM,CAAC,QAAQ;AAChB,YAAA,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC,OAAO;AACvC,YAAA,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC,QAAQ;AACxC,YAAA,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC,aAAa;AAC7C,YAAA,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC,cAAc;QAClD,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC,SAAS;QAClE,MAAM,iBAAiB,GAAG,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC,UAAU;QACpE,IAAI,KAAK,GAAG,EAAE;AACd,QAAA,KAAK,EAAE,OAAO,CAAC,CAAC,IAAG;YACf,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE;AACnC,YAAA,IAAI,CAAC,CAAC,UAAU,EAAE;gBACd,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC;YAClD;YACA,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,OAAO,EAAE;gBAClC,CAAC,CAAC,IAAI,GAAG,aAAa,GAAG,CAAC,CAAC,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC;YAC9F;AAAO,iBAAA,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,QAAQ;AACxC,gBAAA,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,YAAY,EAAE;AACvC,gBAAA,QAAQ,CAAC,CAAC,KAAK;oBACX,KAAK,YAAY,CAAC,QAAQ;AACtB,wBAAA,CAAC,CAAC,iBAAiB,GAAG,UAAU;wBAChC;oBACJ,KAAK,YAAY,CAAC,YAAY;AAC1B,wBAAA,CAAC,CAAC,iBAAiB,GAAG,cAAc;wBACpC;;AAER,gBAAA,IAAI,CAAC,CAAC,YAAY,EAAE;oBAChB,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC;AACvC,oBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACpB,wBAAA,CAAC,CAAC,mBAAmB,GAAG,KAAK,CAAC,CAAC,CAAC;oBACpC;gBACJ;AACA,gBAAA,IAAI,CAAC,CAAC,YAAY,EAAE;AAChB,oBAAA,CAAC,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;AAC7C,oBAAA,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACzC,oBAAA,CAAC,CAAC,UAAU,GAAG,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC;oBAC5C,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK;gBAEhC;YACJ;iBAAO;AACH,gBAAA,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,QAAQ;AAClC,oBAAA,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,IAAI;oBAC7B,CAAC,CAAC,IAAI,EAAE;oBACR,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE;gBACjC;AACA,gBAAA,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,sBAAsB;AAC/C,oBAAA,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,gBAAgB;AACzC,oBAAA,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,qBAAqB;AAC9C,oBAAA,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK;oBAC9B,CAAC,CAAC,IAAI,EAAE;AACR,oBAAA,CAAC,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,cAAc,CAAC,CAAC;AACzD,oBAAA,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;oBAChD,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;gBACxB;AACA,gBAAA,IAAI,CAAC,CAAC,OAAO,EAAE;AACX,oBAAA,IAAI,UAA8B;oBAClC,MAAM,OAAO,GAAU,EAAE;oBACzB,IAAI,QAAQ,GAAG,EAAE;oBACjB,IAAI,QAAQ,GAAG,CAAC;AAChB,oBAAA,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAG;wBAClB,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,QAAQ,EAAE;AAC3B,4BAAA,QAAQ,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;wBAC3B;wBACA,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,QAAQ,EAAE;AAC3B,4BAAA,QAAQ,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;wBAC3B;AACJ,oBAAA,CAAC,CAAC;AACF,oBAAA,QAAQ,GAAG,QAAQ,GAAG,QAAQ;AAC9B,oBAAA,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAG;AAClB,wBAAA,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE;4BAAE;AACnB,wBAAA,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE;4BACvB,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC;gCAClB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC;AAC7C,4BAAA,UAAU,GAAG,CAAC,CAAC,IAAI;wBACvB;wBACA,MAAM,KAAK,GAAG,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,QAAQ,IAAI,QAAQ,GAAG,CAAC;wBACvE,OAAO,CAAC,IAAI,CAAC;4BACT,IAAI,EAAE,CAAC,CAAC,IAAI;4BACZ,KAAK,EAAE,CAAC,CAAC,KAAK;4BACd,UAAU,EAAE,CAAC,CAAC,UAAU;4BACxB,GAAG,EAAE,CAAC,CAAC,GAAG;4BACV,YAAY,EAAE,KAAK,GAAG,GAAG;AACzB,4BAAA,KAAK,EAAE,KAAK;4BACZ,KAAK,EAAE,CAAC,CAAC;AACZ,yBAAA,CAAC;AACN,oBAAA,CAAC,CAAC;AACF,oBAAA,CAAC,CAAC,OAAO,GAAG,OAAO;gBACvB;gBACA,IAAI,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,EAAE;AAC5B,oBAAA,CAAC,CAAC,mBAAmB,GAAG,mBAAmB;AAC3C,oBAAA,CAAC,CAAC,SAAS,GAAG,IAAI;AAClB,oBAAA,IAAI,CAAC,CAAC,cAAc,EAAE;AAClB,wBAAA,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;AAC3D,wBAAA,IAAI,YAAY,GAAG,KAAK,EAAE;AACtB,4BAAA,CAAC,CAAC,mBAAmB;gCACjB,sBAAsB;AACtB,oCAAA,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC;AACpC,oCAAA,GAAG;wBACX;6BAAO;AACH,4BAAA,CAAC,CAAC,mBAAmB;gCACjB,2BAA2B;AAC3B,oCAAA,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC;AACpC,oCAAA,GAAG;AACP,4BAAA,CAAC,CAAC,SAAS,GAAG,KAAK;wBACvB;oBACJ;gBACJ;AACA,gBAAA,IAAI,CAAC,CAAC,YAAY,EAAE;AAChB,oBAAA,CAAC,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;AAC7C,oBAAA,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACzC,oBAAA,CAAC,CAAC,UAAU,GAAG,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC;oBAC5C,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK;gBAChC;YACJ;YACA,IAAI,WAAW,EAAE;AACb,gBAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,IAAI;sBAC9C,CAAC,CAAC;AACJ,sBAAE,CAAC,CAAC,IAAI;AACZ,gBAAA,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,EAAE,WAAW,EAAE;AAClF,gBAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAChB,oBAAA,CAAC,CAAC,KAAK,GAAG,IAAI;oBACd,KAAK,GAAG,IAAI;gBAChB;YACJ;iBAAO,IAAI,gBAAgB,EAAE;AACzB,gBAAA,IAAI,KAAK,KAAK,MAAM,EAAE;AAClB,oBAAA,CAAC,CAAC,KAAK;AACH,wBAAA,yCAAyC,GAAG,MAAM,CAAC,IAAI;oBAC3D,KAAK,GAAG,MAAM;gBAClB;YACJ;iBAAO,IAAI,iBAAiB,EAAE;AAC1B,gBAAA,IAAI,KAAK,KAAK,MAAM,EAAE;AAClB,oBAAA,CAAC,CAAC,KAAK,GAAG,6CAA6C;oBACvD,KAAK,GAAG,MAAM;gBAClB;YACJ;AACJ,QAAA,CAAC,CAAC;IACN;AAGA;;;;;AAKG;AACH,IAAA,cAAc,CAAC,IAAyB,EAAE,SAAA,GAAqB,KAAK,EAAA;QAChE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC;AAC9C,QAAA,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE;QAC/B,IAAI,CAAC,SAAS,EAAE;YACZ,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM;QACvC;AACA,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QACpB,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE;AAC5B,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,YAAY;QACtC;AACA,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AACrB,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC;QACnE;AACA,QAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;IACtC;AAGA;;;AAGG;IACH,aAAa,CAAC,SAAiB,CAAC,EAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;AAC3D,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC;QACtE;IACJ;AAGA;;;;AAIG;AACH,IAAA,oBAAoB,CAAC,IAAyB,EAAA;AAC1C,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,WAAW;aACxG,IAAI,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,YAAY;;;AAG5C,QAAA,OAAO,SAAS;IACpB;AAEA;;;;AAIG;AACH,IAAA,mBAAmB,CAAC,IAAyB,EAAA;AACzC,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,WAAW;aACxG,IAAI,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,iBAAiB;;;AAGjD,QAAA,OAAO,EAAE;IACb;AAEA;;;;AAIG;AACH,IAAA,WAAW,CAAC,IAAyB,EAAA;AACjC,QAAA,QAAQ,IAAI,CAAC,KAAK;AACd,YAAA,KAAK,YAAY,CAAC,gBAAgB,EAAE,OAAO,OAAO;YAClD,KAAK,YAAY,CAAC,QAAQ;YAC1B,KAAK,YAAY,CAAC,OAAO;AACzB,YAAA,KAAK,YAAY,CAAC,eAAe,EAAE,OAAO,WAAW;AACrD,YAAA,SAAS,OAAO,SAAS;;IAEjC;AAEA;;;;AAIG;IACH,UAAU,CAAC,IAAyB,EAAE,CAAS,EAAA;QAC3C,CAAC,EAAE,cAAc,EAAE;QACnB,CAAC,EAAE,eAAe,EAAE;QACpB,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC;IAErC;AAEA;;;;AAIG;IACH,eAAe,CAAC,IAAyB,EAAE,CAAS,EAAA;QAChD,CAAC,EAAE,cAAc,EAAE;QACnB,CAAC,EAAE,eAAe,EAAE;QACpB,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC;IAGjD;AAGA;;;;;AAKG;IACH,OAAO,CAAC,KAAc,EAAE,IAA0B,EAAA;AAC9C,QAAA,IAAI,WAAqB;AACzB,QAAA,IAAI,IAAI,EAAE,UAAU,EAAE;AAClB,YAAA,WAAW,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;QACnC;AAAO,aAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YAC/B,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,IAAI,EAAE;QACzE;aAAO;YACH;QACJ;AACA,QAAA,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE;aACtE,SAAS,CAAC,CAAC,IAAG;AACX,YAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;;gBAEZ,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;YACvC;iBAAO;gBACH,IAAI,IAAI,EAAE;AACN,oBAAA,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE;AACvB,wBAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,wBAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;wBAClG,MAAM,MAAM,GAAG,YAAY,CAAC,yBAAyB,CAAC,IAAI,CAAC;wBAC3D,IAAI,MAAM,EAAE;4BACR,IAAI,CAAC,cAAc,CAAC,iBAAiB,CACjC,MAAM,EACN,IAAI,CAAC,KAAK,EACV,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;wBACvB;AACA,wBAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;oBACtC;gBACJ;AAAO,qBAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;oBAC/B,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,IAAG;AAC7B,wBAAA,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,EAAE;AACpB,4BAAA,CAAC,CAAC,MAAM,GAAG,KAAK;AAChB,4BAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;4BAC/F,MAAM,MAAM,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAC,CAAC;4BACxD,IAAI,MAAM,EAAE;gCACR,IAAI,CAAC,cAAc,CAAC,iBAAiB,CACjC,MAAM,EACN,CAAC,CAAC,KAAK,EACP,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;4BACvB;AACA,4BAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;wBACtC;AACJ,oBAAA,CAAC,CAAC;gBACN;gBACA,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,yBAAyB,CAAC;YAChF;AACJ,QAAA,CAAC,CAAC;IACV;AAIA;;;;;;AAMG;AACM,IAAA,IAAI,CAAC,UAAmB,EAAE,KAAc,EAAE,WAAoB,EAAE,SAAmB,EAAA;AACxF,QAAA,IAAI,CAAC,UAAU;YAAE;AACjB,QAAA,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,EAAE,WAAW,CAAC;aAC5D;AACD,YAAA,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,EAAE,IAAI,aAAa,GAAG,UAAU,EAAE,QAAQ,CAAC;QAC1F;IACJ;AAEA;;;;;AAKG;AACH,IAAA,YAAY,CAAC,UAAmB,EAAE,KAAc,EAAE,WAAoB,EAAA;AAClE,QAAA,IAAI,CAAC,UAAU;YAAE;AACjB,QAAA,KAAK,GAAG,kBAAkB,CAAC,mBAAmB,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC;AACrF,QAAA,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,IAAI,yBAAyB,CAAC,iBAAiB,IAAI,CAAC,EAAE;AACpF,YAAA,KAAK,GAAG,GAAG,GAAG,KAAK;QACvB;AACA,QAAA,qBAAqB,CAAC,YAAY,CAC9B,IAAI,CAAC,QAAQ,EACb,UAAU,EACV,KAAK,EACL,WAAW,EACX,IAAI,CAAC,aAAa,EAAE,EACpB,SAAS,EACT,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,EAC5B,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,WAAW,EAAE,EAClB,IAAI,CAAC,uBAAuB,EAAE,CACjC;IAEL;;;;AAMA;;;;;AAKG;AACH,IAAA,IAAI,CAAC,EAAU,EAAE,OAAA,GAAmB,cAAc,EAAA;QAC9C,OAAO,CAAC,OAAO,CACX,EAAE,EACF,IAAI,CAAC,SAAS,CAAC;AACX,YAAA,SAAS,EAAE;gBACP,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,IAAI,CAAC;AACvC,gBAAA,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC;AAChC,gBAAA,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI;AACnE,aAAA;AACD,YAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE;YAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,MAAM,EAAE,IAAI,CAAC,SAAS;AACtB,YAAA,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE;YAC5D,IAAI,EAAE,IAAI,CAAC;AACP,kBAAE,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;AAC1D,kBAAE;AACT,SAAA,CAAC,CAAC;IACX;AAEA;;;;;AAKG;AACH,IAAA,OAAO,CAAC,EAAU,EAAE,OAAA,GAAmB,cAAc,EAAA;QACjD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,IAAI,KAAK,EAAE;YACP,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YAC9B,IAAI,IAAI,EAAE;AACN,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY;AACrC,gBAAA,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;AAC5D,gBAAA,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;AAC5D,gBAAA,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;AAC5D,gBAAA,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACtD,gBAAA,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;AAC1D,gBAAA,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,OAAO;AACnC,gBAAA,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,SAAS;AACrC,gBAAA,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,SAAS;AACrC,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,SAAS;AAClC,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,SAAS;AACpC,gBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI;gBACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;gBAC7C,UAAU,CAAC,MAAK;AACZ,oBAAA,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,OAAO;AACnC,oBAAA,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,OAAO;AACnC,oBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,IAAI;AAC7B,oBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM;AACjC,oBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,oBAAA,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE;AACvB,wBAAA,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;AAC3B,wBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC;oBACtD;AACA,oBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,oBAAA,IAAI,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE;wBAC7B,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK;wBAC1C,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI;wBACxC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK;oBAC3C;oBACA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;AAC7B,oBAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,uBAAuB,EAAE,IAAI,CAAC,YAAY,CAAC;AAC7F,oBAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;gBACtC,CAAC,EAAE,GAAG,CAAC;YAEX;QACJ;IACJ;+GAjlBS,0BAA0B,EAAA,IAAA,EAAA,IAAA,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,iaAJzB,aAAa,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAId,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBALtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,UAAU,EAAE,IAAI;oBAChB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAClD,iBAAA;uEAEgD,WAAW,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACE,QAAQ,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACJ,UAAU,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MCzB/D,uBAAuB,CAAA;AAElC;;;;AAIG;IACK,OAAO,eAAe,CAAC,MAA0B,EAAA;AACvD,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;QACtB,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA,MAAA,EAAS,CAAC,CAAA,OAAA,CAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IACrE;AAEA;;;;AAIG;IACK,OAAO,oBAAoB,CAAC,IAAwB,EAAA;QAC1D,MAAM,MAAM,GAAG,uBAAuB,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;AACnE,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,GAAG,uCAAuC,GAAG,EAAE;AACjF,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC;AACpB,cAAE,CAAA,2CAAA,EAA8C,IAAI,CAAC,SAAS,CAAA,OAAA;cAC5D,EAAE;QACN,OAAO,CAAA,kCAAA,EAAqC,YAAY,CAAA,CAAA;AACpD,cAAA,CAAA,8CAAA,EAAiD,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA,EAAG,QAAQ,CAAA,KAAA;AAC3E,cAAA,CAAA,kDAAA,EAAqD,MAAM,CAAA,KAAA;AAC3D,cAAA,CAAA,aAAA,CAAe;IACrB;AAEA;;;;;;AAMG;IACH,OAAO,IAAI,CACT,QAAkB,EAClB,SAAmB,EACnB,OAAiB,EACjB,QAAoC,EAAA;AAEpC,QAAA,qBAAqB,CAAC,QAAQ,EAAE,MAAK;AACnC,YAAA,MAAM,aAAa,GAAG,MAAM,CAAC,wBAAwB,CAAC;AACtD,YAAA,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AAC7C,YAAA,IAAI,kBAA4C;AAChD,YAAA,MAAM,SAAS,GAAG,QAAQ,KAAK,SAAS;AAExC,YAAA,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC;gBAC7B,KAAK,EAAE,SAAS,GAAG,uBAAuB,GAAG,mBAAmB;AAChE,gBAAA,iBAAiB,EAAE,IAAI;AACvB,gBAAA,UAAU,EAAE,SAAS;AACrB,gBAAA,MAAM,EAAE,6KAA6K;AACrL,gBAAA,SAAS,EAAE,WAAW;gBACtB,SAAS;gBACT,OAAO;AACP,gBAAA,SAAS,EAAE,OAAO;AAClB,gBAAA,SAAS,EAAE,IAAI;AAChB,aAAA,CAAC;AAEF,YAAA,CAAC,EAAE,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,kBAAkB,EAAE,WAAW,EAAE,CAAC;AAEnE,YAAA,CAAC,EAAE,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAe,KAAK,QAAQ,GAAG,MAAM,CAAC,CAAC;YAE5E,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAW,KAAI;gBACpD,qEAAgD,CAAC,IAAI,CAAC,CAAC,EAAE,2BAA2B,EAAE,KAAI;AACxF,oBAAA,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,2BAA2B,EAAE;AACzD,wBAAA,SAAS,EAAE,eAAe;AAC1B,wBAAA,SAAS,EAAE,KAAK;AAChB,wBAAA,YAAY,EAAE,KAAK;AACnB,wBAAA,YAAY,EAAE,IAAI;AAClB,wBAAA,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;AAC3B,wBAAA,QAAQ,EAAE,OAAO;AACjB,wBAAA,QAAQ,EAAE,OAAO;AACjB,wBAAA,KAAK,EAAE,KAAK;AACb,qBAAA,CAAC;oBACF,EAAE,EAAE,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAgD,KAAI;AACxF,wBAAA,IAAI,OAAO,CAAC,KAAK,EAAE;AACjB,4BAAA,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI;AACzB,4BAAA,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;AACnB,gCAAA,QAAQ,EAAE,uBAAuB,CAAC,oBAAoB,CAAC,IAAI,CAAC;AAC5D,gCAAA,GAAG,EAAE,IAAI;gCACT,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE;AACtC,6BAAA,CAAC;wBACJ;AACA,wBAAA,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE;wBAC5B,EAAE,EAAE,KAAK,EAAE;AACb,oBAAA,CAAC,CAAC;AACJ,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;YAEF,CAAC,EAAE,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAW,KAAI;gBAClD,qEAAgD,CAAC,IAAI,CAAC,CAAC,EAAE,2BAA2B,EAAE,KAAI;AACxF,oBAAA,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,2BAA2B,EAAE;AACzD,wBAAA,SAAS,EAAE,mBAAmB;AAC9B,wBAAA,SAAS,EAAE,KAAK;AAChB,wBAAA,YAAY,EAAE,KAAK;AACnB,wBAAA,YAAY,EAAE,IAAI;wBAClB,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;AACtC,wBAAA,QAAQ,EAAE,OAAO;AACjB,wBAAA,QAAQ,EAAE,OAAO;AACjB,wBAAA,KAAK,EAAE,KAAK;AACb,qBAAA,CAAC;oBACF,EAAE,EAAE,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAgD,KAAI;AACxF,wBAAA,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI;AACzB,wBAAA,MAAM,CAAC,GAAW,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;AACnD,wBAAA,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;AACZ,4BAAA,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,uBAAuB,CAAC,oBAAoB,CAAC,IAAI,CAAC;4BAC7E,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI;AAC1B,4BAAA,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE;wBACvD;AACA,wBAAA,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE;wBAC7B,EAAE,EAAE,KAAK,EAAE;AACb,oBAAA,CAAC,CAAC;AACJ,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;YAEF,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAW,KAAI;gBACpD,IAAI,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,CAAC,CAAC;oBAAE;AACzC,gBAAA,MAAM,GAAG,GAAI,MAAM,CAAC;qBACjB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAwB;qBACxC,MAAM,CAAC,CAAC,EAAE,KAAmB,EAAE,IAAI,IAAI,CAAC;gBAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,KAAK;AAC9C,sBAAE,CAAA,mCAAA,EAAsC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAA,CAAA;sBACtE,gDAAgD;AACpD,gBAAA,aAAa,CAAC,OAAO,CAAC,OAAO;sBACzB,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAkB,KAAI;AAC3D,oBAAA,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;wBAAE;AAC1B,oBAAA,aAAa,CAAC,IAAI,CAAC,0BAA0B,CAAC;AAC9C,oBAAA,cAAc,CAAC,cAAc,CAAC,GAAG;yBAC9B,IAAI,CAAC,QAAQ,CAAC,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC;yBAC9C,SAAS,CAAC,CAAC,IAAG;AACb,wBAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;AACd,4BAAA,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;wBAChC;6BAAO;AACL,4BAAA,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACjD,gCAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;oCACzC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;gCAC3B;4BACF;4BACA,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;AAChD,4BAAA,CAAC,EAAE,iBAAiB,CAAC,cAAc,EAAE;AACrC,4BAAA,aAAa,CAAC,KAAK,CAAC,qCAAqC,CAAC;wBAC5D;AACF,oBAAA,CAAC,CAAC;AACN,gBAAA,CAAC,CAAC;AACN,YAAA,CAAC,CAAC;YAEF,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAW,KAAI;AACpD,gBAAA,aAAa,CAAC,IAAI,CAAC,qBAAqB,CAAC;gBACzC,kBAAkB,EAAE,WAAW,EAAE;AACjC,gBAAA,kBAAkB,GAAG;AAClB,qBAAA,aAAa,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;qBAChD,IAAI,CAAC,QAAQ,CAAC,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC;qBAC9C,SAAS,CAAC,CAAC,IAAG;AACb,oBAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;AACd,wBAAA,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;wBAC9B;oBACF;AACA,oBAAA,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE;AAC7B,wBAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;wBACtB,CAAC,CAAC,KAAK,CAAC,KAA8B,CAAC,OAAO,CAAC,CAAC,IAAG;AAClD,4BAAA,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AAChB,gCAAA,QAAQ,EAAE,uBAAuB,CAAC,oBAAoB,CAAC,CAAC,CAAC;AACzD,gCAAA,GAAG,EAAE,CAAC;gCACN,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE;AACnC,6BAAA,CAAC;AACJ,wBAAA,CAAC,CAAC;oBACJ;AACA,oBAAA,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,CAAC;AAClD,gBAAA,CAAC,CAAC;AACN,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AACD;;MCvJY,yBAAyB,CAAA;AA2BpC,IAAA,WAAA,GAAA;AA1BiB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACnC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC3C,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAChD,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAClC,IAAA,CAAA,UAAU,GAAsB,IAAI;QACpC,IAAA,CAAA,SAAS,GAAwB,IAAI;AAC5B,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACnD,IAAA,CAAA,gBAAgB,GAAG,MAAM,EAAsB;AACvC,QAAA,IAAA,CAAA,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAoB,UAAU,CAAC;AACpE,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAuB;AAClC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAS,EAAE,sFAAC;AACpC,QAAA,IAAA,CAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAK;YACvD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS;YACvC,IAAI,CAAC,SAAS,EAAE,MAAM;gBAAE,OAAO,CAAC,CAAC;AACjC,YAAA,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM;AAClD,QAAA,CAAC,4FAAC;AACiB,QAAA,IAAA,CAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;YACrD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS;YACvC,IAAI,CAAC,SAAS,EAAE,MAAM;AAAE,gBAAA,OAAO,CAAC;AAChC,YAAA,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM;AACnD,QAAA,CAAC,0FAAC;AACiB,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,qFAAC;AAGpF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAClD,eAAe,CAAC,MAAK;YACnB,IAAI,CAAC,YAAY,CAAC;AACf,iBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,iBAAA,SAAS,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;YACvE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACrD,QAAA,CAAC,CAAC;IACJ;AAEA;;;;AAIG;IACK,kBAAkB,GAAA;AACxB,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK;cACpC,sBAAsB,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAA,YAAA;cACvC,sBAAsB,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAA,YAAA,CAAc;IAC3D;AAEA;;;;AAIG;AACO,IAAA,SAAS,CAAC,KAAiB,EAAA;QACnC,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,UAAU,EAAE;QAEjB,MAAM,UAAU,GAAG,GAAG;QACtB,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,GAAG,UAAU,IAAI,MAAM,CAAC,UAAU;QAEjE,MAAM,kBAAkB,GAAG,MAAK;YAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAA,EAAG,KAAK,CAAC,OAAO,CAAA,EAAA,CAAI,CAAC;YACpE,OAAO,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,CAAA,EAAG,KAAK,CAAC,OAAO,CAAA,EAAA,CAAI,CAAC,GAAG,CAAC,CAAC,kBAAkB,EAAE;AAC1E,QAAA,CAAC;QACD,MAAM,kBAAkB,GAAG,MAAK;YAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAA,EAAG,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,OAAO,CAAA,EAAA,CAAI,CAAC;YAC5F,OAAO,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,CAAA,EAAG,KAAK,CAAC,OAAO,CAAA,EAAA,CAAI,CAAC,GAAG,CAAC,CAAC,kBAAkB,EAAE;AAC1E,QAAA,CAAC;AAED,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9B,gBAAgB,EAAE,kBAAkB,EAAE;AACtC,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,aAAa,EAAE,kCAAkC;YACjD,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE;AACtD,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAEzH,GAAG,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAG,EAAG,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;AAAE,YAAA,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5H,GAAG,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;AAChG,QAAA,GAAG,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;;QAGtE,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE;YACtB,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,CAAC,qBAAqB,EAAE;YACvD,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE;AACpC,gBAAA,GAAG,CAAC,sBAAsB,CAAC,kBAAkB,EAAE,CAAC;YAClD;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,GAAG,GAAG;IACvB;AAEA;;;AAGG;AACO,IAAA,UAAU,CAAC,KAAkB,EAAA;QACrC,KAAK,EAAE,eAAe,EAAE;AACxB,QAAA,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE;AAC7B,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE;AACzB,QAAA,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE;AAC1B,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;IACxB;AAEA;;;;;AAKG;AACO,IAAA,IAAI,CAAC,KAAiB,EAAA;QAC9B,KAAK,CAAC,eAAe,EAAE;QACvB,kEAA0C,CAAC,IAAI,CAAC,CAAC,EAAE,wBAAwB,EAAE,KAAI;YAC/E,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,wBAAwB,EAAE;AAC1D,gBAAA,SAAS,EAAE,sBAAsB;AACjC,gBAAA,SAAS,EAAE,KAAK;AAChB,gBAAA,YAAY,EAAE,KAAK;AACnB,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,iBAAiB,EAAE,KAAK;gBACxB,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE;AAClC,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,KAAK,EAAE,MAAM;AACd,aAAA,CAAC;YACF,CAAC,EAAE,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,IAAG;gBAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;AAC9D,gBAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;gBACpF,CAAC,EAAE,KAAK,EAAE;AACZ,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEA;;;;;AAKG;AACO,IAAA,MAAM,CAAC,KAAiB,EAAA;QAChC,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC;AACF,aAAA,OAAO,CACN,mDAAmD,EACnD,aAAa;cAEb,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAkB,KAAI;AAC3D,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE;AACxB,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,0BAA0B,CAAC;AACnD,gBAAA,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AAClD,qBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;qBACnD,SAAS,CAAC,CAAC,IAAG;AACb,oBAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;wBACd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;oBACrC;yBAAO;AACL,wBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,qCAAqC,CAAC;AAC/D,wBAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;wBACpF,IAAI,CAAC,UAAU,EAAE;oBACnB;AACF,gBAAA,CAAC,CAAC;YACN;AACF,QAAA,CAAC,CAAC;IACN;AAGA;;;;;AAKG;AACO,IAAA,MAAM,CAAC,KAAiB,EAAA;QAChC,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU;YAAE;QAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,qBAAqB,EAAE;AACvD,YAAA,SAAS,EAAE,2BAA2B;AACtC,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,iBAAiB,EAAE,IAAI;AACvB,YAAA,IAAI,EAAE;AACJ,gBAAA,KAAK,EAAE,iBAAiB;AACxB,gBAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI;gBACtB,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAA,CAAE;AAC9B,gBAAA,WAAW,EAAE,IAAI;AAClB,aAAA;AACD,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,KAAK,EAAE,MAAM;AACd,SAAA,CAAC;QACF,CAAC,EAAE,iBAAiB,CAAC;aAClB,SAAS,CAAC,IAAI,IAAG;AAChB,YAAA,MAAM,MAAM,GAAoC;gBAC9C,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC;gBAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,CAAC;aACuB;AACpC,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC;AAC5C,YAAA,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM;AACpC,iBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;iBACnD,SAAS,CAAC,CAAC,IAAG;AACb,gBAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;oBACd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;gBACrC;qBAAO;oBACL,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE;wBACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AAC3D,wBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,gCAAgC,CAAC;oBAC5D;yBAAO;AACL,wBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,6CAA6C,CAAC;oBACzE;oBAEA,CAAC,EAAE,KAAK,EAAE;gBACZ;AACF,YAAA,CAAC,CAAC;AACN,QAAA,CAAC,CAAC;QACJ,CAAC,EAAE,iBAAiB,CAAC;aAClB,SAAS,CAAC,IAAI,IAAG;AAChB,YAAA,uBAAuB,CAAC,IAAI,CAC1B,IAAI,CAAC,QAAQ,EACb,IAAI,EACJ,IAAI,EACJ,CAAC,QAAa,KAAI;gBAChB,IAAI,QAAQ,EAAE,aAAa,EAAE,MAAM,GAAG,CAAC,EAAE;AACvC,oBAAA,MAAM,UAAU,GAAG,QAAQ,CAAC;yBACzB,MAAM,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,GAAG,EAAE,MAAM;yBAChC,GAAG,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,GAAG,CAAC,MAAgB;yBACtC,IAAI,CAAC,GAAG,CAAC;AACZ,oBAAA,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC;gBAC1C;AACF,YAAA,CAAC,CAAC;AACN,QAAA,CAAC,CAAC;IACN;AAGA;;;;;;AAMG;IACO,SAAS,CAAC,KAAiB,EAAE,eAAwB,EAAA;QAC7D,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CACxB,kEAAkE,EAClE,aAAa,CACd,EAAE,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAkB,KAAI;AAC5D,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE;AACxB,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC;AAC5C,gBAAA,MAAM,MAAM,GAAoC;AAC9C,oBAAA,eAAe,EAAE,eAAe;oBAChC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC;iBACG;AACpC,gBAAA,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM;AACpC,qBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;qBACnD,SAAS,CAAC,CAAC,IAAG;AACb,oBAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;wBACd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;wBACnC;oBACF;yBAAO;wBACL,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE;4BACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AAC3D,4BAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,gCAAgC,CAAC;wBAC5D;6BAAO;AACL,4BAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,6CAA6C,CAAC;wBACzE;oBACF;AACF,gBAAA,CAAC,CAAC;YACN;AACF,QAAA,CAAC,CAAC;IACJ;AAEA;;;;AAIG;AACO,IAAA,OAAO,CAAC,KAAiB,EAAA;QACjC,KAAK,CAAC,eAAe,EAAE;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC;AAClC,QAAA,IAAI,CAAC,MAAM;YAAE;AACb,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,2BAA2B,CAAC;AACpD,QAAA,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,MAAM;AACxC,aAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;aACnD,SAAS,CAAC,CAAC,IAAG;AACb,YAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;gBACd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;YACrC;iBAAO;gBACL,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACvD;AACF,QAAA,CAAC,CAAC;IACN;+GAtSW,yBAAyB,EAAA,IAAA,EAAA,EAAA,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,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7BtC,+9HA8Fc,EAAA,MAAA,EAAA,CAAA,iyFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDxEF,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACvB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAEhB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,4OAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,kTAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,+bAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,QAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,aAAa,0BAFb,UAAU,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAID,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAbrC,SAAS;+BACE,oBAAoB,EAAA,eAAA,EAGb,uBAAuB,CAAC,MAAM,cACnC,IAAI,EAAA,OAAA,EACP,CAAC,eAAe;wBACvB,aAAa;wBACb,gBAAgB;wBAChB,UAAU;wBACV,gBAAgB;AAChB,wBAAA,aAAa,CAAC,EAAA,QAAA,EAAA,+9HAAA,EAAA,MAAA,EAAA,CAAA,iyFAAA,CAAA,EAAA;qKAckD,UAAU,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;IE3BlE;AAAZ,CAAA,UAAY,kCAAkC,EAAA;AAC5C,IAAA,kCAAA,CAAA,kCAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAQ;AACR,IAAA,kCAAA,CAAA,kCAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAQ;AACR,IAAA,kCAAA,CAAA,kCAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAU;AACZ,CAAC,EAJW,kCAAkC,KAAlC,kCAAkC,GAAA,EAAA,CAAA,CAAA;MAwBjC,gCAAgC,CAAA;AAiD3C,IAAA,WAAA,GAAA;AA/CiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC7B,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACvC,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACnD,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,4EAA8B;AACrD,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAuB;AAC5C,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,6EAAW;AAClC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAW,EAAE,+EAAC;QAChC,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;QAClC,IAAA,CAAA,cAAc,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AAChC,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAU,IAAI,mFAAC;AACnC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAU,IAAI,iFAAC;AACjC,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAA2B,SAAS,sFAAC;AAC5D,QAAA,IAAA,CAAA,oBAAoB,GAAG,KAAK,CAAU,KAAK,2FAAC;AAC5C,QAAA,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAU,KAAK,uFAAC;AACxC,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAU,IAAI,kFAAC;AAClC,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAqC,kCAAkC,CAAC,IAAI,kFAAC;QACtF,IAAA,CAAA,gBAAgB,GAA8C,kCAAkC;QAChG,IAAA,CAAA,UAAU,GAAwB,YAAY;;AAGhD,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,CAAC,0FAAC;AAEhD;;;AAGG;AACgB,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;YAC5C,IAAI,CAAC,mBAAmB,EAAE;YAC1B,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,IAAI;AACrG,QAAA,CAAC,iFAAC;AAEF;;AAEG;AACgB,QAAA,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,MAAK;AACxC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;YAC9D,OAAO,IAAI,CAAC,UAAU,EAAE,IAAI,KAAK,GAAG,CAAC,IAAI,YAAY,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,IAAI;AACpH,QAAA,CAAC,6EAAC;AAEF;;AAEG;AACgB,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AAC3C,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;YAC9D,OAAO,IAAI,CAAC,UAAU,EAAE,IAAI,KAAK,GAAG,CAAC,IAAI,YAAY,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,IAAI;AACpH,QAAA,CAAC,gFAAC;;QAIA,MAAM,CAAC,MAAK;YACV,MAAM,QAAQ,GAAa,EAAE;AAC7B,YAAA,IAAI,CAAC,IAAI,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,IAAG;gBAClD,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AAC/B,gBAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;oBACzB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChF;qBAAO;AACL,oBAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChD;AACF,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC7B,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE;AACvB,iBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;iBACxC,SAAS,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7C,YAAA,CAAC,CAAC;AACN,QAAA,CAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU;AAC7B,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aACxC,SAAS,CAAC,OAAO,IAAG;YACnB,IAAI,OAAO,CAAC,EAAE,KAAK,eAAe,CAAC,kBAAkB,EAAE;AACrD,gBAAA,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE;AAC3G,oBAAA,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC3C;YACF;iBAAO,IAAI,OAAO,CAAC,EAAE,KAAK,eAAe,CAAC,aAAa,EAAE;gBACvD,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;oBACpF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC/D;YACF;iBAAO,IAAI,OAAO,CAAC,EAAE,KAAK,eAAe,CAAC,oBAAoB,EAAE;gBAC9D,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrE,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,EAAE;AAC7B,oBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC9E;YACF;iBAAO,IAAI,OAAO,CAAC,EAAE,KAAK,eAAe,CAAC,oBAAoB,EAAE;gBAC9D,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrE,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,EAAE;AAC7B,oBAAA,MAAM,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAC5C,oBAAA,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI;oBACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;gBACjD;YACF;AACF,QAAA,CAAC,CAAC;IACN;+GAnGW,gCAAgC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gCAAgC,sxDCtC7C,wxZAoRM,EAAA,MAAA,EAAA,CAAA,yidAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDxPF,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,WAAA,EAAA,IAAA,EAAA,UAAA,EAAA,eAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,aAAa,mLACb,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,GAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,0BAAA,EAAA,2BAAA,EAAA,mCAAA,EAAA,+BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,4OAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,sRAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,kTAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,sRAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,gNAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,+bAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,QAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEhB,yBAAyB,yHADzB,UAAU,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAID,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAjB5C,SAAS;AACS,YAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,4BAA4B,EAAA,UAAA,EAG1B,IAAI,EAAA,OAAA,EACP;wBACP,iBAAiB;wBACjB,eAAe;wBACf,gBAAgB;wBAChB,aAAa;wBACb,aAAa;wBACb,gBAAgB;wBAChB,UAAU;wBACV;AACD,qBAAA,EAAA,QAAA,EAAA,wxZAAA,EAAA,MAAA,EAAA,CAAA,yidAAA,CAAA,EAAA;;;AEeG,MAAO,uBAAwB,SAAQ,0BAA0B,CAAA;AAqCrE;;;;AAIG;IACO,MAAM,CAAC,aAAsB,IAAI,EAAA;AACzC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO;AACzC,QAAA,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC;AAChD,YAAA,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IACnB,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,+BAA+B;AACzD,gBAAA,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,gBAAgB;AAC1C,gBAAA,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;IACpE;AAEA;;;AAGG;IACO,UAAU,GAAA;AAClB,QAAA,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC;AACxE,aAAC,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;AAC3C,gBAAA,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,CACnC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,gBAAgB,IAAI,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,qBAAqB,CACnG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACtB;AAEA;;;AAGG;IACO,cAAc,GAAA;AACtB,QAAA,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;YACjD,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;IACnH;AAEA;;;AAGG;IACO,cAAc,GAAA;QACtB,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,KAAK,WAAW,CAAC,OAAO;YACnD,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,KAAK,WAAW,CAAC,QAAQ;YAC/C,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,KAAK,WAAW,CAAC,aAAa;YACpD,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,KAAK,WAAW,CAAC,cAAc;IACzD;AAEA;;;AAGG;IACO,SAAS,GAAA;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;IAC5C;AAIA;;;AAGG;IACO,UAAU,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE;IACtB;AAcA;;;AAGG;IACO,SAAS,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE;IACtB;AAOA;;;AAGG;IACO,SAAS,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE;IACtB;AAIA;;;AAGG;IACO,OAAO,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;aAC1B,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC;AACvC,iBAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;AACrF,gBAAA,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,CACnC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,eAAe,CACjF,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACtB;AAmBA,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AApKA,QAAA,IAAA,CAAA,cAAc,GAAG,SAAS,CAAW,gBAAgB,qFAAC;AACtD,QAAA,IAAA,CAAA,YAAY,GAAG,SAAS,CAAW,cAAc,mFAAC;AAClD,QAAA,IAAA,CAAA,oBAAoB,GAAG,SAAS,CAAW,sBAAsB,2FAAC;AAClE,QAAA,IAAA,CAAA,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAY,YAAY,CAAC;AACxD,QAAA,IAAA,CAAA,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAY,aAAa,CAAC;AAC1D,QAAA,IAAA,CAAA,cAAc,GAAG,SAAS,CAA0B,gBAAgB,qFAAC;AACrE,QAAA,IAAA,CAAA,cAAc,GAAG,SAAS,CAAC,QAAQ,CAAyB,gBAAgB,CAAC;AAC7E,QAAA,IAAA,CAAA,oBAAoB,GAAG,SAAS,CAAoB,sBAAsB,2FAAC;AAC3E,QAAA,IAAA,CAAA,0BAA0B,GAAG,SAAS,CAAoB,4BAA4B,iGAAC;AACvF,QAAA,IAAA,CAAA,sBAAsB,GAAG,SAAS,CAAoB,wBAAwB,6FAAC;AAC/E,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAU,IAAI,mFAAC;AACnC,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAU,IAAI,oFAAC;AACpC,QAAA,IAAA,CAAA,sBAAsB,GAAG,KAAK,CAAU,KAAK,6FAAC;AAC9C,QAAA,IAAA,CAAA,iBAAiB,GAAG,KAAK,CAAkB,EAAE,wFAAC;AAC9C,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAA4B,SAAS,oFAAC;AAC1D,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAClC,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAS,EAAE,wFAAC;AACtC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAqC,EAAE,8EAAC;;AAGxD,QAAA,IAAA,CAAA,MAAM,GAAG,QAAQ,CAA+C,MACjF,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;cACnC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,QAAQ;cAClE,SAAS,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACd;;QAGkB,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAC3C,IAAI,CAAC,sBAAsB,EAAE,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,cAAc,KAAK,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAChG;;AAGkB,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,iFAAC;AAwDtD,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAe,EAAE,8EAAC;AAUlC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAA0B,EAAE,8EAAC;AAEhE;;;AAGG;AACyB,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAChD,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,iFAChG;QAEkB,IAAA,CAAA,OAAO,GAAG,MAAM,CAA0B,CAAC,GAAG,cAAc,CAAC,8EAAC;AAU9D,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAA0B,EAAE,8EAAC;AAC7C,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAA0B,EAAE,4EAAC;;QAEpD,IAAA,CAAA,MAAM,GAAY,EAAE;AAUX,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAA0B,EAAE,2EAAC;QAcnD,IAAA,CAAA,OAAO,GAAG,MAAM,CAA0B,CAAC,GAAG,4BAA4B,CAAC,8EAAC;QAC5E,IAAA,CAAA,OAAO,GAAG,MAAM,CAAiC,IAAI,CAAC,aAAa,EAAE,8EAAC;AAEhF;;;AAGG;AACgB,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAiC,MAAK;AACjF,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAC3C,YAAA,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,OAAO,IAAI,CAAC,OAAO,EAAE;YACjE,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACjE,QAAA,CAAC,sFAAC;AACQ,QAAA,IAAA,CAAA,QAAQ,GAAiB,IAAI,YAAY,EAAE;AAC3C,QAAA,IAAA,CAAA,cAAc,GAAiB,IAAI,YAAY,EAAE;QACjD,IAAA,CAAA,IAAI,GAAgC,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO;QAC5E,IAAA,CAAA,UAAU,GAAG,KAAK;;AAOxB,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,CAAC;QAC7B,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,mBAAmB,EAAE,KAAK,EAAE,aAAa,CAAC,gBAAgB,EAAE,CAAC;QAClI,IAAI,CAAC,gBAAgB,EAAE;;QAGvB,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,CAA8B,IAAI,EAAE,YAAY,CAAC;;AAGrF,QAAA,IAAI,CAAC;AACF,aAAA,OAAO,CAAC;AACP,YAAA,WAAW,CAAC,MAAM;AAClB,YAAA,WAAW,CAAC,KAAK;AACjB,YAAA,WAAW,CAAC,MAAM;AAClB,YAAA,WAAW,CAAC,KAAK;AACjB,YAAA,WAAW,CAAC,MAAM;SACnB;AACA,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aACxC,SAAS,CAAC,MAAM,IAAG;YAClB,IAAI,CAAC,IAAI,CAAC,UAAU;AAAE,gBAAA,OAAO;AAC7B,YAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE;AACnD,gBAAA,IAAI,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;oBAC7B,IAAI,CAAC,0BAA0B,EAAE;gBACnC;YACF;AACF,QAAA,CAAC,CAAC;;AAGJ,QAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU;AAC7B,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aACxC,SAAS,CAAC,OAAO,IAAG;YACnB,IAAI,OAAO,CAAC,EAAE,KAAK,eAAe,CAAC,yBAAyB,EAAE;gBAC5D,IAAI,CAAC,wBAAwB,EAAE;YACjC;iBAAO,IAAI,OAAO,CAAC,EAAE,KAAK,eAAe,CAAC,uBAAuB,EAAE;AACjE,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;gBAC5B,IAAI,MAAM,EAAE;AACV,oBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;gBAC3B;gBACA,IAAI,CAAC,0BAA0B,EAAE;YACnC;AACF,QAAA,CAAC,CAAC;;AAGJ,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE;YACnC,IAAI,CAAC,QAAQ,EAAE;QACjB;;QAGA,IAAI,CAAC,UAAU,EAAE;QACjB,IAAI,CAAC,WAAW,EAAE;;QAGlB,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;YACtB,IAAI,CAAC,0BAA0B,EAAE;AACjC,YAAA,IAAI,CAAC,UAAU,EAAE,CAAC;AACf,iBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;iBACxC,SAAS,CAAC,MAAM,IAAG;gBAClB,IAAI,CAAC,qBAAqB,EAAE;;gBAE5B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,KAAK,MAAM,EAAE;AACrC,oBAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC;gBACxC;AACF,YAAA,CAAC,CAAC;AACJ,YAAA,IAAI,CAAC,WAAW,EAAE,CAAC;AAChB,iBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;iBACxC,SAAS,CAAC,MAAM,IAAG;gBAClB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,KAAK,MAAM,EAAE;AACtC,oBAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC;gBACzC;AACF,YAAA,CAAC,CAAC;YACJ,IAAI,CAAC,qBAAqB,EAAE;YAC5B,IAAI,CAAC,wBAAwB,EAAE;YAC/B,IAAI,CAAC,cAAc,EAAE;;AAGrB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;YAC5B,IAAI,MAAM,EAAE;AACV,gBAAA,kBAAkB,CAAC,MAAM,CAAC,OAAO;AAC9B,qBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,qBAAA,SAAS,CAAC,CAAC,KAAkC,KAAI;AAChD,oBAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,wBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK;AAC5B,wBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;oBAClB;AACF,gBAAA,CAAC,CAAC;YACN;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE;AAC1C,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;AACzG,YAAA,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;YACzB,IAAI,QAAQ,EAAE;gBACZ,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,CAAC,QAAQ,CAAC;gBACtC,IAAI,CAAC,cAAc,EAAE;YACvB;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE;AACxC,YAAA,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AAC7B,gBAAA,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAC1D,CAAC,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAC1D;YACH;AACF,QAAA,CAAC,CAAC;IACJ;AAGA;;AAEK;IACG,aAAa,GAAA;QACnB,IAAI,OAAO,GAAmC,EAAE;AAChD,QAAA,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC;AAC5E,QAAA,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sCAAsC,EAAE,SAAS,EAAE,sCAAsC,EAAE,KAAK,EAAE,aAAa,CAAC,+BAA+B,EAAE,CAAC;AACvK,QAAA,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iCAAiC,EAAE,SAAS,EAAE,iCAAiC,EAAE,KAAK,EAAE,aAAa,CAAC,2BAA2B,EAAE,CAAC;AACzJ,QAAA,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,mBAAmB,EAAE,KAAK,EAAE,aAAa,CAAC,gBAAgB,EAAE,CAAC;AAClH,QAAA,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,aAAa,CAAC,qBAAqB,EAAE,CAAC;AACjH,QAAA,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,CAAC,eAAe,EAAE,CAAC;AAC/F,QAAA,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE,aAAa,CAAC,cAAc,EAAE,CAAC;AAC5G,QAAA,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,CAAC,mBAAmB,EAAE,CAAC;AACjG,QAAA,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,SAAS,EAAE,yBAAyB,EAAE,KAAK,EAAE,aAAa,CAAC,qBAAqB,EAAE,CAAC;AACnI,QAAA,OAAO,OAAO;IAChB;AAEA;;;;AAIG;AACI,IAAA,mBAAmB,CAAC,EAAU,EAAA;QACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;IAC1E;AAGA;;AAEG;IACO,QAAQ,GAAA;AAChB,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO;aACxB,SAAS,CAAC,CAAC,IAAG;AACb,YAAA,IAAI,CAAC,CAAC,OAAO,EAAE;gBACb,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YACxB;AACF,QAAA,CAAC,CAAC;IACN;AAGA;;AAEG;IACK,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;YAAE;AACrC,QAAA,IAAI,CAAC,cAAc,CAAC,eAAe;aAChC,SAAS,CAAC,CAAC,IAAG;YACb,IAAI,CAAC,CAAC,CAAC,OAAO;gBAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;iBAC9C;AACH,gBAAA,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,QAAmB,CAAC;YAChE;AACF,QAAA,CAAC,CAAC;IACN;AAEA;;AAEG;IACO,gBAAgB,GAAA;QACxB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACnD,QAAA,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE;IAC7B;AAEA;;AAEE;IACQ,iBAAiB,GAAA;QACzB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;AACrD,QAAA,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE;IAC9B;AAGA;;AAEG;IACO,0BAA0B,GAAA;AAClC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;QACpC,IAAI,UAAU,EAAE;YACd,IAAI,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC;gBACvD,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC;gBACpD,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE;AACvD,gBAAA,IAAI,UAAU,CAAC,MAAM,EAAE;oBACrB,UAAU,CAAC,KAAK,EAAE;gBACpB;AACA,gBAAA,UAAU,CAAC,IAAI,GAAG,MAAM;AACxB,gBAAA,UAAU,CAAC,YAAY,GAAG,KAAK;gBAC/B,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;YACnD;iBAAO;gBACL,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE;oBAClD,UAAU,CAAC,IAAI,EAAE;gBACnB;qBAAO,IAAI,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;oBACvD,UAAU,CAAC,KAAK,EAAE;gBACpB;AACA,gBAAA,UAAU,CAAC,IAAI,GAAG,MAAM;AACxB,gBAAA,UAAU,CAAC,YAAY,GAAG,IAAI;AAC9B,gBAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;YACvC;QACF;QACA,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;YACtC,IAAI,WAAW,EAAE;gBACf,IAAI,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC;oBACvD,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC;oBACpD,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE;AACvD,oBAAA,IAAI,WAAW,CAAC,MAAM,EAAE;wBACtB,WAAW,CAAC,KAAK,EAAE;oBACrB;AACA,oBAAA,WAAW,CAAC,IAAI,GAAG,MAAM;AACzB,oBAAA,WAAW,CAAC,YAAY,GAAG,KAAK;oBAChC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC;gBACrD;qBAAO;AACL,oBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;wBACrB,WAAW,CAAC,KAAK,EAAE;oBACrB;yBAAO,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE;wBAC3D,WAAW,CAAC,IAAI,EAAE;oBACpB;yBAAO,IAAI,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE;wBACzD,WAAW,CAAC,KAAK,EAAE;oBACrB;AACA,oBAAA,WAAW,CAAC,IAAI,GAAG,MAAM;AACzB,oBAAA,WAAW,CAAC,YAAY,GAAG,IAAI;AAC/B,oBAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC;gBACxC;YACF;QACF,CAAC,EAAE,GAAG,CAAC;IACT;AAEA;;AAEG;IACK,gBAAgB,GAAA;QACtB,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE;AACjE,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;IAC7B;AAEA;;;AAGG;IACO,eAAe,CAAC,iBAA0B,IAAI,EAAA;QACtD,IAAI,cAAc,EAAE;YAClB,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;QAChE;QACA,MAAM,OAAO,GAAiB,EAAE;QAChC,MAAM,OAAO,GAA4B,EAAE;AAC3C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE;QACpC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,IAAG;AAC5C,YAAA,IAAI,OAAO,CAAC,KAAK,IAAI,cAAc,CAAC,kBAAkB,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,iBAAiB,CAAC,EAAE;AACzG,gBAAA,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,SAAS,EAAE,oBAAoB,EAAE,KAAK,EAAE,aAAa,CAAC,iBAAiB,EAAE,CAAC;YACvH;YACA,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,KAAK,CAAC;YACzG,IAAI,eAAe,EAAE;AACnB,gBAAA,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAG;oBACzD,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE;wBACtD,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAG;AAC7E,4BAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,wBAAA,CAAC,CAAC;oBACJ;AACF,gBAAA,CAAC,CAAC;AACF,gBAAA,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAG;oBACzD,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE;wBACtD,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAG;AAC1D,4BAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,wBAAA,CAAC,CAAC;oBACJ;AACF,gBAAA,CAAC,CAAC;YACJ;AACF,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AAC7B,YAAA,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;QACpI;AACA,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AAC7B,YAAA,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;QACpI;AACA,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AAC7B,YAAA,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;QACpI;QACA,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,wBAAwB,EAAE;IACjC;AAEA;;AAEC;IACO,qBAAqB,GAAA;QAC3B,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,gBAAgB,GAAG,IAAI,CAAC,YAAY,EAAE;AAC1C,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;AACjB,gBAAA,gBAAgB,GAAG,IAAI,CAAC,cAAc,EAAE;YAC1C;YACA,gBAAgB,EAAE,KAAK,EAAE;QAC3B,CAAC,EAAE,GAAG,CAAC;IACT;AAEA;;AAEG;IACO,WAAW,GAAA;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;YAAE;QACrC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO;aACnD,SAAS,CACR,CAAC,IAAG;AACF,YAAA,IAAI,CAAC,CAAC,OAAO,EAAE;gBACb,MAAM,KAAK,GAAuC,EAAE;AACpD,gBAAA,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAG;AAClB,oBAAA,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAC9C,gBAAA,CAAC,CAAC;AACF,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gBACvB,IAAI,CAAC,0BAA0B,EAAE;YACnC;AACF,QAAA,CAAC,CAAC;IACR;AAEA;;;AAGG;IACH,UAAU,CAAC,YAAqB,KAAK,EAAA;QACnC,IAAI,CAAC,UAAU,EAAE;QACjB,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AAC5C,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CACjC,sBAAsB,EACtB,CAAC,EACD,aAAa,CAAC;YAChB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,KAAI;AAC1C,gBAAA,IAAI,IAAI,EAAE,KAAK,EAAE;AACf,oBAAA,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;wBAC7B,MAAM,EAAE,aAAa,CAAC,OAAO;wBAC7B,IAAI,EAAE,IAAI,CAAC,KAAK;wBAChB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY;AACvC,qBAAA,CAAC,CAAC,SAAS,CAAC,CAAC,IAAG;AACf,wBAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;4BACd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;wBACrC;6BAAO;AACL,4BAAA,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE;AAC5D,4BAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC;4BACjD,UAAU,CAAC,MAAK;gCACd,IAAI,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC;4BACxC,CAAC,EAAE,GAAG,CAAC;AACP,4BAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,qCAAqC,CAAC;4BAC/D,CAAC,CAAC,KAAK,EAAE;wBACX;AACF,oBAAA,CAAC,CAAC;gBACJ;AACF,YAAA,CAAC,CAAC;QACJ;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;AAC7B,gBAAA,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ;gBAC9B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY;AACvC,aAAA,CAAC,CAAC,SAAS,CAAC,CAAC,IAAG;AACf,gBAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;oBACd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;gBACrC;qBAAO;AACL,oBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAG;wBAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;wBACvD,IAAI,IAAI,EAAE;4BACR,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI;wBAChC;AACA,wBAAA,OAAO,CAAC,GAAG,KAAK,CAAC;AACnB,oBAAA,CAAC,CAAC;AACF,oBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,qCAAqC,CAAC;gBACjE;AACF,YAAA,CAAC,CAAC;QACJ;IACF;AAEA;;AAEG;IACH,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;YAC9B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,0CAA0C,EAAE,UAAU,EAAE,eAAe;AAC/F,iBAAA,iBAAiB,CAAC;AAClB,iBAAA,SAAS,CAAC,CAAC,IAAkB,KAAI;AAChC,gBAAA,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE;AACxB,oBAAA,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;wBAC9B,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ;6BACxD,SAAS,CAAC,CAAC,IAAG;AACb,4BAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;gCACd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;4BACrC;iCAAO;AACL,gCAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAG;oCAC1B,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;AACzE,oCAAA,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;AACZ,wCAAA,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;oCACpB;AACA,oCAAA,OAAO,CAAC,GAAG,KAAK,CAAC;AACnB,gCAAA,CAAC,CAAC;AACF,gCAAA,IAAI,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE;AAC9B,gCAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,SAAS;AACtC,gCAAA,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,SAAS;AACxC,gCAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,qCAAqC,CAAC;4BACjE;AACF,wBAAA,CAAC,CAAC;oBACN;gBACF;AACF,YAAA,CAAC,CAAC;QACN;IACF;AAEA;;;AAGG;AACH,IAAA,YAAY,CAAC,IAAkD,EAAA;QAC7D,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAC3B,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;AACzC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAC1C,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE;YAC1C,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;YAC9C,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;YAC1C,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;gBAC1C,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;gBAC1C,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;gBACxC,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;gBACpC,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;gBACpC,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE;oBACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ;oBACpC,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM;gBAClC;gBACA,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;gBACpC,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;gBAC9C,IAAI,CAAC,YAAY,CAAC,0BAA0B,GAAG,MAAM,CAAC,0BAA0B;gBAChF,IAAI,CAAC,YAAY,CAAC,6BAA6B,GAAG,MAAM,CAAC,6BAA6B;gBACtF,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY;gBACpD,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;gBAChD,IAAI,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,YAAY,EAAE;oBAChD,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,MAAM,CAAC,cAAc;oBAChD,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,MAAM,CAAC,YAAY;gBAC9C;gBACA,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;gBACxC,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;gBACpC,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;gBACtC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;gBACxC,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY;gBACpD,IAAI,CAAC,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa;gBACtD,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY;gBACpD,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW;gBAClD,IAAI,CAAC,YAAY,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc;gBACxD,IAAI,CAAC,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa;gBACtD,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY;;AAEpD,gBAAA,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,IAAI,SAAS;AAC7C,oBAAA,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,SAAS;AACzC,oBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,SAAS;AACrC,oBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI,SAAS,EAAE;AACvC,oBAAA,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE;gBACrC;AACA,gBAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,IAAI,SAAS;AACvE,oBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,SAAS;AACrC,oBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,SAAS,EAAE;AACrC,oBAAA,IAAI,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE;gBAC3C;AAAO,qBAAA,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,IAAI,SAAS,EAAE;AAC/E,oBAAA,IAAI,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE;gBAC3C;gBACA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,oBAAA,IAAI,CAAC,YAAY,CAAC,cAAc,IAAI,SAAS;AAC7C,oBAAA,IAAI,CAAC,YAAY,CAAC,YAAY,IAAI,SAAS;AAC3C,oBAAA,IAAI,CAAC,YAAY,CAAC,aAAa,IAAI,SAAS,EAAE;AAC9C,oBAAA,IAAI,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE;gBACvC;YACF,CAAC,EAAE,GAAG,CAAC;QACT;aAAO;YACL,IAAI,CAAC,WAAW,EAAE;QACpB;IAEF;AAEA;;AAEG;IACO,WAAW,GAAA;AACnB,QAAA,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,gBAAgB,CAAC;QACnF,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC;QACtC;AACA,QAAA,IAAI,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE;AAC9B,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,SAAS;AACtC,QAAA,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,SAAS;AACxC,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AACrB,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;IAC7B;AAEA;;AAEC;IACO,UAAU,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE;AACxD,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI;AACnC,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACpD,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACtD;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,SAAS;QACpC;AACA,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI;YAC/C,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE;QAC7C;AACA,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,CAAC,EAAE;AACpE,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU;AACzC,YAAA,IAAI,CAAC,YAAY,CAAC,cAAc,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC1D,YAAA,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5D;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,SAAS;QAC1C;AACA,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,YAAY,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI;YAC3D,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE;QACzD;AACA,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AAC1B,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QACxF;IACF;AAEA;;AAEE;IACQ,WAAW,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,YAAA,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE;AACtB,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAClB;IACF;AAGA;;AAEG;IACO,cAAc,GAAA;;AAEtB,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,EAAE;AAC9B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,SAAS;QAClC,IAAI,OAAO,GAA4B,EAAE;AACzC,QAAA,MAAM,OAAO,GACX,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI;AACzC,cAAE,IAAI,CAAC,YAAY,CAAC;AACpB,cAAE,IAAI,CAAC,OAAO,EAAE;AACpB,QAAA,cAAc,CAAC,OAAO,CAAC,CAAC,IAAG;AACzB,YAAA,IAAI,OAAO;gBACT,OAAO,CAAC,MAAM,GAAG,CAAC;AAClB,gBAAA,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE;AACvD,gBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACjB;AACF,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE;AACvB,YAAA,cAAc,CAAC,OAAO,CAAC,CAAC,IAAG;AACzB,gBAAA,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE;AACf,oBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gBACjB;AACF,YAAA,CAAC,CAAC;QACJ;QACA,IAAI,KAAK,GAA4B,EAAE;AACvC,QAAA,kBAAkB,CAAC,OAAO,CAAC,CAAC,IAAG;AAC7B,YAAA,IAAI,OAAO;gBACT,OAAO,CAAC,MAAM,GAAG,CAAC;AAClB,gBAAA,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE;AAC1D,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACf;AACF,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;AACrB,YAAA,KAAK,GAAG,CAAC,GAAG,kBAAkB,CAAC;QACjC;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACtE,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;AAEA;;;;AAIG;AACK,IAAA,WAAW,CAAC,MAA2B,EAAA;AAC7C,QAAA,QAAQ,MAAM,CAAC,MAAM,KAAK;eACrB,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI;eAChC,MAAM,CAAC,MAAM,KAAK;eAClB,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI;eAChC,MAAM,CAAC,KAAK,KAAK;eACjB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,IAAI;eAC/B,MAAM,CAAC,QAAQ,KAAK;eACpB,MAAM,CAAC,YAAY,KAAK;eACxB,MAAM,CAAC,YAAY,KAAK;eACxB,MAAM,CAAC,MAAM,KAAK;eAClB,MAAM,CAAC,QAAQ,KAAK;eACpB,MAAM,CAAC,MAAM,KAAK;eAClB,MAAM,CAAC,IAAI,KAAK;eAChB,MAAM,CAAC,YAAY,KAAK;eACxB,MAAM,CAAC,MAAM,KAAK;eAClB,MAAM,CAAC,cAAc,KAAK;eAC1B,MAAM,CAAC,YAAY,KAAK;eACxB,MAAM,CAAC,UAAU,KAAK;eACtB,MAAM,CAAC,GAAG,KAAK;eACf,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI;eAC7B,MAAM,CAAC,IAAI,KAAK;eAChB,MAAM,CAAC,SAAS,KAAK;eACrB,MAAM,CAAC,IAAI,KAAK;eAChB,MAAM,CAAC,uBAAuB,KAAK;eACnC,MAAM,CAAC,0BAA0B,KAAK;eACtC,MAAM,CAAC,YAAY,KAAK;eACxB,MAAM,CAAC,aAAa,KAAK;eACzB,MAAM,CAAC,WAAW,KAAK;eACvB,MAAM,CAAC,YAAY,KAAK;eACxB,MAAM,CAAC,cAAc,KAAK;eAC1B,MAAM,CAAC,YAAY,KAAK;eACxB,MAAM,CAAC,aAAa,KAAK;eACzB,MAAM,CAAC,KAAK,KAAK;eACjB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,IAAI;eAC/B,MAAM,CAAC,MAAM,KAAK;eAClB,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI;AAChC,eAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI;AACtB,eAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI;AACpB,eAAA,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI;AAC5B,eAAA,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,IAAI;IACrC;AAGA;;;;AAIG;AACK,IAAA,cAAc,CAAC,MAAqB,EAAA;AAC1C,QAAA,QAAQ,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;IACzH;AAEA;;AAEG;IACK,wBAAwB,GAAA;QAC9B,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,MAAM,IAAG;YAC9B,IAAI,WAAW,GAAG,CAAC;YACnB,IAAI,MAAM,CAAC,KAAK,KAAK,aAAa,CAAC,IAAI,EAAE;AACvC,gBAAA,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC;YAC7F;iBAAO,IAAI,MAAM,CAAC,KAAK,KAAK,aAAa,CAAC,eAAe,EAAE;AACzD,gBAAA,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC;YACjG;iBAAO,IAAI,MAAM,CAAC,KAAK,KAAK,aAAa,CAAC,cAAc,EAAE;AACxD,gBAAA,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;YAC9F;iBAAO,IAAI,MAAM,CAAC,KAAK,KAAK,aAAa,CAAC,qBAAqB,EAAE;AAC/D,gBAAA,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,cAAc,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC;YAChG;iBAAO;AACL,gBAAA,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC;YAChF;AACA,YAAA,IAAI,WAAW,GAAG,CAAC,EAAE;AACnB,gBAAA,MAAM,CAAC,GAAG,GAAG,WAAW,CAAC,QAAQ,EAAE;AACnC,gBAAA,MAAM,CAAC,OAAO,GAAG,WAAW,GAAG,YAAY;YAC7C;iBAAO;AACL,gBAAA,MAAM,CAAC,GAAG,GAAG,SAAS;AACtB,gBAAA,MAAM,CAAC,OAAO,GAAG,SAAS;YAC5B;AACF,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;IAC5C;AAEA;;;;AAIG;AACK,IAAA,SAAS,CAAC,MAAqB,EAAA;AACrC,QAAA,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3G,YAAA,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5D;AAEA;;AAEG;IACO,cAAc,GAAA;AACtB,QAAA,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;;QAE/D,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE;;YAE7B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAG;AACnE,gBAAA,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE;YACxD,CAAC,CAAC,CAAC;QACL;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;;YAEzF,IAAI,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,qBAAqB,CAAC,EAAE;AAC5D,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB;iBAAO,IAAI,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,qBAAqB,CAAC,EAAE;AACnE,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAG;AACzF,oBAAA,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE;gBACxD,CAAC,CAAC,CAAC;YACL;AAAO,iBAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;gBACxB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAG;AACnE,oBAAA,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE;gBACxD,CAAC,CAAC,CAAC;YACL;QACF;AACA,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE;QACvB,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,qBAAqB,EAAE;IAC9B;AAEA;;;;;AAKG;AACK,IAAA,YAAY,CAAC,OAAwB,EAAE,IAAA,GAAe,CAAC,EAAA;AAC7D,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO;QAChD,IAAI,EAAE,GAAY,KAAK;AACvB,QAAA,IAAI,IAAI,KAAK,CAAC,EAAE;;AAEd,YAAA,cAAc,EAAE,OAAO,CAAC,CAAC,IAAG;gBAC1B,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;gBACzD,IAAI,CAAC,EAAE,EAAE;oBACP;gBACF;AACF,YAAA,CAAC,CAAC;AACF,YAAA,OAAO,EAAE,IAAI,OAAO,CAAC,MAAM,KAAK,cAAc,EAAE,MAAM,IAAI,CAAC,CAAC;QAC9D;AAAO,aAAA,IAAI,IAAI,KAAK,CAAC,EAAE;;AAErB,YAAA,OAAO,CAAC,OAAO,CAAC,CAAC,IAAG;gBAClB,EAAE,GAAG,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;gBACjE,IAAI,CAAC,EAAE,EAAE;oBACP;gBACF;AACF,YAAA,CAAC,CAAC;QACJ;AAAO,aAAA,IAAI,IAAI,KAAK,CAAC,EAAE;;AAErB,YAAA,OAAO,CAAC,OAAO,CAAC,CAAC,IAAG;gBAClB,EAAE,GAAG,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;gBACjE,IAAI,EAAE,EAAE;oBACN;gBACF;AACF,YAAA,CAAC,CAAC;QACJ;AACA,QAAA,OAAO,EAAE;IACX;AAEA;;;;AAIG;IACK,YAAY,CAAC,YAAqB,KAAK,EAAA;AAC7C,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU;YACrD,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ;QACnD;AACA,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,YAAY,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU;YACjE,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ;QAC/D;AACA,QAAA,IAAI,SAAS,GAAwB,IAAI,mBAAmB,EAAE;AAC9D,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE;YAChD,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;YACzC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ;YAC/C,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;YACzC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ;AAC/C,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;gBACzB,SAAS,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC;gBAC/C,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,EAAE;gBACnD,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,EAAE;gBACnD,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ;gBAC/C,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM;gBAC3C,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY;gBACvD,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa;gBACzD,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW;gBACrD,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY;gBACvD,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc;gBAC3D,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY;gBACvD,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa;YAC3D;iBAAO;AACL,gBAAA,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AAC1B,oBAAA,SAAS,CAAC,IAAI,GAAG,kBAAkB,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;gBACjF;gBACA,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS;gBACjD,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ;gBAC/C,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM;AAC3C,gBAAA,SAAS,CAAC,MAAM,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;gBACjF,IAAI,IAAI,CAAC,YAAY,CAAC;AACpB,oBAAA,aAAa,CAAC,IAAI;AAClB,oBAAA,aAAa,CAAC,+BAA+B;AAC7C,oBAAA,aAAa,CAAC,qBAAqB;AACnC,oBAAA,aAAa,CAAC,mBAAmB;AACjC,oBAAA,aAAa,CAAC;iBAAkB,EAAE,CAAC,CAAC,EAAE;oBACtC,SAAS,CAAC,uBAAuB,GAAG,IAAI,CAAC,YAAY,CAAC,uBAAuB;gBAC/E;gBACA,IAAI,IAAI,CAAC,YAAY,CAAC;AACpB,oBAAA,aAAa,CAAC,gBAAgB;AAC9B,oBAAA,aAAa,CAAC,+BAA+B;AAC7C,oBAAA,aAAa,CAAC;iBAAsB,EAAE,CAAC,CAAC,EAAE;oBAC1C,SAAS,CAAC,0BAA0B,GAAG,IAAI,CAAC,YAAY,CAAC,0BAA0B;oBACnF,SAAS,CAAC,6BAA6B,GAAG,IAAI,CAAC,YAAY,CAAC,6BAA6B;oBACzF,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO;oBAC7C,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM;oBAC3C,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI;oBACvC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM;oBAC3C,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,EAAE;AACnD,oBAAA,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AAC7D,wBAAA,SAAS,CAAC,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;oBACtE;oBACA,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;AAC/C,oBAAA,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AACzD,wBAAA,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;oBAClE;oBACA,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM;oBAC3C,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY;oBACvD,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU;oBACnD,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc;oBAC3D,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY;gBACzD;AACA,gBAAA,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE;oBAC9C,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI;gBACzC;YACF;QACF;aAAO;YACL,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAwB;YACvE,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ;YAC/C,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,EAAE;AACnD,YAAA,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AAC7D,gBAAA,SAAS,CAAC,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YACtE;YACA,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;AAC/C,YAAA,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AACzD,gBAAA,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YAClE;AACA,YAAA,IAAI,SAAS,CAAC,IAAI,EAAE;gBAClB,SAAS,CAAC,IAAI,GAAG,kBAAkB,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC;YACzE;YACA,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS;QACnD;;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,8BAA8B,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACvG,QAAA,IAAI,SAAS,CAAC,IAAI,IAAI,SAAS,EAAE;AAC/B,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;AACxC,YAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;QACpC;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,CAA6B,KAAK,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE;AAClI,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1C;QACA,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK;;QAE3C,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE;YACnC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ;YACnD,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;AAC/C,YAAA,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,WAAW,EAAE;QAC/D;QACA,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;YACjC,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;AACjC,gBAAA,MAAM,KAAK,GAAiB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAiB;AAClF,gBAAA,IAAI,KAAK,GAAG,CAAC,EAAE;AACb,oBAAA,SAAS,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;gBAC5B;;oBACE,SAAS,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;YACjF;iBAAO;gBACL,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC;AACvC,oBAAA,SAAS,CAAC,MAAM,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;YACrF;QACF;QACA,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;YAC/B,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAC1E;QACA,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;YACjC,SAAS,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAC/E;AAEA,QAAA,SAAS,CAAC,OAAO,GAAG,CAAC;AACrB,QAAA,SAAS,CAAC,KAAK,GAAG,EAAE;QACpB,IAAI,SAAS,EAAE;AACb,YAAA,SAAS,CAAC,KAAK,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,CAAC;QAC7B;;QAGA,IAAI,CAAC,uBAAuB,EAAE;AAE9B,QAAA,OAAO,SAAS;IAClB;AAEA;;AAEG;IACK,uBAAuB,GAAA;QAC7B,IAAI,iBAAiB,GAAG,EAAE;AAC1B,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;YAC1C,IAAI,CAAC,GAAG,CAAC;gBAAE,iBAAiB,IAAI,IAAI;AACpC,YAAA,iBAAiB,IAAI,CAAC,CAAC,SAAS;AAClC,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE;YAChD,iBAAiB,IAAI,KAAK;AAC1B,YAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;gBAC1C,IAAI,CAAC,GAAG,CAAC;oBAAE,iBAAiB,IAAI,IAAI;AACpC,gBAAA,iBAAiB,IAAI,CAAC,CAAC,IAAI;AAC7B,YAAA,CAAC,CAAC;QACJ;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE;YAChD,iBAAiB,IAAI,KAAK;AAC1B,YAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;gBAC1C,IAAI,CAAC,GAAG,CAAC;oBAAE,iBAAiB,IAAI,IAAI;AACpC,gBAAA,iBAAiB,IAAI,CAAC,CAAC,IAAI;AAC7B,YAAA,CAAC,CAAC;QACJ;AACA,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC/C;AAEA;;;AAGG;AACO,IAAA,WAAW,CAAC,MAA2B,EAAA;AAC/C,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;YAAE;AACrC,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM;AACnC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,CAAC,IAAG;AACR,gBAAA,IAAI,CAAC,CAAC,OAAO,EAAE;AACb,oBAAA,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;AACjD,oBAAA,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE;AAClB,wBAAA,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;wBACvD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE;4BAChC,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE;AACrC,4BAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;AAC3C,4BAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,KAAK,IAAI;wBAC9E;oBACF;AACA,oBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;oBAC7B,IAAI,CAAC,0BAA0B,EAAE;gBACnC;YACF,CAAC;YACD,QAAQ,EAAE,MAAK;AACb,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;YAC5B;AACD,SAAA,CAAC;IACN;AAEA;;AAEG;IACO,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE;AACtB,QAAA,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;IACnC;AAEA;;;AAGG;IACO,KAAK,CAAC,YAAqB,KAAK,EAAA;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;AACjD,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,qBAAqB,CAAC;AAC9C,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,YAAY;AACnC,aAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;aACnD,SAAS,CAAC,CAAC,IAAG;YACb,IAAI,CAAC,CAAC,CAAC,OAAO;gBAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;iBAC9C;;gBAEH,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC;;gBAEvC,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE;oBACjC,IAAI,SAAS,EAAE;AACb,wBAAA,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;oBAChC;gBACF;qBAAO;oBACL,IAAI,CAAC,UAAU,EAAE;gBACnB;gBAEA,IAAI,SAAS,EAAE;AACb,oBAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,wBAAA,IAAI,CAAC,SAAS,EAAE,CAAC,SAAS,GAAG,CAAC;oBAChC;gBACF;AAEA,gBAAA,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBACd,IAAI,CAAC,0BAA0B,EAAE;YACnC;AACF,QAAA,CAAC,CAAC;IACN;AAEA;;;AAGG;AACO,IAAA,SAAS,CAAC,CAAY,EAAA;AAC9B,QAAA,IAAI,KAAK,GAAG,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC;AACzD,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,KAAK;QAC/B,IAAI,CAAC,KAAK,EAAE;IACd;AAGA;;;AAGG;AACO,IAAA,IAAI,CAAC,OAAoC,EAAA;QACjD,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;YAC1B,IAAI,CAAC,KAAK,EAAE;QACd;IACF;AAEA;;AAEG;IACO,IAAI,GAAA;QACZ,4EAAkE,CAAC,IAAI,CAAC,CAAC,EAAE,kCAAkC,EAAE,KAAI;AACjH,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,kCAAkC,EAAE;AAC1D,gBAAA,SAAS,EAAE,sBAAsB;AACjC,gBAAA,SAAS,EAAE,KAAK;AAChB,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,YAAY,EAAE,KAAK;AACnB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,KAAK,EAAE,KAAK;AACb,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;IACO,OAAO,GAAA;QACf,oFAAoF,CAAC,IAAI,CAAC,CAAC,EAAE,0CAA0C,EAAE,KAAI;YAC3I,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,0CAA0C,EAAE;AAC5E,gBAAA,SAAS,EAAE,oBAAoB;AAC/B,gBAAA,SAAS,EAAE,KAAK;AAChB,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,YAAY,EAAE,KAAK;AACnB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,KAAK,EAAE,KAAK;AACb,aAAA,CAAC;YACF,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAiC,KAAI;gBACvE,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK;AACrC,gBAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;gBAClC,CAAC,CAAC,KAAK,EAAE;AACX,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;IACO,QAAQ,GAAA;AAChB,QAAA,IAAI,CAAC;aACF,UAAU,CACT,IAAI,CAAC,MAAM,EACX,wBAAwB,EACxB,SAAS,EACT,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;AAC9D,cAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;cAC9D,SAAS;AAEd,aAAA,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAG;AACpC,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AAC7B,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE;YAC/B;AACA,YAAA,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,IAAG;gBAC7B,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;AAC3E,gBAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;AACpC,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACN;AAEA;;;AAGG;AACO,IAAA,WAAW,CAAC,IAA2B,EAAA;QAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAChF,QAAA,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YACZ,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;AACtC,YAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;QACpC;IACF;AAEA;;AAEG;IACO,WAAW,GAAA;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE;AAC7B,QAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;IACpC;+GA9uCW,uBAAuB,EAAA,IAAA,EAAA,EAAA,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,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,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,sBAAA,EAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,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,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,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,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,4BAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,4BAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,wBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnDpC,2lkCAumBW,EAAA,MAAA,EAAA,CAAA,o0gBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED9jBC,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,4EAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,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,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,yEAAA,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,EAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,4OAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,sRAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,kTAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,sRAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,gNAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,+bAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,QAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,cAAA,EAAA,WAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,aAAA,EAAA,QAAA,EAAA,aAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACzG,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,KAAA,EAAA,KAAA,EAAA,UAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,YAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,UAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,QAAQ,iNACtH,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,0BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,UAAA,EAAA,OAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,YAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,uBAAA,EAAA,+BAAA,EAAA,aAAA,EAAA,IAAA,EAAA,UAAA,EAAA,UAAA,EAAA,iCAAA,CAAA,EAAA,OAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,UAAA,EAAA,QAAA,EAAA,wEAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,cAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,qBAAqB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpJ,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,uBAAuB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,cAAA,EAAA,OAAA,EAAA,eAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,qBAAqB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrF,gCAAgC,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChC,4BAA4B,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,MAAA,EAAA,aAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,4BAA4B,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKjD,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAbnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB;wBACzG,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,mBAAmB,EAAE,QAAQ;AACtH,wBAAA,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,oBAAoB,EAAE,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,oBAAoB;AACpJ,wBAAA,aAAa,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,qBAAqB;wBACrF,gCAAgC;AAChC,wBAAA,4BAA4B,EAAE,4BAA4B,CAAC,EAAA,eAAA,EAG5C,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,2lkCAAA,EAAA,MAAA,EAAA,CAAA,o0gBAAA,CAAA,EAAA;AAKD,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,gBAAgB,sEAClB,cAAc,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACN,sBAAsB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACtB,YAAY,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACX,aAAa,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACL,gBAAgB,wEACR,gBAAgB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACxB,sBAAsB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,0BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAChB,4BAA4B,gFAChC,wBAAwB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MElC5E,6BAA6B,CAAA;AAQxC,IAAA,WAAA,GAAA;AAPiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AACvC,QAAA,IAAA,CAAA,cAAc,GAAG,SAAS,CAAC,QAAQ,CAA0B,gBAAgB,CAAC;AAC7E,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,QAAA,IAAA,CAAA,UAAU,GAA6B,MAAM,CAAC,eAAe,CAAC;AAChE,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,EAAC,YAA2C,EAAC;AAC/D,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;;;QAKjD,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,cAAc,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,IAAI,oBAAoB,CAAC,IAAI,CAAC;AACrG,QAAA,CAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU;AAC7B,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aACxC,SAAS,CAAC,OAAO,IAAG;YACnB,IAAI,OAAO,CAAC,EAAE,KAAK,eAAe,CAAC,uBAAuB,EAAE;AAC1D,gBAAA,MAAM,UAAU,GAAuB,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE;gBACjF,MAAM,QAAQ,GAAG,UAAU,IAAI,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,mBAAmB,CAAC,UAAU,CAAC,GAAG,SAAS;gBACvG,IAAI,QAAQ,EAAE;AACZ,oBAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAC/B,IAAI,CAAC,UAAU,CAAC,gBAAgB,IAAI,eAAe,CAAC,iBAAiB,EAAE,CAAC,QAAQ,CAAC,CAAC;AACpF,oBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;gBACxB;YACF;AACF,QAAA,CAAC,CAAC;IACN;AAEA;;;;;AAKG;IACO,SAAS,GAAA;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,SAAS;QACjD,MAAM,cAAc,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC;AAClD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AAE1C,QAAA,IAAI,KAAK,GACP,CAAC,IAAI,KAAK,oBAAoB,CAAC,MAAM,IAAI,cAAc,KAAK,CAAC;aAC5D,IAAI,KAAK,oBAAoB,CAAC,SAAS,IAAI,cAAc,GAAG,CAAC,CAAC;aAC9D,IAAI,KAAK,oBAAoB,CAAC,KAAK,IAAI,cAAc,GAAG,CAAC,CAAC;AAE7D,QAAA,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE;AACjE,YAAA,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,IAAG;gBAC1B,MAAM,MAAM,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAC,CAAC;gBACxD,IAAI,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;oBAC1E,KAAK,GAAG,KAAK;gBACf;AACF,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,OAAO,KAAK;IACd;AAEA;;;AAGG;IACO,MAAM,GAAA;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,SAAS,EAAE,GAAG;QAClD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAC/B,IAAI,CAAC,UAAU,CAAC,gBAAgB,IAAI,eAAe,CAAC,iBAAiB,EACrE,KAAK,CACN;AACD,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;QACxB;IACF;+GAxEW,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,cAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAPxB,WAAW,CAAC,YAAY,EAAE,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtB5C,w3EAwCqB,ygdDfT,cAAc,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,kBAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,0iBAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAX,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,q+HAAE,uBAAuB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,eAAA,EAAA,wBAAA,EAAA,mBAAA,EAAA,eAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAI1H,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBARzC,SAAS;AACF,YAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAE,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE,EAAE,EAAA,OAAA,EAGnC,CAAC,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,uBAAuB,CAAC,EAAA,UAAA,EAC1H,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,w3EAAA,EAAA,MAAA,EAAA,CAAA,i9cAAA,CAAA,EAAA;sGAIuB,gBAAgB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEI3E,2BAA2B,CAAA;AActC,IAAA,WAAA,GAAA;AAbiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AACxC,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACrC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAA4C,YAAY,CAAC;AAC3E,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAqC,eAAe,CAAC;AAC7D,QAAA,IAAA,CAAA,CAAC,GAAG,SAAS,CAAS,GAAG,wEAAC;QACpC,IAAA,CAAA,IAAI,GAAG,MAAM,EAA2C;AAC9C,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,GAAG,mBAAmB,GAAG,gBAAgB;AACnF,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAU,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACnE,QAAA,IAAA,CAAA,IAAI,GAAuB,IAAI,CAAC,UAAU,EAAE,WAAW,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE;AAC3D,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAA0B,EAAE,qFAAC;AAC7D,QAAA,IAAA,CAAA,YAAY,GAA0B,EAAE,IAAI,EAAE,iCAAiC,EAAE,KAAK,EAAE,WAAW,CAAC,SAAS,EAAE,EAAE;QAGzH,IAAI,CAAC,SAAS,EAAE;IAClB;AAEA;;;AAGG;IACK,SAAS,GAAA;AACf,QAAA,IAAI,CAAC;aACF,QAAQ,CAAC,EAAE,SAAS,EAAE,kBAAkB,CAAC,WAAW,EAAE;aACtD,SAAS,CAAC,CAAC,IAAG;AACb,YAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;gBACd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;YACrC;AAAO,iBAAA,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE;AACpC,gBAAA,MAAM,KAAK,GAA4B,CAAC,EAAE,IAAI,EAAE,iCAAiC,EAAE,KAAK,EAAE,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC;AACpH,gBAAA,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IACtB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAC3D;AACD,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC9B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;YAC/E;AACF,QAAA,CAAC,CAAC;IACN;AAEA;;;AAGG;IACO,IAAI,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE;AAC5C,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;YACtB;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;YAChB,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;QAC5C;AAEA,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,2BAA2B,CAAC;QACpD,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI;aACtC,IAAI,CACH,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EACnCW,UAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;aAE/C,SAAS,CAAC,CAAC,IAAG;AACb,YAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;gBACd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;YACrC;iBAAO;gBACL,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;AACtD,gBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,qCAAqC,CAAC;AAC/D,gBAAA,UAAU,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC;YAC/C;AACF,QAAA,CAAC,CAAC;IACN;+GApEW,2BAA2B,EAAA,IAAA,EAAA,EAAA,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,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAnBtB,WAAW,CAAC,YAAY,EAAE,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,GAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,GAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChB5C,2zEAuDM,EAAA,MAAA,EAAA,CAAA,sGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDlCF,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,GAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,cAAc,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,4EAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,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,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,yEAAA,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,EACXI,YAAU,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,4OAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,kTAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACV,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,cAAc,oLACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,0BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGN,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBApBvC,SAAS;2BACF,EAAE,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE,EAAE,EAAA,eAAA,EAG3B,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,aAAa;wBACb,cAAc;wBACd,gBAAgB;wBAChB,WAAW;wBACXT,YAAU;wBACV,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,aAAa;wBACb,gBAAgB;wBAChB,cAAc;wBACd;AACD,qBAAA,EAAA,QAAA,EAAA,2zEAAA,EAAA,MAAA,EAAA,CAAA,sGAAA,CAAA,EAAA;yFAQwC,GAAG,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;;;;;;AE0CxC,MAAO,wBAAyB,SAAQ,sBAAsB,CAAA;AA+BlE,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AA/BA,QAAA,IAAA,CAAA,aAAa,GAAG,SAAS,CAAY,eAAe,oFAAC;QACrD,IAAA,CAAA,OAAO,GAAG,MAAM,EAAE;QAClB,IAAA,CAAA,OAAO,GAAG,MAAM,EAAU;AAClB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC/C,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAE5B,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,EAAC,YAAsC,EAAC;AACxD,QAAA,IAAA,CAAA,UAAU,GAA8B,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,0BAA0B,CAAC,YAAY,EAAE;AACpH,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAgB,IAAI,0EAAC;AACjC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAgB,IAAI,4EAAC;AACnC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAU,KAAK,2EAAC;QAEtC,IAAA,CAAA,eAAe,GAAW,EAAE;QAC5B,IAAA,CAAA,aAAa,GAA4B,UAAU;AAC1C,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAkC,SAAS,mFAAC;QACjE,IAAA,CAAA,SAAS,GAAG,MAAM,CAA2B;AAC9D,YAAA,KAAK,EAAE,EAAE;AACT,YAAA,IAAI,EAAE,CAAC;AACP,YAAA,GAAG,EAAE,CAAC;AACN,YAAA,MAAM,EAAE,CAAC;AACV,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACiB,QAAA,IAAA,CAAA,wBAAwB,GAAG,MAAM,CAAU,KAAK,+FAAC;AACjD,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAU,KAAK,0FAAC;AAC5C,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAU,KAAK,oFAAC;AACtC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAU,KAAK,mFAAC;QACrC,IAAA,CAAA,IAAI,GAAgC,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO;AAK3F,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE;;YAEvB,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE;YACtC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;AAC/B,YAAA,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE;gBAClB,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC;YAC/B;YACA,IAAI,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;AACvC,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;AACzE,gBAAA,KAAK,IAAI,YAAY,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW;YAChE;AACA,YAAA,MAAM,GAAG,GACP,IAAI,CAAC,cAAc,CAAC,UAAU;AAC9B,gBAAA,2BAA2B,GAAG,KAAK;AACnC,gBAAA,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK;AACjC,gBAAA,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;QACzB;;AAGA,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAQ,KAAI;YAC9E,MAAM,KAAK,GAAG,CAAiB;YAC/B,IAAI,CAAC,KAAK,EAAE,IAAI;gBAAE;AAClB,YAAA,IAAI;gBACF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;AACnC,gBAAA,IAAI,CAAC,IAAI;oBAAE;AACX,gBAAA,QAAQ,IAAI,CAAC,IAAI;AACf,oBAAA,KAAK,WAAW;AACd,wBAAA,IAAI,CAAC,SAAS,CACZ,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EACxD,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EACjE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,EAChE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CACrF;wBACD;AACF,oBAAA,KAAK,UAAU;AACb,wBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;wBACvB;AACF,oBAAA,KAAK,YAAY;wBACf,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC;wBAC/F;AACF,oBAAA,KAAK,MAAM;wBACT,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAe,EAAE,CAAC,CAAC;AAClE,wBAAA,IAAI,IAAI,CAAC,MAAM,EAAE;4BACf,IAAI,CAAC,eAAe,EAAE;wBACxB;wBACA;AACF,oBAAA,KAAK,OAAO;wBACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAe,EAAE,CAAC,CAAC;AACpE,wBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAA0C,CAAC;wBACtE;;YAEN;AAAE,YAAA,MAAM;;YAER;AACF,QAAA,CAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,iBAAiB,IAAI,CAAC;;AAG3D,QAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU;AAC7B,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aACxC,SAAS,CAAC,OAAO,IAAG;YACnB,IAAI,OAAO,CAAC,EAAE,KAAK,eAAe,CAAC,oBAAoB,EAAE;gBACvD,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7E,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,EAAE;AAC7B,oBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBACtF;YACF;iBAAO,IAAI,OAAO,CAAC,EAAE,KAAK,eAAe,CAAC,oBAAoB,EAAE;gBAC9D,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7E,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,EAAE;AAC7B,oBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAG;AAC3B,wBAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAClC,wBAAA,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI;wBACvB,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE;AAC/B,oBAAA,CAAC,CAAC;gBACJ;YACF;AACF,QAAA,CAAC,CAAC;;QAGJ,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,CAAC;AACF,iBAAA,OAAO,CAAC;AACP,gBAAA,WAAW,CAAC,MAAM;AAClB,gBAAA,WAAW,CAAC,KAAK;AACjB,gBAAA,WAAW,CAAC,MAAM;AAClB,gBAAA,WAAW,CAAC,KAAK;AACjB,gBAAA,WAAW,CAAC,MAAM;aACnB;AACA,iBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;iBACxC,SAAS,CAAC,MAAM,IAAG;AAClB,gBAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE;AACnD,oBAAA,IAAI,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;wBAC7B,IAAI,CAAC,6BAA6B,EAAE;oBACtC;gBACF;AACF,YAAA,CAAC,CAAC;AACN,QAAA,CAAC,CAAC;IACJ;AAIA;;AAEG;IACO,mBAAmB,GAAA;QAC3B,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;AACzD,QAAA,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE;IAChC;AAEA;;AAEG;IACK,6BAA6B,GAAA;AACnC,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE;AAC1C,QAAA,IAAI,CAAC,aAAa;YAAE;QACpB,IACE,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC;YACrD,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC;YACpD,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,EACrD;YACA,IAAI,aAAa,CAAC,MAAM;gBAAE,aAAa,CAAC,KAAK,EAAE;AAC/C,YAAA,aAAa,CAAC,IAAI,GAAG,MAAM;AAC3B,YAAA,aAAa,CAAC,YAAY,GAAG,KAAK;AAClC,YAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC;QACzC;aAAO;AACL,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;gBAC/E,aAAa,CAAC,IAAI,EAAE;YACtB;iBAAO,IAAI,aAAa,CAAC,MAAM,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE;gBAC7D,aAAa,CAAC,KAAK,EAAE;YACvB;AACA,YAAA,aAAa,CAAC,IAAI,GAAG,MAAM;AAC3B,YAAA,aAAa,CAAC,YAAY,GAAG,IAAI;AACjC,YAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1C;IACF;AAEA;;AAEG;IACO,KAAK,GAAA;AACb,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACnB,QAAA,UAAU,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC;IAC/C;AAEA;;;AAGG;AACH,IAAA,QAAQ,CAAC,EAAU,EAAA;AACjB,QAAA,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE;QAE5B,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;AAC1B,YAAA,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;AACvB,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;iBACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;gBACrD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,GAAG,EAAE,CAAC;;AAEvD,gBAAA,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1B;aAAO;AACL,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,GAAG,+BAA+B,GAAG,EAAE,CAAC;QAC3F;IACF;AAEA;;;;AAIG;AACH,IAAA,aAAa,CAAC,GAAW,EAAA;QACvB,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,KAAK,aAAa;YAAE;;QAGvD,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;AAC/B,QAAA,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC;AACjB,QAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACvB,YAAA,GAAG,IAAI,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC;QAC1B;;QAGA,IAAI,KAAK,GAAG,EAAE;QACd,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;AAC7B,QAAA,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YACZ,CAAC,IAAI,CAAC;YACN,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;AACzD,gBAAA,KAAK,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC;YACnB;AACA,YAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACpB,gBAAA,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;AACpB,oBAAA,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AAC1B,oBAAA,IAAI,CAAC,aAAa,GAAG,UAAU;gBACjC;gBACA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;AAC9C,gBAAA,IAAI;oBACF,KAAK,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBACvD;AAAE,gBAAA,MAAM;;gBAER;;gBAGA,IAAI,EAAE,GAAG,EAAE;AACX,gBAAA,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;gBACtB,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;AACzD,oBAAA,EAAE,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC;gBAChB;;gBAGA,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC;AAC5C,gBAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AACzB,oBAAA,IAAI,CAAC,SAAS,GAAG,kBAAkB,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACtE,oBAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;wBACzB,MAAM,gBAAgB,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AACjD,wBAAA,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE;AAC7D,4BAAA,IAAI,CAAC,eAAe,GAAG,gBAAgB,CAAC,CAAC,CAAC;wBAC5C;oBACF;gBACF;YACF;QACF;;QAGA,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE;AAChC,YAAA,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;AACtB,YAAA,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;gBACZ,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;YACvF;QACF;QAEA,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE;AACpC,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;QACvB;aAAO;YACL,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,MAAK;AAC7C,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1D,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AACnB,YAAA,CAAC,CAAC;QACJ;IACF;AAEA;;;;;;;;;;;;;;;;;;;;;;AAsBG;AACI,IAAA,SAAS,CACd,EAAU,EACV,MAAc,EACd,MAAc,EACd,IAAY,EACZ,KAAa,EACb,QAAgB,EAChB,UAAkB,EAClB,IAAY,EACZ,MAAc,EACd,MAAc,EACd,MAAc,EACd,iBAAyB,EACzB,GAAW,EACX,YAAoB,EACpB,YAAoB,EACpB,SAAiB,EACjB,YAAoB,EACpB,WAAmB,EACnB,OAAgB,EAAA;;AAGhB,QAAA,IAAI,MAAM,KAAK,qBAAqB,EAAE;AACpC,YAAA,IAAI,CAAC;iBACF,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB;AAC7C,iBAAA,WAAW;AACX,iBAAA,SAAS,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACnD;QACF;;AAGA,QAAA,IAAI,kBAAsC;QAC1C,IAAI,SAAS,EAAE;AACb,YAAA,QAAQ,YAAY,IAAI,KAAK;gBAC3B,KAAK,YAAY,CAAC,gBAAgB;oBAAE,kBAAkB,GAAG,eAAe;oBAAE;gBAC1E,KAAK,YAAY,CAAC,sBAAsB;oBAAE,kBAAkB,GAAG,eAAe;oBAAE;gBAChF,KAAK,YAAY,CAAC,QAAQ;oBAAE,kBAAkB,GAAG,UAAU;oBAAE;gBAC7D,KAAK,YAAY,CAAC,aAAa;oBAAE,kBAAkB,GAAG,UAAU;oBAAE;AAClE,gBAAA;oBAAS,kBAAkB,GAAG,cAAc;oBAAE;;QAElD;;AAGA,QAAA,IAAI,YAA8B;AAClC,QAAA,IAAI,gBAAoC;AACxC,QAAA,IAAI,mBAAuC;QAC3C,IAAI,YAAY,EAAE;YAChB,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC;AAC7C,YAAA,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC5B,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AAC7C,gBAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;oBAAE,YAAY,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC/D,gBAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;AAAE,oBAAA,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC;AACzD,gBAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;AAAE,oBAAA,gBAAgB,IAAI,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC;YAClE;AACA,YAAA,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;AAAE,gBAAA,mBAAmB,GAAG,aAAa,CAAC,CAAC,CAAC;QACtE;AAEA,QAAA,MAAM,UAAU,GAAwB;AACtC,YAAA,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE;YAC5B,EAAE;AACF,YAAA,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,SAAS;YACjF,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,SAAS;YACjF,IAAI;YACJ,KAAK;AACL,YAAA,MAAM,EAAE,QAAQ;YAChB,UAAU;AACV,YAAA,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC;YACpB,MAAM;YACN,MAAM;YACN,MAAM;YACN,iBAAiB;YACjB,GAAG;YACH,YAAY;YACZ,SAAS;YACT,YAAY;AACZ,YAAA,UAAU,EAAE,CAAC,CAAC,SAAS,KAAK,KAAK,KAAK,YAAY,CAAC,sBAAsB,IAAI,KAAK,KAAK,YAAY,CAAC,gBAAgB,CAAC;YACrH,kBAAkB;YAClB,WAAW;YACX,OAAO;YACP,YAAY;AACZ,YAAA,YAAY,EAAE,gBAAgB;YAC9B,mBAAmB;SACpB;AAED,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;AACjC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC;AAC9D,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;;QAGpB,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,kBAAkB,EAAE;AACpE,YAAA,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC;AACxC,SAAA,CAAC;;AAGF,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,IAAG;AAC7C,YAAA,IAAI,CAAC,CAAC,OAAO,EAAE;AACb,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC;YAC1G;AACF,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;IACO,IAAI,GAAA;QACZ,MAAM,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,yBAAyB,CAAQ;QACnE,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,kBAAkB,EAAE,GAAG,CAAC;IACvD;AAEA;;AAEG;IACO,OAAO,GAAA;QACf,MAAM,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,yBAAyB,CAAQ;QACnE,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC1D;AAEA;;AAEG;IACO,YAAY,GAAA;AACpB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE;AAChC,QAAA,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC;AACvB,QAAA,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI;YAAE,CAAC,GAAG,CAAC;QAC3B,MAAM,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,yBAAyB,CAAQ;QACnE,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,uCAAuC,EAAE,GAAG,CAAC;QAC1E,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAChD;AAEA;;AAEG;IACO,gBAAgB,GAAA;AACxB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE;AAChC,QAAA,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC;AAAE,YAAA,CAAC,GAAG,OAAO,CAAC,IAAI;QAC3B,MAAM,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,yBAAyB,CAAQ;QACnE,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,2CAA2C,EAAE,GAAG,CAAC;QAC9E,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAChD;AAEA;;;AAGG;AACO,IAAA,YAAY,CAAC,IAA+B,EAAA;AACpD,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,EAAE;AACpB,YAAA,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,cAAc,CAAC,UAAU;AAC9B,gBAAA,gCAAgC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,UAAU,EACnF,QAAQ,CACT;QACH;aAAO;YACL,MAAM,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,yBAAyB,CAAQ;AACnE,YAAA,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,iCAAiC,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC;QACxF;IACF;AAKA;;AAEG;IACK,eAAe,GAAA;AACrB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS;AAC5B,QAAA,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,GAAG,EAAE;YACjD,IAAI,CAAC,6BAA6B,EAAE;YACpC;QACF;AACA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;QAC/B,MAAM,KAAK,GAAG,GAAG,EAAE,UAAU,IAAI,GAAG,EAAE,EAAE;AACxC,QAAA,IAAI,CAAC,KAAK;YAAE;AAEZ,QAAA,MAAM,MAAM,GAAG,IAAI,mBAAmB,EAAE;AACxC,QAAA,MAAM,CAAC,EAAE,GAAG,KAAK;AACjB,QAAA,MAAM,CAAC,IAAI,GAAG,KAAK;AACnB,QAAA,MAAM,CAAC,KAAK,GAAG,CAAC;AAEhB,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,IAAG;AAC9C,YAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;gBACd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;YACrC;AAAO,iBAAA,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACrD,gBAAA,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO;gBACxC,IAAI,QAAQ,GAAG,EAAE;gBACjB,IAAI,QAAQ,GAAG,CAAC;AAChB,gBAAA,OAAO,CAAC,OAAO,CAAC,CAAC,IAAG;AAClB,oBAAA,IAAI,CAAC,CAAC,KAAK,GAAG,QAAQ;AAAE,wBAAA,QAAQ,GAAG,CAAC,CAAC,KAAK;AAC1C,oBAAA,IAAI,CAAC,CAAC,KAAK,GAAG,QAAQ;AAAE,wBAAA,QAAQ,GAAG,CAAC,CAAC,KAAK;AAC5C,gBAAA,CAAC,CAAC;AACF,gBAAA,MAAM,KAAK,GAAG,QAAQ,GAAG,QAAQ;AACjC,gBAAA,OAAO,CAAC,OAAO,CAAC,CAAC,IAAG;oBAClB,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,QAAQ,IAAI,KAAK,GAAG,CAAC;AAC1D,oBAAA,CAAC,CAAC,KAAK,GAAG,KAAK;AACf,oBAAA,CAAC,CAAC,YAAY,GAAG,KAAK,GAAG,GAAG;AAC9B,gBAAA,CAAC,CAAC;gBACF,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;gBACtD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YAC3C;YACA,IAAI,CAAC,6BAA6B,EAAE;AACtC,QAAA,CAAC,CAAC;IACJ;AAEA;;;AAGG;AACK,IAAA,gBAAgB,CAAC,OAA2C,EAAA;QAClE,IAAI,CAAC,OAAO,EAAE,MAAM;YAAE;QACtB,MAAM,KAAK,GAAgC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK;YAC3D,KAAK,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC;YAClD,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,GAAG;YAC3C,KAAK,EAAE,CAAC,CAAC,IAAI;YACb,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,UAAU,GAAG,CAAC,CAAC,KAAK;AACnC,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,6BAA6B,EAAE;IACtC;AAEA;;;AAGG;AACO,IAAA,KAAK,CAAC,UAAkB,EAAA;QAChC,uEAAoD,CAAC,IAAI,CAAC,CAAC,EAAE,6BAA6B,EAAE,KAAI;YAC9F,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,6BAA6B,EAAE;AAC/D,gBAAA,SAAS,EAAE,kBAAkB;AAC7B,gBAAA,SAAS,EAAE,KAAK;AAChB,gBAAA,YAAY,EAAE,KAAK;AACnB,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,iBAAiB,EAAE,KAAK;AACxB,gBAAA,IAAI,EAAE;AACJ,oBAAA,UAAU,EAAE,UAAU;AACtB,oBAAA,aAAa,EAAE,IAAI;AACnB,oBAAA,QAAQ,EAAE;AACX,iBAAA;AACD,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,KAAK,EAAE,MAAM;AACd,aAAA,CAAC;YACF,CAAC,CAAC,iBAAiB,CAAC;AACjB,iBAAA,SAAS,CAAC,CAAC,CAAmC,KAAI;gBACjD,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI;gBACjD,IAAI,IAAI,EAAE;AACR,oBAAA,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,EAAE;wBAClC,MAAM,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,yBAAyB,CAAQ;AACnE,wBAAA,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,4BAA4B,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC;oBACnF;yBAAO;AACL,wBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;oBACrD;gBACF;gBACA,CAAC,CAAC,KAAK,EAAE;AACX,YAAA,CAAC,CAAC;AACN,QAAA,CAAC,CAAC;IACJ;AAEA;;;;;AAKG;AACK,IAAA,KAAK,CAAC,GAAW,EAAE,IAAA,GAAe,IAAI,EAAA;AAC5C,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC;QAC7C,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;QACnC,OAAO,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC;IAClC;AAEA;;;;AAIG;AACK,IAAA,WAAW,CAAC,GAAW,EAAA;AAC7B,QAAA,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAC1B,QAAA,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE;AAC5B,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,IAAG;AAC3C,YAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;gBACd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;YACrC;AAAO,iBAAA,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE;AAC9B,gBAAA,QAAQ,CAAC,IAAI,GAAG,GAAG;YACrB;iBAAO;AACL,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,oBAAoB,EAAE;AAC5C,oBAAA,UAAU,EAAE,eAAe;AAC3B,oBAAA,SAAS,EAAE,WAAW;AACtB,oBAAA,SAAS,EAAE,KAAK;AAChB,oBAAA,YAAY,EAAE,KAAK;AACnB,oBAAA,YAAY,EAAE,IAAI;oBAClB,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE;AACtC,oBAAA,QAAQ,EAAE,OAAO;AACjB,oBAAA,QAAQ,EAAE,OAAO;AACjB,oBAAA,KAAK,EAAE,MAAM;AACb,oBAAA,MAAM,EAAE;AACT,iBAAA,CAAC;YACJ;AACF,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;IACO,WAAW,GAAA;AACnB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;QAC/B,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG;YAAE;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,IAAG;AACxD,YAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;AACd,gBAAA,IAAI,CAAC,CAAC,OAAO,KAAK,wEAAwE;oBACxF,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,+PAA+P,EAAE,IAAI,EAAE,YAAY,CAAC;;oBAE7S,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;YACvC;iBAAO;AACL,gBAAA,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;oBACjC,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,UAAU,CAAC,EAC7C,UAAU,EACV,QAAQ,EACR,GAAG,CAAC;gBACR;;AACE,oBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,sDAAsD,CAAC;YACnF;AACF,QAAA,CAAC,CAAC;IACJ;AAGA;;;;;;AAMG;AACM,IAAA,IAAI,CAAC,UAAkB,EAAE,KAAc,EAAE,WAAoB,EAAE,SAAmB,EAAA;QACzF,IAAI,CAAC,SAAS,EAAE;YACd,IAAI,IAAI,CAAC,OAAO;AAAE,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;;gBAC1C,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,EAAE,WAAW,CAAC;QACxD;aAAO;AACL,YAAA,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,EAAE,IAAI,aAAa,GAAG,UAAU,EAAE,QAAQ,CAAC;QACxF;IACF;AAEA;;;;;AAKG;AACK,IAAA,YAAY,CAAC,UAAkB,EAAE,KAAc,EAAE,WAAoB,EAAA;AAC3E,QAAA,IAAI,CAAC,UAAU;YAAE;QACjB,qBAAqB,CAAC,YAAY,CAChC,IAAI,CAAC,QAAQ,EACb,UAAU,EACV,KAAK,EACL,WAAW,EACX,IAAI,CAAC,UAAU,CAAC,aAAa,EAC7B,IAAI,CAAC,UAAU,CAAC,iBAAiB,EACjC,IAAI,CAAC,UAAU,CAAC,KAAK,EACrB,IAAI,CAAC,UAAU,CAAC,aAAa,EAC7B,IAAI,CAAC,UAAU,CAAC,WAAW,EAC3B,IAAI,CAAC,UAAU,CAAC,uBAAuB,CACxC;IACH;AAEA;;;;;;;;AAQG;AACM,IAAA,cAAc,CACrB,UAAkB,EAClB,OAAmC,0BAA0B,CAAC,YAAY,EAC1E,KAAA,GAAuB,IAAI,EAC3B,SAAwB,IAAI,EAC5B,cAA6B,IAAI,EACjC,SAAkB,IAAI,EAAA;QAEtB,oEAA4C,CAAC,IAAI,CAAC,CAAC,EAAE,0BAA0B,EAAE,KAAI;AACnF,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,0BAA0B,EAAE;AAClD,gBAAA,SAAS,EAAE,iCAAiC;AAC5C,gBAAA,SAAS,EAAE,KAAK;AAChB,gBAAA,YAAY,EAAE,KAAK;AACnB,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,iBAAiB,EAAE,KAAK;AACxB,gBAAA,IAAI,EAAE;oBACJ,UAAU,EAAE,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,UAAU;oBACzD,IAAI;oBACJ,KAAK;oBACL,MAAM;oBACN,WAAW;oBACX,MAAM;AACN,oBAAA,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa;AAC5C,oBAAA,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW;AACxC,oBAAA,uBAAuB,EAAE,IAAI,CAAC,UAAU,CAAC;AAC1C,iBAAA;AACD,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,KAAK,EAAE,MAAM;AACb,gBAAA,MAAM,EAAE,MAAM;aACf,CAAC,CAAC,WAAW;AACX,iBAAA,SAAS,CAAC,CAAC,CAA+B,KAAI;AAC7C,gBAAA,IAAI,CAAC,EAAE,UAAU,EAAE;AACjB,oBAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC7B;AACF,YAAA,CAAC,CAAC;AACN,QAAA,CAAC,CAAC;IACJ;AAEA;;;AAGG;AACO,IAAA,aAAa,CAAC,IAAyB,EAAA;AAC/C,QAAA,IAAI,CAAC,IAAI;YAAE;AACX,QAAA,IAAI,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,gBAAgB,IAAI,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,QAAQ,EAAE;AACtF,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,qEAAqE,CAAC;YAC9F;QACF;QACA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACnE;AAEA;;;AAGG;IACO,SAAS,GAAA;AACjB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;QAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,IAAI,CAAC;AACxD,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,iBAAiB;AAC3D,QAAA,IAAI,CAAC,GAAG,IAAI,aAAa,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AAC7C,QAAA,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE;AAC9B,YAAA,OAAO,GAAG,CAAC,KAAK,KAAK,YAAY,CAAC,gBAAgB,IAAI,GAAG,CAAC,KAAK,KAAK,YAAY,CAAC,sBAAsB;QACzG;QACA,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,YAAY,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACnG;AAEA;;AAEG;IACO,MAAM,GAAA;AACd,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;QAC/B,IAAI,GAAG,EAAE;YACP,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,eAAe,CAAC,uBAAuB,EAAE,GAAG,CAAC;YAC/E,IAAI,CAAC,KAAK,EAAE;QACd;IACF;+GA3uBW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EApBnB,WAAW,CAAC,YAAY,EAAE,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/D5C,gyZAsQqB,EAAA,MAAA,EAAA,CAAA,y5eAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDjMjB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,4OAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,sRAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,kTAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,sRAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,gNAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,+bAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,QAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,cAAA,EAAA,WAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,aAAA,EAAA,QAAA,EAAA,aAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEhB,4BAA4B,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,MAAA,EAAA,aAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC5B,yBAAyB,yHAFzB,WAAW,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKF,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBArBpC,SAAS;AACF,YAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAE,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE,EAAE,EAAA,eAAA,EAG3B,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EAAA,OAAA,EACP;wBACP,gBAAgB;wBAChB,eAAe;wBACf,gBAAgB;wBAChB,aAAa;wBACb,aAAa;wBACb,gBAAgB;wBAChB,oBAAoB;wBACpB,gBAAgB;wBAChB,gBAAgB;wBAChB,WAAW;wBACX,4BAA4B;wBAC5B;AACD,qBAAA,EAAA,QAAA,EAAA,gyZAAA,EAAA,MAAA,EAAA,CAAA,y5eAAA,CAAA,EAAA;qGAG6C,eAAe,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;;;;;;MEnClD,6BAA6B,CAAA;AAUxC,IAAA,WAAA,GAAA;AATS,QAAA,IAAA,CAAA,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAmB,WAAW,CAAC;QAC7D,IAAA,CAAA,IAAI,GAAG,MAAM,EAAoC;AAElD,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACnC,QAAA,IAAA,CAAA,UAAU,GAAmC,MAAM,CAAC,eAAe,CAAC;AAC3D,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAA8B,EAAE,4EAAC;AAC/C,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAU,KAAK,iFAAC;AAGpD,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE;YAC/B,IAAI,CAAC,IAAI,EAAE;QACb;IACF;AAEA;;;;AAIG;IACK,IAAI,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;YAAE;AACrC,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,yBAAyB,CAAC;QACrD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU;AACjD,aAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;aACnD,SAAS,CAAC,CAAC,IAAG;AACb,YAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;gBACd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;gBACnC;YACF;YACA,MAAM,MAAM,GAAgC,EAAE;YAC9C,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAA4B,KAAI;gBACtD,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAAE;AAC3F,gBAAA,IAAI,CAAC,CAAC,KAAK,EAAE;AACX,oBAAA,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,KAAK;gBACzB;AAAO,qBAAA,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE;oBACrB,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;gBACtC;qBAAO;oBACL,CAAC,CAAC,WAAW,GAAG,CAAA,EAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA,CAAA,EAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAG;gBAC/E;AACA,gBAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAChB,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;AACxB,QAAA,CAAC,CAAC;IACN;AAEA;;AAEG;IACO,MAAM,GAAA;QACd,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,eAAe,CAAC,QAAQ;QAC1D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;IAC5C;AAEA;;;;;AAKG;AACO,IAAA,GAAG,CAAC,IAAgC,EAAA;AAC5C,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE;YAC7B,IAAI,IAAI,IAAI,IAAI;AAAE,gBAAA,OAAO;AACzB,YAAA,MAAM,QAAQ,GAAgC,IAAI,CAAC,SAAS;AACzD,iBAAA,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAkC,CAAC;AAC1E,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE;YAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACpC;AAAO,aAAA,IAAI,IAAI,IAAI,IAAI,EAAE;AACvB,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC;IACF;+GAvEW,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,cAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAhBxB,WAAW,CAAC,YAAY,EAAE,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjC5C,66CAmCqB,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDIjB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,4OAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,sRAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,kTAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,gNAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,cAAc,+HACd,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAP,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,6TAChB,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,cAAc,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,kBAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGL,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAjBzC,SAAS;AACF,YAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAE,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE,EAAE,EAAA,eAAA,EAG3B,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EAAA,OAAA,EACP;wBACP,gBAAgB;wBAChB,cAAc;wBACd,gBAAgB;wBAChB,aAAa;wBACb,gBAAgB;wBAChB,gBAAgB;wBAChB,eAAe;wBACf,cAAc;AACf,qBAAA,EAAA,QAAA,EAAA,66CAAA,EAAA;iGAGyD,WAAW,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;;;;;;MER1D,wBAAwB,CAAA;AAgBnC,IAAA,WAAA,GAAA;QAfS,IAAA,CAAA,IAAI,GAAG,MAAM,EAAuB;AAC5B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAC9C,QAAA,IAAA,CAAA,UAAU,GAAwC,MAAM,CAAC,eAAe,CAAC;QACzE,IAAA,CAAA,WAAW,GAAG,MAAM,CAAS,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,sBAAsB,GAAG,mBAAmB,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACzH,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QACrC,IAAA,CAAA,MAAM,GAAG,WAAW;AACpB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAU,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAC1D,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAA0B,EAAE,qFAAC;AAC7D,QAAA,IAAA,CAAA,YAAY,GAA0B,EAAE,IAAI,EAAE,6BAA6B,EAAE,KAAK,EAAE,WAAW,CAAC,SAAS,EAAE,EAAE;AAC7G,QAAA,IAAA,CAAA,IAAI,GACZ,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE;cACzB,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW;AAC/C,cAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAyB;QAG1D,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,EAAE;AAC3C,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,UAAU;QAC/D;QACA,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,aAAa,EAAE;AAC9C,YAAA,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,aAAa;YACnE,IAAI,CAAC,WAAW,CAAC,GAAG,CAClB,IAAI,CAAC,KAAK;kBACR,sEAAsE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,aAAa,CAAA,MAAA;kBAC/G,CAAA,sEAAA,EAAyE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,aAAa,CAAA,MAAA,CAAQ,CAAC;QACjI;QACA,IAAI,CAAC,SAAS,EAAE;IAClB;AAEA;;;;AAIG;AACO,IAAA,SAAS,CAAC,KAAa,EAAA;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,IAAI,IAAI,KAAK;IAChE;AAEA;;;AAGG;IACK,SAAS,GAAA;AACf,QAAA,IAAI,CAAC;aACF,QAAQ,CAAC,EAAE,SAAS,EAAE,kBAAkB,CAAC,WAAW,EAAE;aACtD,SAAS,CAAC,CAAC,IAAG;AACb,YAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;gBACd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;gBACnC;YACF;AACA,YAAA,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE;AAC7B,gBAAA,MAAM,KAAK,GAA4B,CAAC,EAAE,IAAI,EAAE,6BAA6B,EAAE,KAAK,EAAE,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC;AAChH,gBAAA,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACvF,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC9B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;YAC/E;AACF,QAAA,CAAC,CAAC;IACN;AAEA;;;AAGG;IACO,EAAE,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;YAChB,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;QAC5C;QACA,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI;AACnC,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aACxC,SAAS,CAAC,CAAC,IAAG;AACf,YAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;gBACd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;YACrC;iBAAO;gBACL,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AACvB,gBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,qCAAqC,CAAC;YACjE;AACF,QAAA,CAAC,CAAC;IACJ;+GA9EW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,yGAvBnB,WAAW,CAAC,YAAY,EAAE,8BCnB5C,2rHAmFqB,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED1DjB,cAAc,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,4EAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,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,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,yEAAA,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,EACXF,YAAU,u6EACV,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,8BACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,cAAc,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,kBAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAEd,eAAe,myBADf,YAAY,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAIH,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAxBpC,SAAS;AACF,YAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAE,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE,EAAE,EAAA,UAAA,EAGhC,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,cAAc;wBACd,gBAAgB;wBAChB,WAAW;wBACXD,YAAU;wBACV,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,eAAe;wBACf,aAAa;wBACb,gBAAgB;wBAChB,iBAAiB;wBACjB,gBAAgB;wBAChB,cAAc;wBACd,YAAY;wBACZ;AACD,qBAAA,EAAA,QAAA,EAAA,2rHAAA,EAAA;;;;;;;;AE8BG,MAAO,0BAA2B,SAAQ,0BAA0B,CAAA;AAUxE,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AAVA,QAAA,IAAA,CAAA,UAAU,GAAG,SAAS,CAAY,YAAY,iFAAC;AAEvC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,EAAC,YAAwC,EAAC;AAC1D,QAAA,IAAA,CAAA,UAAU,GAAgC,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,0BAA0B,CAAC,YAAY,EAAE;QAGtH,IAAA,CAAA,IAAI,GAAgC,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO;QACrF,IAAA,CAAA,UAAU,GAAG,KAAK;AAIxB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI;gBAC1B,KAAK,0BAA0B,CAAC,YAAY;AAC1C,oBAAA,IAAI,CAAC,KAAK,GAAG,6CAA6C;oBAC1D;gBACF,KAAK,0BAA0B,CAAC,aAAa;AAC3C,oBAAA,IAAI,CAAC,KAAK,GAAG,4CAA4C;oBACzD;gBACF,KAAK,0BAA0B,CAAC,SAAS;AACvC,oBAAA,IAAI,CAAC,KAAK,GAAG,kBAAkB;oBAC/B;gBACF,KAAK,0BAA0B,CAAC,UAAU;AACxC,oBAAA,IAAI,CAAC,KAAK,GAAG,qBAAqB;oBAClC;gBACF,KAAK,0BAA0B,CAAC,KAAK;AACnC,oBAAA,IAAI,CAAC,KAAK,GAAG,0BAA0B;oBACvC;;AAEJ,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE;gBAC/B,IAAI,CAAC,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW;YACnD;;YAEA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;YACvH,IACE,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI;gBAC/C,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,IAAI,CAAC,UAAU,CAAC,UAAU;gBACnD,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,IAAI,CAAC,UAAU,CAAC,MAAM,EACnD;AACA,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,mBAAmB,EAAE;gBAC7C,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI;gBAC7C,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK;gBAC/C,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;gBACjD,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU;AACjD,gBAAA,IAAI,CAAC,YAAY,CAAC,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,0BAA0B,CAAC,UAAU;AAClG,gBAAA,IAAI,CAAC,YAAY,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,0BAA0B,CAAC,UAAU;gBACrG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC3D;QACF;;QAGA,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,CAA8B,IAAI,EAAE,YAAY,CAAC;;AAGrF,QAAA,IAAI,CAAC;AACF,aAAA,OAAO,CAAC;AACP,YAAA,WAAW,CAAC,MAAM;AAClB,YAAA,WAAW,CAAC,KAAK;AACjB,YAAA,WAAW,CAAC,MAAM;AAClB,YAAA,WAAW,CAAC,KAAK;AACjB,YAAA,WAAW,CAAC,MAAM;SACnB;AACA,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,CAAC,MAAW,KAAI;YACzB,IAAI,CAAC,IAAI,CAAC,UAAU;AAAE,gBAAA,OAAO;AAC7B,YAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE;AACnD,gBAAA,IAAI,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;oBAC7B,IAAI,CAAC,0BAA0B,EAAE;gBACnC;YACF;AACF,QAAA,CAAC,CAAC;;QAGJ,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;YACtB,IAAI,CAAC,0BAA0B,EAAE;AACjC,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;YACpC,IAAI,UAAU,EAAE;AACd,gBAAA,UAAU,CAAC;AACR,qBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;qBACxC,SAAS,CAAC,MAAM,IAAG;AAClB,oBAAA,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE;AAC9B,wBAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC;oBACxC;AACF,gBAAA,CAAC,CAAC;YACN;AACA,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;YAC5B,IAAI,MAAM,EAAE;AACV,gBAAA,MAAM,CAAC;AACJ,qBAAA,SAAS,CAAC,CAAC,KAAkC,KAAI;AAChD,oBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK;AAC5B,oBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAClB,gBAAA,CAAC,CAAC;YACN;AACA,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAChB,IAAI,CAAC,aAAa,EAAE;AACpB,YAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;AACpC,QAAA,CAAC,CAAC;IACJ;AAGA;;AAEG;IACO,gBAAgB,GAAA;QACxB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACnD,QAAA,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE;IAC7B;AAIA;;AAEG;IACK,0BAA0B,GAAA;AAChC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;QACpC,IAAI,UAAU,EAAE;YACd,IAAI,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC;gBACvD,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC;gBACpD,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE;AACvD,gBAAA,IAAI,UAAU,CAAC,MAAM,EAAE;oBACrB,UAAU,CAAC,KAAK,EAAE;gBACpB;AACA,gBAAA,UAAU,CAAC,IAAI,GAAG,MAAM;AACxB,gBAAA,UAAU,CAAC,YAAY,GAAG,KAAK;gBAC/B,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;YACnD;iBAAO;AACL,gBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;oBACrB,UAAU,CAAC,KAAK,EAAE;gBACpB;qBAAO,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE;oBACzD,UAAU,CAAC,IAAI,EAAE;gBACnB;qBAAO,IAAI,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;oBACvD,UAAU,CAAC,KAAK,EAAE;gBACpB;AACA,gBAAA,UAAU,CAAC,IAAI,GAAG,MAAM;AACxB,gBAAA,UAAU,CAAC,YAAY,GAAG,IAAI;AAC9B,gBAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;YACvC;QACF;IACF;AAGA;;AAEG;IACH,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;IACxB;AAIA;;;AAGG;AACH,IAAA,MAAM,CAAC,IAA0B,EAAA;AAC/B,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC;IACvD;AAIA;;;;AAIG;IACK,YAAY,CAAC,YAAqB,KAAK,EAAA;QAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAwB;AAC7E,QAAA,SAAS,CAAC,KAAK,GAAG,EAAE;AACpB,QAAA,SAAS,CAAC,eAAe;AACvB,YAAA,SAAS,CAAC,IAAI,KAAK,0BAA0B,CAAC,UAAU;AAC1D,QAAA,SAAS,CAAC,kBAAkB;AAC1B,YAAA,SAAS,CAAC,IAAI,KAAK,0BAA0B,CAAC,UAAU;;QAE1D,IAAI,SAAS,EAAE;AACb,YAAA,SAAS,CAAC,KAAK,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,CAAC;QAC7B;;QAGA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE;YAClC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ;YACnD,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;AAC/C,YAAA,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,WAAW,EAAE;QAC/D;QACA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE;YAChC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;QACjD;QACA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE;YAC9B,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI;QAC7C;QACA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE;YAChC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;QACjD;AACA,QAAA,OAAO,SAAS;IAClB;AAEA;;;;AAIG;AACK,IAAA,wBAAwB,CAAC,MAA2B,EAAA;QAC1D,OAAO;YACL,UAAU,EAAE,MAAM,CAAC,EAAE;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,IAAI;YACvC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;YACnD,sBAAsB,EAAE,MAAM,CAAC,sBAAsB;YACrD,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;YAC7C,eAAe,EAAE,MAAM,CAAC,eAAe;AACvC,YAAA,KAAK,EAAE,EAAE;AACT,YAAA,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI;SACxB;IACH;AAEA;;;AAGG;IACH,KAAK,CAAC,YAAqB,KAAK,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;YAAE;AACrC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,qBAAqB,CAAC;QAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;QACjD,IAAI,YAAY,EAAE;YAChB,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,wBAAwB,CAAC,YAAY,CAAC;AACvE,iBAAA,IAAI,CAACQ,UAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;iBACnD,SAAS,CAAC,CAAC,IAAG;gBACb,IAAI,CAAC,CAAC,CAAC,OAAO;oBAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;qBAC9C;oBACH,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC;;oBAGvC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,EAAE;AAC3B,wBAAA,IAAI,SAAS;;AAEX,4BAAA,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;oBAClC;yBAAO;wBACL,IAAI,CAAC,UAAU,EAAE;oBACnB;oBAEA,IAAI,SAAS,EAAE;AACb,wBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,wBAAA,IAAI,SAAS;AAAE,4BAAA,SAAS,CAAC,SAAS,GAAG,CAAC;oBACxC;AAEA,oBAAA,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBAChB;AACF,YAAA,CAAC,CAAC;QACN;IACF;AAEA;;;AAGG;AACH,IAAA,SAAS,CAAC,CAAY,EAAA;AACpB,QAAA,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC;AAC3D,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,KAAK;QAC/B,IAAI,CAAC,KAAK,EAAE;IACd;AAEA;;;AAGG;AACH,IAAA,WAAW,CAAC,MAA2B,EAAA;QACrC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM;YAAE;AAChD,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE;AAChE,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;YACzB,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC;AACvE,iBAAA,SAAS,CAAC;AACT,gBAAA,IAAI,EAAE,CAAC,CAAuC,KAAI;AAChD,oBAAA,IAAI,CAAC,CAAC,OAAO,EAAE;AACb,wBAAA,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;AACjD,wBAAA,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE;AAClB,4BAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,4BAAA,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;AAChD,4BAAA,IAAI,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE;AAC3B,gCAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE;gCAC9B,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE;AACpC,gCAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,KAAK,IAAI;4BAC9E;wBACF;AACA,wBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;wBAC7B,IAAI,CAAC,0BAA0B,EAAE;oBACnC;gBACF,CAAC;gBACD,QAAQ,EAAE,MAAK;AACb,oBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC5B;AACD,aAAA,CAAC;QACN;IACF;AAEA;;AAEG;IACO,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE;AACtB,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE;AACzB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;IAClC;AACA;;AAEG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;AACxB,YAAA,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC3C,IAAI,CAAC,0BAA0B,EAAE;QACnC;IACF;AAEA;;;AAGG;AACM,IAAA,IAAI,CAAC,UAAmB,EAAA;AAC/B,QAAA,IAAI,UAAU;YAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACtD;AAEA;;;;AAIG;AACM,IAAA,oBAAoB,CAAC,IAAyB,EAAA;QACrD,IAAI,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,YAAY;AACvC,QAAA,OAAO,SAAS;IAClB;AAEA;;;;AAIG;AACM,IAAA,mBAAmB,CAAC,IAAyB,EAAA;QACpD,IAAI,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,iBAAiB;AAC5C,QAAA,OAAO,EAAE;IACX;+GAzVW,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,8EAzBrB,WAAW,CAAC,YAAY,EAAE,EAAA,EAAA,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,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7C5C,2/MAuIqB,EAAA,MAAA,EAAA,CAAA,2pdAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDpFjB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,4OAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,sRAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,kTAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,sRAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,gNAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,cAAc,8HACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,aAAa,mLACb,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAT,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,aAAa,qsBACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAQ,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,cAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,gBAAgB,wdAChB,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,4BAA4B,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,MAAA,EAAA,aAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC5B,4BAA4B,0HAC5B,gCAAgC,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGvB,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBA1BtC,SAAS;AACF,YAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAE,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE,EAAE,EAAA,UAAA,EAGhC,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,gBAAgB;wBAChB,cAAc;wBACd,eAAe;wBACf,gBAAgB;wBAChB,aAAa;wBACb,iBAAiB;wBACjB,oBAAoB;wBACpB,WAAW;wBACX,aAAa;wBACb,cAAc;wBACd,kBAAkB;wBAClB,gBAAgB;wBAChB,gBAAgB;wBAChB,oBAAoB;wBACpB,4BAA4B;wBAC5B,4BAA4B;wBAC5B,gCAAgC;AACjC,qBAAA,EAAA,QAAA,EAAA,2/MAAA,EAAA,MAAA,EAAA,CAAA,2pdAAA,CAAA,EAAA;kGAG0C,YAAY,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;;;;;;MEtC5C,8BAA8B,CAAA;AAjB3C,IAAA,WAAA,GAAA;AAkBW,QAAA,IAAA,CAAA,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAmB,UAAU,CAAC;QAC3D,IAAA,CAAA,OAAO,GAAG,MAAM,EAA4B;AACpC,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAEjD,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAU,KAAK,2EAAC;AAC7B,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAmD,SAAS,6EAAC;QAE5E,IAAA,CAAA,mBAAmB,GAAG,mBAAmB;QAC5C,IAAA,CAAA,YAAY,GAAS,YAAY,EAAE;AAChC,QAAA,IAAA,CAAA,iBAAiB,GAAuC,CAAC,QAAQ,KAAI;YAC7E,IAAI,CAAC,IAAI,CAAC,mBAAmB;AAAE,gBAAA,OAAO,EAAE;AACxC,YAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;gBACxD,IAAI,QAAQ,GAAG,YAAY,EAAE;AAAE,oBAAA,OAAO,sBAAsB;qBACvD,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,YAAY,EAAE;AAAE,oBAAA,OAAO,uBAAuB;;AAC3E,oBAAA,OAAO,cAAc;YAC5B;AACA,YAAA,OAAO,EAAE;AACX,QAAA,CAAC;AACS,QAAA,IAAA,CAAA,kBAAkB,GAAG,CAAC,QAAc,KAAa;YACzD,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,IAAI,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC;AACrH,QAAA,CAAC;AACQ,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AA+E3C,IAAA;AA5EC;;;;;AAKG;AACH,IAAA,MAAM,CAAC,KAA2C,EAChD,MAA4C,EAC5C,IAAA,GAAa,YAAY,EAAE,EAAA;AAC3B,QAAA,IAAI,MAAM,EAAE,MAAM,EAAE;YAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QAChC;AACA,QAAA,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACpD,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;QACjD;AACA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChC,IAAI,QAAQ,EAAE;AACZ,YAAA,QAAQ,CAAC,UAAU,GAAG,IAAI;AAC1B,YAAA,QAAQ,CAAC,QAAQ,GAAG,IAAI;YACxB,QAAQ,CAAC,gBAAgB,EAAE;QAC7B;AACA,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;IACpC;AAGA;;;;;AAKG;AACO,IAAA,YAAY,CAAC,IAAoB,EAAA;AACzC,QAAA,IAAI,IAAI,KAAK,OAAO,EAAE;AACpB,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,gBAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;gBACxB,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACvD,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;AACzC,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBAC/C,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,EAAE;AAClC,oBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,oBAAA,QAAQ,CAAC,QAAQ,GAAG,KAAK;oBACzB,QAAQ,CAAC,gBAAgB,EAAE;gBAC7B;YACF;QACF;aAAO,IAAI,IAAI,EAAE;YACf,MAAM,CAAC,GAAG,IAAY;AACtB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC;AACrB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,YAAA,QAAQ,CAAC,QAAQ,GAAG,CAAC;YACrB,QAAQ,CAAC,gBAAgB,EAAE;QAC7B;aAAO;AACL,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;QAC9B;IACF;AAEA;;;AAGG;AACO,IAAA,aAAa,CAAC,SAA6C,EAAA;AACnE,QAAA,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;AAChE,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;QACxB,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AAC7C,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC;AAC/B,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/C,QAAA,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC,IAAI;AACzC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChC,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,EAAE;AAClC,YAAA,QAAQ,CAAC,QAAQ,GAAG,KAAK;QAC3B;AACA,QAAA,QAAQ,CAAC,UAAU,GAAG,OAAO;QAC7B,QAAQ,CAAC,gBAAgB,EAAE;AAC3B,QAAA,IAAI,CAAC,YAAY,GAAG,OAAO;IAC7B;+GApGW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,8BAA8B,0XCjC3C,k0CA4BM,EAAA,MAAA,EAAA,CAAA,+VAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDLFX,YAAU,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,4OAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,sRAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,kTAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,gNAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACV,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,WAAW,6YACX,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,8BAChB,kBAAkB,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGT,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAjB1C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,cAGvB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACPA,YAAU;wBACV,eAAe;wBACf,gBAAgB;wBAChB,WAAW;wBACX,cAAc;wBACd,aAAa;wBACb,gBAAgB;wBAChB;AACD,qBAAA,EAAA,QAAA,EAAA,k0CAAA,EAAA,MAAA,EAAA,CAAA,+VAAA,CAAA,EAAA;sEAGwD,UAAU,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEpBxD,kCAAkC,CAAA;+GAAlC,kCAAkC,EAAA,IAAA,EAAA,EAAA,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,8EAP3B,WAAW,CAAC,YAAY,EAAE,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECP9C,w8EA8BA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDlBc,cAAc,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,yGAAE,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAEA,YAAU,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,4OAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,sRAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,kTAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,oXAAE,cAAc,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,kBAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAEhG,kCAAkC,EAAA,UAAA,EAAA,CAAA;kBAR9C,SAAS;2BACA,EAAE,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE,EAAE,EAAA,eAAA,EAG3B,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,WACP,CAAC,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAEA,YAAU,EAAE,eAAe,EAAE,cAAc,CAAC,EAAA,QAAA,EAAA,w8EAAA,EAAA;;;;;;;;MEYjG,0CAA0C,CAAA;AATvD,IAAA,WAAA,GAAA;QAUW,IAAA,CAAA,IAAI,GAAG,MAAM,EAA6B;AAElC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;QAE5C,IAAA,CAAA,QAAQ,GAAW,EAAE;QACrB,IAAA,CAAA,OAAO,GAAW,EAAE;QACpB,IAAA,CAAA,QAAQ,GAAW,EAAE;QACrB,IAAA,CAAA,WAAW,GAAW,EAAE;QACxB,IAAA,CAAA,UAAU,GAAW,EAAE;AAiElC,IAAA;AA/DC;;AAEG;IACO,KAAK,GAAA;AACb,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;AAClB,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE;AACjB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;AAClB,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AACrB,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AAEA;;;;AAIG;IACO,EAAE,GAAA;QACV,IAAI,KAAK,GAAG,EAAE;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE;QACvC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE;;AAG3C,QAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACrB,KAAK,IAAI,CAAA,EAAA,EAAK,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA,EAAA,CAAI;QAC9C;;AAEA,QAAA,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;YACjB,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;AAChC,gBAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,KAAK,IAAI,GAAG;AAClC,gBAAA,KAAK,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI;YAClD;QACF;;AAEA,QAAA,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;YAClB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;AACjC,gBAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,KAAK,IAAI,GAAG;AAClC,gBAAA,KAAK,IAAI,CAAA,EAAA,EAAK,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI;YACnD;QACF;;AAEA,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACpB,YAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,IAAI,GAAG;YAClC,KAAK,IAAI,CAAA,EAAA,EAAK,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA,GAAA,CAAK;QAC9C;;AAEA,QAAA,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;AAClB,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,gBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CACtB,sHAAsH,CACvH;gBACD;YACF;YACA,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;AACjC,gBAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,KAAK,IAAI,GAAG;AAClC,gBAAA,KAAK,IAAI,CAAA,EAAA,EAAK,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI;YACnD;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;IAC/D;+GAzEW,0CAA0C,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA1C,0CAA0C,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EARrC,WAAW,CAAC,YAAY,EAAE,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChB5C,4iGAqEqB,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDhDT,cAAc,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,qvCAAEA,YAAU,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,4OAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,sRAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,kTAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,gNAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACrG,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,kBAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAEvD,0CAA0C,EAAA,UAAA,EAAA,CAAA;kBATtD,SAAS;2BACF,EAAE,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE,EAAE,EAAA,UAAA,EAGhC,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAED,YAAU,EAAE,kBAAkB,EAAE,cAAc;AACrG,wBAAA,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,CAAC,EAAA,QAAA,EAAA,4iGAAA,EAAA;;;;;;;;AEtBrE;;AAEG;;ACFH;;AAEG;;;;"}
|